/** * Tabulator custom js */ $(function(){ fnc_calculateContentHeight("gridDiv"); $(window).resize(function() { fnc_calculateContentHeight("gridDiv"); }); }); var _tabul_layout_fitData = "fitData"; var _tabul_layout_fitDataFill = "fitDataFill"; var _tabul_layout_fitDataTable = "fitDataTable"; var _tabul_layout_fitDataStretch = "fitDataStretch"; //width 전부 넣으면 화면에 맞게 100%참 var _tabul_layout_fitColumns = "fitColumns"; //isNotSearchFirst //생성과 동시에 검색 여부(없으면 검색) (true이어야 최초검색 안함) var _columnCheck = [{ formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:'center', hozAlign:"center", frozen:true, headerSort:false, width:'30' }]; var _columnNo = [{title:'No', frozen:true, headerSort:false, field:'RNUM', headerHozAlign:'center', hozAlign:'center', width:'50' }]; var _columnAppStatus = [{ title:'상태', field:'APPR_STATUS_NAME', headerHozAlign:'center', hozAlign:'center', width:'70', formatter:fnc_createGridApprovalAnchorTag, cellClick:function(e, cell){ var targetStatus = fnc_checkNull(cell.getData().APPR_STATUS).toUpperCase(); if("CREATE" != targetStatus && "REJECT" != targetStatus){ fnc_approvalDetail(cell.getData().APPROVAL_OBJID, cell.getData().ROUTE_OBJID); } } }]; function fnc_tabul_search(layoutParam, gridObj, searchURL, columnParam, showCheck, showNo, p_selectable, p_movableColumns, isNotSearchFirst, formId, hidePaging, showApp, checkValidation, rowSelectionControl) { //alert(document.form1.page.value); //alert($("#form1").serialize()); //grid.setPage(document.form1.page.value); //alert(p_notSelectable + ":" + fnc_checkNullDefaultValue(p_notSelectable, true) + ":" + (p_notSelectable == false ? p_notSelectable : true)); if(gridObj){ //생성이후 search fnc_tabul_searchAjax(gridObj, searchURL, formId, hidePaging, checkValidation); }else{ //최초 생성 //alert('create'); var allColumns = []; if(showCheck) allColumns = allColumns.concat(_columnCheck); if(showNo) allColumns = allColumns.concat(_columnNo); allColumns = allColumns.concat(columnParam); if(showApp) allColumns = allColumns.concat(_columnAppStatus); gridObj = new Tabulator("#mainGrid", { height : "auto",//"640px", layout : fnc_checkNullDefaultValue(layoutParam, _tabul_layout_fitDataStretch), //fitDataFill fitDataStretch //selectable: true, placeholder : "조회된 정보가 없습니다.", //headerBackgroundColor: "red", selectable : (p_selectable == false ? p_selectable : true), movableColumns : (p_movableColumns == false ? p_movableColumns : true), //movableColumns : true, //selectable : true, columns : allColumns //progressiveLoad : "scroll", //progressiveLoadScrollMargin: 50, //ajaxURL : "/projectConcept/searchmettingmgmtGridList.do", //ajaxParams : $("#form1").serializeObject(), /* ajaxURLGenerator:function(url, config, params){ //url - the url from the ajaxURL property or setData function //config - the request config object from the ajaxConfig property //params - the params object from the ajaxParams property, this will also include any pagination, filter and sorting properties based on table setup //return request url return url + "?params=" + encodeURI(JSON.stringify(params)); //encode parameters as a json object }, dataSendParams:{ "page":"pageNo", //change page request parameter to "pageNo" page - the page number being requested size - the number of rows to a page (if paginationSize is set) sorters - the first current sorters(if any) filter - an array of the current filters (if any) } , dataReceiveParams:{ "last_page":"MAX_PAGE_SIZE", //change last_page parameter name to "max_pages" "totalRows":"TOTAL_CNT" } , //pagination:"local", //paginationMode:"remote", //enable remote pagination //pagination:true, //enable pagination paginationSize:10, // 한 페이지에 표시할 행 수 paginationSizeSelector:[10,20,30], // 페이지 크기 선택 옵션 , true(all) paginationCounter:"rows", //rows pages paginationCounter:function(pageSize, currentRow, currentPage, totalRows, totalPages){ return "Showing " + pageSize + " rows of " + totalRows + " total"; }, ,ajaxResponse : function(url, params, response) { //console.log("response:" + response.TOTAL_CNT); $(".tabulator-footer").hide(); //$(".total_count_text").empty(); //$(".total_count_text").append("총 " + response.TOTAL_CNT + "건"); var modResponse = {}; modResponse.data = response.RESULTLIST; //alert(response.MAX_PAGE_SIZE + ":" + response.COUNT_PER_PAGE + ":" + response.COUNT_PER_PAGE + ":"); modResponse.last_page = fnc_checkNull(response.MAX_PAGE_SIZE); modResponse.paginationSize = fnc_checkNull(response.COUNT_PER_PAGE); $(".table_paging_wrap").html(response.PAGE_HTML); return modResponse; } */ }); gridObj.on("tableBuilt", function(){ //tableBuilding $(".tabulator-footer").hide(); //tabulator 페이징 영역 숨김 if(!isNotSearchFirst) //생성과 동시에 검색 fnc_tabul_searchAjax(gridObj, searchURL, formId, hidePaging, checkValidation); }); } return gridObj; } function fnc_tabul_searchAjax(gridObj, searchURL, formId, hidePaging, checkValidation) { if(!$("#"+fnc_checkNullDefaultValue(formId, "form1")) || $("#"+fnc_checkNullDefaultValue(formId, "form1")).length < 1){ alert('check form : '+fnc_checkNullDefaultValue(formId, "form1")); } var formId = fnc_checkNullDefaultValue(formId, "form1"); if(checkValidation && !fnc_validate(formId)){ return; } $.ajax({ url: searchURL, type:"POST", data:$("#"+formId).serializeObject(), dataType:"json", //async:false, beforeSend:function(){ _startLoading("Loading..."); }, complete:function(){ _endLoading(); }, success:function(response){ gridObj.setData(response.RESULTLIST); if(!hidePaging){ $(".table_paging_wrap").html(response.PAGE_HTML); } //gridObj.selectRow(); //gridObj.data = data.RESULTLIST; //console.log(data); }, error: function(jqxhr, status, error){ console.log(jqxhr); console.log(status); console.log(error); } }); } var fnc_customSelectEditor = function(cell, onRendered, success, cancel, editorParams) { var cellRealValue = cell.getElement().dataset.selVal; cellRealValue = (typeof cellRealValue === "undefined") ? "none" : cellRealValue; //Create and append select list var selectList = document.createElement("select"); selectList.style.width = "100%"; selectList.style.boxSizing = "border-box"; onRendered(function() { selectList.focus(); selectList.style.height = "100%"; }); function onChange() { if (selectList.selectedOptions[0].value != cellRealValue) { success(selectList.selectedOptions[0].value); // Store value to cell dataset; will be done by formatter // cell.getElement().dataset.loginName = selectList.selectedOptions[0].value //alert("Here is what the actual looks like: " + JSON.stringify(cell.getTable().getData())) } else { // No change cancel(); } } //submit new value on blur or change selectList.addEventListener("blur", onChange); //submit new value on enter selectList.addEventListener("keydown", function(e) { if (e.keyCode == 13) { onChange(); } if (e.keyCode == 27) { cancel(); } }); if(editorParams.values){ //Create and append the options $.each(editorParams.values, function(i){ //alert('key:' + key + ' / ' + 'value:' + value); var codeId = this[editorParams.valueId]; var codeName = this[editorParams.labelId]; var option = document.createElement("option"); option.value = codeId; option.text = codeName; if (codeId === cellRealValue) { option.selected = "selected"; } selectList.appendChild(option); }); } return selectList; }; function fnc_tabul_addrow(layoutParam, gridObj, isNewObjId, objIdFieldId) { if(gridObj){ //생성이후 search var dataArray = gridObj.getData(); var newData = {}; // 각 데이터에 대해 순회 for (var i = 0; i < dataArray.length; i++) { if (i == dataArray.length-1) { // 마지막일 경우 // 각 데이터의 객체 var dataObj = dataArray[i]; // 객체의 키와 값을 출력 for (var key in dataObj) { var value = dataObj[key]; //console.log("Key: " + key + ", Value: " + value); newData[key] = ""; // 빈값 넣기 } } } if(isNewObjId){ var newObjid = fnc_createObjId(); newData[objIdFieldId] = newObjid; } // Tabulator 객체를 사용하여 행 추가 gridObj.addData([newData]); } return gridObj; } function fnc_tabul_delrow(layoutParam, gridObj, showAlert) { if (gridObj) { // 현재 선택된 행을 가져옴 var selectedRows = gridObj.getSelectedRows(); // 선택된 행이 있는지 확인 if (selectedRows.length > 0) { if(showAlert){ // 선택된 행을 삭제하기 전에 사용자에게 확인 메시지를 보여줌 Swal.fire({ title: '삭제 확인', text: '선택된 항목을 삭제하시겠습니까?', icon: 'question', showCancelButton: true, confirmButtonColor: '#3085d6', cancelButtonColor: '#d33', confirmButtonText: '삭제', cancelButtonText: '취소' }).then(function(result) { if (result.isConfirmed) { // 확인을 클릭한 경우 선택된 행을 삭제 selectedRows.forEach(function(row) { gridObj.deleteRow(row); }); // 선택 해제 gridObj.deselectRow(); // 삭제 완료 메시지 표시 Swal.fire( '삭제 완료!', '선택된 항목이 삭제되었습니다.', 'success' ); } }); }else{ selectedRows.forEach(function(row) { gridObj.deleteRow(row); }); // 선택 해제 gridObj.deselectRow(); } } else { // 선택된 행이 없는 경우 경고 메시지 표시 Swal.fire( '삭제할 항목이 선택되지 않았습니다.', '', 'warning' ); } } return gridObj; } function fnc_customSelectEditorMes(param, codeParam) { // //console.log("param : " + param + "codeParam" + codeParam); var txt = "#"; txt += param; var rawData = $(txt).val(); //console.log("rawData" + rawData); var $options = $(rawData); var resultObject = {}; resultObject[""] = "선택"; $options.each(function() { var value = $(this).val(); var text = $(this).text().trim(); //console.log("value : " + value + " text: " + text); resultObject[text] = text; }); //console.log("resultObject" + resultObject); return resultObject } function fnc_customSelectEditorMesKey(checkKey, currentRowData) { var txt = "#"; txt += checkKey; var rawData = $(txt).val(); var $options = $(rawData); var resultObject = {}; resultObject[""] = "선택"; $options.each(function() { var value = $(this).val(); var text = $(this).text().trim(); resultObject[text] = value; }); var keys = Object.keys(resultObject); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = resultObject[key]; var whGroupCodeValue = currentRowData; //console.log("value: " + value + "Key: " + key + ", currentRow: " + whGroupCodeValue); if (key == whGroupCodeValue) { return value; } } return null; } var fnc_customSelectFormatter = function(cell, formatterParams) { var value = cell.getValue(); if(formatterParams && formatterParams.values){ for (var i = 0; i < formatterParams.values.length; i++) { //if (formatterParams.values[i].CODE_ID === value) { if (formatterParams.values[i][formatterParams.valueId] === value) { // Store value to cell dataset cell.getElement().dataset.selVal = value; //value = _PROBLEM_REVIEW_CODE_LIST[i].CODE_ID; value = formatterParams.values[i][formatterParams.labelId]; break; } } } return value; } function fnc_isValidateColumnData(validType, columName, message, cell, gridObj) { var cnt = 0; var trimmedRowData = ""; if (cell ==="newRowSave") { // 신규형 저장시 유효성 검사 if(gridObj) grid = gridObj; var allRows = grid.getRows(); // 빈 OBJID를 가진 행만 추출 << 신규행 const emptyObjIdRows = allRows.filter(function(row) { return row.getData().OBJID === ""; }); // 추출된 행을 변수에 저장 const emptyObjIdRowsData = emptyObjIdRows.map(function(row) { return row.getData(); }); // 결과 확인 //console.log(emptyObjIdRowsData); for (var j = 0; j < emptyObjIdRowsData.length; j++) { var emptyObjIdWhCode = emptyObjIdRowsData[j][columName]; trimmedRowData = emptyObjIdWhCode.trim(); if (trimmedRowData == null || trimmedRowData === "") { // required 검사 시작 cnt++; } } if (validType == "unique" || validType == "required") { // 유효성 검사 시작 if( cnt >= 1) { // required 빈값 alert(message); return true; } if (validType == "unique") { // PK성 for (var i = 0; i < allRows.length; i++) { var currentWhCode = allRows[i].getData()[columName]; for (var j = 0; j < emptyObjIdRowsData.length; j++) { var emptyObjIdWhCode = emptyObjIdRowsData[j][columName]; if (currentWhCode === emptyObjIdWhCode) { console.log('일치하는 행을 찾았습니다.'); cnt++; } else { console.log('일치하지 않는 행입니다.'); } } if (cnt > 1) { alert(message); return true; // 유효성검사에 적발됨 } } } } } else { // 수정된 row 유효성검사 var currentRowData = cell.getData()[columName]; trimmedRowData = currentRowData.trim(); var values = grid.getData().map(function(row) { return row[columName]; }); if (validType == "unique" || validType == "required") { // 유효성 검사 시작 if (trimmedRowData == null || trimmedRowData === "") { // required 검사 시작 // 유효성검사 실패 alert(message); return true; } if (validType == "unique") { // PK성 for (var i = 0; i < values.length; i++) { //console.log("values: " + values[i] + " currentRowData: " + currentRowData ); var trimmedValue = values[i].trim(); if (trimmedValue === trimmedRowData) { // 유효성 검사 cnt cnt++; } } if (cnt > 1) { // 유효성검사 실패 alert(message); return true; } } } } return false; };