UNPKG

bytesforce-form-render

Version:

通过 JSON Schema 生成标准 Form,常用于自定义搭建配置界面生成

380 lines (303 loc) 12.7 kB
var _excluded = ["id", "_item", "dataIndex", "hideTitle", "hideValidation", "debugCss"], _excluded2 = ["id", "item", "dataIndex", "dataPath", "hideTitle", "hideValidation", "debugCss", "schema", "_value", "dependValues", "displayType", "labelAlign", "column", "labelWidth", "readOnly", "errorFields", "effectiveLabelWidth"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _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; } 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; } 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; } import React, { useRef } from 'react'; import { useStore, useStore2 } from '../hooks'; import { clone, getDataPath, getParentPath, getParentProps, getValueByPath, isCheckBoxType, isCssLength, isListType, isLooselyNumber, isObjType, parseRootValueInSchema } from '../utils'; import RenderList from './RenderChildren/RenderList'; import RenderObject from './RenderChildren/RenderObject'; import RenderField from './RenderField'; var Core = function Core(_ref) { var _ref$id = _ref.id, id = _ref$id === void 0 ? '#' : _ref$id, _item = _ref._item, _ref$dataIndex = _ref.dataIndex, dataIndex = _ref$dataIndex === void 0 ? [] : _ref$dataIndex, _ref$hideTitle = _ref.hideTitle, hideTitle = _ref$hideTitle === void 0 ? false : _ref$hideTitle, _ref$hideValidation = _ref.hideValidation, hideValidation = _ref$hideValidation === void 0 ? false : _ref$hideValidation, debugCss = _ref.debugCss, rest = _objectWithoutProperties(_ref, _excluded); var snapShot = useRef(); var _useStore = useStore(), flatten = _useStore.flatten, errorFields = _useStore.errorFields, isEditing = _useStore.isEditing, formData = _useStore.formData, allTouched = _useStore.allTouched; var _useStore2 = useStore2(), displayType = _useStore2.displayType, column = _useStore2.column, labelWidth = _useStore2.labelWidth, readOnly = _useStore2.readOnly, labelAlign = _useStore2.labelAlign; var item = _item ? _item : flatten[id]; if (!item) return null; var dataPath = getDataPath(id, dataIndex); var parentPath = getParentPath(dataPath); var _value = getValueByPath(formData, dataPath); var schema = clone(item.schema); var dependencies = schema.dependencies; var dependValues = []; var rootValue; try { if (Array.isArray(dependencies)) { dependencies.forEach(function (item) { var itemPath = getDataPath(item, dataIndex); var result = getValueByPath(formData, itemPath); dependValues.push(result); }); } } catch (error) { console.error("dependencies \u8BA1\u7B97\u62A5\u9519\uFF0C".concat(dependencies)); } try { rootValue = getValueByPath(formData, parentPath); } catch (error) {} // 节流部分逻辑,编辑时不执行 if (isEditing && snapShot.current) { schema = snapShot.current; } else { if (JSON.stringify(schema).indexOf('rootValue') > -1) { schema = parseRootValueInSchema(schema, rootValue); } snapShot.current = schema; } // 真正有效的label宽度需要从现在所在item开始一直往上回溯(设计成了继承关系),找到的第一个有值的 ui:labelWidth var effectiveLabelWidth = getParentProps('labelWidth', id, flatten) || labelWidth; var dataProps = _objectSpread({ id: id, item: item, // 如果直接传了item,就不用id去取item, 暂时是内部属性,不外用 dataIndex: dataIndex, // 数据来源是数组的第几个index,上层每有一个list,就push一个index dataPath: dataPath, _value: _value, dependValues: dependValues, hideTitle: hideTitle, hideValidation: hideValidation, debugCss: debugCss, schema: schema, displayType: displayType, column: column, labelWidth: labelWidth, readOnly: readOnly, errorFields: errorFields, effectiveLabelWidth: effectiveLabelWidth, allTouched: allTouched, labelAlign: labelAlign }, rest); return /*#__PURE__*/React.createElement(CoreRender, dataProps); }; var CoreRender = function CoreRender(_ref2) { var id = _ref2.id, item = _ref2.item, dataIndex = _ref2.dataIndex, dataPath = _ref2.dataPath, hideTitle = _ref2.hideTitle, hideValidation = _ref2.hideValidation, debugCss = _ref2.debugCss, schema = _ref2.schema, _value = _ref2._value, dependValues = _ref2.dependValues, displayType = _ref2.displayType, labelAlign = _ref2.labelAlign, column = _ref2.column, labelWidth = _ref2.labelWidth, readOnly = _ref2.readOnly, errorFields = _ref2.errorFields, effectiveLabelWidth = _ref2.effectiveLabelWidth, rest = _objectWithoutProperties(_ref2, _excluded2); if (schema.hidden) { return null; } // 样式的逻辑全放在这层 // displayType 一层层网上找值 var _displayType = schema.displayType || rest.displayType || displayType || 'column'; var _labelAlign = schema.labelAlign || rest.labelAlign || labelAlign || 'right'; var isList = isListType(schema); var isObj = isObjType(schema); var isComplex = isObj || isList; var isCheckBox = isCheckBoxType(schema, readOnly); var width = schema.width || schema['ui:width']; // 针对某些组件需要固定为一列的模式,不允许跟随多列设置为多列,这时需要根据组件的schema来判定,schema中包含fixedBlock= true则不允许组件展示为多列模式 var fixedBlock = schema.fixedBlock || false; var containerClass = "fr-field ".concat(_displayType === 'inline' ? '' : 'w-100', " flex"); var labelClass = "fr-label"; var contentClass = "fr-content"; if (typeof schema.className === 'string') { containerClass += ' ' + schema.className; } // common classNames dispite row or column switch (schema.type) { case 'object': if (isObj) { if (schema.title) { labelClass += ' fr-label-object'; } containerClass += ' fr-field-object'; } break; case 'array': // list 有两种展示形式! if (isList) { if (schema.title) { labelClass += ' fr-label-list'; } containerClass += ' fr-field-column'; } break; case 'boolean': if (isCheckBox) { contentClass += ' fr-content-column'; // checkbox高度短,需要居中对齐 containerClass += " flex ".concat(_displayType === 'column' ? 'flex-column' : ''); } break; default: } // column specific className if (!isComplex && !isCheckBox) { if (_displayType === 'column') { containerClass += ' flex-column'; labelClass += ' fr-label-column'; contentClass += ' fr-content-column'; switch (schema.type) { case 'object': break; case 'array': if (schema.title && !schema.enum) {// labelClass += ' b mb2'; } break; case 'boolean': break; default: } } else if (_displayType === 'row') { // row specific className containerClass += ''; labelClass += " fr-label-row ".concat(_labelAlign === 'right' ? 'fr-label-align-right' : 'fr-label-align-left'); contentClass += ' fr-content-row'; if (!isObj && !isCheckBox) { labelClass += ' flex-shrink-0 fr-label-row'; contentClass += ' flex-grow-1 relative'; } } } // style part var columnStyle = {}; if (schema.hidden) { columnStyle.display = 'none'; } // if (!isComplex) { // } if (!isObj && !fixedBlock) { if (width) { columnStyle.width = width; columnStyle.paddingRight = 8; } else if (column > 1) { columnStyle.width = "calc(100% /".concat(column, ")"); columnStyle.paddingRight = 8; } } var _labelWidth = isLooselyNumber(effectiveLabelWidth) ? Number(effectiveLabelWidth) : isCssLength(effectiveLabelWidth) ? effectiveLabelWidth : 110; // 默认是 110px 的长度 var labelStyle = { width: _labelWidth }; if (isComplex || _displayType === 'column') { labelStyle = { flexGrow: 1 }; } if (_displayType === 'inline') { labelStyle = { marginTop: 5, paddingLeft: 12 }; labelClass = ''; contentClass += ' fr-content-inline'; if (containerClass.indexOf('fr-field-object') === -1) { containerClass += ' fr-field-inline'; } } var hasChildren = item.children && item.children.length > 0; var fieldProps = { $id: id, dataIndex: dataIndex, dataPath: dataPath, _value: _value, dependValues: dependValues, _schema: schema, labelClass: labelClass, labelStyle: labelStyle, contentClass: contentClass, errorFields: errorFields, // 层级间可使用的字段 displayType: _displayType, hideTitle: hideTitle, hideValidation: hideValidation }; var objChildren = /*#__PURE__*/React.createElement("div", { className: "flex flex-wrap" }, /*#__PURE__*/React.createElement(RenderObject, { dataIndex: dataIndex, errorFields: errorFields, displayType: _displayType, labelAlign: _labelAlign, hideTitle: hideTitle }, item.children)); var listChildren = /*#__PURE__*/React.createElement(RenderList, { parentId: id, schema: schema, dataIndex: dataIndex, errorFields: errorFields, displayType: _displayType, hideTitle: hideTitle }, item.children); // 计算 children var _children = null; if (hasChildren) { if (isObj) { _children = objChildren; } else if (isList) { _children = listChildren; } } else if (isCheckBox) { _children = schema.title; } return /*#__PURE__*/React.createElement("div", { style: columnStyle, className: "".concat(containerClass, " ").concat(debugCss ? 'debug' : '') }, /*#__PURE__*/React.createElement(RenderField, fieldProps, _children)); }; // haven't used var areEqual = function areEqual(prev, current) { if (prev.allTouched !== current.allTouched) { return false; } if (prev.displayType !== current.displayType) { return false; } if (prev.column !== current.column) { return false; } if (prev.labelWidth !== current.labelWidth) { return false; } if (prev.readOnly !== current.readOnly) { return false; } if (prev.disabled !== current.disabled) { return false; } if (prev.schema && current.schema) { if (prev.schema.$id === '#') { return false; } } if (isObjType(prev.schema) && isObjType(current.schema)) { return false; } if (JSON.stringify(prev.dependValues) !== JSON.stringify(current.dependValues)) { return false; } if (JSON.stringify(prev._value) === JSON.stringify(current._value) && JSON.stringify(prev.schema) === JSON.stringify(current.schema) && JSON.stringify(prev.errorFields) === JSON.stringify(current.errorFields)) { return true; } return false; }; export default Core;