@coko/client
Version:
Client side common code for coko apps
171 lines (169 loc) • 12.5 kB
JavaScript
"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 _toolkit = require("../../toolkit");
var _SearchBox = _interopRequireDefault(require("./SearchBox"));
var _SuggestedReviewer = _interopRequireDefault(require("./SuggestedReviewer"));
var _common = require("../common");
var _ReviewerTable = _interopRequireDefault(require("./ReviewerTable"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
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 _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 _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([""])));
var Top = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: space-between;\n margin-bottom: ", ";\n\n label:last-of-type {\n margin-top: 0;\n }\n"])), (0, _toolkit.grid)(3));
var ItemWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral([""])));
var Head = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin-bottom: ", ";\n"])), (0, _toolkit.grid)(1));
var HeadSecondRow = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n align-items: center;\n display: flex;\n justify-content: space-between;\n margin: ", " ", ";\n\n > div > button:not(:last-child) {\n margin-right: ", ";\n }\n"])), (0, _toolkit.grid)(2), (0, _toolkit.grid)(4), (0, _toolkit.grid)(1));
var Search = (0, _styledComponents["default"])(_SearchBox["default"])(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n margin-bottom: ", ";\n"])), (0, _toolkit.grid)(1));
var StyledRibbon = (0, _styledComponents["default"])(_common.Ribbon)(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n margin-bottom: ", ";\n"])), (0, _toolkit.grid)(1));
var AssignReviewers = function AssignReviewers(props) {
var additionalReviewerColumns = props.additionalReviewerColumns,
additionalSearchFields = props.additionalSearchFields,
amountOfReviewers = props.amountOfReviewers,
automate = props.automate,
canInviteMore = props.canInviteMore,
className = props.className,
onAddReviewers = props.onAddReviewers,
onAmountOfReviewersChange = props.onAmountOfReviewersChange,
onAutomationChange = props.onAutomationChange,
onClickInvite = props.onClickInvite,
onClickRemoveRow = props.onClickRemoveRow,
onClickRevokeInvitation = props.onClickRevokeInvitation,
onSearch = props.onSearch,
onTableChange = props.onTableChange,
reviewerPool = props.reviewerPool,
searchPlaceholder = props.searchPlaceholder,
suggestedReviewerName = props.suggestedReviewerName,
useShowEmail = props.useShowEmail;
var _useState = (0, _react.useState)(false),
_useState2 = _slicedToArray(_useState, 2),
showEmails = _useState2[0],
setShowEmails = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = _slicedToArray(_useState3, 2),
manualSorting = _useState4[0],
setManualSorting = _useState4[1];
// Explainer text: Adding reviewers to the list won't send them an invite yet
return /*#__PURE__*/_react["default"].createElement(Wrapper, {
className: className
}, suggestedReviewerName && /*#__PURE__*/_react["default"].createElement(Top, null, /*#__PURE__*/_react["default"].createElement(ItemWrapper, null, suggestedReviewerName && /*#__PURE__*/_react["default"].createElement(_SuggestedReviewer["default"], {
name: suggestedReviewerName
}))), /*#__PURE__*/_react["default"].createElement(Search, {
additionalSearchFields: additionalSearchFields,
onAdd: onAddReviewers,
onSearch: onSearch,
searchPlaceholder: searchPlaceholder
}), /*#__PURE__*/_react["default"].createElement(Head, null, /*#__PURE__*/_react["default"].createElement(StyledRibbon, {
status: automate ? 'success' : null
}, "Automation is ", automate ? 'on' : 'off'), /*#__PURE__*/_react["default"].createElement(HeadSecondRow, null, /*#__PURE__*/_react["default"].createElement(ItemWrapper, null, /*#__PURE__*/_react["default"].createElement(_common.Switch, {
checked: automate,
disabled: !manualSorting,
label: "Automate invites",
labelPosition: "left",
onChange: onAutomationChange
})), /*#__PURE__*/_react["default"].createElement(ItemWrapper, null, /*#__PURE__*/_react["default"].createElement(_common.Switch, {
checked: manualSorting,
label: "Sort reviewers manually",
labelPosition: "left",
onChange: setManualSorting
})), useShowEmail && /*#__PURE__*/_react["default"].createElement(ItemWrapper, null, /*#__PURE__*/_react["default"].createElement(_common.Switch, {
checked: showEmails,
label: "Show reviewer emails",
labelPosition: "left",
onChange: function onChange() {
return setShowEmails(!showEmails);
}
})), /*#__PURE__*/_react["default"].createElement(_common.InputNumber, {
disabled: automate,
label: "Maximum reviewers from pool",
min: 1,
onChange: onAmountOfReviewersChange,
value: amountOfReviewers
}))), /*#__PURE__*/_react["default"].createElement(_ReviewerTable["default"], {
additionalColumns: additionalReviewerColumns,
canInviteMore: canInviteMore,
manualSorting: manualSorting,
onChange: onTableChange,
onInvite: onClickInvite,
onRemoveRow: onClickRemoveRow,
onRevokeInvitation: onClickRevokeInvitation,
reviewers: reviewerPool,
showEmails: showEmails
}));
};
AssignReviewers.propTypes = {
/** Additional column definitions of type `ColumnsType` from `antd/es/table` */
additionalReviewerColumns: _propTypes["default"].arrayOf(_propTypes["default"].shape({
title: _propTypes["default"].string.isRequired,
dataIndex: _propTypes["default"].string.isRequired
})),
/** Additional search fields definitions to display on search */
additionalSearchFields: _propTypes["default"].arrayOf(_propTypes["default"].shape({
label: _propTypes["default"].string.isRequired,
value: _propTypes["default"].string.isRequired,
items: _propTypes["default"].arrayOf(_propTypes["default"].string)
})),
/** Maximum amount of reviewers that can be invited at the same time */
amountOfReviewers: _propTypes["default"].number.isRequired,
/** Whether reviewer invitation automation is on for this manuscript version */
automate: _propTypes["default"].bool.isRequired,
/** Whether more reviewers can be invited */
canInviteMore: _propTypes["default"].bool.isRequired,
/** Function to run on selecting a reviewer in the search box */
onAddReviewers: _propTypes["default"].func.isRequired,
/** Handle change in amount of reviewers input */
onAmountOfReviewersChange: _propTypes["default"].func.isRequired,
/** Function to run when "Automate invites" is toggled */
onAutomationChange: _propTypes["default"].func.isRequired,
/** Function to run when "invite" is clicked on a row from the pool */
onClickInvite: _propTypes["default"].func.isRequired,
/** Function to run when the "X" button is clicked on a row from the pool */
onClickRemoveRow: _propTypes["default"].func.isRequired,
/** Function to run when "revoke invitation" is clicked on a row from the pool */
onClickRevokeInvitation: _propTypes["default"].func.isRequired,
/** Function that returns a promise. Must resolve to an array objects, each with shape `{ value: <String>, label: <String>, isDisabled: <Boolean>, status: <String>}` */
onSearch: _propTypes["default"].func.isRequired,
/** Function to run when data is filtered/sorted */
onTableChange: _propTypes["default"].func.isRequired,
/** Reviewers added to the pool list. Shape defined in ReviewerRow */
reviewerPool: _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
})),
/** Placeholder for the search bar */
searchPlaceholder: _propTypes["default"].string,
/** Display name of suggested reviewer */
suggestedReviewerName: _propTypes["default"].string,
/** Whether to display the option to show `Show reviewer emails` checkbox.
* Alternatively, the email renders can be customised using `additionalReviewerColumns` */
useShowEmail: _propTypes["default"].bool
};
AssignReviewers.defaultProps = {
additionalReviewerColumns: [],
additionalSearchFields: [],
reviewerPool: [],
searchPlaceholder: undefined,
suggestedReviewerName: null,
useShowEmail: false
};
var _default = AssignReviewers;
exports["default"] = _default;