+
+
+
{this.state.isLoading ?
@@ -240,31 +699,213 @@ class Draft extends React.Component {
}
-
-
-
-
- {this.renderNavItems()}
-
-
- review info
-
-
- comments
-
-
- history list
-
-
+
+
+
+ {this.renderNavItems()}
+
+
+
+
+
+
+ {(this.state.isShowDiff === true && this.state.changedNodes.length > 0) &&
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+ { this.state.showReviewerDialog &&
+
+
+
+ }
+ {this.state.isShowCommentDialog &&
+
+
+
+ }
);
}
}
+class SidePanelReviewers extends React.Component {
+
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ return (
+
+
{gettext('Reviewers')}
+
+
+ { this.props.reviewers.length > 0 ?
+ this.props.reviewers.map((item, index = 0, arr) => {
+ return (
+
+

+
{item.user_name}
+
+ );
+ })
+ :
+
{gettext('No reviewer yet.')}
+ }
+
+ );
+ }
+}
+
+const sidePanelReviewersPropTypes = {
+ reviewers: PropTypes.array.isRequired,
+ toggleAddReviewerDialog: PropTypes.func.isRequired
+};
+
+SidePanelReviewers.propTypes = sidePanelReviewersPropTypes;
+
+class SidePanelAuthor extends React.Component {
+ render() {
+ return (
+
+
{gettext('Author')}
+
+

+
{author}
+
+
+ );
+ }
+}
+
+class SidePanelOrigin extends React.Component {
+
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ return (
+
+
+
+ | |
+
+
+ {gettext('Location')} | {this.props.originRepoName}{draftOriginFilePath} |
+
+
+
+ );
+ }
+}
+
+const SidePanelOriginPropTypes = {
+ originRepoName: PropTypes.string.isRequired
+};
+
+SidePanelOrigin.propTypes = SidePanelOriginPropTypes;
+
+
+class UnresolvedComments extends React.Component {
+
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ return (
+
+
{gettext('Comments')}
+
+ {gettext('Unresolved comments:')}{' '}{this.props.number}
+
+
+ );
+ }
+}
+
+const UnresolvedCommentsPropTypes = {
+ number: PropTypes.number.isRequired
+};
+
+UnresolvedComments.propTypes = UnresolvedCommentsPropTypes;
+
+
+class SidePanelChanges extends React.Component {
+
+ constructor(props) {
+ super(props);
+ }
+
+ render() {
+ return (
+
+
{gettext('Changes')}
+
+
{gettext('Number of changes:')}{' '}{this.props.changedNumber}
+ { this.props.changedNumber > 0 &&
+
+ { this.props.scrollToChangedNode('down');}}>
+ { this.props.scrollToChangedNode('up');}}>
+
+ }
+
+
+ );
+ }
+}
+
+const sidePanelChangesPropTypes = {
+ changedNumber: PropTypes.number.isRequired,
+ scrollToChangedNode: PropTypes.func.isRequired
+};
+
+SidePanelChanges.propTypes = sidePanelChangesPropTypes;
+
+
ReactDOM.render (
,
document.getElementById('wrapper')
diff --git a/frontend/src/pages/review/history-list.js b/frontend/src/pages/review/history-list.js
index f36a38e0ea..eb147e33c6 100644
--- a/frontend/src/pages/review/history-list.js
+++ b/frontend/src/pages/review/history-list.js
@@ -21,9 +21,9 @@ class HistoryList extends React.Component {
};
}
- onClick = (event, key, preCommitID, currentCommitID)=> {
+ onClick = (event, key, preItem, currentItem)=> {
if (key === this.state.activeItem) return false;
- this.props.onHistoryItemClick(currentCommitID, preCommitID, key);
+ this.props.onHistoryItemClick(currentItem, preItem, key);
}
onScroll = (event) => {
@@ -51,7 +51,7 @@ class HistoryList extends React.Component {
render() {
return (
-
+
{
this.props.historyList ?
@@ -65,11 +65,11 @@ class HistoryList extends React.Component {
onClick={this.onClick}
ctime={item.ctime}
className={this.props.activeItem === index ? 'item-active': ''}
- currentCommitId={item.commit_id}
name={item.creator_name}
index={index}
key={index}
- preCommitId={arr[preItemIndex].commit_id}
+ preItem={arr[preItemIndex]}
+ currentItem={item}
/>
);
}) :
@@ -88,7 +88,7 @@ class HistoryItem extends React.Component {
render() {
let time = moment.parseZone(this.props.ctime).format('YYYY-MM-DD HH:mm');
return (
- - this.props.onClick(event, this.props.index, this.props.preCommitId, this.props.currentCommitId)} className={'history-list-item ' + this.props.className}>
+
- this.props.onClick(event, this.props.index, this.props.preItem, this.props.currentItem)} className={'history-list-item ' + this.props.className}>
{time}
{this.props.name}
diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js
index 4c3500f183..2bded33e07 100644
--- a/frontend/src/utils/constants.js
+++ b/frontend/src/utils/constants.js
@@ -61,20 +61,14 @@ export const filePath = window.fileHistory ? window.fileHistory.pageOptions.file
export const fileName = window.fileHistory ? window.fileHistory.pageOptions.fileName : '';
// Draft review
-export const draftFilePath = window.draftReview ? window.draftReview.config.draftFilePath: '';
-export const draftOriginFilePath = window.draftReview ? window.draftReview.config.draftOriginFilePath: '';
-export const draftOriginRepoID = window.draftReview ? window.draftReview.config.draftOriginRepoID: '';
-export const draftFileName = window.draftReview ? window.draftReview.config.draftFileName: '';
-export const reviewID = window.draftReview ? window.draftReview.config.reviewID : '';
-export const draftID = window.draftReview ? window.draftReview.config.draftID : '';
-export const opStatus = window.draftReview ? window.draftReview.config.opStatus : '';
-export const reviewPerm = window.draftReview ? window.draftReview.config.perm : '';
-export const publishFileVersion = window.draftReview ? window.draftReview.config.publishFileVersion : '';
-export const originFileVersion = window.draftReview ? window.draftReview.config.originFileVersion : '';
-export const author = window.draftReview ? window.draftReview.config.author : '';
-export const authorAvatar = window.draftReview ? window.draftReview.config.authorAvatar : '';
-export const originFileExists = window.draftReview ? window.draftReview.config.originFileExists : '';
-export const draftFileExists = window.draftReview ? window.draftReview.config.draftFileExists : '';
+export const draftFilePath = window.draft ? window.draft.config.draftFilePath: '';
+export const draftOriginFilePath = window.draft ? window.draft.config.draftOriginFilePath: '';
+export const draftFileName = window.draft ? window.draft.config.draftFileName: '';
+export const draftID = window.draft ? window.draft.config.draftID : '';
+export const draftRepoID = window.draft ? window.draft.config.draftRepoID : '';
+export const author = window.draft ? window.draft.config.author : '';
+export const authorAvatar = window.draft ? window.draft.config.authorAvatar : '';
+export const originFileExists = window.draft ? window.draft.config.originFileExists : '';
// org admin
export const orgID = window.org ? window.org.pageOptions.orgID : '';
diff --git a/seahub/api2/endpoints/draft_reviewer.py b/seahub/api2/endpoints/draft_reviewer.py
index e78bc56595..4d55701f68 100644
--- a/seahub/api2/endpoints/draft_reviewer.py
+++ b/seahub/api2/endpoints/draft_reviewer.py
@@ -16,6 +16,7 @@ from seahub.api2.utils import api_error, user_to_dict
from seahub.base.templatetags.seahub_tags import email2nickname
from seahub.base.accounts import User
+from seahub.tags.models import FileUUIDMap
from seahub.views import check_folder_permission
from seahub.utils import is_valid_username
from seahub.drafts.models import Draft, DraftReviewer
@@ -42,7 +43,7 @@ class DraftReviewerView(APIView):
# get reviewer list
reviewers = []
- for x in d.reviewreviewer_set.all():
+ for x in d.draftreviewer_set.all():
reviewer = user_to_dict(x.reviewer, request=request, avatar_size=avatar_size)
reviewers.append(reviewer)
@@ -88,7 +89,7 @@ class DraftReviewerView(APIView):
})
continue
- uuid = d.origin_file_uuid
+ uuid = FileUUIDMap.objects.get_fileuuidmap_by_uuid(d.origin_file_uuid)
origin_file_path = posixpath.join(uuid.parent_path, uuid.filename)
# check perm
if seafile_api.check_permission_by_path(d.origin_repo_id, origin_file_path, reviewer) != 'rw':