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:
@@ -49,7 +49,7 @@ class DraftListItem extends React.Component {
|
||||
let draft = this.props.draft;
|
||||
let filePath = draft.draft_file_path;
|
||||
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);
|
||||
}
|
||||
|
||||
|
@@ -52,6 +52,21 @@
|
||||
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) {
|
||||
.main .cur-view-container .cur-view-content-commenton {
|
||||
width: 20% !important;
|
||||
|
@@ -3,13 +3,14 @@ import ReactDOM from 'react-dom';
|
||||
/* eslint-disable */
|
||||
import Prism from 'prismjs';
|
||||
/* 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 axios from 'axios';
|
||||
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 'seafile-ui';
|
||||
import './assets/css/fa-solid.css';
|
||||
@@ -34,6 +35,8 @@ class DraftReview extends React.Component {
|
||||
isShowComments: false,
|
||||
inResizing: false,
|
||||
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() {
|
||||
this.getCommentsNumber();
|
||||
}
|
||||
|
||||
render() {
|
||||
const onResizeMove = this.state.inResizing ? this.onResizeMouseMove : null;
|
||||
const draftLink = siteRoot + 'lib/' + draftOriginRepoID + '/file' + draftFilePath;
|
||||
return(
|
||||
<div className="wrapper">
|
||||
<div id="header" className="header review">
|
||||
@@ -152,11 +168,23 @@ class DraftReview extends React.Component {
|
||||
<span className="fas fa-code-merge"></span>
|
||||
</div>
|
||||
<div className="info-item file-info">
|
||||
<React.Fragment>
|
||||
<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 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"
|
||||
id="commentsNumber" type="button" data-active="false"
|
||||
onMouseDown={this.toggleCommentList}>
|
||||
@@ -187,12 +215,19 @@ class DraftReview extends React.Component {
|
||||
onMouseMove={onResizeMove} onMouseUp={this.onResizeMouseUp} ref="comment">
|
||||
<div style={{width:(100-this.state.commentWidth)+'%'}}
|
||||
className={!this.state.isShowComments ? 'cur-view-content' : 'cur-view-content cur-view-content-commenton'} >
|
||||
<div className="markdown-viewer-render-content article">
|
||||
{this.state.isLoading ?
|
||||
<Loading /> :
|
||||
<div className="markdown-viewer-render-content article">
|
||||
<Loading />
|
||||
</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>
|
||||
{ this.state.isShowComments &&
|
||||
<div className="cur-view-right-part" style={{width:(this.state.commentWidth)+'%'}}>
|
||||
|
@@ -11,6 +11,9 @@ let domain = window.app.pageOptions.domain;
|
||||
let protocol = window.app.pageOptions.protocol;
|
||||
let mode = window.app.pageOptions.mode;
|
||||
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 = '/';
|
||||
|
||||
const serviceUrl = window.app.config.serviceUrl;
|
||||
@@ -179,6 +182,34 @@ class EditorUtilities {
|
||||
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}
|
||||
mode={mode}
|
||||
draftID={draftID}
|
||||
reviewID={reviewID}
|
||||
isDraft={isDraft}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
@@ -39,6 +39,7 @@ export const draftOriginFilePath = window.draftReview ? window.draftReview.confi
|
||||
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 publishFileVersion = window.draftReview ? window.draftReview.config.publishFileVersion : '';
|
||||
export const originFileVersion = window.draftReview ? window.draftReview.config.originFileVersion : '';
|
||||
|
@@ -5,6 +5,7 @@ from seaserv import seafile_api
|
||||
|
||||
from seahub.utils import normalize_file_path, check_filename_with_rename
|
||||
|
||||
|
||||
def create_user_draft_repo(username, org_id=-1):
|
||||
repo_name = 'Drafts'
|
||||
if org_id > 0:
|
||||
@@ -15,6 +16,7 @@ def create_user_draft_repo(username, org_id=-1):
|
||||
passwd=None)
|
||||
return repo_id
|
||||
|
||||
|
||||
def get_draft_file_name(repo_id, file_path):
|
||||
file_path = normalize_file_path(file_path)
|
||||
file_name, file_ext = os.path.splitext(os.path.basename(file_path))
|
||||
@@ -24,3 +26,24 @@ def get_draft_file_name(repo_id, file_path):
|
||||
new_file_name = check_filename_with_rename(repo_id, '/Drafts', draft_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
|
||||
|
@@ -36,6 +36,7 @@ def review(request, pk):
|
||||
draft_file_name = os.path.basename(d_r.draft_file_path)
|
||||
|
||||
return render(request, "draft_review.html", {
|
||||
"draft_id": d_r.draft_id_id,
|
||||
"review_id": pk,
|
||||
"draft_repo_id": d_r.origin_repo_id,
|
||||
"draft_origin_repo_id": d_r.origin_repo_id,
|
||||
|
@@ -27,6 +27,8 @@
|
||||
lang: '{{ language_code }}',
|
||||
mode: '{{ mode }}',
|
||||
draftID: '{{ draft_id }}',
|
||||
reviewID: '{{ review_id }}',
|
||||
isDraft: '{{ is_draft }}',
|
||||
},
|
||||
userInfo: {
|
||||
username: '{{ user.username }}',
|
||||
|
@@ -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.thumbnail.utils import extract_xmind_image, get_thumbnail_src, \
|
||||
XMIND_IMAGE_SIZE, THUMBNAIL_ROOT
|
||||
from seahub.drafts.utils import is_draft_file
|
||||
|
||||
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
|
||||
|
||||
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:
|
||||
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['mode'] = 'edit' if mode else 'viewer'
|
||||
return_dict['draft_id'] = draft_id
|
||||
return_dict['review_id'] = review_id
|
||||
return_dict['is_draft'] = is_draft
|
||||
else:
|
||||
return_dict['file_content'] = file_content
|
||||
|
||||
|
Reference in New Issue
Block a user