$ cnpm install @uyun/ec-user-picker
当前版本:6.x
作者:李金月
用户选择组件。
用于选择租户下的所有用户或用户组。
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
buttonProps | 按钮 props | object | - |
selectionType | 多选/单选,checkbox 或radio |
string | checkbox |
showUsers | 是否显示用户模块 | boolean | true |
showGroups | 是否显示用户组模块 | boolean | true |
getCombineData | 自定义混合搜索接口,参考 自定义接口 | getCombineData | - |
getUsers | 自定义获取用户数据的接口,参考 自定义接口 | getUsers | - |
queryGroupsTrees | 自定义获取用户组数据的接口,参考 自定义接口 | queryGroupsTree | - |
getGroupList | 自定义搜索用户组数据的接口,参考 自定义接口 | getGroupList | - |
globalGroups | 是否获取全局用户组 | boolean | false |
getDeparts | 自定义获取部门数据的接口,参考 自定义接口 | getDeparts | - |
getDepartList | 自定义搜索部门数据的接口,参考 自定义接口 | getDepartList | - |
value | 已选择项 | ValueObject | - |
pagination | 是否显示页码 | boolean | true |
showRecentlySelected | 是否显示最近选择数据,mode 为 dialog layer 时有效 |
boolean | true |
showNumber | 是否显示数值统计,点击可查看已选择的全部数据,mode 为 default 时有效 |
boolean | false |
onChange | 改变选中项时的回调 | function(value) | - |
children | 自定义扩展列表,参考 自定义扩展列表 | ReactNode | - |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
userId | 登陆用户 Id,必传(过滤不同用户最近选择数据) | string | - |
product | 产品名称,必传(过滤不同产品下最近选择数据) | string | - |
productName | 产品名称,传入后只会获取当前产品下的数据 | string | - |
mode | 设置模式 | string: default dialog layer |
default |
getPopupContainer | 菜单渲染父节点,mode 为 default 时有效 |
Function(triggerNode) | triggerNode => triggerNode.parentNode |
width | 下拉内容的渲染宽度,mode 为 default 时有效 |
number | - |
maxHeight | 下拉内容的渲染最大高度,mode 为 default 时有效 |
number | 460 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
appId | 产品 id,传入后只会获取当前产品下的数据 | string | - |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
getLists | 自定义获取数据的接口,参考 自定义接口 | getLists | - |
数据格式参考:
[{
userId: '...',
account: 'admin',
realname: 'admin',
departs: ['顶级部门'],
type: 'users',
...
},{
departId: '...',
name: '部门1',
type: 'departs',
departPath: '/顶级部门/部门1'
...
},{
groupId: '...',
name: '用户组1',
type: 'groups',
groupPath: '/顶级用户组/用户组1'
...
},{
roleId: '...',
name: '角色1',
type: 'roles',
...
}]
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 扩展类型,对应 value 中的字段名 | string | - |
当默认的数据源无法满足业务需求时,可自定义组件中的接口,需要注意请求参数的传递和确保返回正确的数据格式。由于数据量较大,所以返回的分页信息中不包含数据总数。
以getUsers
为例:
import UserPicker from '@uyun/ec-user-picker'
import { getUsers } from '@uyun/ec-user-picker/lib/services/api'
...
<UserPicker
getUsers={params => {
return getUsers({
// params 是页面中的分页、搜索等信息,
// 可根据情况将这个对象更改为符合自定义接口的参数,
// 例如,产品要求将用户数据源限制在某一个范围内,
// 就可通过自定义接口参数来过滤用户数据。
...params,
userIds: ['...', '...']
})
.then(data => {
// data 是请求后获得的数据,
// 可根据情况将这个数组更改为组件要求的数据格式,
// 例如,自定义接口中用户唯一标识为 'id',而组件要求的则是 `userId`,
// 那么你应该在此将所有用户数据中的 'id' 更改为 'userId'。
return data
})
}}
value={this.state.value}
onChange={this.onChange}
/>
...
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
appId | 应用 id,筛选当前产品的用户 | string |
userInfo | 用户信息,多字段查询,可为姓名、账号、邮箱 | string |
userIds | 用户 id 组, 筛选属于其中的用户 | string |
departId | 部门 id,筛选当前部⻔的用户 | string |
groupId | 用户组 id,筛选当前用户组的用户 | string |
pageIndex | 当前页数 | number |
pageSize | 每页条数 | number |
tenantId | 租户 id,默认取当前登录用户的 tenantId,当需要按业务单位来查询时,需要显式指定 | string |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
pageNo | 当前页数 | number |
pageSize | 每页条数 | number |
total | 列表总数 | number |
records | 用户列表 | object[] |
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
app_id | 应用 id,筛选当前产品的数据 | string |
keyword | 搜索关键字 | string |
type | 搜索哪方面数据, 对应 value 中 type( 比如 type 传值'users, departs',混合搜索用户和部门的数据 ) | string |
page_index | 用户 id 组, 筛选属于其中的用户 | string |
page_index | 当前页数 | number |
page_size | 每页条数 | number |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
pageNo | 当前页数 | number |
pageSize | 每页条数 | number |
total | 列表总数 | number |
records | 用户列表 | object[] |
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
app_id | 应用 id,筛选当前产品的用户组 | string |
pid | 父级分类用户组 id, 筛选当前分类用户组下的用户组 | string |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
- | 用户组 | object[] |
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
name | 用户组名称 | string |
queryCategory | 用户组类型 (0: 真正用户组;1: 分类用户组;2: 所以用户组) | string | |
pageIndex | 当前页数 | number |
pageSize | 每页条数 | number |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
pageNo | 当前页数 | number |
pageSize | 每页条数 | number |
records | 用户列表 | object[] |
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
parent_depart_id | 上级部门 id,获取此部门下属的部门列表,获取顶级部门时传 0 |
string |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
- | 部门列表 | object[] |
请求参数传递:
参数 | 说明 | 类型 |
---|---|---|
name | 部门名称 | string |
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
- | 部门列表 | object[] |
请求参数不做要求
返回数据格式:
参数 | 说明 | 类型 |
---|---|---|
pageNo | 当前页数 | number |
pageSize | 每页条数 | number |
total | 列表总数 | number |
records | 用户列表 | object[] |
当业务需求需要使用除用户和用户组以外的数据源时,可对组件进行额外扩展,添加多个自定义选择项列表。进行扩展时,需要注意自定义的组件要满足一定要求。
以扩展一个部门
列表为例:
// 自定义扩展组件通过 selectedRowKeys 进行选择项的显示,
// 调用 onSelect 、 onSelectAll 和onDeselect 进行数据的向上传递,
// 最后通过其它属性控制页面的布局和搜索等功能。
onst departsData = [
{
departId: "001",
name: "顶级部门",
children: [
{
departId: "001-1",
name: "二级部门1",
children: [
{
departId: "001-1-1",
name: "三级部门"
}
]
},
{
departId: "001-2",
name: "二级部门2"
}
]
}
];
class UserPickerPane extends React.Component {
// 单选
onSelect = (selectedKeys, event) => {
const { onSelect, onDeselect } = this.props;
const record = event.node.props.dataRef;
if (event.selected) {
if (onSelect) {
onSelect("departs", record);
}
} else {
if (onDeselect) {
onDeselect("departs", selectedKeys[0]);
}
}
};
// 多选
onCheck = (checkedKeys, event) => {
const { value, onSelectAll } = this.props;
let record = _.map(event.checkedNodes, item => {
return item.props.dataRef;
});
const departs = _.filter(value, item => item.type === "departs");
const departIds = _.map(value, item => item.departId);
if (!event.checked) {
record = _.filter(
departs,
item => checkedKeys.indexOf(item.departId) === -1
);
} else {
record = _.filter(
record,
item => departIds.indexOf(item.departId) === -1
);
}
// record: 新增或移除的数据
if (onSelectAll) {
onSelectAll("departs", "departId", record, event.checked);
}
};
render() {
const { selectedRowKeys, selectionType, mode } = this.props;
const loop = data =>
_.map(data, item => {
if (item.children) {
return (
<TreeNode
key={item.departId}
title={item.name}
dataRef={item}
selectable={selectionType === "radio"}
checkable={selectionType === "checkbox"}
>
{loop(item.children)}
</TreeNode>
);
}
return (
<TreeNode
key={item.departId}
title={item.name}
dataRef={item}
selectable={selectionType === "radio"}
checkable={selectionType === "checkbox"}
/>
);
});
return (
<DirectoryTree
showLine
showIcon={false}
expandAction={false}
multiple={selectionType === "checkbox"}
checkable={selectionType === "checkbox"}
selectedKeys={selectionType === "radio" ? selectedRowKeys : []}
checkedKeys={selectionType === "checkbox" ? selectedRowKeys : []}
defaultExpandAll
onSelect={selectionType === "radio" ? this.onSelect : null}
onCheck={this.onCheck}
>
{loop(departsData)}
</DirectoryTree>
);
}
}
...
state = {
value: []
}
...
<UserPicker
value={this.state.value}
onChange={this.onChange}
>
{/* 使用自定义组件时,需要传入文档中标注的必填项 */}
<UserPickerPane
// 必填,对应 value 中的字段名
type="departs"
// 必填,数据的唯一标识
rowKey="departId"
// 必填,标签显示文字
tab="部门"
// 必填,回填到选择框的 Option,需要在 title 中传入 Tooltip 组件
renderTag={record => (
<Option
title={<Tooltip title={record.name}>{record.name}</Tooltip>}
>
{record.name}
</Option>
)}
/>
</UserPicker>
...
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 扩展类型,对应 value 中的字段名 | string | - |
rowKey | 扩展数据的唯一标识 | string | - |
tab | 扩展的标签显示文字 | string | - |
renderTag | 扩展回填到选择框的 Option,需要在 title 中传入 Tooltip 组件 | function(record) => ReactNode | - |
Copyright 2013 - present © cnpmjs.org