1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-02 23:48:47 +00:00

add enable_wiki

This commit is contained in:
wangjianhui
2018-12-10 13:33:32 +08:00
committed by shanshuirenjia
parent 0de207a3b3
commit 7246dad55d
12 changed files with 114 additions and 102 deletions

View File

@@ -39,7 +39,7 @@ const ShareAdminLibrariesWrapper = MainContentWrapper(ShareAdminLibraries);
const ShareAdminFoldersWrapper = MainContentWrapper(ShareAdminFolders); const ShareAdminFoldersWrapper = MainContentWrapper(ShareAdminFolders);
const ShareAdminShareLinksWrapper = MainContentWrapper(ShareAdminShareLinks); const ShareAdminShareLinksWrapper = MainContentWrapper(ShareAdminShareLinks);
const ShareAdminUploadLinksWrapper = MainContentWrapper(ShareAdminUploadLinks); const ShareAdminUploadLinksWrapper = MainContentWrapper(ShareAdminUploadLinks);
const Wikiswrapper = MainContentWrapper(Wikis); const WikisWrapper = MainContentWrapper(Wikis);
class App extends Component { class App extends Component {
@@ -144,7 +144,7 @@ class App extends Component {
<DirView path={siteRoot + 'library/:repoID/*'} onMenuClick={this.onShowSidePanel} updateCurrentTab={this.updateCurrentTab}/> <DirView path={siteRoot + 'library/:repoID/*'} onMenuClick={this.onShowSidePanel} updateCurrentTab={this.updateCurrentTab}/>
<Groups path={siteRoot + 'groups'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/> <Groups path={siteRoot + 'groups'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
<Group path={siteRoot + 'group/:groupID'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/> <Group path={siteRoot + 'group/:groupID'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
<Wikiswrapper path={siteRoot + 'wikis'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/> <WikisWrapper path={siteRoot + 'wikis'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
</Router> </Router>
</MainPanel> </MainPanel>
</div> </div>

View File

@@ -8,7 +8,7 @@ const propTypes = {
addWiki: PropTypes.func.isRequired, addWiki: PropTypes.func.isRequired,
}; };
class WikiDelete extends React.Component { class NewWikiDialog extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@@ -64,6 +64,6 @@ class WikiDelete extends React.Component {
} }
} }
WikiDelete.propTypes = propTypes; NewWikiDialog.propTypes = propTypes;
export default WikiDelete; export default NewWikiDialog;

View File

@@ -8,7 +8,7 @@ const propTypes = {
handleSubmit: PropTypes.func.isRequired, handleSubmit: PropTypes.func.isRequired,
}; };
class WikiDelete extends React.Component { class WikiDeleteDialog extends React.Component {
toggle = () => { toggle = () => {
this.props.toggleCancel(); this.props.toggleCancel();
@@ -30,6 +30,6 @@ class WikiDelete extends React.Component {
} }
} }
WikiDelete.propTypes = propTypes; WikiDeleteDialog.propTypes = propTypes;
export default WikiDelete; export default WikiDeleteDialog;

View File

@@ -10,7 +10,7 @@ const propTypes = {
addWiki: PropTypes.func.isRequired, addWiki: PropTypes.func.isRequired,
}; };
class WikiSelect extends React.Component { class WikiSelectDialog extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
@@ -84,6 +84,6 @@ class WikiSelect extends React.Component {
} }
} }
WikiSelect.propTypes = propTypes; WikiSelectDialog.propTypes = propTypes;
export default WikiSelect; export default WikiSelectDialog;

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Link } from '@reach/router'; import { Link } from '@reach/router';
import { gettext, siteRoot } from '../utils/constants'; import { gettext, siteRoot, enableWiki } from '../utils/constants';
import { seafileAPI } from '../utils/seafile-api'; import { seafileAPI } from '../utils/seafile-api';
import { Badge } from 'reactstrap'; import { Badge } from 'reactstrap';
@@ -170,12 +170,14 @@ class MainSideNav extends React.Component {
<span className="nav-text">{gettext('Acitivities')}</span> <span className="nav-text">{gettext('Acitivities')}</span>
</Link> </Link>
</li> </li>
<li className='nav-item'> {enableWiki &&
<li className="nav-item">
<Link className={`nav-link ellipsis ${this.getActiveClass('wikis')}`} to={siteRoot + 'wikis/'} title={gettext('Wikis')} onClick={() => this.tabItemClick('wikis')}> <Link className={`nav-link ellipsis ${this.getActiveClass('wikis')}`} to={siteRoot + 'wikis/'} title={gettext('Wikis')} onClick={() => this.tabItemClick('wikis')}>
<span className="sf2-icon-wiki-view" aria-hidden="true"></span> <span className="sf2-icon-wiki-view" aria-hidden="true"></span>
{gettext('Wikis')} {gettext('Wikis')}
</Link> </Link>
</li> </li>
}
<li className="nav-item"> <li className="nav-item">
<Link className={`nav-link ellipsis ${this.getActiveClass('linked-devices')}`} to={siteRoot + 'linked-devices/'} title={gettext('Linked Devices')} onClick={() => this.tabItemClick('linked-devices')}> <Link className={`nav-link ellipsis ${this.getActiveClass('linked-devices')}`} to={siteRoot + 'linked-devices/'} title={gettext('Linked Devices')} onClick={() => this.tabItemClick('linked-devices')}>
<span className="sf2-icon-monitor" aria-hidden="true"></span> <span className="sf2-icon-monitor" aria-hidden="true"></span>

View File

@@ -4,7 +4,7 @@ import { gettext } from '../../utils/constants';
const propTypes = { const propTypes = {
isShowWikiAdd: PropTypes.bool.isRequired, isShowWikiAdd: PropTypes.bool.isRequired,
addPosition: PropTypes.object.isRequired, position: PropTypes.object.isRequired,
onSelectToggle: PropTypes.func.isRequired, onSelectToggle: PropTypes.func.isRequired,
onCreateToggle: PropTypes.func.isRequired, onCreateToggle: PropTypes.func.isRequired,
}; };
@@ -13,9 +13,9 @@ class WikiAdd extends React.Component {
render() { render() {
let style = {}; let style = {};
let {isShowWikiAdd, addPosition} = this.props; let {isShowWikiAdd, position} = this.props;
if (isShowWikiAdd) { if (isShowWikiAdd) {
style = {position: 'fixed', top: addPosition.top, left: addPosition.left, display: 'block'}; style = {position: 'fixed', top: position.top, left: position.left, display: 'block'};
} }
return ( return (
<ul className="dropdown-menu" style={style}> <ul className="dropdown-menu" style={style}>

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { gettext } from '../../utils/constants'; import { gettext } from '../../utils/constants';
const propTypes = { const propTypes = {
menuPosition: PropTypes.object.isRequired, position: PropTypes.object.isRequired,
onRenameToggle: PropTypes.func.isRequired, onRenameToggle: PropTypes.func.isRequired,
onDeleteToggle: PropTypes.func.isRequired, onDeleteToggle: PropTypes.func.isRequired,
}; };
@@ -11,8 +11,8 @@ const propTypes = {
class WikiMenu extends React.Component { class WikiMenu extends React.Component {
render() { render() {
let menuPosition = this.props.menuPosition; let position = this.props.position;
let style = {position: 'fixed', top: menuPosition.top, left: menuPosition.left, display: 'block'}; let style = {position: 'fixed', top: position.top, left: position.left, display: 'block'};
return ( return (
<ul className="dropdown-menu" style={style}> <ul className="dropdown-menu" style={style}>

View File

@@ -1,4 +1,4 @@
import React, { Component } from 'react'; import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { seafileAPI } from '../../utils/seafile-api'; import { seafileAPI } from '../../utils/seafile-api';
import { gettext, siteRoot, loginUrl } from '../../utils/constants'; import { gettext, siteRoot, loginUrl } from '../../utils/constants';
@@ -9,9 +9,10 @@ import MenuControl from '../../components/menu-control';
import WikiAdd from './wiki-add'; import WikiAdd from './wiki-add';
import WikiMenu from './wiki-menu'; import WikiMenu from './wiki-menu';
import WikiRename from './wiki-rename'; import WikiRename from './wiki-rename';
import WikiDelete from './wiki-delete'; import NewWikiDialog from '../../components/dialog/new-wiki-dialog';
import WikiSelect from './wiki-select'; import WikiDeleteDialog from '../../components/dialog/wiki-delete-dialog';
import WikiCreate from './wiki-create'; import WikiSelectDialog from '../../components/dialog/wiki-select-dialog';
import ModalPortal from '../../components/modal-portal';
const itempropTypes = { const itempropTypes = {
@@ -25,7 +26,7 @@ class Item extends Component {
super(props); super(props);
this.state = { this.state = {
isShowWikiMenu: false, isShowWikiMenu: false,
menuPosition: {top:'', left: ''}, position: {top:'', left: ''},
isItemFreezed: false, isItemFreezed: false,
isShowDeleteDialog: false, isShowDeleteDialog: false,
isShowMenuControl: false, isShowMenuControl: false,
@@ -59,7 +60,7 @@ class Item extends Component {
let position = {top: top, left: left}; let position = {top: top, left: left};
this.setState({ this.setState({
isShowWikiMenu: true, isShowWikiMenu: true,
menuPosition: position, position: position,
isItemFreezed: true, isItemFreezed: true,
}); });
} }
@@ -149,35 +150,39 @@ class Item extends Component {
let userProfileURL = `${siteRoot}profile/${encodeURIComponent(wiki.owner)}/`; let userProfileURL = `${siteRoot}profile/${encodeURIComponent(wiki.owner)}/`;
return ( return (
<tr className={this.state.highlight} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> <Fragment>
<td> <tr className={this.state.highlight} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
{this.state.isRenameing ? <td>
<WikiRename wiki={wiki} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> : {this.state.isRenameing ?
<a href={wiki.link}>{gettext(wiki.name)}</a> <WikiRename wiki={wiki} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> :
} <a href={wiki.link}>{gettext(wiki.name)}</a>
</td> }
<td><a href={userProfileURL} target='_blank'>{gettext(wiki.owner_nickname)}</a></td> </td>
<td>{moment(wiki.updated_at).fromNow()}</td> <td><a href={userProfileURL} target='_blank'>{gettext(wiki.owner_nickname)}</a></td>
<td className="menu-toggle" onClick={this.onMenuToggle}> <td>{moment(wiki.updated_at).fromNow()}</td>
<MenuControl <td className="menu-toggle" onClick={this.onMenuToggle}>
isShow={this.state.isShowMenuControl} <MenuControl
onClick={this.onMenuToggle} isShow={this.state.isShowMenuControl}
/> onClick={this.onMenuToggle}
{this.state.isShowWikiMenu &&
<WikiMenu
menuPosition={this.state.menuPosition}
onRenameToggle={this.onRenameToggle}
onDeleteToggle={this.onDeleteToggle}
/> />
} {this.state.isShowWikiMenu &&
{this.state.isShowDeleteDialog && <WikiMenu
<WikiDelete position={this.state.position}
onRenameToggle={this.onRenameToggle}
onDeleteToggle={this.onDeleteToggle}
/>
}
</td>
</tr>
{this.state.isShowDeleteDialog &&
<ModalPortal>
<WikiDeleteDialog
toggleCancel={this.onDeleteToggle} toggleCancel={this.onDeleteToggle}
handleSubmit={this.deleteWiki} handleSubmit={this.deleteWiki}
/> />
} </ModalPortal>
</td> }
</tr> </Fragment>
); );
} }
} }
@@ -237,7 +242,7 @@ class Wikis extends Component {
errorMsg: '', errorMsg: '',
wikis: [], wikis: [],
isShowWikiAdd: false, isShowWikiAdd: false,
addPosition: {top:'', left: ''}, position: {top:'', left: ''},
isShowSelectDialog: false, isShowSelectDialog: false,
isShowCreateDialog: false, isShowCreateDialog: false,
}; };
@@ -248,10 +253,6 @@ class Wikis extends Component {
this.getWikis(); this.getWikis();
} }
componentWillReceiveProps() {
this.getWikis();
}
componentWillUnmount() { componentWillUnmount() {
document.removeEventListener('click', this.onHideWikiAdd); document.removeEventListener('click', this.onHideWikiAdd);
} }
@@ -302,7 +303,7 @@ class Wikis extends Component {
let position = {top: top, left: left}; let position = {top: top, left: left};
this.setState({ this.setState({
isShowWikiAdd: true, isShowWikiAdd: true,
addPosition: position, position: position,
}); });
} }
@@ -374,53 +375,59 @@ class Wikis extends Component {
render() { render() {
return ( return (
<div className="main-panel-center"> <Fragment>
<div className="cur-view-container" id="wikis"> <div className="main-panel-center">
<div className="cur-view-path"> <div className="cur-view-container" id="wikis">
<h3 className="sf-heading">{gettext('Wikis')}</h3> <div className="cur-view-path">
<div style={{float:'right'}}> <h3 className="sf-heading">{gettext('Wikis')}</h3>
<Button className="fa fa-plus-square" onClick={this.onAddMenuToggle}> <div style={{float:'right'}}>
{gettext('Add Wiki')} <Button className="fa fa-plus-square" onClick={this.onAddMenuToggle}>
</Button> {gettext('Add Wiki')}
</div> </Button>
{this.state.isShowWikiAdd &&
<WikiAdd
isShowWikiAdd={this.state.isShowWikiAdd}
addPosition={this.state.addPosition}
onSelectToggle={this.onSelectToggle}
onCreateToggle={this.onCreateToggle}
/>
}
{this.state.isShowCreateDialog &&
<WikiCreate
toggleCancel={this.onCreateToggle}
addWiki={this.addWiki}
/>
}
{this.state.isShowSelectDialog &&
<WikiSelect
toggleCancel={this.onSelectToggle}
addWiki={this.addWiki}
/>
}
</div>
<div className="cur-view-content">
{(this.state.loading || this.state.wikis.length !== 0) &&
<WikisContent
data={this.state}
renameWiki={this.renameWiki}
deleteWiki={this.deleteWiki}
/>
}
{(!this.state.loading && this.state.wikis.length === 0) &&
<div className="message empty-tip">
<h2>{gettext('You do not have any Wiki.')}</h2>
<p>{gettext('Seafile Wiki enables you to organize your knowledge in a simple way. The contents of wiki is stored in a normal library with pre-defined file/folder structure. This enables you to edit your wiki in your desktop and then sync back to the server.')}</p>
</div> </div>
} {this.state.isShowWikiAdd &&
<WikiAdd
isShowWikiAdd={this.state.isShowWikiAdd}
position={this.state.position}
onSelectToggle={this.onSelectToggle}
onCreateToggle={this.onCreateToggle}
/>
}
</div>
<div className="cur-view-content">
{(this.state.loading || this.state.wikis.length !== 0) &&
<WikisContent
data={this.state}
renameWiki={this.renameWiki}
deleteWiki={this.deleteWiki}
/>
}
{(!this.state.loading && this.state.wikis.length === 0) &&
<div className="message empty-tip">
<h2>{gettext('You do not have any Wiki.')}</h2>
<p>{gettext('Seafile Wiki enables you to organize your knowledge in a simple way. The contents of wiki is stored in a normal library with pre-defined file/folder structure. This enables you to edit your wiki in your desktop and then sync back to the server.')}</p>
</div>
}
</div>
</div> </div>
</div> </div>
</div> {this.state.isShowCreateDialog &&
<ModalPortal>
<NewWikiDialog
toggleCancel={this.onCreateToggle}
addWiki={this.addWiki}
/>
</ModalPortal>
}
{this.state.isShowSelectDialog &&
<ModalPortal>
<WikiSelectDialog
toggleCancel={this.onSelectToggle}
addWiki={this.addWiki}
/>
</ModalPortal>
}
</Fragment>
); );
} }
} }

View File

@@ -28,6 +28,7 @@ export const enableRepoSnapshotLabel = window.app.pageOptions.enableRepoSnapshot
export const shareLinkExpireDaysMin = window.app.pageOptions.shareLinkExpireDaysMin; export const shareLinkExpireDaysMin = window.app.pageOptions.shareLinkExpireDaysMin;
export const shareLinkExpireDaysMax = window.app.pageOptions.shareLinkExpireDaysMax; export const shareLinkExpireDaysMax = window.app.pageOptions.shareLinkExpireDaysMax;
export const maxFileName = window.app.pageOptions.maxFileName; export const maxFileName = window.app.pageOptions.maxFileName;
export const enableWiki = window.app.pageOptions.enableWiki;
// wiki // wiki
export const slug = window.wiki ? window.wiki.config.slug : ''; export const slug = window.wiki ? window.wiki.config.slug : '';

View File

@@ -718,7 +718,7 @@ OTP_LOGIN_URL = '/profile/two_factor_authentication/setup/'
TWO_FACTOR_DEVICE_REMEMBER_DAYS = 90 TWO_FACTOR_DEVICE_REMEMBER_DAYS = 90
# Enable personal wiki, group wiki # Enable personal wiki, group wiki
ENABLE_WIKI = False ENABLE_WIKI = True
# Enable 'repo snapshot label' feature # Enable 'repo snapshot label' feature
ENABLE_REPO_SNAPSHOT_LABEL = False ENABLE_REPO_SNAPSHOT_LABEL = False

View File

@@ -61,7 +61,8 @@
enableRepoSnapshotLabel: {% if enable_repo_snapshot_label %} true {% else %} false {% endif %}, enableRepoSnapshotLabel: {% if enable_repo_snapshot_label %} true {% else %} false {% endif %},
shareLinkExpireDaysMin: "{{ share_link_expire_days_min }}", shareLinkExpireDaysMin: "{{ share_link_expire_days_min }}",
shareLinkExpireDaysMax: "{{ share_link_expire_days_max }}", shareLinkExpireDaysMax: "{{ share_link_expire_days_max }}",
maxFileName: "{{ max_file_name }}" maxFileName: "{{ max_file_name }}",
enableWiki: {% if enable_wiki %} true {% else %} false {% endif %},
} }
}; };
</script> </script>

View File

@@ -1205,6 +1205,7 @@ def react_fake_view(request):
return render(request, "react_app.html", { return render(request, "react_app.html", {
'storages': get_library_storages(request), 'storages': get_library_storages(request),
'enable_wiki': settings.ENABLE_WIKI,
'enable_repo_snapshot_label': settings.ENABLE_REPO_SNAPSHOT_LABEL, 'enable_repo_snapshot_label': settings.ENABLE_REPO_SNAPSHOT_LABEL,
'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN, 'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN,
'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX, 'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX,