标记管理-issueissue

This commit is contained in:
caishi 2023-02-07 14:39:53 +08:00
parent 1b1298c568
commit 70cdc5d9cc
7 changed files with 383 additions and 29 deletions

View File

@ -1,14 +1,15 @@
import React from 'react';
import { Checkbox , Tooltip } from 'antd';
import issue from '../Img/issue.png';
import { Link } from "react-router-dom";
// issue
function Datas(){
function Datas({checkbox}){
return(
<div className="listdatas">
<div>
<div className="issuedetail">
<Checkbox style={{marginRight: "16px"}} value="0"></Checkbox>
{checkbox}
<div className="ilog">
<span className="status normal">正常</span>
<span className="number">#1</span>
@ -43,7 +44,7 @@ function Datas(){
</div>
<div>
<div className="issuedetail">
<Checkbox style={{marginRight: "16px"}} value="0"></Checkbox>
<Checkbox style={{marginRight: "16px"}} value={1}></Checkbox>
<div className="ilog">
<span className="status urgent">紧急</span>
<span className="number">#2</span>
@ -77,7 +78,7 @@ function Datas(){
</div>
<div>
<div className="issuedetail">
<Checkbox style={{marginRight: "16px"}} value="0"></Checkbox>
<Checkbox style={{marginRight: "16px"}} value={2}></Checkbox>
<div className="ilog">
<span className="status hight"></span>
<span className="number">#3</span>
@ -85,7 +86,7 @@ function Datas(){
<div style={{marginTop:"-2px"}}>
<div className="idetails">
<img src={issue} alt="" width="16px" className="mr5" />
<p>如何参与到项目的开发提升技术能力</p>
<Link to={``}>如何参与到项目的开发提升技术能力</Link>
<Tooltip title="点击复制链接" placement="bottom"><span style={{color: "#c1a30d"}}><i className="iconfont icon-biaoji mr3 font-12"></i>feature</span></Tooltip>
</div>
<div className="infos">
@ -109,7 +110,7 @@ function Datas(){
</div>
<div>
<div className="issuedetail">
<Checkbox style={{marginRight: "16px"}} value="0"></Checkbox>
<Checkbox style={{marginRight: "16px"}} value={3}></Checkbox>
<div className="ilog">
<span className="status low"></span>
<span className="number">#3</span>

View File

@ -1,4 +1,4 @@
import React ,{ useImperativeHandle ,forwardRef , useState } from 'react';
import React ,{ useImperativeHandle ,forwardRef , useState , useEffect } from 'react';
import { Dropdown , Icon , Menu } from 'antd';
const menus=[
@ -8,27 +8,37 @@ const menus=[
choose:0,
menu:["caishi","he","xiao","jiang"]
},
{
id:7,
updateName:"更换优先级",
choose:0,
menu:["紧急","正常","低","高"]
},
{
id:2,
name:"标记",
updateName:"更换标记",
choose:0,
menu:["caishi","he","xiao","jiang"]
},
{
id:3,
name:"里程碑",
updateName:"更换里程碑",
choose:0,
menu:["caishi","he","xiao","jiang"]
},
{
id:4,
name:"负责人",
updateName:"更换负责人",
choose:0,
menu:["caishi","he","xiao","jiang"]
},
{
id:5,
name:"状态",
updateName:"更换状态",
choose:0,
menu:["新增","正在解决","已解决","反馈","关闭","拒绝"]
},
@ -39,9 +49,10 @@ const menus=[
menu:["最新创建","最早创建","最近更新","最早更新","高优先级","低优先级"]
}
]
function Menus(props,ref){
function Menus({update},ref){
const [ dropmenu , setDropMenu ] = useState(menus);
useImperativeHandle(ref, () => ({
clearChoose: () => {
// dropmenuchoose0
@ -49,19 +60,32 @@ function Menus(props,ref){
}
}))
useEffect(()=>{
if(update){
}
},[update])
// menus
function changeMenusValue(value,id){
let todoList = [...dropmenu];
let list = todoList.map((item,key)=>id ? item : {...item,choose:value});
let list = [];
if(id){
list = todoList.map((i,k)=>id===i.id ? {...i,choose:value} : i);
}else{
list = todoList.map((i,k)=>id ? i : {...i,choose:value});
}
setDropMenu(list);
//
}
function menu(menu,choose){
function menu(menu,choose,id){
if(menu && menu.length>0){
return <Menu selectedKeys={[`${choose}`]}>
{
menu.map((i,j)=>{
return <Menu.Item key={j+1} value={j}>{i}</Menu.Item>
return <Menu.Item key={j+1} onClick={()=>changeMenusValue(j+1,id)}>{i}</Menu.Item>
})
}
</Menu>
@ -76,8 +100,9 @@ function Menus(props,ref){
{
dropmenu.map((item,i)=>{
return(
<Dropdown overlay={menu(item.menu,item.choose)} trigger={['click']} placement="bottomRight" arrow={{pointAtCenter: true}}>
<li><span className="task-hide">{item.name}</span><Icon type="caret-down" className="ml5 color-grey-6" /></li>
((!update && item.name) || (update && item.updateName)) &&
<Dropdown overlay={menu(item.menu,item.choose,item.id)} placement="bottomRight" >
<li><span className="task-hide">{item.choose !== 0 ? item.menu[item.choose-1]:(update ? item.updateName : item.name)}</span><Icon type="caret-down" className="ml5 color-grey-6" /></li>
</Dropdown>
)
})

View File

@ -1,15 +1,22 @@
import React , { useRef } from 'react';
import { Dropdown , Menu , Icon , Input , Checkbox , Pagination } from 'antd';
import React , { useRef , useState } from 'react';
import { Dropdown , Menu , Icon , Input , Checkbox , Pagination, Button } from 'antd';
import bj from '../Img/biaoji.png';
import create from '../Img/create.png';
import { Link } from 'react-router-dom';
import { Link } from "react-router-dom";
import Menus from '../Component/menus';
import Datas from '../Component/datas';
const { Search } = Input;
function List(props){
const [ allValue , setAllValue ] = useState([]);
const [ allIds , setAllIds ] = useState([0,1,2,3]);
const [ checkAll , setCheckAll ] = useState(false);
const [ page , setPage ] = useState(1);
const menuRef = useRef(null);
const owner = props.match.params.owner;
const projectsId = props.match.params.projectsId;
const menu = (
<Menu>
<Menu.Item key={0}>全部</Menu.Item>
@ -27,6 +34,38 @@ function List(props){
//
}
// issue
function chooseAll(e){
setCheckAll(e.target.checked);
if(e.target.checked){
setAllValue([0,1,2,3]);
}else{
setAllValue([]);
clearCondition();
}
}
// issue
function checkIssues(value){
setAllValue(value);
if(value.length === allIds.length){
setCheckAll(true);
}else{
setCheckAll(false);
}
}
//
function cancelUpdate(){
setAllValue([]);
setCheckAll(false);
}
//
function changepage(page){
setPage(page);
}
return(
<div>
@ -43,23 +82,45 @@ function List(props){
<a className="color-blue ml25" onClick={clearCondition} style={{ display: "flex" , alignItems: "center"}}><i className="iconfont icon-roundclose font-16 mr5"></i>清除筛选条件</a>
</div>
<div>
<Link to="" className="dorpdownButton"><img src={bj} alt="" className="mr5" />标记管理</Link>
<Link to={`/${owner}/${projectsId}/issues/sign`} className="dorpdownButton"><img src={bj} alt="" className="mr5" />标记管理</Link>
<Link to="" className="operateButton ml20"><img src={create} alt="" className="mr5" />创建疑修</Link>
</div>
</div>
<div className="lists">
<div className="listheader">
<ul>
<Checkbox value="all" style={{marginRight: "16px"}}></Checkbox>
<li className="active">全部<span>111</span></li>
<li>开启中<span>111</span></li>
<li>已关闭<span>111</span></li>
</ul>
<Menus ref={menuRef}/>
<div style={{display:"flex"}}>
<Checkbox value="all" style={{marginRight: "16px"}} checked={checkAll} onChange={chooseAll}></Checkbox>
{
allValue && allValue.length>0 ?
<span>选择{allValue.length}个issue</span>
:
<ul className="statusul">
<li className="active">全部<span>111</span></li>
<li>开启中<span>111</span></li>
<li>已关闭<span>111</span></li>
</ul>
}
</div>
<div className="menusul">
<Menus ref={menuRef} update={allValue && allValue.length>0}/>
{
allValue && allValue.length>0 ?
<div>
<Button type="primary" ghost>确定</Button>
<Button type="danger" ghost className="ml10">删除</Button>
<Button ghost className="ml10 mr10" onClick={cancelUpdate}>取消</Button>
</div>
:""
}
</div>
</div>
<Datas />
<Checkbox.Group name="issues" onChange={checkIssues} value={allValue} style={{ width: "100%" }}>
<Datas
checkbox={ <Checkbox value={0} key={0} style={{marginRight: "16px"}}></Checkbox> }
/>
</Checkbox.Group>
<div className="pt25 pb30" style={{textAlign:"right"}}>
<Pagination total={50} current={1} showSizeChanger showQuickJumper />
<Pagination total={50} current={page} onChange={changepage} showSizeChanger showQuickJumper />
</div>
</div>
</div>

View File

@ -0,0 +1,139 @@
import React , { useEffect , useState } from 'react';
import create from '../Img/create.png';
import { Menu , Dropdown , Icon, Input, Button } from 'antd';
import { SketchPicker } from 'react-color'
function Sign(){
const [ edit , setEdit ] = useState(false);
const [ color , setColor ] = useState({r: '241',g: '112',b: '19',a: '1',});
const [ displayColorPicker , setDisplayColorPicker ] = useState(false);
const [ textcolor , setTextColor ] = useState("#F17013");
function arrayList(){
}
const menu = (
<Menu onClick={arrayList}>
<Menu.Item key={"created_at"} value="desc">
按创建时间降序排序
</Menu.Item>
<Menu.Item key={"created_at"} value="asc">
按创建时间升序排序
</Menu.Item>
<Menu.Item key={"issues_count"} value="desc">
按issue个数降序排序
</Menu.Item>
<Menu.Item key={"issues_count"} value="asc">
按issue个数升序排序
</Menu.Item>
</Menu>
);
//
function handleChange(color){
setColor(color.rgb);
setTextColor(color.hex);
}
//
function handleClick(){
setDisplayColorPicker(!displayColorPicker);
reduction();
}
//
function reduction(){
setTextColor("#F17013");
setColor({r: '241',g: '112',b: '19',a: '1',});
}
return(
<div>
<div className="between mt30 mb25">
<span>Issue / 项目标记</span>
<a className="operateButton" onClick={()=>setEdit(true)}><img src={create} alt="" className="mr5"/>创建标记</a>
</div>
{
edit &&
<div className="editbar">
<Input style={{width:"163px"}} placeholder="名称15字以内"/>
<Input style={{width:"276px"}} placeholder="描述30字以内"/>
<div>
<div className="swatch" onClick={handleClick}>
<div className="color" style={{backgroundColor:`rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`}}>
<p style={{ paddingLeft: 25 }}>{textcolor}</p>
</div>
</div>
{displayColorPicker ? (
<div className="popover">
<div className="cover" onClick={()=>{setDisplayColorPicker(false)}} />
<SketchPicker color={color} onChange={handleChange} />
</div>
) : null}
</div>
<span>
<Button type="primary" ghost>确定</Button>
<Button ghost className="ml15" onClick={()=>setEdit(false)}>取消</Button>
</span>
</div>
}
<div className="between bluebar">
<span>项目标记(10)</span>
<Dropdown overlay={menu} trigger={["click"]} placement="bottomRight">
<a>标记<Icon type="caret-down" className="ml5 color-grey-6" /></a>
</Dropdown>
</div>
<ul className="signlist">
<li>
<p>
<span className="square mr10" style={{backgroundColor:"#d92d4c"}}></span>
<i className="iconfont icon-biaoji mr3 font-12 " style={{color:"#d92d4c"}}></i>
缺陷
</p>
<p>表示项目存在问题</p>
<p>
<span className="mr12">0 Issue</span>
<span className="line">12 合并请求</span>
</p>
<p>
<a className="color-blue mr12">编辑</a>
<a className="color-red line">删除</a>
</p>
</li>
<li>
<p>
<span className="square mr10" style={{backgroundColor:"#2d6ddc"}}></span>
<i className="iconfont icon-biaoji mr3 font-12 " style={{color:"#2d6ddc"}}></i>
疑问
</p>
<p>表示存在的问题</p>
<p>
<span className="mr12">0 Issue</span>
<span className="line">12 合并请求</span>
</p>
<p>
<a className="color-blue mr12">编辑</a>
<a className="color-red line">删除</a>
</p>
</li>
<li>
<p>
<span className="square mr10" style={{backgroundColor:"#ee955a"}}></span>
<i className="iconfont icon-biaoji mr3 font-12 " style={{color:"#ee955a"}}></i>
功能
</p>
<p>表示新功能申请</p>
<p>
<span className="mr12">0 Issue</span>
<span className="line">12 合并请求</span>
</p>
<p>
<a className="color-blue mr12">编辑</a>
<a className="color-red line">删除</a>
</p>
</li>
</ul>
</div>
)
}
export default Sign;

View File

@ -8,11 +8,21 @@ const List = Loadable({
loader: () => import("./Pages/list"),
loading: Loading,
});
const Sign = Loadable({
loader: () => import("./Pages/sign"),
loading: Loading,
});
function Index(props){
return(
<div className="pagebox">
<Switch>
<Route
path="/:owner/:projectsId/issues/sign"
render={() => (
<Sign {...props}/>
)}
></Route>
<Route
path="/:owner/:projectsId/issues"
render={() => (

View File

@ -34,6 +34,36 @@
border-color:#708cff;
}
}
// flex-左右上下居中
.between{
display: flex;
align-items: center;
justify-content: space-between;
}
// 蓝色背景操作栏
.bluebar{
height:50px;
background-color:#fafcff;
border:1px solid rgba(42, 97, 255, 0.23);
border-radius:4px 4px 0px 0px;
padding:0px 26px;
}
// 按钮样式
.ant-btn-background-ghost{
border-color:#acb0bf;
color: #acb0bf;
background-color: #fff!important;
&.ant-btn-primary{
color: #466aff;
border-color: #466aff;
background-color: #fff!important;
}
&.ant-btn-danger{
color: #f60011;
border-color: #f60011;
background-color:rgba(196, 0, 14, 0.09)!important;
}
}
// 列表页面样式
.pageheader{
display: flex;
@ -55,10 +85,14 @@
border-color:rgba(42, 97, 255, 0.23);
border-radius:4px 4px 0px 0px;
padding-left: 18px;
.menusul{
display: flex;
align-items: center;
}
ul{
display: flex;
align-items: center;
&:first-child{
&.statusul{
li{
width: 106px;
&>span{
@ -217,4 +251,88 @@
justify-content: flex-end;
}
}
}
// 标记管理页面
.editbar{
padding:18px 20px;
background-color:rgba(218, 225, 251, 0.24);
display: flex;
align-items: center;
margin-bottom: 30px;
justify-content: space-between;
.color{
width: 20px;
height: 20px;
border-radius: 2px;
}
.swatch{
padding: 5px;
background: #fff;
border-radius: 1px;
width: 92px;
height: 28px;
line-height: 20px;
box-shadow: 0 0 0 1px rgba(0,0,0,.1);
display: flex;
cursor: pointer;
}
.popover {
position: absolute;
z-index: 2;
}
.cover {
position: fixed;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
}
.modalcolor {
width: 20px;
height: 20px;
border-radius: 2px;
}
}
.signlist{
padding:10px 0px;
margin-bottom: 40px!important;
&>li{
display: flex;
margin-bottom: 5px;
padding:10px 20px;
&>p{
flex:1;
text-align: center;
display: flex;
align-items: center;
justify-content: flex-start;
color: 40424a;
&:first-child{
flex:1.2;
}
&:last-child{
justify-content: flex-end;
}
.square{
display: block;
width: 22px;
height: 15px;
border-radius:2px;
}
.line{
position: relative;
padding-left: 13px;
&::before{
position: absolute;
height:13px;
width: 1px;
left: 0px;
top:7px;
background-color:#d5d5d5;
content: "";
}
}
}
}
}

View File

@ -804,11 +804,11 @@ class Detail extends Component {
></Route>
{/* 任务详情 */}
<Route path="/:owner/:projectsId/issues/:orderId"
{/* <Route path="/:owner/:projectsId/issues/:orderId"
render={
(props) => (<OrderDetail {...this.props} {...this.state} {...props} {...common} />)
}
></Route>
></Route> */}
{/* 动态 */}
<Route path="/:owner/:projectsId/activity"
render={