1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-12 13:24:52 +00:00

Update review (#2481)

This commit is contained in:
C_Q
2018-10-30 11:07:01 +08:00
committed by Daniel Pan
parent 6c221e341d
commit 87287c6f02
9 changed files with 126 additions and 12 deletions

View File

@@ -49,7 +49,7 @@ class DraftListItem extends React.Component {
let draft = this.props.draft; let draft = this.props.draft;
let filePath = draft.draft_file_path; let filePath = draft.draft_file_path;
let repoID = draft.origin_repo_id; let repoID = draft.origin_repo_id;
let url = siteRoot + 'lib/' + repoID + '/file' + filePath + '?mode=edit&draft_id=' + draft.id; let url = siteRoot + 'lib/' + repoID + '/file' + filePath + '?mode=edit';
window.open(url); window.open(url);
} }

View File

@@ -52,6 +52,21 @@
z-index: 1; z-index: 1;
} }
.cur-file-info .file-info {
display: block;
padding-top: 10px;
}
.file-info .draft-link {
font-size: .6em;
color: #1e1e1e;
text-decoration: underline;
display: block;
}
.seafile-toggle-diff {
display: flex;
margin-right: 10px;
}
@media (max-width: 992px) { @media (max-width: 992px) {
.main .cur-view-container .cur-view-content-commenton { .main .cur-view-container .cur-view-content-commenton {
width: 20% !important; width: 20% !important;

View File

@@ -3,13 +3,14 @@ import ReactDOM from 'react-dom';
/* eslint-disable */ /* eslint-disable */
import Prism from 'prismjs'; import Prism from 'prismjs';
/* eslint-enable */ /* eslint-enable */
import { siteRoot, gettext, reviewID, draftOriginFilePath, draftFilePath, draftOriginRepoID, draftFileName, opStatus, publishFileVersion, originFileVersion } from './utils/constants'; import { siteRoot, gettext, draftID, reviewID, draftOriginFilePath, draftFilePath, draftOriginRepoID, draftFileName, opStatus, publishFileVersion, originFileVersion } from './utils/constants';
import { seafileAPI } from './utils/seafile-api'; import { seafileAPI } from './utils/seafile-api';
import axios from 'axios'; import axios from 'axios';
import DiffViewer from '@seafile/seafile-editor/dist/viewer/diff-viewer'; import DiffViewer from '@seafile/seafile-editor/dist/viewer/diff-viewer';
import Loading from './components/loading'; import Loading from './components/loading';
import Toast from './components/toast'; import Toast from './components/toast';
import ReviewComments from './components/review-list-view/review-comments'; import ReviewComments from './components/review-list-view/review-comments';
import { Button, Tooltip } from 'reactstrap';
import 'seafile-ui'; import 'seafile-ui';
import './assets/css/fa-solid.css'; import './assets/css/fa-solid.css';
@@ -34,6 +35,8 @@ class DraftReview extends React.Component {
isShowComments: false, isShowComments: false,
inResizing: false, inResizing: false,
commentWidth: 30, commentWidth: 30,
isShowDiff: true,
showDiffTip: false,
}; };
} }
@@ -138,12 +141,25 @@ class DraftReview extends React.Component {
}); });
}; };
onSwitchShowDiff = () => {
this.setState({
isShowDiff: !this.state.isShowDiff,
})
}
toggleDiffTip = () => {
this.setState({
showDiffTip: !this.state.showDiffTip
});
}
componentWillMount() { componentWillMount() {
this.getCommentsNumber(); this.getCommentsNumber();
} }
render() { render() {
const onResizeMove = this.state.inResizing ? this.onResizeMouseMove : null; const onResizeMove = this.state.inResizing ? this.onResizeMouseMove : null;
const draftLink = siteRoot + 'lib/' + draftOriginRepoID + '/file' + draftFilePath;
return( return(
<div className="wrapper"> <div className="wrapper">
<div id="header" className="header review"> <div id="header" className="header review">
@@ -152,11 +168,23 @@ class DraftReview extends React.Component {
<span className="fas fa-code-merge"></span> <span className="fas fa-code-merge"></span>
</div> </div>
<div className="info-item file-info"> <div className="info-item file-info">
<span className="file-name">{draftFileName}</span> <React.Fragment>
<span className="file-copywriting">{gettext('review')}</span> <span className="file-name">{draftFileName}</span>
<span className="file-copywriting">{gettext('review')}</span>
</React.Fragment>
{ draftID !== 'None' && <a href={draftLink} className="draft-link">{gettext('View draft')}</a>}
</div> </div>
</div> </div>
<div className="button-group"> <div className="button-group">
<div className={'seafile-toggle-diff'}>
<label className="custom-switch" id="toggle-diff">
<input type="checkbox" name="option" className="custom-switch-input" onClick={this.onSwitchShowDiff}/>
<span className="custom-switch-indicator"></span>
</label>
<Tooltip placement="bottom" isOpen={this.state.showDiffTip}
target="toggle-diff" toggle={this.toggleDiffTip}>
{gettext('View diff')}</Tooltip>
</div>
<button className="btn btn-icon btn-secondary btn-active common-list-btn" <button className="btn btn-icon btn-secondary btn-active common-list-btn"
id="commentsNumber" type="button" data-active="false" id="commentsNumber" type="button" data-active="false"
onMouseDown={this.toggleCommentList}> onMouseDown={this.toggleCommentList}>
@@ -187,12 +215,19 @@ class DraftReview extends React.Component {
onMouseMove={onResizeMove} onMouseUp={this.onResizeMouseUp} ref="comment"> onMouseMove={onResizeMove} onMouseUp={this.onResizeMouseUp} ref="comment">
<div style={{width:(100-this.state.commentWidth)+'%'}} <div style={{width:(100-this.state.commentWidth)+'%'}}
className={!this.state.isShowComments ? 'cur-view-content' : 'cur-view-content cur-view-content-commenton'} > className={!this.state.isShowComments ? 'cur-view-content' : 'cur-view-content cur-view-content-commenton'} >
<div className="markdown-viewer-render-content article"> {this.state.isLoading ?
{this.state.isLoading ? <div className="markdown-viewer-render-content article">
<Loading /> : <Loading />
<DiffViewer markdownContent={this.state.draftContent} markdownContent1={this.state.draftOriginContent} /> </div>
} :
</div> <div className="markdown-viewer-render-content article">
{this.state.isShowDiff ?
<DiffViewer markdownContent={this.state.draftContent} markdownContent1={this.state.draftOriginContent} />
:
<DiffViewer markdownContent={this.state.draftContent} markdownContent1={this.state.draftContent} />
}
</div>
}
</div> </div>
{ this.state.isShowComments && { this.state.isShowComments &&
<div className="cur-view-right-part" style={{width:(this.state.commentWidth)+'%'}}> <div className="cur-view-right-part" style={{width:(this.state.commentWidth)+'%'}}>

View File

@@ -11,6 +11,9 @@ let domain = window.app.pageOptions.domain;
let protocol = window.app.pageOptions.protocol; let protocol = window.app.pageOptions.protocol;
let mode = window.app.pageOptions.mode; let mode = window.app.pageOptions.mode;
let draftID = window.app.pageOptions.draftID; let draftID = window.app.pageOptions.draftID;
let reviewID = window.app.pageOptions.reviewID;
let isDraft = window.app.pageOptions.isDraft;
let userName = window.app.userInfo.username;
let dirPath = '/'; let dirPath = '/';
const serviceUrl = window.app.config.serviceUrl; const serviceUrl = window.app.config.serviceUrl;
@@ -179,6 +182,34 @@ class EditorUtilities {
return url; return url;
}); });
} }
goReviewPage() {
window.location.href = serviceUrl + '/drafts/review/' + reviewID
}
getCommentsNumber() {
return seafileAPI.getCommentsNumber(this.repoID, this.dirPath);
}
postComment(comment) {
return seafileAPI.postComment(this.repoID, this.filePath, comment);
}
listComments() {
return seafileAPI.listComments(this.repoID, this.filePath);
}
updateComment(commentID, resolved, detail) {
return seafileAPI.updateComment(this.repoID, commentID, resolved, detail);
}
deleteComment(commentID) {
return seafileAPI.deleteComment(this.repoID, commentID);
}
getUserAvatar(size) {
return seafileAPI.getUserAvatar(userName, size);
}
} }
@@ -253,6 +284,8 @@ class MarkdownEditor extends React.Component {
showFileHistory={true} showFileHistory={true}
mode={mode} mode={mode}
draftID={draftID} draftID={draftID}
reviewID={reviewID}
isDraft={isDraft}
/> />
); );
} }

View File

@@ -39,6 +39,7 @@ export const draftOriginFilePath = window.draftReview ? window.draftReview.confi
export const draftOriginRepoID = window.draftReview ? window.draftReview.config.draftOriginRepoID: ''; export const draftOriginRepoID = window.draftReview ? window.draftReview.config.draftOriginRepoID: '';
export const draftFileName = window.draftReview ? window.draftReview.config.draftFileName: ''; export const draftFileName = window.draftReview ? window.draftReview.config.draftFileName: '';
export const reviewID = window.draftReview ? window.draftReview.config.reviewID : ''; 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 opStatus = window.draftReview ? window.draftReview.config.opStatus : '';
export const publishFileVersion = window.draftReview ? window.draftReview.config.publishFileVersion : ''; export const publishFileVersion = window.draftReview ? window.draftReview.config.publishFileVersion : '';
export const originFileVersion = window.draftReview ? window.draftReview.config.originFileVersion : ''; export const originFileVersion = window.draftReview ? window.draftReview.config.originFileVersion : '';

View File

@@ -5,6 +5,7 @@ from seaserv import seafile_api
from seahub.utils import normalize_file_path, check_filename_with_rename from seahub.utils import normalize_file_path, check_filename_with_rename
def create_user_draft_repo(username, org_id=-1): def create_user_draft_repo(username, org_id=-1):
repo_name = 'Drafts' repo_name = 'Drafts'
if org_id > 0: if org_id > 0:
@@ -15,6 +16,7 @@ def create_user_draft_repo(username, org_id=-1):
passwd=None) passwd=None)
return repo_id return repo_id
def get_draft_file_name(repo_id, file_path): def get_draft_file_name(repo_id, file_path):
file_path = normalize_file_path(file_path) file_path = normalize_file_path(file_path)
file_name, file_ext = os.path.splitext(os.path.basename(file_path)) file_name, file_ext = os.path.splitext(os.path.basename(file_path))
@@ -23,4 +25,25 @@ def get_draft_file_name(repo_id, file_path):
draft_file_name = "%s%s%s" % (file_name, '(draft)', file_ext) draft_file_name = "%s%s%s" % (file_name, '(draft)', file_ext)
new_file_name = check_filename_with_rename(repo_id, '/Drafts', draft_file_name) new_file_name = check_filename_with_rename(repo_id, '/Drafts', draft_file_name)
return new_file_name return new_file_name
def is_draft_file(repo_id, file_path):
is_draft = False
review_id = None
draft_id = None
file_path = normalize_file_path(file_path)
from .models import Draft
try:
draft = Draft.objects.get(origin_repo_id=repo_id, draft_file_path=file_path)
is_draft = True
draft_id = draft.id
if hasattr(draft, 'draftreview'):
review_id = draft.draftreview.id
except Draft.DoesNotExist:
pass
return is_draft, review_id, draft_id

View File

@@ -36,6 +36,7 @@ def review(request, pk):
draft_file_name = os.path.basename(d_r.draft_file_path) draft_file_name = os.path.basename(d_r.draft_file_path)
return render(request, "draft_review.html", { return render(request, "draft_review.html", {
"draft_id": d_r.draft_id_id,
"review_id": pk, "review_id": pk,
"draft_repo_id": d_r.origin_repo_id, "draft_repo_id": d_r.origin_repo_id,
"draft_origin_repo_id": d_r.origin_repo_id, "draft_origin_repo_id": d_r.origin_repo_id,

View File

@@ -27,6 +27,8 @@
lang: '{{ language_code }}', lang: '{{ language_code }}',
mode: '{{ mode }}', mode: '{{ mode }}',
draftID: '{{ draft_id }}', draftID: '{{ draft_id }}',
reviewID: '{{ review_id }}',
isDraft: '{{ is_draft }}',
}, },
userInfo: { userInfo: {
username: '{{ user.username }}', username: '{{ user.username }}',

View File

@@ -71,6 +71,7 @@ from seahub.utils.repo import is_repo_owner, parse_repo_perm
from seahub.group.utils import is_group_member from seahub.group.utils import is_group_member
from seahub.thumbnail.utils import extract_xmind_image, get_thumbnail_src, \ from seahub.thumbnail.utils import extract_xmind_image, get_thumbnail_src, \
XMIND_IMAGE_SIZE, THUMBNAIL_ROOT XMIND_IMAGE_SIZE, THUMBNAIL_ROOT
from seahub.drafts.utils import is_draft_file
from seahub.constants import HASH_URLS from seahub.constants import HASH_URLS
@@ -621,7 +622,8 @@ def view_lib_file(request, repo_id, path):
return_dict['file_encoding_list'] = file_encoding_list return_dict['file_encoding_list'] = file_encoding_list
mode = request.GET.get('mode', '') mode = request.GET.get('mode', '')
draft_id = request.GET.get('draft_id', '')
is_draft, review_id, draft_id = is_draft_file(repo.id, path)
if filetype == MARKDOWN: if filetype == MARKDOWN:
return_dict['protocol'] = request.is_secure() and 'https' or 'http' return_dict['protocol'] = request.is_secure() and 'https' or 'http'
@@ -632,6 +634,8 @@ def view_lib_file(request, repo_id, path):
return_dict['seafile_collab_server'] = SEAFILE_COLLAB_SERVER return_dict['seafile_collab_server'] = SEAFILE_COLLAB_SERVER
return_dict['mode'] = 'edit' if mode else 'viewer' return_dict['mode'] = 'edit' if mode else 'viewer'
return_dict['draft_id'] = draft_id return_dict['draft_id'] = draft_id
return_dict['review_id'] = review_id
return_dict['is_draft'] = is_draft
else: else:
return_dict['file_content'] = file_content return_dict['file_content'] = file_content