@hi-ui/schema-fields 4.0.0-experimental.1
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 +11 -0
- package/lib/cjs/base.js +125 -0
- package/lib/cjs/components/image-preview/index.js +63 -0
- package/lib/cjs/components/span/index.js +33 -0
- package/lib/cjs/components/upload-bridge/index.js +227 -0
- package/lib/cjs/components/upload-bridge/utils.js +73 -0
- package/lib/cjs/ctx.js +70 -0
- package/lib/cjs/editable/ctx.js +45 -0
- package/lib/cjs/editable/editable.js +141 -0
- package/lib/cjs/editable/index.js +62 -0
- package/lib/cjs/editable/readonly.js +36 -0
- package/lib/cjs/editable/simple.js +61 -0
- package/lib/cjs/editable/use-readonly.js +200 -0
- package/lib/cjs/extensible/selectable/index.js +114 -0
- package/lib/cjs/extensible/selectable/match-cascader.js +184 -0
- package/lib/cjs/fields/basic/cascader/index.js +98 -0
- package/lib/cjs/fields/basic/check-cascader/index.js +58 -0
- package/lib/cjs/fields/basic/check-select/index.js +89 -0
- package/lib/cjs/fields/basic/check-tree-select/index.js +61 -0
- package/lib/cjs/fields/basic/checkbox/index.js +84 -0
- package/lib/cjs/fields/basic/counter/index.js +40 -0
- package/lib/cjs/fields/basic/radio/index.js +44 -0
- package/lib/cjs/fields/basic/rating/index.js +40 -0
- package/lib/cjs/fields/basic/select/index.js +98 -0
- package/lib/cjs/fields/basic/slider/index.js +40 -0
- package/lib/cjs/fields/basic/switch/index.js +47 -0
- package/lib/cjs/fields/basic/textarea/index.js +40 -0
- package/lib/cjs/fields/basic/time-picker/index.js +45 -0
- package/lib/cjs/fields/basic/time-picker/index.scss.js +18 -0
- package/lib/cjs/fields/basic/tree-select/index.js +61 -0
- package/lib/cjs/fields/basic/upload/custom.js +29 -0
- package/lib/cjs/fields/basic/upload/index.js +48 -0
- package/lib/cjs/fields/enhance/number-range/index.js +39 -0
- package/lib/cjs/fields/semantic/date/index.js +82 -0
- package/lib/cjs/fields/semantic/image/index.js +65 -0
- package/lib/cjs/fields/semantic/image/upload.js +32 -0
- package/lib/cjs/fields/semantic/link/index.js +96 -0
- package/lib/cjs/fields/semantic/number/index.js +106 -0
- package/lib/cjs/fields/semantic/tag/index.js +164 -0
- package/lib/cjs/fields/semantic/tag/index.scss.js +18 -0
- package/lib/cjs/fields/semantic/text/index.js +61 -0
- package/lib/cjs/index.js +145 -0
- package/lib/cjs/utils/batch-dep-update.js +40 -0
- package/lib/cjs/utils/form-binding.js +40 -0
- package/lib/cjs/utils/label.js +34 -0
- package/lib/cjs/utils.js +35 -0
- package/lib/esm/base.js +111 -0
- package/lib/esm/components/image-preview/index.js +49 -0
- package/lib/esm/components/span/index.js +20 -0
- package/lib/esm/components/upload-bridge/index.js +214 -0
- package/lib/esm/components/upload-bridge/utils.js +66 -0
- package/lib/esm/ctx.js +55 -0
- package/lib/esm/editable/ctx.js +32 -0
- package/lib/esm/editable/editable.js +129 -0
- package/lib/esm/editable/index.js +44 -0
- package/lib/esm/editable/readonly.js +24 -0
- package/lib/esm/editable/simple.js +49 -0
- package/lib/esm/editable/use-readonly.js +193 -0
- package/lib/esm/extensible/selectable/index.js +101 -0
- package/lib/esm/extensible/selectable/match-cascader.js +179 -0
- package/lib/esm/fields/basic/cascader/index.js +83 -0
- package/lib/esm/fields/basic/check-cascader/index.js +44 -0
- package/lib/esm/fields/basic/check-select/index.js +75 -0
- package/lib/esm/fields/basic/check-tree-select/index.js +47 -0
- package/lib/esm/fields/basic/checkbox/index.js +70 -0
- package/lib/esm/fields/basic/counter/index.js +26 -0
- package/lib/esm/fields/basic/radio/index.js +30 -0
- package/lib/esm/fields/basic/rating/index.js +26 -0
- package/lib/esm/fields/basic/select/index.js +83 -0
- package/lib/esm/fields/basic/slider/index.js +26 -0
- package/lib/esm/fields/basic/switch/index.js +33 -0
- package/lib/esm/fields/basic/textarea/index.js +26 -0
- package/lib/esm/fields/basic/time-picker/index.js +31 -0
- package/lib/esm/fields/basic/time-picker/index.scss.js +13 -0
- package/lib/esm/fields/basic/tree-select/index.js +47 -0
- package/lib/esm/fields/basic/upload/custom.js +16 -0
- package/lib/esm/fields/basic/upload/index.js +34 -0
- package/lib/esm/fields/enhance/number-range/index.js +26 -0
- package/lib/esm/fields/semantic/date/index.js +67 -0
- package/lib/esm/fields/semantic/image/index.js +51 -0
- package/lib/esm/fields/semantic/image/upload.js +20 -0
- package/lib/esm/fields/semantic/link/index.js +82 -0
- package/lib/esm/fields/semantic/number/index.js +91 -0
- package/lib/esm/fields/semantic/tag/index.js +149 -0
- package/lib/esm/fields/semantic/tag/index.scss.js +13 -0
- package/lib/esm/fields/semantic/text/index.js +47 -0
- package/lib/esm/index.js +85 -0
- package/lib/esm/utils/batch-dep-update.js +35 -0
- package/lib/esm/utils/form-binding.js +34 -0
- package/lib/esm/utils/label.js +21 -0
- package/lib/esm/utils.js +27 -0
- package/lib/types/base.d.ts +44 -0
- package/lib/types/components/async-refill-placeholder/index.d.ts +7 -0
- package/lib/types/components/image-preview/index.d.ts +5 -0
- package/lib/types/components/span/index.d.ts +8 -0
- package/lib/types/components/upload-bridge/index.d.ts +5 -0
- package/lib/types/components/upload-bridge/type.d.ts +26 -0
- package/lib/types/components/upload-bridge/utils.d.ts +11 -0
- package/lib/types/ctx.d.ts +21 -0
- package/lib/types/editable/ctx.d.ts +5 -0
- package/lib/types/editable/editable.d.ts +18 -0
- package/lib/types/editable/index.d.ts +14 -0
- package/lib/types/editable/readonly.d.ts +8 -0
- package/lib/types/editable/simple.d.ts +8 -0
- package/lib/types/editable/type.d.ts +9 -0
- package/lib/types/editable/use-readonly.d.ts +26 -0
- package/lib/types/extensible/selectable/index.d.ts +31 -0
- package/lib/types/extensible/selectable/match-cascader.d.ts +19 -0
- package/lib/types/extensible/selectable/type.d.ts +16 -0
- package/lib/types/fields/basic/cascader/index.d.ts +10 -0
- package/lib/types/fields/basic/check-cascader/index.d.ts +11 -0
- package/lib/types/fields/basic/check-select/index.d.ts +34 -0
- package/lib/types/fields/basic/check-tree-select/index.d.ts +10 -0
- package/lib/types/fields/basic/checkbox/index.d.ts +19 -0
- package/lib/types/fields/basic/counter/index.d.ts +7 -0
- package/lib/types/fields/basic/radio/index.d.ts +7 -0
- package/lib/types/fields/basic/rating/index.d.ts +7 -0
- package/lib/types/fields/basic/select/index.d.ts +12 -0
- package/lib/types/fields/basic/slider/index.d.ts +7 -0
- package/lib/types/fields/basic/switch/index.d.ts +7 -0
- package/lib/types/fields/basic/textarea/index.d.ts +7 -0
- package/lib/types/fields/basic/time-picker/index.d.ts +8 -0
- package/lib/types/fields/basic/tree-select/index.d.ts +11 -0
- package/lib/types/fields/basic/upload/custom.d.ts +3 -0
- package/lib/types/fields/basic/upload/index.d.ts +8 -0
- package/lib/types/fields/enhance/number-range/index.d.ts +7 -0
- package/lib/types/fields/semantic/date/index.d.ts +15 -0
- package/lib/types/fields/semantic/image/index.d.ts +11 -0
- package/lib/types/fields/semantic/image/upload.d.ts +3 -0
- package/lib/types/fields/semantic/link/index.d.ts +31 -0
- package/lib/types/fields/semantic/number/index.d.ts +21 -0
- package/lib/types/fields/semantic/tag/index.d.ts +78 -0
- package/lib/types/fields/semantic/text/index.d.ts +13 -0
- package/lib/types/index.d.ts +108 -0
- package/lib/types/utils/batch-dep-update.d.ts +13 -0
- package/lib/types/utils/form-binding.d.ts +11 -0
- package/lib/types/utils/label.d.ts +11 -0
- package/lib/types/utils.d.ts +15 -0
- package/package.json +98 -0
package/README.md
ADDED
package/lib/cjs/base.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose');
|
|
17
|
+
var React = require('react');
|
|
18
|
+
var lodashEs = require('lodash-es');
|
|
19
|
+
var Input = require('@hi-ui/input');
|
|
20
|
+
var EllipsisTooltip = require('@hi-ui/ellipsis-tooltip');
|
|
21
|
+
var schemaCore = require('@hi-ui/schema-core');
|
|
22
|
+
var index = require('./components/span/index.js');
|
|
23
|
+
var utils = require('./utils.js');
|
|
24
|
+
function _interopDefaultCompat(e) {
|
|
25
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
26
|
+
'default': e
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
var _inheritsLoose__default = /*#__PURE__*/_interopDefaultCompat(_inheritsLoose);
|
|
30
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
31
|
+
var Input__default = /*#__PURE__*/_interopDefaultCompat(Input);
|
|
32
|
+
var EllipsisTooltip__default = /*#__PURE__*/_interopDefaultCompat(EllipsisTooltip);
|
|
33
|
+
var ProField = /*#__PURE__*/function (_AbstractProField) {
|
|
34
|
+
_inheritsLoose__default["default"](ProField, _AbstractProField);
|
|
35
|
+
function ProField() {
|
|
36
|
+
var _this;
|
|
37
|
+
_this = _AbstractProField.apply(this, arguments) || this;
|
|
38
|
+
_this.dftDom = /*#__PURE__*/React__default["default"].createElement("span", {
|
|
39
|
+
"data-case": "default"
|
|
40
|
+
}, "-");
|
|
41
|
+
return _this;
|
|
42
|
+
}
|
|
43
|
+
var _proto = ProField.prototype;
|
|
44
|
+
_proto.getFieldProps = function getFieldProps(dftProps, ctx) {
|
|
45
|
+
return utils.getFieldProps(dftProps, ctx);
|
|
46
|
+
};
|
|
47
|
+
_proto.getWrapperProps = function getWrapperProps(dftProps, ctx) {
|
|
48
|
+
return utils.getWrapperProps(dftProps, ctx);
|
|
49
|
+
};
|
|
50
|
+
_proto.getFormItemProps = function getFormItemProps(dftProps, ctx) {
|
|
51
|
+
return utils.getFormItemProps(dftProps, ctx);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 渲染字符串的内部方法
|
|
55
|
+
* @desc 很多类型的字段最终渲染时都是文本,因此提取一个公共方法到此处
|
|
56
|
+
* @desc 封装了 EllipsisTooltip 的逻辑 */;
|
|
57
|
+
_proto.renderString = function renderString(text, ctx) {
|
|
58
|
+
var fieldProps = this.getFieldProps({
|
|
59
|
+
numberOfLines: 1
|
|
60
|
+
}, ctx);
|
|
61
|
+
return /*#__PURE__*/React__default["default"].createElement(index.ReadonlyWrapper, null, /*#__PURE__*/React__default["default"].createElement(EllipsisTooltip__default["default"], {
|
|
62
|
+
className: fieldProps.tooltipClassName,
|
|
63
|
+
numberOfLines: fieldProps.numberOfLines
|
|
64
|
+
}, text));
|
|
65
|
+
}
|
|
66
|
+
/** 只读模式的渲染逻辑 */;
|
|
67
|
+
_proto.render = function render(data, ctx) {
|
|
68
|
+
if (lodashEs.isNil(data)) return this.dftDom;
|
|
69
|
+
if (Array.isArray(data)) {
|
|
70
|
+
if (data.length === 0) return this.dftDom;
|
|
71
|
+
return this.renderString(data.join(', '), ctx);
|
|
72
|
+
}
|
|
73
|
+
if (_typeof(data) === 'object') {
|
|
74
|
+
return this.renderString(JSON.stringify(data), ctx);
|
|
75
|
+
}
|
|
76
|
+
return this.renderString(String(data), ctx);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 表格单元格渲染逻辑
|
|
80
|
+
* @desc 默认直接使用 render 的逻辑 */;
|
|
81
|
+
_proto.renderCell = function renderCell(data, ctx) {
|
|
82
|
+
return this.render(data, ctx);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 表格 Footer 单元格渲染逻辑
|
|
86
|
+
* @desc 没有默认逻辑,需由字段自行实现 */;
|
|
87
|
+
_proto.renderFooterCell = function renderFooterCell(ctx) {
|
|
88
|
+
console.log(ctx); // 仅用于规避定义未使用检查
|
|
89
|
+
return null;
|
|
90
|
+
};
|
|
91
|
+
_proto.renderFormItem = function renderFormItem(data, ctx) {
|
|
92
|
+
console.log(data, ctx); // 仅用于规避定义未使用检查
|
|
93
|
+
throw new Error('ProField.renderFormItem not implemented');
|
|
94
|
+
};
|
|
95
|
+
_proto.getEditablePlaceholder = function getEditablePlaceholder(data, ctx) {
|
|
96
|
+
if (lodashEs.isNil(data)) return '';
|
|
97
|
+
if (typeof data === 'string') return data;
|
|
98
|
+
if (typeof data === 'number') return String(data);
|
|
99
|
+
if (typeof data === 'boolean') return data ? 'true' : 'false';
|
|
100
|
+
if (Array.isArray(data)) return data.join(' / ');
|
|
101
|
+
if (_typeof(data) === 'object') return JSON.stringify(data);
|
|
102
|
+
return '';
|
|
103
|
+
}
|
|
104
|
+
/** 编辑模式的渲染逻辑,在只读与可编辑之间切换 */;
|
|
105
|
+
_proto.renderEditable = function renderEditable(data, ctx, extraProps) {
|
|
106
|
+
var _a;
|
|
107
|
+
var fieldProps = this.getFieldProps({
|
|
108
|
+
placeholder: this.getDftPlaceholder(ctx)
|
|
109
|
+
}, ctx);
|
|
110
|
+
return /*#__PURE__*/React__default["default"].createElement(Input__default["default"], Object.assign({
|
|
111
|
+
value: this.getEditablePlaceholder(data, ctx),
|
|
112
|
+
readOnly: true,
|
|
113
|
+
disabled: (_a = ctx.field.control) === null || _a === void 0 ? void 0 : _a.disabled,
|
|
114
|
+
onDoubleClick: ctx.onActivate,
|
|
115
|
+
onFocus: ctx.onActivate,
|
|
116
|
+
placeholder: fieldProps.placeholder
|
|
117
|
+
}, extraProps));
|
|
118
|
+
};
|
|
119
|
+
_proto.getDftPlaceholder = function getDftPlaceholder(ctx) {
|
|
120
|
+
var titleText = ctx.field._titleText;
|
|
121
|
+
if (titleText) return "\u8BF7\u8F93\u5165" + titleText;
|
|
122
|
+
};
|
|
123
|
+
return ProField;
|
|
124
|
+
}(schemaCore.AbstractProField);
|
|
125
|
+
exports.ProField = ProField;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var React = require('react');
|
|
17
|
+
var Preview = require('@hi-ui/preview');
|
|
18
|
+
var Space = require('@hi-ui/space');
|
|
19
|
+
function _interopDefaultCompat(e) {
|
|
20
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
21
|
+
'default': e
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
25
|
+
var Preview__default = /*#__PURE__*/_interopDefaultCompat(Preview);
|
|
26
|
+
var Space__default = /*#__PURE__*/_interopDefaultCompat(Space);
|
|
27
|
+
function ImagePreview(props) {
|
|
28
|
+
var images = props.images;
|
|
29
|
+
var _React$useState = React__default["default"].useState(false),
|
|
30
|
+
visible = _React$useState[0],
|
|
31
|
+
setVisible = _React$useState[1];
|
|
32
|
+
var _React$useState2 = React__default["default"].useState(0),
|
|
33
|
+
current = _React$useState2[0],
|
|
34
|
+
setCurrent = _React$useState2[1];
|
|
35
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
36
|
+
className: "image-preview"
|
|
37
|
+
}, /*#__PURE__*/React__default["default"].createElement(Preview__default["default"], {
|
|
38
|
+
title: current + 1 + "/" + images.length,
|
|
39
|
+
src: images,
|
|
40
|
+
current: current,
|
|
41
|
+
onPreviewChange: setCurrent,
|
|
42
|
+
visible: visible,
|
|
43
|
+
onClose: function onClose() {
|
|
44
|
+
setVisible(false);
|
|
45
|
+
}
|
|
46
|
+
}), /*#__PURE__*/React__default["default"].createElement(Space__default["default"], null, images.map(function (url, index) {
|
|
47
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
48
|
+
key: index,
|
|
49
|
+
className: "image-preview__item-wrapper"
|
|
50
|
+
}, /*#__PURE__*/React__default["default"].createElement("img", {
|
|
51
|
+
src: url,
|
|
52
|
+
style: {
|
|
53
|
+
width: '100%',
|
|
54
|
+
cursor: 'pointer'
|
|
55
|
+
},
|
|
56
|
+
onClick: function onClick() {
|
|
57
|
+
setCurrent(index);
|
|
58
|
+
setVisible(true);
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
})));
|
|
62
|
+
}
|
|
63
|
+
exports.ImagePreview = ImagePreview;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var React = require('react');
|
|
17
|
+
var schemaUtils = require('@hi-ui/schema-utils');
|
|
18
|
+
function _interopDefaultCompat(e) {
|
|
19
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
20
|
+
'default': e
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
24
|
+
function ReadonlyWrapper(props) {
|
|
25
|
+
var dataSet = schemaUtils.getDataSet(props.dataSet);
|
|
26
|
+
return /*#__PURE__*/React__default["default"].createElement("span", Object.assign({
|
|
27
|
+
"data-case": "readonly"
|
|
28
|
+
}, dataSet, {
|
|
29
|
+
style: props.style
|
|
30
|
+
}), props.children);
|
|
31
|
+
}
|
|
32
|
+
exports.ReadonlyWrapper = ReadonlyWrapper;
|
|
33
|
+
exports.Span = ReadonlyWrapper;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
17
|
+
var tslib = require('tslib');
|
|
18
|
+
var React = require('react');
|
|
19
|
+
var lodashEs = require('lodash-es');
|
|
20
|
+
var ahooks = require('ahooks');
|
|
21
|
+
var message = require('@hi-ui/message');
|
|
22
|
+
var schemaHooks = require('@hi-ui/schema-hooks');
|
|
23
|
+
var schemaUtils = require('@hi-ui/schema-utils');
|
|
24
|
+
var utils = require('./utils.js');
|
|
25
|
+
function _interopDefaultCompat(e) {
|
|
26
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
27
|
+
'default': e
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultCompat(_regeneratorRuntime);
|
|
31
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
32
|
+
var noopOnChange = function noopOnChange() {
|
|
33
|
+
// noopOnChange
|
|
34
|
+
};
|
|
35
|
+
function normalizeProps(props) {
|
|
36
|
+
var value = props.value;
|
|
37
|
+
// value 为字符传时转换为数组;undefined 保持 undefined
|
|
38
|
+
var nextValue = Array.isArray(value) ? value : typeof value === 'string' ? [value] : undefined;
|
|
39
|
+
// 存在 request 方法时,默认使用 json 模式
|
|
40
|
+
var nextMode = props.mode || (props.request ? 'json' : 'formData');
|
|
41
|
+
// maxCount 大于 1 时,默认使用 multiple 模式
|
|
42
|
+
var nextMultiple = props.multiple || (props.maxCount || 0) > 1;
|
|
43
|
+
// 没开启 multiple,也没传 maxCount,则默认限制为 1
|
|
44
|
+
var nextMaxCount = props.maxCount || (!props.multiple ? 1 : undefined);
|
|
45
|
+
return Object.assign(Object.assign({}, props), {
|
|
46
|
+
value: nextValue,
|
|
47
|
+
mode: nextMode,
|
|
48
|
+
multiple: nextMultiple,
|
|
49
|
+
maxCount: nextMaxCount
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function UploadBridge(props) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
var children = props.children,
|
|
55
|
+
restProps = tslib.__rest(props, ["children"]);
|
|
56
|
+
var normalizedProps = normalizeProps(restProps);
|
|
57
|
+
var _useControllableValue = ahooks.useControllableValue(normalizedProps),
|
|
58
|
+
_useControllableValue2 = _useControllableValue[0],
|
|
59
|
+
value = _useControllableValue2 === void 0 ? [] : _useControllableValue2,
|
|
60
|
+
_setValue = _useControllableValue[1];
|
|
61
|
+
var _useMemo = React.useMemo(function () {
|
|
62
|
+
return utils.toFileList(value);
|
|
63
|
+
}, [value]),
|
|
64
|
+
fileList = _useMemo.fileList,
|
|
65
|
+
fileIdSet = _useMemo.fileIdSet;
|
|
66
|
+
var setValue = function setValue(value) {
|
|
67
|
+
// 只保留<maxCount>个文件
|
|
68
|
+
var sliced = utils.sliceToMaxCount(value, normalizedProps.maxCount, 0);
|
|
69
|
+
var transformed = sliced.map(function (file) {
|
|
70
|
+
if (typeof file === 'string') return {
|
|
71
|
+
url: file,
|
|
72
|
+
fileId: file,
|
|
73
|
+
name: ''
|
|
74
|
+
};else return file;
|
|
75
|
+
});
|
|
76
|
+
_setValue(transformed);
|
|
77
|
+
};
|
|
78
|
+
// 此处的 Set 是给组件卸载的清理阶段有的
|
|
79
|
+
var fileUrlSetRef = schemaHooks.useReadonlyRef(function () {
|
|
80
|
+
return new Set();
|
|
81
|
+
});
|
|
82
|
+
if (normalizedProps.mode === 'formData') {
|
|
83
|
+
fileList === null || fileList === void 0 ? void 0 : fileList.forEach(function (_ref) {
|
|
84
|
+
var url = _ref.url;
|
|
85
|
+
return fileUrlSetRef.current.add(url);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
React.useEffect(function () {
|
|
89
|
+
return function () {
|
|
90
|
+
// 组件卸载时清理所有创建的URL
|
|
91
|
+
// 此处忽略掉这条规则,因为就是需要最新的 fileUrlSetRef
|
|
92
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
93
|
+
fileUrlSetRef.current.forEach(function (url) {
|
|
94
|
+
if (url) {
|
|
95
|
+
// url 预期是 blob 协议的本地文件地址
|
|
96
|
+
// 若是外部传入的 http 协议的文件也没事
|
|
97
|
+
// revokeObjectURL 会直接忽略
|
|
98
|
+
URL.revokeObjectURL(url);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
}, [fileUrlSetRef]);
|
|
103
|
+
var customUpload = function customUpload(fileList) {
|
|
104
|
+
return tslib.__awaiter(_this, void 0, void 0, /*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() {
|
|
105
|
+
var files, uniqueFiles, maxSize, maxSizeInBytes, oversizedFiles, sliced, urls, nextFiles, msg;
|
|
106
|
+
return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) {
|
|
107
|
+
while (1) {
|
|
108
|
+
switch (_context.prev = _context.next) {
|
|
109
|
+
case 0:
|
|
110
|
+
if (fileList) {
|
|
111
|
+
_context.next = 2;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
return _context.abrupt("return");
|
|
115
|
+
case 2:
|
|
116
|
+
files = Array.from(fileList); // 1. 文件去重
|
|
117
|
+
// 直接使用已计算的fileList中的fileId
|
|
118
|
+
uniqueFiles = files.filter(function (file) {
|
|
119
|
+
return !(fileIdSet === null || fileIdSet === void 0 ? void 0 : fileIdSet.has(utils.genFileIdentifier(file)));
|
|
120
|
+
});
|
|
121
|
+
if (!(uniqueFiles.length === 0)) {
|
|
122
|
+
_context.next = 7;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
message.message.open({
|
|
126
|
+
type: 'warning',
|
|
127
|
+
title: '所选文件已存在'
|
|
128
|
+
});
|
|
129
|
+
return _context.abrupt("return");
|
|
130
|
+
case 7:
|
|
131
|
+
// 2. 检查文件大小 (maxSize单位为KB,需要转换为bytes进行比较)
|
|
132
|
+
maxSize = normalizedProps.maxSize || Infinity;
|
|
133
|
+
maxSizeInBytes = maxSize * 1024;
|
|
134
|
+
oversizedFiles = uniqueFiles.filter(function (file) {
|
|
135
|
+
return file.size > maxSizeInBytes;
|
|
136
|
+
});
|
|
137
|
+
if (!(oversizedFiles.length > 0)) {
|
|
138
|
+
_context.next = 13;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
message.message.open({
|
|
142
|
+
type: 'warning',
|
|
143
|
+
title: "\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA" + maxSize + "KB\u9650\u5236"
|
|
144
|
+
});
|
|
145
|
+
return _context.abrupt("return");
|
|
146
|
+
case 13:
|
|
147
|
+
_context.prev = 13;
|
|
148
|
+
if (!(normalizedProps.mode === 'json')) {
|
|
149
|
+
_context.next = 27;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
if (normalizedProps.request) {
|
|
153
|
+
_context.next = 17;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
throw new Error('JSON 模式下必须提供 request 方法');
|
|
157
|
+
case 17:
|
|
158
|
+
// 只保留<maxCount - curLength>个文件
|
|
159
|
+
sliced = utils.sliceToMaxCount(uniqueFiles, normalizedProps.maxCount, value.length); // 上传文件并获取URL
|
|
160
|
+
_context.next = 20;
|
|
161
|
+
return normalizedProps.request(sliced);
|
|
162
|
+
case 20:
|
|
163
|
+
urls = _context.sent;
|
|
164
|
+
if (!(!urls || urls.length === 0)) {
|
|
165
|
+
_context.next = 23;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
return _context.abrupt("return");
|
|
169
|
+
case 23:
|
|
170
|
+
nextFiles = urls.map(function (url, index) {
|
|
171
|
+
var fileId = utils.genFileIdentifier(uniqueFiles[index]);
|
|
172
|
+
if (typeof url === 'string') return {
|
|
173
|
+
url: url,
|
|
174
|
+
fileId: fileId,
|
|
175
|
+
name: ''
|
|
176
|
+
};else return Object.assign(Object.assign({}, url), {
|
|
177
|
+
fileId: fileId
|
|
178
|
+
});
|
|
179
|
+
}); // 更新value
|
|
180
|
+
setValue([].concat(value || [], nextFiles));
|
|
181
|
+
_context.next = 28;
|
|
182
|
+
break;
|
|
183
|
+
case 27:
|
|
184
|
+
// formData模式直接返回File数组
|
|
185
|
+
setValue([].concat(value || [], uniqueFiles));
|
|
186
|
+
case 28:
|
|
187
|
+
_context.next = 35;
|
|
188
|
+
break;
|
|
189
|
+
case 30:
|
|
190
|
+
_context.prev = 30;
|
|
191
|
+
_context.t0 = _context["catch"](13);
|
|
192
|
+
console.log('UploadBridge customUpload request', _context.t0);
|
|
193
|
+
msg = '文件上传失败: ' + (_context.t0 instanceof Error ? _context.t0.message : '未知错误');
|
|
194
|
+
message.message.open({
|
|
195
|
+
type: 'error',
|
|
196
|
+
title: msg
|
|
197
|
+
});
|
|
198
|
+
case 35:
|
|
199
|
+
case "end":
|
|
200
|
+
return _context.stop();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}, _callee, null, [[13, 30]]);
|
|
204
|
+
}));
|
|
205
|
+
};
|
|
206
|
+
var handleRemove = function handleRemove(_1, _2, index) {
|
|
207
|
+
// 获取要删除的文件的URL
|
|
208
|
+
var fileToRemove = fileList === null || fileList === void 0 ? void 0 : fileList[index];
|
|
209
|
+
if (fileToRemove === null || fileToRemove === void 0 ? void 0 : fileToRemove.url) URL.revokeObjectURL(fileToRemove.url);
|
|
210
|
+
setValue(value.filter(function (_, idx) {
|
|
211
|
+
return idx !== index;
|
|
212
|
+
}));
|
|
213
|
+
return true;
|
|
214
|
+
};
|
|
215
|
+
var finalProps = schemaUtils.mergeProps({
|
|
216
|
+
type: 'default'
|
|
217
|
+
}, lodashEs.omit(normalizedProps, [
|
|
218
|
+
// 移除无关的属性
|
|
219
|
+
'value', 'defaultValue', 'onChange', 'mode', 'request']));
|
|
220
|
+
return /*#__PURE__*/React__default["default"].cloneElement(children, Object.assign(Object.assign({}, finalProps), {
|
|
221
|
+
customUpload: customUpload,
|
|
222
|
+
fileList: fileList,
|
|
223
|
+
onChange: noopOnChange,
|
|
224
|
+
onRemove: handleRemove
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
exports.UploadBridge = UploadBridge;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
Object.defineProperty(exports, '__esModule', {
|
|
13
|
+
value: true
|
|
14
|
+
});
|
|
15
|
+
var schemaUtils = require('@hi-ui/schema-utils');
|
|
16
|
+
function toFileList(file) {
|
|
17
|
+
if (!file) return {};
|
|
18
|
+
var fileIdSet = new Set();
|
|
19
|
+
var files = Array.isArray(file) ? file : [file];
|
|
20
|
+
var fileList = files.map(function (file) {
|
|
21
|
+
var normalizedFile = typeof file === 'string' ? {
|
|
22
|
+
symbol: file,
|
|
23
|
+
fileId: file,
|
|
24
|
+
url: file
|
|
25
|
+
} : file instanceof File ? {
|
|
26
|
+
symbol: file.name,
|
|
27
|
+
name: file.name,
|
|
28
|
+
fileId: file.name + "-" + file.size + "-" + file.lastModified,
|
|
29
|
+
url: URL.createObjectURL(file)
|
|
30
|
+
} : {
|
|
31
|
+
symbol: file.url,
|
|
32
|
+
name: file.name,
|
|
33
|
+
fileId: file.name + "-" + file.url,
|
|
34
|
+
url: file.url
|
|
35
|
+
};
|
|
36
|
+
var info = schemaUtils.extractFileInfo(normalizedFile.symbol);
|
|
37
|
+
// 添加到 fileIdSet
|
|
38
|
+
fileIdSet.add(normalizedFile.fileId);
|
|
39
|
+
return {
|
|
40
|
+
name: normalizedFile.name || info.fullName,
|
|
41
|
+
fileId: normalizedFile.fileId,
|
|
42
|
+
fileType: info.ext,
|
|
43
|
+
uploadState: 'success',
|
|
44
|
+
url: normalizedFile.url
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
fileIdSet: fileIdSet,
|
|
49
|
+
fileList: fileList
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// 文件唯一标识生成函数
|
|
53
|
+
function genFileIdentifier(file) {
|
|
54
|
+
if (file instanceof File) {
|
|
55
|
+
return file.name + "-" + file.size + "-" + file.lastModified;
|
|
56
|
+
} else if (typeof file === 'string') {
|
|
57
|
+
return file;
|
|
58
|
+
} else {
|
|
59
|
+
return file.name + "-" + file.url;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function sliceToMaxCount(value, maxCount, curCount) {
|
|
63
|
+
if (curCount === void 0) {
|
|
64
|
+
curCount = 0;
|
|
65
|
+
}
|
|
66
|
+
// maxCount 存在时,计算需要保留的文件数量
|
|
67
|
+
var _maxCount = typeof maxCount === 'number' ? maxCount - curCount : undefined;
|
|
68
|
+
var sliceStart = Math.max(value.length - (_maxCount || 0), 0);
|
|
69
|
+
return value.slice(sliceStart);
|
|
70
|
+
}
|
|
71
|
+
exports.genFileIdentifier = genFileIdentifier;
|
|
72
|
+
exports.sliceToMaxCount = sliceToMaxCount;
|
|
73
|
+
exports.toFileList = toFileList;
|
package/lib/cjs/ctx.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var React = require('react');
|
|
17
|
+
var index = require('./fields/semantic/text/index.js');
|
|
18
|
+
function _interopDefaultCompat(e) {
|
|
19
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
20
|
+
'default': e
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
24
|
+
var FieldMapCtx = /*#__PURE__*/React__default["default"].createContext(null);
|
|
25
|
+
function FieldMapProvider(props) {
|
|
26
|
+
var children = props.children,
|
|
27
|
+
fields = props.fields;
|
|
28
|
+
return /*#__PURE__*/React__default["default"].createElement(FieldMapCtx.Provider, {
|
|
29
|
+
value: fields
|
|
30
|
+
}, children);
|
|
31
|
+
}
|
|
32
|
+
function useFieldMap(opts) {
|
|
33
|
+
if (opts === void 0) {
|
|
34
|
+
opts = {};
|
|
35
|
+
}
|
|
36
|
+
var ctx = React__default["default"].useContext(FieldMapCtx);
|
|
37
|
+
var _opts = opts,
|
|
38
|
+
fieldMap = _opts.fieldMap;
|
|
39
|
+
if (fieldMap) return fieldMap;
|
|
40
|
+
if (!ctx) {
|
|
41
|
+
console.warn("SchemaComponents: \u672A\u627E\u5230 FieldsContext\uFF0C\u5C06\u4F7F\u7528\u9ED8\u8BA4\u7684 Text \u6E32\u67D3\u5668");
|
|
42
|
+
return {
|
|
43
|
+
text: index.ProText
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return ctx;
|
|
47
|
+
}
|
|
48
|
+
function matchFieldClass(opts) {
|
|
49
|
+
var field = opts.field,
|
|
50
|
+
fieldMap = opts.fieldMap;
|
|
51
|
+
var matchedFieldClass = fieldMap[field.valueType];
|
|
52
|
+
var FieldClass = matchedFieldClass || index.ProText;
|
|
53
|
+
if (!matchedFieldClass && field.valueType !== 'custom') {
|
|
54
|
+
var _name = opts.name || 'matchFieldClass';
|
|
55
|
+
var _type = field.valueType;
|
|
56
|
+
console.warn(_name + ": \u672A\u627E\u5230 ValueType \"" + _type + "\" \u5BF9\u5E94\u7684\u6E32\u67D3\u5668\uFF0C\u5C06\u4F7F\u7528\u9ED8\u8BA4\u7684 Text \u6E32\u67D3\u5668\n");
|
|
57
|
+
}
|
|
58
|
+
return FieldClass;
|
|
59
|
+
}
|
|
60
|
+
function useMatchFieldClass(opts) {
|
|
61
|
+
// 获取字段渲染器
|
|
62
|
+
var fieldMap = useFieldMap(opts);
|
|
63
|
+
return matchFieldClass(Object.assign(Object.assign({}, opts), {
|
|
64
|
+
fieldMap: fieldMap
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
exports.FieldMapProvider = FieldMapProvider;
|
|
68
|
+
exports.matchFieldClass = matchFieldClass;
|
|
69
|
+
exports.useFieldMap = useFieldMap;
|
|
70
|
+
exports.useMatchFieldClass = useMatchFieldClass;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** @LICENSE
|
|
2
|
+
* @hi-ui/schema-fields
|
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/schema/schema-fields#readme
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
13
|
+
Object.defineProperty(exports, '__esModule', {
|
|
14
|
+
value: true
|
|
15
|
+
});
|
|
16
|
+
var React = require('react');
|
|
17
|
+
function _interopDefaultCompat(e) {
|
|
18
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
|
19
|
+
'default': e
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
var React__default = /*#__PURE__*/_interopDefaultCompat(React);
|
|
23
|
+
var EditableControlContext = /*#__PURE__*/React__default["default"].createContext({
|
|
24
|
+
editable: undefined,
|
|
25
|
+
// 默认可编辑
|
|
26
|
+
readonly: undefined // 默认非只读
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
function EditableControlProvider(props) {
|
|
30
|
+
// 只是用来保持引用不变
|
|
31
|
+
var value = React__default["default"].useMemo(function () {
|
|
32
|
+
return {
|
|
33
|
+
editable: props.editable,
|
|
34
|
+
readonly: props.readonly
|
|
35
|
+
};
|
|
36
|
+
}, [props.editable, props.readonly]);
|
|
37
|
+
return /*#__PURE__*/React__default["default"].createElement(EditableControlContext.Provider, {
|
|
38
|
+
value: value
|
|
39
|
+
}, props.children);
|
|
40
|
+
}
|
|
41
|
+
function useEditableControlCtx() {
|
|
42
|
+
return React__default["default"].useContext(EditableControlContext);
|
|
43
|
+
}
|
|
44
|
+
exports.EditableControlProvider = EditableControlProvider;
|
|
45
|
+
exports.useEditableControlCtx = useEditableControlCtx;
|