UNPKG

12.8 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.DefaultFieldUI = exports.asField = void 0;
7
8var _react = _interopRequireDefault(require("react"));
9
10var _propTypes = _interopRequireDefault(require("prop-types"));
11
12var _validate = require("./validate");
13
14var _isHidden = require("./isHidden");
15
16var _utils = require("./utils");
17
18function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
20function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
21
22function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
23
24function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
25
26function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
27
28function _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; }
29
30function _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; }
31
32// asField拆分成逻辑组件和展示组件,从而可替换展示组件的方式完全插拔fr的样式
33var asField = function asField(_ref) {
34 var FieldUI = _ref.FieldUI,
35 Widget = _ref.Widget;
36
37 var FieldContainer = function FieldContainer(_ref2) {
38 var className = _ref2.className,
39 column = _ref2.column,
40 showValidate = _ref2.showValidate,
41 isRoot = _ref2.isRoot,
42 hidden = _ref2.hidden,
43 props = _ref2.props,
44 showDescIcon = _ref2.showDescIcon,
45 width = _ref2.width,
46 labelWidth = _ref2.labelWidth,
47 disabled = _ref2.disabled,
48 readonly = _ref2.readonly,
49 options = _ref2.options,
50 schema = _ref2.schema,
51 rest = _objectWithoutProperties(_ref2, ["className", "column", "showValidate", "isRoot", "hidden", "props", "showDescIcon", "width", "labelWidth", "disabled", "readonly", "options", "schema"]);
52
53 var displayType = rest.displayType,
54 _rest$rootValue = rest.rootValue,
55 rootValue = _rest$rootValue === void 0 ? {} : _rest$rootValue,
56 _rest$formData = rest.formData,
57 formData = _rest$formData === void 0 ? {} : _rest$formData,
58 dependShow = rest.dependShow; // most key of schema, disabled, readonly, options, hidden, support for function expression
59
60 var convertValue = function convertValue(item) {
61 if (typeof item === 'function') {
62 return item(formData, rootValue);
63 } else if (typeof item === 'string' && (0, _utils.isFunction)(item) !== false) {
64 var _item = (0, _utils.isFunction)(item);
65
66 try {
67 return (0, _utils.evaluateString)(_item, formData, rootValue);
68 } catch (error) {
69 console.error(error.message);
70 console.error("happen at ".concat(item));
71 return item;
72 }
73 }
74
75 return item;
76 };
77
78 hidden = convertValue(hidden);
79 disabled = convertValue(disabled);
80 readonly = convertValue(readonly);
81 options = convertValue(options); // iterate over schema, and convert every key
82
83 var _schema = _objectSpread({}, schema);
84
85 Object.keys(schema).forEach(function (key) {
86 var availableKey = ['title', 'description', 'format', 'pattern', 'message', 'min', 'max', 'step', 'enum', 'enumNames']; // TODO: need to cover more
87
88 if (availableKey.indexOf(key) > -1) {
89 _schema[key] = convertValue(schema[key]);
90 }
91 }); // "ui:hidden": true, hide formItem
92 // after "convertValue" being stable, this api will be discarded
93
94 if (hidden && (0, _isHidden.isHidden)({
95 hidden: hidden,
96 rootValue: rootValue,
97 formData: formData
98 })) {
99 return null;
100 } // 传入组件的值
101
102
103 var _rest = _objectSpread(_objectSpread({}, rest), {}, {
104 schema: _schema,
105 disabled: disabled,
106 readonly: readonly,
107 options: options,
108 formData: formData || {},
109 rootValue: rootValue || {}
110 }); // 不建议使用ui:dependShow, 一般一律使用ui:hidden。ui:dependShow可以做复杂、跨结构的校验
111
112
113 if ((0, _isHidden.isDependShow)({
114 formData: formData,
115 dependShow: dependShow
116 })) {
117 return null;
118 }
119
120 var isComplex = _schema.type === 'object' || _schema.type === 'array' && _schema.enum === undefined;
121 var isModal = options && (options.modal || options.drawer);
122
123 if (isModal) {
124 isComplex = false;
125 }
126
127 var validateText = (0, _validate.getValidateText)(_rest); // 必填*,label,描述,竖排时的校验语,只要存在一个,label就不为空
128
129 var showLabel = _schema.title || rest.description || rest.required || displayType !== 'row' && showValidate && validateText;
130 var columnStyle = {};
131
132 if (!isComplex && width) {
133 columnStyle = {
134 width: width,
135 paddingRight: '12px'
136 };
137 } else if (!isComplex && column > 1) {
138 columnStyle = {
139 width: "calc(100% /".concat(column, ")"),
140 paddingRight: '12px'
141 };
142 }
143
144 var fieldProps = {
145 className: className,
146 columnStyle: columnStyle,
147 displayType: displayType,
148 isComplex: isComplex,
149 isRequired: rest.required,
150 isRoot: isRoot,
151 schema: _schema,
152 showDescIcon: showDescIcon,
153 showLabel: showLabel,
154 showValidate: showValidate,
155 validateText: validateText,
156 labelWidth: labelWidth
157 };
158 return /*#__PURE__*/_react.default.createElement(FieldUI, fieldProps, /*#__PURE__*/_react.default.createElement(Widget, _extends({}, _rest, {
159 invalid: showValidate && validateText
160 })));
161 };
162
163 FieldContainer.propTypes = {
164 showValidate: _propTypes.default.bool,
165 column: _propTypes.default.number,
166 isRoot: _propTypes.default.bool,
167 props: _propTypes.default.object,
168 showDescIcon: _propTypes.default.bool,
169 displayType: _propTypes.default.string
170 };
171 FieldContainer.defaultProps = {
172 showValidate: true,
173 column: 1,
174 isRoot: false,
175 props: {},
176 showDescIcon: false,
177 displayType: 'column'
178 };
179 return FieldContainer;
180};
181
182exports.asField = asField;
183
184var DefaultFieldUI = function DefaultFieldUI(_ref3) {
185 var children = _ref3.children,
186 className = _ref3.className,
187 columnStyle = _ref3.columnStyle,
188 displayType = _ref3.displayType,
189 isComplex = _ref3.isComplex,
190 isRequired = _ref3.isRequired,
191 isRoot = _ref3.isRoot,
192 schema = _ref3.schema,
193 showDescIcon = _ref3.showDescIcon,
194 showLabel = _ref3.showLabel,
195 showValidate = _ref3.showValidate,
196 validateText = _ref3.validateText,
197 labelWidth = _ref3.labelWidth;
198 // field 整体 label 标签 content 内容
199 var title = schema.title,
200 type = schema.type,
201 _enum = schema.enum,
202 _schema$description = schema.description,
203 description = _schema$description === void 0 ? '' : _schema$description,
204 widget = schema['ui:widget'],
205 options = schema['ui:options'];
206 var isCheckbox = type === 'boolean' && widget !== 'switch';
207 var isModal = options && (options.modal || options.drawer);
208 var fieldClass = "fr-field w-100 ".concat(isComplex ? 'fr-field-complex' : '');
209 var labelClass = 'fr-label mb2';
210 var contentClass = 'fr-content';
211
212 switch (type) {
213 case 'object':
214 if (isModal) {
215 break;
216 }
217
218 if (title) {
219 labelClass += ' fr-label-object bb b--black-20 pb1 mt2 mb3'; // fr-label-object 无默认style,只是占位用于使用者样式覆盖
220 }
221
222 if (!isRoot) {
223 fieldClass += ' fr-field-object'; // object的margin bottom由内部元素撑起
224
225 if (title) {
226 contentClass += ' ml3'; // 缩进
227 }
228 }
229
230 break;
231
232 case 'array':
233 if (isModal) {
234 break;
235 }
236
237 if (title && !_enum) {
238 labelClass += ' fr-label-array mt2 mb3';
239 }
240
241 break;
242
243 case 'boolean':
244 if (isCheckbox) {
245 if (title) {
246 labelClass += ' ml2';
247 labelClass = labelClass.replace('mb2', 'mb0');
248 }
249
250 contentClass += ' flex items-center'; // checkbox高度短,需要居中对齐
251
252 fieldClass += ' flex items-center flex-row-reverse justify-end';
253 }
254
255 break;
256
257 default:
258 if (displayType === 'row') {
259 labelClass = labelClass.replace('mb2', 'mb0');
260 }
261
262 } // 横排时
263
264
265 if (displayType === 'row' && !isComplex && !isCheckbox) {
266 fieldClass += ' flex items-center';
267 labelClass += ' flex-shrink-0 fr-label-row';
268 labelClass = labelClass.replace('mb2', 'mb0');
269 contentClass += ' flex-grow-1 relative';
270 } // 横排的checkbox
271
272
273 if (displayType === 'row' && isCheckbox) {
274 contentClass += ' flex justify-end pr2';
275 }
276
277 var _labelWidth = (0, _utils.isLooselyNumber)(labelWidth) ? Number(labelWidth) : (0, _utils.isCssLength)(labelWidth) ? labelWidth : 110; // 默认是 110px 的长度
278
279
280 var labelStyle = {
281 width: _labelWidth
282 };
283
284 if (isCheckbox) {
285 labelStyle = {
286 flexGrow: 1
287 };
288 } else if (isComplex || displayType === 'column') {
289 labelStyle = {
290 flexGrow: 1
291 };
292 }
293
294 return /*#__PURE__*/_react.default.createElement("div", {
295 className: className ? "".concat(className, " ").concat(fieldClass) : fieldClass,
296 style: columnStyle
297 }, showLabel && /*#__PURE__*/_react.default.createElement("div", {
298 className: labelClass,
299 style: labelStyle
300 }, /*#__PURE__*/_react.default.createElement("label", {
301 className: "fr-label-title ".concat(isCheckbox || displayType === 'column' ? 'no-colon' : '') // boolean不带冒号
302 ,
303 title: title
304 }, isRequired && /*#__PURE__*/_react.default.createElement("span", {
305 className: "fr-label-required"
306 }, " *"), /*#__PURE__*/_react.default.createElement("span", {
307 className: "".concat(isComplex ? 'b' : '', " ").concat(displayType === 'column' ? 'flex-none' : '')
308 }, title), description && (showDescIcon ? /*#__PURE__*/_react.default.createElement("span", {
309 className: "fr-tooltip-toggle",
310 "aria-label": description
311 }, /*#__PURE__*/_react.default.createElement("i", {
312 className: "fr-tooltip-icon"
313 }), /*#__PURE__*/_react.default.createElement("div", {
314 className: "fr-tooltip-container"
315 }, /*#__PURE__*/_react.default.createElement("i", {
316 className: "fr-tooltip-triangle"
317 }), description)) : /*#__PURE__*/_react.default.createElement("span", {
318 className: "fr-desc ml2"
319 }, "(\xA0", description, "\xA0)")), displayType !== 'row' && showValidate && validateText && /*#__PURE__*/_react.default.createElement("span", {
320 className: "fr-validate"
321 }, validateText))), /*#__PURE__*/_react.default.createElement("div", {
322 className: contentClass,
323 style: isCheckbox ? displayType === 'row' ? {
324 marginLeft: _labelWidth
325 } : {} : {
326 flexGrow: 1
327 }
328 }, /*#__PURE__*/_react.default.createElement("div", {
329 className: "flex ".concat(isComplex ? 'flex-column' : 'items-center')
330 }, children), displayType === 'row' && showValidate && validateText && /*#__PURE__*/_react.default.createElement("span", {
331 className: "fr-validate fr-validate-row ".concat(isComplex ? 'relative' : 'absolute')
332 }, validateText)));
333};
334
335exports.DefaultFieldUI = DefaultFieldUI;
\No newline at end of file