From 7374b1a4b9048885f772d1227bdcc2654ce4ffc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=81=A5=E8=BE=89?= Date: Mon, 24 Jun 2019 13:15:32 +0800 Subject: [PATCH 1/4] dtable upgrade --- frontend/src/app.js | 3 +- .../dialog/create-workspace-dialog.js | 105 ++++---- .../dialog/delete-workspace-dialog.js | 39 --- frontend/src/pages/dtable/dtable.js | 197 +++++---------- seahub/api2/endpoints/dtable.py | 237 +++++++----------- .../migrations/0002_auto_20190621_0937.py | 39 +++ seahub/dtable/models.py | 21 +- seahub/urls.py | 3 +- 8 files changed, 251 insertions(+), 393 deletions(-) delete mode 100644 frontend/src/components/dialog/delete-workspace-dialog.js create mode 100644 seahub/dtable/migrations/0002_auto_20190621_0937.py diff --git a/frontend/src/app.js b/frontend/src/app.js index 684f90ae24..51afe7d6d2 100644 --- a/frontend/src/app.js +++ b/frontend/src/app.js @@ -37,7 +37,6 @@ import './css/search.css'; const FilesActivitiesWrapper = MainContentWrapper(FilesActivities); const DraftsViewWrapper = MainContentWrapper(DraftsView); const StarredWrapper = MainContentWrapper(Starred); -const DTableWrapper = MainContentWrapper(DTable); const LinkedDevicesWrapper = MainContentWrapper(LinkedDevices); const SharedLibrariesWrapper = MainContentWrapper(SharedLibraries); const ShareAdminLibrariesWrapper = MainContentWrapper(ShareAdminLibraries); @@ -235,7 +234,7 @@ class App extends Component { /> - + diff --git a/frontend/src/components/dialog/create-workspace-dialog.js b/frontend/src/components/dialog/create-workspace-dialog.js index 27e41ea5bf..e09d9b8259 100644 --- a/frontend/src/components/dialog/create-workspace-dialog.js +++ b/frontend/src/components/dialog/create-workspace-dialog.js @@ -1,7 +1,10 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter, Form, FormGroup, Label, Alert } from 'reactstrap'; +import Select from 'react-select'; +import makeAnimated from 'react-select/lib/animated'; +import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; import { gettext } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api.js'; const propTypes = { @@ -9,88 +12,68 @@ const propTypes = { onAddWorkspace: PropTypes.func.isRequired, }; +const NoOptionsMessage = (props) => { + return ( +
{gettext('Group not found')}
+ ); +}; + class CreateWorkspaceDialog extends React.Component { constructor(props) { super(props); this.state = { - workspaceName: '', - errMessage: '', - isSubmitBtnActive: false, + selectedOption: null, + options:[], }; - this.newInput = React.createRef(); } - handleNameChange = (e) => { - if (!e.target.value.trim()) { - this.setState({isSubmitBtnActive: false}); - } else { - this.setState({isSubmitBtnActive: true}); - } - - this.setState({workspaceName: e.target.value}); + componentDidMount() { + seafileAPI.listGroups().then((res) => { + let options = []; + for (let i = 0 ; i < res.data.length; i++) { + let obj = {}; + obj.value = res.data[i].name; + obj.email = res.data[i].id + '@seafile_group'; + obj.label = res.data[i].name; + options.push(obj); + } + this.setState({options: options}); + }); } - handleSubmit = () => { - let isValid= this.validateInputParams(); - if (isValid) { - let workspaceName = this.state.workspaceName.trim(); - this.props.createWorkspace(workspaceName); - } + handleSelectChange = (option) => { + this.setState({selectedOption: option}); + } + + submit = () => { + let owner = this.state.selectedOption; + this.props.createWorkspace(owner.email); } - handleKeyPress = (e) => { - if (e.key === 'Enter') { - this.handleSubmit(); - e.preventDefault(); - } - } - toggle = () => { this.props.onAddWorkspace(); } - componentDidMount() { - this.newInput.focus(); - } - - validateInputParams() { - let errMessage = ''; - let workspaceName = this.state.workspaceName.trim(); - if (!workspaceName.length) { - errMessage = gettext('Name is required'); - this.setState({errMessage: errMessage}); - return false; - } - if (workspaceName.indexOf('/') > -1) { - errMessage = gettext('Name should not include \'/\'.'); - this.setState({errMessage: errMessage}); - return false; - } - return true; - } - render() { return ( - {gettext('New Workspace')} + {gettext('New DTable')} -
- - - {this.newInput = input;}} - value={this.state.workspaceName} - onChange={this.handleNameChange} - /> - -
- {this.state.errMessage && {this.state.errMessage}} +
diff --git a/frontend/src/components/dialog/create-workspace-dialog.js b/frontend/src/components/dialog/create-workspace-dialog.js deleted file mode 100644 index e09d9b8259..0000000000 --- a/frontend/src/components/dialog/create-workspace-dialog.js +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import Select from 'react-select'; -import makeAnimated from 'react-select/lib/animated'; -import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'; -import { gettext } from '../../utils/constants'; -import { seafileAPI } from '../../utils/seafile-api.js'; - - -const propTypes = { - createWorkspace: PropTypes.func.isRequired, - onAddWorkspace: PropTypes.func.isRequired, -}; - -const NoOptionsMessage = (props) => { - return ( -
{gettext('Group not found')}
- ); -}; - -class CreateWorkspaceDialog extends React.Component { - constructor(props) { - super(props); - this.state = { - selectedOption: null, - options:[], - }; - } - - componentDidMount() { - seafileAPI.listGroups().then((res) => { - let options = []; - for (let i = 0 ; i < res.data.length; i++) { - let obj = {}; - obj.value = res.data[i].name; - obj.email = res.data[i].id + '@seafile_group'; - obj.label = res.data[i].name; - options.push(obj); - } - this.setState({options: options}); - }); - } - - handleSelectChange = (option) => { - this.setState({selectedOption: option}); - } - - submit = () => { - let owner = this.state.selectedOption; - this.props.createWorkspace(owner.email); - } - - toggle = () => { - this.props.onAddWorkspace(); - } - - render() { - return ( - - {gettext('New DTable')} - -