| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
- import styles from './index.module.scss'
- import { Button, Input, Tree, TreeDataNode } from 'antd'
- import { treeResIdFu } from './data'
- import { useDispatch, useSelector } from 'react-redux'
- import { RootState } from '@/store'
- import { A2_APIdel1, A2_APIdel2, A2_APIgetList1, A2_APIgetList2 } from '@/store/action/A2classify'
- import MyPopconfirm from '@/components/MyPopconfirm'
- import { MessageFu } from '@/utils/message'
- import A2add, { A2AddInfoType } from './A2add'
- import { A2tableType, A2TreeType } from '@/types'
- import MyTable from '@/components/MyTable'
- import { A2tableC } from '@/utils/tableData'
- import A2add2 from './A2add2'
- export type TopLeftArrType = '中图法分类' | '展示分类'
- const topLeftArr: TopLeftArrType[] = ['中图法分类', '展示分类']
- function A2classify() {
- const treeDataTemp = useSelector((state: RootState) => state.A2classify.treeData)
- const dispatch = useDispatch()
- const [topType, setTopType] = useState<TopLeftArrType>('中图法分类')
- const getList1 = useCallback(() => {
- dispatch(A2_APIgetList1())
- }, [dispatch])
- const getList2 = useCallback(
- async (val: string) => {
- dispatch(A2_APIgetList2({ pageNum: 1, pageSize: 9999, searchKey: val }))
- },
- [dispatch]
- )
- useEffect(() => {
- getList1()
- }, [getList1])
- // 点击重置
- const resetSelectFu = useCallback(
- (flag?: boolean) => {
- setValue('')
- if (topType === '展示分类') getList2('')
- if (flag) getList1()
- },
- [getList1, getList2, topType]
- )
- // 顶部切换tab
- const cutTop = useCallback(
- (item: TopLeftArrType) => {
- setValue('')
- setTopType(item)
- item === '中图法分类' ? getList1() : getList2('')
- },
- [getList1, getList2]
- )
- const [value, setValue] = useState('')
- const time = useRef(-1)
- const valueChange = useCallback(
- (val: string) => {
- setValue(val)
- clearInterval(time.current)
- time.current = window.setTimeout(() => {
- if (topType === '展示分类') getList2(val)
- // topType === '中图法分类' ? getList1(val) : getList2(val)
- }, 500)
- },
- [getList2, topType]
- )
- // 有关树------------------------
- const tab1Flag = useRef(true)
- useEffect(() => {
- if (treeDataTemp && treeDataTemp.length && tab1Flag.current) {
- tab1Flag.current = false
- setAcShu(treeDataTemp[0].id as number)
- }
- }, [treeDataTemp])
- // 当前选中的树节点ID
- const [acShu, setAcShu] = useState(0)
- // 点击树节点
- const onSelect = (id: any) => {
- if (id[0]) setAcShu(id[0])
- }
- // 搜索高亮
- const treeData = useMemo(() => {
- const loop = (dataTemp: any[]): TreeDataNode[] => {
- const data = dataTemp || []
- return data.map(item => {
- const strTitle = ((item.num ? item.num + ' ' : '') + item.name) as string
- const index = strTitle.indexOf(value)
- const beforeStr = strTitle.substring(0, index)
- const afterStr = strTitle.slice(index + value.length)
- const title =
- index > -1 ? (
- <span key={item.id}>
- {beforeStr}
- <span className='site-tree-search-value'>{value}</span>
- {afterStr}
- </span>
- ) : (
- <span key={item.id}>{strTitle}</span>
- )
- if (item.children) {
- return { title, key: item.id, children: loop(item.children) }
- }
- return {
- title,
- key: item.id
- }
- })
- }
- return loop(treeDataTemp)
- }, [treeDataTemp, value])
- // 右侧信息
- const rightData = useMemo(() => {
- let obj = {} as A2TreeType
- obj = treeResIdFu(treeDataTemp, acShu)
- return obj || {}
- }, [acShu, treeDataTemp])
- // 点击删除
- const delTree = useCallback(
- async (id: number) => {
- const res = await A2_APIdel1(id)
- if (res.code === 0) {
- MessageFu.success('删除成功!')
- tab1Flag.current = true
- getList1()
- }
- },
- [getList1]
- )
- // 点击新增和编辑
- const [addInfo, setAddInfo] = useState({} as A2AddInfoType)
- const addSonFu = useCallback(
- (id: number) => {
- setAddInfo({
- id,
- txt: id > 0 ? '编辑' : '新增',
- acInfo: rightData
- })
- },
- [rightData]
- )
- // -----------------展示分类
- const tableInfo = useSelector((state: RootState) => state.A2classify.tableInfo)
- const delTableFu = useCallback(
- async (id: number) => {
- const res = await A2_APIdel2(id)
- if (res.code === 0) {
- MessageFu.success('删除成功!')
- getList2(value)
- }
- },
- [getList2, value]
- )
- const tableLastBtn = useMemo(() => {
- return [
- {
- title: '操作',
- render: (item: A2tableType) => (
- <>
- <Button size='small' type='text' onClick={() => setTab2Id(item.id)}>
- 编辑
- </Button>
- <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item.id)} />
- </>
- )
- }
- ]
- }, [delTableFu])
- // tab新增/编辑
- const [tab2Id, setTab2Id] = useState(0)
- return (
- <div className={styles.A2classify}>
- <div className='pageTitle'>图书分类</div>
- {/* 顶部 */}
- <div className='A2top'>
- <div className='A2top1'>
- {topLeftArr.map(item => (
- <Button
- onClick={() => cutTop(item)}
- key={item}
- type={topType === item ? 'primary' : 'default'}
- >
- {item}
- </Button>
- ))}
- </div>
- <div className='A2top1'>
- <Input
- style={{ width: 240 }}
- placeholder={topType === '中图法分类' ? '请输入分类名称/编号' : '请输入标题'}
- value={value}
- onChange={e => valueChange(e.target.value)}
- />
-  
- <Button onClick={() => resetSelectFu()}>重置</Button> 
- <Button
- type='primary'
- onClick={() =>
- topType === '展示分类'
- ? setTab2Id(-1)
- : setAddInfo({ id: -1, txt: '新增', acInfo: rightData })
- }
- >
- 新增
- </Button>
- </div>
- </div>
- {/* 主体 */}
- <div className='A2main'>
- <div className='A2m1' hidden={topType !== '中图法分类'}>
- <div className='A2m1ll'>
- {treeDataTemp && treeDataTemp.length ? (
- <Tree
- // 默认全部展开
- defaultExpandAll={true}
- // 数据
- treeData={treeData}
- // 自定义字段
- // fieldNames={{ title: 'title', key: 'key', children: 'children' }}
- // 选中
- selectedKeys={[acShu]}
- // 点击
- onSelect={onSelect}
- />
- ) : (
- <div className='A2Null'>暂无数据</div>
- )}
- </div>
- <div className='A2m1rr'>
- <div className='A2mr1'>分类详情</div>
- {rightData.id ? (
- <>
- <div className='A2mr2'>
- <Button type='text' onClick={() => addSonFu(rightData.id)}>
- 编辑
- </Button>
-  
- <MyPopconfirm txtK='删除' onConfirm={() => delTree(rightData.id)} />
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>分类编号:</div>
- <div className='A2mr3rr'>{rightData.num}</div>
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>分类名称:</div>
- <div className='A2mr3rr'>{rightData.name}</div>
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>层级:</div>
- <div className='A2mr3rr'>{rightData.level}</div>
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>排序值:</div>
- <div className='A2mr3rr'>{rightData.sort}</div>
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>编辑时间:</div>
- <div className='A2mr3rr'>{rightData.updateTime}</div>
- </div>
- <div className='A2mr3'>
- <div className='A2mr3ll'>编辑人:</div>
- <div className='A2mr3rr'>{rightData.creatorName}</div>
- </div>
- </>
- ) : (
- <div className='A2Null'>暂无数据</div>
- )}
- </div>
- </div>
- <div className='A2m2' hidden={topType !== '展示分类'}>
- <MyTable
- yHeight={678}
- list={tableInfo.list}
- columnsTemp={A2tableC}
- lastBtn={tableLastBtn}
- pagingInfo={false}
- />
- </div>
- </div>
- {/* 新增/编辑页面 中图法分类 */}
- {addInfo.id ? (
- <A2add
- addInfo={addInfo}
- addFu={() => resetSelectFu(true)}
- closeFu={() => setAddInfo({} as A2AddInfoType)}
- />
- ) : null}
- {/* 新增/编辑 展示分类 */}
- {tab2Id ? (
- <A2add2
- tab2Id={tab2Id}
- addFu={flag => (flag ? getList2(value) : resetSelectFu())}
- closeFu={() => setTab2Id(0)}
- />
- ) : null}
- </div>
- )
- }
- const MemoA2classify = React.memo(A2classify)
- export default MemoA2classify
|