570 lines
39 KiB
Plaintext
570 lines
39 KiB
Plaintext
@model NP.Model.VMCM
|
|
@{
|
|
Layout = "~/Views/Shared/_PopupLayout.cshtml";
|
|
var ncc = new NP.Model.CMEXLayer() { };
|
|
var hasccqdiff = Model.ComCodes.Where(w => w.cgroup == "ccdiff").Count() > 0;
|
|
var hascccc1 = Model.ComCodes.Where(w => w.cgroup == "cc1").Count() > 0;
|
|
var hascccc2 = Model.ComCodes.Where(w => w.cgroup == "cc2").Count() > 0;
|
|
var hascccc3 = Model.ComCodes.Where(w => w.cgroup == "cc3").Count() > 0;
|
|
var hascccc4 = Model.ComCodes.Where(w => w.cgroup == "cc4").Count() > 0;
|
|
var hascccc5 = Model.ComCodes.Where(w => w.cgroup == "cc5").Count() > 0;
|
|
var cssqdiff = hasccqdiff ? "" : "qhide";
|
|
var csscc1 = hascccc1 ? "" : "qhide";
|
|
var csscc2 = hascccc2 ? "" : "qhide";
|
|
var csscc3 = hascccc3 ? "" : "qhide";
|
|
var csscc4 = hascccc4 ? "" : "qhide";
|
|
var csscc5 = hascccc5 ? "" : "qhide";
|
|
int tempInt = 0;
|
|
}
|
|
<div class="row">
|
|
<form id="mform" method="post" enctype="multipart/form-data" class="form-horizontal">
|
|
<section class="panel panel-default">
|
|
<header class="panel-heading"><strong><i class="fa fa-bars"></i> 기본정보<span class=""></span></strong></header>
|
|
<div class="panel-body">
|
|
<div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">평가구분</label>
|
|
<div class="col-sm-8 col-md-10">@*@Html.Partial("./Partial/Radio", "0:진행평가;1:최종평가", new ViewDataDictionary { { "special", "stringlist" }, { "name", "CMEX.extype" }, { "checked", Model.CMEX.extype } })*@</div>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "1:최종평가", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.extype" }, { "checked", Model.CMEX.extype } })</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">교육일정 선택</label>
|
|
<div class="col-sm-8 col-md-10">
|
|
<select class="form-control dev" id="cmisno" name="vm.CMEX.cmisno">
|
|
<option>선택</option>
|
|
@foreach (var item in Model.CMInningscds.OrderByDescending(c => c.estart)) {
|
|
tempInt = Model.CMInningscds2.Where(c => c.cmino == item.cmino && c.cmisno == item.cmisno && c.intv1 == 2).Count();
|
|
<option value="@item.cmisno" @(item.cmisno == Model.CMEX.cmisno ? "selected" : "")>[@item.studyplacename] [@item.estart ~ @item.eend]</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">시험 응시 일시</label>
|
|
<div class="col-sm-8 col-md-10 form-inline">
|
|
@Html.Partial("./Partial/Date", string.IsNullOrEmpty(Model.stringval18) ? (DateTime?)null : Convert.ToDateTime(Model.stringval18), new ViewDataDictionary { { "name", "vm.stringval18" } })
|
|
@Html.TextBoxFor(m => m.stringval19, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name="vm.stringval19" }) 시
|
|
@Html.TextBoxFor(m => m.stringval20, new { @class = "form-control text-center onlyNum2", @maxlength ="2", @style = "width:50px;", @Name = "vm.stringval20" }) 분
|
|
~
|
|
@Html.Partial("./Partial/Date", string.IsNullOrEmpty(Model.stringval21) ? (DateTime?)null : Convert.ToDateTime(Model.stringval21), new ViewDataDictionary { { "name", "vm.stringval21" } })
|
|
@Html.TextBoxFor(m => m.stringval22, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name = "vm.stringval22" }) 시
|
|
@Html.TextBoxFor(m => m.stringval23, new { @class = "form-control text-center onlyNum2", @maxlength = "2", @style = "width:50px;", @Name = "vm.stringval23" }) 분
|
|
</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">평가명</label>
|
|
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.exname, new { @class = "form-control", @maxlength = "100", @Name = "vm.CMEX.exname" })</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">평가내용</label>
|
|
<div class="col-sm-8 col-md-10">@Html.TextAreaFor(m => m.CMEX.edesc, new { @class = "form-control", @maxlength = "700", @style = "resize: none; height: 70px;", @Name = "vm.CMEX.edesc" })</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-2 control-label">총점</label>
|
|
<div class="col-sm-10"><span id="spantotal" style="color: red; font-size: 20px;">@Model.CMEX.tpoint</span> 점</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">출석률</label>
|
|
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.econdition, new { @class = "form-control disp-init int nocomma text-center", @maxlength = "3", @style = "width: 80px;", @Name = "vm.CMEX.econdition" }) % 이상</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label req">제한시간</label>
|
|
<div class="col-sm-8 col-md-10">@Html.TextBoxFor(m => m.CMEX.etime, new { @class = "form-control text-center disp-init int nocomma", @style = "width: 80px;", @Name = "vm.CMEX.etime" })분 * 0분 입력 시 시간제한 없음</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
|
|
<label class="col-sm-4 col-md-2 control-label">문항출력설정</label>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Select", null, new ViewDataDictionary { { "special", "FromTo" }, { "name", "vm.CMEX.evtype" }, { "selected", Model.CMEX.evtype }, { "start", 1 }, { "end", 10 }, { "textadd", "개" }, { "df", "0:전체" }, { "disabled", Model.examsavable } }) 출력</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
|
|
<label class="col-sm-4 col-md-2 control-label">출제방식설정</label>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:고정문항(모든 응시자들의 시험지가 동일하며, 문제에 등록된 배점 적용);1:임의문항(모든 응시자들의 시험지가 달라짐)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.eqtype" }, { "checked", Model.CMEX.eqtype }, { "setbr", 1 }, { "disabled", Model.examsavable } })</div>
|
|
</div>
|
|
<div id="examlayerbox" style="@(Model.CMEX.eqtype == 0 ? "display: none;":"")">
|
|
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
|
|
<label class="col-sm-4 col-md-2 control-label req">문제분류 및 배점설정</label>
|
|
<div class="col-sm-8 col-md-10">
|
|
@if (hasccqdiff)
|
|
{
|
|
<label><input type="checkbox" id="chkqdiff" @(Model.CMEXLayers.Where(w => w.qdiff > 0).Count() > 0 ? "checked" : "") /><label for="chkqdiff">@Model.ComGroups.Where(w => w.cgroup == "ccdiff").First().cgroupname</label></label>@:
|
|
}
|
|
@if (hascccc1)
|
|
{
|
|
<label><input type="checkbox" id="chkcc1" @(Model.CMEXLayers.Where(w => w.cc1 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc1">@Model.ComGroups.Where(w => w.cgroup == "cc1").First().cgroupname</label></label>@:
|
|
}
|
|
@if (hascccc2)
|
|
{
|
|
<label><input type="checkbox" id="chkcc2" @(Model.CMEXLayers.Where(w => w.cc2 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc2">@Model.ComGroups.Where(w => w.cgroup == "cc2").First().cgroupname</label></label>@:
|
|
}
|
|
@if (hascccc3)
|
|
{
|
|
<label><input type="checkbox" id="chkcc3" @(Model.CMEXLayers.Where(w => w.cc3 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc3">@Model.ComGroups.Where(w => w.cgroup == "cc3").First().cgroupname</label></label>@:
|
|
}
|
|
@if (hascccc4)
|
|
{
|
|
<label><input type="checkbox" id="chkcc4" @(Model.CMEXLayers.Where(w => w.cc4 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc4">@Model.ComGroups.Where(w => w.cgroup == "cc4").First().cgroupname</label></label>@:
|
|
}
|
|
@if (hascccc5)
|
|
{
|
|
<label><input type="checkbox" id="chkcc5" @(Model.CMEXLayers.Where(w => w.cc5 > 0).Count() > 0 ? "checked" : "") /><label for="chkcc5">@Model.ComGroups.Where(w => w.cgroup == "cc5").First().cgroupname</label></label>@:
|
|
}
|
|
<a href="#" class="btn btn-dark btn-sm" onclick="apply();" style="@(Model.examsavable == "" ? "" : "display: none;")">적용</a>
|
|
<br />
|
|
<div class="col-md-12 resultbox" style="margin-bottom: 10px; margin-top: 10px; padding: 0;">
|
|
<table class="databox" id="layertable">
|
|
<thead>
|
|
<tr>
|
|
<th class="qdiff @(cssqdiff)">@Model.ComGroups.Where(w => w.cgroup == "ccdiff").First().cgroupname</th>
|
|
<th class="cc1 @(csscc1)">@Model.ComGroups.Where(w => w.cgroup == "cc1").First().cgroupname</th>
|
|
<th class="cc2 @(csscc2)">@Model.ComGroups.Where(w => w.cgroup == "cc2").First().cgroupname</th>
|
|
<th class="cc3 @(csscc3)">@Model.ComGroups.Where(w => w.cgroup == "cc3").First().cgroupname</th>
|
|
<th class="cc4 @(csscc4)">@Model.ComGroups.Where(w => w.cgroup == "cc4").First().cgroupname</th>
|
|
<th class="cc5 @(csscc5)">@Model.ComGroups.Where(w => w.cgroup == "cc5").First().cgroupname</th>
|
|
<th>후보문항수</th>
|
|
<th>출제문항수</th>
|
|
<th>문항당배점</th>
|
|
<th>총배점</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var item in Model.CMEXLayers)
|
|
{
|
|
<tr class="data" data-ccode="@string.Format("{0}:{1}:{2}:{3}:{4}:{5}", item.qdiff, item.cc1, item.cc2, item.cc3, item.cc4, item.cc5)">
|
|
<td class="qdiff @(cssqdiff)" data-ccode="@(item.qdiff)">@(item.qdiffname)</td>
|
|
<td class="cc1 @(csscc1)" data-ccode="@(item.cc1)">@(item.ccname1 ?? "")</td>
|
|
<td class="cc2 @(csscc2)" data-ccode="@(item.cc2)">@(item.ccname2 ?? "")</td>
|
|
<td class="cc3 @(csscc3)" data-ccode="@(item.cc3)">@(item.ccname3 ?? "")</td>
|
|
<td class="cc4 @(csscc4)" data-ccode="@(item.cc4)">@(item.ccname4 ?? "")</td>
|
|
<td class="cc5 @(csscc5)" data-ccode="@(item.cc5)">@(item.ccname5 ?? "")</td>
|
|
<td class="poolcount text-center">0</td>
|
|
<td class="qcount text-center"><input type="text" class="text-center int" value="@item.qcount" style="width: 90%;" /></td>
|
|
<td class="rpoint text-center"><input type="text" class="text-center int" value="@item.rpoint" style="width: 90%;" /></td>
|
|
<td class="trpoint text-center">@item.trpoint</td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
|
|
<label class="col-sm-4 col-md-2 control-label">문제/보기섞기</label>
|
|
<div class="col-sm-8 col-md-10">
|
|
@Html.HiddenFor(m => m.CMEX.israndq, new { @Name = "vm.CMEX.israndq" })<label><input type="checkbox" id="chkrq" @(Model.CMEX.israndq == 1 ? "checked" : "") @(Model.examsavable == "" ? "" : "disabled") /><label for="chkrq">문제섞기</label></label>
|
|
@Html.HiddenFor(m => m.CMEX.israndqi, new { @Name = "vm.CMEX.israndqi" })<label><input type="checkbox" id="chkrqi" @(Model.CMEX.israndqi == 1 ? "checked" : "") @(Model.examsavable == "" ? "" : "disabled") /><label for="chkrqi">보기섞기</label></label>
|
|
</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">순차응시여부</label>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:자유응시 ;1:순차응시(다음문제로 이동 시 이전 문제를 볼 수 없습니다.)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isseq" }, { "checked", Model.CMEX.isseq } })<span style="color: red;"></span></div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">시험창이탈허용</label>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "0:허용 ;1:비허용(시험창 이탈시 강제종료)", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isblur" }, { "checked", Model.CMEX.isblur } })<span style="color: red;">※비허용 시 시험창을 벗어나지 않도록 응시자들에게 공지해주세요.</span></div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">임시저장허용</label>
|
|
<div class="col-sm-8 col-md-10">@Html.Partial("./Partial/Radio", "1:예;0:아니오", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isusebackup" }, { "checked", Model.CMEX.isusebackup } }) (응시자가 시험응시화면에서 선택한 답안을 제출 전 저장하는 기능입니다. 동시응시인원이 많을 경우 시험응시사이트가 느려질 수 있습니다.)</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in @(Model.examsavable)"></div><div class="form-group @(Model.examsavable)">
|
|
<label class="col-sm-4 col-md-2 control-label">이어보기설정</label>
|
|
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", ":무제한;1:1회;2:2회;0:미허용", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.relaylimit" }, { "checked", Model.CMEX.relaylimit }, { "disabled", Model.examsavable } }) (시험응시화면이 닫혔을 경우, 제한시간 내 다시 응시할 수 있는 기준을 설정)</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">재응시허용</label>
|
|
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", "1:예;0:아니오", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isreexamable" }, { "checked", Model.CMEX.exno < 1 ? 1 : Model.CMEX.isreexamable } })</div>
|
|
</div>
|
|
<div class="line line-dashed line-lg pull-in"></div><div class="form-group">
|
|
<label class="col-sm-4 col-md-2 control-label">시험결과공개</label>
|
|
<div class="col-sm-8 col-md-10" @Html.Partial("./Partial/Radio", "0:비공개;1:공개", new ViewDataDictionary { { "special", "stringlist" }, { "name", "vm.CMEX.isresultopen" }, { "checked", Model.CMEX.isresultopen } })</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="panel panel-default">
|
|
<header class="panel-heading"><strong><i class="fa fa-bars"></i> 문제정보<span class=""></span></strong></header>
|
|
<div class="col-md-12 resultbox" style="margin-bottom: 70px; padding: 0">
|
|
<table class="databox" id="box1" style="overflow-y:scroll;">
|
|
<colgroup>
|
|
<col style="width: 50px;" />
|
|
<col style="width: 70px;" />
|
|
<col style="width: 250px;" />
|
|
<col />
|
|
<col style="width: 80px;" />
|
|
<col style="width: 80px;" />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th><input type="checkbox" onclick="javascript: checkall('box1', this);" /></th>
|
|
<th>문제유형</th>
|
|
<th>분류</th>
|
|
<th>문제</th>
|
|
<th>문제순서</th>
|
|
<th>점수</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var item in Model.CMEXQs)
|
|
{
|
|
<tr class="data center" data-eqno="@(item.eqno)" data-ccode="@item.eqtypes">
|
|
<td class="autocheck"><input type="checkbox" class="autocheck qno" value="@item.qno" /></td>
|
|
<td class="atname">@item.atypename</td>
|
|
<td class="qtypes">@item.eqtypenames</td>
|
|
<td class="qts text-left link"><div style="max-height: 30px;"><a href="#" class="link" onclick="viewquestion(@item.qno)">@item.qtextstring</a></div></td>
|
|
<td class="qseq"><input type="text" class="int text-center" value="@item.qseq" style="width: 90%;" /></td>
|
|
<td class="point"><input @(Model.examsavable == "_hide" ? "readOnly=\"readOnly\"" : "") type="text" class="int text-center readnot@(Model.examsavable) eqtypes eqtype@(Model.CMEX.eqtype)" value="@item.rpoint" data-dpoint="@item.rpoint" style="width: 90%;" /></td>
|
|
</tr>
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
<div class="botfixempty"><br /><br /><br /><br /></div>
|
|
<div class="botfix islayer" style="left:0px; margin-left:0px;">
|
|
<div class="col-sm-6 text-left" style="@(Model.examsavable == "" ? "":"display: none;")">
|
|
<a href="#" class="btn btn-facebook" onclick="qadd();">문제추가</a>
|
|
<a href="#" class="btn btn-danger" onclick="qdel();">선택문제삭제</a>
|
|
</div>
|
|
<div class="col-sm-6 text-right">
|
|
<a href="#" class="btn btn-primary" onclick="save();">저장</a>
|
|
@if (Model.CMEX.exno > 0)
|
|
{
|
|
<a href="#" class="btn btn-danger" onclick="del();">삭제</a>
|
|
}
|
|
<a href="#" class="btn btn-default" onclick="goparent(val('IsSavedForParent') == '1');">닫기</a>
|
|
</div>
|
|
</div>
|
|
<input type="hidden" name="vm.CMEX.exno" id="datakey" value="@Model.CMEX.exno" />
|
|
@Html.HiddenFor(m => m.CMEX.cmno, new { @Name = "vm.CMEX.cmno" })
|
|
@Html.HiddenFor(m => m.cmno, new { @Name = "vm.cmno" })
|
|
@Html.HiddenFor(m=>m.IsSavedForParent)
|
|
<input type="hidden" name="vm.savedata" id="sdata" />
|
|
<input type="hidden" name="vm.savedata2" id="sdata2" />
|
|
@Html.Partial("./Partial/DForm", Model)
|
|
</form>
|
|
</div>
|
|
@section styles{
|
|
<style type="text/css">
|
|
td.qhide, th.qhide{display: none;}
|
|
td input.int{background-color: #fce97f; border: 0 none;}
|
|
td input.int:read-only{background-color: #ddd;}
|
|
div.pull-in._hide, div.form-group._hide {
|
|
background-color: #ddd; margin-bottom: 0;
|
|
}
|
|
div.pull-in._hide {
|
|
margin: 0;
|
|
}
|
|
.form-horizontal .form-group._hide{margin-right: 0 !important; margin-left: 0 !important;}
|
|
#layertable td, #box1 td{padding: 2px 4px;}
|
|
#findlayerframe {
|
|
bottom: 5%;
|
|
top:5%;
|
|
position: fixed;
|
|
left: 0;
|
|
right: 0;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
border-radius: 5px;
|
|
z-index: 2000;
|
|
padding: 10px;
|
|
font-size: 12px;
|
|
width: 100%;
|
|
height: 90%;
|
|
max-height: 100%;
|
|
max-width: 100%;
|
|
margin: 0 auto;
|
|
overflow-x:scroll;
|
|
}
|
|
</style>
|
|
}
|
|
@section scriptsHeader{
|
|
@Html.Partial("./Partial/ScriptDate")
|
|
<script src="/js/underscore-min.js"></script>
|
|
}
|
|
@section scripts{
|
|
<script>
|
|
var qdiff = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "ccdiff").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cc1 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc1").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cc2 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc2").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cc3 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc3").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cc4 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc4").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cc5 = "@(string.Join(";", Model.ComCodes.Where(w => w.cgroup == "cc5").Select(s => s.ccode.ToString() + ":" + s.cname)))";
|
|
var cssqdiff = '@(cssqdiff)';
|
|
var csscc1 = '@(csscc1)';
|
|
var csscc2 = '@(csscc2)';
|
|
var csscc3 = '@(csscc3)';
|
|
var csscc4 = '@(csscc4)';
|
|
var csscc5 = '@(csscc5)';
|
|
$(document).ready(function () {
|
|
$("input[name='vm.CMEX.eqtype']").on("change", function () {
|
|
setDND(true);
|
|
});
|
|
$("#layertable").on("change", "input.int", function (e) {
|
|
setDND();
|
|
});
|
|
$("input._hide").prop("readonly", true);
|
|
setDND(false);
|
|
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
|
|
setqlayer()
|
|
}
|
|
$("table#box1").on("change", "input.int.eqtypes", function () {
|
|
var tot = 0;
|
|
$.each($("#box1 tbody tr.data"), function (i, r) {
|
|
tot += getint($(r).find("td.point input").val());
|
|
});
|
|
$("#spantotal").text(tot);
|
|
})
|
|
focus("CMEX_exname");
|
|
|
|
$(document).on("keyup", ".onlyNum2", function () {
|
|
// 숫자만 남기기
|
|
this.value = this.value.replace(/\D/g, '');
|
|
// 두 자리까지만 허용
|
|
if (this.value.length > 2) {
|
|
this.value = this.value.slice(0, 2);
|
|
}
|
|
// 범위 체크 (00~59)
|
|
if (this.value != "") {
|
|
let num = parseInt(this.value, 10);
|
|
if (num > 59) {
|
|
this.value = "59"; // 최대값으로 보정
|
|
}
|
|
}
|
|
});
|
|
});
|
|
function cartesianProductOf() {
|
|
return _.reduce(arguments, function (a, b) {
|
|
return _.flatten(_.map(a, function (x) {
|
|
return _.map(b, function (y) {
|
|
return x.concat([y]);
|
|
});
|
|
}), true);
|
|
}, [[]]);
|
|
}
|
|
function apply() {
|
|
$("#layertable tbody tr.data").remove();
|
|
if ($("#chkqdiff:checked").length < 1) {
|
|
msg("최소 1개 이상의 문제분류를 설정해주셔야 합니다.<br />문제분류 등록/수정은 코드관리에서 가능합니다.");
|
|
}
|
|
var layers = cartesianProductOf(cssqdiff != "qhide" && $("#chkqdiff:checked").length > 0 ? qdiff.split(';') : ["0:"],
|
|
csscc1 != "qhide" && $("#chkcc1:checked").length > 0 && cc1 != "" ? cc1.split(';') : ["0:"],
|
|
csscc2 != "qhide" && $("#chkcc2:checked").length > 0 && cc2 != "" ? cc2.split(';') : ["0:"],
|
|
csscc3 != "qhide" && $("#chkcc3:checked").length > 0 && cc3 != "" ? cc3.split(';') : ["0:"],
|
|
csscc4 != "qhide" && $("#chkcc4:checked").length > 0 && cc4 != "" ? cc4.split(';') : ["0:"],
|
|
csscc5 != "qhide" && $("#chkcc5:checked").length > 0 && cc5 != "" ? cc5.split(';') : ["0:"]);
|
|
if (layers.length > 0 && layers[0].toString() != "0:,0:,0:,0:,0:,0:") {
|
|
$.each(layers, function (i, a) {
|
|
$("#layertable tbody").append("<tr class=\"data\" data-ccode=\"" + a[0].split(':')[0] + ":" + a[1].split(':')[0] + ":" + a[2].split(':')[0] + ":" + a[3].split(':')[0] + ":" + a[4].split(':')[0] + ":" + a[5].split(':')[0] + "\"><td class=\"qdiff " + cssqdiff + "\" data-ccode=\"" + a[0].split(':')[0] + "\">" + a[0].split(':')[1] + "</td><td class=\"cc1 " + csscc1 + "\" data-ccode=\"" + a[1].split(':')[0] + "\">" + a[1].split(':')[1] + "</td><td class=\"cc2 " + csscc2 + "\" data-ccode=\"" + a[2].split(':')[0] + "\">" + a[2].split(':')[1] + "</td><td class=\"cc3 " + csscc3 + "\" data-ccode=\"" + a[3].split(':')[0] + "\">" + a[3].split(':')[1] + "</td><td class=\"cc4 " + csscc4 + "\" data-ccode=\"" + a[4].split(':')[0] + "\">" + a[4].split(':')[1] + "</td><td class=\"cc5 " + csscc5 + "\" data-ccode=\"" + a[5].split(':')[0] + "\">" + a[5].split(':')[1] + "</td><td class=\"poolcount text-center\">0</td><td class=\"qcount text-center\"><input type=\"text\" class=\"text-center int\" value=\"0\" style=\"width: 90%;\" /></td><td class=\"rpoint text-center\"><input type=\"text\" class=\"text-center int\" value=\"0\" style=\"width: 90%;\" /></td><td class=\"trpoint text-center\">0</td></tr>");
|
|
});
|
|
}
|
|
setqlayer();
|
|
setDND(false);
|
|
}
|
|
function selectquestion(jsons) {
|
|
var idx = $("#box1 tr.data").length + 1;
|
|
var eqtype = getrv("CMEX.eqtype");
|
|
$.each(jsons, function (i, r) {
|
|
if ($("#box1 tr.data td input.autocheck[value='" + r.qno + "']").length < 1) {
|
|
$("#box1 tbody").append("<tr class=\"data center\" data-eqno=\"0\" data-ccode=\"" + r.qdiff + ":" + r.cc1 + ":" + r.cc2 + ":" + r.cc3 + ":" + r.cc4 + ":" + r.cc5 + "\">"
|
|
+ "<td class=\"autocheck\"><input type=\"checkbox\" class=\"autocheck qno\" value=\"" + r.qno + "\" /></td>"
|
|
+ "<td class=\"atname\">" + r.atypename + "</td>"
|
|
+ "<td class=\"qtypes\">" + r.qdiffname + ":" + r.ccname1 + ":" + r.ccname2 + ":" + r.ccname3 + ":" + r.ccname4 + ":" + r.ccname5 + "</td>"
|
|
+ "<td class=\"qts link\"><div style=\"max-height: 30px;\"><a href=\"#\" class=\"link\" onclick=\"viewquestion(" + r.qno + ")\">" + r.qtextstring + "</a></div></td>"
|
|
+ "<td class=\"qseq\"><input type=\"text\" class=\"int text-center\" value=\"" + (idx++) + "\" style=\"width: 90%;\" /></td>"
|
|
+ "<td class=\"point\"><input type=\"text\" class=\"int text-center readnot@(Model.examsavable) eqtypes eqtype" + eqtype+ "\" value=\"" + r.dpoint + "\" data-dpoint=\"" + r.dpoint + "\" style=\"width: 90%;\" /></td></tr>");
|
|
}
|
|
});
|
|
setDND(false);
|
|
}
|
|
function setqlayer(){
|
|
$("#layertable th, #layertable td").show();
|
|
$("#layertable th.qhide").hide();
|
|
if ($("#chkqdiff").length < 1 || !$("#chkqdiff").prop("checked")) { $("#layertable th.qdiff, #layertable td.qdiff").hide(); }
|
|
if ($("#chkcc1").length < 1 || !$("#chkcc1").prop("checked")) { $("#layertable th.cc1, #layertable td.cc1").hide(); }
|
|
if ($("#chkcc2").length < 1 || !$("#chkcc2").prop("checked")) { $("#layertable th.cc2, #layertable td.cc2").hide(); }
|
|
if ($("#chkcc3").length < 1 || !$("#chkcc3").prop("checked")) { $("#layertable th.cc3, #layertable td.cc3").hide(); }
|
|
if ($("#chkcc4").length < 1 || !$("#chkcc4").prop("checked")) { $("#layertable th.cc4, #layertable td.cc4").hide(); }
|
|
if ($("#chkcc5").length < 1 || !$("#chkcc5").prop("checked")) { $("#layertable th.cc5, #layertable td.cc5").hide(); }
|
|
}
|
|
function setDND(setorgpoint) {
|
|
$("#examlayerbox").hide();
|
|
var tot = 0;
|
|
if ($("#vm_CMEX_eqtype0").prop("checked")) {
|
|
$("#box1 tr.data td.point input.readnot").prop("readonly", false);
|
|
if (setorgpoint && $("#box1 tbody tr.data").length > 0) {
|
|
msg("하단 문항들의 점수를 문제은행 기본점수 또는 최종저장된 점수로 변경합니다.");
|
|
$.each($("#box1 tbody tr.data"), function (i, r) {
|
|
$(r).find("td.point input").val($(r).find("td.point input").attr("data-dpoint"));
|
|
tot += getint($(r).find("td.point input").attr("data-dpoint"));
|
|
});
|
|
}
|
|
else if ($("#box1 tbody tr.data").length > 0) {
|
|
$.each($("#box1 tbody tr.data"), function (i, r) {
|
|
tot += getint($(r).find("td.point input").attr("data-dpoint"));
|
|
});
|
|
}
|
|
} else {
|
|
$("#box1 tr.data td.point input").prop("readonly", true);
|
|
//배점설정 및 후보문항수 총배점 계산 및 문제점수 설정
|
|
//일단 0점으로
|
|
$("#box1 tbody tr.data td.point input.int").val(0);
|
|
$.each($("#layertable tbody tr.data"), function (i, r) {
|
|
var ccodes = $(r).attr("data-ccode").split(':');
|
|
var _point = $(r).find("td.rpoint input.int").val();
|
|
var qcnt = 0;
|
|
|
|
//$.each($("#box1 tbody tr.data[data-ccode='" + ccodes + "']"), function (i, r2) {
|
|
// qcnt++;
|
|
// $(r2).find("td.point input.int").val(_point);
|
|
//});
|
|
$.each($("#box1 tbody tr.data"), function (i, r2) {
|
|
var ccodes2 = $(r2).attr("data-ccode").split(':');
|
|
if ((ccodes[0] == "0" || ccodes[0] == ccodes2[0]) &&
|
|
(ccodes[1] == "0" || ccodes[1] == ccodes2[1]) &&
|
|
(ccodes[2] == "0" || ccodes[2] == ccodes2[2]) &&
|
|
(ccodes[3] == "0" || ccodes[3] == ccodes2[3]) &&
|
|
(ccodes[4] == "0" || ccodes[4] == ccodes2[4]) &&
|
|
(ccodes[5] == "0" || ccodes[5] == ccodes2[5])) {
|
|
qcnt++;
|
|
$(r2).find("td.point input.int").val(_point);
|
|
}
|
|
});
|
|
$(r).find("td.poolcount").text(qcnt);
|
|
$(r).find("td.trpoint").text(getint($(r).find("td.qcount input.int").val()) * getint(_point));
|
|
tot += getint($(r).find("td.qcount input.int").val()) * getint(_point);
|
|
});
|
|
$("#examlayerbox").show();
|
|
}
|
|
$("#spantotal").text(tot);
|
|
}
|
|
function save() {
|
|
var _isvalid = true;
|
|
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
|
|
//문항 점검
|
|
$.each($("#layertable tbody tr.data"), function (i, r) {
|
|
if (getint($(r).find("td.poolcount").text()) < getint($(r).find("td.qcount input.int").val())) {
|
|
msg((i + 1) + "번째 문제분류의 출제문항수가 충족되지 않습니다. 해당 문제를 추가해주세요.");
|
|
_isvalid = false; return false;
|
|
}
|
|
else if (getint($(r).find("td.qcount input.int").val()) > 0 && getint($(r).find("td.rpoint input.int").val()) < 1) {
|
|
msg((i + 1) + "번째 문제분류의 배점을 입력해주세요.");
|
|
_isvalid = false; return false;
|
|
}
|
|
});
|
|
}
|
|
if (_isvalid) {
|
|
var _layerqcount = 0;
|
|
if ($("#vm_CMEX_eqtype1").prop("checked")) {
|
|
$.each($("#layertable tbody tr td.qcount input.int"), function (i, c) {
|
|
_layerqcount += getint($(c).val());
|
|
if (_layerqcount > 0) {
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
if (check("CMEX_exname", "", "시험명칭을 입력하세요.")) { }
|
|
else if ($("#vm_CMEX_eqtype0").prop("checked") && $("#box1 tbody tr").length < 1) { msg("출제할 문제를 추가해주세요."); }
|
|
else if ($("#vm_CMEX_eqtype1").prop("checked") && _layerqcount < 1) { msg("출제문항수를 입력해주세요."); }
|
|
else if (getDouble(val("CMEX_econdition")) > 100 || getDouble(val("CMEX_econdition")) < 0) { msg("출석률은 0 ~ 100 사이의 값을 입력해주세요."); }
|
|
else if (_isvalid && confirm("시험을 " + (getint(val("CMEX_exno")) < 1 ? "등록" : "수정") + "하시겠습니까?")) {
|
|
$("#CMEX_israndq").val($("#chkrq").prop("checked") ? 1 : 0);
|
|
$("#CMEX_israndqi").val($("#chkrqi").prop("checked") ? 1 : 0);
|
|
var sd = "";
|
|
if (!$("#vm_CMEX_eqtype0").prop("checked")) {
|
|
$.each($("#layertable tbody tr.data"), function (i, r) {
|
|
//코드6, qcount, rpoint
|
|
sd += ";" + $(r).attr("data-ccode") + ":" + $(r).find("td.qcount input.int").val() + ":" + $(r).find("td.rpoint input.int").val();
|
|
});
|
|
}
|
|
$("#sdata").val(sd.length > 0 ? sd.substr(1) : sd);
|
|
sd = "";
|
|
$.each($("#box1 tbody tr.data"), function (i, r) {
|
|
sd += ";" + $(r).attr("data-eqno") + ":" + $(r).find("td.qseq input.int").val() + ":" + $(r).find("td.autocheck input.qno").val() + ":" + $(r).find("td.point input.int").val();
|
|
});
|
|
$("#sdata2").val(sd.length > 0 ? sd.substr(1) : sd);
|
|
cap("/acommon/cmexsave2025", "mform", "cbsave");
|
|
}
|
|
}
|
|
}
|
|
var pqlist = "";
|
|
function qadd() {
|
|
framelayer("/cm/qp?stringval13=R");
|
|
}
|
|
function calcplist() {
|
|
pqlist = "";
|
|
$.each($("#box1 tbody tr.data input.autocheck.qno"), function (i, c) {
|
|
pqlist += "," + $(c).val();
|
|
});
|
|
}
|
|
function qdel() {
|
|
if ($("#box1 tr.data td input.autocheck.qno:checked").length < 1) {
|
|
msg("삭제할 문제를 선택하세요.");
|
|
}
|
|
else {
|
|
var eqnos = "";
|
|
for (var i = $("#box1 tr.data").length - 1; i >= 0; i--) {
|
|
var r = $("#box1 tr.data:eq(" + i + ")");
|
|
if ($(r).find("td.autocheck input.autocheck.qno:checked").length > 0) {
|
|
$(r).remove();
|
|
}
|
|
}
|
|
setDND(false);
|
|
msg("저장해야 반영됩니다.");
|
|
}
|
|
}
|
|
function cbdeleq() {
|
|
if (capOK) {
|
|
for (var i = $("#box1 tr.data").length - 1; i >= 0; i--) {
|
|
var r = $("#box1 tr.data:eq(" + i + ")");
|
|
if ($(r).find("td.autocheck input.autocheck.qno:checked").length > 0) {
|
|
$(r).remove();
|
|
}
|
|
}
|
|
setDND(false);
|
|
}
|
|
else {
|
|
msg("이미 응시가 시작된 문제는 삭제할 수 없습니다.");
|
|
}
|
|
}
|
|
function cbsave() {
|
|
if (capOK) {
|
|
if ('@(Model.CMEX.exno)' == '0') {
|
|
$("#intval").val(capResult.obj);
|
|
}
|
|
setv("IsSavedForParent", 1);
|
|
//timesubmit();
|
|
}
|
|
else if (capResult.obj == -1) {
|
|
msg("이미 최종평가가 등록되어 있습니다.");
|
|
}
|
|
else {
|
|
msg("시험등록 중 올바르지 않는 데이터로 반영되지 않았습니다. 시스템관리자에게 문의해주세요.");
|
|
}
|
|
}
|
|
var _qno;
|
|
var _dtype = 2;
|
|
function viewquestion(qno) {
|
|
_qno = qno;
|
|
capp("/acommon/setauthkey", { dtype: _dtype, intval: _qno }, "cbauth");
|
|
}
|
|
function cbauth() {
|
|
if (capResult.code == 1000) {
|
|
var pop = window.open("@(ViewBag.fronturl)/Open/ViewQuestion?authtype=" + _dtype +"&authkey=" + capResult.obj + "&qno=" + _qno, 'viewquestion', 'width=' + (screen.width - 200) + ', height=' + (screen.height - 200));
|
|
if (pop == null) {
|
|
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
|
|
}
|
|
}
|
|
}
|
|
function del() {
|
|
if (confirm("삭제하시겠습니까?")) {
|
|
capp("/acommon/estdel", { extype: getint(val("cmex.extype")) + 1, no: @Model.CMEX.exno }, "cbdel");
|
|
}
|
|
}
|
|
function cbdel() {
|
|
if (capResult.code == 1000) {
|
|
msg("삭제했습니다.", null, true, null, true);
|
|
goparent(true);
|
|
} else {
|
|
msg("수강데이터가 생성되어 삭제할 수 없습니다.");
|
|
}
|
|
}
|
|
</script>
|
|
} |