import React, { useRef, useEffect, useState, forwardRef } from 'react';
import {
CloseCircleFilled,
MoreOutlined,
PlusOutlined,
} from '@ant-design/icons';
import { Badge, Avatar, Button, Tooltip } from 'antd';
import SelectModal from './SelectModal';
const MyBadge = (props) => {
const { objArr, setObjList, free } = props;
const delOne = (k) => {
const res = objArr.filter((_item, index) => index !== k);
setObjList(res);
};
return (
<>
{objArr.map((item, index) => (
<span key={index}>
<Tooltip title={item.user_name + '-' + item.department_name}>
<Badge
count={
free ? (
<CloseCircleFilled
style={{ cursor: 'pointer' }}
onClick={() => delOne(index)}
/>
) : null
}
>
<Avatar shape="square" size="large">
{item.user_name}
</Avatar>
</Badge>
</Tooltip>
<MoreOutlined
rotate={90}
style={{ marginLeft: 8, marginRight: 8, color: '#ccc' }}
/>
</span>
))}
</>
);
};
const App = (props, _ref) => {
const selectModalRef = useRef();
const { onChange, selected, noFixed } = props;
const free = noFixed ? false : true;
const [objList, setObjList] = useState([]);
function triggleCreate() {
selectModalRef.current.showModal();
}
function handleSubmit(item) {
const ind = objList.findIndex(function (elem) {
return elem.uid === item.uid;
});
if (ind === -1) {
setObjList((prevState) => [...prevState, item]);
}
}
useEffect(() => {
if (onChange) {
const uids = objList.map((item, index) => item.uid);
onChange(uids, objList);
}
}, [objList]);
useEffect(() => {
if (selected && selected.toString() != '') {
setObjList(selected);
}
}, [selected]);
return (
<>
<SelectModal onSubmit={handleSubmit} ref={selectModalRef} />
<MyBadge objArr={objList} setObjList={setObjList} free={free} />
{free && (
<Button
type="dashed"
style={{
width: 40,
height: 40,
position: 'relative',
top: 2,
color: '#ccc',
}}
icon={<PlusOutlined />}
onClick={triggleCreate}
></Button>
)}
</>
);
};
export default forwardRef(App);
import React, {
useState,
useRef,
forwardRef,
useImperativeHandle,
useMemo,
useEffect,
} from 'react';
import { AppstoreOutlined } from '@ant-design/icons';
import { Modal, Menu, Row, Col, Radio, Input, Empty } from 'antd';
import * as Service from './service';
import styles from './styles';
const useDepartments = () => {
const [departments, setDepartments] = useState([]);
useEffect(() => {
Service.queryDepartments().then((data) => {
const { list } = data;
setDepartments(list);
});
}, []);
return departments;
};
const radioStyle = {
display: 'block',
height: '28px',
lineHeight: '28px',
};
const ModalApp = (props, ref) => {
const modalRef = useRef();
const [visible, setVisible] = useState(false);
const departments = useDepartments();
const [users, setUsers] = useState([]);
const [keyword, setKeyword] = useState();
const [depart, setDepart] = useState('');
const fetchDepartments = React.useCallback(async () => {
const { list } = await Service.queryUsers();
setUsers(list);
}, []);
useEffect(() => {
fetchDepartments();
}, [fetchDepartments]);
const filteredUsers = useMemo(() => {
if (!keyword) {
return users;
} else {
return users.filter((user) =>
user.user_name.toLowerCase().includes(keyword.toLowerCase())
);
}
}, [keyword, users]);
function showModal() {
setVisible(true);
}
function hideModal() {
setVisible(false);
}
function changeEmploy(name, user) {
setDepart(user);
}
function handleSubmit() {
const { onSubmit } = props;
onSubmit(depart);
setVisible(false);
}
function handleKeyword(e) {
const { value } = e.target;
setKeyword(value);
}
async function handleSelect(e) {
const { key } = e;
if (key === 'all') {
fetchDepartments();
} else {
const { list } = await Service.queryUsersByDepartment(key);
setUsers(list);
}
}
useImperativeHandle(ref, () => ({
showModal,
hideModal,
}));
return (
<Modal
destroyOnClose
ref={modalRef}
onOk={handleSubmit}
onCancel={hideModal}
title="请选择"
visible={visible}
width={600}
bodyStyle={{ padding: 8 }}
>
<Row style={{ display: 'flex' }}>
<Col>
<Menu style={{ width: 256 }} mode="vertical" onClick={handleSelect}>
<Menu.Item key="all" className={styles['menu-item']}>
<span>
<AppstoreOutlined />
<span>全部</span>
</span>
</Menu.Item>
{departments.map((item) => (
<Menu.Item key={item.did} className={styles['menu-item']}>
<span>
<AppstoreOutlined />
<span>{item.name}</span>
</span>
</Menu.Item>
))}
</Menu>
</Col>
<Col style={{ paddingLeft: 8, flex: 1 }}>
<Input
placeholder="Search"
style={{ marginBottom: 8 }}
onChange={handleKeyword}
/>
{filteredUsers.length === 0 && (
<section style={{ display: 'flex', justifyContent: 'center' }}>
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
</section>
)}
<Radio.Group style={{ width: '100%' }}>
{filteredUsers.map((user) => {
return (
<Radio
style={radioStyle}
value={user.uid}
key={user.uid}
onChange={() => changeEmploy(user.user_name, user)}
>
{user.user_name}
</Radio>
);
})}
</Radio.Group>
</Col>
</Row>
</Modal>
);
};
export default forwardRef(ModalApp);
转载请注明原文地址:https://ipadbbs.8miu.com/read-27648.html