const tb_custom_editor = { pkCode: function (cell, onRendered, success, cancel, editorParams) { let editor = document.createElement("input"); const format = editorParams.format ? editorParams.format : ""; if (cell.getData()._STATUS_ == "I") { editor.setAttribute("type", format); editor.style.width = "100%"; editor.value = cell.getValue() ? cell.getValue() : ""; onRendered(function () { editor.focus(); editor.style.height = "100%"; }); function successFunc() { success(editor.value); // cell.getElement().classList.add("editable-cell") } editor.addEventListener("change", successFunc); editor.addEventListener("blur", successFunc); } else { editor = false; } return editor; }, upper: function(cell, onRendered, success, cancel) { // input 요소 생성 var input = document.createElement("input"); input.setAttribute("type", "text"); input.style.width = "100%"; input.value = cell.getValue() ? cell.getValue() : ""; // 입력값이 변경될 때 대문자로 변환 input.addEventListener("input", function () { this.value = this.value.toUpperCase(); }); // 에디터가 렌더링된 후 실행될 콜백 onRendered(function () { input.focus(); input.style.height = "100%"; input.select(); }); // 값 변경 완료 시 function onChange() { if (input.value != cell.getValue()) { success(input.value); } else { cancel(); } } // 이벤트 리스너 등록 input.addEventListener("blur", onChange); input.addEventListener("keydown", function (e) { if (e.keyCode == 13) { onChange(); // 엔터 키를 누를 때 } if (e.keyCode == 27) { cancel(); // ESC 키를 누를 때 } }); return input; }, onlyNumber: function(cell, onRendered, success, cancel){ // 입력 요소 생성 const input = document.createElement("input"); input.setAttribute("type", "text"); input.style.width = "100%"; input.value = cell.getValue() ? cell.getValue() : ""; onRendered(function(){ input.focus(); input.style.height = "100%"; }); function onChange(){ if(input.value.match(/^\d*$/)){ // 숫자만 허용 success(input.value); }else{ input.value = input.value.replace(/[^0-9]/g, ''); } } input.addEventListener("blur", onChange); input.addEventListener("keydown", function(e){ if(e.keyCode == 13){ onChange(); } if(e.keyCode == 27){ cancel(); } }); return input; }, time: function(cell, onRendered, success, cancel){ // 입력 요소 생성 const input = document.createElement("input"); input.setAttribute("type", "text"); input.style.width = "100%"; input.value = cell.getValue() ? cell.getValue() : ""; onRendered(function(){ input.focus(); input.select(); input.style.height = "100%"; }); // 변경사항이 완료되면 호출될 함수 function onChange(){ if (input.value.length === 5) { // 'HH:mm' 형식 확인 success(input.value); console.log(cell.getValue()) } else { cancel(); } } // 입력 이벤트 처리 input.addEventListener("input", function(){ var value = input.value.replace(/[^0-9]/g, ''); // 숫자만 입력 받음 if (value.length > 2){ value = value.substring(0, 4); // 최대 4자리 input.value = value.replace(/(\d{2})(\d{1})/, '$1:$2'); }; }); input.addEventListener("blur", onChange); input.addEventListener("keydown", function(e){ if(e.keyCode == 13){ onChange(); } if(e.keyCode == 27){ cancel(); } }); return input; }, }; const tb_custom_formatter = { pkCode: function (tgt, params) { if (tgt.getData()._STATUS_ == "I") { tgt.getElement().classList.add("editable-cell"); } else { } return tgt.getValue(); }, time: function(cell, formatterParams, onRendered) { return cell.getValue().padStart(4, '0').replace(/(\d{2})(\d{2})/, '$1:$2'); }, diffTitme: function(cell, formatterParams, onRendered){ let startTime = cell.getRow().getCell("OPER_ST_TM").getValue(); let endTime = cell.getRow().getCell("OPER_ED_TM").getValue(); if (startTime && endTime) { let start = luxon.DateTime.fromFormat(startTime, "HH:mm"); let end = luxon.DateTime.fromFormat(endTime, "HH:mm"); // 날짜가 반전되는 경우를 처리 (예: 밤샘) if (end < start) { end = end.plus({ days: 1 }); } // 시간 차이 계산 let duration = end.diff(start, 'minutes'); return duration.minutes; // 분 단위로 반환 } else { return ""; // Return empty string if either time is missing } } }; const tb_custom_validator = { onlyString: function(cell, value, parameters){ const regex = /^[가-힣A-Za-z\s]+$/; return regex.test(value); }, onlyEnglish: function(cell, value, parameters){ const regex = /^[A-Za-z\s]+$/; return regex.test(value); }, stringNumeric: function(cell, value, parameters){ const regex = /^[가-힣ㄱ-ㅎㅏ-ㅣA-Za-z0-9\/\-\_\s]+$/; return regex.test(value); } } const formFormat = { telInput: function(input){ let formattedNumber = input.value.replace(/[^0-9]/g, ''); // 숫자만 추출 // 자동 포맷팅 로직 구현 예시: "123-456-7890" 형식 if(formattedNumber.length > 10) { formattedNumber = formattedNumber.slice(0, 3) + '-' + formattedNumber.slice(3, 7) + '-' + formattedNumber.slice(7); } else { formattedNumber = formattedNumber.slice(0, 3) + '-' + formattedNumber.slice(3, 6) + '-' + formattedNumber.slice(6); } input.value = formattedNumber; // 포맷팅된 번호를 입력 필드에 다시 설정 }, inNumInput: function(input){ let formattedNumber = input.value.replace(/[^0-9]/g, ''); // 숫자만 추출 // 자동 포맷팅 로직 구현 예시: "123-456-7890" 형식 formattedNumber = formattedNumber.slice(0, 6) + '-' + formattedNumber.slice(6,13); input.value = formattedNumber; // 포맷팅된 번호를 입력 필드에 다시 설정 }, alphanumeric:function(input){ input.value = input.value.toUpperCase().replace(/[^A-Z0-9]/g, ''); }, submitValidate: function(){ let isValid = true; return isValid; } }