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 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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)+'%'}}>
|
||||||
|
@@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -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 : '';
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
|
@@ -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 }}',
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user