Merge branch 'dev_item_bank' of http://bdgit.educoder.net/Hjqreturn/educoder into dev_item_bank

dev_jupyter
cxt 5 years ago
commit a4b485c542

@ -45,6 +45,11 @@ module GitHelper
content: content, author_name: username, author_email: mail) content: content, author_name: username, author_email: mail)
end end
# 添加目录
def add_git_folder(folder_path, author_name, author_email, message)
GitService.add_tree(file_path: folder_path, message: message, author_name: author_name, author_email: author_email)
end
# 版本库Fork功能 # 版本库Fork功能
def project_fork(container, original_rep_path, username) def project_fork(container, original_rep_path, username)
raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank? raise Educoder::TipException.new("fork源路径为空,fork失败!") if original_rep_path.blank?

@ -25,6 +25,7 @@ class ShixunsController < ApplicationController
before_action :special_allowed, only: [:send_to_course, :search_user_courses] before_action :special_allowed, only: [:send_to_course, :search_user_courses]
before_action :shixun_marker, only: [:new, :create] before_action :shixun_marker, only: [:new, :create]
skip_before_action :check_sign, only: [:download_file]
## 获取课程列表 ## 获取课程列表
def index def index
@ -892,11 +893,15 @@ class ShixunsController < ApplicationController
content = upload_file.tempfile.read content = upload_file.tempfile.read
author_name = current_user.real_name author_name = current_user.real_name
author_email = current_user.git_mail author_email = current_user.git_mail
update_file_content(content, @repo_path, author_email, author_name, "upload file by browser") update_file_content(content, @repo_path, @path, author_email, author_name, "upload file by browser")
render_ok render_ok
end end
# 上传目录
def upload_git_folder def upload_git_folder
author_name = current_user.real_name
author_email = current_user.git_mail
add_git_folder(@path, author_name, author_email, "upload folder by browser")
render_ok render_ok
end end

@ -2,6 +2,7 @@ class UsersController < ApplicationController
before_action :load_user, only: [:show, :homepage_info] before_action :load_user, only: [:show, :homepage_info]
before_action :check_user_exist, only: [:show, :homepage_info] before_action :check_user_exist, only: [:show, :homepage_info]
skip_before_action :check_sign, only: [:attachment_show]
# 检查是否更新 # 检查是否更新
def system_update def system_update

@ -6,7 +6,7 @@ class GitService
class << self class << self
['add_repository', 'fork_repository', 'delete_repository', 'file_tree', 'update_file', 'file_content', 'commits'].each do |method| ['add_repository', 'fork_repository', 'delete_repository', 'file_tree', 'update_file', 'file_content', 'commits', 'add_tree'].each do |method|
define_method method do |params| define_method method do |params|
post(method, params) post(method, params)
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 785 B

@ -4,7 +4,7 @@
* @Github: * @Github:
* @Date: 2019-11-20 10:35:40 * @Date: 2019-11-20 10:35:40
* @LastEditors : tangjiang * @LastEditors : tangjiang
* @LastEditTime : 2020-01-03 09:20:12 * @LastEditTime : 2020-01-03 11:28:26
*/ */
import './index.scss'; import './index.scss';
// import 'katex/dist/katex.css'; // import 'katex/dist/katex.css';
@ -324,6 +324,7 @@ class EditTab extends React.Component {
console.log(choid_ids); console.log(choid_ids);
return ( return (
<Cascader <Cascader
placeholder="请选择"
options={tempArr} options={tempArr}
expandTrigger="hover" expandTrigger="hover"
value={choid_ids} value={choid_ids}

@ -12,6 +12,7 @@ class Bottomsubmit extends Component {
cannelfun = () => { cannelfun = () => {
// window.location.href= // window.location.href=
debugger
if(this.props.Cohetepaperbool===true){ if(this.props.Cohetepaperbool===true){
this.props.setCohetepaperbool(false); this.props.setCohetepaperbool(false);
}else { }else {

@ -87,15 +87,16 @@
right: 150px; right: 150px;
top: 0; top: 0;
height: 34px; height: 34px;
background: gold; line-height: 32px;
/* background: gold; */
} }
.code_evalute_icon{ .code_evalute_icon{
position: absolute; position: absolute;
top: 0; top: 0;
width: 56px; width: 54px;
height: 28px; height: 27px;
left: 50%; left: 50%;
margin-left: -28px; margin-left: -27px;
background: rgba(42,58,79,1); background: rgba(42,58,79,1);
z-index: 10; z-index: 10;
border-bottom-left-radius: 100px; border-bottom-left-radius: 100px;
@ -106,6 +107,15 @@
opacity: .4; opacity: .4;
transition: all .3s; transition: all .3s;
} }
.code_evalute_icon:hover{
opacity: 1;
}
.btn-arrow{
position: relative;
bottom: 3px;
font-size: 14px !important;
}
@keyframes mymove @keyframes mymove
{ {

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import axios from 'axios' import axios from 'axios'
import { Spin, Icon } from 'antd' import { Spin, Icon } from 'antd'
import ClipboardJS from 'clipboard' import ClipboardJS from 'clipboard'
import { connect } from 'react-redux';
import VNCDisplay from './VNCDisplay' import VNCDisplay from './VNCDisplay'
import FloatButton from './component/FloatButton' import FloatButton from './component/FloatButton'
import SecondDrawer from './component/SecondDrawer' import SecondDrawer from './component/SecondDrawer'
@ -202,13 +202,17 @@ class VNCContainer extends Component {
onSelect={onTreeSelect} onSelect={onTreeSelect}
*/ */
render() { render() {
const { challenge, vnc_url, git_url } = this.props const { challenge, vnc_url, git_url, showOrHide, isCollapse } = this.props
const _classCtx = this.state.bottomDrawer ? 'btn_test_case_active' : 'btn_test_case'; const _classCtx = this.state.bottomDrawer ? 'btn_test_case_active' : 'btn_test_case';
const _classes = this.state.bottomDrawer const _classes = this.state.bottomDrawer
? `iconfont icon-xiajiantou btn-arrow` ? `iconfont icon-xiajiantou btn-arrow`
: 'iconfont icon-shangjiantou btn-arrow'; : 'iconfont icon-shangjiantou btn-arrow';
const secondDrawerChildren = this.renderSecondDrawerChildren(); const secondDrawerChildren = this.renderSecondDrawerChildren();
const _drawClasses = showOrHide
? ('codeEvaluateDrawer code_evaluate_stretch')
: (isCollapse ? 'codeEvaluateDrawer active' : 'codeEvaluateDrawer');
return ( return (
<React.Fragment> <React.Fragment>
<SecondDrawer <SecondDrawer
@ -225,9 +229,20 @@ class VNCContainer extends Component {
<style>{` <style>{`
/* 评测结果 */ /* 评测结果 */
.codeEvaluateDrawer{ .codeEvaluateDrawer{
// position: absolute; position: absolute;
// bottom: 84px; bottom: 84px;
transition: all .3s;
// bottom: px;
}
.codeEvaluateDrawer.active{
bottom: 50px;
}
.code_evaluate_stretch{
top: 0px;
} }
.codeEvaluateDrawer #game_test_set_results { .codeEvaluateDrawer #game_test_set_results {
height: 198px; height: 198px;
} }
@ -242,6 +257,14 @@ class VNCContainer extends Component {
background: rgb(5, 16, 26) !important; background: rgb(5, 16, 26) !important;
} }
.code_evaluate_stretch .ant-drawer-content-wrapper{
height: 100% !important;
}
.code_evaluate_stretch #game_test_set_results {
height: calc(100vh - 136px) !important;
}
.codeEvaluateFloatButton { .codeEvaluateFloatButton {
bottom: 180px !important; bottom: 180px !important;
left: unset; left: unset;
@ -348,12 +371,12 @@ class VNCContainer extends Component {
width={firstDrawerWidth} width={firstDrawerWidth}
closable={false} closable={false}
onClose={this.onBottomDrawerClose} onClose={this.onBottomDrawerClose}
visible={this.state.bottomDrawer===undefined?false:this.state.bottomDrawer} visible={isCollapse}
className={'codeEvaluateDrawer'} className={_drawClasses}
placement="bottom" placement="bottom"
getContainer={false} getContainer={false}
// style={{ position: 'absolute', bottom: '-25px', zIndex: 1 }} // style={{ position: 'absolute', bottom: '-25px', zIndex: 1 }}
style={{ position: 'absolute', bottom: '50px', zIndex: 1 }} // style={{ position: 'absolute', bottom: '50px', top: 0, zIndex: 1 }}
afterVisibleChange={(visible) => { afterVisibleChange={(visible) => {
if (visible) { if (visible) {
const canvas = $('.vncDisply canvas')[0] const canvas = $('.vncDisply canvas')[0]
@ -364,9 +387,9 @@ class VNCContainer extends Component {
> >
{ this.props.codeEvaluate } { this.props.codeEvaluate }
</Drawer> </Drawer>
<FloatButton onClick={this.swtichBottomDrawer} {/* <FloatButton onClick={this.swtichBottomDrawer}
className="codeEvaluateFloatButton" className="codeEvaluateFloatButton"
>测试集</FloatButton> >测试集</FloatButton> */}
{/* <div {/* <div
className={_classCtx} className={_classCtx}
onClick={this.swtichBottomDrawer} onClick={this.swtichBottomDrawer}
@ -382,4 +405,14 @@ class VNCContainer extends Component {
} }
} }
export default VNCContainer; const mapStateToProps = (state) => {
const { showOrHide, isCollapse } = state.tpiReducer;
return {
showOrHide,
isCollapse
}
};
export default connect(
mapStateToProps
)(VNCContainer);

@ -4,10 +4,11 @@ import React, { Component } from 'react';
import IconButton from 'material-ui/IconButton'; import IconButton from 'material-ui/IconButton';
import Tooltip from 'material-ui/Tooltip'; import Tooltip from 'material-ui/Tooltip';
import Button from 'material-ui/Button'; import Button from 'material-ui/Button';
import { connect } from 'react-redux';
import './CodeEvaluateView.css' import './CodeEvaluateView.css'
import { CircularProgress } from 'material-ui/Progress'; import { CircularProgress } from 'material-ui/Progress';
import { on, off } from 'educoder' import { on, off } from 'educoder'
import actions from '../../../redux/actions';
const testSetsExpandedArrayInitVal = [false, false, false, false, false, const testSetsExpandedArrayInitVal = [false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false,
@ -274,9 +275,24 @@ class CodeEvaluateView extends Component {
}) })
} }
onHandleTestCase () {
// console.log(this);
const {showOrHide, showOrHideTpiTestCase} = this.props;
showOrHideTpiTestCase(!showOrHide);
}
handleShowTestCase () {
// console.log('111111111');
const {isCollapse, isCollpaseTsetCase, showOrHideTpiTestCase} = this.props;
isCollpaseTsetCase(!isCollapse);
if (isCollapse) {
showOrHideTpiTestCase(false);
}
}
render() { render() {
const { evaluateViewExpanded, tabIndex } = this.state; const { evaluateViewExpanded, tabIndex } = this.state;
const { output_sets, latest_output, record, challenge, gameBuilding, myshixun } = this.props; const { output_sets, latest_output, record, challenge, gameBuilding, myshixun, showOrHide, isCollapse } = this.props;
if (!output_sets) { if (!output_sets) {
return ( return (
@ -300,6 +316,8 @@ class CodeEvaluateView extends Component {
onclick="check_tab('blacktab_con','blacktab_hover',this);" onclick="check_tab('blacktab_con','blacktab_hover',this);"
*/ */
const _arrowClasses = isCollapse ? 'iconfont icon-xiajiantou btn-arrow' : 'iconfont icon-shangjiantou btn-arrow';
return ( return (
<React.Fragment> <React.Fragment>
<ul id="blacktab_nav"> <ul id="blacktab_nav">
@ -312,17 +330,20 @@ class CodeEvaluateView extends Component {
<li className={`blacktab_con ${ tabIndex === 1 ? 'tab_hover' : ''}`} onClick={() => this.tabIndexChange(1)}> <li className={`blacktab_con ${ tabIndex === 1 ? 'tab_hover' : ''}`} onClick={() => this.tabIndexChange(1)}>
<a href="javascript:void(0);" className="tab_type tab_color">测试结果</a> <a href="javascript:void(0);" className="tab_type tab_color">测试结果</a>
</li> </li>
{/* <li className="blacktab_con_abs"> <li className="blacktab_con_abs">
<span className="code_evalute_icon"> <span className="code_evalute_icon" onClick={() => this.handleShowTestCase()}>
<span className="iconfont icon-xiajiantou btn-arrow"></span> <span className={_arrowClasses}></span>
</span> </span>
</li> */} </li>
{this.props.inDrawer ? <Tooltip id="tooltip-icon-expand" title={ "收起" }> {this.props.inDrawer ? <Tooltip id="tooltip-icon-expand" title={ showOrHide ? "收起" : "展开"}>
{/*TODO 按钮大小改造css*/} {/*TODO 按钮大小改造css*/}
{/* icon-guanbi */} {/* icon-guanbi */}
<a className="iconButton fr mr15 mt4" onClick={this.props.hideCodeEvaluate} id="extend_and_zoom" > {/* <a className="iconButton fr mr15 mt4" onClick={this.props.hideCodeEvaluate} id="extend_and_zoom" >
<i className={ "font-18 iconfont icon-guanbi" }></i> <i className={ "font-18 iconfont icon-guanbi" }></i>
</a> */}
<a style={{ display: isCollapse ? 'inline-block' : 'none'}} className="iconButton fr mr15" id="extend_and_zoom" onClick={() => this.onHandleTestCase()}>
<i className={ showOrHide ? "font-18 iconfont icon-shousuo" : "iconfont icon-zhankai font-18" }></i>
</a> </a>
</Tooltip> : <Tooltip id="tooltip-icon-expand" title={ evaluateViewExpanded ? "" : ""}> </Tooltip> : <Tooltip id="tooltip-icon-expand" title={ evaluateViewExpanded ? "" : ""}>
@ -398,4 +419,19 @@ class CodeEvaluateView extends Component {
} }
} }
export default CodeEvaluateView; const mapStateToProps = (state) => {
const { showOrHide, isCollapse } = state.tpiReducer;
return {
showOrHide,
isCollapse
}
};
const mapDispatchToProps = (dispatch) => ({
showOrHideTpiTestCase: (flag) => dispatch(actions.showOrHideTpiTestCase(flag)),
isCollpaseTsetCase: (flag) => dispatch(actions.isCollpaseTsetCase(flag))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(CodeEvaluateView);

@ -272,11 +272,7 @@ class Paperreview_item extends Component {
}else { }else {
//确定 //确定
const url = `/item_baskets/${this.state.item_bank_id}.json`; const url = `/item_baskets/${this.state.item_bank_id}.json`;
axios.delete((url), { axios.delete((url))
data: {
item_type: this.state.titilesms
}
})
.then((response) => { .then((response) => {
if (response.data.status == 0) { if (response.data.status == 0) {
this.props.showNotification('试题删除成功'); this.props.showNotification('试题删除成功');

@ -57,12 +57,16 @@ class Paperreview_items extends Component {
render() { render() {
let {paperreviewsingleindex,paperreviewsinglename,typenames,indexs,object,typenamesn}=this.props; let {paperreviewsingleindex,paperreviewsinglename,typenames,indexs,object,typenamesn}=this.props;
// console.log(object);
console.log("Paperreview_items");
console.log(object.item_id);
return ( return (
<div> <div>
{ {
paperreviewsingleindex===indexs&&paperreviewsinglename===typenames? paperreviewsingleindex===indexs&&paperreviewsinglename===typenames?
<div className="xaxisreverseorder mt25 mr2"> <div className="xaxisreverseorder mt25 mr2">
<div className="scd xiaoshou" onClick={()=>this.props.showsetmodalsTypedels(object.id,true,1)}>删除</div> <div className="scd xiaoshou" onClick={()=>this.props.showsetmodalsTypedels(object.item_id,true,1)}>删除</div>
<div className="szdfd xiaoshou" onClick={()=>this.props.Singlemagazines(true,object.id,typenamesn)}>设置得分</div> <div className="szdfd xiaoshou" onClick={()=>this.props.Singlemagazines(true,object.id,typenamesn)}>设置得分</div>
</div> </div>
: <div className="xaxisreverseorder mt25 "> : <div className="xaxisreverseorder mt25 ">

@ -464,7 +464,7 @@ class Questionitem_banks extends Component {
} }
if (this.state.item_type === "PROGRAM") { if (this.state.item_type === "PROGRAM") {
//编程题 跳转到 oj 中创建 //编程题 跳转到 oj 中创建
this.props.history.replace('/problems/new');
} }

@ -472,6 +472,11 @@ class Itembankstop extends Component {
})} })}
</Select> </Select>
</InputGroup> </InputGroup>
<img className=" ml22 zjzsdian xiaoshou" src={getImageUrl("/images/educoder/zjzsd.png")}/>
<div className="sortinxdirection" style={{ <div className="sortinxdirection" style={{
height: "33px", height: "33px",
lineHeight: "28px", lineHeight: "28px",
@ -484,8 +489,9 @@ class Itembankstop extends Component {
position: "relative", position: "relative",
}}> }}>
<p className="w100s stestcen lh32">{object.name}</p> <p className="w100s stestcen lh32">{object.name}</p>
<i className="iconfont icon-roundclose font-25 lg ml7 icondowncolorss"
onClick={() => this.deletesobject(object, index)}></i> <img className=" ml7 zjzsdian xiaoshou icondowncolorssy" onClick={() => this.deletesobject(object, index)} src={getImageUrl("/images/educoder/bzucha.png")}/>
</div> </div>
) )
})} })}

@ -169,12 +169,23 @@ class Listjihe extends Component {
<i className="iconfont icon-shanchu1 font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i> <i className="iconfont icon-shanchu1 font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i>
<span>删除</span> <span>删除</span>
</p> </p>
<a href={`/question/edit/${items.id}`}> {
<p className="viewparsings xiaoshou mr25" > items.item_type==="PROGRAM"?
<i className="iconfont icon-bianji2 font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i> <a href={`/problems/${items.program_attr.identifier}/edit`}>
<span>编辑</span> <p className="viewparsings xiaoshou mr25" >
</p> <i className="iconfont icon-bianji2 font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i>
</a> <span>编辑</span>
</p>
</a>
:
<a href={`/question/edit/${items.id}`}>
<p className="viewparsings xiaoshou mr25" >
<i className="iconfont icon-bianji2 font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i>
<span>编辑</span>
</p>
</a>
}
<p className="viewparsings xiaoshou mr25" onClick={()=>this.props.showmodels(items.id)}> <p className="viewparsings xiaoshou mr25" onClick={()=>this.props.showmodels(items.id)}>
<i className="iconfont icon-gongkai font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i> <i className="iconfont icon-gongkai font-17 lg ml7 lh30 icontianjiadaohangcolors mr5"></i>
<span>公开</span> <span>公开</span>

@ -0,0 +1,50 @@
import React, { Component } from 'react';
import {getImageUrl} from 'educoder';
import { Modal,Input} from 'antd';
import axios from 'axios';
import './../questioncss/questioncom.css'
//立即申请试用
class PaperDeletModel extends Component {
constructor(props) {
super(props);
this.state={
newkntypeinput:""
}
}
handleChange=(e)=>{
this.setState({
newkntypeinput: e.target.value
})
}
render() {
return(
<Modal
keyboard={false}
closable={false}
footer={null}
destroyOnClose={true}
title="新增知识点"
centered={true}
visible={this.props.NewknTypedel===undefined?false:this.props.NewknTypedel}
width="442px"
>
<div className="educouddiv">
<div className={"tabeltext-alignleft mt10"}>
<Input onInput={this.handleChange} />
</div>
<div className="clearfix mt30 edu-txt-center">
<a className="task-btn mr30 w80" onClick={()=>this.props.setmodalsTypedel()}>取消</a>
<a className="task-btn task-btn-orange w80" onClick={()=>this.props.setmodalsTypedel(this.state.newkntypeinput)}>确定</a>
</div>
</div>
</Modal>
)
}
}
export default PaperDeletModel;

@ -216,6 +216,11 @@
top: -20px; top: -20px;
right: -16px; right: -16px;
} }
.icondowncolorssy{
position: absolute;
top: -15px;
right: -11px;
}
.questiontype{ .questiontype{
width: 100%; width: 100%;
@ -807,3 +812,13 @@
.mr2{ .mr2{
margin-right: 2px; margin-right: 2px;
} }
.ml22{
margin-left: 22px;
}
.zjzsdian{
width: 20px;
height: 20px;
margin-top: 5px;
}

@ -84,6 +84,9 @@ const types = {
DELETE_COMMENTS: 'DELETE_COMMENTS', // 删除评论 DELETE_COMMENTS: 'DELETE_COMMENTS', // 删除评论
SAVE_COMMENT_IDENTIFIER: 'SAVE_COMMENT_IDENTIFIER', // 评论时的identifier SAVE_COMMENT_IDENTIFIER: 'SAVE_COMMENT_IDENTIFIER', // 评论时的identifier
CHANGE_COMMENT_PAGINATION_PARAMS: 'CHANGE_COMMENT_PAGINATION_PARAMS', // 改变分页 CHANGE_COMMENT_PAGINATION_PARAMS: 'CHANGE_COMMENT_PAGINATION_PARAMS', // 改变分页
/** tpi */
SHOW_OR_HIDE_TPI_TEST_CASE: 'SHOW_OR_HIDE_TPI_TEST_CASE', // 显示或隐藏tpi测试集弹框
IS_COLLAPSE_TEST_CASE: 'IS_COLLAPSE_TEST_CASE' // 是否展开测试集
} }
export default types; export default types;

@ -96,6 +96,11 @@ import {
updataspinning updataspinning
} from './jupyter'; } from './jupyter';
import {
showOrHideTpiTestCase,
isCollpaseTsetCase
} from './tpi';
export default { export default {
toggleTodo, toggleTodo,
getOJList, getOJList,
@ -169,5 +174,8 @@ export default {
deleteComment, deleteComment,
likeComment, likeComment,
showOrHideComment, showOrHideComment,
changePagination changePagination,
// tpi
showOrHideTpiTestCase,
isCollpaseTsetCase
} }

@ -0,0 +1,23 @@
/*
* @Description:
* @Author: tangjiang
* @Github:
* @Date: 2020-01-03 10:24:43
* @LastEditors : tangjiang
* @LastEditTime : 2020-01-03 11:45:22
*/
import types from './actionTypes';
export const showOrHideTpiTestCase = (flag) => {
return {
type: types.SHOW_OR_HIDE_TPI_TEST_CASE,
payload: flag
}
}
export const isCollpaseTsetCase = (flag) => {
return {
type: types.IS_COLLAPSE_TEST_CASE,
payload: flag
}
}

@ -15,6 +15,7 @@ import commonReducer from './commonReducer';
import userReducer from './userReducer'; import userReducer from './userReducer';
import jupyterReducer from './jupyterReducer'; import jupyterReducer from './jupyterReducer';
import commentReducer from './commentReducer'; import commentReducer from './commentReducer';
import tpiReducer from './tpiReducer';
export default combineReducers({ export default combineReducers({
testReducer, testReducer,
@ -24,5 +25,6 @@ export default combineReducers({
commonReducer, commonReducer,
userReducer, userReducer,
jupyterReducer, jupyterReducer,
commentReducer commentReducer,
tpiReducer
}); });

@ -0,0 +1,36 @@
/*
* @Description:
* @Author: tangjiang
* @Github:
* @Date: 2020-01-03 10:24:31
* @LastEditors : tangjiang
* @LastEditTime : 2020-01-03 11:44:26
*/
import types from "../actions/actionTypes";
const initialState = {
showOrHide: false,
isCollapse: false, // 是否展开测试集
};
const tpiReducer = (state = initialState, action) => {
const { type, payload } = action;
switch (type) {
case types.SHOW_OR_HIDE_TPI_TEST_CASE:
return {
...state,
showOrHide: payload
}
case types.IS_COLLAPSE_TEST_CASE:
return {
...state,
isCollapse: payload
}
default:
return {
...state
}
}
}
export default tpiReducer;
Loading…
Cancel
Save