import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import MediaQuery from 'react-responsive'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, Button } from 'reactstrap'; import moment from 'moment'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, siteRoot } from '../../utils/constants'; import CommonToolbar from '../../components/toolbar/common-toolbar'; import Loading from '../../components/loading'; import CreateWorkspaceDialog from '../../components/dialog/create-workspace-dialog'; import CreateTableDialog from '../../components/dialog/create-table-dialog'; import DeleteTableDialog from '../../components/dialog/delete-table-dialog'; import Rename from '../../components/rename'; import '../../css/dtable-page.css'; moment.locale(window.app.config.lang); const tablePropTypes = { table: PropTypes.object.isRequired, workspaceID: PropTypes.number.isRequired, renameTable: PropTypes.func.isRequired, deleteTable: PropTypes.func.isRequired, onUnfreezedItem: PropTypes.func.isRequired, onFreezedItem: PropTypes.func.isRequired, isItemFreezed: PropTypes.bool.isRequired, }; class Table extends Component { constructor(props) { super(props); this.state = { isTableRenaming: false, isTableDeleting: false, dropdownOpen: false, active: false, }; } onRenameTableCancel = () => { this.setState({isTableRenaming: !this.state.isTableRenaming}); this.props.onUnfreezedItem(); } onRenameTableConfirm = (newTableName) => { let oldTableName = this.props.table.name; this.props.renameTable(oldTableName, newTableName); this.onRenameTableCancel(); } onDeleteTableCancel = () => { this.setState({isTableDeleting: !this.state.isTableDeleting}); this.props.onUnfreezedItem(); } onDeleteTableSubmit = () => { let tableName = this.props.table.name; this.props.deleteTable(tableName); this.onDeleteTableCancel(); } dropdownToggle = () => { if (this.state.dropdownOpen) { this.props.onUnfreezedItem(); } else { this.props.onFreezedItem(); } this.setState({ dropdownOpen: !this.state.dropdownOpen }); } onMouseEnter = () => { if (this.props.isItemFreezed) return; this.setState({ active: true }); } onMouseLeave = () => { if (this.props.isItemFreezed) return; this.setState({ active: false }); } componentWillReceiveProps(nextProps) { if (!nextProps.isItemFreezed) { this.setState({ active: false }); } } render() { let table = this.props.table; let tableHref = siteRoot + 'workspace/' + this.props.workspaceID + '/dtable/' + table.name + '/'; return ( {this.state.isTableRenaming && } {!this.state.isTableRenaming && {table.name} } {table.modifier} {moment(table.mtime).fromNow()} {this.state.active && {gettext('Rename')} {gettext('Delete')} } {this.state.isTableDeleting && } ); } } Table.propTypes = tablePropTypes; const workspacePropTypes = { workspace: PropTypes.object.isRequired, }; class Workspace extends Component { constructor(props) { super(props); this.state = { tableList: this.props.workspace.table_list, errorMsg: '', isShowAddTableDialog: false, isItemFreezed: false, }; } onFreezedItem = () => { this.setState({isItemFreezed: true}); } onUnfreezedItem = () => { this.setState({isItemFreezed: false}); } onAddTable = () => { this.setState({ isShowAddTableDialog: !this.state.isShowAddTableDialog, }); } createTable = (tableName) => { let workspaceID = this.props.workspace.id; seafileAPI.createTable(workspaceID, tableName).then((res) => { this.state.tableList.push(res.data.table); this.setState({tableList: this.state.tableList}); }).catch((error) => { if(error.response) { this.setState({errorMsg: gettext('Error')}); } }); this.onAddTable(); } renameTable = (oldTableName, newTableName) => { let workspaceID = this.props.workspace.id; seafileAPI.renameTable(workspaceID, oldTableName, newTableName).then((res) => { let tableList = this.state.tableList.map((table) => { if (table.name === oldTableName) { table = res.data.table; } return table; }); this.setState({tableList: tableList}); }).catch((error) => { if(error.response) { this.setState({errorMsg: gettext('Error')}); } }); } deleteTable = (tableName) => { let workspaceID = this.props.workspace.id; seafileAPI.deleteTable(workspaceID, tableName).then(() => { let tableList = this.state.tableList.filter(table => { return table.name !== tableName; }); this.setState({tableList: tableList}); }).catch((error) => { if(error.response) { this.setState({errorMsg: gettext('Error')}); } }); } componentWillReceiveProps(nextProps) { if (nextProps.workspace.table_list !== this.props.workspace.table_list) { this.setState({ tableList: nextProps.workspace.table_list }); } } render() { let workspace = this.props.workspace; return(
{workspace.owner_name}
{this.state.isShowAddTableDialog && } {gettext('Add a DTable')}
{this.state.tableList.map((table, index) => { return (
); })}
); } } Workspace.propTypes = workspacePropTypes; const dtablePropTypes = { onShowSidePanel: PropTypes.func.isRequired, onSearchedClick: PropTypes.func.isRequired, }; class DTable extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', workspaceList: [], isShowAddWorkspaceDialog: false, }; } onAddWorkspace = () => { this.setState({ isShowAddWorkspaceDialog: !this.state.isShowAddWorkspaceDialog, }); } createWorkspace = (owner) => { seafileAPI.createWorkspace(owner).then((res) => { this.state.workspaceList.push(res.data.workspace); this.setState({workspaceList: this.state.workspaceList}); }).catch((error) => { if(error.response) { this.setState({errorMsg: gettext('Error')}); } }); this.onAddWorkspace(); } componentDidMount() { seafileAPI.listWorkspaces().then((res) => { this.setState({ loading: false, workspaceList: res.data.workspace_list, }); }).catch((error) => { if (error.response) { this.setState({ loading: false, errorMsg: gettext('Error') }); } else { this.setState({ loading: false, errorMsg: gettext('Please check the network.') }); } }); } render() { return (

DTable

{this.state.loading && } {(!this.state.loading && this.state.errorMsg) &&

{this.state.errorMsg}

} {!this.state.loading && {this.state.workspaceList.map((workspace, index) => { return ( ); })}
{this.state.isShowAddWorkspaceDialog && }
}
); } } DTable.propTypes = dtablePropTypes; export default DTable;