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;