nili
5 months ago
1 changed files with 144 additions and 0 deletions
@ -0,0 +1,144 @@ |
|||
import { SearchOutlined } from '@ant-design/icons'; |
|||
import { ProColumns, ProTable } from '@ant-design/pro-components'; |
|||
import { Button, Input, Modal, Space } from 'antd'; |
|||
import { useEffect, useState } from 'react'; |
|||
|
|||
import { evilAppList } from '@/services/matrix/superAdmin'; |
|||
|
|||
export type LocalAppListProps = { |
|||
data: API.UserBo; |
|||
onClose: () => void; |
|||
}; |
|||
|
|||
interface LocalApp { |
|||
appName?: string; |
|||
packageName?: string; |
|||
evil: boolean; |
|||
} |
|||
|
|||
const LocalAppList: React.FC<LocalAppListProps> = (props) => { |
|||
const [appArr, setAppArr] = useState<LocalApp[]>(); |
|||
const [filteredAppArr, setFilteredAppArr] = useState<LocalApp[]>(); |
|||
|
|||
const columns: ProColumns<LocalApp>[] = [ |
|||
{ |
|||
title: '应用名', |
|||
dataIndex: 'appName', |
|||
ellipsis: true, |
|||
hideInSearch: true, |
|||
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( |
|||
<div style={{ padding: 8 }}> |
|||
<Input |
|||
placeholder="搜索应用" |
|||
value={selectedKeys[0]} |
|||
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])} |
|||
onPressEnter={() => confirm()} |
|||
style={{ marginBottom: 8, display: 'block' }} |
|||
/> |
|||
<Space> |
|||
<Button onClick={() => confirm()} type="primary"> |
|||
搜索 |
|||
</Button> |
|||
<Button onClick={() => clearFilters && clearFilters()} type="link"> |
|||
清除 |
|||
</Button> |
|||
</Space> |
|||
</div> |
|||
), |
|||
onFilter: (value, record) => { |
|||
if (typeof value === 'string' && typeof record?.appName === 'string') { |
|||
return record.appName.includes(value); |
|||
} |
|||
return false; |
|||
}, |
|||
filterIcon: (filtered) => ( |
|||
<SearchOutlined |
|||
style={{ color: filtered ? '#1890ff' : undefined }} |
|||
onPointerOverCapture={undefined} |
|||
onPointerMoveCapture={undefined} |
|||
/> |
|||
), |
|||
}, |
|||
{ |
|||
title: '应用包名', |
|||
dataIndex: 'packageName', |
|||
hideInSearch: true, |
|||
ellipsis: true, |
|||
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => ( |
|||
<div style={{ padding: 8 }}> |
|||
<Input |
|||
placeholder="搜索包名" |
|||
value={selectedKeys[0]} |
|||
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])} |
|||
onPressEnter={() => confirm()} |
|||
style={{ marginBottom: 8, display: 'block' }} |
|||
/> |
|||
<Space> |
|||
<Button onClick={() => confirm()} type="primary"> |
|||
搜索 |
|||
</Button> |
|||
<Button onClick={() => clearFilters && clearFilters()} type="link"> |
|||
清除 |
|||
</Button> |
|||
</Space> |
|||
</div> |
|||
), |
|||
onFilter: (value, record) => { |
|||
if (typeof value === 'string' && typeof record?.packageName === 'string') { |
|||
return record.packageName.includes(value); |
|||
} |
|||
return false; |
|||
}, |
|||
filterIcon: (filtered) => ( |
|||
<SearchOutlined |
|||
style={{ color: filtered ? '#1890ff' : undefined }} |
|||
onPointerOverCapture={undefined} |
|||
onPointerMoveCapture={undefined} |
|||
/> |
|||
), |
|||
}, |
|||
]; |
|||
|
|||
const fetchApp = async () => { |
|||
const res = await evilAppList(); |
|||
if (res.data) { |
|||
let common: LocalApp[] = []; |
|||
let remain: LocalApp[] = []; |
|||
props.data.localAppList?.forEach((x) => { |
|||
if (res.data?.some((y) => y.packageName === x.packageName)) { |
|||
common.push({ ...x, evil: true }); |
|||
} else { |
|||
remain.push({ ...x, evil: false }); |
|||
} |
|||
}); |
|||
setAppArr([...common, ...remain]); |
|||
setFilteredAppArr([...common, ...remain]); |
|||
} |
|||
}; |
|||
|
|||
useEffect(() => { |
|||
fetchApp(); |
|||
}, []); |
|||
|
|||
return ( |
|||
<Modal style={{ width: 600 }} onCancel={props.onClose} visible={true} footer={[]}> |
|||
<ProTable |
|||
onRow={(record) => { |
|||
return { |
|||
style: { |
|||
backgroundColor: record.evil ? 'red' : 'transparent', |
|||
}, |
|||
}; |
|||
}} |
|||
search={false} |
|||
onReset={() => { |
|||
setFilteredAppArr(appArr); |
|||
}} |
|||
columns={columns} |
|||
dataSource={filteredAppArr} |
|||
/> |
|||
</Modal> |
|||
); |
|||
}; |
|||
|
|||
export default LocalAppList; |
Loading…
Reference in new issue