Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
X
xiaomai-cloud-class-web
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xiaomai-cloud-class
xiaomai-cloud-class-web
Commits
1be67de3
Commit
1be67de3
authored
Jul 04, 2021
by
maolipeng
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into feature/maolipeng/20210610/zuhuyouhua
parents
69cfc14a
0b6f18d9
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
443 additions
and
9 deletions
+443
-9
src/modules/teach-tool/paper-manage/OperatePaper.jsx
+166
-9
src/modules/teach-tool/paper-manage/components/BatchScore.less
+28
-0
src/modules/teach-tool/paper-manage/components/BatchScore.tsx
+249
-0
No files found.
src/modules/teach-tool/paper-manage/OperatePaper.jsx
View file @
1be67de3
...
...
@@ -21,7 +21,8 @@ import Bus from '@/core/bus';
import
_
from
'underscore'
;
import
{
Route
,
withRouter
}
from
'react-router-dom'
;
import
*
as
paperEmpty
from
'../../lottie/paperEmpty/data.json'
;
import
AddExam
from
'@/modules/teach-tool/examination-manager/AddExam'
;
import
AddExam
from
"@/modules/teach-tool/examination-manager/AddExam"
;
import
BatchScore
from
"./components/BatchScore"
;
const
questionTypeEnum
=
{
SINGLE_CHOICE
:
'单选题'
,
...
...
@@ -60,6 +61,7 @@ class OperatePaper extends Component {
selectQuestionModal
:
null
,
paperPreviewModal
:
null
,
quickSortModalVisible
:
false
,
// 快捷排序弹窗显隐
batchSetScoreVisible
:
false
,
//批量设置题型分数
selectQuestionList
:
[],
currentOperate
:
''
,
currentNav
:
''
,
...
...
@@ -85,6 +87,38 @@ class OperatePaper extends Component {
typeKey
:
'INDEFINITE_CHOICE'
,
},
],
scoreRule
:
[
{
typeKey
:
"SINGLE_CHOICE"
,
score
:
2
,
portionScore
:
0
,
totalQuestion
:
0
,
},
{
typeKey
:
"MULTI_CHOICE"
,
score
:
2
,
portionScore
:
0
,
totalQuestion
:
0
,
},
{
typeKey
:
"JUDGE"
,
score
:
2
,
portionScore
:
0
,
totalQuestion
:
0
,
},
{
typeKey
:
"GAP_FILLING"
,
score
:
2
,
portionScore
:
0
,
totalQuestion
:
0
,
},
{
typeKey
:
"INDEFINITE_CHOICE"
,
score
:
2
,
portionScore
:
0
,
totalQuestion
:
0
,
},
]
};
}
...
...
@@ -191,6 +225,29 @@ class OperatePaper extends Component {
},
0
);
const
passScore
=
Math
.
round
(
totalScore
*
formData
.
passRate
*
0.01
);
let
_scorerule
=
_
.
map
(
this
.
state
.
scoreRule
,(
item
)
=>
{
switch
(
item
.
typeKey
)
{
case
"SINGLE_CHOICE"
:
item
.
totalQuestion
=
singleQuestion
.
length
;
break
;
case
"MULTI_CHOICE"
:
item
.
totalQuestion
=
multiQuestion
.
length
;
break
;
case
"JUDGE"
:
item
.
totalQuestion
=
judgeQuestion
.
length
;
break
;
case
"GAP_FILLING"
:
item
.
totalQuestion
=
gapQuestion
.
length
;
break
;
case
"INDEFINITE_CHOICE"
:
item
.
totalQuestion
=
indefiniteQuestion
.
length
;
break
;
default
:
item
.
totalQuestion
=
0
break
;
}
return
item
})
this
.
setState
({
formData
:
{
...
formData
,
...
...
@@ -208,6 +265,7 @@ class OperatePaper extends Component {
questionCnt
:
_selectQuestionList
.
length
,
totalScore
,
},
scoreRule
:
_scorerule
,
});
};
...
...
@@ -218,9 +276,11 @@ class OperatePaper extends Component {
<
SelectQuestionModal
getSelectedQuestion=
{
selectQuestionList
}
setSelectedQuestion=
{
(
list
)
=>
{
//按分数规则给每一题重新设置分数(只对新增题目有效)
let
_list
=
this
.
setScoreByRule
(
list
)
this
.
setState
({
selectQuestionModal
:
null
},
()
=>
{
this
.
setFormData
(
list
);
this
.
quickSorter
(
list
,
sorterMethod
,
sorterBy
);
this
.
setFormData
(
_
list
);
this
.
quickSorter
(
_
list
,
sorterMethod
,
sorterBy
);
});
}
}
close=
{
()
=>
{
...
...
@@ -233,6 +293,25 @@ class OperatePaper extends Component {
this
.
setState
({
selectQuestionModal
:
m
});
};
setScoreByRule
=
(
list
)
=>
{
//按批量设置分数规则给每一题重新设置分数(只对新增题目有效)
return
_
.
map
(
list
,
(
item
)
=>
{
let
exist
=
_
.
find
(
this
.
state
.
selectQuestionList
,
(
q
)
=>
{
return
q
.
questionId
===
item
.
questionId
})
if
(
exist
)
{
return
item
}
let
rule
=
_
.
find
(
this
.
state
.
scoreRule
,(
g
)
=>
{
return
g
.
typeKey
===
item
.
questionType
})
if
(
rule
)
{
item
.
score
=
rule
.
score
item
.
portionScore
=
rule
.
portionScore
}
return
item
})
}
// 移动已选题目
handleMoveItem
=
(
index
,
moveLength
)
=>
{
const
selectQuestionList
=
[...
this
.
state
.
selectQuestionList
];
...
...
@@ -499,7 +578,13 @@ class OperatePaper extends Component {
min=
{
1
}
max=
{
100
}
value=
{
record
.
score
||
2
}
formatter=
{
value
=>
parseInt
(
value
)
}
parser=
{
value
=>
parseInt
(
value
)
}
onChange=
{
(
value
)
=>
{
value
=
Math
.
round
(
value
)
if
(
value
<=
record
.
portionScore
)
{
return
}
const
_selectQuestionList
=
[...
selectQuestionList
];
this
.
setState
(
{
...
...
@@ -523,9 +608,12 @@ class OperatePaper extends Component {
{
record
.
questionType
===
'GAP_FILLING'
?
<
span
>
半对得
</
span
>
:
<
span
>
漏选得
</
span
>
}{
' '
}
<
InputNumber
min=
{
0
}
max=
{
record
.
score
-
1
}
max=
{
record
.
score
<=
0
?
0
:
record
.
score
-
1
}
formatter=
{
value
=>
parseInt
(
value
)
}
parser=
{
value
=>
parseInt
(
value
)
}
value=
{
record
.
portionScore
||
0
}
onChange=
{
(
value
)
=>
{
value
=
Math
.
round
(
value
)
const
_selectQuestionList
=
[...
selectQuestionList
];
this
.
setState
(
{
...
...
@@ -581,6 +669,52 @@ class OperatePaper extends Component {
return
columns
;
};
//
onBatchScoreOK
=
(
rules
)
=>
{
this
.
setState
({
batchSetScoreVisible
:
false
,
scoreRule
:
rules
},()
=>
{
let
questionList
=
_
.
map
(
this
.
state
.
selectQuestionList
,(
item
)
=>
{
let
rule
=
_
.
find
(
this
.
state
.
scoreRule
,(
s
)
=>
{
return
s
.
typeKey
===
item
.
questionType
})
if
(
rule
)
{
item
.
score
=
rule
.
score
item
.
portionScore
=
rule
.
portionScore
}
return
item
})
// 各类型题目总分值
const
{
formData
,
scoreRule
}
=
this
.
state
const
{
singleChoiceCnt
,
multiChoiceCnt
,
judgeCnt
,
gapFillingCnt
,
indefiniteChoiceCnt
}
=
formData
const
singleChoiceScore
=
singleChoiceCnt
*
scoreRule
.
find
((
item
)
=>
{
return
item
.
typeKey
===
"SINGLE_CHOICE"
}).
score
const
multiChoiceScore
=
multiChoiceCnt
*
scoreRule
.
find
((
item
)
=>
{
return
item
.
typeKey
===
"MULTI_CHOICE"
}).
score
const
judgeScore
=
judgeCnt
*
scoreRule
.
find
((
item
)
=>
{
return
item
.
typeKey
===
"JUDGE"
}).
score
const
gapFillingScore
=
gapFillingCnt
*
scoreRule
.
find
((
item
)
=>
{
return
item
.
typeKey
===
"GAP_FILLING"
}).
score
const
indefiniteChoiceScore
=
indefiniteChoiceCnt
*
scoreRule
.
find
((
item
)
=>
{
return
item
.
typeKey
===
"INDEFINITE_CHOICE"
}).
score
const
totalScore
=
questionList
.
reduce
((
prev
,
cur
)
=>
{
return
prev
+
Number
(
cur
.
score
)
||
0
;
},
0
);
const
passScore
=
Math
.
round
(
totalScore
*
formData
.
passRate
*
0.01
);
this
.
setState
({
selectQuestionList
:
questionList
,
formData
:
{
...
formData
,
singleChoiceScore
,
multiChoiceScore
,
judgeScore
,
gapFillingScore
,
indefiniteChoiceScore
,
totalScore
,
passScore
,
}
})
message
.
success
(
"设置成功"
)
})
}
// 上下移题型
handleMoveTypeSorter
=
(
index
,
moveLength
)
=>
{
const
sorterTypeList
=
[...
this
.
state
.
sorterTypeList
];
...
...
@@ -719,6 +853,7 @@ class OperatePaper extends Component {
max=
{
100
}
value=
{
passRate
}
onChange=
{
(
value
)
=>
{
value
=
Math
.
round
(
value
)
this
.
setState
(
{
formData
:
{
...
...
@@ -752,16 +887,31 @@ class OperatePaper extends Component {
}
}
>
快捷排序
</
Button
>
<
Button
className=
"choose-btn"
onClick=
{
()
=>
{
this
.
setState
({
batchSetScoreVisible
:
true
,
});
}
}
>
批量设置分数
</
Button
>
</
Space
>
{
questionCnt
>
0
&&
(
<
div
className=
'paper-info-tip'
style=
{
{
margin
:
'0 auto 12px'
}
}
>
总计
<
span
>
{
totalScore
}
</
span
>
分,共
<
span
>
{
questionCnt
}
</
span
>
题。
{
singleChoiceCnt
>
0
&&
`单选题${singleChoiceCnt}题,共${singleChoiceScore}分;`
}
{
multiChoiceCnt
>
0
&&
`多选题${multiChoiceCnt}题,共${multiChoiceScore}分;`
}
{
judgeCnt
>
0
&&
`判断题${judgeCnt}题,共${judgeScore}分,`
}
{
gapFillingCnt
>
0
&&
`填空题${gapFillingCnt}题,共${gapFillingScore}分,`
}
{
indefiniteChoiceCnt
>
0
&&
`不定项选择题${indefiniteChoiceCnt}题,共${indefiniteChoiceScore}分`
}
题。
{
" "
}
{
singleChoiceCnt
>
0
&&
`单选题${singleChoiceCnt}题,共${singleChoiceScore}分;`
}
{
multiChoiceCnt
>
0
&&
`多选题${multiChoiceCnt}题,共${multiChoiceScore}分;`
}
{
judgeCnt
>
0
&&
`判断题${judgeCnt}题,共${judgeScore}分;`
}
{
gapFillingCnt
>
0
&&
`填空题${gapFillingCnt}题,共${gapFillingScore}分;`
}
{
indefiniteChoiceCnt
>
0
&&
`不定项选择题${indefiniteChoiceCnt}题,共${indefiniteChoiceScore}分;`
}
</
div
>
)
}
...
...
@@ -828,6 +978,13 @@ class OperatePaper extends Component {
/>
)
}
</
Modal
>
{
/* 批量设置分数规则 */
}
<
BatchScore
visible=
{
this
.
state
.
batchSetScoreVisible
}
onOK=
{
this
.
onBatchScoreOK
}
onCancel=
{
()
=>
this
.
setState
({
batchSetScoreVisible
:
false
})
}
rules=
{
this
.
state
.
scoreRule
}
/>
</
div
>
<
Route
path=
{
`${match.url}/exam-operate-page`
}
...
...
src/modules/teach-tool/paper-manage/components/BatchScore.less
0 → 100644
View file @
1be67de3
.batchscore {
.content {
.item {
display: flex;
width: 612px;
height: 48px;
background: #F7F8F9;
font-size: 14px;
line-height: 48px;
font-weight: 400;
color: #333333;
padding-left: 16px;
.type {
width: 112px;
}
.score {
margin-left: 8px;
margin-right: 29px;
width: 258px;
}
}
.item:not(:last-of-type) {
margin-bottom: 8px;
}
}
}
\ No newline at end of file
src/modules/teach-tool/paper-manage/components/BatchScore.tsx
0 → 100644
View file @
1be67de3
import
React
,
{
useEffect
,
useState
}
from
"react"
;
import
{
Modal
,
Button
,
InputNumber
,
message
}
from
'antd'
;
import
"./BatchScore.less"
import
_
from
"underscore"
;
interface
Rule
{
typeKey
:
"GAP_FILLING"
|
"INDEFINITE_CHOICE"
|
"JUDGE"
|
"MULTI_CHOICE"
|
"SINGLE_CHOICE"
,
score
:
number
,
portionScore
:
number
,
totalQuestion
:
number
,
}
interface
BatchScoreProps
{
visible
:
boolean
,
rules
:
Rule
[],
onOK
:
(
rules
:
Rule
[])
=>
void
,
onCancel
:
()
=>
void
,
}
export
default
function
BatchScore
(
props
:
BatchScoreProps
)
{
const
[
rules
,
setRules
]
=
useState
<
Rule
[]
>
(
_
.
sortBy
(
props
.
rules
,
"typeKey"
))
const
[
singleCount
,
setSingleCount
]
=
useState
<
number
[]
>
([
0
])
const
[
multiCount
,
setMultiCount
]
=
useState
<
number
[]
>
([
0
])
const
[
judgeCount
,
setJudgeCount
]
=
useState
<
number
[]
>
([
0
])
const
[
gapCount
,
setgapCount
]
=
useState
<
number
[]
>
([
0
])
const
[
indefiniteCount
,
setIndefiniteCount
]
=
useState
<
number
[]
>
([
0
])
useEffect
(()
=>
{
_
.
map
(
props
.
rules
,(
item
)
=>
{
//更新分数统计
switch
(
item
.
typeKey
)
{
case
"SINGLE_CHOICE"
:
setSingleCount
([
item
.
totalQuestion
,
item
.
totalQuestion
*
item
.
score
])
break
;
case
"MULTI_CHOICE"
:
setMultiCount
([
item
.
totalQuestion
,
item
.
totalQuestion
*
item
.
score
])
break
;
case
"JUDGE"
:
setJudgeCount
([
item
.
totalQuestion
,
item
.
totalQuestion
*
item
.
score
])
break
;
case
"GAP_FILLING"
:
setgapCount
([
item
.
totalQuestion
,
item
.
totalQuestion
*
item
.
score
])
break
;
case
"INDEFINITE_CHOICE"
:
setIndefiniteCount
([
item
.
totalQuestion
,
item
.
totalQuestion
*
item
.
score
])
break
;
default
:
break
;
}
})
},[
props
.
rules
,
rules
])
if
(
!
props
.
visible
)
{
return
(
""
)
}
function
onOk
()
{
for
(
let
i
=
0
;
i
<
rules
.
length
;
++
i
)
{
if
(
rules
[
i
].
score
<=
0
||
rules
[
i
].
score
>
100
)
{
message
.
error
(
"分值设置错误"
)
return
;
}
}
props
.
onOK
(
rules
)
}
function
onCancel
()
{
props
.
onCancel
()
}
const
inputNumberStyle
=
{
width
:
"57px"
,
margin
:
"0 8px"
}
return
(
<
Modal
className=
"batchscore"
title=
"批量设置分数"
onCancel=
{
onCancel
}
onOk=
{
onOk
}
visible=
{
props
.
visible
}
maskClosable=
{
false
}
width=
{
660
}
>
<
div
className=
"content"
>
<
div
className=
"item"
>
<
span
className=
"type"
>
【单选题】
</
span
>
<
span
className=
"score"
>
每题
<
InputNumber
min=
{
1
}
max=
{
100
}
value=
{
rules
[
4
].
score
}
defaultValue=
{
rules
[
4
].
score
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
let
_rules
=
[...
rules
]
rules
[
4
].
score
=
v
setRules
(
_rules
)
}
}
/>
分
</
span
>
<
span
className=
"total"
>
共
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
singleCount
[
0
]
}
</
span
>
题,合计
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
singleCount
[
1
]
}
</
span
>
分
</
span
>
</
div
>
<
div
className=
"item"
>
<
span
className=
"type"
>
【多选题】
</
span
>
<
span
className=
"score"
>
每题
<
InputNumber
min=
{
1
}
max=
{
100
}
defaultValue=
{
rules
[
3
].
score
}
value=
{
rules
[
3
].
score
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
if
(
v
<=
rules
[
3
].
portionScore
)
{
return
}
let
_r
=
[...
rules
]
_r
[
3
].
score
=
v
setRules
(
_r
)
}
}
/>
分,漏选得
<
InputNumber
min=
{
0
}
max=
{
rules
[
3
].
score
<=
0
?
0
:
rules
[
3
].
score
-
1
}
defaultValue=
{
rules
[
3
].
portionScore
}
value=
{
rules
[
3
].
portionScore
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
let
_r
=
[...
rules
]
_r
[
3
].
portionScore
=
v
setRules
(
_r
)
}
}
/>
分
</
span
>
<
span
className=
"total"
>
共
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
multiCount
[
0
]
}
</
span
>
题,合计
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
multiCount
[
1
]
}
</
span
>
分
</
span
>
</
div
>
<
div
className=
"item"
>
<
span
className=
"type"
>
【不定项选择题】
</
span
>
<
span
className=
"score"
>
每题
<
InputNumber
min=
{
1
}
max=
{
100
}
defaultValue=
{
rules
[
1
].
score
}
value=
{
rules
[
1
].
score
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
if
(
v
<=
rules
[
1
].
portionScore
)
{
return
}
let
_r
=
[...
rules
]
_r
[
1
].
score
=
v
setRules
(
_r
)
}
}
/>
分,漏选得
<
InputNumber
min=
{
0
}
max=
{
rules
[
1
].
score
<=
0
?
0
:
rules
[
1
].
score
-
1
}
defaultValue=
{
rules
[
1
].
portionScore
}
value=
{
rules
[
1
].
portionScore
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
let
_r
=
[...
rules
]
_r
[
1
].
portionScore
=
v
setRules
(
_r
)
}
}
/>
分
</
span
>
<
span
className=
"total"
>
共
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
indefiniteCount
[
0
]
}
</
span
>
题,合计
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
indefiniteCount
[
1
]
}
</
span
>
分
</
span
>
</
div
>
<
div
className=
"item"
>
<
span
className=
"type"
>
【判断题】
</
span
>
<
span
className=
"score"
>
每题
<
InputNumber
min=
{
1
}
max=
{
100
}
defaultValue=
{
rules
[
2
].
score
}
value=
{
rules
[
2
].
score
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
let
_r
=
[...
rules
]
_r
[
2
].
score
=
v
setRules
(
_r
)
}
}
/>
分
</
span
>
<
span
className=
"total"
>
共
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
judgeCount
[
0
]
}
</
span
>
题,合计
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
judgeCount
[
1
]
}
</
span
>
分
</
span
>
</
div
>
<
div
className=
"item"
>
<
span
className=
"type"
>
【填空题】
</
span
>
<
span
className=
"score"
>
每题
<
InputNumber
min=
{
1
}
max=
{
100
}
defaultValue=
{
rules
[
0
].
score
}
value=
{
rules
[
0
].
score
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
if
(
v
<=
rules
[
0
].
portionScore
)
{
return
}
let
_r
=
[...
rules
]
_r
[
0
].
score
=
v
setRules
(
_r
)
}
}
/>
分,半对得
<
InputNumber
min=
{
0
}
max=
{
rules
[
0
].
score
<=
0
?
0
:
rules
[
0
].
score
-
1
}
defaultValue=
{
rules
[
0
].
portionScore
}
value=
{
rules
[
0
].
portionScore
}
style=
{
inputNumberStyle
}
formatter=
{
(
value
:
number
|
undefined
)
=>
String
(
value
)
}
parser=
{
(
value
:
string
|
undefined
)
=>
parseInt
(
String
(
value
))
}
onChange=
{
(
v
)
=>
{
v
=
Math
.
round
(
v
)
let
_r
=
[...
rules
]
_r
[
0
].
portionScore
=
v
setRules
(
_r
)
}
}
/>
分
</
span
>
<
span
className=
"total"
>
共
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
gapCount
[
0
]
}
</
span
>
题,合计
<
span
style=
{
{
color
:
"#2966FF"
}
}
>
{
gapCount
[
1
]
}
</
span
>
分
</
span
>
</
div
>
</
div
>
</
Modal
>
)
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment