UNPKG

@coko/client

Version:

Client side common code for coko apps

265 lines (264 loc) 16.5 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _antd = require("antd"); var _reactBeautifulDnd = require("react-beautiful-dnd"); var _icons = require("@ant-design/icons"); var _toolkit = require("../../toolkit"); var _InviteRowProp = _interopRequireDefault(require("./InviteRowProp")); var _excluded = ["children", "className"], _excluded2 = ["children", "index", "manualSorting"], _excluded3 = ["sorter"]; var _templateObject, _templateObject2, _templateObject3, _templateObject4; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _extends() { _extends = Object.assign ? Object.assign.bind() : 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 _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 _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } var Wrapper = _styledComponents["default"].div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border: 1px solid grey;\n padding: 16px;\n"]))); var EmptyMessage = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n color: ", ";\n font-size: ", ";\n font-style: italic;\n"])), (0, _toolkit.th)('colorTextPlaceholder'), (0, _toolkit.th)('fontSizeBaseSmall')); var StyledTable = (0, _styledComponents["default"])(_antd.Table)(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral([""]))); var StyledMenuOutlined = (0, _styledComponents["default"])(_icons.MenuOutlined)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n cursor: move;\n touch-action: none;\n"]))); var TableBody = function TableBody(_ref) { var children = _ref.children, className = _ref.className, props = _objectWithoutProperties(_ref, _excluded); return /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.Droppable, { droppableId: "droppable-table" }, function (provided, snapshot) { return /*#__PURE__*/_react["default"].createElement("tbody", _extends({ className: className, ref: provided.innerRef }, props, provided.droppableProps), children, provided.placeholder); }); }; var TableRow = function TableRow(_ref2) { var children = _ref2.children, index = _ref2.index, manualSorting = _ref2.manualSorting, props = _objectWithoutProperties(_ref2, _excluded2); return manualSorting ? /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.Draggable, { draggableId: props['data-row-key'].toString(), index: index, key: props['data-row-key'] }, function (provided, snapshot) { return /*#__PURE__*/_react["default"].createElement("tr", _extends({ ref: provided.innerRef }, props, provided.draggableProps, provided.dragHandleProps), _react["default"].Children.map(children, function (child) { if (child.key === 'sort') { return /*#__PURE__*/_react["default"].cloneElement(child, { children: /*#__PURE__*/_react["default"].createElement(StyledMenuOutlined, null) }); } return child; })); }) : /*#__PURE__*/_react["default"].createElement("tr", props, children); }; TableRow.propTypes = { 'data-row-key': _propTypes["default"].string.isRequired, index: _propTypes["default"].number.isRequired, manualSorting: _propTypes["default"].bool.isRequired, record: _propTypes["default"].shape({ id: _propTypes["default"].string }).isRequired, style: _propTypes["default"].shape().isRequired }; var ReviewerTable = function ReviewerTable(props) { var additionalColumns = props.additionalColumns, canInviteMore = props.canInviteMore, className = props.className, manualSorting = props.manualSorting, onChange = props.onChange, onInvite = props.onInvite, onRemoveRow = props.onRemoveRow, onRevokeInvitation = props.onRevokeInvitation, reviewers = props.reviewers, showEmails = props.showEmails; var _useState = (0, _react.useState)({}), _useState2 = _slicedToArray(_useState, 2), tableSorter = _useState2[0], setTableSorter = _useState2[1]; (0, _react.useEffect)(function () { setTableSorter(manualSorting ? {} : tableSorter); }, [manualSorting]); if (reviewers.length === 0) { return /*#__PURE__*/_react["default"].createElement(Wrapper, { className: className }, /*#__PURE__*/_react["default"].createElement(EmptyMessage, null, "No reviewers have been added to the list")); } var handleChange = function handleChange(pagination, filters, sorter, extra) { onChange(extra.currentDataSource); setTableSorter(manualSorting ? {} : sorter); }; var onDragEnd = function onDragEnd(result) { var destination = result.destination, source = result.source; if (!destination) return; if (destination.droppableId === source.droppableId && destination.index === source.index) return; var newDataSource = _toConsumableArray(reviewers); var draggedElement = newDataSource.splice(source.index, 1); newDataSource.splice.apply(newDataSource, [destination.index, 0].concat(_toConsumableArray(draggedElement))); onChange(newDataSource); }; var columns = [].concat(_toConsumableArray(manualSorting ? [{ key: 'sort' }] : []), [{ title: 'Name', dataIndex: 'displayName', key: 'displayName', sorter: function sorter(a, b) { return a.displayName.toLowerCase().localeCompare(b.displayName.toLowerCase()); }, sortDirections: ['ascend', 'descend'] }, { title: '', dataIndex: 'inviteStatus', key: 'inviteStatus', render: function render(text, rowData) { return /*#__PURE__*/_react["default"].createElement(_InviteRowProp["default"], { className: className, data: rowData, type: "status" }); } }], _toConsumableArray(showEmails ? [{ title: 'Email', dataIndex: 'email', key: 'email', sorter: function sorter(a, b) { return a.email.toLowerCase().localeCompare(b.email.toLowerCase()); }, sortDirections: ['ascend', 'descend'] }] : []), _toConsumableArray(additionalColumns), [{ title: '', dataIndex: 'inviteAction', key: 'inviteAction', render: function render(text, rowData) { return /*#__PURE__*/_react["default"].createElement(_InviteRowProp["default"], { canInvite: canInviteMore, className: className, data: rowData, onClickInvite: onInvite, onClickRevokeInvitation: onRevokeInvitation, type: "action" }); }, align: 'right' }, { title: '', dataIndex: 'removeRow', key: 'removeRow', render: function render(text, rowData) { return /*#__PURE__*/_react["default"].createElement(_InviteRowProp["default"], { canInvite: canInviteMore, className: className, data: rowData, onClickRemove: onRemoveRow, type: "remove" }); } }]).map(function (col) { if (manualSorting) { var sorter = col.sorter, rest = _objectWithoutProperties(col, _excluded3); return _objectSpread(_objectSpread({}, rest), {}, { sortOrder: false }); } return _objectSpread(_objectSpread({}, col), {}, { sortOrder: tableSorter.columnKey === col.key && tableSorter.order }); }); var rows = reviewers.map(function (r) { return _objectSpread(_objectSpread({}, r), {}, { key: r.id }); }); return /*#__PURE__*/_react["default"].createElement(Wrapper, { className: className }, /*#__PURE__*/_react["default"].createElement(_reactBeautifulDnd.DragDropContext, { onDragEnd: onDragEnd }, /*#__PURE__*/_react["default"].createElement(StyledTable, { columns: columns, components: { body: { row: TableRow, wrapper: TableBody } }, dataSource: rows, key: "manual-sorting-".concat(manualSorting), onChange: handleChange, onRow: function onRow(record, index) { return { record: record, index: index, manualSorting: manualSorting }; }, pagination: false, rowKey: "id" }))); }; ReviewerTable.propTypes = { /** Column definitions of type `ColumnsType` from `antd/es/table` */ additionalColumns: _propTypes["default"].arrayOf(_propTypes["default"].shape({ title: _propTypes["default"].string.isRequired, dataIndex: _propTypes["default"].string.isRequired })), /** Whether more reviewers can be invited */ canInviteMore: _propTypes["default"].bool.isRequired, /** Enable drag and drop, but also disable auto-sorted columns */ manualSorting: _propTypes["default"].bool, /** Function to run when data is filtered/sorted */ onChange: _propTypes["default"].func.isRequired, /** Function to run when "invite" is clicked on a row from the pool */ onInvite: _propTypes["default"].func.isRequired, /** Function to run when the "X" button is clicked on a row from the pool */ onRemoveRow: _propTypes["default"].func.isRequired, /** Function to run when "revoke invitation" is clicked on a row from the pool */ onRevokeInvitation: _propTypes["default"].func.isRequired, /** List of reviewers */ reviewers: _propTypes["default"].arrayOf(_propTypes["default"].shape({ id: _propTypes["default"].string.isRequired, displayName: _propTypes["default"].string.isRequired, invited: _propTypes["default"].bool, acceptedInvitation: _propTypes["default"].bool, rejectedInvitation: _propTypes["default"].bool, invitationRevoked: _propTypes["default"].bool, reviewSubmitted: _propTypes["default"].bool })), /** Shorthand flag to indicate if the emails should be shown */ showEmails: _propTypes["default"].bool }; ReviewerTable.defaultProps = { additionalColumns: [], manualSorting: false, reviewers: [], showEmails: false }; var _default = ReviewerTable; exports["default"] = _default;