1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-04-27 19:05:16 +00:00

12.0 department set quota (#7736)

* 01 system admin department set quota

* 02 org admin department set quota
This commit is contained in:
Michael An 2025-04-15 13:46:17 +08:00 committed by GitHub
parent a1686622b3
commit 31e0b24e07
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 108 additions and 6 deletions

View File

@ -9,7 +9,7 @@ import toaster from '../toast';
const propTypes = {
toggle: PropTypes.func.isRequired,
groupID: PropTypes.number.isRequired,
group: PropTypes.object.isRequired,
onSetQuota: PropTypes.func.isRequired,
};
@ -29,7 +29,7 @@ class SetGroupQuotaDialog extends React.Component {
if ((quota.length && myReg.test(quota)) || quota == -2) {
this.setState({ errMessage: '' });
let newQuota = this.state.quota == -2 ? this.state.quota : this.state.quota * 1000000;
orgAdminAPI.orgAdminSetGroupQuota(orgID, this.props.groupID, newQuota).then((res) => {
orgAdminAPI.orgAdminSetGroupQuota(orgID, this.props.group.id, newQuota).then((res) => {
this.props.toggle();
this.props.onSetQuota(res.data);
}).catch(error => {
@ -55,10 +55,15 @@ class SetGroupQuotaDialog extends React.Component {
};
render() {
const group = this.props.group;
const oldQuota = Utils.bytesToSize(group.quota);
const message = gettext('The current quota for {group_name} is {quota}').replace('{group_name}', group.name).replace('{quota}', oldQuota);
return (
<Modal isOpen={true} toggle={this.props.toggle} autoFocus={false}>
<SeahubModalHeader toggle={this.props.toggle}>{gettext('Set Quota')}</SeahubModalHeader>
<ModalBody>
<p>{message}</p>
<p>{gettext('Please enter a new quota')}</p>
<InputGroup>
<Input
onKeyDown={this.handleKeyDown}

View File

@ -9,7 +9,7 @@ import SeahubModalHeader from '@/components/common/seahub-modal-header';
const propTypes = {
toggle: PropTypes.func.isRequired,
groupID: PropTypes.number.isRequired,
group: PropTypes.object.isRequired,
onSetQuota: PropTypes.func.isRequired,
};
@ -29,7 +29,7 @@ class SetGroupQuotaDialog extends React.Component {
if ((quota.length && numberReg.test(quota)) || quota == -2) {
this.setState({ errMessage: '' });
let newQuota = this.state.quota == -2 ? this.state.quota : this.state.quota * 1000000;
systemAdminAPI.sysAdminUpdateDepartmentQuota(this.props.groupID, newQuota).then((res) => {
systemAdminAPI.sysAdminUpdateDepartmentQuota(this.props.group.id, newQuota).then((res) => {
this.props.toggle();
this.props.onSetQuota(res.data);
}).catch(error => {
@ -55,10 +55,15 @@ class SetGroupQuotaDialog extends React.Component {
};
render() {
const group = this.props.group;
const oldQuota = Utils.bytesToSize(group.quota);
const message = gettext('The current quota for {group_name} is {quota}').replace('{group_name}', group.name).replace('{quota}', oldQuota);
return (
<Modal isOpen={true} toggle={this.props.toggle} autoFocus={false}>
<SeahubModalHeader toggle={this.props.toggle}>{gettext('Set Quota')}</SeahubModalHeader>
<ModalBody>
<p>{message}</p>
<p>{gettext('Please enter a new quota')}</p>
<InputGroup>
<Input
onKeyDown={this.handleKeyDown}

View File

@ -6,6 +6,7 @@ class DepartmentNode {
this.children = props.children || [];
this.parentNode = props.parentNode || null;
this.orgId = props.orgId || '';
this.quota = props.quota || -2;
}
findNodeById(nodeId) {

View File

@ -132,6 +132,7 @@ class Department extends React.Component {
<DepartmentNodeMenu
node={currentDepartment}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { DropdownItem, DropdownMenu } from 'reactstrap';
import { gettext } from '../../../utils/constants';
function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers, toggleAddDepartment, toggleAddLibrary }) {
function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers, toggleAddDepartment, toggleAddLibrary, toggleSetQuotaDialog }) {
return (
<DropdownMenu
modifiers={{ preventOverflow: { boundariesElement: document.body } }}
@ -24,6 +24,9 @@ function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers
<DropdownItem key={`${node.id}-delete`} onClick={() => toggleDelete(node)}>
{gettext('Delete')}
</DropdownItem>
<DropdownItem key={`${node.id}-set-quota`} onClick={() => toggleSetQuotaDialog(node)}>
{gettext('Set quota')}
</DropdownItem>
<DropdownItem key={`${node.id}-id`} disabled={true}>
{`${gettext('Department ID')} : ${node.id}`}
</DropdownItem>
@ -38,6 +41,7 @@ DepartmentNodeMenu.propTypes = {
toggleAddMembers: PropTypes.func.isRequired,
toggleAddDepartment: PropTypes.func.isRequired,
toggleAddLibrary: PropTypes.func.isRequired,
toggleSetQuotaDialog: PropTypes.func.isRequired,
};
export default DepartmentNodeMenu;

View File

@ -9,6 +9,7 @@ const DepartmentsTreePanelPropTypes = {
onChangeDepartment: PropTypes.func,
listSubDepartments: PropTypes.func,
toggleAddDepartment: PropTypes.func,
toggleSetQuotaDialog: PropTypes.func,
toggleAddLibrary: PropTypes.func,
toggleAddMembers: PropTypes.func,
toggleRename: PropTypes.func,
@ -29,6 +30,7 @@ class DepartmentsTreePanel extends Component {
onChangeDepartment={this.props.onChangeDepartment}
listSubDepartments={this.props.listSubDepartments}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}

View File

@ -4,6 +4,7 @@ import { Utils } from '../../../utils/utils';
import { gettext, orgID } from '../../../utils/constants';
import { orgAdminAPI } from '../../../utils/org-admin-api';
import toaster from '../../../components/toast';
import SetGroupQuotaDialog from '../../../components/dialog/org-set-group-quota-dialog';
import AddDepartmentDialog from '../../../components/dialog/sysadmin-dialog/add-department-v2-dialog';
import AddDepartMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-depart-member-v2-dialog';
import RenameDepartmentDialog from '../../../components/dialog/sysadmin-dialog/rename-department-v2-dialog';
@ -30,6 +31,7 @@ class Departments extends React.Component {
isRenameDepartmentDialogShow: false,
isDeleteDepartmentDialogShow: false,
isShowAddRepoDialog: false,
isSetQuotaDialogShow: false,
membersList: [],
isTopDepartmentLoading: false,
isMembersListLoading: false,
@ -48,6 +50,7 @@ class Departments extends React.Component {
id: item.id,
name: item.name,
orgId: item.org_id,
quota: item.quota,
});
return node;
});
@ -102,6 +105,7 @@ class Departments extends React.Component {
parentGroupId: department.parent_group_id,
orgId: department.org_id,
parentNode: node,
quota: department.quota,
}));
node.setChildren(childrenNodes);
cb && cb(childrenNodes);
@ -285,6 +289,28 @@ class Departments extends React.Component {
});
};
toggleSetQuotaDialog = (node) => {
this.setState({ operateNode: node, isSetQuotaDialogShow: !this.state.isSetQuotaDialogShow });
};
onSetQuota = (newNode) => {
const rootNodes = this.state.rootNodes.slice(0);
this._setQuota(rootNodes[0], newNode);
this.setState({
rootNodes: rootNodes
});
};
_setQuota = (node, newNode) => {
if (node.id === newNode.id) {
node.quota = newNode.quota;
} else {
node.children.forEach(child => {
this._setQuota(child, newNode);
});
}
};
render() {
const { rootNodes, operateNode, checkedDepartmentId, isAddDepartmentDialogShow, isAddMembersDialogShow,
@ -308,6 +334,7 @@ class Departments extends React.Component {
onChangeDepartment={this.onChangeDepartment}
listSubDepartments={this.listSubDepartments}
toggleAddDepartment={this.toggleAddDepartment}
toggleSetQuotaDialog={this.toggleSetQuotaDialog}
toggleAddLibrary={this.toggleAddLibrary}
toggleAddMembers={this.toggleAddMembers}
toggleRename={this.toggleRename}
@ -328,6 +355,7 @@ class Departments extends React.Component {
deleteGroup={this.deleteGroup}
createGroup={this.createGroup}
toggleAddDepartment={this.toggleAddDepartment}
toggleSetQuotaDialog={this.toggleSetQuotaDialog}
toggleAddLibrary={this.toggleAddLibrary}
toggleAddMembers={this.toggleAddMembers}
toggleRename={this.toggleRename}
@ -384,6 +412,13 @@ class Departments extends React.Component {
groupID={String(operateNode.id)}
/>
)}
{this.state.isSetQuotaDialogShow &&
<SetGroupQuotaDialog
group={operateNode}
onSetQuota={this.onSetQuota}
toggle={this.toggleSetQuotaDialog}
/>
}
</Fragment>
);
}

View File

@ -11,6 +11,7 @@ const departmentsV2TreeNodePropTypes = {
listSubDepartments: PropTypes.func,
onChangeDepartment: PropTypes.func,
toggleAddDepartment: PropTypes.func,
toggleSetQuotaDialog: PropTypes.func,
toggleAddLibrary: PropTypes.func,
toggleAddMembers: PropTypes.func,
toggleRename: PropTypes.func,
@ -85,6 +86,7 @@ class DepartmentsV2TreeNode extends Component {
toggleRename={this.props.toggleRename}
toggleDelete={this.props.toggleDelete}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
/>
);
});
@ -151,6 +153,7 @@ class DepartmentsV2TreeNode extends Component {
toggleAddDepartment={this.props.toggleAddDepartment}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleRename={this.props.toggleRename}
toggleDelete={this.props.toggleDelete}
/>

View File

@ -6,6 +6,7 @@ class DepartmentNode {
this.children = props.children || [];
this.parentNode = props.parentNode || null;
this.orgId = props.orgId || '';
this.quota = props.quota || -2;
}
findNodeById(nodeId) {

View File

@ -155,6 +155,7 @@ class Department extends React.Component {
<DepartmentNodeMenu
node={currentDepartment}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { DropdownItem, DropdownMenu } from 'reactstrap';
import { gettext } from '../../../utils/constants';
function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers, toggleAddDepartment, toggleAddLibrary }) {
function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers, toggleAddDepartment, toggleAddLibrary, toggleSetQuotaDialog }) {
return (
<DropdownMenu
modifiers={{ preventOverflow: { boundariesElement: document.body } }}
@ -24,6 +24,9 @@ function DepartmentNodeMenu({ node, toggleDelete, toggleRename, toggleAddMembers
<DropdownItem key={`${node.id}-delete`} onClick={() => toggleDelete(node)}>
{gettext('Delete')}
</DropdownItem>
<DropdownItem key={`${node.id}-set-quota`} onClick={() => toggleSetQuotaDialog(node)}>
{gettext('Set quota')}
</DropdownItem>
<DropdownItem key={`${node.id}-id`} disabled={true}>
{`${gettext('Department ID')} : ${node.id}`}
</DropdownItem>
@ -38,6 +41,7 @@ DepartmentNodeMenu.propTypes = {
toggleAddMembers: PropTypes.func.isRequired,
toggleAddDepartment: PropTypes.func.isRequired,
toggleAddLibrary: PropTypes.func.isRequired,
toggleSetQuotaDialog: PropTypes.func.isRequired,
};
export default DepartmentNodeMenu;

View File

@ -9,6 +9,7 @@ const DepartmentsTreePanelPropTypes = {
onChangeDepartment: PropTypes.func,
listSubDepartments: PropTypes.func,
toggleAddDepartment: PropTypes.func,
toggleSetQuotaDialog: PropTypes.func,
toggleAddLibrary: PropTypes.func,
toggleAddMembers: PropTypes.func,
toggleRename: PropTypes.func,
@ -29,6 +30,7 @@ class DepartmentsTreePanel extends Component {
onChangeDepartment={this.props.onChangeDepartment}
listSubDepartments={this.props.listSubDepartments}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}

View File

@ -5,6 +5,7 @@ import { Utils } from '../../../utils/utils';
import { systemAdminAPI } from '../../../utils/system-admin-api';
import Loading from '../../../components/loading';
import toaster from '../../../components/toast';
import SetGroupQuotaDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-set-group-quota-dialog';
import AddDepartmentV2Dialog from '../../../components/dialog/sysadmin-dialog/add-department-v2-dialog';
import AddDepartMemberV2Dialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-depart-member-v2-dialog';
import RenameDepartmentV2Dialog from '../../../components/dialog/sysadmin-dialog/rename-department-v2-dialog';
@ -25,6 +26,7 @@ class Departments extends React.Component {
rootNodes: [],
checkedDepartmentId: -1,
operateNode: null,
isSetQuotaDialogShow: false,
isAddDepartmentDialogShow: false,
isAddMembersDialogShow: false,
isRenameDepartmentDialogShow: false,
@ -51,6 +53,7 @@ class Departments extends React.Component {
id: item.id,
name: item.name,
orgId: item.org_id,
quota: item.quota,
});
return node;
});
@ -135,6 +138,7 @@ class Departments extends React.Component {
parentGroupId: department.parent_group_id,
orgId: department.org_id,
parentNode: node,
quota: department.quota,
}));
node.setChildren(childrenNodes);
cb && cb(childrenNodes);
@ -168,6 +172,10 @@ class Departments extends React.Component {
this.setState({ operateNode: node, isAddDepartmentDialogShow: !this.state.isAddDepartmentDialogShow });
};
toggleSetQuotaDialog = (node) => {
this.setState({ operateNode: node, isSetQuotaDialogShow: !this.state.isSetQuotaDialogShow });
};
toggleAddMembers = (node) => {
this.setState({ operateNode: node, isAddMembersDialogShow: !this.state.isAddMembersDialogShow });
};
@ -318,6 +326,24 @@ class Departments extends React.Component {
});
};
onSetQuota = (newNode) => {
const rootNodes = this.state.rootNodes.slice(0);
this._setQuota(rootNodes[0], newNode);
this.setState({
rootNodes: rootNodes
});
};
_setQuota = (node, newNode) => {
if (node.id === newNode.id) {
node.quota = newNode.quota;
} else {
node.children.forEach(child => {
this._setQuota(child, newNode);
});
}
};
render() {
const { rootNodes, operateNode, checkedDepartmentId, isAddDepartmentDialogShow, isAddMembersDialogShow,
@ -341,6 +367,7 @@ class Departments extends React.Component {
onChangeDepartment={this.onChangeDepartment}
listSubDepartments={this.listSubDepartments}
toggleAddDepartment={this.toggleAddDepartment}
toggleSetQuotaDialog={this.toggleSetQuotaDialog}
toggleAddLibrary={this.toggleAddLibrary}
toggleAddMembers={this.toggleAddMembers}
toggleRename={this.toggleRename}
@ -361,6 +388,7 @@ class Departments extends React.Component {
deleteGroup={this.deleteGroup}
createGroup={this.createGroup}
toggleAddDepartment={this.toggleAddDepartment}
toggleSetQuotaDialog={this.toggleSetQuotaDialog}
toggleAddLibrary={this.toggleAddLibrary}
toggleAddMembers={this.toggleAddMembers}
toggleRename={this.toggleRename}
@ -419,6 +447,13 @@ class Departments extends React.Component {
groupID={String(operateNode.id)}
/>
)}
{this.state.isSetQuotaDialogShow &&
<SetGroupQuotaDialog
group={operateNode}
onSetQuota={this.onSetQuota}
toggle={this.toggleSetQuotaDialog}
/>
}
</Fragment>
);
}

View File

@ -11,6 +11,7 @@ const departmentsTreeNodePropTypes = {
listSubDepartments: PropTypes.func,
onChangeDepartment: PropTypes.func,
toggleAddDepartment: PropTypes.func,
toggleSetQuotaDialog: PropTypes.func,
toggleAddLibrary: PropTypes.func,
toggleAddMembers: PropTypes.func,
toggleRename: PropTypes.func,
@ -81,6 +82,7 @@ class DepartmentsTreeNode extends Component {
checkedDepartmentId={this.props.checkedDepartmentId}
listSubDepartments={this.props.listSubDepartments}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}
toggleDelete={this.props.toggleDelete}
@ -149,6 +151,7 @@ class DepartmentsTreeNode extends Component {
<DepartmentNodeMenu
node={node}
toggleAddDepartment={this.props.toggleAddDepartment}
toggleSetQuotaDialog={this.props.toggleSetQuotaDialog}
toggleAddLibrary={this.props.toggleAddLibrary}
toggleAddMembers={this.props.toggleAddMembers}
toggleRename={this.props.toggleRename}