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

dev_chen
cxt 5 years ago
commit 196c40b2ea

@ -46,7 +46,7 @@ debugType = "admin";
// 老师 // 老师
// debugType="teacher"; // debugType="teacher";
// 学生 // 学生
debugType="student"; //debugType="student";

@ -6,11 +6,8 @@ export function isImageExtension(fileName) {
} }
export function markdownToHTML(oldContent, selector) { export function markdownToHTML(oldContent, selector) {
console.log(oldContent) try {
console.log(selector)
if(oldContent){
window.$('#md_div').html('') window.$('#md_div').html('')
// markdown to html
if (selector && oldContent && oldContent.startsWith('<p')) { // 普通html处理 if (selector && oldContent && oldContent.startsWith('<p')) { // 普通html处理
window.$('#' + selector).addClass('renderAsHtml') window.$('#' + selector).addClass('renderAsHtml')
window.$('#' + selector).html(oldContent) window.$('#' + selector).html(oldContent)
@ -42,8 +39,9 @@ export function markdownToHTML(oldContent, selector) {
} }
return content return content
} }
} }catch (e) {
}
} }
function _doDownload(options) { function _doDownload(options) {
$.fileDownload(getUrl() + "/api" + options.url, { $.fileDownload(getUrl() + "/api" + options.url, {

@ -209,12 +209,16 @@ function QuillForEditor({
if (value && value.hasOwnProperty('ops')) { if (value && value.hasOwnProperty('ops')) {
// console.log(value.ops); // console.log(value.ops);
const ops = value.ops || []; try {
ops.forEach((item, i) => { const ops = value.ops || [];
if (item.insert['image']) { ops.forEach((item, i) => {
item.insert['image'] = Object.assign({}, item.insert['image'], { style: { cursor: 'pointer' }, onclick: (url) => showUploadImage(url) }); if (item.insert['image']) {
} item.insert['image'] = Object.assign({}, item.insert['image'], { style: { cursor: 'pointer' }, onclick: (url) => showUploadImage(url) });
}); }
});
}catch (e) {
}
} }
const current = value const current = value

@ -13,6 +13,7 @@ import CoursesListType from '../coursesPublic/CoursesListType';
import QuillForEditor from "../../../common/quillForEditor"; import QuillForEditor from "../../../common/quillForEditor";
import Multiple from './question/multiple'; import Multiple from './question/multiple';
import Single from './question/single'; import Single from './question/single';
import Progques from './question/Progques';
import FillEmpty from './question/fillEmpty'; import FillEmpty from './question/fillEmpty';
import SimpleAnswer from './question/simpleAnswer'; import SimpleAnswer from './question/simpleAnswer';
import ShixunAnswer from './question/shixunAnswer'; import ShixunAnswer from './question/shixunAnswer';
@ -1014,6 +1015,22 @@ class ExerciseReviewAndAnswer extends Component{
handleShowUploadImage={(u)=>this.handleShowUploadImage(u)} handleShowUploadImage={(u)=>this.handleShowUploadImage(u)}
></ShixunAnswer> ></ShixunAnswer>
} }
{
//编程题
item.question_type == 6 &&
<Progques
{...this.props}
{...this.state}
is_md={is_md}
exercise={exercise}
questionType={item}
user_exercise_status={user_exercise_status}
id={this.state.Id}
index={key}
handleShowUploadImage={(u)=>this.handleShowUploadImage(u)}
></Progques>
}
{ {
//调分理由部分 //调分理由部分

@ -1,7 +1,6 @@
import React, {Component} from "react"; import React, {Component} from "react";
import {WordsBtn,markdownToHTML, MarkdownToHtml} from 'educoder'; import {QuillForEditor, MarkdownToHtml} from 'educoder';
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider,InputNumber, Tag,DatePicker,Radio,Tooltip,Pagination} from "antd"; import {Checkbox,Pagination} from "antd";
import {Link,Switch,Route,Redirect} from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';
import Exercisetablesmubu from './Exercisetablesmubu'; import Exercisetablesmubu from './Exercisetablesmubu';
import Exercisestatisticalresulttabel from './Exercisestatisticalresulttabel'; import Exercisestatisticalresulttabel from './Exercisestatisticalresulttabel';
@ -287,6 +286,9 @@ class Exercisestatisticalresult extends Component {
.Exermubu .editormd-html-preview, .Exermubu .editormd-preview-container { .Exermubu .editormd-html-preview, .Exermubu .editormd-preview-container {
background: transparent; background: transparent;
} }
.ql-editor{
padding:0px !important;
}
`} `}
</style> </style>
{data&&data.commit_results.map((item,key)=>{ {data&&data.commit_results.map((item,key)=>{
@ -299,9 +301,14 @@ class Exercisestatisticalresult extends Component {
<div> <div>
{/*Q{item.ques_position}*/} {/*Q{item.ques_position}*/}
{/* <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML1(item.ques_title).replace(/▁/g,"▁▁▁")}}></div> */} {/* <div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML1(item.ques_title).replace(/▁/g,"▁▁▁")}}></div> */}
<MarkdownToHtml content={item.ques_title} selector={'ques_title_' + key} {this.state&&this.state.data.is_md===false&&item.ques_type!=6?<QuillForEditor
style={{ display: 'inline-block', width:'100%' , margin: '1px',padding:'0px'}}
readOnly={true}
value={item.ques_title?JSON.parse(item.ques_title):""}
// showUploadImage={this.handleShowUploadImage}
/>:<MarkdownToHtml content={item.ques_title} selector={'ques_title_' + key}
className="" className=""
></MarkdownToHtml> ></MarkdownToHtml>}
{/*<span className="markdown-body" dangerouslySetInnerHTML={createMarkup(item.ques_title)}></span>*/} {/*<span className="markdown-body" dangerouslySetInnerHTML={createMarkup(item.ques_title)}></span>*/}
</div> </div>
</div> </div>
@ -319,8 +326,9 @@ class Exercisestatisticalresult extends Component {
<div className="fr shixunreporttitles">正确率<span style={{color:'#FF6800'}}> {ite.challenge_percent}%</span></div> <div className="fr shixunreporttitles">正确率<span style={{color:'#FF6800'}}> {ite.challenge_percent}%</span></div>
</div> </div>
<Exercisetablesmubu <Exercisetablesmubu
{...this.state}
tableNum={`${key}${k}`} tableNum={`${key}${k}`}
data={ite.challenge_details} datass={ite.challenge_details}
type={item.ques_type} type={item.ques_type}
effictive_counts={item.effictive_counts} effictive_counts={item.effictive_counts}
choicetype={choicetype} choicetype={choicetype}
@ -329,8 +337,9 @@ class Exercisestatisticalresult extends Component {
) )
}): }):
<Exercisetablesmubu <Exercisetablesmubu
{...this.state}
tableNum={key} tableNum={key}
data={item.ques_details} datass={item.ques_details}
type={item.ques_type} type={item.ques_type}
effictive_counts={item.effictive_counts} effictive_counts={item.effictive_counts}
choicetype={choicetype} choicetype={choicetype}

@ -1,8 +1,5 @@
import React, {Component} from "react"; import React, {Component} from "react";
import {WordsBtn} from 'educoder';
import {Table} from "antd"; import {Table} from "antd";
import {Link,Switch,Route,Redirect} from 'react-router-dom';
class OfficialAcademicTranscript extends Component { class OfficialAcademicTranscript extends Component {
constructor(props) { constructor(props) {

@ -1,11 +1,11 @@
import React, {Component} from "react"; import React, {Component} from "react";
import {WordsBtn, MarkdownToHtml} from 'educoder'; import {MarkdownToHtml,QuillForEditor} from 'educoder';
import {Table,Progress} from "antd"; import {Table,Progress} from "antd";
import {Link,Switch,Route,Redirect} from 'react-router-dom';
const tagArray = [ const tagArray = [
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
] ]
@ -15,7 +15,6 @@ class Exercisetablesmubus extends Component {
super(props); super(props);
this.state = { this.state = {
loadingstate:true, loadingstate:true,
datas:undefined
} }
} }
@ -23,13 +22,26 @@ class Exercisetablesmubus extends Component {
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let {data,type,effictive_counts,choicetype, tableNum}=this.props; let {datass,type,effictive_counts,choicetype, tableNum}=this.props;
let datas=[]; let list=[];
data&&data.forEach((item,key)=>{ datass&&datass.forEach((item,key)=>{
datas.push({ list.push({
commit_percent:{ commit_percent:{
num:item.choice_position, num:item.choice_position,
value:type===4||type===5?choicetype[item.choice_text-1]:item.choice_text, value:type===4||type===5?choicetype[item.choice_text-1]:item.choice_text,
@ -40,33 +52,38 @@ class Exercisetablesmubus extends Component {
max_score:item.choice_percent, max_score:item.choice_percent,
}) })
}) })
datas.push({ list.push({
commit_percent: {num:null,value:"有效填写量"}, commit_percent: {num:null,value:"有效填写量"},
min_score:{value:effictive_counts}, min_score:{value:effictive_counts},
}) })
let columns=[] let columns=[]
if(datas.length!=0){ if(list.length!=0){
columns=[{ columns=[{
title: '选项', title: '选项',
dataIndex: 'commit_percent', dataIndex: 'commit_percent',
key: 'commit_percent', key: 'commit_percent',
render: (text, record, index) => { render: (text, record, index) => {
const _content = <span style={{color:text.type===true? "#29BD8B":'#333333', width: '100%'}}> const _content = <span style={{color:text.type===true? "#29BD8B":'#333333', width: '100%'}}>
{text.value!="有效填写量"&&text.value!="wrong" && {text.value>0&&text.value!="有效填写量"&&text.value!="wrong"||!text.value&&text.value!="有效填写量"&&text.value!="wrong"?text.value:text.value!="有效填写量"&&text.value!="wrong" &&
<MarkdownToHtml content={text.value} selector={(tableNum+1) + '' + (index+1)}></MarkdownToHtml> this.props&&this.props.data.is_md===false?<QuillForEditor
style={{ display: 'inline-block', width:'100%' , margin: '1px',padding:'0px'}}
readOnly={true}
value={this.setdata(text.value)}
// showUploadImage={this.handleShowUploadImage}
/>:text.value!=""&&text.value!="wrong"&&<MarkdownToHtml content={text.value} selector={(tableNum+1) + '' + (index+1)}></MarkdownToHtml>
} }
{text.value==="wrong" && "填写了错误答案" } {text.value==="wrong" && "填写了错误答案" }
{text.value==="有效填写量" && "有效填写量" } {text.value==="有效填写量" && "有效填写量" }
</span> </span>
return ( return (
(text._type === 0 || text._type === 1) ? <div style={{ display: 'flex'}}> (text._type === 0 || text._type === 1) ? <div style={{ display: 'flex'}}>
{<span style={{ 'margin-right': '4px', 'margin-top': '-2px'}}>{tagArray[index]}.</span>} {<span style={{ 'margin-right': '4px', 'margin-top': '-2px'}}>{tagArray[index]}.</span>}
{_content} {_content}
</div> : <React.Fragment>{_content}</React.Fragment> </div> : <React.Fragment>{_content}</React.Fragment>
) )
}, },
}, { }, {
title: '小计', title: '小计',
@ -122,13 +139,15 @@ class Exercisetablesmubus extends Component {
.Exermubu .ant-table-tbody> tr > td{ .Exermubu .ant-table-tbody> tr > td{
border-bottom: transparent; border-bottom: transparent;
} }
.ql-editor{
padding:0px !important;
}
`} `}
</style> </style>
{datas===undefined?"":<Table {list===undefined?"":<Table
className={"Exermubu"} className={"Exermubu"}
dataSource={datas} dataSource={list}
columns={columns} columns={columns}
pagination={false} pagination={false}
// loading={loadingstate} // loading={loadingstate}

@ -1,6 +1,6 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import { Radio } from 'antd'; import { Radio } from 'antd';
import { MarkdownToHtml } from 'educoder'; import { MarkdownToHtml,QuillForEditor } from 'educoder';
import QestionDisplayHeader from './QestionDisplayHeader' import QestionDisplayHeader from './QestionDisplayHeader'
@ -30,13 +30,25 @@ class JudgeDisplay extends Component{
// }); // });
} }
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let { question_choices, let { question_choices,
question_id, index question_id, index
} = this.props; } = this.props;
const qNumber = `question_${index}`; const qNumber = `question_${index}`;
console.log(this.props)
return( return(
<div className="bor-bottom-greyE padding20-30" id={qNumber} _id={question_id}> <div className="bor-bottom-greyE padding20-30" id={qNumber} _id={question_id}>
<style>{` <style>{`
@ -61,9 +73,14 @@ class JudgeDisplay extends Component{
<div key={optionIndex} className="fl mr30 df"> <div key={optionIndex} className="fl mr30 df">
<Radio disabled className="lineh-25" checked={item.standard_boolean}></Radio> <Radio disabled className="lineh-25" checked={item.standard_boolean}></Radio>
<MarkdownToHtml content={item.choice_text} selector={'judge_' + (index + 1) + optionIndex} {!this.props.exercise||this.props.exercise&&this.props.exercise.is_md?<MarkdownToHtml content={item.choice_text} selector={'judge_' + (index + 1) + optionIndex}
className="" className=""
></MarkdownToHtml> ></MarkdownToHtml>:<QuillForEditor
readOnly={true}
style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}}
value={this.setdata(item.choice_text)}
// showUploadImage={this.handleShowUploadImage}
/>}
</div>) </div>)

@ -14,6 +14,19 @@ class MainDisplay extends Component{
} }
componentDidMount = () => { componentDidMount = () => {
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let {standard_answer, let {standard_answer,
question_id, index question_id, index
@ -49,7 +62,7 @@ class MainDisplay extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
readOnly={true} readOnly={true}
style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}} style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}}
value={standard_answer[0]?JSON.parse(standard_answer[0]):""} value={this.setdata(standard_answer[0])}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/>} />}
</React.Fragment> </React.Fragment>

@ -29,6 +29,18 @@ class NullDisplay extends Component{
// }); // });
} }
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let { question_type, standard_answer, let { question_type, standard_answer,
question_id,index, question_id,index,
@ -88,7 +100,7 @@ class NullDisplay extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
readOnly={true} readOnly={true}
style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}} style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}}
value={item?JSON.parse(item):""} value={this.setdata(item)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/> />
) )

@ -16,6 +16,20 @@ class QestionDisplayHeader extends Component{
componentDidMount = () => { componentDidMount = () => {
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let { question_title, question_score, question_type, let { question_title, question_score, question_type,
question_id, index, displayCount, question_id, index, displayCount,
@ -29,7 +43,7 @@ class QestionDisplayHeader extends Component{
const qName = qNameArray[question_type] const qName = qNameArray[question_type]
console.log(this.props) // console.log(this.props)
return( return(
<React.Fragment> <React.Fragment>
<div className="new_li"> <div className="new_li">
@ -82,7 +96,7 @@ class QestionDisplayHeader extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px',padding:'0px'}} style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px',padding:'0px'}}
readOnly={true} readOnly={true}
value={question_title?JSON.parse(question_title):""} value={this.setdata(question_title)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/> />
// <div className="markdown-body" dangerouslySetInnerHTML={{__html: markdownToHTML1(question_title)}} // <div className="markdown-body" dangerouslySetInnerHTML={{__html: markdownToHTML1(question_title)}}

@ -12,6 +12,20 @@ class ShixunDisplay extends Component{
} }
} }
componentDidMount = () => { componentDidMount = () => {
}
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
} }
render() { render() {
let { question_title, let { question_title,
@ -111,7 +125,7 @@ class ShixunDisplay extends Component{
</div>:<QuillForEditor </div>:<QuillForEditor
readOnly={true} readOnly={true}
style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}} style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}}
value={question_title?JSON.parse(question_title):""} value={this.setdata(question_title)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/>} />}

@ -13,6 +13,18 @@ class ShixunProgramming extends Component{
} }
componentDidMount = () => { componentDidMount = () => {
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let { description,question_title, let { description,question_title,
question_id, index, shixun_identifier,hack_identifier question_id, index, shixun_identifier,hack_identifier
@ -50,7 +62,7 @@ class ShixunProgramming extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px',padding:'0px'}} style={{ display: 'inline-block', width:'100%' , margin: '10px 0px 15px',padding:'0px'}}
readOnly={true} readOnly={true}
value={description?JSON.parse(description):""} value={this.setdata(description)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/>} />}

@ -34,6 +34,19 @@ class SingleDisplay extends Component{
// }); // });
} }
} }
setdata=(value)=>{
let newvalue;
try {
newvalue=JSON.parse(value);
}catch (e) {
newvalue={"ops":[{"insert":value}]};
}
if(value===undefined){
newvalue={"ops":[{"insert":""}]};
}
return newvalue
}
render() { render() {
let { question_type, question_choices, let { question_type, question_choices,
question_id, index, question_id, index,
@ -83,7 +96,7 @@ class SingleDisplay extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
readOnly={true} readOnly={true}
style={{ float: 'left', display: 'inline-block',padding:'0px',margin: '2px 0px 0px'}} style={{ float: 'left', display: 'inline-block',padding:'0px',margin: '2px 0px 0px'}}
value={item.choice_text?JSON.parse(item.choice_text):""} value={this.setdata(item.choice_text)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/>} />}
@ -101,7 +114,7 @@ class SingleDisplay extends Component{
></MarkdownToHtml>:<QuillForEditor ></MarkdownToHtml>:<QuillForEditor
readOnly={true} readOnly={true}
style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}} style={{ float: 'left', display: 'inline-block' ,padding:'0px',margin: '2px 0px 0px'}}
value={item.choice_text?JSON.parse(item.choice_text):""} value={this.setdata(item.choice_text)}
// showUploadImage={this.handleShowUploadImage} // showUploadImage={this.handleShowUploadImage}
/>} />}

@ -0,0 +1,103 @@
import React,{ Component } from "react";
import {Checkbox,Radio, Input} from "antd";
import {DMDEditor,markdownToHTML, MarkdownToHtml } from 'educoder'
import QuillForEditor from "../../../../common/quillForEditor";
import axios from 'axios'
const tagArray = [
// 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
// 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
// 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
]
class Progques extends Component{
constructor(props){
super(props);
}
toMDMode = (that) => {
}
onOptionContentChange = (value, index) => {
}
onBlurEmpty=(index,number)=>{
}
render(){
let {
questionType ,
exercise ,
user_exercise_status,
is_md
}=this.props
let isAdmin = this.props.isAdmin();
let isStudent = this.props.isStudent();
let item=questionType;
let titename="";
if(item){
if(is_md===true){
titename=item.description;
}else{
try {
titename = JSON.parse(item.description);
}catch (e) {
titename={"ops":[{"insert":item.description}]};
}
// JSON.parse 有些异常数据是undefined
if(titename===undefined){
titename={"ops":[{"insert":item.description}]};
}
try {
// JSON.parse 转换的时候如果是数字字符串就转成整数了
if(titename>=0){
titename={"ops":[{"insert":item.description}]};
}
}catch (e) {
}
}
}
return(
<div className="pl30 pr30">
<style>{`
.emptyPanel div#content_editorMd_show{
width: 100%;
border-radius: 4px;
// height: 35px;
margin-top:0px;
background-color:#fafafa;
color:#999;
// line-height:25px;
}
.answerStyle{
background:#f5f5f5;
border-radius:4px;
border: 1px solid #eaeaea;
padding:5px;
min-height:35px;
box-sizing:border-box;
}
.emptyPanel .quill_editor_for_react_area{
width: 100% !important;
}
`}</style>
<li className="df mb10 emptyPanel">
<QuillForEditor
readOnly={true}
value={titename}
showUploadImage={this.props.handleShowUploadImage}
/>
</li>
</div>
)
}
}
export default Progques
Loading…
Cancel
Save