新建工单

dev_forge
caicai8 5 years ago
parent 2469e0792f
commit dd6a2e2407

@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base
def current_user
# User.current
User.find_by_id 36401
User.find_by_id 50207
# nil
end

@ -35,6 +35,7 @@ class Detail extends Component{
isManager:false,
isReporter:false,
isDeveloper:false,
project_id:undefined,
watchers_count:undefined ,
praises_count:undefined ,
forked_count:undefined
@ -45,6 +46,12 @@ class Detail extends Component{
this.getDetail();
}
componentDidUpdate=(provState)=>{
if(provState.match.params.projectsId !== this.props.match.params.projectsId){
this.getDetail();
}
}
getDetail=()=>{
const { login } = this.props.current_user;
const { projectsId } = this.props.match.params;
@ -53,6 +60,7 @@ class Detail extends Component{
if(result){
this.setState({
projectDetail:result.data,
project_id:result.data.project_id,
isManager:result.data.permission && result.data.permission === "Manager",
isReporter:result.data.permission && result.data.permission === "Reporter",
isDeveloper:result.data.permission && result.data.permission === "Developer",
@ -67,44 +75,71 @@ class Detail extends Component{
// 关注和取消关注
focusFunc =(flag)=>{
const { projectsId } = this.props.match.params;
if(flag){
const url = `/projects/${projectsId}/watchers/follow.json`;
const { project_id } = this.state;
if(!flag){
const url = `/projects/${project_id}/watchers/follow.json`;
axios.post(url).then(result=>{
if(result){
this.props.showNotification('关注成功');
this.getDetail();
}
}).catch(error=>{
console.log(error);
})
}else{
const url = `/projects/${projectsId}/watchers/unfollow.json`;
const url = `/projects/${project_id}/watchers/unfollow.json`;
axios.delete(url).then(result=>{
if(result){
this.props.showNotification('取消关注成功');
this.getDetail();
}
}).catch(error=>{
console.log(error);
})
}
}
// 点赞和取消点赞
pariseFunc=(flag)=>{
const { projectsId } = this.props.match.params;
if(flag){
const url = `/projects/${projectsId}/praise_tread/like.json`;
const { project_id } = this.state;
if(!flag){
const url = `/projects/${project_id}/praise_tread/like.json`;
axios.post(url).then(result=>{
if(result){
this.props.showNotification('点赞成功');
this.getDetail();
}
}).catch(error=>{
console.log(error);
})
}else{
const url = `/projects/${projectsId}/praise_tread/unlike.json`;
const url = `/projects/${project_id}/praise_tread/unlike.json`;
axios.delete(url).then(result=>{
if(result){
this.props.showNotification('取消点赞成功');
this.getDetail();
}
}).catch(error=>{
console.log(error);
})
}
}
// fork项目
forkFunc=()=>{
const { project_id } = this.state;
const url = `/projects/${project_id}/forks.json`;
axios.post(url).then(result=>{
if(result && result.data.status === 0){
this.props.history.push(`/projects/${result.data.identifier}/coder`);
}else{
this.props.showNotification(result.data.message);
}
}).catch(error=>{
console.log(error);
})
}
render(){
const { projectsId } = this.props.match.params;
@ -118,15 +153,21 @@ class Detail extends Component{
<span className="p-r-btn large">
<span>
<a onClick={()=>this.focusFunc(true)}><i className="iconfont icon-xianshi font-18 mr5 color-grey-6"></i></a>
<a onClick={()=>this.focusFunc(projectDetail && projectDetail.watched)}>
<i className={projectDetail && projectDetail.watched ?"iconfont icon-yincang1 font-18 mr5 color-grey-6":"iconfont icon-xianshi font-18 mr5 color-grey-6"}></i>
{projectDetail && projectDetail.watched ? '取消关注':'关注'}
</a>
<span>{watchers_count}</span>
</span>
<span>
<a onClick={()=>this.pariseFunc(true)}><i className="iconfont icon-dianzan-xian font-18 mr5 color-grey-6"></i></a>
<a onClick={()=>this.pariseFunc(projectDetail && projectDetail.praised)}>
<i className={projectDetail && projectDetail.praised ?"iconfont icon-dianzan font-18 mr5 color-grey-6":"iconfont icon-dianzan-xian font-18 mr5 color-grey-6"}></i>
{projectDetail && projectDetail.praised ? '取消点赞':'点赞'}
</a>
<span>{praises_count}</span>
</span>
</span>
<span>
<a><i className="iconfont icon-fork font-18 mr5 color-grey-6"></i>Fork</a>
<a onClick={this.forkFunc}><i className="iconfont icon-fork font-18 mr5 color-grey-6"></i>Fork</a>
<span>{forked_count}</span>
</span>
</span>

@ -415,7 +415,7 @@ body,#root{
}
@media screen and (max-width: 370px){
.p-r-tags{
.p-r-tags,.p-r-btn{
opacity: 0;
display: none;
}

@ -1,16 +1,209 @@
import React , { Component } from "react";
import { Form , Input , Select } from 'antd';
import {Link} from 'react-router-dom';
import {getImageUrl} from 'educoder';
import Nav from './Nav';
import './order.css';
import axios from 'axios';
const Option = Select.Option;
const TextArea = Input.TextArea;
class New extends Component{
constructor(props){
super(props);
this.state={
branch_name:"0",
issue_tag_ids:"0",
fixed_version_id:"0",
tracker_id:"0",
issue_type:"0",
assigned_to_id:"0",
priority_id:"0",
done_ratio:"0",
issue_chosen:undefined
}
}
componentDidMount=()=>{
this.InitData();
this.getSelectList();
}
InitData=()=>{
this.props.form.setFieldsValue({
...this.state
});
}
getSelectList=()=>{
const { projectsId } = this.props.match.params;
const url = `/projects/${projectsId}/issues/new.json`;
axios.get(url).then((result)=>{
if(result){
this.setState({
issue_chosen:result.data.issue_chosen
})
}
}).catch((error)=>{
console.log(error);
})
}
// 创建
handleSubmit=()=>{
this.props.form.validateFieldsAndScroll((err, values) => {
console.log(values);
})
}
render(){
const { getFieldDecorator } = this.props.form;
const { current_user } = this.props;
const { issue_tag_ids , fixed_version_id , branch_name , tracker_id , issue_type ,assigned_to_id , priority_id , done_ratio,
issue_chosen } = this.state;
const renderSelect =(array)=>{
if(array && array.length > 0){
return(
array.map((item,key)=>{
return(
<Option key={key} value={item.id}>{item.name}</Option>
)
})
)
}
}
return(
<div className="main">
<div className="topWrapper">
<Nav />
</div>
<Form>
<div className="f-wrap-between mt20" style={{alignItems:"flex-start"}}>
<div className="list-right df">
<Link to={``}><img class="user_img" src={getImageUrl(`images/${current_user && current_user.image_url}`)} alt=""/></Link>
<div className="new_context">
<Form.Item>
{getFieldDecorator('subject', {
rules: [{
required: true, message: '请填写工单标题'
}],
})(
<Input placeholder="标题"/>
)}
</Form.Item>
<Form.Item>
{getFieldDecorator('description', {
rules: [],
})(
<TextArea placeholder="添加一个可选的扩展描述。。。" style={{height:"150px"}}/>
)}
</Form.Item>
<p className="clearfix mt15">
<a className="topWrapper_btn fr" type="submit" onClick={this.handleSubmit}>创建Issue</a>
</p>
</div>
</div>
<div className="list-left" style={{paddingRight:"0px",paddingLeft:"15px",paddingTop:"10px"}}>
<div className="list-l-panel">
<Form.Item>
{getFieldDecorator('branch_name', {
rules: [],
})(
<Select value={branch_name}>
{/* {renderSelect(issue_chosen && issue_chosen.)} */}
<Option value="0">分支未指定</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="标签"
>
{getFieldDecorator('issue_tag_ids', {
rules: [],
})(
<Select value={issue_tag_ids}>
<Option value="0">未选择标签</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="里程碑"
>
{getFieldDecorator('fixed_version_id', {
rules: [],
})(
<Select value={fixed_version_id}>
<Option value="0">未选择里程碑</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="类型"
>
{getFieldDecorator('issue_type', {
rules: [],
})(
<Select value={issue_type}>
<Option value="0">未选择类型</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="分类"
>
{getFieldDecorator('tracker_id', {
rules: [],
})(
<Select value={tracker_id}>
<Option value="0">未选择分类</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="指派成员"
>
{getFieldDecorator('assigned_to_id', {
rules: [],
})(
<Select value={assigned_to_id}>
<Option value="0">未指派成员</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="优先度"
>
{getFieldDecorator('priority_id', {
rules: [],
})(
<Select value={priority_id}>
<Option value="0">未选择优先度</Option>
</Select>
)}
</Form.Item>
<Form.Item
label="完成度"
>
{getFieldDecorator('done_ratio', {
rules: [],
})(
<Select value={done_ratio}>
<Option value="0">未选择完成度</Option>
</Select>
)}
</Form.Item>
</div>
</div>
</div>
</Form>
</div>
)
}
}
export default New;
const WrappedNewForm = Form.create({ name: 'NewOrderForm' })(New);
export default WrappedNewForm;

@ -104,6 +104,51 @@
line-height: 30px;
}
/* 新建 */
.user_img {
height: 49px;
width: 49px;
border-radius: 100%;
}
.new_context {
flex: 1;
border: 1px solid #dededf;
border-radius: 4px;
margin-left: 15px;
padding: 15px;
position: relative;
background: #FFFFFF;
}
.new_context:before {
position: absolute;
content: "";
height: 0;
width: 0;
border: solid transparent;
border-right-color: #dededf;
border-width: 9px;
top: 12px;
right: 100%;
}
.new_context::after {
position: absolute;
content: "";
height: 0;
width: 0;
border: solid transparent;
border-right-color: #fff;
border-width: 7px;
top: 14px;
right: 100%;
}
.list-l-panel{
border:1px solid #dededf;
border-radius: 4px;
padding:10px 15px;
}
.list-l-panel .ant-row{
margin-bottom: 0px;
}
@media screen and (max-width: 700px){
.topWrapper_select li{

@ -72,12 +72,13 @@ class order extends Component{
render(){
const { issue_chosen } = this.state;
const { projectsId } = this.props.match.params;
return(
<div className="main">
<div className="topWrapper">
<Nav />
<Link to={``} className="topWrapper_btn">创建工单</Link>
<Link to={`/projects/${projectsId}/orders/new`} className="topWrapper_btn">创建工单</Link>
</div>
<div className="topWrapper" style={{borderBottom:"none"}}>
<p className="topWrapper_nav">

Loading…
Cancel
Save