UNPKG

@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
"use strict"; 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 []); }