🌐 feat: implement left-right pagination layout with i18n support
- Add left-right pagination layout for desktop (total info on left, controls on right) - Keep mobile layout centered with pagination controls only - Implement proper i18n support for pagination text using react-i18next - Add pagination translations for Chinese and English - Standardize t function usage across all table components to use xxxData.t pattern - Update CardPro footer layout to support justify-between on desktop - Use CSS variable --semi-color-text-2 for consistent text styling - Disable built-in Pagination showTotal to avoid duplication Components updated: - CardPro: Enhanced footer layout with responsive design - createCardProPagination: Added i18n support and custom total text - All table components: Unified t function usage pattern - i18n files: Added pagination-related translations The pagination now displays "Showing X to Y of Z items" on desktop and maintains existing centered layout on mobile devices.
This commit is contained in:
@@ -163,7 +163,10 @@ const CardPro = ({
|
|||||||
if (!paginationArea) return null;
|
if (!paginationArea) return null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex justify-center w-full pt-4 border-t" style={{ borderColor: 'var(--semi-color-border)' }}>
|
<div
|
||||||
|
className={`flex w-full pt-4 border-t ${isMobile ? 'justify-center' : 'justify-between items-center'}`}
|
||||||
|
style={{ borderColor: 'var(--semi-color-border)' }}
|
||||||
|
>
|
||||||
{paginationArea}
|
{paginationArea}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ const ChannelsPage = () => {
|
|||||||
onPageChange: channelsData.handlePageChange,
|
onPageChange: channelsData.handlePageChange,
|
||||||
onPageSizeChange: channelsData.handlePageSizeChange,
|
onPageSizeChange: channelsData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: channelsData.t,
|
||||||
})}
|
})}
|
||||||
t={channelsData.t}
|
t={channelsData.t}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ const MjLogsPage = () => {
|
|||||||
onPageChange: mjLogsData.handlePageChange,
|
onPageChange: mjLogsData.handlePageChange,
|
||||||
onPageSizeChange: mjLogsData.handlePageSizeChange,
|
onPageSizeChange: mjLogsData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: mjLogsData.t,
|
||||||
})}
|
})}
|
||||||
t={mjLogsData.t}
|
t={mjLogsData.t}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -109,8 +109,9 @@ const RedemptionsPage = () => {
|
|||||||
onPageChange: redemptionsData.handlePageChange,
|
onPageChange: redemptionsData.handlePageChange,
|
||||||
onPageSizeChange: redemptionsData.handlePageSizeChange,
|
onPageSizeChange: redemptionsData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: redemptionsData.t,
|
||||||
})}
|
})}
|
||||||
t={t}
|
t={redemptionsData.t}
|
||||||
>
|
>
|
||||||
<RedemptionsTable {...redemptionsData} />
|
<RedemptionsTable {...redemptionsData} />
|
||||||
</CardPro>
|
</CardPro>
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ const TaskLogsPage = () => {
|
|||||||
onPageChange: taskLogsData.handlePageChange,
|
onPageChange: taskLogsData.handlePageChange,
|
||||||
onPageSizeChange: taskLogsData.handlePageSizeChange,
|
onPageSizeChange: taskLogsData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: taskLogsData.t,
|
||||||
})}
|
})}
|
||||||
t={taskLogsData.t}
|
t={taskLogsData.t}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -111,8 +111,9 @@ const TokensPage = () => {
|
|||||||
onPageChange: tokensData.handlePageChange,
|
onPageChange: tokensData.handlePageChange,
|
||||||
onPageSizeChange: tokensData.handlePageSizeChange,
|
onPageSizeChange: tokensData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: tokensData.t,
|
||||||
})}
|
})}
|
||||||
t={t}
|
t={tokensData.t}
|
||||||
>
|
>
|
||||||
<TokensTable {...tokensData} />
|
<TokensTable {...tokensData} />
|
||||||
</CardPro>
|
</CardPro>
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ const LogsPage = () => {
|
|||||||
onPageChange: logsData.handlePageChange,
|
onPageChange: logsData.handlePageChange,
|
||||||
onPageSizeChange: logsData.handlePageSizeChange,
|
onPageSizeChange: logsData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: logsData.t,
|
||||||
})}
|
})}
|
||||||
t={logsData.t}
|
t={logsData.t}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -114,8 +114,9 @@ const UsersPage = () => {
|
|||||||
onPageChange: usersData.handlePageChange,
|
onPageChange: usersData.handlePageChange,
|
||||||
onPageSizeChange: usersData.handlePageSizeChange,
|
onPageSizeChange: usersData.handlePageSizeChange,
|
||||||
isMobile: isMobile,
|
isMobile: isMobile,
|
||||||
|
t: usersData.t,
|
||||||
})}
|
})}
|
||||||
t={t}
|
t={usersData.t}
|
||||||
>
|
>
|
||||||
<UsersTable {...usersData} />
|
<UsersTable {...usersData} />
|
||||||
</CardPro>
|
</CardPro>
|
||||||
|
|||||||
@@ -580,21 +580,39 @@ export const createCardProPagination = ({
|
|||||||
isMobile = false,
|
isMobile = false,
|
||||||
pageSizeOpts = [10, 20, 50, 100],
|
pageSizeOpts = [10, 20, 50, 100],
|
||||||
showSizeChanger = true,
|
showSizeChanger = true,
|
||||||
|
t = (key) => key,
|
||||||
}) => {
|
}) => {
|
||||||
if (!total || total <= 0) return null;
|
if (!total || total <= 0) return null;
|
||||||
|
|
||||||
|
const start = (currentPage - 1) * pageSize + 1;
|
||||||
|
const end = Math.min(currentPage * pageSize, total);
|
||||||
|
const totalText = `${t('显示第')} ${start} ${t('条 - 第')} ${end} ${t('条,共')} ${total} ${t('条')}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Pagination
|
<>
|
||||||
currentPage={currentPage}
|
{/* 桌面端左侧总数信息 */}
|
||||||
pageSize={pageSize}
|
{!isMobile && (
|
||||||
total={total}
|
<span
|
||||||
pageSizeOpts={pageSizeOpts}
|
className="text-sm select-none"
|
||||||
showSizeChanger={showSizeChanger}
|
style={{ color: 'var(--semi-color-text-2)' }}
|
||||||
onPageSizeChange={onPageSizeChange}
|
>
|
||||||
onPageChange={onPageChange}
|
{totalText}
|
||||||
size={isMobile ? "small" : "default"}
|
</span>
|
||||||
showQuickJumper={isMobile}
|
)}
|
||||||
showTotal
|
|
||||||
/>
|
{/* 右侧分页控件 */}
|
||||||
|
<Pagination
|
||||||
|
currentPage={currentPage}
|
||||||
|
pageSize={pageSize}
|
||||||
|
total={total}
|
||||||
|
pageSizeOpts={pageSizeOpts}
|
||||||
|
showSizeChanger={showSizeChanger}
|
||||||
|
onPageSizeChange={onPageSizeChange}
|
||||||
|
onPageChange={onPageChange}
|
||||||
|
size={isMobile ? "small" : "default"}
|
||||||
|
showQuickJumper={isMobile}
|
||||||
|
showTotal
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1783,5 +1783,9 @@
|
|||||||
"隐藏操作项": "Hide actions",
|
"隐藏操作项": "Hide actions",
|
||||||
"显示操作项": "Show actions",
|
"显示操作项": "Show actions",
|
||||||
"用户组": "User group",
|
"用户组": "User group",
|
||||||
"邀请获得额度": "Invitation quota"
|
"邀请获得额度": "Invitation quota",
|
||||||
|
"显示第": "Showing",
|
||||||
|
"条 - 第": "to",
|
||||||
|
"条,共": "of",
|
||||||
|
"条": "items"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user