Files
wace_plm/WebContent/js/tabulator/tabulator_custom.js
chpark da06c4684c Initial commit: WACE PLM with database initialization features
- Add Docker Compose configurations for dev, prod, and standalone environments
- Add database initialization scripts (init-db.sh, init-db-docker.sh)
- Add enhanced start-docker-linux.sh with DB init support
- Add comprehensive database initialization guide
- Support for automatic dbexport.pgsql import on first run
- Include safety checks for production environment
2025-08-29 15:46:08 +09:00

488 lines
15 KiB
JavaScript

/**
* 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) {
// <option value='WG0010' id='' >물류창고</option><option value='WG0020' id='' >공정창고</option>
//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;
};