UNPKG

@vega/review-tool

Version:
216 lines (184 loc) 6.72 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _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; }; /* eslint-disable react/no-multi-comp */ var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _operators = require('rxjs/operators'); var _rxjs = require('rxjs'); var _dateFns = require('date-fns'); var _client = require('part:@lyra/base/client'); var _client2 = _interopRequireDefault(_client); var _reactPropsStream = require('react-props-stream'); var _preview = require('part:@lyra/base/preview'); var _router = require('part:@vega/core/router'); var _IntentButton = require('@vega/components/lib/views/IntentButton'); var _IntentButton2 = _interopRequireDefault(_IntentButton); var _RequireRole = require('@vega/components/RequireRole'); var _RequireRole2 = _interopRequireDefault(_RequireRole); var _ArticleReviewWidget = require('./styles/ArticleReviewWidget.css'); var _ArticleReviewWidget2 = _interopRequireDefault(_ArticleReviewWidget); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const dateFormat = 'MMMM Do, YYYY'; function fetchReviewProcesses(articleId) { return _client2.default.observable.fetch(`*[_type == "reviewProcess" && references("${articleId}") && !(_id in path('drafts.**'))]|order(_createdAt asc)[0..100]{ ..., "reviewItems": *[_type=="reviewItem" && !(_id in path('drafts.**')) && references(^._id)] }`); } function loadProps(props$) { return props$.pipe((0, _operators.switchMap)(props => (0, _rxjs.combineLatest)([(0, _preview.observePaths)(props.article, ['_id', 'title', 'track.trackStages']), fetchReviewProcesses(props.article._id)]).pipe((0, _operators.map)(([article, reviewProcesses]) => _extends({}, props, { article, reviewProcesses }))))); } function reviewLink(id, linkText) { return _react2.default.createElement( _router.IntentLink, { intent: 'edit', params: { type: 'reviewProcess', id: id } }, linkText ); } function reviewProcessesListItem(reviewProcess) { if (reviewProcess.completedAt) { return _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.reviewProcessesListItem }, _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.reviewProcessesListItemDate }, (0, _dateFns.format)(new Date(reviewProcess.completedAt), dateFormat), ':', ' ' ), _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.decision }, 'Decision: ', reviewProcess.decision ) ), _react2.default.createElement( 'div', null, reviewLink(reviewProcess._id, 'View') ) ); } const reviewItemCount = reviewProcess.reviewItems.length; const acceptCount = reviewProcess.reviewItems.filter(rvi => rvi.acceptState === 'accepted').length; const recommendationCount = reviewProcess.reviewItems.filter(rvi => rvi.recommendation).length; return _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.reviewProcessesListItem }, _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.reviewProcessesListItemDate }, (0, _dateFns.format)(new Date(reviewProcess._createdAt), dateFormat) ), _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.decision }, 'Review started' ) ), _react2.default.createElement( 'div', null, 'Invitations: ', reviewItemCount ), _react2.default.createElement( 'div', null, 'Accepted: ', acceptCount ), _react2.default.createElement( 'div', null, 'Done: ', recommendationCount ), _react2.default.createElement( 'div', null, reviewLink(reviewProcess._id, 'View') ) ); } function currentTrackStage(article) { return ((article.track || {}).trackStages || []).find(trackStage => { const trackStageId = trackStage.stage._id || trackStage.stage._ref; const stageId = article.stage._id || article.stage._ref; return trackStageId === stageId; }); } /*:: type Props = { article: any, reviewProcesses: any }*/ class ArticleReviewWidget extends _react2.default.Component /*:: <Props>*/ { render() { var _props = this.props; const reviewProcesses = _props.reviewProcesses, article = _props.article; if (!article) { return null; } const reviewEnabled = (currentTrackStage(article) || {}).isReviewEnabled; if (reviewProcesses && reviewProcesses.length < 1 && !reviewEnabled) { return _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.root }, 'No review history' ); } const hasOngoingReview = reviewProcesses.some(rvp => !rvp.completedAt); return _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.root }, reviewProcesses.length > 0 && _react2.default.createElement( 'ul', { className: _ArticleReviewWidget2.default.reviewProcesses }, reviewProcesses.map(rvp => _react2.default.createElement( 'li', { key: rvp._id, className: _ArticleReviewWidget2.default.reviewProcesses }, reviewProcessesListItem(rvp) )) ), _react2.default.createElement( _RequireRole2.default, { qualifyingRoleNames: ['admin', 'editor'], subject: article }, ({ hasRole }) => { return hasRole && _react2.default.createElement( 'div', { className: _ArticleReviewWidget2.default.createNewReview }, reviewEnabled && !hasOngoingReview && _react2.default.createElement( _IntentButton2.default, { intent: 'create', params: { type: 'reviewProcess', article: article._id }, color: 'primary' }, 'Create new review' ) ); } ) ); } } exports.default = (0, _reactPropsStream.withPropsStream)(loadProps, ArticleReviewWidget); /* eslint-enable react/no-multi-comp */