1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-01 23:20:51 +00:00

Wiki bug repair (#2492)

This commit is contained in:
杨顺强
2018-11-01 18:40:18 +08:00
committed by Daniel Pan
parent 4cc735cf1f
commit c93e8aa603
10 changed files with 60 additions and 28 deletions

View File

@@ -22,6 +22,8 @@ const propTypes = {
onDirentItemCopy: PropTypes.func.isRequired, onDirentItemCopy: PropTypes.func.isRequired,
onItemDetails: PropTypes.func.isRequired, onItemDetails: PropTypes.func.isRequired,
updateViewList: PropTypes.func.isRequired, updateViewList: PropTypes.func.isRequired,
currentRepo: PropTypes.object,
isRepoOwner: PropTypes.bool,
}; };
class DirentListItem extends React.Component { class DirentListItem extends React.Component {
@@ -184,12 +186,12 @@ class DirentListItem extends React.Component {
} }
onRenameMenuItemClick = () => { onRenameMenuItemClick = () => {
this.props.onRenameMenuItemClick(this.props.dirent);
this.setState({ this.setState({
isOperationShow: false, isOperationShow: false,
isItemMenuShow: false, isItemMenuShow: false,
isRenameing: true, isRenameing: true,
}); });
this.props.onRenameMenuItemClick(this.props.dirent);
} }
onRenameConfirm = (newName) => { onRenameConfirm = (newName) => {
@@ -349,6 +351,8 @@ class DirentListItem extends React.Component {
dirent={this.props.dirent} dirent={this.props.dirent}
menuPosition={this.state.menuPosition} menuPosition={this.state.menuPosition}
onMenuItemClick={this.onItemMenuItemClick} onMenuItemClick={this.onItemMenuItemClick}
currentRepo={this.props.currentRepo}
isRepoOwner={this.props.isRepoOwner}
/> />
} }
</div> </div>

View File

@@ -20,6 +20,8 @@ const propTypes = {
onItemDetails: PropTypes.func.isRequired, onItemDetails: PropTypes.func.isRequired,
updateViewList: PropTypes.func.isRequired, updateViewList: PropTypes.func.isRequired,
isDirentListLoading: PropTypes.bool.isRequired, isDirentListLoading: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool,
currentRepo: PropTypes.object,
}; };
class DirentListView extends React.Component { class DirentListView extends React.Component {
@@ -159,6 +161,8 @@ class DirentListView extends React.Component {
key={index} key={index}
dirent={dirent} dirent={dirent}
filePath={this.props.filePath} filePath={this.props.filePath}
currentRepo={this.props.currentRepo}
isRepoOwner={this.props.isRepoOwner}
onItemClick={this.props.onItemClick} onItemClick={this.props.onItemClick}
onRenameMenuItemClick={this.onRenameMenuItemClick} onRenameMenuItemClick={this.onRenameMenuItemClick}
onItemDelete={this.props.onItemDelete} onItemDelete={this.props.onItemDelete}

View File

@@ -16,13 +16,14 @@ class DirentMenuItem extends React.Component {
} }
render() { render() {
let operationName = gettext(this.props.item); let operation = this.props.item;
let operationMessage = gettext(operation);
return ( return (
<Fragment> <Fragment>
{ {
operationName !== 'Divider' ? operation !== 'Divider' ?
<li className="dropdown-item operation-menu-item" data-type={operationName} onClick={this.onClick}> <li className="dropdown-item operation-menu-item" data-type={operation} onClick={this.onClick}>
<span className="user-select-none" data-type={operationName} title={operationName} aria-label={operationName}>{operationName}</span> <span className="user-select-none" data-type={operation} title={operationMessage} aria-label={operationMessage}>{operationMessage}</span>
</li> : </li> :
<li className="dropdown-divider"></li> <li className="dropdown-divider"></li>
} }

View File

@@ -1,14 +1,14 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { seafileAPI } from '../../utils/seafile-api'; import { isPro, enableFileComment, fileAuditEnabled, folderPermEnabled} from '../../utils/constants';
import { repoID, isPro, enableFileComment, fileAuditEnabled, folderPermEnabled} from '../../utils/constants';
import Repo from '../../models/repo';
import DirentMenuItem from './dirent-menu-item'; import DirentMenuItem from './dirent-menu-item';
const propTypes = { const propTypes = {
dirent: PropTypes.object.isRequired, dirent: PropTypes.object.isRequired,
menuPosition: PropTypes.object.isRequired, menuPosition: PropTypes.object.isRequired,
onMenuItemClick: PropTypes.func.isRequired, onMenuItemClick: PropTypes.func.isRequired,
currentRepo: PropTypes.object.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
}; };
class DirentMenu extends React.Component { class DirentMenu extends React.Component {
@@ -16,32 +16,25 @@ class DirentMenu extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
repo: null,
menuList: [], menuList: [],
}; };
this.is_repo_owner = false;
} }
componentDidMount() { componentDidMount() {
seafileAPI.getRepoInfo(repoID).then(res => { let repo = this.props.currentRepo;
let repo = new Repo(res.data); let menuList = this.calculateMenuList(repo);
seafileAPI.getAccountInfo().then(res => { this.setState({
let user_email = res.data.email; menuList: menuList
this.is_repo_owner = repo.owner_email === user_email;
let menuList = this.calculateMenuList(repo);
this.setState({
repo: repo,
menuList: menuList
});
});
}); });
} }
calculateMenuList(repoInfo) { calculateMenuList(repoInfo) {
let dirent = this.props.dirent; let dirent = this.props.dirent;
let isRepoOwner = this.props.isRepoOwner;
let type = dirent.type; let type = dirent.type;
let permission = dirent.permission; let permission = dirent.permission;
let can_set_folder_perm = folderPermEnabled && ((this.is_repo_owner && repoInfo.has_been_shared_out) || repoInfo.is_admin); let can_set_folder_perm = folderPermEnabled && ((isRepoOwner && repoInfo.has_been_shared_out) || repoInfo.is_admin);
if (type === 'dir' && permission === 'rw') { if (type === 'dir' && permission === 'rw') {
let menuList = []; let menuList = [];
if (can_set_folder_perm) { if (can_set_folder_perm) {

View File

@@ -18,6 +18,7 @@ class FileChooser extends React.Component {
super(props); super(props);
this.state = { this.state = {
hasRequest: false, hasRequest: false,
isCurrentRepoShow: true,
isOtherRepoShow: false, isOtherRepoShow: false,
repoList: [], repoList: [],
currentRepo: null, currentRepo: null,
@@ -62,6 +63,10 @@ class FileChooser extends React.Component {
} }
} }
onCurrentRepoToggle = () => [
this.setState({isCurrentRepoShow: !this.state.isCurrentRepoShow})
]
onDirentItemClick = (repo, filePath) => { onDirentItemClick = (repo, filePath) => {
this.props.onDirentItemClick(repo, filePath); this.props.onDirentItemClick(repo, filePath);
this.setState({ this.setState({
@@ -83,11 +88,11 @@ class FileChooser extends React.Component {
<div className="file-chooser-container"> <div className="file-chooser-container">
<div className="list-view"> <div className="list-view">
<div className="list-view-header"> <div className="list-view-header">
<span className="item-toggle fa fa-caret-down"></span> <span className={`item-toggle fa ${this.state.isCurrentRepoShow ? 'fa-caret-down' : 'fa-caret-right'}`} onClick={this.onCurrentRepoToggle}></span>
<span className="library">{gettext('Current Library')}</span> <span className="library">{gettext('Current Library')}</span>
</div> </div>
{ {
this.state.currentRepo && this.state.isCurrentRepoShow && this.state.currentRepo &&
<RepoListView <RepoListView
initToShowChildren={true} initToShowChildren={true}
repo={this.state.currentRepo} repo={this.state.currentRepo}

View File

@@ -78,6 +78,10 @@ class Node {
} }
} }
isFile() {
return this.type === 'file';
}
isDir() { isDir() {
return this.type == 'dir'; return this.type == 'dir';
} }

View File

@@ -27,11 +27,15 @@
} }
.detail-header .detail-title img{ .detail-header .detail-title img{
width: 1.5rem; width: 1.5rem;
height: 1.5rem; height: 1.5rem;
} }
.detail-header .detail-title .name { .detail-header .detail-title .name {
display: inline-block;
margin-left: 0.25rem;
line-height: 1.5rem;
vertical-align: middle;
font-size: 1rem; font-size: 1rem;
color: #322; color: #322;
} }

View File

@@ -2,6 +2,7 @@ import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { gettext, repoID, serviceUrl, slug, siteRoot } from '../../utils/constants'; import { gettext, repoID, serviceUrl, slug, siteRoot } from '../../utils/constants';
import { seafileAPI } from '../../utils/seafile-api'; import { seafileAPI } from '../../utils/seafile-api';
import Repo from '../../models/repo';
import Dirent from '../../models/dirent'; import Dirent from '../../models/dirent';
import CommonToolbar from '../../components/toolbar/common-toolbar'; import CommonToolbar from '../../components/toolbar/common-toolbar';
import PathToolbar from '../../components/toolbar/path-toolbar'; import PathToolbar from '../../components/toolbar/path-toolbar';
@@ -50,10 +51,23 @@ class MainPanel extends Component {
currentDirent: null, currentDirent: null,
currentFilePath: '', currentFilePath: '',
isDirentListLoading: true, isDirentListLoading: true,
currentRepo: null,
isRepoOwner: false,
}; };
} }
componentDidMount() { componentDidMount() {
seafileAPI.getRepoInfo(repoID).then(res => {
let repo = new Repo(res.data);
seafileAPI.getAccountInfo().then(res => {
let user_email = res.data.email;
let isRepoOwner = repo.owner_email === user_email;
this.setState({
currentRepo: repo,
isRepoOwner: isRepoOwner,
});
});
});
document.addEventListener('click', this.hideOperationMenu); document.addEventListener('click', this.hideOperationMenu);
} }
@@ -296,6 +310,8 @@ class MainPanel extends Component {
onItemDetails={this.onItemDetails} onItemDetails={this.onItemDetails}
updateViewList={this.updateViewList} updateViewList={this.updateViewList}
isDirentListLoading={this.state.isDirentListLoading} isDirentListLoading={this.state.isDirentListLoading}
currentRepo={this.state.currentRepo}
isRepoOwner={this.state.isRepoOwner}
/> />
} }
</div> </div>

View File

@@ -329,7 +329,7 @@ class Wiki extends Component {
onRenameNode = (node, newName) => { onRenameNode = (node, newName) => {
let tree = this.state.tree_data.clone(); let tree = this.state.tree_data.clone();
let filePath = node.path; let filePath = node.path;
if (node.isMarkdown()) { if (node.isFile()) {
editorUtilities.renameFile(filePath, newName).then(res => { editorUtilities.renameFile(filePath, newName).then(res => {
let cloneNode = node.clone(); let cloneNode = node.clone();

View File

@@ -933,7 +933,8 @@ a.op-icon:focus {
vertical-align: middle; vertical-align: middle;
} }
.operation-group-item i:hover { .operation-group-item i:hover {
text-decoration: underline; padding-bottom: 0.125rem;
border-bottom: 0.125rem solid #f89a68;
} }
.operation-group-item .sf-dropdown-toggle { .operation-group-item .sf-dropdown-toggle {
font-size: 0.85rem; font-size: 0.85rem;