diff --git a/frontend/src/components/dialog/add-reviewer-dialog.js b/frontend/src/components/dialog/add-reviewer-dialog.js
index 703c60561e..e2a1359f4d 100644
--- a/frontend/src/components/dialog/add-reviewer-dialog.js
+++ b/frontend/src/components/dialog/add-reviewer-dialog.js
@@ -9,7 +9,8 @@ import '../../css/add-reviewer-dialog.css';
const propTypes = {
showReviewerDialog: PropTypes.bool.isRequired,
reviewID: PropTypes.string.isRequired,
- toggleAddReviewerDialog: PropTypes.func.isRequired
+ toggleAddReviewerDialog: PropTypes.func.isRequired,
+ reviewers: PropTypes.array.isRequired
};
class AddReviewerDialog extends React.Component {
@@ -17,14 +18,15 @@ class AddReviewerDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
- reviewers: [],
+ reviewers: this.props.reviewers,
selectedOption: null,
errorMsg: [],
+ loading: false,
};
this.Options = [];
}
- componentWillMount() {
+ listReviewers = () => {
seafileAPI.listReviewers(this.props.reviewID).then((res) => {
this.setState({
reviewers: res.data.reviewers
@@ -66,6 +68,10 @@ class AddReviewerDialog extends React.Component {
for (let i = 0; i < this.state.selectedOption.length; i ++) {
reviewers[i] = this.state.selectedOption[i].email;
}
+ this.setState({
+ loading: true,
+ errorMsg: [],
+ });
seafileAPI.addReviewers(this.props.reviewID, reviewers).then((res) => {
if (res.data.failed.length > 0) {
let errorMsg = [];
@@ -75,15 +81,10 @@ class AddReviewerDialog extends React.Component {
this.setState({
errorMsg: errorMsg
});
- let that = this;
- setTimeout(() => {
- that.setState({
- errorMsg: []
- });
- }, 3000);
}
this.setState({
- selectedOption: null
+ selectedOption: null,
+ loading: false
});
if (res.data.success.length > 0) {
this.listReviewers();
@@ -107,8 +108,8 @@ class AddReviewerDialog extends React.Component {
{this.state.errorMsg.length > 0 &&
this.state.errorMsg.map((item, index = 0, arr) => {
return (
-
{this.state.errorMsg[index].email}
- {':'}{this.state.errorMsg[index].error_msg}
+ {this.state.errorMsg[index].email}
+ {': '}{this.state.errorMsg[index].error_msg}
);
})
}
@@ -124,7 +125,11 @@ class AddReviewerDialog extends React.Component {
}
-
+ { this.state.loading ?
+
+ :
+
+ }
diff --git a/frontend/src/css/add-reviewer-dialog.css b/frontend/src/css/add-reviewer-dialog.css
index e2db4d2971..aca3e804b6 100644
--- a/frontend/src/css/add-reviewer-dialog.css
+++ b/frontend/src/css/add-reviewer-dialog.css
@@ -8,6 +8,9 @@
height: 2rem;
line-height: 2rem;
}
+.reviewer-select-error {
+ margin-top: 1em;
+}
.reviewer-select>div>div:nth-child(2) {
display: none;
-}
+}
\ No newline at end of file
diff --git a/frontend/src/css/draft-review.css b/frontend/src/css/draft-review.css
index d4fa945a9c..cb2edbe0b0 100644
--- a/frontend/src/css/draft-review.css
+++ b/frontend/src/css/draft-review.css
@@ -68,6 +68,50 @@
margin-right: 10px;
}
+.review-side-panel {
+ border-left: 1px solid #e6e6dd;
+ background-color: #fff;
+ height: 100%;
+}
+.review-side-panel-head {
+ border-bottom: 1px solid #e5e5e5;
+ line-height: 3em;
+ background-color: #fafaf9;
+ text-align: center;
+ font-weight: 700;
+}
+.review-side-panel-body {
+ padding: 1rem 2rem;
+}
+.review-side-panel-reviewers, .review-side-panel-author {
+ border-bottom: 1px solid #e6e6dd;
+ padding: 1em 0;
+}
+.reviewers-header, .author-header {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+}
+.reviewers-header i {
+ color: #c8c8c8;
+ font-size: 18px;
+}
+.reviewers-header i:hover {
+ cursor: pointer;
+ color: #a4a4a4;
+}
+.review-side-panel-header {
+ font-weight: bold;
+ color: #586069;
+}
+.reviewer-avatar, .author-avatar {
+ margin-right: 10px;
+}
+.reviewer-name, .author-name {
+ height: 2rem;
+ line-height: 2rem;
+}
+
@media (max-width: 992px) {
.main .cur-view-container .cur-view-content-commenton {
width: 20% !important;
diff --git a/frontend/src/draft-review.js b/frontend/src/draft-review.js
index 55ee920065..829c4bd898 100644
--- a/frontend/src/draft-review.js
+++ b/frontend/src/draft-review.js
@@ -10,7 +10,7 @@ import DiffViewer from '@seafile/seafile-editor/dist/viewer/diff-viewer';
import Loading from './components/loading';
import Toast from './components/toast';
import ReviewComments from './components/review-list-view/review-comments';
-import { Button, Tooltip } from 'reactstrap';
+import { Tooltip } from 'reactstrap';
import AddReviewerDialog from './components/dialog/add-reviewer-dialog.js';
import 'seafile-ui';
@@ -39,7 +39,10 @@ class DraftReview extends React.Component {
isShowDiff: true,
showDiffTip: false,
showReviewerDialog: false,
+ reviewers: [],
};
+ this.authorName = '';
+ this.authorAvatar = '';
}
componentDidMount() {
@@ -95,7 +98,7 @@ class DraftReview extends React.Component {
msg_s = msg_s.replace('%(reviewID)s', reviewID);
Toast.success(msg_s);
}).catch(() => {
- let msg_s = gettext('Failed to publish review %(reviewID)s.')
+ let msg_s = gettext('Failed to publish review %(reviewID)s.');
msg_s = msg_s.replace('%(reviewID)s', reviewID);
Toast.error(msg_s);
});
@@ -146,7 +149,7 @@ class DraftReview extends React.Component {
onSwitchShowDiff = () => {
this.setState({
isShowDiff: !this.state.isShowDiff,
- })
+ });
}
toggleDiffTip = () => {
@@ -161,8 +164,25 @@ class DraftReview extends React.Component {
});
}
+ getAuthorInfo = () => {
+ seafileAPI.getAccountInfo().then((res) => {
+ this.authorName = res.data.name;
+ this.authorAvatar = res.data.avatar_url;
+ });
+ }
+
+ listReviewers = () => {
+ seafileAPI.listReviewers(reviewID).then((res) => {
+ this.setState({
+ reviewers: res.data.reviewers
+ });
+ });
+ }
+
componentWillMount() {
this.getCommentsNumber();
+ this.getAuthorInfo();
+ this.listReviewers();
}
render() {
@@ -195,8 +215,6 @@ class DraftReview extends React.Component {
target="toggle-diff" toggle={this.toggleDiffTip}>
{gettext('View diff')}
-