RolePermDrawer.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { PermTree } from '@/pages/Admin/_shared/PermTree';
  2. import { fetchPermList } from '@/services/perm';
  3. import { fetchBindRolePerms, fetchRoleDetail } from '@/services/role';
  4. import { Button, Drawer, Spin, message } from 'antd';
  5. import { useEffect, useState } from 'react';
  6. interface RolePermDrawerProps {
  7. roleId: number;
  8. productCode: string;
  9. open: boolean;
  10. onClose: () => void;
  11. }
  12. export const RolePermDrawer = ({ roleId, productCode, open, onClose }: RolePermDrawerProps) => {
  13. const [loading, setLoading] = useState(false);
  14. const [saving, setSaving] = useState(false);
  15. const [allPerms, setAllPerms] = useState<API.PermItem[]>([]);
  16. const [checkedIds, setCheckedIds] = useState<number[]>([]);
  17. useEffect(() => {
  18. if (!open) return;
  19. setLoading(true);
  20. Promise.all([fetchRoleDetail({ id: roleId }), fetchPermList({ productCode, pageSize: 9999 })])
  21. .then(([roleRes, permRes]) => {
  22. setAllPerms(permRes.data ?? []);
  23. setCheckedIds(roleRes.data?.permIds ?? []);
  24. })
  25. .finally(() => setLoading(false));
  26. }, [open, roleId, productCode]);
  27. const handleSave = async () => {
  28. setSaving(true);
  29. try {
  30. await fetchBindRolePerms({ roleId, permIds: checkedIds });
  31. message.success('保存成功');
  32. onClose();
  33. } finally {
  34. setSaving(false);
  35. }
  36. };
  37. return (
  38. <Drawer
  39. title="绑定权限"
  40. open={open}
  41. onClose={onClose}
  42. width={560}
  43. extra={
  44. <Button type="primary" loading={saving} onClick={handleSave}>
  45. 保存
  46. </Button>
  47. }
  48. >
  49. <Spin spinning={loading}>
  50. <PermTree
  51. mode="edit"
  52. allPerms={allPerms}
  53. checkedPermIds={checkedIds}
  54. onChange={setCheckedIds}
  55. />
  56. </Spin>
  57. </Drawer>
  58. );
  59. };