|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React from 'react'; |
|
|
import { |
|
|
Button, |
|
|
Dropdown, |
|
|
Modal, |
|
|
Switch, |
|
|
Typography, |
|
|
Select, |
|
|
} from '@douyinfe/semi-ui'; |
|
|
import CompactModeToggle from '../../common/ui/CompactModeToggle'; |
|
|
|
|
|
const ChannelsActions = ({ |
|
|
enableBatchDelete, |
|
|
batchDeleteChannels, |
|
|
setShowBatchSetTag, |
|
|
testAllChannels, |
|
|
fixChannelsAbilities, |
|
|
updateAllChannelsBalance, |
|
|
deleteAllDisabledChannels, |
|
|
compactMode, |
|
|
setCompactMode, |
|
|
idSort, |
|
|
setIdSort, |
|
|
setEnableBatchDelete, |
|
|
enableTagMode, |
|
|
setEnableTagMode, |
|
|
statusFilter, |
|
|
setStatusFilter, |
|
|
getFormValues, |
|
|
loadChannels, |
|
|
searchChannels, |
|
|
activeTypeKey, |
|
|
activePage, |
|
|
pageSize, |
|
|
setActivePage, |
|
|
t, |
|
|
}) => { |
|
|
return ( |
|
|
<div className='flex flex-col gap-2'> |
|
|
{/* 第一行:批量操作按钮 + 设置开关 */} |
|
|
<div className='flex flex-col md:flex-row justify-between gap-2'> |
|
|
{/* 左侧:批量操作按钮 */} |
|
|
<div className='flex flex-wrap md:flex-nowrap items-center gap-2 w-full md:w-auto order-2 md:order-1'> |
|
|
<Button |
|
|
size='small' |
|
|
disabled={!enableBatchDelete} |
|
|
type='danger' |
|
|
className='w-full md:w-auto' |
|
|
onClick={() => { |
|
|
Modal.confirm({ |
|
|
title: t('确定是否要删除所选通道?'), |
|
|
content: t('此修改将不可逆'), |
|
|
onOk: () => batchDeleteChannels(), |
|
|
}); |
|
|
}} |
|
|
> |
|
|
{t('删除所选通道')} |
|
|
</Button> |
|
|
|
|
|
<Button |
|
|
size='small' |
|
|
disabled={!enableBatchDelete} |
|
|
type='tertiary' |
|
|
onClick={() => setShowBatchSetTag(true)} |
|
|
className='w-full md:w-auto' |
|
|
> |
|
|
{t('批量设置标签')} |
|
|
</Button> |
|
|
|
|
|
<Dropdown |
|
|
size='small' |
|
|
trigger='click' |
|
|
render={ |
|
|
<Dropdown.Menu> |
|
|
<Dropdown.Item> |
|
|
<Button |
|
|
size='small' |
|
|
type='tertiary' |
|
|
className='w-full' |
|
|
onClick={() => { |
|
|
Modal.confirm({ |
|
|
title: t('确定?'), |
|
|
content: t('确定要测试所有通道吗?'), |
|
|
onOk: () => testAllChannels(), |
|
|
size: 'small', |
|
|
centered: true, |
|
|
}); |
|
|
}} |
|
|
> |
|
|
{t('测试所有通道')} |
|
|
</Button> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item> |
|
|
<Button |
|
|
size='small' |
|
|
className='w-full' |
|
|
onClick={() => { |
|
|
Modal.confirm({ |
|
|
title: t('确定是否要修复数据库一致性?'), |
|
|
content: t( |
|
|
'进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用', |
|
|
), |
|
|
onOk: () => fixChannelsAbilities(), |
|
|
size: 'sm', |
|
|
centered: true, |
|
|
}); |
|
|
}} |
|
|
> |
|
|
{t('修复数据库一致性')} |
|
|
</Button> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item> |
|
|
<Button |
|
|
size='small' |
|
|
type='secondary' |
|
|
className='w-full' |
|
|
onClick={() => { |
|
|
Modal.confirm({ |
|
|
title: t('确定?'), |
|
|
content: t('确定要更新所有已启用通道余额吗?'), |
|
|
onOk: () => updateAllChannelsBalance(), |
|
|
size: 'sm', |
|
|
centered: true, |
|
|
}); |
|
|
}} |
|
|
> |
|
|
{t('更新所有已启用通道余额')} |
|
|
</Button> |
|
|
</Dropdown.Item> |
|
|
<Dropdown.Item> |
|
|
<Button |
|
|
size='small' |
|
|
type='danger' |
|
|
className='w-full' |
|
|
onClick={() => { |
|
|
Modal.confirm({ |
|
|
title: t('确定是否要删除禁用通道?'), |
|
|
content: t('此修改将不可逆'), |
|
|
onOk: () => deleteAllDisabledChannels(), |
|
|
size: 'sm', |
|
|
centered: true, |
|
|
}); |
|
|
}} |
|
|
> |
|
|
{t('删除禁用通道')} |
|
|
</Button> |
|
|
</Dropdown.Item> |
|
|
</Dropdown.Menu> |
|
|
} |
|
|
> |
|
|
<Button |
|
|
size='small' |
|
|
theme='light' |
|
|
type='tertiary' |
|
|
className='w-full md:w-auto' |
|
|
> |
|
|
{t('批量操作')} |
|
|
</Button> |
|
|
</Dropdown> |
|
|
|
|
|
<CompactModeToggle |
|
|
compactMode={compactMode} |
|
|
setCompactMode={setCompactMode} |
|
|
t={t} |
|
|
/> |
|
|
</div> |
|
|
|
|
|
{/* 右侧:设置开关区域 */} |
|
|
<div className='flex flex-col md:flex-row items-start md:items-center gap-2 w-full md:w-auto order-1 md:order-2'> |
|
|
<div className='flex items-center justify-between w-full md:w-auto'> |
|
|
<Typography.Text strong className='mr-2'> |
|
|
{t('使用ID排序')} |
|
|
</Typography.Text> |
|
|
<Switch |
|
|
size='small' |
|
|
checked={idSort} |
|
|
onChange={(v) => { |
|
|
localStorage.setItem('id-sort', v + ''); |
|
|
setIdSort(v); |
|
|
const { searchKeyword, searchGroup, searchModel } = |
|
|
getFormValues(); |
|
|
if ( |
|
|
searchKeyword === '' && |
|
|
searchGroup === '' && |
|
|
searchModel === '' |
|
|
) { |
|
|
loadChannels(activePage, pageSize, v, enableTagMode); |
|
|
} else { |
|
|
searchChannels( |
|
|
enableTagMode, |
|
|
activeTypeKey, |
|
|
statusFilter, |
|
|
activePage, |
|
|
pageSize, |
|
|
v, |
|
|
); |
|
|
} |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
|
|
|
<div className='flex items-center justify-between w-full md:w-auto'> |
|
|
<Typography.Text strong className='mr-2'> |
|
|
{t('开启批量操作')} |
|
|
</Typography.Text> |
|
|
<Switch |
|
|
size='small' |
|
|
checked={enableBatchDelete} |
|
|
onChange={(v) => { |
|
|
localStorage.setItem('enable-batch-delete', v + ''); |
|
|
setEnableBatchDelete(v); |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
|
|
|
<div className='flex items-center justify-between w-full md:w-auto'> |
|
|
<Typography.Text strong className='mr-2'> |
|
|
{t('标签聚合模式')} |
|
|
</Typography.Text> |
|
|
<Switch |
|
|
size='small' |
|
|
checked={enableTagMode} |
|
|
onChange={(v) => { |
|
|
localStorage.setItem('enable-tag-mode', v + ''); |
|
|
setEnableTagMode(v); |
|
|
setActivePage(1); |
|
|
loadChannels(1, pageSize, idSort, v); |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
|
|
|
<div className='flex items-center justify-between w-full md:w-auto'> |
|
|
<Typography.Text strong className='mr-2'> |
|
|
{t('状态筛选')} |
|
|
</Typography.Text> |
|
|
<Select |
|
|
size='small' |
|
|
value={statusFilter} |
|
|
onChange={(v) => { |
|
|
localStorage.setItem('channel-status-filter', v); |
|
|
setStatusFilter(v); |
|
|
setActivePage(1); |
|
|
loadChannels( |
|
|
1, |
|
|
pageSize, |
|
|
idSort, |
|
|
enableTagMode, |
|
|
activeTypeKey, |
|
|
v, |
|
|
); |
|
|
}} |
|
|
> |
|
|
<Select.Option value='all'>{t('全部')}</Select.Option> |
|
|
<Select.Option value='enabled'>{t('已启用')}</Select.Option> |
|
|
<Select.Option value='disabled'>{t('已禁用')}</Select.Option> |
|
|
</Select> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default ChannelsActions; |
|
|
|