From 31e0b24e07ac974fd6e0282470b409692e73b027 Mon Sep 17 00:00:00 2001 From: Michael An <2331806369@qq.com> Date: Tue, 15 Apr 2025 13:46:17 +0800 Subject: [PATCH] 12.0 department set quota (#7736) * 01 system admin department set quota * 02 org admin department set quota --- .../dialog/org-set-group-quota-dialog.js | 9 +++-- .../sysadmin-set-group-quota-dialog.js | 9 +++-- .../org-admin/departments/department-node.js | 1 + .../pages/org-admin/departments/department.js | 1 + .../departments-node-dropdown-menu.js | 6 +++- .../departments/departments-tree-panel.js | 2 ++ .../org-admin/departments/departments.js | 35 +++++++++++++++++++ .../pages/org-admin/departments/tree-node.js | 3 ++ .../sys-admin/departments/department-node.js | 1 + .../pages/sys-admin/departments/department.js | 1 + .../departments-node-dropdown-menu.js | 6 +++- .../departments/departments-tree-panel.js | 2 ++ .../sys-admin/departments/departments.js | 35 +++++++++++++++++++ .../pages/sys-admin/departments/tree-node.js | 3 ++ 14 files changed, 108 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/dialog/org-set-group-quota-dialog.js b/frontend/src/components/dialog/org-set-group-quota-dialog.js index 4e55c66fa7..fd5311bc5f 100644 --- a/frontend/src/components/dialog/org-set-group-quota-dialog.js +++ b/frontend/src/components/dialog/org-set-group-quota-dialog.js @@ -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 ( {gettext('Set Quota')} +

{message}

+

{gettext('Please enter a new quota')}

{ + 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 ( {gettext('Set Quota')} +

{message}

+

{gettext('Please enter a new quota')}

toggleDelete(node)}> {gettext('Delete')} + toggleSetQuotaDialog(node)}> + {gettext('Set quota')} + {`${gettext('Department ID')} : ${node.id}`} @@ -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; diff --git a/frontend/src/pages/org-admin/departments/departments-tree-panel.js b/frontend/src/pages/org-admin/departments/departments-tree-panel.js index 060c2ac7a8..8783e0d666 100644 --- a/frontend/src/pages/org-admin/departments/departments-tree-panel.js +++ b/frontend/src/pages/org-admin/departments/departments-tree-panel.js @@ -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} diff --git a/frontend/src/pages/org-admin/departments/departments.js b/frontend/src/pages/org-admin/departments/departments.js index 5dccb308c1..093ebbe47c 100644 --- a/frontend/src/pages/org-admin/departments/departments.js +++ b/frontend/src/pages/org-admin/departments/departments.js @@ -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 && + + } ); } diff --git a/frontend/src/pages/org-admin/departments/tree-node.js b/frontend/src/pages/org-admin/departments/tree-node.js index 8f81f78d33..673b140136 100644 --- a/frontend/src/pages/org-admin/departments/tree-node.js +++ b/frontend/src/pages/org-admin/departments/tree-node.js @@ -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} /> diff --git a/frontend/src/pages/sys-admin/departments/department-node.js b/frontend/src/pages/sys-admin/departments/department-node.js index 47175b51cc..6df5412017 100644 --- a/frontend/src/pages/sys-admin/departments/department-node.js +++ b/frontend/src/pages/sys-admin/departments/department-node.js @@ -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) { diff --git a/frontend/src/pages/sys-admin/departments/department.js b/frontend/src/pages/sys-admin/departments/department.js index 7a7c0951e7..b727bf5742 100644 --- a/frontend/src/pages/sys-admin/departments/department.js +++ b/frontend/src/pages/sys-admin/departments/department.js @@ -155,6 +155,7 @@ class Department extends React.Component { toggleDelete(node)}> {gettext('Delete')} + toggleSetQuotaDialog(node)}> + {gettext('Set quota')} + {`${gettext('Department ID')} : ${node.id}`} @@ -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; diff --git a/frontend/src/pages/sys-admin/departments/departments-tree-panel.js b/frontend/src/pages/sys-admin/departments/departments-tree-panel.js index bd4eb7b275..8cbf164ce2 100644 --- a/frontend/src/pages/sys-admin/departments/departments-tree-panel.js +++ b/frontend/src/pages/sys-admin/departments/departments-tree-panel.js @@ -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} diff --git a/frontend/src/pages/sys-admin/departments/departments.js b/frontend/src/pages/sys-admin/departments/departments.js index ad33581872..8bdef4344f 100644 --- a/frontend/src/pages/sys-admin/departments/departments.js +++ b/frontend/src/pages/sys-admin/departments/departments.js @@ -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 && + + } ); } diff --git a/frontend/src/pages/sys-admin/departments/tree-node.js b/frontend/src/pages/sys-admin/departments/tree-node.js index 91d11a2f5a..28408d05a0 100644 --- a/frontend/src/pages/sys-admin/departments/tree-node.js +++ b/frontend/src/pages/sys-admin/departments/tree-node.js @@ -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 {