@schema-render/core-react
Version:
Through a set of simple JSON Schema, efficiently build a set of forms.
109 lines (108 loc) • 4.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, /**
* 开放 API
*/ "default", {
enumerable: true,
get: function() {
return useOpenApi;
}
});
var _react = require("react");
var _constants = require("../constants");
var _checking = require("../utils/checking");
var _dom = require("../utils/dom");
var _misc = require("../utils/misc");
var _tinyLodash = require("../utils/tinyLodash");
var _validator = require("../utils/validator");
var _useMemoizedFn = /*#__PURE__*/ _interop_require_default(require("./useMemoizedFn"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
/**
* 内部滚动到指定表单项位置方法
* @param formItemElement 表单项 DOM 元素
* @param coreRootElement 内核根节点元素
* @param options 参数
*/ function internalScrollTo(formItemElement, coreRootElement) {
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
if (!formItemElement) {
return;
}
// 解构参数,并赋予默认值
var positionedElement = options.positionedElement, xAxis = options.xAxis, yAxis = options.yAxis, _options_behavior = options.behavior, behavior = _options_behavior === void 0 ? 'smooth' : _options_behavior, _options_gap = options.gap, gap = _options_gap === void 0 ? 0 : _options_gap;
// 表单内部滚动,取根节点元素,否则取用户指定的 “定位元素”
var scrollElement = positionedElement || coreRootElement;
if (scrollElement) {
// 获取指定表单项元素到滚动祖先元素的距离
var offset = (0, _dom.positionedOffset)(formItemElement, scrollElement);
// 滚动到指定位置
scrollElement.scrollTo({
left: xAxis === false ? undefined : offset.left + gap,
top: yAxis === false ? undefined : offset.top + gap,
behavior: behavior
});
}
}
function useOpenApi(param) {
var ref = param.ref, rootElementRef = param.rootElementRef, rootContextRef = param.rootContextRef, getValue = param.getValue, setValue = param.setValue, resetValue = param.resetValue;
var validate = (0, _useMemoizedFn.default)(function() {
return (0, _validator.validateRootSchema)((0, _tinyLodash.pick)(rootContextRef.current, 'rootSchema', 'rootValue', 'locale', 'disabled', 'readonly', 'renderers', 'rendererStorage', 'validators', 'userCtx'));
});
/**
* 查找指定表单项
*/ var findItem = (0, _useMemoizedFn.default)(function(paths) {
var _rootContextRef_current;
var renderers = (_rootContextRef_current = rootContextRef.current) === null || _rootContextRef_current === void 0 ? void 0 : _rootContextRef_current.rendererStorage;
if (renderers && paths) {
var sPath = (0, _checking.isArray)(paths) ? (0, _misc.stringifyPath)(paths) : paths;
return renderers[sPath];
}
});
/**
* 重置错误与警告
*/ var resetError = (0, _useMemoizedFn.default)(function(paths) {
var _rootContextRef_current;
var renderers = (_rootContextRef_current = rootContextRef.current) === null || _rootContextRef_current === void 0 ? void 0 : _rootContextRef_current.rendererStorage;
if (renderers) {
var pathList = !paths ? Object.keys(renderers) : (0, _checking.isString)(paths) ? [
paths
] : paths;
pathList.forEach(function(pathKey) {
var _renderers_pathKey;
(_renderers_pathKey = renderers[pathKey]) === null || _renderers_pathKey === void 0 ? void 0 : _renderers_pathKey.setValidatorState({
status: _constants.EValidationStatus.success
});
});
}
});
/**
* 获取 Core 根节点元素
*/ var getRootElement = (0, _useMemoizedFn.default)(function() {
return rootElementRef.current;
});
/**
* 滚动到指定位置
*/ var scrollTo = (0, _useMemoizedFn.default)(function(paths, options) {
var _findItem;
return internalScrollTo((_findItem = findItem(paths)) === null || _findItem === void 0 ? void 0 : _findItem.getRootElement(), getRootElement(), options);
});
// 暴露开放 API
(0, _react.useImperativeHandle)(ref, function() {
return {
validate: validate,
resetError: resetError,
setValue: setValue,
resetValue: resetValue,
getValue: getValue,
getRootElement: getRootElement,
scrollTo: scrollTo,
findItem: findItem
};
}, // eslint-disable-next-line react-hooks/exhaustive-deps
[]);
}