mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 07:27:04 +00:00
Wiki bug repair (#2492)
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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}
|
||||||
|
@@ -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>
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
|
||||||
seafileAPI.getAccountInfo().then(res => {
|
|
||||||
let user_email = res.data.email;
|
|
||||||
this.is_repo_owner = repo.owner_email === user_email;
|
|
||||||
let menuList = this.calculateMenuList(repo);
|
let menuList = this.calculateMenuList(repo);
|
||||||
this.setState({
|
this.setState({
|
||||||
repo: repo,
|
|
||||||
menuList: menuList
|
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) {
|
||||||
|
@@ -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}
|
||||||
|
@@ -78,6 +78,10 @@ class Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isFile() {
|
||||||
|
return this.type === 'file';
|
||||||
|
}
|
||||||
|
|
||||||
isDir() {
|
isDir() {
|
||||||
return this.type == 'dir';
|
return this.type == 'dir';
|
||||||
}
|
}
|
||||||
|
@@ -32,6 +32,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.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;
|
||||||
}
|
}
|
||||||
|
@@ -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>
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user