From 6c95ff98f49d33fcbe7344a35d4122841f3c2502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=AB=A5=E5=B4=87?= <792998983@qq.com> Date: Mon, 26 Jul 2021 16:15:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug,=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/military/fetch.js | 4 +- src/military/task/agreementManage/index.js | 44 +++++++++-- src/military/task/api.js | 9 +++ .../task/components/adminRouter/index.jsx | 14 ++-- .../task/components/agreementModal/index.jsx | 10 +-- .../task/components/complainModal/index.jsx | 6 +- .../components/itemAgreementManage/index.jsx | 2 +- .../task/components/itemListMyTask/index.jsx | 79 +++++++++++++++++-- .../task/components/itemListMyTask/index.scss | 3 + .../task/components/itemListPaper/index.jsx | 15 ++-- .../task/components/itemListTask/index.jsx | 9 +-- .../task/components/itemPayProof/index.jsx | 4 +- .../itemPublicityComplain/index.jsx | 23 ++---- .../task/components/itemTaskManage/index.jsx | 11 ++- .../task/components/proofModal/index.jsx | 3 - src/military/task/myTask/index.jsx | 49 ++++++------ src/military/task/myTask/joinTask.jsx | 69 +++++++++------- src/military/task/paperComplain/index.js | 40 +++++----- src/military/task/paperManage/index.jsx | 48 ++++++----- src/military/task/payProof/index.js | 8 +- src/military/task/proofManage/index.js | 2 +- src/military/task/publicityComplain/index.js | 2 +- src/military/task/static.js | 9 ++- src/military/task/taskAdmin/index.jsx | 66 +++++++++++++--- src/military/task/taskAdmin/index.scss | 25 +++++- src/military/task/taskDetail/index.jsx | 72 +++++++++-------- src/military/task/taskDetail/index.scss | 1 - src/military/task/taskEdit/index.jsx | 4 +- src/military/task/taskList/index.jsx | 34 +++++++- src/military/task/taskManage/index.js | 6 +- 30 files changed, 448 insertions(+), 223 deletions(-) diff --git a/src/military/fetch.js b/src/military/fetch.js index 45a48ed71..2ea879b54 100644 --- a/src/military/fetch.js +++ b/src/military/fetch.js @@ -5,8 +5,8 @@ import cookie from 'react-cookies'; let actionUrl = ''; if (window.location.href.indexOf('localhost') > -1) { - // actionUrl = 'http://117.50.100.12:8008'; - actionUrl='http://192.168.31.72:8081'; + actionUrl = 'http://117.50.100.12:8008'; + // actionUrl='http://192.168.31.73:8081'; } else if (window.location.href.indexOf('117.50.100.12') > -1) { actionUrl = "http://117.50.100.12:8008"; axios.defaults.withCredentials = true; diff --git a/src/military/task/agreementManage/index.js b/src/military/task/agreementManage/index.js index 8fee7247a..c7e5355d6 100644 --- a/src/military/task/agreementManage/index.js +++ b/src/military/task/agreementManage/index.js @@ -1,4 +1,4 @@ -import React, { useCallback, forwardRef, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { Input, Button, Form, Select } from 'antd'; import AdminRouter from '../components/adminRouter'; import ItemAgreementManage from '../components/itemAgreementManage'; @@ -9,10 +9,10 @@ import '../index.scss'; const Option = Select.Option; const agreementOptionArr = agreementArr.slice(0, 2); -export default Form.create()(({ current_user, form, showNotification, match, history }) => { +export default Form.create()(({ form, showNotification, match, history }) => { - const { getFieldDecorator, validateFields, setFieldsValue, getFieldsValue } = form; + const { getFieldDecorator, validateFields, setFieldsValue, } = form; const [approve, setApprove] = useState(1); const [loading, setLoading] = useState(false); @@ -25,6 +25,9 @@ export default Form.create()(({ current_user, form, showNotification, match, his const [reload, setReload] = useState(0); + const [loadPaper, setLoadPaper] = useState(0); + + // 加载审核协议列表 useEffect(() => { const params = { ...searchObj, @@ -36,14 +39,41 @@ export default Form.create()(({ current_user, form, showNotification, match, his setLoading(true); agreementList(params).then(data => { if (data) { + if (loadPaper === 0 && data.rows.length === 0) { + setLoadPaper(1); + } else { + setLoadPaper(2); + } setTaskList(data.rows); setTotal(data.total); } setLoading(false); - }) + }); }, [reload, status, curPage, searchObj, type]); + // 如果第一次加载任务协议审核发现没有数据,那么切换成审核成果协议列表 + useEffect(() => { + if (loadPaper === 1) { + const params = { + status: '2', + type: '2', + currentPage: 1, + pageSize: 10, + }; + setLoading(true); + agreementList(params).then(data => { + if (data && data.rows.length > 0) { + setTaskList(data.rows); + setTotal(data.total); + setType('2'); + setLoadPaper(2); + } + setLoading(false); + }); + } + }, [loadPaper]); + // form表单公共处理函数 const helper = useCallback( (name, rules, widget, initialValue) => ( @@ -60,11 +90,13 @@ export default Form.create()(({ current_user, form, showNotification, match, his }); } + // 修改选项 const changeOptionId = useCallback((option) => { setStatus(option.dicItemCode.toString() || '0,1'); setCurPage(1); }, []); + // 修改状态 function changeApprove(approve) { setApprove(approve); setCurPage(1); @@ -75,6 +107,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } } + // 清除查询内容 function clearSearch() { setFieldsValue({ taskNumber: '', @@ -84,8 +117,9 @@ export default Form.create()(({ current_user, form, showNotification, match, his setSearchObj({}); } + // 刷新数据 const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []); diff --git a/src/military/task/api.js b/src/military/task/api.js index 24512d87c..d046c0e24 100644 --- a/src/military/task/api.js +++ b/src/military/task/api.js @@ -518,6 +518,15 @@ export function confirmReceipt(paperId) { } +// 下载协议签订凭证 +export function downAgreement(params) { + return fetch({ + url: `/api/myTasks/getWinnersContractsByTaskId`, + method: 'get', + params, + }); +} + // 管理员修改任务公示方式 export function changeShowUserMode(data) { return fetch({ diff --git a/src/military/task/components/adminRouter/index.jsx b/src/military/task/components/adminRouter/index.jsx index d56e53b1f..fef308381 100644 --- a/src/military/task/components/adminRouter/index.jsx +++ b/src/military/task/components/adminRouter/index.jsx @@ -1,16 +1,12 @@ -import React, { useEffect, useState, useCallback, useMemo } from 'react'; -import { Menu, Dropdown, Button } from 'antd'; +import React, { useMemo } from 'react'; +import { Menu, Dropdown, } from 'antd'; +import { current_main_site_url,main_web_site_url} from '../../static'; + import './index.scss'; const { SubMenu } = Menu; export default props => { - const main_web_site_url = useMemo(() => { - return JSON.parse(localStorage.chromesetting).main_web_site_url; - }); - const current_main_site_url = useMemo(() => { - return JSON.parse(localStorage.chromesetting).current_main_site_url; - }); const projectMenu = useMemo(() => { return @@ -71,6 +67,8 @@ export default props => { 企业认证 开源项目 统筹任务发布审批 + 成果上传申诉审批 + 公示期成果申诉审批 协议审批 成果举报申诉 评选佐证材料 diff --git a/src/military/task/components/agreementModal/index.jsx b/src/military/task/components/agreementModal/index.jsx index d5e95a195..57e550513 100644 --- a/src/military/task/components/agreementModal/index.jsx +++ b/src/military/task/components/agreementModal/index.jsx @@ -1,14 +1,12 @@ -import React, { useEffect, useState, useCallback, useMemo } from 'react'; +import React, { useState, } from 'react'; import { Modal, Form, Input, } from 'antd'; import Upload from 'military/components/Upload'; import { uploadAgreePaper } from "../../api"; -import { httpUrl } from 'military/fetch'; import '../../index.scss'; -// import './index.scss'; export default Form.create()(props => { - const { visible, setVisible, paperId, form, showNotification, reloadList } = props; + const { visible, setVisible, checkedItem, form, showNotification } = props; const { getFieldDecorator, validateFields, setFieldsValue, } = form; const [fileList, setFileList] = useState([]); @@ -26,7 +24,7 @@ export default Form.create()(props => { validateFields((err, values) => { if (!err) { uploadAgreePaper({ - paperId, + paperId: checkedItem.id, params: { files: values.files, } @@ -54,6 +52,8 @@ export default Form.create()(props => { className="form-edit-modal" >
+ {/* paperAuditing */} + {checkedItem.paperAuditing &&

审核意见:{checkedItem.paperAuditing.message}

} 协议样板.word { const [fileList, setFileList] = useState([]); - // 上传附件后得到的文件数组 function uploadFunc(fileList, files) { setFileList(fileList); @@ -64,6 +63,7 @@ export default Form.create()(props => { setFieldsValue({ files: '' }); + reloadList(); } } @@ -76,7 +76,7 @@ export default Form.create()(props => { onCancel={() => { setVisible(false) }} className="form-edit-modal" > - {checkedItem.checkStatus === 2 && detailStatus === 3 &&

审核意见:{checkedItem.auditing.message}

} + {checkedItem.checkStatus == 2 && detailStatus === 3 &&

审核意见:{checkedItem.auditing.message}

}

你的申诉信息将发送给平台管理员

请如实填写有效的申诉原由,我们将尽快完成审核

{ diff --git a/src/military/task/components/itemAgreementManage/index.jsx b/src/military/task/components/itemAgreementManage/index.jsx index f21f6558f..fc1a684e2 100644 --- a/src/military/task/components/itemAgreementManage/index.jsx +++ b/src/military/task/components/itemAgreementManage/index.jsx @@ -1,5 +1,5 @@ import React, { useEffect, useState, useCallback } from 'react'; -import { Pagination, Modal, Input, Radio, Form, InputNumber } from 'antd'; +import { Pagination, Modal, Input, Form, } from 'antd'; import { Link } from "react-router-dom"; import Nodata from 'forge/Nodata'; import Loading from "src/Loading"; diff --git a/src/military/task/components/itemListMyTask/index.jsx b/src/military/task/components/itemListMyTask/index.jsx index 3b2d6476e..3fd5dfbd2 100644 --- a/src/military/task/components/itemListMyTask/index.jsx +++ b/src/military/task/components/itemListMyTask/index.jsx @@ -1,12 +1,13 @@ -import React, { useEffect, useState, useCallback } from 'react'; -import { Form, Modal, Input, Pagination, Radio, } from 'antd'; +import React, { useEffect, useState, useCallback, useMemo } from 'react'; +import { Form, Modal, Input, Pagination, Radio, Table } from 'antd'; import { Link } from "react-router-dom"; import Nodata from 'forge/Nodata'; import Loading from "src/Loading"; import Upload from 'military/components/Upload'; import ProofModal from '../proofModal'; import { publishModeArr, taskStatusAllArr } from '../../static'; -import { signMethod, uploadAgreeRequire } from "../../api"; +import { signMethod, uploadAgreeRequire, downAgreement } from "../../api"; +import { httpUrl } from 'military/fetch'; import '../../index.scss'; import './index.scss'; @@ -29,11 +30,23 @@ export default Form.create()((props) => { const [visibleAgree, setVisibleAgree] = useState(false); const [fileList, setFileList] = useState(null); + const [dowloadTaskId, setDowloadTaskId] = useState(''); + const [visibleDownload, setVisibleDownload] = useState(false); + const [uploadList, setUploadList] = useState([]); + useEffect(() => { changePage(page); }, [page]); + useEffect(() => { + visibleDownload && downAgreement({ taskId: dowloadTaskId }).then(res => { + if (res && res.message === "success") { + setUploadList(res.data); + } + }) + }, [visibleDownload]) + function uploadProofs(item) { setVisibleProofs(true); setTaskId(item.id); @@ -101,6 +114,7 @@ export default Form.create()((props) => { setFieldsValue({ files: '' }); + reloadList(); setVisibleAgree(false); showNotification('上传协议成功'); } else { @@ -118,6 +132,34 @@ export default Form.create()((props) => { }) } + + const columns = useMemo(() => { + return [ + { + title: '成果物编号', + dataIndex: 'paperNumber', + }, + { + title: '凭证文件', + dataIndex: 'fileName', + render: (text, record) => { + return { download(record.winnerContracts[0].id) }}> {record.winnerContracts && record.winnerContracts[0].fileName} + } + }, + { + title: '操作', + dataIndex: 'action', + render: (text, record) => { + return { download(record.winnerContracts[0].id) }}> 下载凭证 + } + } + ]; + }, []); + + function download(id) { + window.open(httpUrl + '/busiAttachments/download/' + id); + } + return (
    @@ -147,8 +189,7 @@ export default Form.create()((props) => { {item.status === 4 && 待确认} {item.status === 6 && 待签订协议} : - {item.status === 4 && 待确认} - {item.status === 6 && 待签订协议} + {item.status === 6 && (item.agreementSigning === 1 || (item.agreementSigning === 2 && item.auditing && item.auditing.pass === 1)) && 待签订协议} } @@ -192,6 +233,15 @@ export default Form.create()((props) => { {item.status === 6 && item.agreementSigning === 2 && { uploadAgree(item) }}>上传委托协议} + {item.status === 6 && item.agreementSigning === 1 && 已选择自主签订协议} + + {item.status === 7 && {item.agreementSigning === 1 ? '待胜出者确认收款' : '待平台上传支付凭证'}} + + {item.status === 7 && { setDowloadTaskId(item.id); setVisibleDownload(true); }}>下载协议签订凭证} + + + {/* {item.status === 8 && { uploadAgree(item) }}>上传委托协议} */} + {/* 支付登记 */} {/* 上传支付凭证 */} @@ -260,7 +310,7 @@ export default Form.create()((props) => { className="form-edit-modal" > {checkItem.auditing &&

    - {checkItem.auditing.message} + 审核意见:{checkItem.auditing.message}

    } { + { setVisibleDownload(false) }} + onCancel={() => { setVisibleDownload(false) }} + className="form-edit-modal" + > + row.id} + dataSource={uploadList} + columns={columns} + pagination={false} + /> + + + ) diff --git a/src/military/task/components/itemListMyTask/index.scss b/src/military/task/components/itemListMyTask/index.scss index 457326b69..31f6ca909 100644 --- a/src/military/task/components/itemListMyTask/index.scss +++ b/src/military/task/components/itemListMyTask/index.scss @@ -27,6 +27,9 @@ .mytask-title { justify-content: left; + a{ + word-break: break-all; + } span{ flex: 0 0 auto; } diff --git a/src/military/task/components/itemListPaper/index.jsx b/src/military/task/components/itemListPaper/index.jsx index 54462b41b..4946c7bc1 100644 --- a/src/military/task/components/itemListPaper/index.jsx +++ b/src/military/task/components/itemListPaper/index.jsx @@ -21,7 +21,7 @@ for (const item of paperCheckStatusArr) { } export default Form.create()((props) => { - const { list, curPage, total, changePage, loading, applyStatusAllNameArr, reloadList, showNotification, current_user, form, detailStatus, agreementSigning } = props; + const { list, curPage, total, changePage, loading, applyStatusAllNameArr, reloadList, showNotification, current_user, form, detailStatus } = props; const { getFieldDecorator, validateFields, setFieldsValue } = form; const [page, setPage] = useState(1); const pageSize = props.pageSize || 10; @@ -137,12 +137,14 @@ export default Form.create()((props) => { [] ); + return ( {loading || loadingChild ? : { list.map(item => { + return (
    @@ -154,16 +156,16 @@ export default Form.create()((props) => { {item.user.nickname || item.user.login} {timeAgo(item.createdAt)} - {item.status === 2 ? 胜出 : {item.checkStatus != 1 ? paperCheckStatus[item.checkStatus] : applyStatusAllNameArr[item.status]}} + {item.status === 2 ? 胜出 : {item.checkStatus !== 1 ? paperCheckStatus[item.checkStatus] : applyStatusAllNameArr[item.status]}}
  • - {((item.needComplain && detailStatus === 3) || (detailStatus === 5 && item.status !== 2)) && (current_user.login === item.user.login) && + {((item.needComplain && detailStatus === 3) || (detailStatus === 5 && item.publicTaskComplain && item.checkStatus === 1 && item.status !== 2)) && (current_user.login === item.user.login) && { setComplainVisible(true); setCheckedItem(item) }}>申诉} - {item.status === 2 && detailStatus === 6 && (current_user.login === item.user.login) && (!item.sign) && + {item.status === 2 && detailStatus === 6 && (current_user.login === item.user.login) && (!item.sign) && (item.canApplicantSign||item.canApplicantSignByPlatform) && { setAgreeVisible(true); setCheckedItem(item) }}>签订协议} - {item.status === 2 && detailStatus === 7 && (current_user.login === item.user.login) && (item.agreementSigning === 1) && (!item.isPay) && + {item.status === 2 && detailStatus === 7 && (current_user.login === item.user.login) && (item.task && item.task.agreementSigning === 1) && (!item.isPay) && { confirmReceiptModal(item.id) }}>确认收款}
  • @@ -188,6 +190,7 @@ export default Form.create()((props) => {
    {commentsItem.user.nickname || commentsItem.user.login} {timeAgo(commentsItem.createdAt)} +
    @@ -275,10 +278,12 @@ export default Form.create()((props) => { checkedItem={checkedItem} detailStatus={detailStatus} showNotification={showNotification} + reloadList={reloadList} /> {agreeVisible && { window.location.href = `/users/${login}`; } - function surplusTime(item) { - let surplus = item.collectingDays * 24 * 3600 * 1000 - (new Date() - new Date(item.publishedAt || item.createdAt)); - return formatDuring(surplus) - } return ( loading ? : @@ -41,7 +37,7 @@ export default (props) => {
    { itemClick(item.id) }}>
    {item.name}
    {item.status && {statusArr[item.status]}} - {(item.status !== 8) && item.delayTime && 延期中} + {(item.status !== 8) && item.delayTime.indexOf('延期') > -1 && 延期中}
    { goUser(item.user.login) }}> @@ -50,8 +46,7 @@ export default (props) => { {item.visits || 0} {item.papersCount || 0}人参与 - {(item.status !== 8) && item.delayTime && {item.delayTime}} - {(item.status === 3) && (!item.delayTime) && 剩余{surplusTime(item)}} + {(item.status !== 8) && {item.delayTime}}
    diff --git a/src/military/task/components/itemPayProof/index.jsx b/src/military/task/components/itemPayProof/index.jsx index 7c8c03ca6..7f09a5f57 100644 --- a/src/military/task/components/itemPayProof/index.jsx +++ b/src/military/task/components/itemPayProof/index.jsx @@ -106,9 +106,9 @@ export default Form.create()((props) => {
    -
    + {!item.isPay &&
    -
    +
    } diff --git a/src/military/task/components/itemPublicityComplain/index.jsx b/src/military/task/components/itemPublicityComplain/index.jsx index dd4561147..0cf21ccb6 100644 --- a/src/military/task/components/itemPublicityComplain/index.jsx +++ b/src/military/task/components/itemPublicityComplain/index.jsx @@ -3,11 +3,10 @@ import { Pagination, Modal, Input, Radio, Form, InputNumber } from 'antd'; import { Link } from "react-router-dom"; import Nodata from 'forge/Nodata'; import Loading from "src/Loading"; -import { timeAgo } from 'educoder'; +import { timeAgo, getImageUrl } from 'educoder'; import { checkPublicity } from '../../api'; import { httpUrl } from 'military/fetch'; import './index.scss'; -import winpng from '../../image/win.png'; const { TextArea } = Input; export default Form.create()((props) => { @@ -86,7 +85,7 @@ export default Form.create()((props) => { return (
    - 头像加载失败 + 头像加载失败
  • { goUser(item.user.login) }}>{item.user && (item.user.nickname || item.user.login)} @@ -94,22 +93,10 @@ export default Form.create()((props) => { { goUserMes(item.user.login) }}>私信 {item.status === 2 && { deal(item) }}>处理} - - {/* {item.taskResultProof.status === 1 && 已同意} - {item.taskResultProof.status === 0 && 已拒绝} - - { - item.taskResultProof.status === 2 && - { goUserMes(item.user.login) }}>私信 - { agreeClick(item) }}>同意 - { deal(item) }}>拒绝 - - } */}
  • - {/*
    联系手机: @@ -178,7 +165,7 @@ export default Form.create()((props) => { helper('是否受理', 'isAccepted', [{ required: true, message: "请选择是否受理" }], { setIsAccepted(e.target.value) }} + onChange={(e) => { setIsAccepted(e.target.value); setIsReconsidered(''); setIsChanged(''); }} > 受理 不受理 @@ -190,7 +177,7 @@ export default Form.create()((props) => { isAccepted === '1' && helper('复议评审', 'isReconsidered', [{ required: true, message: "请选择是否启动复议评审" }], { setIsReconsidered(e.target.value) }} + onChange={(e) => { setIsReconsidered(e.target.value); setIsChanged(''); }} > 启动 不启动 @@ -199,7 +186,7 @@ export default Form.create()((props) => { } { - isReconsidered === '0' && helper('公示结果', 'isChanged', [{ required: true, message: "请选择是否更改公示结果" }], + isAccepted === '1' && isReconsidered === '0' && helper('公示结果', 'isChanged', [{ required: true, message: "请选择是否更改公示结果" }], { setIsChanged(e.target.value) }} diff --git a/src/military/task/components/itemTaskManage/index.jsx b/src/military/task/components/itemTaskManage/index.jsx index 072b38ae3..557588776 100644 --- a/src/military/task/components/itemTaskManage/index.jsx +++ b/src/military/task/components/itemTaskManage/index.jsx @@ -1,12 +1,12 @@ import React, { useEffect, useState } from 'react'; -import { Pagination, Modal, Input, Radio } from 'antd'; +import { Pagination, Modal, Input, Radio, Button } from 'antd'; import { Link } from "react-router-dom"; import Nodata from 'forge/Nodata'; import Loading from "src/Loading"; -import { timeAgo } from 'educoder'; +import { timeAgo, getImageUrl } from 'educoder'; +import { main_web_site_url } from '../../static'; import { checkTask } from '../../api'; import './index.scss'; -import winpng from '../../image/win.png'; const { TextArea } = Input; export default (props) => { @@ -82,7 +82,7 @@ export default (props) => { return (
    - 头像加载失败 + 头像加载失败
  • { goUser(item.user.login) }}>{item.user.nickname || item.user.login} @@ -113,6 +113,9 @@ export default (props) => { 123456789123456789
  • + {item.status === 1 &&
    + +
    }
    diff --git a/src/military/task/components/proofModal/index.jsx b/src/military/task/components/proofModal/index.jsx index 6166d858b..4ff7d30c3 100644 --- a/src/military/task/components/proofModal/index.jsx +++ b/src/military/task/components/proofModal/index.jsx @@ -1,13 +1,10 @@ import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { Modal, Table, Form, Input, Button, Pagination } from 'antd'; -import { Link } from "react-router-dom"; import Upload from 'military/components/Upload'; import { readyCheckPapers, proofAdd } from "../../api"; import { httpUrl } from 'military/fetch'; import '../../index.scss'; import './index.scss'; -import { func } from 'prop-types'; - export default Form.create()(props => { const { changeVisible, taskId, taskModeId, visible, form, showNotification, reloadList } = props; diff --git a/src/military/task/myTask/index.jsx b/src/military/task/myTask/index.jsx index b10e2542b..46c6c493f 100644 --- a/src/military/task/myTask/index.jsx +++ b/src/military/task/myTask/index.jsx @@ -1,5 +1,5 @@ import React, { useCallback, useEffect, useState } from 'react'; -import { Tabs, Input, } from 'antd'; +import { Tabs, Input, } from 'antd'; import StatusNav from '../../components/statusNav'; import ItemListMyTask from '../components/itemListMyTask'; import JoinTask from './joinTask'; @@ -9,7 +9,7 @@ import './index.scss'; const Search = Input.Search; const { TabPane } = Tabs; -const publishStatusArr = taskStatusAllArr.slice(3,9); +const publishStatusArr = taskStatusAllArr.slice(3, 9); const unpublishStatusArr = taskStatusAllArr.slice(0, 3); unpublishStatusArr.push({ dicItemCode: '9', name: "待修缮", dicItemName: "待修缮" }); @@ -18,7 +18,7 @@ for (const item of taskStatusAllArr) { statusArr[item.dicItemCode] = item.dicItemName; } -export default ({ location, history, current_user,showNotification }) => { +export default ({ location, history, current_user, showNotification }) => { console.log(current_user); let defaultValue = decodeURI(location.search.split("=")[1] || ""); @@ -33,12 +33,11 @@ export default ({ location, history, current_user,showNotification }) => { }); const [searchInput, setSearchInput] = useState(''); - const [orderBy, setOrderBy] = useState('createdAtDesc'); const [curPage, setCurPage] = useState(1); const [total, setTotal] = useState(0); const [myTaskList, setMyTaskList] = useState([]); const [loading, setLoading] = useState(false); - const [reload,setReload]=useState(0); + const [reload, setReload] = useState(0); // 获取任务领域数组 useEffect(() => { @@ -57,7 +56,7 @@ export default ({ location, history, current_user,showNotification }) => { const params = { statusString, searchInput, - orderBy, + orderBy: 'createdAtDesc', curPage, pageSize: 10, }; @@ -69,7 +68,7 @@ export default ({ location, history, current_user,showNotification }) => { } setLoading(false); }) - }, [statusString, searchInput, orderBy, curPage ,reload]); + }, [statusString, searchInput, curPage, reload]); function taskClick(id) { history.push(`/task/taskDetail/${id}`); @@ -104,9 +103,9 @@ export default ({ location, history, current_user,showNotification }) => { setStatusType(key); } - const reloadList=useCallback(()=>{ - setReload(reload+1); - },[]); + const reloadList = useCallback(() => { + setReload(Math.random()); + }, []); return (
    @@ -126,12 +125,14 @@ export default ({ location, history, current_user,showNotification }) => { } > - + { + identity === '1' && statusType === '1' && + } { - + { + identity === '1' && statusType === '2' && + } { loading={loading} showNotification={showNotification} reloadList={reloadList} - + /> diff --git a/src/military/task/myTask/joinTask.jsx b/src/military/task/myTask/joinTask.jsx index 276774b1d..994c8d441 100644 --- a/src/military/task/myTask/joinTask.jsx +++ b/src/military/task/myTask/joinTask.jsx @@ -114,7 +114,7 @@ export default ({ taskCategoryValueArr, showNotification }) => { title: '应征状态', dataIndex: 'status', render: (text, record) => { - return record.checkStatus != 1 ? paperCheckStatus[record.checkStatus] : statusArr[text] + return text === 0 ? paperCheckStatus[record.checkStatus] : statusArr[text] } }, { @@ -126,18 +126,19 @@ export default ({ taskCategoryValueArr, showNotification }) => { {/* 查看详情 */} - {((record.needComplain && record.task.status === 3) || (record.task.status === 5 && record.status !== 2)) && + {((record.needComplain && record.task.status === 3) || (record.task.status === 5 && record.publicTaskComplain && record.status !== 2)) && } - {record.status === 2 && record.task.status === 6 && - + {record.status === 2 && record.task.status === 6 && (record.task.agreementSigning === 1) && + < Button type="primary" size="small" onClick={() => { setAgreeVisible(true); setCheckedItem(record) }}>签订协议 } - {record.status === 2 && record.task.status === 7 && record.task.agreementSigning === 1 && - + { + record.status === 2 && (!record.pay) && record.task.status === 7 && record.task.agreementSigning === 1 && + } - + ), }, ]; @@ -180,7 +181,7 @@ export default ({ taskCategoryValueArr, showNotification }) => { } const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []) return ( @@ -198,21 +199,27 @@ export default ({ taskCategoryValueArr, showNotification }) => { } > - - + {requirePaper === '1' && + + + + + + } + { - + { + requirePaper === '2' && + }
    { /> {agreeVisible && { +export default Form.create()(({ form, showNotification, history}) => { - const { getFieldDecorator, validateFields, setFieldsValue, getFieldsValue } = form; + const { getFieldDecorator, validateFields, setFieldsValue, } = form; const [approve, setApprove] = useState(1); const [loading, setLoading] = useState(false); - const [searchObj, setSearchObj] = useState({}); + // const [searchObj, setSearchObj] = useState({}); const [curPage, setCurPage] = useState(1); const [total, setTotal] = useState(0); const [taskList, setTaskList] = useState([]); @@ -35,7 +35,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his useEffect(() => { const params = { - ...searchObj, + // ...searchObj, status, curPage, pageSize: 10, @@ -49,7 +49,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his setLoading(false); }) - }, [reload, status, curPage, searchObj]); + }, [reload, status, curPage]); @@ -61,20 +61,20 @@ export default Form.create()(({ current_user, form, showNotification, match, his ), []); - function onSearch() { - validateFields((err, values) => { - if (!err) { - setSearchObj({ numberInput: values.numberInput }); - } - }); - } + // function onSearch() { + // validateFields((err, values) => { + // if (!err) { + // setSearchObj({ numberInput: values.numberInput }); + // } + // }); + // } - function clearSearch() { - setFieldsValue({ - numberInput: '', - }); - setSearchObj({}); - } + // function clearSearch() { + // setFieldsValue({ + // numberInput: '', + // }); + // setSearchObj({}); + // } function changeApprove(approve) { @@ -166,7 +166,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } }).then(res => { if (res && res.message === 'success') { - setReload(reload + 1); + setReload(Math.random()); setVisible(false); } setLoading(false); diff --git a/src/military/task/paperManage/index.jsx b/src/military/task/paperManage/index.jsx index 093d14112..c11219267 100644 --- a/src/military/task/paperManage/index.jsx +++ b/src/military/task/paperManage/index.jsx @@ -1,10 +1,9 @@ import React, { useCallback, useEffect, useState, useMemo } from 'react'; import { Input, Radio, Select, Button, Form, DatePicker, Table, Pagination, Modal } from 'antd'; import { Link } from "react-router-dom"; -import DelModal from 'military/components/DelModal'; import AdminRouter from '../components/adminRouter'; import { paperCheckStatusArr } from '../static'; -import { readyCheckPapers, checkPaper, deletePaper } from '../api'; +import { readyCheckPapers, checkPaper, } from '../api'; import '../index.scss'; const format = "YYYY-MM-DD HH:mm:ss"; const Option = Select.Option; @@ -79,7 +78,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his function checkPaperItem(paperId, passStatus) { validateFields((err, values) => { if (!err) { - setLoading(true); + setLoading(true); checkPaper({ paperId, auditingVo: { @@ -100,7 +99,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } }); } - + const columns = useMemo(() => { return [ { @@ -116,7 +115,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his width: "20%", render: (text, record) => ( - {record.task.name} + {record.task && record.task.name} ), }, @@ -145,7 +144,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his render: (text, record) => { return text === 0 ? - + : checkStatusArr[text] } }, @@ -154,7 +153,6 @@ export default Form.create()(({ current_user, form, showNotification, match, his key: 'action', render: (text, record) => ( - {/* */} 查看 ), @@ -162,20 +160,32 @@ export default Form.create()(({ current_user, form, showNotification, match, his ] }, []); - function deletItem(id) { - DelModal(() => { - deletePaper(id).then(res => { - if (res.message === 'success') { - showNotification("删除成功"); - history.go(-1); - } else { - showNotification("删除失败"); + // 不通过评论或者成果 + function disagree(item) { + if (!item.parentId) { + setActiveId(item.id); setVisible(true); + } else { + Modal.confirm({ + title: '此条评论不通过?', + onOk() { + setLoading(true); + checkPaper({ + paperId: item.id, + auditingVo: { + pass: 0, + message: '不通过', + } + }).then(res => { + setLoading(false); + if (res && res.message === 'success') { + setReload(Math.random()); + } + }); } - }) - }); + }); + } } - function changeStatus(e) { setSearchObj({ @@ -195,7 +205,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his return (
    - +
    {helper( diff --git a/src/military/task/payProof/index.js b/src/military/task/payProof/index.js index 78bd719bc..82af0c3f3 100644 --- a/src/military/task/payProof/index.js +++ b/src/military/task/payProof/index.js @@ -11,7 +11,7 @@ agreementArr.splice(1,1); export default Form.create()(({ current_user, form, showNotification, match, history }) => { const { getFieldDecorator, validateFields, setFieldsValue, } = form; - const [approve, setApprove] = useState(2); + const [approve, setApprove] = useState(1); const [loading, setLoading] = useState(false); const [searchObj, setSearchObj] = useState({}); const [curPage, setCurPage] = useState(1); @@ -71,7 +71,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []) return ( @@ -80,8 +80,8 @@ export default Form.create()(({ current_user, form, showNotification, match, his
    - - + +
    diff --git a/src/military/task/proofManage/index.js b/src/military/task/proofManage/index.js index 1c00c201d..ffa05f00b 100644 --- a/src/military/task/proofManage/index.js +++ b/src/military/task/proofManage/index.js @@ -80,7 +80,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []) return ( diff --git a/src/military/task/publicityComplain/index.js b/src/military/task/publicityComplain/index.js index ddec55f12..58e11b232 100644 --- a/src/military/task/publicityComplain/index.js +++ b/src/military/task/publicityComplain/index.js @@ -78,7 +78,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []) return ( diff --git a/src/military/task/static.js b/src/military/task/static.js index 678341af7..d1dcd674d 100644 --- a/src/military/task/static.js +++ b/src/military/task/static.js @@ -94,7 +94,9 @@ export const paperCheckStatusArr=[ { dicItemCode: '0', name: "待审核", dicItemName: '待审核' }, { dicItemCode: '1', name: "通过", dicItemName: '通过' }, { dicItemCode: '2', name: "未通过", dicItemName: '未通过' }, -] +]; + +export const paperCheckTextArr=["您已成功提交,请等待审核!","您的成果已经审核通过!","您的成果审核未通过"]; export const paperComplainStatusArr=[ { dicItemCode: '0', name: "未通过", dicItemName: '未通过' }, @@ -121,6 +123,11 @@ export const formItemLayout = { }, }; +export const main_web_site_url = JSON.parse(localStorage.chromesetting).main_web_site_url; + +export const current_main_site_url = JSON.parse(localStorage.chromesetting).current_main_site_url; + + export const formModalLayout = { labelCol: { xs: { span: 10 }, diff --git a/src/military/task/taskAdmin/index.jsx b/src/military/task/taskAdmin/index.jsx index 7ff4b6b6f..7ff19cf45 100644 --- a/src/military/task/taskAdmin/index.jsx +++ b/src/military/task/taskAdmin/index.jsx @@ -1,8 +1,9 @@ import React, { useCallback, useEffect, useState, useMemo } from 'react'; +import classNames from 'classnames'; import { Input, Select, Button, Form, DatePicker, Table, Pagination, } from 'antd'; import { Link } from "react-router-dom"; import AdminRouter from '../components/adminRouter'; -import { paperCheckStatusArr, publishModeArr, taskStatusAllArr, showUserModeArr } from '../static'; +import { paperCheckStatusArr, publishModeArr, taskStatusAllArr, showUserModeArr ,main_web_site_url} from '../static'; import { getTaskAdminList, changeShowUserMode } from '../api'; import '../index.scss'; import './index.scss'; @@ -17,16 +18,18 @@ const checkStatusArr = []; for (const item of paperCheckStatusArr) { checkStatusArr[item.dicItemCode] = item.dicItemName; } -export default Form.create()(({ current_user, form, showNotification, match, history }) => { - const { getFieldDecorator, validateFields, setFieldsValue, getFieldsValue } = form; +export default Form.create()(({ form, showNotification, match, history }) => { + const { getFieldDecorator, setFieldsValue, getFieldsValue } = form; const [loading, setLoading] = useState(false); const [statusString, setStatusString] = useState(''); const [publishMode, setPublishMode] = useState(''); const [showUserMode, setShowUserMode] = useState(''); + const [sort, setSort] = useState('Desc'); + const [order, setOrder] = useState('createdAt'); const [searchObj, setSearchObj] = useState({}); const [curPage, setCurPage] = useState(1); const [total, setTotal] = useState(0); @@ -41,7 +44,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his showUserMode: showUserMode.length > 1 ? '' : showUserMode, curPage, pageSize: 10, - orderBy:'createdAtDesc', + orderBy: order + sort, }; setLoading(true); getTaskAdminList(params).then(data => { @@ -51,7 +54,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } setLoading(false); }) - }, [statusString, publishMode, showUserMode, curPage, searchObj]); + }, [statusString, order, sort, publishMode, showUserMode, curPage, searchObj]); const helper = useCallback( @@ -146,8 +149,8 @@ export default Form.create()(({ current_user, form, showNotification, match, his dataIndex: 'enterpriseName', }, { - title: '创建时间', - dataIndex: 'createdAt', + title: '发布时间', + dataIndex: 'publishedAt', render: (text, record) => { return text || '--' } @@ -216,9 +219,26 @@ export default Form.create()(({ current_user, form, showNotification, match, his }) } + + // 改变排序字段 + const changeSortName = useCallback((sortType) => { + setOrder(sortType); + setCurPage(1); + }, []); + + // 改变排序 + const changeSort = useCallback((sort) => { + setSort(sort); + setCurPage(1); + }, []); + + function downloadFile() { + window.open(main_web_site_url + '/admin/tasks.xlsx'); + } + return (
    - +
    {helper( "任务名称", @@ -263,11 +283,35 @@ export default Form.create()(({ current_user, form, showNotification, match, his )}
    - - -
    + {/* 导出 */} + + + +
    + + + + { changeSort('Desc') }}> + + + { changeSort('Asc') }}> + + + + + + +
    diff --git a/src/military/task/taskAdmin/index.scss b/src/military/task/taskAdmin/index.scss index 9480324b0..d1b2b4f82 100644 --- a/src/military/task/taskAdmin/index.scss +++ b/src/military/task/taskAdmin/index.scss @@ -10,14 +10,14 @@ > .ant-row { min-width: 41%; margin-right: 2rem; - .ant-form-item-label{ + .ant-form-item-label { float: left; } .ant-form-item-control-wrapper { overflow: hidden; } } - + .center-right-but { .ant-form-item { margin: 0 1rem 0 0; @@ -26,7 +26,7 @@ display: inline-block; } } - .button-div{ + .button-div { margin-right: 1.5rem; } } @@ -45,3 +45,22 @@ text-align: center; } } + +.inline-form { + margin:-.35rem 0 .5rem 0; + text-align: right; + .ant-form-item-control-wrapper { + display: inline-block; + } +} + +.sort-icon { + color: #ccc; + i { + padding: 0.1rem 0.25rem; + } +} + +.sort-active { + color: #29bd8b; +} diff --git a/src/military/task/taskDetail/index.jsx b/src/military/task/taskDetail/index.jsx index 1ab2a7793..cd71e9744 100644 --- a/src/military/task/taskDetail/index.jsx +++ b/src/military/task/taskDetail/index.jsx @@ -1,6 +1,7 @@ import React, { forwardRef, useEffect, useState, useCallback, useMemo } from 'react'; -import { Form, Input, Button, Modal, Table, Pagination, Checkbox, Tooltip } from 'antd'; +import { Form, Input, Button, Modal, Checkbox, Tooltip } from 'antd'; import classNames from 'classnames'; +import moment from 'moment'; import { Link } from "react-router-dom"; import { formatDuring, getImageUrl } from 'educoder'; import Upload from '../../components/Upload'; @@ -8,7 +9,7 @@ import StatusNav from '../../components/statusNav'; import ItemListPaper from '../components/itemListPaper'; import ProofModal from '../components/proofModal'; import { getTaskDetail, getTaskCategory, getTaskPaper, makePublic, addPaper, getAgreement, agreement, checkAgreement, checkHavePaper } from '../api'; -import { taskModeIdArr, applyStatusArr, applyStatusAllArr, agreementContent } from '../static'; +import { taskModeIdArr, applyStatusArr, applyStatusAllArr, agreementContent, paperCheckTextArr } from '../static'; import { httpUrl } from '../../fetch'; import './index.scss'; const { TextArea } = Input; @@ -75,21 +76,21 @@ export default Form.create()( // 检查用户是否同意协议 useEffect(() => { - id && checkAgreement(id).then(res => { + current_user.user_id && id && checkAgreement(id).then(res => { if (res && res.data && res.data.status === 1) { setSignAgreement(true); } }) - }, []); + }, [current_user.user_id]); // 检查用户是否上传成果 useEffect(() => { - id && checkHavePaper(id).then(res => { + current_user.user_id && id && checkHavePaper(id).then(res => { if (res && res.data && res.data.status === 1) { setIsPaper(true); } }) - }, []); + }, [current_user.user_id]); const taskLimit = useMemo(() => { if (current_user.admin) { @@ -130,11 +131,7 @@ export default Form.create()( item.detail = item.paperDetail ? item.paperDetail.content : ""; } data.rows.sort((a, b) => { - if (b.status < a.status) { - return -1; - } else { - return 0; - } + return b.status - a.status }); } setDataList(data.rows || []); @@ -148,20 +145,21 @@ export default Form.create()( // 流程步骤显示,返回剩余时间 const process = useCallback((title, status, days) => { let surplusTimetext = ''; + let surplus = detailData.collectingDays * 24 * 3600 - (new Date() - new Date(detailData.publishedAt || detailData.createdAt)) / 1000; if (detailData.status === status) { - let surplus = detailData.collectingDays * 24 * 3600 * 1000 - (new Date() - new Date(detailData.publishedAt || detailData.createdAt)); - if (status === 4) { + if (status >= 4) { surplus += detailData.choosingDays * 24 * 3600; } - if (status === 5) { - surplus += detailData.makePublicDays * 24 * 3600; + if (status >= 5) { + surplus = detailData.makePublicDays * 24 * 3600 - (new Date() - new Date(detailData.makePublicAt)) / 1000; } - if (status === 6) { + if (status >= 6) { surplus += detailData.signingDays * 24 * 3600; } - if (status === 7) { + if (status >= 7) { surplus += detailData.payingDays * 24 * 3600; } + surplusTimetext = formatDuring(surplus); } return ( @@ -169,10 +167,10 @@ export default Form.create()( {title} {detailData.status !== status && days &&

    {days}天

    } - {detailData.status === status && detailData.status !== 8 && detailData.delayTime &&

    {detailData.delayTime}

    } + {/* {detailData.status === status && detailData.status !== 8 && detailData.delayTime &&

    {detailData.delayTime}

    } */} {/* 因为有时只延期几秒或者几分钟时后端没有返回延期,所以这里加一个判断 */} - {detailData.status === status && (!detailData.delayTime) && days &&

    {surplusTimetext.indexOf('-') > 0 ? ('延期' + surplusTimetext.replaceAll('-', '')) : ('剩余' + surplusTimetext)}

    } + {detailData.status === status && days &&

    {surplus < 0 ? ('延期' + surplusTimetext) : ('剩余' + surplusTimetext)}

    } ) }, [detailData]); @@ -218,7 +216,7 @@ export default Form.create()( if (res.message === 'success') { showNotification('成果提交成功'); setIsPaper(true); - setReload(reload + 1); + setReload(Math.random()); setCurPage(1); } }); @@ -261,7 +259,7 @@ export default Form.create()( onOk: () => { makePublic(id).then(res => { if (res && res.message === 'success') { - setReload(reload + 1); + setReload(Math.random()); } else { showNotification('操作失败'); } @@ -276,13 +274,19 @@ export default Form.create()( }); const reloadDetail = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []); const signContent = useCallback(() => { if (signAgreement && isPaper) { + let checkStatustext = paperCheckTextArr[0]; + for (const item of dataList) { + if (item.user.login === current_user.login) { + checkStatustext = paperCheckTextArr[item.checkStatus]; + } + } return
    - 您已成功提交,请等待审核! + {checkStatustext}
    } else if (signAgreement) { return (
    @@ -319,15 +323,12 @@ export default Form.create()(
    } - }, [signAgreement, isPaper, current_user, detailData]); + }, [signAgreement, isPaper, current_user, detailData, dataList]); function goUser(login) { window.location.href = `/users/${login}`; } - function exportPaper() { - Modal.info({ title: '暂未提供接口' }); - } // 第二种数据展示方式,暂时注释 // const columns = useMemo(() => { @@ -361,6 +362,10 @@ export default Form.create()( window.open(`/users/${current_user.login}/profiles`); } + function backPublicEnd(makePublicAt, makePublicDays) { + return moment(new Date(makePublicAt).getTime() + makePublicDays * 24 * 3600 * 1000).format('YYYY-MM-DD HH:mm:ss'); + } + return (
    @@ -395,16 +400,17 @@ export default Form.create()(
    - {detailData.status === 5 &&

    - 该需求已选稿,作品公示期为{detailData.makePublicDays}天接受监督和举报,于{detailData.makePublicAt}公示期满后支付赏金 -

    } + { + detailData.status === 5 && +

    + 该需求已选稿,作品公示期为{detailData.makePublicDays}天接受监督和举报,于{backPublicEnd(detailData.makePublicAt, detailData.makePublicDays)}公示期满后支付赏金 +

    }
    - { +export default ({ history, current_user, showLoginDialog }) => { console.log(current_user); const [loading, setLoading] = useState(false); @@ -54,6 +55,9 @@ export default ({ history, current_user }) => { setLoading(true); getTaskList(params).then(data => { if (data) { + for (const item of data.rows) { + item.delayTime = surplusTime(item); + } setTaskList(data.rows); setTotal(data.total); } @@ -82,6 +86,26 @@ export default ({ history, current_user }) => { } }, []); + function surplusTime(item) { + let status = item.status; + let surplus = item.collectingDays * 24 * 3600 - (new Date() - new Date(item.publishedAt || item.createdAt)) / 1000; + if (status >= 4) { + surplus += item.choosingDays * 24 * 3600; + } + if (status >= 5) { + surplus = item.makePublicDays * 24 * 3600 - (new Date() - new Date(item.makePublicAt)) / 1000; + } + if (status >= 6) { + surplus += item.signingDays * 24 * 3600; + } + if (status >= 7) { + surplus += item.payingDays * 24 * 3600; + } + + let surplusTimetext = formatDuring(surplus); + return surplus > 0 ? '剩余' + surplusTimetext : '延期' + surplusTimetext; + } + // 改变排序 const changeSort = useCallback((sortType) => { let sortValue = ''; @@ -97,11 +121,19 @@ export default ({ history, current_user }) => { }, []); function taskClick(id) { + if (!current_user.user_id) { + showLoginDialog(); + return; + } history.push(`/task/taskDetail/${id}`); } // 新增校验 function goAdd() { + if (!current_user.user_id) { + showLoginDialog(); + return; + } getCompanyInfo().then(res => { if (res) { if (res.message === 'success') { diff --git a/src/military/task/taskManage/index.js b/src/military/task/taskManage/index.js index 129805d07..629b7d44e 100644 --- a/src/military/task/taskManage/index.js +++ b/src/military/task/taskManage/index.js @@ -3,7 +3,7 @@ import { Input, Button, Form } from 'antd'; import AdminRouter from "../components/adminRouter"; import ItemTaskManage from '../components/itemTaskManage'; import StatusNav from '../../components/statusNav'; -import { approveArr } from '../static'; +import { approveArr, main_web_site_url } from '../static'; import { getTaskAdminList, getTaskCategory } from '../api'; import '../index.scss'; @@ -94,7 +94,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his } const reloadList = useCallback(() => { - setReload(reload + 1); + setReload(Math.random()); }, []) return ( @@ -133,7 +133,7 @@ export default Form.create()(({ current_user, form, showNotification, match, his - +