choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
138 lines (104 loc) • 4.18 kB
JavaScript
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
;