mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-18 15:08:22 +00:00
rename-dismiss-group (#2660)
This commit is contained in:
commit
20ab06f14b
@ -113,6 +113,19 @@ class App extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onGroupChanged = (groupID) => {
|
||||||
|
setTimeout(function(){
|
||||||
|
let url = new URL(window.location.origin);
|
||||||
|
if (groupID) {
|
||||||
|
url = url + 'group/' + groupID + '/';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
url = url + 'groups/';
|
||||||
|
}
|
||||||
|
window.location = url.toString();
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
|
||||||
tabItemClick = (tabName, groupID) => {
|
tabItemClick = (tabName, groupID) => {
|
||||||
let pathPrefix = [];
|
let pathPrefix = [];
|
||||||
if (groupID || this.dirViewPanels.indexOf(tabName) > -1) {
|
if (groupID || this.dirViewPanels.indexOf(tabName) > -1) {
|
||||||
@ -200,7 +213,13 @@ class App extends Component {
|
|||||||
<MyLibDeleted path={siteRoot + 'my-libs/deleted/'} onSearchedClick={this.onSearchedClick} />
|
<MyLibDeleted path={siteRoot + 'my-libs/deleted/'} onSearchedClick={this.onSearchedClick} />
|
||||||
<DirView path={siteRoot + 'library/:repoID/*'} pathPrefix={this.state.pathPrefix} onMenuClick={this.onShowSidePanel} onTabNavClick={this.tabItemClick}/>
|
<DirView path={siteRoot + 'library/:repoID/*'} pathPrefix={this.state.pathPrefix} onMenuClick={this.onShowSidePanel} onTabNavClick={this.tabItemClick}/>
|
||||||
<Groups path={siteRoot + 'groups'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
|
<Groups path={siteRoot + 'groups'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
|
||||||
<Group path={siteRoot + 'group/:groupID'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick} onTabNavClick={this.tabItemClick}/>
|
<Group
|
||||||
|
path={siteRoot + 'group/:groupID'}
|
||||||
|
onShowSidePanel={this.onShowSidePanel}
|
||||||
|
onSearchedClick={this.onSearchedClick}
|
||||||
|
onTabNavClick={this.tabItemClick}
|
||||||
|
onGroupChanged={this.onGroupChanged}
|
||||||
|
/>
|
||||||
<WikisWrapper path={siteRoot + 'wikis'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
|
<WikisWrapper path={siteRoot + 'wikis'} onShowSidePanel={this.onShowSidePanel} onSearchedClick={this.onSearchedClick}/>
|
||||||
</Router>
|
</Router>
|
||||||
</MainPanel>
|
</MainPanel>
|
||||||
|
46
frontend/src/components/dialog/dismiss-group-dialog.js
Normal file
46
frontend/src/components/dialog/dismiss-group-dialog.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { gettext } from '../../utils/constants';
|
||||||
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
|
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
|
||||||
|
|
||||||
|
class DismissGroupDialog extends React.Component {
|
||||||
|
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
}
|
||||||
|
|
||||||
|
dismissGroup = () => {
|
||||||
|
let that = this;
|
||||||
|
seafileAPI.deleteGroup(this.props.groupID).then((res)=> {
|
||||||
|
that.props.onGroupChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return(
|
||||||
|
<Modal isOpen={this.props.showDismissGroupDialog} toggle={this.props.toggleDismissGroupDialog}>
|
||||||
|
<ModalHeader>{gettext('Dismiss Group')}</ModalHeader>
|
||||||
|
<ModalBody>
|
||||||
|
<span>{gettext('Really want to dismiss this group?')}</span>
|
||||||
|
</ModalBody>
|
||||||
|
<ModalFooter>
|
||||||
|
<Button color="secondary" onClick={this.props.toggleDismissGroupDialog}>{gettext('Cancel')}</Button>
|
||||||
|
<Button color="primary" onClick={this.dismissGroup}>{gettext('Dismiss')}</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const DismissGroupDialogPropTypes = {
|
||||||
|
showDismissGroupDialog: PropTypes.bool.isRequired,
|
||||||
|
toggleDismissGroupDialog: PropTypes.func.isRequired,
|
||||||
|
loadGroup: PropTypes.func.isRequired,
|
||||||
|
groupID: PropTypes.string.isRequired,
|
||||||
|
onGroupChanged: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
DismissGroupDialog.propTypes = DismissGroupDialogPropTypes;
|
||||||
|
|
||||||
|
export default DismissGroupDialog;
|
72
frontend/src/components/dialog/rename-group-dialog.js
Normal file
72
frontend/src/components/dialog/rename-group-dialog.js
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { gettext } from '../../utils/constants';
|
||||||
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
|
import { Modal, ModalHeader, ModalBody, ModalFooter, Input, Button } from 'reactstrap';
|
||||||
|
|
||||||
|
class RenameGroupDialog extends React.Component {
|
||||||
|
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
newGroupName: '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
handleGroupNameChange = (event) => {
|
||||||
|
let name = event.target.value;
|
||||||
|
this.setState({
|
||||||
|
newGroupName: name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
newGroupName: '',
|
||||||
|
});
|
||||||
|
this.props.toggleRenameGroupDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
handleKeyDown = (event) => {
|
||||||
|
if (event.keyCode === 13) {
|
||||||
|
this.renameGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return(
|
||||||
|
<Modal isOpen={this.props.showRenameGroupDialog} toggle={this.props.toggleRenameGroupDialog}>
|
||||||
|
<ModalHeader>{gettext('Rename Group')}</ModalHeader>
|
||||||
|
<ModalBody>
|
||||||
|
<label htmlFor="newGroupName">{gettext('Rename group to')}</label>
|
||||||
|
<Input type="text" id="newGroupName" 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}>{gettext('Submit')}</Button>
|
||||||
|
</ModalFooter>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const RenameGroupDialogPropTypes = {
|
||||||
|
showRenameGroupDialog: PropTypes.bool.isRequired,
|
||||||
|
toggleRenameGroupDialog: PropTypes.func.isRequired,
|
||||||
|
loadGroup: PropTypes.func.isRequired,
|
||||||
|
groupID: PropTypes.string.isRequired,
|
||||||
|
onGroupChanged: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
RenameGroupDialog.propTypes = RenameGroupDialogPropTypes;
|
||||||
|
|
||||||
|
export default RenameGroupDialog;
|
@ -1,4 +1,5 @@
|
|||||||
import React,{ Fragment } from 'react';
|
import React,{ Fragment } from 'react';
|
||||||
|
import { Popover } from 'reactstrap';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { gettext, siteRoot, username, loginUrl } from '../../utils/constants';
|
import { gettext, siteRoot, username, loginUrl } from '../../utils/constants';
|
||||||
import { Link } from '@reach/router';
|
import { Link } from '@reach/router';
|
||||||
@ -10,11 +11,15 @@ import Repo from '../../models/repo';
|
|||||||
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
||||||
import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
|
import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
|
||||||
import CreateDepartmentRepoDialog from '../../components/dialog/create-department-repo-dialog';
|
import CreateDepartmentRepoDialog from '../../components/dialog/create-department-repo-dialog';
|
||||||
|
import DismissGroupDialog from '../../components/dialog/dismiss-group-dialog';
|
||||||
|
import RenameGroupDialog from '../../components/dialog/rename-group-dialog';
|
||||||
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
|
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
onShowSidePanel: PropTypes.func.isRequired,
|
onShowSidePanel: PropTypes.func.isRequired,
|
||||||
onSearchedClick: PropTypes.func.isRequired,
|
onSearchedClick: PropTypes.func.isRequired,
|
||||||
|
onGroupChanged: PropTypes.func.isRequired,
|
||||||
|
groupID: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DEPARETMENT_GROUP_ONWER_NAME = 'system admin';
|
const DEPARETMENT_GROUP_ONWER_NAME = 'system admin';
|
||||||
@ -33,7 +38,10 @@ class GroupView extends React.Component {
|
|||||||
libraryType: 'group',
|
libraryType: 'group',
|
||||||
isCreateRepoDialogShow: false,
|
isCreateRepoDialogShow: false,
|
||||||
isDepartmentGroup: false,
|
isDepartmentGroup: false,
|
||||||
}
|
showGroupDropdown: false,
|
||||||
|
showRenameGroupDialog: false,
|
||||||
|
showDismissGroupDialog: false,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
@ -217,6 +225,24 @@ class GroupView extends React.Component {
|
|||||||
this.props.onTabNavClick(tabName);
|
this.props.onTabNavClick(tabName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleGroupDropdown = () => {
|
||||||
|
this.setState({
|
||||||
|
showGroupDropdown: !this.state.showGroupDropdown
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleDismissGroupDialog = () => {
|
||||||
|
this.setState({
|
||||||
|
showDismissGroupDialog: !this.state.showDismissGroupDialog
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleRenameGroupDialog = () => {
|
||||||
|
this.setState({
|
||||||
|
showRenameGroupDialog: !this.state.showRenameGroupDialog
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { errMessage, emptyTip, currentGroup } = this.state;
|
let { errMessage, emptyTip, currentGroup } = this.state;
|
||||||
let isShowSettingIcon = !(currentGroup && currentGroup.parent_group_id !== 0 && currentGroup.admins.indexOf(username) === -1);
|
let isShowSettingIcon = !(currentGroup && currentGroup.parent_group_id !== 0 && currentGroup.admins.indexOf(username) === -1);
|
||||||
@ -248,9 +274,28 @@ class GroupView extends React.Component {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="path-tool">
|
<div className="path-tool">
|
||||||
{isShowSettingIcon && (
|
{ isShowSettingIcon &&
|
||||||
<a href="#" className="sf2-icon-cog1 op-icon group-top-op-icon" title={gettext("Settings")} aria-label={gettext("Settings")}></a>
|
<React.Fragment>
|
||||||
)}
|
<a href="#" className="sf2-icon-cog1 op-icon group-top-op-icon" title="Settings" id="settings"
|
||||||
|
onClick={this.toggleGroupDropdown}></a>
|
||||||
|
<Popover placement="bottom" isOpen={this.state.showGroupDropdown} target="settings"
|
||||||
|
toggle={this.toggleGroupDropdown} hideArrow={true} className="sf-popover">
|
||||||
|
<div className="sf-popover-hd sf-popover-title">
|
||||||
|
<span>{gettext("Settings")}</span>
|
||||||
|
<a href="#" className="sf-popover-close js-close sf2-icon-x1 op-icon"
|
||||||
|
onClick={this.toggleGroupDropdown}></a>
|
||||||
|
</div>
|
||||||
|
<div className="sf-popover-con">
|
||||||
|
<ul className="sf-popover-list">
|
||||||
|
<li><a href="#" className="sf-popover-item" onClick={this.toggleRenameGroupDialog} >{gettext("Rename")}</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul className="sf-popover-list">
|
||||||
|
<li><a href="#" className="sf-popover-item" onClick={this.toggleDismissGroupDialog}>{gettext("Dismiss")}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</Popover>
|
||||||
|
</React.Fragment>
|
||||||
|
}
|
||||||
<a href="#" className="sf2-icon-user2 op-icon group-top-op-icon" title={gettext("Members")} aria-label={gettext("Members")}></a>
|
<a href="#" className="sf2-icon-user2 op-icon group-top-op-icon" title={gettext("Members")} aria-label={gettext("Members")}></a>
|
||||||
</div>
|
</div>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
@ -288,6 +333,24 @@ class GroupView extends React.Component {
|
|||||||
onCreateRepo={this.onCreateRepo}
|
onCreateRepo={this.onCreateRepo}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
{ this.state.showRenameGroupDialog &&
|
||||||
|
<RenameGroupDialog
|
||||||
|
showRenameGroupDialog={this.state.showRenameGroupDialog}
|
||||||
|
toggleRenameGroupDialog={this.toggleRenameGroupDialog}
|
||||||
|
loadGroup={this.loadGroup}
|
||||||
|
groupID={this.props.groupID}
|
||||||
|
onGroupChanged={this.props.onGroupChanged}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
{ this.state.showDismissGroupDialog &&
|
||||||
|
<DismissGroupDialog
|
||||||
|
showDismissGroupDialog={this.state.showDismissGroupDialog}
|
||||||
|
toggleDismissGroupDialog={this.toggleDismissGroupDialog}
|
||||||
|
loadGroup={this.loadGroup}
|
||||||
|
groupID={this.props.groupID}
|
||||||
|
onGroupChanged={this.props.onGroupChanged}
|
||||||
|
/>
|
||||||
|
}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -700,8 +700,7 @@ a.op-icon:focus {
|
|||||||
}
|
}
|
||||||
.sf-popover-hd {
|
.sf-popover-hd {
|
||||||
padding:5px 0 3px;
|
padding:5px 0 3px;
|
||||||
border-bottom:1px solid #dfdfe1;
|
margin: 10px;
|
||||||
margin:0 10px;
|
|
||||||
}
|
}
|
||||||
.sf-popover-title {
|
.sf-popover-title {
|
||||||
text-align:center;
|
text-align:center;
|
||||||
@ -710,11 +709,28 @@ a.op-icon:focus {
|
|||||||
font-size:16px;
|
font-size:16px;
|
||||||
color:#b9b9b9;
|
color:#b9b9b9;
|
||||||
margin:4px 0 0;
|
margin:4px 0 0;
|
||||||
|
float:right;
|
||||||
}
|
}
|
||||||
.sf-popover-con {
|
.sf-popover-con {
|
||||||
padding:0 10px;
|
padding:0 10px;
|
||||||
overflow:auto;
|
overflow:auto;
|
||||||
}
|
}
|
||||||
|
.sf-popover-list {
|
||||||
|
border-top: 1px solid #e3e3e5;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
a.sf-popover-item {
|
||||||
|
display:block;
|
||||||
|
color:#444;
|
||||||
|
font-weight:normal;
|
||||||
|
line-height:31px;
|
||||||
|
text-decoration:none;
|
||||||
|
padding:0 10px;
|
||||||
|
margin:5px -10px;
|
||||||
|
}
|
||||||
|
a.sf-popover-item:hover {
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
}
|
||||||
|
|
||||||
/* for go-back */
|
/* for go-back */
|
||||||
.go-back {
|
.go-back {
|
||||||
|
Loading…
Reference in New Issue
Block a user