2024-05-30 22:56:18 -04:00
|
|
|
import {PlusOutlined, QuestionCircleOutlined} from '@ant-design/icons';
|
2024-04-19 05:44:44 -04:00
|
|
|
import {
|
|
|
|
ModalForm,
|
|
|
|
ProForm,
|
2024-04-25 04:36:40 -04:00
|
|
|
ProFormDateRangePicker, ProFormDateTimeRangePicker,
|
2024-04-19 05:44:44 -04:00
|
|
|
ProFormSelect,
|
2024-04-24 01:54:59 -04:00
|
|
|
ProFormText, ProFormTextArea, ProFormTreeSelect,
|
2024-04-19 05:44:44 -04:00
|
|
|
} from '@ant-design/pro-components';
|
2024-05-30 22:56:18 -04:00
|
|
|
import {Button, Form, message, Popconfirm} from 'antd';
|
2024-05-29 04:44:23 -04:00
|
|
|
import React, {useEffect, useState} from "react";
|
2024-04-25 04:36:40 -04:00
|
|
|
import {
|
2024-05-30 22:56:18 -04:00
|
|
|
addTask, deleteTask, getTask,
|
2024-04-25 04:36:40 -04:00
|
|
|
getTaskTreeResult,
|
2025-06-26 06:59:31 -04:00
|
|
|
OPERATION_BUTTON_TYPE, TASK_TYPE,
|
2024-04-25 04:36:40 -04:00
|
|
|
taskPriorityList,
|
2024-05-30 22:56:18 -04:00
|
|
|
taskStateList, updateTask
|
2024-05-10 04:00:35 -04:00
|
|
|
} from "@/lib/task/project/data";
|
|
|
|
import {DataType} from "@/lib/definitions";
|
2024-05-29 04:44:23 -04:00
|
|
|
import dayjs, {Dayjs} from "dayjs";
|
2025-07-15 07:04:51 -04:00
|
|
|
import DiaryOption from "@/components/DiaryOption";
|
2024-04-19 05:44:44 -04:00
|
|
|
|
2025-07-15 07:04:51 -04:00
|
|
|
export type DetailModelFormProps = {
|
2024-05-29 04:44:23 -04:00
|
|
|
// 当前内容id
|
2024-11-29 06:24:50 -05:00
|
|
|
itemId?: string,
|
2025-07-15 07:04:51 -04:00
|
|
|
pid?: string,
|
2024-05-30 22:56:18 -04:00
|
|
|
// 祖宗任务id
|
2025-07-15 07:04:51 -04:00
|
|
|
pPid?: string,
|
2024-05-29 04:44:23 -04:00
|
|
|
// 操作id
|
2025-07-07 06:46:26 -04:00
|
|
|
operationId: OPERATION_BUTTON_TYPE,
|
2024-05-29 04:44:23 -04:00
|
|
|
// 标题描述
|
2025-07-15 07:04:51 -04:00
|
|
|
description: string,
|
2024-05-29 04:44:23 -04:00
|
|
|
// 是否打开界面,用于非按钮操作
|
2025-07-15 07:04:51 -04:00
|
|
|
open: boolean,
|
2024-05-29 04:44:23 -04:00
|
|
|
// 使用按钮操作
|
2025-07-15 07:04:51 -04:00
|
|
|
haveButton: boolean,
|
|
|
|
expectedStartTime?: Dayjs,
|
|
|
|
expectedEndTime?: Dayjs,
|
2024-05-29 04:44:23 -04:00
|
|
|
// 重新加载数据
|
2024-04-25 04:36:40 -04:00
|
|
|
reloadData?: () => void
|
2024-04-19 05:44:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
export type PidSelectTree = { label: string; value: string; pid: string; children?: PidSelectTree[] }
|
2024-05-29 04:44:23 -04:00
|
|
|
|
2024-04-19 05:44:44 -04:00
|
|
|
export const DetailModelForm: React.FC<DetailModelFormProps> = (props) => {
|
2025-07-15 07:04:51 -04:00
|
|
|
console.log("DetailModelForm:props:", props)
|
2024-04-24 01:54:59 -04:00
|
|
|
const [form] = Form.useForm<DataType>();
|
2025-07-15 07:04:51 -04:00
|
|
|
const [pid, setPid] = useState<string>(props.pid ? props.pid : '0');
|
2024-05-30 22:56:18 -04:00
|
|
|
const [editFormDisable, setEditFormDisable] = useState(props.operationId === OPERATION_BUTTON_TYPE.DETAIL)
|
2025-06-26 06:59:31 -04:00
|
|
|
// 团队第一层 pid必须为0
|
|
|
|
const [taskType, setTaskType] = useState('0')
|
2024-05-29 04:44:23 -04:00
|
|
|
useEffect(() => {
|
2025-07-15 07:04:51 -04:00
|
|
|
if (props.itemId != undefined && (
|
2024-05-29 04:44:23 -04:00
|
|
|
props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE)) {
|
|
|
|
getTask(props.itemId).then(task => {
|
|
|
|
console.log('DetailModelForm:getTask(props.itemId)', props.itemId, task);
|
|
|
|
if (task.status.success) {
|
|
|
|
// setTaskMessage(task.data)
|
2025-05-30 06:53:42 -04:00
|
|
|
task.data.state = taskStateList.find(taskState => taskState.code === task.data.state?.toString())!.name;
|
|
|
|
task.data.priority = taskPriorityList.find(taskPriority => taskPriority.code === task.data.priority?.toString())!.name;
|
2024-05-29 04:44:23 -04:00
|
|
|
task.data.actualTimeRange = [task.data.actualStartTime ? dayjs(task.data.actualStartTime) : undefined,
|
|
|
|
task.data.actualEndTime ? dayjs(task.data.actualEndTime) : undefined];
|
|
|
|
task.data.expectedTimeRange = [task.data.expectedStartTime ? dayjs(task.data.expectedStartTime) : undefined,
|
|
|
|
task.data.expectedEndTime ? dayjs(task.data.expectedEndTime) : undefined];
|
|
|
|
form.setFieldsValue(task.data)
|
2025-07-15 07:04:51 -04:00
|
|
|
console.log("form.setFieldsValue(task.data)" + JSON.stringify(task.data))
|
2024-05-29 04:44:23 -04:00
|
|
|
} else {
|
|
|
|
message.error(task.status.message);
|
|
|
|
props.reloadData?.()
|
|
|
|
}
|
|
|
|
})
|
2025-07-15 07:04:51 -04:00
|
|
|
} else if (props.operationId === OPERATION_BUTTON_TYPE.ADD || props.operationId === OPERATION_BUTTON_TYPE.ADD_CHILD) {
|
|
|
|
let data = {
|
|
|
|
'expectedTimeRange': [props.expectedStartTime ? props.expectedStartTime : dayjs(), props.expectedEndTime],
|
|
|
|
'pid': props.pid
|
|
|
|
};
|
2024-05-29 04:44:23 -04:00
|
|
|
form.setFieldsValue(data)
|
|
|
|
}
|
|
|
|
}, [props])
|
2025-07-15 07:04:51 -04:00
|
|
|
|
|
|
|
function childReduce(child: DataType[]): PidSelectTree[] {
|
|
|
|
const result: PidSelectTree[] = [];
|
|
|
|
child.map(data => {
|
|
|
|
const resultData: PidSelectTree = {label: data.name, value: data.id, pid: data.pid};
|
|
|
|
if (data.children) {
|
|
|
|
resultData.children = childReduce(data.children);
|
2024-04-24 01:54:59 -04:00
|
|
|
}
|
|
|
|
result.push(resultData);
|
|
|
|
})
|
|
|
|
return result;
|
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
|
2024-05-29 04:44:23 -04:00
|
|
|
// 如果不是添加任务需要回显
|
2024-04-19 05:44:44 -04:00
|
|
|
return (
|
2024-04-24 01:54:59 -04:00
|
|
|
<ModalForm<DataType>
|
2024-05-29 04:44:23 -04:00
|
|
|
title={props.description}
|
2025-07-15 07:04:51 -04:00
|
|
|
open={props.open && !props.haveButton}
|
|
|
|
trigger={props.haveButton ?
|
2024-04-19 05:44:44 -04:00
|
|
|
<Button type="primary">
|
2025-07-15 07:04:51 -04:00
|
|
|
<PlusOutlined/>
|
2024-04-19 05:44:44 -04:00
|
|
|
{props.description}
|
2025-07-15 07:04:51 -04:00
|
|
|
</Button> : undefined
|
2024-04-19 05:44:44 -04:00
|
|
|
}
|
|
|
|
form={form}
|
|
|
|
autoFocusFirstInput
|
|
|
|
modalProps={{
|
|
|
|
destroyOnClose: true,
|
2024-05-29 04:44:23 -04:00
|
|
|
onCancel: () => {
|
|
|
|
console.log('run');
|
|
|
|
props.reloadData?.();
|
|
|
|
},
|
2024-04-19 05:44:44 -04:00
|
|
|
}}
|
2025-07-15 07:04:51 -04:00
|
|
|
submitter={props.itemId !== undefined && props.itemId !== '-1' ? {
|
2024-05-30 22:56:18 -04:00
|
|
|
render: (prop, defaultDoms) => {
|
|
|
|
return [
|
2025-07-15 07:04:51 -04:00
|
|
|
editFormDisable ? <Button
|
2024-05-30 22:56:18 -04:00
|
|
|
key="edit"
|
|
|
|
onClick={() => {
|
|
|
|
// props.submit();
|
|
|
|
setEditFormDisable(false)
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
编辑
|
2025-07-15 07:04:51 -04:00
|
|
|
</Button> : undefined,
|
|
|
|
props.operationId === OPERATION_BUTTON_TYPE.DETAIL || props.operationId === OPERATION_BUTTON_TYPE.UPDATE ?
|
|
|
|
<Popconfirm
|
|
|
|
key='delete'
|
|
|
|
title="删除任务"
|
|
|
|
description="确认要删除任务?"
|
|
|
|
icon={<QuestionCircleOutlined style={{color: 'red'}}/>}
|
|
|
|
okText="确认"
|
|
|
|
cancelText="取消"
|
|
|
|
onConfirm={() => {
|
|
|
|
if (props.itemId !== undefined) {
|
|
|
|
deleteTask(props.itemId).then((response => {
|
|
|
|
console.log('response', response)
|
|
|
|
if (response.status.success) {
|
|
|
|
message.success("删除任务成功:" + response.data)
|
|
|
|
props.reloadData?.()
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<Button type="primary" danger>
|
|
|
|
删除
|
|
|
|
</Button>
|
|
|
|
</Popconfirm> : undefined
|
2024-05-30 22:56:18 -04:00
|
|
|
,
|
2025-07-15 07:04:51 -04:00
|
|
|
<DiaryOption/>,
|
2024-05-30 22:56:18 -04:00
|
|
|
...defaultDoms
|
|
|
|
];
|
|
|
|
},
|
2025-07-15 07:04:51 -04:00
|
|
|
} : undefined}
|
2024-04-19 05:44:44 -04:00
|
|
|
onFinish={async (values) => {
|
2024-04-25 23:17:44 -04:00
|
|
|
console.log('Received values of form: ', values);
|
2025-07-15 07:04:51 -04:00
|
|
|
if (values.pid === undefined) {
|
|
|
|
values.pid = '0'
|
2024-04-25 23:17:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
if (values.expectedTimeRange?.[0] != undefined) {
|
|
|
|
values.expectedStartTime = dayjs(values.expectedTimeRange[0]).format()
|
2024-04-25 23:17:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
if (values.expectedTimeRange?.[1] != undefined) {
|
|
|
|
values.expectedEndTime = dayjs(values.expectedTimeRange[1]).format()
|
2024-04-25 23:17:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
if (values.actualTimeRange?.[0] != undefined) {
|
|
|
|
values.actualStartTime = dayjs(values.actualTimeRange[0]).toDate()
|
2024-04-25 23:17:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
if (values.actualTimeRange?.[1] != undefined) {
|
|
|
|
values.actualEndTime = dayjs(values.actualTimeRange[1]).toDate()
|
2024-04-25 23:17:44 -04:00
|
|
|
}
|
2025-07-15 07:04:51 -04:00
|
|
|
var result: boolean = false;
|
2024-05-30 22:56:18 -04:00
|
|
|
|
|
|
|
let state = taskStateList.find(taskState => taskState.name === values.state?.toString());
|
|
|
|
if (state) {
|
|
|
|
values.state = state.code
|
|
|
|
}
|
|
|
|
let priority = taskPriorityList.find(taskPriority => taskPriority.name === values.priority?.toString())
|
|
|
|
if (priority) {
|
|
|
|
values.priority = priority.code
|
|
|
|
}
|
2024-05-30 05:55:55 -04:00
|
|
|
// todo 修改
|
2025-07-15 07:04:51 -04:00
|
|
|
if (props.operationId === OPERATION_BUTTON_TYPE.UPDATE || (props.operationId === OPERATION_BUTTON_TYPE.DETAIL && !editFormDisable)) {
|
2024-05-30 22:56:18 -04:00
|
|
|
await updateTask(values).then(response => {
|
|
|
|
console.log('response', response)
|
|
|
|
if (response.status.success) {
|
|
|
|
message.success("修改任务成功:" + response.data)
|
|
|
|
// 树任务重新刷新
|
|
|
|
// 四象限任务重新刷新
|
|
|
|
// 如果可以直接更新列表而不请求。。。。。。
|
2025-07-15 07:04:51 -04:00
|
|
|
console.log('props.reloadData?.()', props.reloadData)
|
2024-05-30 22:56:18 -04:00
|
|
|
props.reloadData?.()
|
2025-07-15 07:04:51 -04:00
|
|
|
result = true
|
|
|
|
} else {
|
2024-05-30 22:56:18 -04:00
|
|
|
message.error(response.status.message)
|
2025-07-15 07:04:51 -04:00
|
|
|
result = false
|
2024-05-30 22:56:18 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
2025-07-15 07:04:51 -04:00
|
|
|
} else {
|
2024-05-30 22:56:18 -04:00
|
|
|
await addTask(values).then(response => {
|
|
|
|
console.log('response', response)
|
|
|
|
if (response.status.success) {
|
|
|
|
message.success("添加任务成功:" + response.data)
|
|
|
|
// 树任务重新刷新
|
|
|
|
// 四象限任务重新刷新
|
|
|
|
// 如果可以直接更新列表而不请求。。。。。。
|
2025-07-15 07:04:51 -04:00
|
|
|
console.log('props.reloadData?.()', props.reloadData)
|
2024-05-30 22:56:18 -04:00
|
|
|
props.reloadData?.()
|
2025-07-15 07:04:51 -04:00
|
|
|
result = true
|
|
|
|
} else {
|
2024-05-30 22:56:18 -04:00
|
|
|
message.error(response.status.message)
|
2025-07-15 07:04:51 -04:00
|
|
|
result = false
|
2024-05-30 22:56:18 -04:00
|
|
|
}
|
2024-04-25 04:36:40 -04:00
|
|
|
}
|
2024-05-30 22:56:18 -04:00
|
|
|
);
|
|
|
|
}
|
2024-04-25 23:17:44 -04:00
|
|
|
return result;
|
2024-04-19 05:44:44 -04:00
|
|
|
}}
|
|
|
|
>
|
2025-07-15 07:04:51 -04:00
|
|
|
<ProFormText width="sm" name="id" hidden={true} label="主键"/>
|
|
|
|
<ProFormText width="sm" name="code" initialValue={props.itemId} hidden={true} label="任务编码"/>
|
|
|
|
<ProFormText width="sm" name="pPid" initialValue={props.pPid} hidden={true} label="祖宗id"/>
|
2024-04-19 05:44:44 -04:00
|
|
|
<ProForm.Group>
|
2025-06-26 06:59:31 -04:00
|
|
|
<ProFormSelect
|
|
|
|
required={true}
|
|
|
|
options={TASK_TYPE}
|
|
|
|
width="sm"
|
|
|
|
name="taskType"
|
|
|
|
label="任务类型"
|
|
|
|
initialValue='0'
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
|
|
|
onChange={(value: string, option) => {
|
2025-06-26 06:59:31 -04:00
|
|
|
setTaskType(value)
|
|
|
|
}}
|
2025-07-10 07:03:22 -04:00
|
|
|
rules={[
|
2025-07-15 07:04:51 -04:00
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: "请输入计划类型"
|
2025-07-10 07:03:22 -04:00
|
|
|
}
|
|
|
|
]}
|
2025-06-26 06:59:31 -04:00
|
|
|
/>
|
|
|
|
<ProFormText
|
|
|
|
required={true}
|
2025-07-15 07:04:51 -04:00
|
|
|
hidden={taskType != '1'}
|
2025-06-26 06:59:31 -04:00
|
|
|
width="sm"
|
|
|
|
name="fName"
|
|
|
|
label="团队名称"
|
|
|
|
tooltip="最长为 10 位"
|
|
|
|
placeholder="请输入团队名称"
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
2025-06-26 06:59:31 -04:00
|
|
|
/>
|
2024-04-24 01:54:59 -04:00
|
|
|
<ProFormTreeSelect
|
2025-07-15 07:04:51 -04:00
|
|
|
hidden={taskType == '1'}
|
2025-06-26 06:59:31 -04:00
|
|
|
width="sm"
|
2025-07-15 07:04:51 -04:00
|
|
|
request={() => {
|
2024-04-24 01:54:59 -04:00
|
|
|
return getTaskTreeResult(JSON.stringify(
|
2025-07-15 07:04:51 -04:00
|
|
|
{
|
|
|
|
pageSize: 1000,
|
|
|
|
pageNumber: 1,
|
|
|
|
data: [{code: 'pid', value: '0', operateType: '='}, {
|
|
|
|
code: 'state',
|
|
|
|
value: '8,9',
|
|
|
|
operateType: 'IN'
|
|
|
|
}, {code: '', value: true, operateType: "TREE"}]
|
|
|
|
}
|
|
|
|
)).then(result => childReduce(result.data.content))
|
2024-04-24 01:54:59 -04:00
|
|
|
}}
|
|
|
|
name="pid"
|
|
|
|
label="父级任务"
|
2025-07-15 07:04:51 -04:00
|
|
|
fieldProps={{
|
|
|
|
onSelect: (e, node) => {
|
|
|
|
console.log('onSelect', e, node);
|
|
|
|
setPid(e)
|
|
|
|
}
|
|
|
|
}}
|
|
|
|
disabled={editFormDisable}
|
2024-04-19 05:44:44 -04:00
|
|
|
/>
|
|
|
|
<ProFormText
|
2025-06-26 06:59:31 -04:00
|
|
|
required={true}
|
|
|
|
width="sm"
|
2024-04-24 01:54:59 -04:00
|
|
|
name="name"
|
|
|
|
label="任务名称"
|
2025-06-26 06:59:31 -04:00
|
|
|
tooltip="最长为 10 位"
|
2024-04-24 01:54:59 -04:00
|
|
|
placeholder="请输入任务名称"
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
2025-07-10 07:03:22 -04:00
|
|
|
rules={[
|
2025-07-15 07:04:51 -04:00
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: "请输入计划名称"
|
|
|
|
}, {
|
|
|
|
max: 10,
|
|
|
|
message: "名称长度不易超过10个字"
|
2025-07-10 07:03:22 -04:00
|
|
|
}
|
|
|
|
]}
|
2024-04-19 05:44:44 -04:00
|
|
|
/>
|
|
|
|
</ProForm.Group>
|
2024-04-24 01:54:59 -04:00
|
|
|
<ProFormTextArea
|
|
|
|
// width="md"
|
|
|
|
name="description"
|
|
|
|
label="任务描述"
|
|
|
|
// tooltip="最长为 24 位"
|
|
|
|
placeholder="请输入任务描述"
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
2024-04-24 01:54:59 -04:00
|
|
|
/>
|
|
|
|
|
2024-04-19 05:44:44 -04:00
|
|
|
<ProForm.Group>
|
2024-04-24 01:54:59 -04:00
|
|
|
<ProFormSelect
|
|
|
|
request={async () => taskPriorityList.map(taskState => {
|
|
|
|
return {
|
|
|
|
'label': taskState.name,
|
|
|
|
'value': taskState.code
|
|
|
|
}
|
|
|
|
})}
|
|
|
|
width="sm"
|
|
|
|
name="priority"
|
|
|
|
label="任务优先级"
|
2024-04-25 04:36:40 -04:00
|
|
|
initialValue='3'
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
2025-07-10 07:03:22 -04:00
|
|
|
rules={[
|
2025-07-15 07:04:51 -04:00
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: "请选择计划优先级"
|
2025-07-10 07:03:22 -04:00
|
|
|
}
|
|
|
|
]}
|
2024-04-24 01:54:59 -04:00
|
|
|
/>
|
|
|
|
<ProFormSelect
|
|
|
|
width="sm"
|
|
|
|
options={taskStateList.map(taskState => {
|
|
|
|
return {
|
|
|
|
'label': taskState.name,
|
|
|
|
'value': taskState.code
|
|
|
|
}
|
|
|
|
})}
|
|
|
|
name="state"
|
|
|
|
label="任务状态"
|
2024-04-25 04:36:40 -04:00
|
|
|
initialValue='8'
|
2025-07-15 07:04:51 -04:00
|
|
|
disabled={editFormDisable}
|
2025-07-10 07:03:22 -04:00
|
|
|
rules={[
|
2025-07-15 07:04:51 -04:00
|
|
|
{
|
|
|
|
required: true,
|
|
|
|
message: "请选择计划状态"
|
2025-07-10 07:03:22 -04:00
|
|
|
}
|
|
|
|
]}
|
2024-04-19 05:44:44 -04:00
|
|
|
/>
|
|
|
|
</ProForm.Group>
|
2024-04-24 01:54:59 -04:00
|
|
|
|
2024-04-19 05:44:44 -04:00
|
|
|
<ProForm.Group>
|
2024-04-25 04:36:40 -04:00
|
|
|
<ProFormDateTimeRangePicker
|
2024-04-25 23:17:44 -04:00
|
|
|
initialValue={[dayjs(), undefined]}
|
2024-04-24 01:54:59 -04:00
|
|
|
name="expectedTimeRange"
|
|
|
|
label="期望时间"
|
2025-07-15 07:04:51 -04:00
|
|
|
fieldProps={{allowEmpty: [true, true], showTime: true, needConfirm: true}}
|
|
|
|
placeholder={['开始时间', '结束时间']}
|
|
|
|
disabled={editFormDisable}
|
2024-04-19 05:44:44 -04:00
|
|
|
/>
|
2024-04-25 04:36:40 -04:00
|
|
|
<ProFormDateTimeRangePicker
|
2024-04-24 01:54:59 -04:00
|
|
|
name="actualTimeRange"
|
|
|
|
label="实际时间"
|
2025-07-15 07:04:51 -04:00
|
|
|
fieldProps={{allowEmpty: [true, true], showTime: true, needConfirm: true}}
|
|
|
|
placeholder={['开始时间', '结束时间']}
|
|
|
|
disabled={editFormDisable}
|
2024-04-19 05:44:44 -04:00
|
|
|
/>
|
|
|
|
</ProForm.Group>
|
2024-04-24 01:54:59 -04:00
|
|
|
|
2024-04-19 05:44:44 -04:00
|
|
|
</ModalForm>
|
|
|
|
);
|
|
|
|
};
|