@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.
Files changed (139) hide show
  1. package/README.md +11 -0
  2. package/lib/cjs/base.js +125 -0
  3. package/lib/cjs/components/image-preview/index.js +63 -0
  4. package/lib/cjs/components/span/index.js +33 -0
  5. package/lib/cjs/components/upload-bridge/index.js +227 -0
  6. package/lib/cjs/components/upload-bridge/utils.js +73 -0
  7. package/lib/cjs/ctx.js +70 -0
  8. package/lib/cjs/editable/ctx.js +45 -0
  9. package/lib/cjs/editable/editable.js +141 -0
  10. package/lib/cjs/editable/index.js +62 -0
  11. package/lib/cjs/editable/readonly.js +36 -0
  12. package/lib/cjs/editable/simple.js +61 -0
  13. package/lib/cjs/editable/use-readonly.js +200 -0
  14. package/lib/cjs/extensible/selectable/index.js +114 -0
  15. package/lib/cjs/extensible/selectable/match-cascader.js +184 -0
  16. package/lib/cjs/fields/basic/cascader/index.js +98 -0
  17. package/lib/cjs/fields/basic/check-cascader/index.js +58 -0
  18. package/lib/cjs/fields/basic/check-select/index.js +89 -0
  19. package/lib/cjs/fields/basic/check-tree-select/index.js +61 -0
  20. package/lib/cjs/fields/basic/checkbox/index.js +84 -0
  21. package/lib/cjs/fields/basic/counter/index.js +40 -0
  22. package/lib/cjs/fields/basic/radio/index.js +44 -0
  23. package/lib/cjs/fields/basic/rating/index.js +40 -0
  24. package/lib/cjs/fields/basic/select/index.js +98 -0
  25. package/lib/cjs/fields/basic/slider/index.js +40 -0
  26. package/lib/cjs/fields/basic/switch/index.js +47 -0
  27. package/lib/cjs/fields/basic/textarea/index.js +40 -0
  28. package/lib/cjs/fields/basic/time-picker/index.js +45 -0
  29. package/lib/cjs/fields/basic/time-picker/index.scss.js +18 -0
  30. package/lib/cjs/fields/basic/tree-select/index.js +61 -0
  31. package/lib/cjs/fields/basic/upload/custom.js +29 -0
  32. package/lib/cjs/fields/basic/upload/index.js +48 -0
  33. package/lib/cjs/fields/enhance/number-range/index.js +39 -0
  34. package/lib/cjs/fields/semantic/date/index.js +82 -0
  35. package/lib/cjs/fields/semantic/image/index.js +65 -0
  36. package/lib/cjs/fields/semantic/image/upload.js +32 -0
  37. package/lib/cjs/fields/semantic/link/index.js +96 -0
  38. package/lib/cjs/fields/semantic/number/index.js +106 -0
  39. package/lib/cjs/fields/semantic/tag/index.js +164 -0
  40. package/lib/cjs/fields/semantic/tag/index.scss.js +18 -0
  41. package/lib/cjs/fields/semantic/text/index.js +61 -0
  42. package/lib/cjs/index.js +145 -0
  43. package/lib/cjs/utils/batch-dep-update.js +40 -0
  44. package/lib/cjs/utils/form-binding.js +40 -0
  45. package/lib/cjs/utils/label.js +34 -0
  46. package/lib/cjs/utils.js +35 -0
  47. package/lib/esm/base.js +111 -0
  48. package/lib/esm/components/image-preview/index.js +49 -0
  49. package/lib/esm/components/span/index.js +20 -0
  50. package/lib/esm/components/upload-bridge/index.js +214 -0
  51. package/lib/esm/components/upload-bridge/utils.js +66 -0
  52. package/lib/esm/ctx.js +55 -0
  53. package/lib/esm/editable/ctx.js +32 -0
  54. package/lib/esm/editable/editable.js +129 -0
  55. package/lib/esm/editable/index.js +44 -0
  56. package/lib/esm/editable/readonly.js +24 -0
  57. package/lib/esm/editable/simple.js +49 -0
  58. package/lib/esm/editable/use-readonly.js +193 -0
  59. package/lib/esm/extensible/selectable/index.js +101 -0
  60. package/lib/esm/extensible/selectable/match-cascader.js +179 -0
  61. package/lib/esm/fields/basic/cascader/index.js +83 -0
  62. package/lib/esm/fields/basic/check-cascader/index.js +44 -0
  63. package/lib/esm/fields/basic/check-select/index.js +75 -0
  64. package/lib/esm/fields/basic/check-tree-select/index.js +47 -0
  65. package/lib/esm/fields/basic/checkbox/index.js +70 -0
  66. package/lib/esm/fields/basic/counter/index.js +26 -0
  67. package/lib/esm/fields/basic/radio/index.js +30 -0
  68. package/lib/esm/fields/basic/rating/index.js +26 -0
  69. package/lib/esm/fields/basic/select/index.js +83 -0
  70. package/lib/esm/fields/basic/slider/index.js +26 -0
  71. package/lib/esm/fields/basic/switch/index.js +33 -0
  72. package/lib/esm/fields/basic/textarea/index.js +26 -0
  73. package/lib/esm/fields/basic/time-picker/index.js +31 -0
  74. package/lib/esm/fields/basic/time-picker/index.scss.js +13 -0
  75. package/lib/esm/fields/basic/tree-select/index.js +47 -0
  76. package/lib/esm/fields/basic/upload/custom.js +16 -0
  77. package/lib/esm/fields/basic/upload/index.js +34 -0
  78. package/lib/esm/fields/enhance/number-range/index.js +26 -0
  79. package/lib/esm/fields/semantic/date/index.js +67 -0
  80. package/lib/esm/fields/semantic/image/index.js +51 -0
  81. package/lib/esm/fields/semantic/image/upload.js +20 -0
  82. package/lib/esm/fields/semantic/link/index.js +82 -0
  83. package/lib/esm/fields/semantic/number/index.js +91 -0
  84. package/lib/esm/fields/semantic/tag/index.js +149 -0
  85. package/lib/esm/fields/semantic/tag/index.scss.js +13 -0
  86. package/lib/esm/fields/semantic/text/index.js +47 -0
  87. package/lib/esm/index.js +85 -0
  88. package/lib/esm/utils/batch-dep-update.js +35 -0
  89. package/lib/esm/utils/form-binding.js +34 -0
  90. package/lib/esm/utils/label.js +21 -0
  91. package/lib/esm/utils.js +27 -0
  92. package/lib/types/base.d.ts +44 -0
  93. package/lib/types/components/async-refill-placeholder/index.d.ts +7 -0
  94. package/lib/types/components/image-preview/index.d.ts +5 -0
  95. package/lib/types/components/span/index.d.ts +8 -0
  96. package/lib/types/components/upload-bridge/index.d.ts +5 -0
  97. package/lib/types/components/upload-bridge/type.d.ts +26 -0
  98. package/lib/types/components/upload-bridge/utils.d.ts +11 -0
  99. package/lib/types/ctx.d.ts +21 -0
  100. package/lib/types/editable/ctx.d.ts +5 -0
  101. package/lib/types/editable/editable.d.ts +18 -0
  102. package/lib/types/editable/index.d.ts +14 -0
  103. package/lib/types/editable/readonly.d.ts +8 -0
  104. package/lib/types/editable/simple.d.ts +8 -0
  105. package/lib/types/editable/type.d.ts +9 -0
  106. package/lib/types/editable/use-readonly.d.ts +26 -0
  107. package/lib/types/extensible/selectable/index.d.ts +31 -0
  108. package/lib/types/extensible/selectable/match-cascader.d.ts +19 -0
  109. package/lib/types/extensible/selectable/type.d.ts +16 -0
  110. package/lib/types/fields/basic/cascader/index.d.ts +10 -0
  111. package/lib/types/fields/basic/check-cascader/index.d.ts +11 -0
  112. package/lib/types/fields/basic/check-select/index.d.ts +34 -0
  113. package/lib/types/fields/basic/check-tree-select/index.d.ts +10 -0
  114. package/lib/types/fields/basic/checkbox/index.d.ts +19 -0
  115. package/lib/types/fields/basic/counter/index.d.ts +7 -0
  116. package/lib/types/fields/basic/radio/index.d.ts +7 -0
  117. package/lib/types/fields/basic/rating/index.d.ts +7 -0
  118. package/lib/types/fields/basic/select/index.d.ts +12 -0
  119. package/lib/types/fields/basic/slider/index.d.ts +7 -0
  120. package/lib/types/fields/basic/switch/index.d.ts +7 -0
  121. package/lib/types/fields/basic/textarea/index.d.ts +7 -0
  122. package/lib/types/fields/basic/time-picker/index.d.ts +8 -0
  123. package/lib/types/fields/basic/tree-select/index.d.ts +11 -0
  124. package/lib/types/fields/basic/upload/custom.d.ts +3 -0
  125. package/lib/types/fields/basic/upload/index.d.ts +8 -0
  126. package/lib/types/fields/enhance/number-range/index.d.ts +7 -0
  127. package/lib/types/fields/semantic/date/index.d.ts +15 -0
  128. package/lib/types/fields/semantic/image/index.d.ts +11 -0
  129. package/lib/types/fields/semantic/image/upload.d.ts +3 -0
  130. package/lib/types/fields/semantic/link/index.d.ts +31 -0
  131. package/lib/types/fields/semantic/number/index.d.ts +21 -0
  132. package/lib/types/fields/semantic/tag/index.d.ts +78 -0
  133. package/lib/types/fields/semantic/text/index.d.ts +13 -0
  134. package/lib/types/index.d.ts +108 -0
  135. package/lib/types/utils/batch-dep-update.d.ts +13 -0
  136. package/lib/types/utils/form-binding.d.ts +11 -0
  137. package/lib/types/utils/label.d.ts +11 -0
  138. package/lib/types/utils.d.ts +15 -0
  139. package/package.json +98 -0
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # `@hi-ui/schema-fields`
2
+
3
+ > TODO: description
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ const schemaFields = require('@hi-ui/schema-fields');
9
+
10
+ // TODO: DEMONSTRATE API
11
+ ```
@@ -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;