组件调整

This commit is contained in:
Wang Kejun 2022-10-25 11:33:25 +08:00
parent a5a511b9c0
commit 31d84d500c
8 changed files with 666 additions and 728 deletions

View File

@ -2,7 +2,7 @@ import { firstLetterUpperCase } from 'oak-domain/lib/utils/string';
import { composeFileUrl } from '../../../utils/extraFile';
import React from '../../../utils/react';
export default OakPage({
export default OakComponent({
entity: 'user',
projection: async ({ props }) => {
const { entity, entityId } = props;
@ -53,7 +53,7 @@ export default OakPage({
filters: [
// 由调用者注入oakFilter
{
filter: async ({ features, props, onLoadOptions }) => {
filter: async ({ features, props }) => {
const { entityId, entity } = props;
const entityStr = firstLetterUpperCase(entity!);
return {
@ -73,14 +73,14 @@ export default OakPage({
},
],
isList: true,
async formData ({ data: users, props, features }) {
async formData({ data: users, props, features }) {
const { entity, entityId } = props;
const entityStr = firstLetterUpperCase(entity!);
const filter = this.state.oakFullpath && await this.getFilterByName('name') as any;
const pagination = this.state.oakFullpath && this.getPagination();
const filter = await this.getFilterByName('name');
const pagination = this.getPagination();
return {
users: users?.map((ele: any) => {
const { mobile$user, extraFile$entity } = ele || {};
const { mobile$user, extraFile$entity } = ele;
const mobile = mobile$user && mobile$user[0]?.mobile;
const relations = ele[`user${entityStr}$user`]
?.filter((rt: any) => rt[`${entity}Id`] === entityId)
@ -112,7 +112,6 @@ export default OakPage({
data: {
show: false,
searchValue: '',
deleteIndex: '',
editableRowKeys: [] as string[],
btnItems: [
{
@ -150,7 +149,6 @@ export default OakPage({
url: '/userRelation/upsert',
entity,
entityId,
relations,
},
{
relations,
@ -275,7 +273,9 @@ export default OakPage({
const { entity, entityId } = this.props;
const entityStr = firstLetterUpperCase(entity!);
const current = (this as any).editMap[(this as any).currentSaveId];
const current = (this as any).editMap[
(this as any).currentSaveId
];
if (current) {
Object.keys(current.editedRow).forEach((ele) => {
if (ele === 'relations') {

View File

@ -1,5 +1,6 @@
import React from 'react';
import {
Table,
Input,
@ -7,8 +8,8 @@ import {
Button,
Avatar,
Space,
Tag
} from 'tdesign-react';
Tag,
} from 'antd';
import PageHeader from '../../../components/common/pageHeader';
import Style from './web.module.less';
@ -24,22 +25,12 @@ export default function render(this: any) {
return (
<PageHeader title="人员列表">
<div className={Style.container}>
<Space direction="vertical">
<Space>
<Button
shape="rectangle"
size="medium"
type="button"
variant="base"
onClick={() => this.goUpsert()}
>
<Button type="primary" onClick={() => this.goUpsert()}>
</Button>
<Button
shape="rectangle"
size="medium"
type="button"
variant="base"
type="primary"
onClick={() => this.goUserEntityGrantWithGrant()}
>
@ -56,69 +47,64 @@ export default function render(this: any) {
columns={[
{
width: 100,
colKey: 'index',
dataIndex: 'index',
title: '序号',
cell: ({ rowIndex }) => rowIndex + 1,
render: (value, record, index) => index + 1,
},
{
colKey: 'avatar',
dataIndex: 'avatar',
title: '头像',
cell: ({ row, rowIndex, col, colIndex }) => {
const { avatar } = row;
return avatar ? (
<Avatar
hideOnLoadFailed={false}
image={avatar}
shape="circle"
/>
render: (value, record, index) => {
return value ? (
<Avatar src={value} shape="circle" />
) : (
<span></span>
);
},
},
{
colKey: 'name',
dataIndex: 'name',
title: '姓名',
edit: {
component: Input,
props: {
clearable: true,
autofocus: true,
autoWidth: true,
},
rules: [
{ required: true, message: '不能为空' },
],
showEditIcon: false,
},
// edit: {
// component: Input,
// props: {
// clearable: true,
// autofocus: true,
// autoWidth: true,
// },
// rules: [
// { required: true, message: '不能为空' },
// ],
// showEditIcon: false,
// },
},
{
colKey: 'nickname',
dataIndex: 'nickname',
title: '昵称',
edit: {
component: Input,
props: {
clearable: true,
autofocus: true,
autoWidth: true,
},
rules: [
{ required: true, message: '不能为空' },
],
showEditIcon: false,
},
// edit: {
// component: Input,
// props: {
// clearable: true,
// autofocus: true,
// autoWidth: true,
// },
// rules: [
// { required: true, message: '不能为空' },
// ],
// showEditIcon: false,
// },
},
{
colKey: 'mobile',
dataIndex: 'mobile',
title: '手机号',
},
{
colKey: 'relations',
dataIndex: 'relations',
title: '权限',
cell: ({ row, rowIndex, col, colIndex }) => {
render: (value, record, index) => {
return (
<Space>
{row.relations?.map(
{record.relations?.map(
(ele: string, index: number) => (
<Tag key={index}>
{t(entity + ':r.' + ele)}
@ -129,89 +115,77 @@ export default function render(this: any) {
);
},
edit: {
component: Select,
// props, 透传全部属性到 Select 组件
// props 为函数时参数有col, row, rowIndex, colIndex, editedRow。一般用于实现编辑组件之间的联动
props: () => {
return {
multiple: true,
minCollapsedNum: 1,
autoWidth: true,
options:
relationArr &&
relationArr.map(
(
ele: any,
index: number
) => ({
value: ele,
label: t(
entity + ':r.' + ele
),
})
),
};
},
showEditIcon: false,
rules: [
{
required: true,
message: '请至少选择一个权限',
},
],
},
// edit: {
// component: Select,
// // props, 透传全部属性到 Select 组件
// // props 为函数时参数有col, row, rowIndex, colIndex, editedRow。一般用于实现编辑组件之间的联动
// props: () => {
// return {
// multiple: true,
// minCollapsedNum: 1,
// autoWidth: true,
// options:
// relationArr &&
// relationArr.map(
// (
// ele: any,
// index: number
// ) => ({
// value: ele,
// label: t(
// entity + ':r.' + ele
// ),
// })
// ),
// };
// },
// showEditIcon: false,
// rules: [
// {
// required: true,
// message: '请至少选择一个权限',
// },
// ],
// },
},
{
title: '操作',
colKey: 'operate',
cell: ({ row }) => {
dataIndex: 'operate',
render: (value, record, index) => {
const editable = editableRowKeys.includes(
row.id
record.id
);
return (
<Space>
<Button
theme="primary"
variant="text"
type="link"
onClick={(e) =>
this.goDetail(row.id)
this.goDetail(record.id)
}
>
</Button>
{!editable && (
<Button
theme="primary"
variant="text"
data-id={row.id}
onClick={(e) =>
this.onEdit(e)
}
type="link"
onClick={(e) => this.onEdit(e)}
>
</Button>
)}
{editable && (
<Button
theme="primary"
type="link"
variant="text"
data-id={row.id}
onClick={(e) =>
this.onSave(e)
}
onClick={(e) => this.onSave(e)}
>
</Button>
)}
{editable && (
<Button
theme="primary"
variant="text"
data-id={row.id}
onClick={(e) =>
this.onCancel(e)
}
type="primary"
onClick={(e) => this.onCancel(e)}
>
</Button>
@ -226,15 +200,14 @@ export default function render(this: any) {
total,
pageSize,
current: currentPage,
onPageSizeChange: (ps: number) => {
this.setPageSize(ps);
onShowSizeChange: (current: number, size: number) => {
this.setPageSize(current);
},
onCurrentChange: (current) => {
this.setCurrentPage(current);
onChange: (page: number, pageSize: number) => {
this.setCurrentPage(page);
},
}}
/>
</Space>
</div>
</PageHeader>
);

View File

@ -1,7 +1,6 @@
import { firstLetterUpperCase } from 'oak-domain/lib/utils/string';
export default OakPage(
{
export default OakComponent({
entity: 'user',
projection: async ({ props }) => {
const { entity } = props;
@ -18,7 +17,7 @@ export default OakPage(
},
filter: {
[`${entity}Id`]: props.entityId!,
}
},
},
};
},
@ -39,16 +38,16 @@ export default OakPage(
users?.forEach((ele: any) => {
userRelations.push(...ele[`user${entityStr}$user`]);
});
userRelations.forEach(ele => {
userRelations.forEach((ele) => {
const userIds = relationMap.get(ele.relation) as Array<string>;
userIds.push(ele.userId);
})
});
relationMap.forEach((value, key) => {
relationArr.push([key, value])
})
relationArr.push([key, value]);
});
return {
relationArr,
relationMap
relationMap,
};
},
properties: {
@ -70,9 +69,7 @@ export default OakPage(
userIds: ids,
relation,
entityId,
})
});
},
},
}
);
});

View File

@ -1,25 +1,28 @@
import { firstLetterUpperCase } from "oak-domain/lib/utils/string";
export default OakPage(
{
export default OakComponent({
isList: true,
formData: async function ({ data, props }) {
const { nameProperty } = props;
const { oakEntity } = this.props;
const entityStr = firstLetterUpperCase(oakEntity);
const rows = data?.map(
(ele) => {
const { id, [nameProperty!]: name, [`user${entityStr}$${oakEntity}`]: userEntity } = ele as any;
const rows = data?.map((ele) => {
const {
id,
[nameProperty!]: name,
[`user${entityStr}$${oakEntity}`]: userEntity,
} = ele as any;
const relations = userEntity?.map((ele: any) => ele.relation);
const hasRelation: boolean[] = props.relations!.map(ele2 => relations.includes(ele2));
const hasRelation: boolean[] = props.relations!.map((ele2) =>
relations.includes(ele2)
);
return {
id,
name,
hasRelation,
};
}
);
});
return {
rows,
};
@ -32,22 +35,29 @@ export default OakPage(
methods: {
onChange(input: any) {
const { dataset, checked } = this.resolveInput(input, ['checked']);
const { id: entityId, relation, index } = dataset as {
id: string,
relation: string,
const {
id: entityId,
relation,
index,
} = dataset as {
id: string;
relation: string;
index: number;
};
const { oakEntity, user } = this.props;
const entityStr = firstLetterUpperCase(oakEntity!);
this.toggleNode({
this.toggleNode(
{
relation,
userId: user.id,
}, checked, `${index}.user${entityStr}$${oakEntity}`)
},
checked,
`${index}.user${entityStr}$${oakEntity}`
);
},
async confirm() {
await this.execute('create');
await this.navigateBack();
}
},
}
);
},
});

View File

@ -1,7 +1,7 @@
import { firstLetterUpperCase } from 'oak-domain/lib/utils/string';
import { composeFileUrl } from '../../../utils/extraFile';
export default OakPage({
export default OakComponent({
entity: 'user',
projection: async ({ props }) => {
const { entity, relations, entityId } = props;
@ -62,7 +62,9 @@ export default OakPage({
formData: async function ({ data: users, props, features }) {
const { entity } = props;
const entityStr = firstLetterUpperCase(entity!);
const filter = this.state.oakFullpath && await this.getFilterByName('name') as any;
const filter =
this.state.oakFullpath &&
((await this.getFilterByName('name')) as any);
return {
users: users?.map((ele: any) => {

View File

@ -1,7 +1,6 @@
import { firstLetterUpperCase } from "oak-domain/lib/utils/string";
export default OakPage(
{
export default OakComponent({
entity: 'user',
projection: async ({ props }) => {
const { entity, entityId } = props;
@ -32,18 +31,12 @@ export default OakPage(
isList: false,
formData: async ({ data: user, props }) => {
const { entity, relations } = props;
const {
id,
name,
mobile$user,
password,
} = user || {};
const { name, mobile$user, password } = user || {};
const mobile = mobile$user && mobile$user[0]?.mobile;
return {
id,
name,
mobile,
password,
mobile,
};
},
properties: {
@ -55,12 +48,14 @@ export default OakPage(
mobile: '',
relationArr: [] as string[],
},
methods: {
async onLoad() {
lifetimes: {
ready() {
if (!this.props.oakId) {
this.setUpdateData('password', '12345678');
}
},
},
methods: {
setValue(input: any) {
const { dataset, value, Context } = this.resolveInput(input);
this.setUpdateData(dataset!.attr, value);
@ -69,7 +64,7 @@ export default OakPage(
const { value } = event.detail;
this.setState({
mobile: value,
})
});
this.setUpdateData('mobile$user.0.mobile', value);
},
onCheckBoxChange(event: any) {
@ -83,19 +78,24 @@ export default OakPage(
// 由于是根据index 进行删除, 所以将之前设置的node从头开始删除
relationArr.forEach((ele, index) => {
this.removeNode(`user${entityStr}$user`, '0');
})
});
value.forEach((ele, index) => {
this.setUpdateData(`user${entityStr}$user.${index}.${entity}Id`, entityId);
this.setUpdateData(`user${entityStr}$user.${index}.relation`, ele);
})
this.setUpdateData(
`user${entityStr}$user.${index}.${entity}Id`,
entityId
);
this.setUpdateData(
`user${entityStr}$user.${index}.relation`,
ele
);
});
this.setState({
relationArr: value,
})
});
},
async onConfirm() {
await this.execute('create');
await this.execute();
this.navigateBack();
},
},
}
);
});

View File

@ -1,15 +1,7 @@
import React, { ReactElement } from 'react';
import {
Form,
Input,
Row,
Col,
Checkbox,
Button,
} from 'tdesign-react';
import React from 'react';
import { Form, Input, Checkbox, Button, Space } from 'antd';
import PageHeader from '../../../components/common/pageHeader';
import Style from './web.module.less';
const { FormItem } = Form;
export default function render(this: any) {
const { relations, entity } = this.props;
@ -21,114 +13,95 @@ export default function render(this: any) {
return (
<PageHeader showBack={true} title="添加权限">
<div className={Style.container}>
<div className={Style.formContainer}>
<Row gutter={16}>
<Col span={8}>
<Form
colon={false}
labelAlign="right"
labelWidth="100px"
layout="vertical"
preventSubmitDefault
resetType="empty"
showErrorMessage
submitWithWarningMessage={false}
>
<FormItem
<Form colon labelCol={{ span: 4 }} wrapperCol={{ span: 8 }}>
<Form.Item
label="姓名"
name="name"
rules={[
{
required: true,
message: '姓名不能为空',
type: 'error',
},
]}
>
<>
<Input
onChange={(value, context) => {
this.setUpdateData('name', value);
onChange={(e) => {
this.setUpdateData('name', e.target.value);
}}
value={name}
align="left"
placeholder="请输入内容"
type="text"
placeholder="请输入姓名"
/>
</FormItem>
<FormItem
</>
</Form.Item>
<Form.Item
label="手机号码"
name="mobile"
rules={[
{
required: true,
message: '手机号不能为空',
type: 'error',
},
{
min: 11,
message: '请输入11位手机号',
type: 'error',
},
{
max: 11,
message: '请输入11位手机号',
type: 'error',
},
]}
>
<>
<Input
maxlength={11}
maxLength={11}
value={mobile}
onChange={(value, context) => {
const strValue = String(value);
onChange={(e) => {
const strValue = e.target.value;
this.setUpdateData(
'mobile$user.0.mobile',
strValue.replace(/[^\d\-\d]/g, '')
);
}}
align="left"
placeholder="请输入内容"
size="medium"
placeholder="请输入手机号码"
type="tel"
/>
</>
</FormItem>
<FormItem
initialData="12345678"
</Form.Item>
<Form.Item
label="密码"
name="mobile"
rules={[
{
required: true,
message: '密码不能为空',
type: 'error',
},
]}
>
<>
<Input
value={password}
onChange={(value) => {
this.setUpdateData('password', value);
onChange={(e) => {
this.setUpdateData(
'password',
e.target.value
);
}}
align="left"
placeholder="不少于八位"
showClearIconOnEmpty={false}
size="medium"
status="default"
type="text"
/>
</FormItem>
<FormItem
</>
</Form.Item>
<Form.Item
label="权限"
rules={[
{
required: true,
message: '请至少选择一个权限',
type: 'error',
},
]}
name="relation"
>
<>
<Checkbox.Group
value={relationArr}
onChange={(value) => {
@ -142,26 +115,23 @@ export default function render(this: any) {
ele,
}))}
></Checkbox.Group>
</FormItem>
<FormItem style={{ marginLeft: 100 }}>
</>
</Form.Item>
<Form.Item wrapperCol={{ offset: 4 }}>
<Space>
<Button
theme="primary"
type="submit"
style={{ marginRight: 10 }}
type="primary"
htmlType="submit"
onClick={() => {
this.onConfirm();
}}
>
</Button>
<Button theme="default" type="reset">
</Button>
</FormItem>
<Button htmlType="reset"></Button>
</Space>
</Form.Item>
</Form>
</Col>
</Row>
</div>
</div>
</PageHeader>
);

View File

@ -1,145 +1,131 @@
import React from 'react';
import { Form, Input, Row, Col, Checkbox, Button } from 'tdesign-react';
const { FormItem } = Form;
import Style from './mobile.module.less';
import { Form, Input, Checkbox, Button, Space } from 'antd';
import Style from './web.module.less';
export default function render(this: any) {
const { t } = this;
const { relations, entity } = this.props;
const { name, mobile, password, relationArr } = this.state;
const relations2 =
const relationArr2: string[] =
typeof relations === 'object'
? relations
: relations && JSON.parse(relations);
return (
<div className={Style.container}>
<Row gutter={16}>
<Col xs={12} sm={4}>
<Form
colon={false}
labelAlign="right"
labelWidth="100px"
layout="vertical"
preventSubmitDefault
resetType="empty"
showErrorMessage
submitWithWarningMessage={false}
>
<FormItem
<Form colon labelCol={{ span: 4 }} wrapperCol={{ span: 8 }}>
<Form.Item
label="姓名"
name="name"
rules={[
{
required: true,
message: '姓名不能为空',
type: 'error',
},
]}
>
<>
<Input
onChange={(value, context) => {
this.setUpdateData('name', value);
onChange={(e) => {
this.setUpdateData('name', e.target.value);
}}
value={name}
align="left"
placeholder="请输入内容"
type="text"
placeholder="请输入姓名"
/>
</FormItem>
<FormItem
</>
</Form.Item>
<Form.Item
label="手机号码"
name="mobile"
rules={[
{
required: true,
message: '手机号不能为空',
type: 'error',
},
{
min: 11,
message: '请输入11位手机号',
type: 'error',
},
{
max: 11,
message: '请输入11位手机号',
type: 'error',
},
]}
>
<>
<Input
onChange={(value, context) => {
maxLength={11}
value={mobile}
onChange={(e) => {
const strValue = e.target.value;
this.setUpdateData(
'mobile$user.0.mobile',
value
strValue.replace(/[^\d\-\d]/g, '')
);
}}
value={mobile}
align="left"
placeholder="请输入内容"
size="medium"
type="text"
placeholder="请输入手机号码"
type="tel"
/>
</FormItem>
<FormItem
initialData="123456"
</>
</Form.Item>
<Form.Item
label="密码"
name="mobile"
rules={[
{
required: true,
message: '密码不能为空',
type: 'error',
},
]}
>
<>
<Input
value={password}
align="left"
placeholder="请输入内容"
showClearIconOnEmpty={false}
size="medium"
status="default"
type="text"
onChange={(e) => {
this.setUpdateData('password', e.target.value);
}}
placeholder="不少于八位"
/>
</FormItem>
<FormItem
</>
</Form.Item>
<Form.Item
label="权限"
rules={[
{
required: true,
message: '请至少选择一个权限',
type: 'error',
},
]}
name="relation"
>
<>
<Checkbox.Group
value={relationArr}
onChange={(value) => {
this.setRelationValue(value);
}}
options={relations2.map((ele: string) => ({
options={relationArr2.map((ele) => ({
value: ele,
label: t(entity + ':r.' + ele),
label:
(this.t && this.t(entity + ':r.' + ele)) ||
ele,
}))}
></Checkbox.Group>
</FormItem>
<FormItem style={{ marginLeft: 100 }}>
</>
</Form.Item>
<Form.Item wrapperCol={{ offset: 4 }}>
<Space>
<Button
theme="primary"
type="submit"
style={{ marginRight: 10 }}
type="primary"
htmlType="submit"
onClick={() => {
this.onConfirm();
}}
>
</Button>
<Button type="reset"></Button>
</FormItem>
<Button htmlType="reset"></Button>
</Space>
</Form.Item>
</Form>
</Col>
</Row>
</div>
);
}