@vega/review-tool
Version:
216 lines (184 loc) • 6.72 kB
JavaScript
;
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 */