CalendarModal.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import React, { useState, useEffect } from 'react';
  2. import {
  3. InputNumber,
  4. message,
  5. Modal,
  6. Calendar,
  7. Popover,
  8. Form,
  9. Input,
  10. Row,
  11. Col,
  12. List,
  13. Button,
  14. } from 'antd';
  15. import styles from './index.less';
  16. import moment from 'moment';
  17. function CalendarModal(props) {
  18. const { allType, projectList, visible, onOk, onCancel, data, title, footer, loading } = props;
  19. const [form] = Form.useForm();
  20. const [type, setType] = useState({});
  21. const [edit, setEdit] = useState(false);
  22. const [validRange, setValidRange] = useState(null);
  23. const [current, setCurrent] = useState({
  24. date: null,
  25. list: [],
  26. });
  27. const handleOk = () => {
  28. form.validateFields().then(values => {
  29. let params = [];
  30. Object.keys(values).forEach(type_id => {
  31. if (type_id == 'comment') return;
  32. let item = values[type_id];
  33. params.push({
  34. type_id: Number(type_id),
  35. comment: values.comment,
  36. data: data.time.map(obj => ({
  37. id: obj.id,
  38. project_id: Number(obj.project_id),
  39. workload: item[obj.time],
  40. day: obj.time,
  41. })),
  42. });
  43. });
  44. onOk(params);
  45. });
  46. };
  47. const itemRender = item => {
  48. let name;
  49. if (item.project_id == '0') {
  50. let pid = allType[item.type_id].parent_id;
  51. name = allType[pid].name;
  52. } else {
  53. name = projectList.find(p => p.ID == item.project_id)?.Name;
  54. }
  55. // if (edit) {
  56. // return (
  57. // <div>
  58. // {allType[item.type_id].name}
  59. // {form.getFieldDecorator(`${item.type_id}.${item.time}`, {
  60. // initialValue: item?.workload,
  61. // })(<InputNumber min={0} max={8}></InputNumber>)}
  62. // </div>
  63. // );
  64. // } else {
  65. return (
  66. <div>
  67. {name}-{allType[item.type_id].name}:{item.workload}小时
  68. </div>
  69. );
  70. // }
  71. };
  72. const dateCellRender = value => {
  73. let current = value.format('YYYY-MM-DD');
  74. let list = data.time.filter(item => item.time == current);
  75. let total = list.reduce((total, item) => total + item.workload, 0);
  76. if (list.length == 0) return;
  77. // if (!edit) {
  78. return <Popover content={<div>{list.map(itemRender)}</div>}>本日工时: {total} </Popover>;
  79. // } else {
  80. // return <div>{list.map(itemRender)}</div>;
  81. // }
  82. };
  83. const onChangeDate = value => {
  84. let time = value.format('YYYY-MM-DD');
  85. setCurrent({
  86. date: value,
  87. list: data.time.filter(item => item.time == time),
  88. });
  89. };
  90. useEffect(() => {
  91. if (data.time.length == 0) return;
  92. let month = moment(data.time[0].ts).month();
  93. let start = moment()
  94. .month(month)
  95. .date(1);
  96. let end = moment()
  97. .month(month + 1)
  98. .date(0);
  99. setValidRange([start, end]);
  100. let time = moment(data.date).format('YYYY-MM-DD');
  101. setCurrent({
  102. date: moment(data.date),
  103. list: data.time.filter(item => item.time == time),
  104. });
  105. }, [data.time]);
  106. return (
  107. <Modal
  108. width={1400}
  109. title={`${data.date}工时`}
  110. visible={visible}
  111. confirmLoading={loading}
  112. onCancel={onCancel}
  113. maskClosable={false}
  114. onOk={handleOk}
  115. footer={footer}
  116. destroyOnClose
  117. >
  118. <Row gutter={8}>
  119. <Col span={18}>
  120. <Calendar
  121. validRange={validRange}
  122. value={current.date}
  123. headerRender={() => {}}
  124. dateCellRender={dateCellRender}
  125. onChange={onChangeDate}
  126. />
  127. </Col>
  128. <Col span={6}>
  129. <Button>添加</Button>
  130. {current.list.map(item => (
  131. <Form.Item
  132. label={item.TypeInfo?.name}
  133. name={`${item.type_id}.${item.time}`}
  134. initialValue={item?.workload}
  135. >
  136. <InputNumber min={0} max={8} disabled={!edit} />
  137. </Form.Item>
  138. ))}
  139. <Form.Item label="日志" name="comment" initialValue={current.list[0]?.comment}>
  140. <Input.TextArea rows={5} disabled={!edit} />
  141. </Form.Item>
  142. <div className={styles.btns}>
  143. {edit ? (
  144. <>
  145. <Button
  146. onClick={() => {
  147. form.resetFields();
  148. setEdit(false);
  149. }}
  150. >
  151. 取消
  152. </Button>
  153. <Button onClick={() => setEdit(false)} type="primary">
  154. 保存
  155. </Button>
  156. </>
  157. ) : (
  158. <Button type="primary" onClick={() => setEdit(true)}>
  159. 编辑
  160. </Button>
  161. )}
  162. </div>
  163. </Col>
  164. </Row>
  165. </Modal>
  166. );
  167. }
  168. export default CalendarModal;