ChannelsTable.jsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, { useMemo } 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 { getChannelsColumns } from './ChannelsColumnDefs.js';
  9. const ChannelsTable = (channelsData) => {
  10. const {
  11. channels,
  12. loading,
  13. searching,
  14. activePage,
  15. pageSize,
  16. channelCount,
  17. enableBatchDelete,
  18. compactMode,
  19. visibleColumns,
  20. setSelectedChannels,
  21. handlePageChange,
  22. handlePageSizeChange,
  23. handleRow,
  24. t,
  25. COLUMN_KEYS,
  26. // Column functions and data
  27. updateChannelBalance,
  28. manageChannel,
  29. manageTag,
  30. submitTagEdit,
  31. testChannel,
  32. setCurrentTestChannel,
  33. setShowModelTestModal,
  34. setEditingChannel,
  35. setShowEdit,
  36. setShowEditTag,
  37. setEditingTag,
  38. copySelectedChannel,
  39. refresh,
  40. } = channelsData;
  41. // Get all columns
  42. const allColumns = useMemo(() => {
  43. return getChannelsColumns({
  44. t,
  45. COLUMN_KEYS,
  46. updateChannelBalance,
  47. manageChannel,
  48. manageTag,
  49. submitTagEdit,
  50. testChannel,
  51. setCurrentTestChannel,
  52. setShowModelTestModal,
  53. setEditingChannel,
  54. setShowEdit,
  55. setShowEditTag,
  56. setEditingTag,
  57. copySelectedChannel,
  58. refresh,
  59. activePage,
  60. channels,
  61. });
  62. }, [
  63. t,
  64. COLUMN_KEYS,
  65. updateChannelBalance,
  66. manageChannel,
  67. manageTag,
  68. submitTagEdit,
  69. testChannel,
  70. setCurrentTestChannel,
  71. setShowModelTestModal,
  72. setEditingChannel,
  73. setShowEdit,
  74. setShowEditTag,
  75. setEditingTag,
  76. copySelectedChannel,
  77. refresh,
  78. activePage,
  79. channels,
  80. ]);
  81. // Filter columns based on visibility settings
  82. const getVisibleColumns = () => {
  83. return allColumns.filter((column) => visibleColumns[column.key]);
  84. };
  85. const visibleColumnsList = useMemo(() => {
  86. return getVisibleColumns();
  87. }, [visibleColumns, allColumns]);
  88. const tableColumns = useMemo(() => {
  89. return compactMode
  90. ? visibleColumnsList.map(({ fixed, ...rest }) => rest)
  91. : visibleColumnsList;
  92. }, [compactMode, visibleColumnsList]);
  93. return (
  94. <CardTable
  95. columns={tableColumns}
  96. dataSource={channels}
  97. scroll={compactMode ? undefined : { x: 'max-content' }}
  98. pagination={{
  99. currentPage: activePage,
  100. pageSize: pageSize,
  101. total: channelCount,
  102. pageSizeOpts: [10, 20, 50, 100],
  103. showSizeChanger: true,
  104. onPageSizeChange: handlePageSizeChange,
  105. onPageChange: handlePageChange,
  106. }}
  107. expandAllRows={false}
  108. onRow={handleRow}
  109. rowSelection={
  110. enableBatchDelete
  111. ? {
  112. onChange: (selectedRowKeys, selectedRows) => {
  113. setSelectedChannels(selectedRows);
  114. },
  115. }
  116. : null
  117. }
  118. empty={
  119. <Empty
  120. image={<IllustrationNoResult style={{ width: 150, height: 150 }} />}
  121. darkModeImage={<IllustrationNoResultDark style={{ width: 150, height: 150 }} />}
  122. description={t('搜索无结果')}
  123. style={{ padding: 30 }}
  124. />
  125. }
  126. className="rounded-xl overflow-hidden"
  127. size="middle"
  128. loading={loading || searching}
  129. />
  130. );
  131. };
  132. export default ChannelsTable;