UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

138 lines (104 loc) 4.18 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _reactDom = _interopRequireDefault(require("react-dom")); var _domScrollIntoView = _interopRequireDefault(require("dom-scroll-into-view")); var _has = _interopRequireDefault(require("lodash/has")); var _createBaseForm = _interopRequireDefault(require("./createBaseForm")); var _createForm = require("./createForm"); var _utils = require("./utils"); function computedStyle(el, prop) { var getComputedStyle = window.getComputedStyle; var style = // If we have getComputedStyle getComputedStyle ? // Query it // TODO: From CSS-Query notes, we might need (node, null) for FF getComputedStyle(el) : // Otherwise, we are in IE and use currentStyle el.currentStyle; if (style) { return style[// Switch to camelCase for CSSOM // DEV: Grabbed from jQuery // https://github.com/jquery/jquery/blob/1.9-stable/src/css.js#L191-L194 // https://github.com/jquery/jquery/blob/1.9-stable/src/core.js#L593-L597 prop.replace(/-(\w)/gi, function (word, letter) { return letter.toUpperCase(); })]; } return undefined; } function getScrollableContainer(n) { var node = n; var nodeName; /* eslint no-cond-assign:0 */ while ((nodeName = node.nodeName.toLowerCase()) !== 'body') { var overflowY = computedStyle(node, 'overflowY'); // https://stackoverflow.com/a/36900407/3040605 if (node !== n && (overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight) { return node; } node = node.parentNode; } return nodeName === 'body' ? node.ownerDocument : node; } var mixin = { getForm: function getForm() { return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _createForm.mixin.getForm.call(this)), {}, { validateFieldsAndScroll: this.validateFieldsAndScroll }); }, validateFieldsAndScroll: function validateFieldsAndScroll(ns, opt, cb) { var _this = this; var _getParams = (0, _utils.getParams)(ns, opt, cb), names = _getParams.names, callback = _getParams.callback, options = _getParams.options; var newCb = function newCb(error, values, modify) { if (error) { var validNames = _this.fieldsStore.getValidFieldsName(); var firstNode; var firstTop; var _iterator = (0, _createForOfIteratorHelper2["default"])(validNames), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var name = _step.value; if ((0, _has["default"])(error, name)) { var instance = _this.getFieldInstance(name); if (instance) { var node = _reactDom["default"].findDOMNode(instance); var top = node.getBoundingClientRect().top; if (node.type !== 'hidden' && (firstTop === undefined || firstTop > top)) { firstTop = top; firstNode = node; } } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (firstNode) { var c = options.container || getScrollableContainer(firstNode); (0, _domScrollIntoView["default"])(firstNode, c, (0, _objectSpread2["default"])({ onlyScrollIfNeeded: true }, options.scroll)); } } if (typeof callback === 'function') { callback(error, values, modify); } }; return this.validateFields(names, options, newCb); } }; function createDOMForm(option) { return (0, _createBaseForm["default"])((0, _objectSpread2["default"])({}, option), [mixin]); } var _default = createDOMForm; exports["default"] = _default; //# sourceMappingURL=createDOMForm.js.map