@vega/review-tool
Version:
294 lines (249 loc) • 9.96 kB
JavaScript
'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; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _operators = require('rxjs/operators');
var _rxjs = require('rxjs');
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 _ManageReviewItem = require('./ManageReviewItem');
var _ManageReviewItem2 = _interopRequireDefault(_ManageReviewItem);
var _ManageReviewProcess = require('./styles/ManageReviewProcess.css');
var _ManageReviewProcess2 = _interopRequireDefault(_ManageReviewProcess);
var _default = require('part:@lyra/components/buttons/default');
var _default2 = _interopRequireDefault(_default);
var _default3 = require('part:@lyra/components/fieldsets/default');
var _default4 = _interopRequireDefault(_default3);
var _schema = require('part:@lyra/base/schema');
var _schema2 = _interopRequireDefault(_schema);
var _formBuilder = require('part:@lyra/form-builder');
var _Field = require('../Field');
var _Field2 = _interopRequireDefault(_Field);
var _AddReviewItemDialog = require('./AddReviewItemDialog');
var _AddReviewItemDialog2 = _interopRequireDefault(_AddReviewItemDialog);
var _observableWithQuery = require('../../util/observableWithQuery');
var _observableWithQuery2 = _interopRequireDefault(_observableWithQuery);
var _spinner = require('part:@lyra/components/loading/spinner');
var _spinner2 = _interopRequireDefault(_spinner);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const noop = () => {};
const humanReadableDecission = {
reject: 'Reject',
publish: 'Publish',
'publish-with-revisions': 'Publish with revisions'
};
function listenReviewItems(reviewProcessId) {
const query = `*[_type == "reviewItem" && reviewProcess._ref == "${reviewProcessId}" && !(_id in path('drafts.**'))]
|order(_createdAt asc)
[0..100]
{...,reviewer->{_id,name}}`;
return (0, _observableWithQuery2.default)(query);
}
function loadProps(props$) {
return props$.pipe((0, _operators.switchMap)(props => (0, _rxjs.combineLatest)([(0, _preview.observePaths)(props.reviewProcess, ['_id', 'completedAt', 'decision']), listenReviewItems(props.reviewProcess._id)]).pipe((0, _operators.map)(([reviewProcess, reviewItems]) => _extends({}, props, {
reviewProcess,
reviewItems
})))));
}
/*:: type Props = {
reviewProcess: any,
reviewItems: any
}*/
class ManageReviewProcess extends _react2.default.PureComponent /*:: <Props, *>*/ {
constructor(...args) {
var _temp;
return _temp = super(...args), this.state = {
isAddingFinalDecision: false,
isAddingReviewer: false,
readOnly: false,
loading: false
}, this.handleAddReviewerClick = () => {
this.setState({ isAddingReviewer: true });
}, this.handleAddReviewerDialogClose = event => {
this.setState({ isAddingReviewer: false });
}, this.handleProceedToggle = () => {
const isAddingFinalDecision = this.state.isAddingFinalDecision;
this.setState({ isAddingFinalDecision: !isAddingFinalDecision });
}, this.handleToggleReadOnly = event => {
this.setState({ readOnly: event.target.checked });
}, this.handleSubmit = () => {
if (
// eslint-disable-next-line no-alert
window.confirm('Submit will conclude this review process. There is no undoing this. Go ahead?')) {
this.setState({
loading: true
});
_client2.default.patch(this.props.reviewProcess._id).set({ completedAt: new Date().toISOString() }).commit().then(this.setState({
isAddingFinalDecision: false,
readOnly: true,
loading: false
}));
}
}, this.handleFocus = nextFocusPath => {
this.setState({ focusPath: nextFocusPath });
}, _temp;
}
render() {
var _props = this.props;
const reviewProcess = _props.reviewProcess,
reviewItems = _props.reviewItems;
const completedAt = reviewProcess.completedAt,
decision = reviewProcess.decision;
const loading = this.state.loading;
// Check if review is comleted
const isCompleted = !!completedAt && decision;
var _state = this.state;
const readOnly = _state.readOnly,
isAddingReviewer = _state.isAddingReviewer,
isAddingFinalDecision = _state.isAddingFinalDecision,
focusPath = _state.focusPath;
return _react2.default.createElement(
'div',
{ className: _ManageReviewProcess2.default.root },
isAddingReviewer && _react2.default.createElement(_AddReviewItemDialog2.default, {
onClose: this.handleAddReviewerDialogClose,
reviewProcess: reviewProcess
}),
_react2.default.createElement(
'div',
{ className: _ManageReviewProcess2.default.header },
_react2.default.createElement(
'h2',
null,
'Reviews'
),
isCompleted && _react2.default.createElement(
'div',
{ className: _ManageReviewProcess2.default[`decision_${decision}`] },
'Decision:',
_react2.default.createElement(
'h3',
{ className: _ManageReviewProcess2.default.status },
humanReadableDecission[decision] || decision
)
)
),
_react2.default.createElement(
'ul',
null,
reviewItems.map(reviewItem => _react2.default.createElement(_ManageReviewItem2.default, {
key: reviewItem._id,
reviewItem: reviewItem,
readOnly: readOnly,
isCompleted: isCompleted
}))
),
!readOnly && !isCompleted && _react2.default.createElement(
'div',
null,
_react2.default.createElement(
_default2.default,
{ onClick: this.handleAddReviewerClick },
'+ Invite reviewer'
),
isAddingFinalDecision && _react2.default.createElement(
'div',
null,
_react2.default.createElement(
_formBuilder.WithFormBuilderValue,
{
documentId: reviewProcess._id,
typeName: 'reviewProcess',
schema: _schema2.default
},
props => props.isLoading ? _react2.default.createElement(_spinner2.default, { message: 'Loading\u2026' }) : _react2.default.createElement(
'form',
{ onSubmit: this.handleProceedToggle },
_react2.default.createElement(
_default4.default,
null,
loading && _react2.default.createElement(_spinner2.default, { message: 'Sending final decision' }),
_react2.default.createElement(_Field2.default, {
fieldName: 'content',
type: props.type,
value: props.value,
onChange: props.onChange,
onFocus: this.handleFocus,
onBlur: noop,
focusPath: focusPath
}),
_react2.default.createElement('br', null),
_react2.default.createElement(_Field2.default, {
fieldName: 'decision',
type: props.type,
value: props.value,
onChange: props.onChange,
onFocus: this.handleFocus,
onBlur: noop,
focusPath: focusPath
}),
_react2.default.createElement('br', null),
_react2.default.createElement(
_default2.default,
{ color: 'primary', onClick: this.handleSubmit },
'Submit'
),
_react2.default.createElement(
_default2.default,
{ onClick: this.handleProceedToggle },
'Cancel'
)
)
)
)
),
!isAddingFinalDecision && _react2.default.createElement(
'div',
{ className: _ManageReviewProcess2.default.finalDecision },
_react2.default.createElement(
_default2.default,
{
onClick: this.handleProceedToggle,
color: 'primary',
loading: loading
},
'Proceed to final decision'
)
)
),
isCompleted && _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'div',
{ className: _ManageReviewProcess2.default.finalDecisionCompleted },
_react2.default.createElement(
'h2',
null,
'Final decision made: ',
humanReadableDecission[decision]
)
),
_react2.default.createElement(
_formBuilder.WithFormBuilderValue,
{
documentId: reviewProcess._id,
typeName: 'reviewProcess',
schema: _schema2.default
},
props => props.isLoading ? _react2.default.createElement(_spinner2.default, { message: 'Loading\u2026' }) : _react2.default.createElement(_Field2.default, {
fieldName: 'content',
type: props.type,
value: props.value,
onChange: props.onChange,
onFocus: this.handleFocus,
onBlur: noop,
readOnly: true,
focusPath: focusPath
})
)
)
);
}
}
exports.default = (0, _reactPropsStream.withPropsStream)(loadProps, ManageReviewProcess);