1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-14 14:21:23 +00:00
Files
seahub/frontend/src/pages/wikis/wikis.js

326 lines
9.7 KiB
JavaScript
Raw Normal View History

2018-12-10 13:33:32 +08:00
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
import { gettext, canPublishRepo } from '../../utils/constants';
import { Utils } from '../../utils/utils';
2018-12-11 11:20:40 +08:00
import toaster from '../../components/toast';
2018-12-11 08:42:30 +08:00
import ModalPortal from '../../components/modal-portal';
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip';
import AddWikiDialog from '../../components/dialog/add-wiki-dialog';
import wikiAPI from '../../utils/wiki-api';
2024-05-29 20:28:46 +08:00
import WikiCardView from '../../components/wiki-card-view/wiki-card-view';
import { seafileAPI } from '../../utils/seafile-api';
2018-12-08 00:01:23 +08:00
const propTypes = {
sidePanelRate: PropTypes.number,
isSidePanelFolded: PropTypes.bool,
};
2018-12-08 00:01:23 +08:00
class Wikis extends Component {
constructor(props) {
super(props);
this.state = {
loading: true,
errorMsg: '',
currentDeptEmail: '',
2018-12-08 00:01:23 +08:00
wikis: [],
groupWikis: [],
2018-12-11 13:44:09 +08:00
isShowAddWikiMenu: false,
isShowAddDialog: false,
isDropdownMenuShown: false,
2018-12-08 00:01:23 +08:00
};
}
componentDidMount() {
this.getWikis();
}
getWikis = () => {
let wikis = [];
let groupWikis = [];
wikiAPI.listWikis().then(res => {
wikis = wikis.concat(res.data.data);
wikis.map(wiki => {
return wiki['version'] = 'v1';
});
wikiAPI.listWikis2().then(res => {
let wikis2 = res.data.wikis;
groupWikis = res.data.group_wikis;
groupWikis.forEach(group => {
group.wiki_info.forEach(wiki => {
wiki.version = 'v2';
wiki.admins = group.group_admins;
});
});
wikis2.map(wiki => {
return wiki['version'] = 'v2';
});
this.setState({
loading: false,
wikis: wikis.concat(wikis2),
groupWikis: groupWikis
});
}).catch((error) => {
this.setState({
loading: false,
errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
});
});
2018-12-08 00:01:23 +08:00
}).catch((error) => {
this.setState({
loading: false,
errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
});
2018-12-08 00:01:23 +08:00
});
};
2018-12-08 00:01:23 +08:00
2018-12-11 13:22:52 +08:00
clickMenuToggle = (e) => {
e.preventDefault();
this.onMenuToggle();
};
2018-12-08 00:01:23 +08:00
2018-12-11 13:22:52 +08:00
onMenuToggle = () => {
this.setState({ isShowAddWikiMenu: !this.state.isShowAddWikiMenu });
};
2018-12-08 00:01:23 +08:00
toggelAddWikiDialog = (currentDeptEmail) => {
if (this.state.isShowAddDialog) {
this.setState({
isShowAddDialog: false,
currentDeptEmail: '',
});
} else {
this.setState({
isShowAddDialog: true,
currentDeptEmail
});
}
};
2018-12-08 00:01:23 +08:00
addWiki = (wikiName, currentDeptID) => {
wikiAPI.addWiki2(wikiName, currentDeptID).then((res) => {
let wikis = this.state.wikis.slice(0);
let groupWikis = this.state.groupWikis;
let new_wiki = res.data;
new_wiki['version'] = 'v2';
if (currentDeptID) {
groupWikis.filter(group => {
if (group.group_id === currentDeptID) {
group.wiki_info.push(new_wiki);
}
return group;
});
} else {
wikis.push(new_wiki);
}
this.setState({
wikis,
currentDeptEmail: '',
groupWikis,
currentDeptID: '',
});
2018-12-08 00:01:23 +08:00
}).catch((error) => {
if (error.response) {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
2018-12-08 00:01:23 +08:00
}
});
};
2018-12-08 00:01:23 +08:00
deleteWiki = (wiki) => {
if (wiki.version === 'v1') {
wikiAPI.deleteWiki(wiki.id).then(() => {
let wikis = this.state.wikis.filter(item => {
return item.id !== wiki.id;
});
let groupWikis = this.state.groupWikis.filter(group => {
group.wiki_info = group.wiki_info.filter(item => item.name !== wiki.name);
return group;
});
this.setState({
wikis: wikis,
groupWikis: groupWikis,
});
}).catch((error) => {
if (error.response) {
let errorMsg = error.response.data.error_msg;
toaster.danger(errorMsg);
2018-12-08 11:40:28 +08:00
}
});
} else {
wikiAPI.deleteWiki2(wiki.id).then(() => {
let wikis = this.state.wikis.filter(item => {
return item.id !== wiki.id;
});
let groupWikis = this.state.groupWikis.filter(group => {
group.wiki_info = group.wiki_info.filter(item => item.name !== wiki.name);
return group;
});
this.setState({
wikis: wikis,
groupWikis: groupWikis,
});
}).catch((error) => {
if (error.response) {
let errorMsg = error.response.data.error_msg;
toaster.danger(errorMsg);
}
});
}
};
leaveSharedWiki = (wiki) => {
if (!wiki.owner.includes('@seafile_group')) {
let options = {
'share_type': 'personal',
'from': wiki.owner
};
seafileAPI.leaveShareRepo(wiki.repo_id, options).then(res => {
let wikis = this.state.wikis.filter(item => {
return item.name !== wiki.name;
});
this.setState({
wikis: wikis,
});
}).catch((error) => {
let errorMsg = Utils.getErrorMsg(error, true);
toaster.danger(errorMsg);
});
} else {
seafileAPI.leaveShareGroupOwnedRepo(wiki.repo_id).then(res => {
let wikis = this.state.wikis.filter(item => {
return item.name !== wiki.name;
});
this.setState({
wikis: wikis,
});
}).catch((error) => {
let errorMsg = Utils.getErrorMsg(error, true);
toaster.danger(errorMsg);
});
}
};
unshareGroupWiki = (wiki, groupId) => {
seafileAPI.unshareRepoToGroup(wiki.repo_id, groupId).then(() => {
let groupWikis = this.state.groupWikis.map(group => {
if (group.group_id === groupId) {
return {
...group,
wiki_info: group.wiki_info.filter(item => item.name !== wiki.name)
};
}
return group;
});
this.setState({ groupWikis: groupWikis });
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
renameWiki = (wiki, newName) => {
if (wiki.version === 'v1') {
wikiAPI.renameWiki(wiki.id, newName).then(() => {
let wikis = this.state.wikis.map(item => {
if (item.id === wiki.id && item.version === 'v1') {
item.name = newName;
}
return item;
});
2024-07-18 11:58:42 +08:00
this.setState({ wikis: wikis });
}).catch((error) => {
if (error.response) {
let errorMsg = error.response.data.error_msg;
toaster.danger(errorMsg);
}
});
} else {
wikiAPI.renameWiki2(wiki.id, newName).then(() => {
this.getWikis();
}).catch((error) => {
if (error.response) {
let errorMsg = error.response.data.error_msg;
toaster.danger(errorMsg);
}
2018-12-08 00:01:23 +08:00
});
}
};
2018-12-08 00:01:23 +08:00
toggleDropdownMenu = (e) => {
e.stopPropagation();
this.setState({
isDropdownMenuShown: !this.state.isDropdownMenuShown
});
};
2018-12-08 00:01:23 +08:00
render() {
return (
2018-12-10 13:33:32 +08:00
<Fragment>
{this.state.isShowAddDialog &&
<ModalPortal>
<AddWikiDialog
toggleCancel={this.toggelAddWikiDialog}
addWiki={this.addWiki}
currentDeptEmail={this.state.currentDeptEmail}
/>
</ModalPortal>
}
2018-12-26 16:27:15 +08:00
<div className="main-panel-center">
<div className="cur-view-container" id="wikis">
<div className="cur-view-path">
<div className="path-container">
2024-05-06 17:09:47 +08:00
<h3 className="sf-heading m-0">{gettext('Wikis')}</h3>
{canPublishRepo &&
<Dropdown
direction="down"
className="add-wiki-dropdown"
isOpen={this.state.isDropdownMenuShown}
toggle={this.toggleDropdownMenu}
onMouseMove={(e) => {e.stopPropagation();}}
>
<DropdownToggle tag="i" className="px-1">
<span className="sf3-font sf3-font-down" aria-hidden="true"></span>
</DropdownToggle>
<DropdownMenu>
<DropdownItem onClick={() => {this.toggelAddWikiDialog();}}>{gettext('Add Wiki')}</DropdownItem>
</DropdownMenu>
</Dropdown>
}
2018-12-08 00:01:23 +08:00
</div>
2018-12-10 13:33:32 +08:00
</div>
{(this.state.loading || this.state.wikis.length !== 0 || this.state.groupWikis.length !== 0) &&
2024-05-29 20:28:46 +08:00
<div className="cur-view-content pb-4">
<WikiCardView
2018-12-10 13:33:32 +08:00
data={this.state}
deleteWiki={this.deleteWiki}
leaveSharedWiki={this.leaveSharedWiki}
unshareGroupWiki={this.unshareGroupWiki}
renameWiki={this.renameWiki}
toggelAddWikiDialog={this.toggelAddWikiDialog}
sidePanelRate={this.props.sidePanelRate}
isSidePanelFolded={this.props.isSidePanelFolded}
2018-12-10 13:33:32 +08:00
/>
2024-05-29 20:28:46 +08:00
</div>
}
{(!this.state.loading && this.state.wikis.length === 0 && this.state.groupWikis.length === 0) &&
2024-05-29 20:28:46 +08:00
<div className="cur-view-content">
<EmptyTip title={gettext('No Wikis')}>
<p>{gettext('You do not have any wikis yet.')}</p>
<p>{gettext('You can add a wiki by clicking the "Add Wiki" button in the menu.')}</p>
2019-06-10 17:30:10 +08:00
</EmptyTip>
2024-05-29 20:28:46 +08:00
</div>
}
2018-12-08 00:01:23 +08:00
</div>
</div>
2018-12-10 13:33:32 +08:00
</Fragment>
2018-12-08 00:01:23 +08:00
);
}
}
Wikis.propTypes = propTypes;
2018-12-08 00:01:23 +08:00
export default Wikis;