123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import React, { useMemo, useCallback, useImperativeHandle } from 'react'
- import { useSelector } from 'react-redux'
- import classnames from 'classnames'
- import debounce from 'lodash/debounce'
- import { Button, Form, Icon, Checkbox, Select, Spin } from 'antd'
- const Option = Select.Option
- import { WrappedFormUtils, FormComponentProps } from 'antd/lib/form/Form'
- const FormItem = Form.Item
- const styles = require('../Team.less')
- import { IInviteMemberProps } from '../types'
- import { uuid } from 'utils/util'
- import { makeSelectInviteMemberLoading } from '../selectors'
- const AddForm: React.FC<IInviteMemberProps & FormComponentProps> = (
- {
- form,
- category,
- addHandler,
- inviteMemberList,
- organizationDetail,
- handleSearchMember
- },
- ref
- ) => {
- useImperativeHandle(ref, () => ({ ...form }))
- const fetching = useSelector(makeSelectInviteMemberLoading())
- const debouncedSearch = useCallback(
- debounce((searchValue: string) => {
- if (searchValue && searchValue.length) {
- handleSearchMember(searchValue)
- }
- }, 1000),
- [handleSearchMember]
- )
- const submit = useCallback(() => {
- if (addHandler) {
- addHandler()
- }
- }, [addHandler])
- const getOptions = useMemo(() => {
- return inviteMemberList && inviteMemberList.length
- ? inviteMemberList.slice(0, 20).map((d) => (
- <Option key={`${uuid}${d.username}`} value={d.email}>
- <div className={styles.options}>
- <strong>{d.username}</strong>
- <span className={styles.email}>{d.email}</span>
- </div>
- </Option>
- ))
- : []
- }, [inviteMemberList])
- const { getFieldDecorator } = form
- return (
- <div className={styles.addFormWrapper}>
- <div className={styles.titleWrapper}>
- <div className={styles.icon}>
- <Icon type="user" />
- </div>
- <div className={styles.title}>
- 添加{category}到
- <span className={styles.orgName}>{organizationDetail?.name}</span>
- </div>
- </div>
- <div className={styles.search}>
- <Form>
- <Form.Item>
- {getFieldDecorator(
- 'members'
- )(
- <Select
- mode="tags"
- placeholder={'请搜索或粘贴用户名/邮箱(以英文逗号或英文分号分隔)'}
- tokenSeparators={[',', ';']}
- showSearch
- filterOption={false}
- onSearch={debouncedSearch}
- notFoundContent={fetching ? <Spin size="small" /> : null}
- >
- {getOptions}
- </Select>
- )}
- </Form.Item>
- <FormItem>
- {getFieldDecorator(
- 'needEmail',
- {
- initialValue: true,
- valuePropName: 'checked'
- }
- )(<Checkbox>需要被邀请成员邮件确认</Checkbox>)}
- </FormItem>
- </Form>
- </div>
- <div className={styles.submit}>
- <Button type="primary" onClick={submit}>
- 邀请
- </Button>
- </div>
- </div>
- )
- }
- export default Form.create<IInviteMemberProps & FormComponentProps>()(
- React.forwardRef<WrappedFormUtils>(AddForm)
- )
|