UsersTable.jsx 4.6 KB

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