|
|
@@ -1,12 +1,60 @@
|
|
|
-import React, { useState } from 'react'
|
|
|
+import React, { useState, useEffect, useRef } from 'react'
|
|
|
import { Input, Button, Spin } from 'antd'
|
|
|
-import styles from './index.less'
|
|
|
+import consts from '@/basic/consts'
|
|
|
+import { useDispatch } from 'dva'
|
|
|
+import { useDebounceFn } from 'ahooks'
|
|
|
import { SearchOutlined, CloseOutlined } from '@ant-design/icons'
|
|
|
+import { queryStaff } from '@/services/staff'
|
|
|
+import styles from './index.less'
|
|
|
|
|
|
const StaffModal = () => {
|
|
|
+ const scrollRef = useRef()
|
|
|
+ const dispatch = useDispatch()
|
|
|
const [state, setState] = useState({
|
|
|
- loading: false
|
|
|
+ loading: true,
|
|
|
+ list: [],
|
|
|
+ page: 1,
|
|
|
+ size: 10,
|
|
|
+ total: 0
|
|
|
})
|
|
|
+ const initData = async params => {
|
|
|
+ const { data: { list, total } = { list: [], total: 0 }, code = -1 } = await queryStaff(params)
|
|
|
+ if (code === consts.RET_CODE.SUCCESS) {
|
|
|
+ if (params?.page === 1) {
|
|
|
+ // 请求的是第一页
|
|
|
+ setState({ ...state, list, total, loading: false })
|
|
|
+ } else {
|
|
|
+ setState({ ...state, list: state.list.concat(list), total, loading: false })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ initData({ page: 1, size: 10 })
|
|
|
+ }, [])
|
|
|
+ const onChange = e => {
|
|
|
+ const { value = '' } = e.target || e.currentTarget
|
|
|
+ initData({ search: value, page: state.page, size: state.size })
|
|
|
+ }
|
|
|
+
|
|
|
+ const { run: handleInputChange } = useDebounceFn(onChange)
|
|
|
+
|
|
|
+ const closeModal = () => {
|
|
|
+ dispatch({
|
|
|
+ type: 'single/changeModal'
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleListScroll = () => {
|
|
|
+ // 未滚动到底部
|
|
|
+ if (
|
|
|
+ scrollRef.current.scrollHeight - scrollRef.current.clientHeight <=
|
|
|
+ scrollRef.current.scrollTop
|
|
|
+ ) {
|
|
|
+ // 已到底部
|
|
|
+ initData({ page: state.page + 1, size: state.size })
|
|
|
+ }
|
|
|
+ }
|
|
|
return (
|
|
|
<div className={['ant-modal-content', styles.modalContainer].join(' ')}>
|
|
|
<div className={styles.modalHeader}>
|
|
|
@@ -14,24 +62,27 @@ const StaffModal = () => {
|
|
|
prefix={<SearchOutlined />}
|
|
|
className={styles.inputSearch}
|
|
|
placeholder="输入员工名称搜索"
|
|
|
+ onClick={handleInputChange}
|
|
|
/>
|
|
|
<span className={styles.closeIcon}>
|
|
|
- <CloseOutlined />
|
|
|
+ <CloseOutlined onClick={closeModal} />
|
|
|
</span>
|
|
|
</div>
|
|
|
- <div className={styles.modalContent}>
|
|
|
+ <div className={styles.modalContent} ref={scrollRef} onScroll={handleListScroll}>
|
|
|
<Spin spinning={state.loading}>
|
|
|
- <div className={styles.card}>
|
|
|
- <span className="w-1/6">张三</span>
|
|
|
- <span className="w-1/6">总部</span>
|
|
|
- <span className="w-1/6">测试</span>
|
|
|
- <span className="w-1/2 zh-justify-between">
|
|
|
- <span>15800000001</span>
|
|
|
- <Button type="primary" size="small">
|
|
|
- 关联
|
|
|
- </Button>
|
|
|
- </span>
|
|
|
- </div>
|
|
|
+ {state.list.map(item => (
|
|
|
+ <div key={item.id} className={styles.card}>
|
|
|
+ <span className="w-1/6">{item.username}</span>
|
|
|
+ <span className="w-1/6">{item.departmentName}</span>
|
|
|
+ <span className="w-1/6">{item.position}</span>
|
|
|
+ <span className="w-1/2 zh-justify-between">
|
|
|
+ <span>{item.emergencyContacts}</span>
|
|
|
+ <Button type="primary" size="small">
|
|
|
+ 关联
|
|
|
+ </Button>
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
</Spin>
|
|
|
</div>
|
|
|
</div>
|