UNPKG

@infotech/uikit-datagrid

Version:

uikit-datagrid --

359 lines (275 loc) 15.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _throttle = _interopRequireDefault(require("lodash/throttle")); var _memoizee = _interopRequireDefault(require("memoizee")); var _classnames = _interopRequireDefault(require("classnames")); require("./styles.css"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } 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; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } 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; } var styles = { "hightlightedResizer": "uikit_components_datagrid__hightlightedResizer_ccdf11af", "Draggable": "uikit_components_datagrid__Draggable_ccdf11af", "dragging": "uikit_components_datagrid__dragging_ccdf11af", "trickMargin": "uikit_components_datagrid__trickMargin_ccdf11af", "draggingTable": "uikit_components_datagrid__draggingTable_ccdf11af", "borderedTr": "uikit_components_datagrid__borderedTr_ccdf11af" }; /* Search for dropabble target in parents */ // @related-file ./styles.css function findDroppable(target) { var current = target; while (current) { if (current.attributes && current.attributes["data-droppable"]) { return current; } current = current.parentElement; } } /* Get index of passed DOM element relative nearby */ function findTargetIndex(target) { return target.parentElement ? Array.from(target.parentElement.children).findIndex(function (el) { return el === target; }) : false; } /* Remove element highlight class */ function removeHighlight(el) { el.classList.remove(styles.hightlightedResizer); } var _default = function _default(BaseComponent) { var _temp; return _temp = /*#__PURE__*/ function (_Component) { _inherits(DraggableCols, _Component); function DraggableCols() { var _getPrototypeOf2; var _this; _classCallCheck(this, DraggableCols); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(DraggableCols)).call.apply(_getPrototypeOf2, [this].concat(args))); _defineProperty(_assertThisInitialized(_this), "state", { columns: _this.props.columns, resized: _this.props.resized || [] }); _defineProperty(_assertThisInitialized(_this), "onResizeMouseDownHook", (0, _memoizee.default)(function (handler) { return function (event) { _this.disabled = true; var handleMouseUp = function handleMouseUp() { _this.disabled = false; window.removeEventListener("mousedown", handleMouseUp); }; window.addEventListener("mousedown", handleMouseUp); handler(event); }; }, { max: 1, length: 1 })); _defineProperty(_assertThisInitialized(_this), "getTheadTrProps", function () { return { className: _this.state.dragging && styles.borderedTr }; }); _defineProperty(_assertThisInitialized(_this), "disabled", false); _defineProperty(_assertThisInitialized(_this), "node", _react.default.createRef()); _defineProperty(_assertThisInitialized(_this), "handleDragStart", function (e) { var realTarget = findDroppable(e.target); // Get position of mouse at element to calculate must we drag it or not var event = window.event || e; var _realTarget$getBoundi = realTarget.getBoundingClientRect(), x = _realTarget$getBoundi.x, width = _realTarget$getBoundi.width; var left = x + 30; var right = x + (width - 30); var insideTheBox = left < event.clientX && right > event.clientX; var index = findTargetIndex(realTarget); if (index !== false && _this.state.columns[index].draggable === false || !insideTheBox || _this.disabled) { e.preventDefault(); } else { realTarget.classList.add(styles.dragging); e.nativeEvent.dataTransfer.effectAllowed = "move"; e.nativeEvent.dataTransfer.dropEffect = "move"; /* Add data to make it works in FF */ event.dataTransfer.setData("Text", "x"); /* Set dragging state */ _this.setState({ dragging: true }); } }); _defineProperty(_assertThisInitialized(_this), "handleDragEnd", function (e) { // Remove class `dragging` var realTarget = findDroppable(e.target); realTarget.classList.remove(styles.dragging); // Reset highlight after moment setTimeout(function () { return _this.resetHighlight(); }, 100); if (_this.lastTargetIndex) { var thisIndex = findTargetIndex(e.target); if (thisIndex !== false && thisIndex !== _this.lastTargetIndex) { _this.changeColumnsOrder(thisIndex, _this.lastTargetIndex); } } if (e.stopPropagation) { e.stopPropagation(); // stops the browser from redirecting. } e.preventDefault(); _this.setState({ dragging: false }); return false; }); _defineProperty(_assertThisInitialized(_this), "handleDragChange", function (e) { _this.defferedDragChangeHandler(e.target, e.pageX, e.pageY); }); _defineProperty(_assertThisInitialized(_this), "defferedDragChangeHandler", (0, _throttle.default)(function (target, x) { if (target) { // Select target which is can be drop target var realTarget = findDroppable(target); if (realTarget) { var rect = realTarget.getBoundingClientRect(); var rx = x - rect.x; var side = rx < rect.width / 2; var index = findTargetIndex(realTarget); _this.handleDropTargetChange(side ? index : index + 1); } } }, 100)); _defineProperty(_assertThisInitialized(_this), "handleDropTargetChange", (0, _memoizee.default)(function (targetIndex) { _this.lastTargetIndex = targetIndex; // Reset previous highlightes var parentChildrens = _this.resetHighlight(); if (targetIndex) { var hightlightIndex = targetIndex - 1; // Highlight current target if (parentChildrens[hightlightIndex]) { parentChildrens[hightlightIndex].classList.add(styles.hightlightedResizer); } } }, { max: 1, length: 1 })); _defineProperty(_assertThisInitialized(_this), "ResizerComponent", function (props) { return _react.default.createElement("div", _extends({}, props, { className: "rt-resizer", onMouseDown: _this.onResizeMouseDownHook(props.onMouseDown) })); }); _defineProperty(_assertThisInitialized(_this), "handleResizedChange", function (resized, event) { _this.setState({ resized: resized }, function () { if (_this.props.ResizedChange) { return _this.props.ResizedChange(resized, event); } }); }); _defineProperty(_assertThisInitialized(_this), "ThComponent", function (_ref) { var toggleSort = _ref.toggleSort, className = _ref.className, children = _ref.children, rest = _objectWithoutProperties(_ref, ["toggleSort", "className", "children"]); var initialThProps = _objectSpread({ className: (0, _classnames.default)("rt-th", styles.Draggable, className), onClick: function onClick(e) { return toggleSort && toggleSort(e); }, role: "columnheader", tabIndex: "-1", draggable: "true", "data-droppable": "true", onDrop: _this.handleDrop, onDragStart: _this.handleDragStart, onDragEnter: _this.handleDragChange, onDragOver: _this.handleDragChange, onDragEnd: _this.handleDragEnd, ref: _this.node }, rest); /* Support mififying props from the upper HOCS */ var thProps = _this.props.getThComponentProps ? _this.props.getThComponentProps(initialThProps, toggleSort) : initialThProps; return (// eslint-disable-next-line jsx-a11y/click-events-have-key-events _react.default.createElement("div", thProps, children) ); }); return _this; } _createClass(DraggableCols, [{ key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { if (nextProps.columns !== this.props.columns) { this.setState({ columns: nextProps.columns }); } if (nextProps.resized !== this.props.resized) { this.setState({ resized: nextProps.resized }); } } /* Hook resizer mouse down to disable dragging until * window mouse will down again. It helps to fix * bug when resizing invokes dragginge */ }, { key: "changeColumnsOrder", /* Here we change colums (finally) */ value: function changeColumnsOrder(from, to) { var _this2 = this; /* Resort columns */ var nextColumns = this.state.columns.slice(); var targetCol = nextColumns.splice(from, 1)[0]; nextColumns.splice(from < to ? to - 1 : to, 0, targetCol); /* Resort resized */ this.setState({ columns: nextColumns }, function () { /* Send to user handler */ if (_this2.props.onColumnsChange) { _this2.props.onColumnsChange(nextColumns, _this2.state.resized); } }); } /* Memoize resized to prevent columns refreshing */ }, { key: "resetHighlight", value: function resetHighlight() { var parentChildrens = Array.from(this.node.current.parentElement.children); parentChildrens.forEach(removeHighlight); return parentChildrens; } /* Custom Th component for our table */ }, { key: "render", value: function render() { return _react.default.createElement(BaseComponent, _extends({}, this.props, { ThComponent: this.ThComponent, ResizerComponent: this.ResizerComponent, columns: this.state.columns, getTheadTrProps: this.getTheadTrProps, onResizedChange: this.handleResizedChange, resized: this.state.resized })); } }]); return DraggableCols; }(_react.Component), _temp; }; exports.default = _default;