feat: 현장투수시험 중복 체크 강화
parent
757150db37
commit
c26a7d60fd
|
|
@ -12,6 +12,43 @@ var extFile = "<%=fileCmmn.getFileList("IMG")%>";
|
||||||
var extFileList = extFile.split(",");
|
var extFileList = extFile.split(",");
|
||||||
var selectedSeq = "";
|
var selectedSeq = "";
|
||||||
|
|
||||||
|
//kendoGrid에서 중복된 행을 빨간색으로 흔드는 함수
|
||||||
|
function highlightDuplicateRows(grid, indices) {
|
||||||
|
var trs = grid.tbody.find("tr");
|
||||||
|
for (var i = 0; i < indices.length; i++) {
|
||||||
|
var rowIndex = indices[i];
|
||||||
|
var rowElement = trs[rowIndex];
|
||||||
|
|
||||||
|
// CSS 클래스 추가
|
||||||
|
kendoJQuery(rowElement).addClass("k-row-duplicate-shake");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2초 후 클래스 제거
|
||||||
|
setTimeout(function() {
|
||||||
|
kendoJQuery(".k-row-duplicate-shake").removeClass("k-row-duplicate-shake");
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//중복 강조를 위한 CSS 추가
|
||||||
|
function fn_addHighlightStyles() {
|
||||||
|
var style = document.createElement('style');
|
||||||
|
style.type = 'text/css';
|
||||||
|
style.innerHTML = `
|
||||||
|
@keyframes shake {
|
||||||
|
10%, 90% { transform: translate3d(-1px, 0, 0); }
|
||||||
|
20%, 80% { transform: translate3d(2px, 0, 0); }
|
||||||
|
30%, 50%, 70% { transform: translate3d(-4px, 0, 0); }
|
||||||
|
40%, 60% { transform: translate3d(4px, 0, 0); }
|
||||||
|
}
|
||||||
|
.k-row-duplicate-shake {
|
||||||
|
background-color: #ffcccc !important;
|
||||||
|
animation: shake 0.5s;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
document.head.appendChild(style);
|
||||||
|
}
|
||||||
|
|
||||||
// Grid1 데이터 조회
|
// Grid1 데이터 조회
|
||||||
function selectGrid1() {
|
function selectGrid1() {
|
||||||
|
|
||||||
|
|
@ -298,6 +335,54 @@ function fn_save(rUrl) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------- [수정됨] kictGrid2 시간(sec) 중복 체크 시작 -----------------------
|
||||||
|
var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid");
|
||||||
|
var data2 = grid2.dataSource._data; // data2 변수 재사용
|
||||||
|
|
||||||
|
var seenTimes = {};
|
||||||
|
var duplicateIndices = [];
|
||||||
|
for(var i=0; i<data2.length; i++){
|
||||||
|
var row = data2[i];
|
||||||
|
var timeValue = row.fieldperSubTime; // 시간(sec) 컬럼
|
||||||
|
|
||||||
|
// 빈 값은 중복 체크에서 제외
|
||||||
|
if (timeValue === "" || timeValue === null || timeValue === undefined) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var key = timeValue.toString(); // 키 값으로 사용
|
||||||
|
|
||||||
|
if (seenTimes[key]) {
|
||||||
|
// 중복된 값을 발견하면 인덱스 저장
|
||||||
|
if (seenTimes[key].first) {
|
||||||
|
duplicateIndices.push(seenTimes[key].index);
|
||||||
|
seenTimes[key].first = false;
|
||||||
|
}
|
||||||
|
duplicateIndices.push(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
seenTimes[key] = { index: i, first: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (duplicateIndices.length > 0) {
|
||||||
|
// 중복된 값을 포함하여 알림 메시지 생성
|
||||||
|
var duplicatedValues = "";
|
||||||
|
var uniqueDuplicates = new Set();
|
||||||
|
for (var i = 0; i < duplicateIndices.length; i++) {
|
||||||
|
var row = data2[duplicateIndices[i]];
|
||||||
|
var value = row.fieldperSubTime;
|
||||||
|
uniqueDuplicates.add(value);
|
||||||
|
}
|
||||||
|
duplicatedValues = Array.from(uniqueDuplicates).join(", ");
|
||||||
|
|
||||||
|
alert("시간(sec) 데이터에 중복이 있습니다: " + duplicatedValues + ". 중복을 확인 후 다시 저장해 주십시오.");
|
||||||
|
|
||||||
|
// 중복된 행을 시각적으로 강조
|
||||||
|
highlightDuplicateRows(grid2, duplicateIndices);
|
||||||
|
return false; // 저장 중단
|
||||||
|
}
|
||||||
|
// ----------------------- [수정됨] kictGrid2 시간(sec) 중복 체크 끝 -----------------------
|
||||||
|
|
||||||
|
|
||||||
// ----------------------- kendoGrid XML 구조저장 시작 -----------------------
|
// ----------------------- kendoGrid XML 구조저장 시작 -----------------------
|
||||||
var grid1 = kendoJQuery("#kictGrid1").data("kendoGrid");
|
var grid1 = kendoJQuery("#kictGrid1").data("kendoGrid");
|
||||||
|
|
@ -331,9 +416,9 @@ function fn_save(rUrl) {
|
||||||
];
|
];
|
||||||
if(fn_saveNumberCheckKendo("ROW", dataSource1, grid1, "gridCheck1", 0, rowInfo1, rowInfoItem1) == false)return false;
|
if(fn_saveNumberCheckKendo("ROW", dataSource1, grid1, "gridCheck1", 0, rowInfo1, rowInfoItem1) == false)return false;
|
||||||
|
|
||||||
var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid");
|
// var grid2 = kendoJQuery("#kictGrid2").data("kendoGrid"); // 위에서 이미 선언됨
|
||||||
var dataSource2 = grid2.dataSource;
|
var dataSource2 = grid2.dataSource;
|
||||||
var data2 = dataSource2._data;
|
// var data2 = dataSource2._data; // 위에서 이미 선언됨
|
||||||
|
|
||||||
var kendoRowCount2 = dataSource2._view.length; // 가로(행) 갯수
|
var kendoRowCount2 = dataSource2._view.length; // 가로(행) 갯수
|
||||||
var kendoColCount2 = grid2.columns.length; // 세로(열) 갯수
|
var kendoColCount2 = grid2.columns.length; // 세로(열) 갯수
|
||||||
|
|
@ -758,25 +843,16 @@ function fn_grid_refresh(){
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- 헤더 시작 -->
|
|
||||||
<c:import url="/manage/includeTopInput.do" />
|
<c:import url="/manage/includeTopInput.do" />
|
||||||
<!-- 헤더 끝 -->
|
|
||||||
|
|
||||||
<!-- 페이지 컨테이너 시작 -->
|
|
||||||
<section class="page-container">
|
<section class="page-container">
|
||||||
|
|
||||||
<div class="page-content-wrapper">
|
<div class="page-content-wrapper">
|
||||||
|
|
||||||
<!-- 서브메뉴 시작 -->
|
|
||||||
<c:import url="/include_left_tree_input.do" />
|
<c:import url="/include_left_tree_input.do" />
|
||||||
<!-- 서브메뉴 끝 -->
|
|
||||||
|
|
||||||
<!-- 컨텐츠 시작 -->
|
|
||||||
<div class="page-content">
|
<div class="page-content">
|
||||||
|
|
||||||
<div class="page-content-inner">
|
<div class="page-content-inner">
|
||||||
|
|
||||||
<!-- 카테고리 시작 -->
|
|
||||||
<div class="category-wrapper">
|
<div class="category-wrapper">
|
||||||
<ul class="page-category">
|
<ul class="page-category">
|
||||||
<li class="category-item" id="category_1dep"></li>
|
<li class="category-item" id="category_1dep"></li>
|
||||||
|
|
@ -786,23 +862,16 @@ function fn_grid_refresh(){
|
||||||
<a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a>
|
<a href="javascript:;" class="btn btn-help start-tour" onClick="fn_help_tour_confirm();">도움말</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 카테고리 끝 -->
|
|
||||||
|
|
||||||
<h1 class="page-title-1depth"><span>기본현장시험 정보</span></h1>
|
<h1 class="page-title-1depth"><span>기본현장시험 정보</span></h1>
|
||||||
|
|
||||||
<!-- 내용 시작 -->
|
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
|
||||||
<!-- search start -->
|
|
||||||
<div class="contents">
|
<div class="contents">
|
||||||
|
|
||||||
<!-- 프로젝트 정보 출력 -->
|
|
||||||
<c:import url="/com/includeProjectInfo.do" />
|
<c:import url="/com/includeProjectInfo.do" />
|
||||||
|
|
||||||
<!-- Tab 출력 -->
|
|
||||||
<c:import url="/com/includeTopLabInfo.do" />
|
<c:import url="/com/includeTopLabInfo.do" />
|
||||||
|
|
||||||
<!-- Tab 컨텐츠 출력 -->
|
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
|
|
||||||
<div class="table-top-control">
|
<div class="table-top-control">
|
||||||
|
|
@ -826,6 +895,7 @@ function fn_grid_refresh(){
|
||||||
kendoJQuery(document).ready(function () {
|
kendoJQuery(document).ready(function () {
|
||||||
selectGrid1();
|
selectGrid1();
|
||||||
fn_kendoGrid2(null); // 20201005 ROW 셀렉트시 탭,엔터키 에러 수정
|
fn_kendoGrid2(null); // 20201005 ROW 셀렉트시 탭,엔터키 에러 수정
|
||||||
|
fn_addHighlightStyles(); // [수정됨] 중복 강조 CSS 함수 호출
|
||||||
});
|
});
|
||||||
|
|
||||||
function onDataBound1(e) {
|
function onDataBound1(e) {
|
||||||
|
|
@ -1177,22 +1247,11 @@ function fn_grid_refresh(){
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- search end -->
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- 내용 끝 -->
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- 컨텐츠 끝 -->
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
<!-- 페이지 컨테이너 끝 -->
|
|
||||||
|
|
||||||
<!-- footer 시작 -->
|
|
||||||
<c:import url="/com/includeFooterInput.do"/>
|
<c:import url="/com/includeFooterInput.do"/>
|
||||||
<!-- footer 끝 -->
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -652,8 +652,6 @@ function initApp(param){
|
||||||
"WEB_STEEP_SLOPE",
|
"WEB_STEEP_SLOPE",
|
||||||
O2MAP_URL,
|
O2MAP_URL,
|
||||||
{
|
{
|
||||||
isBaseLayer: false,
|
|
||||||
visibility: false,
|
|
||||||
layers : T_WEB_STEEP_SLOPE,
|
layers : T_WEB_STEEP_SLOPE,
|
||||||
transparent : true,
|
transparent : true,
|
||||||
format : "image/png",
|
format : "image/png",
|
||||||
|
|
@ -661,7 +659,7 @@ function initApp(param){
|
||||||
}, {
|
}, {
|
||||||
singleTile : false,
|
singleTile : false,
|
||||||
isBaseLayer : false,
|
isBaseLayer : false,
|
||||||
visibility: getQueryString("masterCompanyCode") === null ? true : true,
|
visibility: false,
|
||||||
transitionEffect: "resize",
|
transitionEffect: "resize",
|
||||||
buffer : 0,
|
buffer : 0,
|
||||||
removeBackBufferDelay : 0
|
removeBackBufferDelay : 0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue