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; }, };