import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, siteRoot, loginUrl } from '../../utils/constants'; import moment from 'moment'; import { Button } from 'reactstrap'; import Toast from '../../components/toast'; import MenuControl from '../../components/menu-control'; import WikiAdd from './wiki-add'; import WikiMenu from './wiki-menu'; import WikiRename from './wiki-rename'; import WikiDelete from './wiki-delete'; import WikiSelect from './wiki-select'; import WikiCreate from './wiki-create'; const itempropTypes = { wiki: PropTypes.object.isRequired, deleteWiki: PropTypes.func.isRequired, }; class Item extends Component { constructor(props) { super(props); this.state = { isShowWikiMenu: false, menuPosition: {top:'', left: ''}, isItemFreezed: false, isShowDeleteDialog: false, isShowMenuControl: false, isRenameing: false, highlight: '', wiki: this.props.wiki, }; } componentDidMount() { document.addEventListener('click', this.onHideWikiMenu); } componentWillUnmount() { document.removeEventListener('click', this.onHideWikiMenu); } onMenuToggle = (e) => { e.stopPropagation(); e.nativeEvent.stopImmediatePropagation(); if (this.state.isShowWikiMenu) { this.onHideWikiMenu(); } else { this.onShowWikiMenu(e); } } onShowWikiMenu = (e) => { let left = e.clientX - 8*16; let top = e.clientY + 12; let position = {top: top, left: left}; this.setState({ isShowWikiMenu: true, menuPosition: position, isItemFreezed: true, }); } onHideWikiMenu = () => { this.setState({ isShowWikiMenu: false, isItemFreezed: false, }); } onMouseEnter = () => { if (!this.state.isItemFreezed) { this.setState({ isShowMenuControl: true, highlight: 'tr-highlight', }); } } onMouseLeave = () => { if (!this.state.isItemFreezed) { this.setState({ isShowMenuControl: false, highlight: '', }); } } onRenameToggle = () => { this.setState({ isShowWikiMenu: false, isItemFreezed: true, isRenameing: true, }); } onRenameConfirm = (newName) => { let wiki = this.state.wiki; if (newName === wiki.name) { this.onRenameCancel(); return false; } if (!newName) { let errMessage = 'Name is required.'; Toast.error(gettext(errMessage)); return false; } if (newName.indexOf('/') > -1) { let errMessage = 'Name should not include ' + '\'/\'' + '.'; Toast.error(gettext(errMessage)); return false; } this.renameWiki(newName); this.onRenameCancel(); } onRenameCancel = () => { this.setState({ isRenameing: false, isItemFreezed: false, }); } onDeleteToggle = () => { this.setState({ isShowDeleteDialog: !this.state.isShowDeleteDialog, }); } renameWiki = (newName) => { let wiki = this.state.wiki; seafileAPI.renameWiki(wiki.slug, newName).then((res) => { this.setState({wiki: res.data}); }).catch((error) => { if(error.response) { let errorMsg = error.response.data.error_msg; Toast.error(errorMsg); } }); } deleteWiki = () => { let wiki = this.props.wiki; this.props.deleteWiki(wiki); this.setState({ isShowDeleteDialog: !this.state.isShowDeleteDialog, }); } render() { let wiki = this.state.wiki; let userProfileURL = `${siteRoot}profile/${encodeURIComponent(wiki.owner)}/`; return (
{errorMsg}
; } else { return ({gettext('Name')} | {gettext('Owner')} | {gettext('Last Update')} | {/* operation */} |
---|
{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.')}