|
|
@@ -165,15 +165,15 @@ function gbToBytes(gb: number | undefined): number {
|
|
|
}
|
|
|
|
|
|
const SORT_OPTIONS: { value: string; column: string; order: 'ascend' | 'descend'; labelKey: string }[] = [
|
|
|
- { value: 'createdAt:ascend', column: 'createdAt', order: 'ascend', labelKey: 'pages.clients.sortOldest' },
|
|
|
- { value: 'createdAt:descend', column: 'createdAt', order: 'descend', labelKey: 'pages.clients.sortNewest' },
|
|
|
- { value: 'updatedAt:descend', column: 'updatedAt', order: 'descend', labelKey: 'pages.clients.sortRecentlyUpdated' },
|
|
|
- { value: 'lastOnline:descend', column: 'lastOnline', order: 'descend', labelKey: 'pages.clients.sortRecentlyOnline' },
|
|
|
- { value: 'email:ascend', column: 'email', order: 'ascend', labelKey: 'pages.clients.sortEmailAZ' },
|
|
|
- { value: 'email:descend', column: 'email', order: 'descend', labelKey: 'pages.clients.sortEmailZA' },
|
|
|
- { value: 'traffic:descend', column: 'traffic', order: 'descend', labelKey: 'pages.clients.sortMostTraffic' },
|
|
|
- { value: 'remaining:descend', column: 'remaining', order: 'descend', labelKey: 'pages.clients.sortHighestRemaining' },
|
|
|
- { value: 'expiryTime:ascend', column: 'expiryTime', order: 'ascend', labelKey: 'pages.clients.sortExpiringSoonest' },
|
|
|
+ { value: 'createdAt:ascend', column: 'createdAt', order: 'ascend', labelKey: 'pages.clients.sortOldest' },
|
|
|
+ { value: 'createdAt:descend', column: 'createdAt', order: 'descend', labelKey: 'pages.clients.sortNewest' },
|
|
|
+ { value: 'updatedAt:descend', column: 'updatedAt', order: 'descend', labelKey: 'pages.clients.sortRecentlyUpdated' },
|
|
|
+ { value: 'lastOnline:descend', column: 'lastOnline', order: 'descend', labelKey: 'pages.clients.sortRecentlyOnline' },
|
|
|
+ { value: 'email:ascend', column: 'email', order: 'ascend', labelKey: 'pages.clients.sortEmailAZ' },
|
|
|
+ { value: 'email:descend', column: 'email', order: 'descend', labelKey: 'pages.clients.sortEmailZA' },
|
|
|
+ { value: 'traffic:descend', column: 'traffic', order: 'descend', labelKey: 'pages.clients.sortMostTraffic' },
|
|
|
+ { value: 'remaining:descend', column: 'remaining', order: 'descend', labelKey: 'pages.clients.sortHighestRemaining' },
|
|
|
+ { value: 'expiryTime:ascend', column: 'expiryTime', order: 'ascend', labelKey: 'pages.clients.sortExpiringSoonest' },
|
|
|
];
|
|
|
|
|
|
const DEFAULT_SORT = SORT_OPTIONS[0];
|
|
|
@@ -743,6 +743,7 @@ export default function ClientsPage() {
|
|
|
{
|
|
|
title: t('pages.clients.traffic'),
|
|
|
key: 'traffic',
|
|
|
+ width: 300,
|
|
|
render: (_v, record) => (
|
|
|
<ClientTrafficCell
|
|
|
up={record.traffic?.up}
|
|
|
@@ -924,40 +925,40 @@ export default function ClientsPage() {
|
|
|
menu={{
|
|
|
items: selectedRowKeys.length > 0
|
|
|
? [
|
|
|
- {
|
|
|
- key: 'adjust',
|
|
|
- icon: <ClockCircleOutlined />,
|
|
|
- label: t('pages.clients.adjust'),
|
|
|
- onClick: () => setBulkAdjustOpen(true),
|
|
|
- },
|
|
|
- {
|
|
|
- key: 'subLinks',
|
|
|
- icon: <LinkOutlined />,
|
|
|
- label: t('pages.clients.subLinks'),
|
|
|
- onClick: () => setSubLinksOpen(true),
|
|
|
- },
|
|
|
- ]
|
|
|
+ {
|
|
|
+ key: 'adjust',
|
|
|
+ icon: <ClockCircleOutlined />,
|
|
|
+ label: t('pages.clients.adjust'),
|
|
|
+ onClick: () => setBulkAdjustOpen(true),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'subLinks',
|
|
|
+ icon: <LinkOutlined />,
|
|
|
+ label: t('pages.clients.subLinks'),
|
|
|
+ onClick: () => setSubLinksOpen(true),
|
|
|
+ },
|
|
|
+ ]
|
|
|
: [
|
|
|
- {
|
|
|
- key: 'bulk',
|
|
|
- icon: <UsergroupAddOutlined />,
|
|
|
- label: t('pages.clients.bulk'),
|
|
|
- onClick: () => setBulkAddOpen(true),
|
|
|
- },
|
|
|
- {
|
|
|
- key: 'resetAll',
|
|
|
- icon: <RetweetOutlined />,
|
|
|
- label: t('pages.clients.resetAllTraffics'),
|
|
|
- onClick: onResetAllTraffics,
|
|
|
- },
|
|
|
- {
|
|
|
- key: 'delDepleted',
|
|
|
- icon: <RestOutlined />,
|
|
|
- label: t('pages.clients.delDepleted'),
|
|
|
- danger: true,
|
|
|
- onClick: onDelDepleted,
|
|
|
- },
|
|
|
- ],
|
|
|
+ {
|
|
|
+ key: 'bulk',
|
|
|
+ icon: <UsergroupAddOutlined />,
|
|
|
+ label: t('pages.clients.bulk'),
|
|
|
+ onClick: () => setBulkAddOpen(true),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'resetAll',
|
|
|
+ icon: <RetweetOutlined />,
|
|
|
+ label: t('pages.clients.resetAllTraffics'),
|
|
|
+ onClick: onResetAllTraffics,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: 'delDepleted',
|
|
|
+ icon: <RestOutlined />,
|
|
|
+ label: t('pages.clients.delDepleted'),
|
|
|
+ danger: true,
|
|
|
+ onClick: onDelDepleted,
|
|
|
+ },
|
|
|
+ ],
|
|
|
}}
|
|
|
>
|
|
|
<Button icon={<MoreOutlined />}>
|
|
|
@@ -1246,6 +1247,7 @@ export default function ClientsPage() {
|
|
|
tgBotEnable={tgBotEnable}
|
|
|
groups={allGroups}
|
|
|
save={onSave}
|
|
|
+ resetTraffic={resetTraffic}
|
|
|
onOpenChange={setFormOpen}
|
|
|
/>
|
|
|
</LazyMount>
|