@vega/review-tool
Version:
284 lines (253 loc) • 8.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _isEmpty2 = require('lodash/isEmpty');
var _isEmpty3 = _interopRequireDefault(_isEmpty2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _rxjs = require('rxjs');
var _operators = require('rxjs/operators');
var _dateFns = require('date-fns');
var _ReviewProcessList = require('./styles/ReviewProcessList.css');
var _ReviewProcessList2 = _interopRequireDefault(_ReviewProcessList);
var _reactPropsStream = require('react-props-stream');
var _user = require('part:@vega/datastores/user');
var _client = require('part:@lyra/base/client');
var _client2 = _interopRequireDefault(_client);
var _router = require('part:@vega/core/router');
var _ReviewProcess = require('./ReviewProcess');
var _ReviewProcess2 = _interopRequireDefault(_ReviewProcess);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const reviewItemQuery = userId => {
return `*[_type == "reviewItem" && reviewer._ref == "${userId}"][0]{...}`;
};
function loadProps() {
const reviewProcesses$ = _client2.default.observable.fetch(`*[_type == "reviewProcess" && !(_id in path('drafts.**'))]|order(_createdAt desc)[0..1000]{
...,
article->{_id,title},
"reviewItems": *[_type=="reviewItem" && !(_id in path('drafts.**')) && references(^._id)]
}`);
const reviewItem$ = _user.currentUser$.pipe((0, _operators.filter)(Boolean), (0, _operators.switchMap)(user => _client2.default.observable.fetch(reviewItemQuery(user._id))));
return (0, _rxjs.combineLatest)([_user.currentUser$, reviewProcesses$, reviewItem$]).pipe((0, _operators.map)(([user, reviewProcesses, reviewItem]) => {
return {
user,
reviewProcesses,
reviewItem: (0, _isEmpty3.default)(reviewItem) ? null : reviewItem
};
}));
}
function processStartTime(reviewProcess) {
return `${(0, _dateFns.distanceInWordsToNow)(new Date(reviewProcess._createdAt))} ago`;
}
/*:: type Props = {
user: any,
reviewProcesses: any,
reviewItem: any
}*/
class ReviewProcessList extends _react2.default.PureComponent /*:: <Props>*/ {
getCompletedProcesses() {
return this.props.reviewProcesses.filter(reviewProcess => !!reviewProcess.completedAt);
}
getOngoingProcesses() {
return this.props.reviewProcesses.filter(reviewProcess => !reviewProcess.completedAt);
}
render() {
var _props = this.props;
const user = _props.user,
reviewItem = _props.reviewItem;
const ongoingProcesses = this.getOngoingProcesses();
const completedProcesses = this.getCompletedProcesses();
return _react2.default.createElement(
'div',
{ className: _ReviewProcessList2.default.root },
reviewItem && _react2.default.createElement(_ReviewProcess2.default, { reviewProcessId: reviewItem.reviewProcess._ref }),
!reviewItem && _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'h2',
null,
'Reviews'
),
_react2.default.createElement(
'h4',
null,
'Hello, ',
user.name
),
_react2.default.createElement(
'table',
{ className: _ReviewProcessList2.default.reviewProcessTable },
_react2.default.createElement(
'tbody',
null,
_react2.default.createElement(
'caption',
null,
'Ongoing'
),
_react2.default.createElement(
'tr',
null,
_react2.default.createElement('th', null),
_react2.default.createElement(
'th',
null,
'Started'
),
_react2.default.createElement(
'th',
null,
'Invited'
),
_react2.default.createElement(
'th',
null,
'Accepted Reviews'
),
_react2.default.createElement(
'th',
null,
'Completed Reviews'
),
_react2.default.createElement('th', null)
),
ongoingProcesses.map(reviewProcess => {
const reviewItems = reviewProcess.reviewItems || [];
return _react2.default.createElement(
'tr',
{ key: reviewProcess.article._id },
_react2.default.createElement(
'td',
null,
reviewProcess.article.title
),
_react2.default.createElement(
'td',
null,
processStartTime(reviewProcess)
),
_react2.default.createElement(
'td',
null,
reviewItems.length
),
_react2.default.createElement(
'td',
null,
reviewItems.filter(item => item.acceptState === 'accepted').length
),
_react2.default.createElement(
'td',
null,
reviewItems.filter(item => item.completedAt).length
),
_react2.default.createElement(
'td',
null,
_react2.default.createElement(
_router.IntentLink,
{
intent: 'edit',
params: {
type: 'reviewProcess',
id: reviewProcess._id
}
},
'Open'
)
)
);
})
),
_react2.default.createElement(
'tbody',
null,
_react2.default.createElement(
'caption',
null,
'Completed'
),
_react2.default.createElement(
'tr',
null,
_react2.default.createElement('th', null),
_react2.default.createElement(
'th',
null,
'Completed'
),
_react2.default.createElement(
'th',
null,
'Invited'
),
_react2.default.createElement(
'th',
null,
'Final Decision'
),
_react2.default.createElement(
'th',
null,
'Completed Reviews'
),
_react2.default.createElement('th', null)
),
completedProcesses.map(reviewProcess => {
const reviewItems = reviewProcess.reviewItems || [];
return _react2.default.createElement(
'tr',
{ key: reviewProcess.article._id },
_react2.default.createElement(
'td',
null,
reviewProcess.article.title
),
_react2.default.createElement(
'td',
null,
(0, _dateFns.distanceInWordsToNow)(new Date(reviewProcess.completedAt)),
' ',
'ago'
),
_react2.default.createElement(
'td',
null,
reviewItems.length
),
_react2.default.createElement(
'td',
null,
reviewProcess.decision
),
_react2.default.createElement(
'td',
null,
reviewItems.filter(item => item.recommendation).length
),
_react2.default.createElement(
'td',
null,
_react2.default.createElement(
_router.IntentLink,
{
intent: 'edit',
params: {
type: 'reviewProcess',
id: reviewProcess._id
}
},
'Open'
)
)
);
})
)
)
)
);
}
}
exports.default = (0, _reactPropsStream.withPropsStream)(loadProps, ReviewProcessList);