Merge pull request '修改创客延期和项目侧边栏' (#100) from tongChong/forgeplus-react:dev-jk-maker into pre_dev_military

This commit is contained in:
baladiwei 2021-09-30 17:35:59 +08:00
commit 0e0c13f1a4
15 changed files with 112 additions and 57 deletions

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Menu, Input , Spin, Pagination , Popover } from 'antd';
import { Menu, Input , Spin, Pagination , Popover, Affix, } from 'antd';
import '../css/index.scss'
import './list.css';
import './Index.scss';
@ -74,6 +74,12 @@ class Index extends Component {
getListData = (page,search, sort,category_id,language_id) => {
const { current_user } = this.props;
const url = `/projects.json`;
if(category_id==0){
category_id=undefined;
}
if(language_id==0){
language_id=undefined;
}
axios.get(url, {
params: {
user_id: current_user && current_user.user_id,
@ -100,7 +106,11 @@ class Index extends Component {
const url = `/projects/group_type_list.json`;
axios.get(url).then((result) => {
if (result && result.data) {
this.setTypeList(result.data, undefined)
result.data.unshift({
name:'全部语言',
id:0,
});
this.setTypeList(result.data, 0)
}
}).catch((error) => { })
}
@ -109,7 +119,7 @@ class Index extends Component {
this.setState({
typeList: list.map((item, key) => {
return (
<li key={key} className={active_type && parseInt(active_type) === item.id ? 'active' : ''} onClick={() => this.changeType(`${item.id}`, list)}>
<li key={key} className={ parseInt(active_type) === item.id ? 'active' : ''} onClick={() => this.changeType(`${item.id}`, list)}>
<p>
<span className="font-16">{item.name}</span>
<span className="color-blue">{item.projects_count}</span>
@ -120,14 +130,14 @@ class Index extends Component {
})
}
// 切换类型
// 切换语言类型
changeType = (id, list) => {
this.setState({
isSpin: true,
languageId: id,
search: undefined
})
this.setTypeList(list, id)
this.setTypeList(list, id);
const { page,sort, category_id} = this.state;
this.getListData(page,undefined, sort,category_id , id);
}
@ -138,7 +148,11 @@ class Index extends Component {
axios.get(url).then((result) => {
if (result && result.data) {
this.setCategoryList(result.data, undefined);
result.data.unshift({
name:'全部类别',
id:0,
});
this.setCategoryList(result.data, 0);
}
}).catch((error) => { })
}
@ -147,7 +161,7 @@ class Index extends Component {
this.setState({
categoryList: list.map((item, key) => {
return (
<li key={key} className={active_id && parseInt(active_id) === item.id ? 'active' : ''} onClick={() => this.changeCategory(`${item.id}`, list)}>
<li key={key} className={ parseInt(active_id) === item.id ? 'active' : ''} onClick={() => this.changeCategory(`${item.id}`, list)}>
<p>
<span className="font-16">{item.name}</span>
<span className="color-blue">{item.projects_count}</span>
@ -274,7 +288,9 @@ class Index extends Component {
}
*/}
<div className="ProjectListIndex">
<div className="list-left">
<Affix className="affix-list-left" offsetTop={90}>
<div className="affix-list-content">
<ul className="list-l-Menu">
<li className="MenuTitle" onClick={() => {this.getType();this.changeType(undefined, this.state.typeList);}}>
<span><i className="iconfont icon-bianchengyuyan color-grey-9 font-15 mr5"></i>
@ -287,6 +303,8 @@ class Index extends Component {
<div className="list-affix">{categoryList}</div>
</ul>
</div>
</Affix>
<div className="list-right boxShandow radius-2" style={{padding:0}}>
<Spin spinning={isSpin}>
<div className="list-r-operation">

View File

@ -18,6 +18,14 @@
box-sizing: border-box;
margin-bottom: 20px;
}
.affix-list-left{
width: 26%;
box-sizing: border-box;
margin-bottom: 20px;
}
.affix-list-content{
padding-right:20px;
}
.list-right{
width:74%;
background: #fff;

View File

@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react';
import classNames from 'classnames';
import { Pagination, Icon, Input } from 'antd';
import { Pagination, Icon, Input, Affix, } from 'antd';
import ItemList from '../components/itemList';
import Nodata from '../../../forge/Nodata';
import Loading from "../../../Loading";
@ -239,6 +239,8 @@ export default (props) => {
<span>公告</span>
</div> */}
<div className="body">
<Affix className="affix-list-left" offsetTop={90}>
{/* <div className="affix-list-content"> */}
<div className="navigationMenu">
<ul className="menu-ul">
<li className="MenuTitle" onClick={()=>click('0')}><span><i className="iconfont icon-xiangmugonggao"></i>项目公告</span></li>
@ -253,6 +255,7 @@ export default (props) => {
<li className={tab === '6' ? "active" : ""} onClick={()=>click('6')}><span>成交公告</span></li>
</ul>
</div>
</Affix>
<div className="notice-center-content">
{sortNav()}
{loading ? <Loading /> : content()}

View File

@ -13,13 +13,9 @@ export default Form.create()((props) => {
const { form, list, curPage, total, changePage, loading, showNotification, reloadList } = props;
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [checkedItem, setCheckedItem] = useState({});
const [page, setPage] = useState(1);
const [visible, setVisible] = useState(false);
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function refuseClick(item) {
@ -175,7 +171,7 @@ export default Form.create()((props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -19,7 +19,6 @@ export default Form.create()((props) => {
const { form, list, curPage, total, changePage, taskCategoryValueArr, loading, publish, showNotification, reloadList, joinTask } = props;
const { getFieldDecorator, validateFields, setFieldsValue, } = form;
const [page, setPage] = useState(1);
const [visibleProofs, setVisibleProofs] = useState(false);
const [taskId, setTaskId] = useState();
const [checkItem, setCheckItem] = useState({});
@ -35,9 +34,6 @@ export default Form.create()((props) => {
const [uploadList, setUploadList] = useState([]);
useEffect(() => {
changePage(page);
}, [page]);
useEffect(() => {
visibleDownload && downAgreement({ taskId: dowloadTaskId }).then(res => {
@ -191,8 +187,17 @@ export default Form.create()((props) => {
{item.myPaperStatus === 2 && <span className="list_status s_red ml10">{myPaperStatusArr[item.myPaperStatus]}</span>}
{item.status === 6 && (item.agreementSigning === 1 || (item.agreementSigning === 2 && item.contractStatus === 1)) && <span className="list_status s_orange ml10">待签订协议</span>}
{item.status !== 8 && item.delayTime < 0 &&<span className="list_status list-yellow">延期中</span>}
{item.status !== 8 && item.cancelStatus === 1 && item.delayTime > 0 && <span className="list_status list-yellow">手动延期中</span>}
{item.status !== 8 && item.delayed && item.cancelStatus === 0 && item.delayTime > 0 && item.delayCount>0 &&<span className="list_status list-yellow">系统自动延期中</span>}
</React.Fragment> : <React.Fragment>
{item.status === 6 && (item.agreementSigning === 1 || (item.agreementSigning === 2 && item.auditing && item.auditing.pass === 1)) && <span className="list_status s_orange ml10">待签订协议</span>}
{item.status !== 8 && item.delayTime < 0 &&<span className="list_status list-yellow">延期中</span>}
{item.status !== 8 && item.cancelStatus === 1 && item.delayTime > 0 &&<span className="list_status list-yellow">手动延期中</span>}
{item.status !== 8 && item.delayed && item.cancelStatus === 0 && item.delayTime > 0 && item.delayCount>0 && <span className="list_status list-yellow">系统自动延期中</span>}
</React.Fragment>
}
</li>
@ -206,7 +211,7 @@ export default Form.create()((props) => {
<li key={4} className="with10 color-orange">{item.bounty}</li>
<li className="flex1">
<span>
<span className="line_1">{statusArr[item.status]}</span>
<span className="line_1">{item.exceptClosedBoolean ? '已关闭' : statusArr[item.status]}</span>
</span>
</li>
<li key={5} className="with15 flex-column">
@ -221,7 +226,7 @@ export default Form.create()((props) => {
}
{
item.status === 4 && item.papersCount > 0 && (!item.isProofBoolean) && (!item.isProofBoolean)&&
item.status === 4 && item.papersCount > 0 && (!item.isProofBoolean) && (!item.isProofBoolean) &&
<a onClick={() => { uploadProofs(item) }} className="line_1 color-blue">上传佐证材料</a>
}
@ -259,7 +264,7 @@ export default Form.create()((props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -14,12 +14,8 @@ for (const item of taskStatusAllArr) {
const classArr = ['', 'list-done', 'list-error', 'list-red', 'list-yellow', 'list-pay', '', 'list-pay', 'list-gray',];
export default (props) => {
const { list, itemClick, curPage, total, changePage, loading } = props;
const [page, setPage] = useState(1);
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function goUser(login) {
window.location.href = `/users/${login}`;
@ -36,8 +32,14 @@ export default (props) => {
<div className="list-content">
<div className="list-title mb10" onClick={() => { itemClick(item.id) }}>
<div className="title-content text-ellipsis">{item.name}</div>
{item.status && <span className={classArr[item.status]}>{item.exceptClosedBoolean?'已关闭':statusArr[item.status]}</span>}
{(item.status !== 8) && item.delayTime.indexOf('延期') > -1 && <span className="list-yellow">延期中</span>}
{item.status && <span className={classArr[item.status]}>{item.exceptClosedBoolean ? '已关闭' : statusArr[item.status]}</span>}
{(item.status !== 8) && item.delayTime.indexOf('延期') > -1 ? <span className="list-yellow">延期中</span>
: <React.Fragment>
{(item.status !== 8) && item.cancelStatus === 1 && <span className="list-yellow">手动延期中</span>}
{(item.status !== 8) && item.delayed && item.cancelStatus === 0 && item.delayCount>0 && <span className="list-yellow">系统自动延期中</span>}
</React.Fragment>
}
</div>
<div className="list-other">
<span className="user-box mr30" onClick={() => { goUser(item.user.login) }}>
@ -63,7 +65,7 @@ export default (props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -13,14 +13,9 @@ export default Form.create()((props) => {
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [checkedItem, setCheckedItem] = useState({});
const [visible, setVisible] = useState(false);
const [page, setPage] = useState(1);
const [fileList, setFileList] = useState(null);
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function goUser(login) {
window.location.href = `/users/${login}`;
@ -117,7 +112,7 @@ export default Form.create()((props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -12,16 +12,10 @@ const { TextArea } = Input;
export default (props) => {
const { list, curPage, total, changePage, loading, showNotification, reloadList } = props;
const [checkedItem, setCheckedItem] = useState('');
const [page, setPage] = useState(1);
const [visible, setVisible] = useState(false);
const [advice, setRepairAdvice] = useState('');
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function agreeClick(item) {
Modal.confirm({
title: '是否确认审批通过?',
@ -152,7 +146,7 @@ export default (props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -13,7 +13,6 @@ export default Form.create()((props) => {
const { form, list, curPage, total, changePage, loading, showNotification, reloadList } = props;
const { getFieldDecorator, validateFields, setFieldsValue } = form;
const [checkedItem, setCheckedItem] = useState('');
const [page, setPage] = useState(1);
const [visible, setVisible] = useState(false);
const pageSize = props.pageSize || 10;
@ -22,10 +21,6 @@ export default Form.create()((props) => {
const [isChanged, setIsChanged] = useState('');
useEffect(() => {
changePage(page);
}, [page]);
function deal(item) {
setCheckedItem(item);
@ -145,7 +140,7 @@ export default Form.create()((props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -12,16 +12,11 @@ const { TextArea } = Input;
export default (props) => {
const { list, categoryArr, curPage, total, changePage, loading, showNotification, reloadList } = props;
const [checkedId, setCheckedId] = useState('');
const [page, setPage] = useState(1);
const [visible, setVisible] = useState(false);
const [isRepairDocument, setIsRepairDocument] = useState('0');
const [repairAdvice, setRepairAdvice] = useState('');
const pageSize = props.pageSize || 10;
useEffect(() => {
changePage(page);
}, [page]);
function agreeClick(id) {
Modal.confirm({
@ -186,7 +181,7 @@ export default (props) => {
<div className="edu-txt-center mt20 mb20">
{total > pageSize && <Pagination
showQuickJumper
onChange={(page) => { setPage(page) }}
onChange={(page) => { changePage(page) }}
current={curPage}
total={total}
showTotal={total => `${total}`}

View File

@ -63,6 +63,9 @@ export default ({ location, history, current_user, showNotification }) => {
setLoading(true);
getMyTaskList(params).then(data => {
if (data) {
for (const item of data.rows) {
item.delayTime = surplusTime(item);
}
setMyTaskList(data.rows);
setTotal(data.total);
}
@ -73,6 +76,31 @@ export default ({ location, history, current_user, showNotification }) => {
function taskClick(id) {
history.push(`/task/taskDetail/${id}`);
}
function surplusTime(item) {
let surplus;
switch (item.status) {
case 3:
surplus = item.collectingDays * 24 * 3600 - (new Date() - new Date(item.publishedAt || item.createdAt)) / 1000;
break;
case 4:
surplus = item.choosingDays * 24 * 3600 - (new Date() - new Date(item.collectingCompleteAt)) / 1000;
break;
case 5:
surplus = item.makePublicDays * 24 * 3600 - (new Date() - new Date(item.makePublicAt)) / 1000;
break;
case 6:
surplus = item.signingDays * 24 * 3600 - (new Date() - new Date(item.publicityCompleteAt)) / 1000;
break;
case 7:
surplus = item.payingDays * 24 * 3600 - (new Date() - new Date(item.signingCompleteAt)) / 1000;
break;
default:
surplus = 0;
}
return surplus ;
}
const changeOptionId = useCallback((option, type) => {
if (type === 'publishStatus') {

View File

@ -88,11 +88,18 @@ export default ({ taskCategoryValueArr, showNotification }) => {
const columns = useMemo(() => {
return [
{
title: '任务/编号名称',
title: '任务编号',
dataIndex: 'name',
width: '30%',
render: (text, record) => {
return <Link className="color-grey3 font-16 font-bd" to={`/task/taskDetail/${record.task.id}`}>{record.task.number + " " + record.task.name}</Link>
return <Link className="color-grey3 font-16 font-bd" to={`/task/taskDetail/${record.task.id}`}>{record.task.number}</Link>
}
},
{
title: '任务名称',
dataIndex: 'name',
width: '20%',
render: (text, record) => {
return record.task.name
}
},
{

View File

@ -137,7 +137,7 @@ export default Form.create()(({ form, showNotification, match, history }) => {
width: '10%',
dataIndex: 'status',
render: (text, record) => {
return statusArr[text]
return record.exceptClosedBoolean ? '已关闭' : statusArr[text]
}
},
{

View File

@ -175,6 +175,9 @@ export default Form.create()(
{/* 因为有时只延期几秒或者几分钟时后端没有返回延期,所以这里加一个判断 */}
{detailData.status === status && days ? <p className="color-grey-6 font-12">{surplus < 0 ? ('延期' + surplusTimetext) : ('剩余' + surplusTimetext)}</p> : ''}
{detailData.status === status && detailData.cancelStatus === 1 && surplus > 0 && <p className="delay-text">(手动延期)</p>}
{detailData.status === status && detailData.delayed && detailData.cancelStatus === 0 && surplus > 0 && detailData.delayCount && <p className="delay-text">(系统自动延期)</p>}
</li>
)
}, [detailData]);

View File

@ -49,6 +49,12 @@
color: #05101a;
text-align: center;
margin-bottom: 32px;
.delay-text{
margin-top:-15px;
color: #666;
font-size: 12px;
}
}
.tasks_status li:not(:last-child){
margin-right: 20px;