UNPKG

@vega/review-tool

Version:
294 lines (249 loc) 9.96 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; }; 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);