UsersTable.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import React, { useMemo, useState } from 'react';
  2. import { Empty } from '@douyinfe/semi-ui';
  3. import CardTable from '../../common/ui/CardTable.js';
  4. import {
  5. IllustrationNoResult,
  6. IllustrationNoResultDark
  7. } from '@douyinfe/semi-illustrations';
  8. import { getUsersColumns } from './UsersColumnDefs';
  9. import PromoteUserModal from './modals/PromoteUserModal';
  10. import DemoteUserModal from './modals/DemoteUserModal';
  11. import EnableDisableUserModal from './modals/EnableDisableUserModal';
  12. import DeleteUserModal from './modals/DeleteUserModal';
  13. const UsersTable = (usersData) => {
  14. const {
  15. users,
  16. loading,
  17. activePage,
  18. pageSize,
  19. userCount,
  20. compactMode,
  21. handlePageChange,
  22. handlePageSizeChange,
  23. handleRow,
  24. setEditingUser,
  25. setShowEditUser,
  26. manageUser,
  27. refresh,
  28. t,
  29. } = usersData;
  30. // Modal states
  31. const [showPromoteModal, setShowPromoteModal] = useState(false);
  32. const [showDemoteModal, setShowDemoteModal] = useState(false);
  33. const [showEnableDisableModal, setShowEnableDisableModal] = useState(false);
  34. const [showDeleteModal, setShowDeleteModal] = useState(false);
  35. const [modalUser, setModalUser] = useState(null);
  36. const [enableDisableAction, setEnableDisableAction] = useState('');
  37. // Modal handlers
  38. const showPromoteUserModal = (user) => {
  39. setModalUser(user);
  40. setShowPromoteModal(true);
  41. };
  42. const showDemoteUserModal = (user) => {
  43. setModalUser(user);
  44. setShowDemoteModal(true);
  45. };
  46. const showEnableDisableUserModal = (user, action) => {
  47. setModalUser(user);
  48. setEnableDisableAction(action);
  49. setShowEnableDisableModal(true);
  50. };
  51. const showDeleteUserModal = (user) => {
  52. setModalUser(user);
  53. setShowDeleteModal(true);
  54. };
  55. // Modal confirm handlers
  56. const handlePromoteConfirm = () => {
  57. manageUser(modalUser.id, 'promote', modalUser);
  58. setShowPromoteModal(false);
  59. };
  60. const handleDemoteConfirm = () => {
  61. manageUser(modalUser.id, 'demote', modalUser);
  62. setShowDemoteModal(false);
  63. };
  64. const handleEnableDisableConfirm = () => {
  65. manageUser(modalUser.id, enableDisableAction, modalUser);
  66. setShowEnableDisableModal(false);
  67. };
  68. // Get all columns
  69. const columns = useMemo(() => {
  70. return getUsersColumns({
  71. t,
  72. setEditingUser,
  73. setShowEditUser,
  74. showPromoteModal: showPromoteUserModal,
  75. showDemoteModal: showDemoteUserModal,
  76. showEnableDisableModal: showEnableDisableUserModal,
  77. showDeleteModal: showDeleteUserModal
  78. });
  79. }, [
  80. t,
  81. setEditingUser,
  82. setShowEditUser,
  83. ]);
  84. // Handle compact mode by removing fixed positioning
  85. const tableColumns = useMemo(() => {
  86. return compactMode ? columns.map(col => {
  87. if (col.dataIndex === 'operate') {
  88. const { fixed, ...rest } = col;
  89. return rest;
  90. }
  91. return col;
  92. }) : columns;
  93. }, [compactMode, columns]);
  94. return (
  95. <>
  96. <CardTable
  97. columns={tableColumns}
  98. dataSource={users}
  99. scroll={compactMode ? undefined : { x: 'max-content' }}
  100. pagination={{
  101. currentPage: activePage,
  102. pageSize: pageSize,
  103. total: userCount,
  104. pageSizeOpts: [10, 20, 50, 100],
  105. showSizeChanger: true,
  106. onPageSizeChange: handlePageSizeChange,
  107. onPageChange: handlePageChange,
  108. }}
  109. loading={loading}
  110. onRow={handleRow}
  111. empty={
  112. <Empty
  113. image={<IllustrationNoResult style={{ width: 150, height: 150 }} />}
  114. darkModeImage={<IllustrationNoResultDark style={{ width: 150, height: 150 }} />}
  115. description={t('搜索无结果')}
  116. style={{ padding: 30 }}
  117. />
  118. }
  119. className="overflow-hidden"
  120. size="middle"
  121. />
  122. {/* Modal components */}
  123. <PromoteUserModal
  124. visible={showPromoteModal}
  125. onCancel={() => setShowPromoteModal(false)}
  126. onConfirm={handlePromoteConfirm}
  127. user={modalUser}
  128. t={t}
  129. />
  130. <DemoteUserModal
  131. visible={showDemoteModal}
  132. onCancel={() => setShowDemoteModal(false)}
  133. onConfirm={handleDemoteConfirm}
  134. user={modalUser}
  135. t={t}
  136. />
  137. <EnableDisableUserModal
  138. visible={showEnableDisableModal}
  139. onCancel={() => setShowEnableDisableModal(false)}
  140. onConfirm={handleEnableDisableConfirm}
  141. user={modalUser}
  142. action={enableDisableAction}
  143. t={t}
  144. />
  145. <DeleteUserModal
  146. visible={showDeleteModal}
  147. onCancel={() => setShowDeleteModal(false)}
  148. user={modalUser}
  149. users={users}
  150. activePage={activePage}
  151. refresh={refresh}
  152. manageUser={manageUser}
  153. t={t}
  154. />
  155. </>
  156. );
  157. };
  158. export default UsersTable;