mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-03 07:55:36 +00:00
[group] added full operation menus for all the department/group items… (#7706)
* [group] added full operation menus for all the department/group items in 'Files' page; fixed & improved all the operations * remove useless state * fix test lib --------- Co-authored-by: Michael An <1822852997@qq.com>
This commit is contained in:
@@ -9,14 +9,11 @@ import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
|
||||
class DismissGroupDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
|
||||
dismissGroup = () => {
|
||||
let that = this;
|
||||
seafileAPI.deleteGroup(this.props.groupID).then((res) => {
|
||||
that.props.onGroupChanged();
|
||||
const { groupID } = this.props;
|
||||
seafileAPI.deleteGroup(groupID).then((res) => {
|
||||
this.props.onGroupDeleted();
|
||||
toaster.success(gettext('Group deleted'));
|
||||
}).catch(error => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
toaster.danger(errMessage);
|
||||
@@ -25,13 +22,13 @@ class DismissGroupDialog extends React.Component {
|
||||
|
||||
render() {
|
||||
return (
|
||||
<Modal isOpen={this.props.showDismissGroupDialog} toggle={this.props.toggleDismissGroupDialog}>
|
||||
<SeahubModalHeader>{gettext('Delete Group')}</SeahubModalHeader>
|
||||
<Modal isOpen={true} toggle={this.props.toggleDialog}>
|
||||
<SeahubModalHeader toggle={this.props.toggleDialog}>{gettext('Delete Group')}</SeahubModalHeader>
|
||||
<ModalBody>
|
||||
<span>{gettext('Really want to delete this group?')}</span>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.props.toggleDismissGroupDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="secondary" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.dismissGroup}>{gettext('Delete')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
@@ -40,11 +37,9 @@ class DismissGroupDialog extends React.Component {
|
||||
}
|
||||
|
||||
const DismissGroupDialogPropTypes = {
|
||||
showDismissGroupDialog: PropTypes.bool.isRequired,
|
||||
toggleDismissGroupDialog: PropTypes.func.isRequired,
|
||||
loadGroup: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.string,
|
||||
onGroupChanged: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired,
|
||||
onGroupDeleted: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
DismissGroupDialog.propTypes = DismissGroupDialogPropTypes;
|
||||
|
@@ -9,7 +9,7 @@ import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
import Loading from '../loading';
|
||||
|
||||
const propTypes = {
|
||||
groupID: PropTypes.string.isRequired,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
@@ -5,7 +5,7 @@ import { gettext, siteRoot, groupImportMembersExtraMsg } from '../../utils/const
|
||||
import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
|
||||
const propTypes = {
|
||||
toggleImportMembersDialog: PropTypes.func.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired,
|
||||
importMembersInBatch: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@ class ImportMembersDialog extends React.Component {
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggleImportMembersDialog();
|
||||
this.props.toggleDialog();
|
||||
};
|
||||
|
||||
openFileInput = () => {
|
||||
@@ -49,9 +49,8 @@ class ImportMembersDialog extends React.Component {
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<SeahubModalHeader toggle={this.toggle}>{gettext('Import members from a .xlsx file')}</SeahubModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
<p>{groupImportMembersExtraMsg}</p>
|
||||
{groupImportMembersExtraMsg && <p>{groupImportMembersExtraMsg}</p>}
|
||||
<p><a className="text-secondary small" href={`${siteRoot}api/v2.1/group-members-import-example/`}>{gettext('Download an example file')}</a></p>
|
||||
<button className="btn btn-outline-primary" onClick={this.openFileInput}>{gettext('Upload file')}</button>
|
||||
<input className="d-none" type="file" onChange={this.uploadFile} ref={this.fileInputRef} />
|
||||
|
@@ -9,13 +9,10 @@ import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
|
||||
class LeaveGroupDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
}
|
||||
|
||||
leaveGroup = () => {
|
||||
seafileAPI.quitGroup(this.props.groupID, username).then((res) => {
|
||||
this.props.onGroupChanged();
|
||||
const { groupID } = this.props;
|
||||
seafileAPI.quitGroup(groupID, username).then((res) => {
|
||||
this.props.onLeavingGroup();
|
||||
}).catch(error => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
toaster.danger(errMessage);
|
||||
@@ -24,13 +21,13 @@ class LeaveGroupDialog extends React.Component {
|
||||
|
||||
render() {
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.props.toggleLeaveGroupDialog}>
|
||||
<SeahubModalHeader toggle={this.props.toggleLeaveGroupDialog}>{gettext('Leave Group')}</SeahubModalHeader>
|
||||
<Modal isOpen={true} toggle={this.props.toggleDialog}>
|
||||
<SeahubModalHeader toggle={this.props.toggleDialog}>{gettext('Leave Group')}</SeahubModalHeader>
|
||||
<ModalBody>
|
||||
<p>{gettext('Really want to leave this group?')}</p>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.props.toggleLeaveGroupDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="secondary" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.leaveGroup}>{gettext('Leave')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
@@ -39,9 +36,9 @@ class LeaveGroupDialog extends React.Component {
|
||||
}
|
||||
|
||||
const LeaveGroupDialogPropTypes = {
|
||||
toggleLeaveGroupDialog: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.string,
|
||||
onGroupChanged: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
onLeavingGroup: PropTypes.func.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
LeaveGroupDialog.propTypes = LeaveGroupDialogPropTypes;
|
||||
|
@@ -8,7 +8,7 @@ import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
import '../../css/manage-members-dialog.css';
|
||||
|
||||
const propTypes = {
|
||||
groupID: PropTypes.string,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
isOwner: PropTypes.bool.isRequired,
|
||||
toggleManageMembersDialog: PropTypes.func,
|
||||
toggleDepartmentDetailDialog: PropTypes.func,
|
||||
|
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
|
||||
import { gettext } from '../../utils/constants';
|
||||
import { seafileAPI } from '../../utils/seafile-api';
|
||||
import { Utils } from '../../utils/utils';
|
||||
import { Modal, ModalBody, ModalFooter, Input, Button } from 'reactstrap';
|
||||
import { Modal, ModalBody, ModalFooter, Input, Label, Button } from 'reactstrap';
|
||||
import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
||||
import toaster from '../toast';
|
||||
|
||||
@@ -12,7 +12,7 @@ class RenameGroupDialog extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
newGroupName: this.props.currentGroupName,
|
||||
newGroupName: this.props.groupName,
|
||||
isSubmitBtnActive: false,
|
||||
};
|
||||
}
|
||||
@@ -30,48 +30,42 @@ class RenameGroupDialog extends React.Component {
|
||||
});
|
||||
};
|
||||
|
||||
renameGroup = () => {
|
||||
let name = this.state.newGroupName.trim();
|
||||
if (name) {
|
||||
let that = this;
|
||||
seafileAPI.renameGroup(this.props.groupID, name).then((res) => {
|
||||
that.props.loadGroup(this.props.groupID);
|
||||
that.props.onGroupChanged(res.data.id);
|
||||
}).catch(error => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
toaster.danger(errMessage);
|
||||
});
|
||||
}
|
||||
this.setState({
|
||||
newGroupName: '',
|
||||
handleSubmit = () => {
|
||||
const { groupID } = this.props;
|
||||
const { newGroupName } = this.state;
|
||||
seafileAPI.renameGroup(groupID, newGroupName.trim()).then((res) => {
|
||||
const { name } = res.data;
|
||||
this.props.onGroupNameChanged(name);
|
||||
}).catch(error => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
toaster.danger(errMessage);
|
||||
});
|
||||
this.props.toggleRenameGroupDialog();
|
||||
this.props.toggleDialog();
|
||||
};
|
||||
|
||||
handleKeyDown = (event) => {
|
||||
if (event.keyCode === 13) {
|
||||
this.renameGroup();
|
||||
this.handleSubmit();
|
||||
}
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<Modal isOpen={this.props.showRenameGroupDialog} toggle={this.props.toggleRenameGroupDialog}>
|
||||
<SeahubModalHeader>{gettext('Rename Group')}</SeahubModalHeader>
|
||||
<Modal isOpen={true} toggle={this.props.toggleDialog}>
|
||||
<SeahubModalHeader toggle={this.props.toggleDialog}>{gettext('Rename Group')}</SeahubModalHeader>
|
||||
<ModalBody>
|
||||
<label htmlFor="newGroupName">{gettext('Rename group to')}</label>
|
||||
<Label for="group-name">{gettext('Rename group to')}</Label>
|
||||
<Input
|
||||
type="text"
|
||||
id="newGroupName"
|
||||
name="new-group-name"
|
||||
id="group-name"
|
||||
value={this.state.newGroupName}
|
||||
onChange={this.handleGroupNameChange}
|
||||
onKeyDown={this.handleKeyDown}
|
||||
/>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.props.toggleRenameGroupDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.renameGroup} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
<Button color="secondary" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
@@ -79,12 +73,10 @@ class RenameGroupDialog extends React.Component {
|
||||
}
|
||||
|
||||
const RenameGroupDialogPropTypes = {
|
||||
showRenameGroupDialog: PropTypes.bool.isRequired,
|
||||
toggleRenameGroupDialog: PropTypes.func.isRequired,
|
||||
loadGroup: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.string,
|
||||
onGroupChanged: PropTypes.func.isRequired,
|
||||
currentGroupName: PropTypes.string.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.number,
|
||||
onGroupNameChanged: PropTypes.func.isRequired,
|
||||
groupName: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
RenameGroupDialog.propTypes = RenameGroupDialogPropTypes;
|
||||
|
@@ -11,9 +11,9 @@ import toaster from '../toast';
|
||||
import '../../css/transfer-group-dialog.css';
|
||||
|
||||
const propTypes = {
|
||||
groupID: PropTypes.string,
|
||||
toggleTransferGroupDialog: PropTypes.func.isRequired,
|
||||
onGroupChanged: PropTypes.func.isRequired
|
||||
groupID: PropTypes.number.isRequired,
|
||||
onGroupTransfered: PropTypes.func.isRequired,
|
||||
toggleDialog: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class TransferGroupDialog extends React.Component {
|
||||
@@ -21,18 +21,14 @@ class TransferGroupDialog extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
selectedOption: null,
|
||||
errMessage: '',
|
||||
selectedOption: null
|
||||
};
|
||||
this.options = [];
|
||||
}
|
||||
|
||||
handleSelectChange = (option) => {
|
||||
this.setState({
|
||||
selectedOption: option,
|
||||
errMessage: '',
|
||||
selectedOption: option
|
||||
});
|
||||
this.options = [];
|
||||
};
|
||||
|
||||
transferGroup = () => {
|
||||
@@ -41,19 +37,21 @@ class TransferGroupDialog extends React.Component {
|
||||
if (selectedOption && selectedOption[0]) {
|
||||
email = selectedOption[0].email;
|
||||
}
|
||||
if (email) {
|
||||
seafileAPI.transferGroup(this.props.groupID, email).then((res) => {
|
||||
this.props.toggleTransferGroupDialog();
|
||||
toaster.success(gettext('Group has been transfered'));
|
||||
}).catch((error) => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
this.setState({ errMessage: errMessage });
|
||||
});
|
||||
if (!email) {
|
||||
return false;
|
||||
}
|
||||
seafileAPI.transferGroup(this.props.groupID, email).then((res) => {
|
||||
toaster.success(gettext('Group has been transfered'));
|
||||
this.props.onGroupTransfered(res.data);
|
||||
this.props.toggleDialog();
|
||||
}).catch((error) => {
|
||||
let errMessage = Utils.getErrorMsg(error);
|
||||
toaster.danger(errMessage);
|
||||
});
|
||||
};
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggleTransferGroupDialog();
|
||||
this.props.toggleDialog();
|
||||
};
|
||||
|
||||
render() {
|
||||
@@ -68,7 +66,6 @@ class TransferGroupDialog extends React.Component {
|
||||
placeholder={gettext('Please enter 1 or more character')}
|
||||
onSelectChange={this.handleSelectChange}
|
||||
/>
|
||||
<div className="error">{this.state.errMessage}</div>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Close')}</Button>
|
||||
|
@@ -10,7 +10,7 @@ import OpIcon from './op-icon';
|
||||
|
||||
const propTypes = {
|
||||
groupMembers: PropTypes.array.isRequired,
|
||||
groupID: PropTypes.string,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
isOwner: PropTypes.bool.isRequired,
|
||||
isItemFreezed: PropTypes.bool.isRequired,
|
||||
toggleItemFreezed: PropTypes.func.isRequired,
|
||||
@@ -61,7 +61,7 @@ const MemberPropTypes = {
|
||||
changeMember: PropTypes.func.isRequired,
|
||||
deleteMember: PropTypes.func.isRequired,
|
||||
toggleItemFreezed: PropTypes.func.isRequired,
|
||||
groupID: PropTypes.string,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
isOwner: PropTypes.bool.isRequired,
|
||||
isItemFreezed: PropTypes.bool.isRequired
|
||||
};
|
||||
|
@@ -12,7 +12,7 @@ import GroupMembers from './group-members';
|
||||
const propTypes = {
|
||||
toggleManageMembersDialog: PropTypes.func,
|
||||
toggleDepartmentDetailDialog: PropTypes.func,
|
||||
groupID: PropTypes.string,
|
||||
groupID: PropTypes.number.isRequired,
|
||||
isOwner: PropTypes.bool.isRequired
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user