G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현 G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건) G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST) G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직 G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트 G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트 G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트 G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트 G-10: core/push_notify.py + routers/push.py + PushSubscription 모델 G-11: approvals 다중승인 (위임/서명/기한초과/마감연장) G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh 하네스: guardia-orchestrator 확장기능 Phase 반영 봇명령어: /sr /status /license /bulk 슬래시 명령어 추가 설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
148 lines
4.6 KiB
JavaScript
148 lines
4.6 KiB
JavaScript
/*------------------------------------------------------------------------------
|
|
* 1. 파일명: valid.form.js
|
|
* 2. 설 명: Form 요소 처리와 관련된 함수를 정의한다.
|
|
* 3. 의존성: valid.base.js, valid.number.js,
|
|
* valid.date.js, valid.biz.js
|
|
* 4. 작성자:
|
|
* 5. 작성일: 2006.10.11.
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
/**
|
|
* Input 객체의 값이 Select 객체의 value 항목에 있는 값인지
|
|
* 검사하여 있으면 true를 돌려 주고, 없으면 오류 메세지를 보여주고
|
|
* Focus를 inputObj에 준 다음 false를 돌려 준다.
|
|
* 단 Input 객체의 값이 없으면 그냥 통과한다.
|
|
*/
|
|
function validateExistsInSelect(inputObj, selectObj) {
|
|
inputObj = ref(inputObj ); // ID일 경우를 대비해서
|
|
selectObj = ref(selectObj); // ID일 경우를 대비해서
|
|
|
|
if ( isEmptyObj(inputObj) ) {
|
|
if ( event ) event.returnValue = true;
|
|
return true;
|
|
}
|
|
|
|
var valid = true;
|
|
|
|
/* Select 항목에 Input 항목의 값이 있는지 검사한다. */
|
|
if ( indexOfSelect(selectObj, inputObj.value) == -1 ) {
|
|
showMessage(inputObj.value + " 값은 선택할 목록 중에 없는 값입니다. 확인해 주십시오.");
|
|
inputObj.focus();
|
|
inputObj.select();
|
|
|
|
valid = false;
|
|
}
|
|
|
|
if ( event ) event.returnValue = valid;
|
|
return valid;
|
|
}
|
|
|
|
|
|
/**
|
|
* 주어진 Form 요소에 대한 유효성을 검증한다.
|
|
*/
|
|
function validateForm(form) {
|
|
var elemArr = form.elements;
|
|
|
|
/* 요소 수만큼 돌면서 각 요소들을 검증한다. */
|
|
for ( var i = 0; i < elemArr.length; i++ ) {
|
|
var elem = elemArr[i];
|
|
|
|
/* 요소가 disabled, readonly, type이 hidden 인 경우는 유효성 검증에서 제외한다. */
|
|
if ( elem.disabled || elem.readOnly || elem.type == "hidden" ) continue;
|
|
|
|
/* 점검 요소 값들을 가져온다. */
|
|
var fieldName = elem.getAttribute("valid.label"); // 점검항목명. 없으면 name 값 사용.
|
|
if ( isEmpty(fieldName) ) fieldName = elem.getAttribute("name");
|
|
|
|
|
|
/* 필수 여부 점검 항목이면 점검한다. */
|
|
var required = isEmpty(elem.getAttribute("valid.required")) ?
|
|
false :
|
|
elem.getAttribute("valid.required").toUpperCase() == "TRUE"; // 필수항목 점검 여부
|
|
if ( required && ! validateMandatoryObj(elem, fieldName) ) return false;
|
|
|
|
|
|
/* 자료형 값이 있으면 자료형에 대해 유효성을 검증한다. */
|
|
var dataType = elem.getAttribute("valid.type"); // 자료형. 없으면 null.
|
|
if ( ! isEmpty(dataType) && ! validateDataType(elem, fieldName, dataType) ) return false;
|
|
|
|
|
|
/* 길이에 대한 값이 있으면 유효성을 검증한다. 일단 주어진 길이 이하 byte인지만 검사. */
|
|
var validLength = elem.getAttribute("valid.length");
|
|
if ( ! isEmpty(validLength) && ! validateLengthLEObj(elem, validLength, fieldName) ) return false;
|
|
|
|
|
|
/* 수치의 자릿수에 대한 값이 있으면 유효성을 검증한다. */
|
|
var figure = elem.getAttribute("valid.figure");
|
|
if ( ! isEmpty(figure) ) {
|
|
var figureArr = figure.split(",");
|
|
|
|
if ( ! validateNoFigureLEObj(
|
|
elem,
|
|
fieldName,
|
|
parseInt(figureArr[0], 10),
|
|
parseInt(figureArr[1], 10)
|
|
) ) return false;
|
|
}
|
|
|
|
|
|
/* 최소값이 있으면 유효성을 검증한다. */
|
|
var minValue = elem.getAttribute("valid.min");
|
|
if ( ! isEmpty(minValue) && ! validateNoGEObj(elem, fieldName, minValue) ) return false;
|
|
|
|
|
|
/* 최대값이 있으면 유효성을 검증한다. */
|
|
var maxValue = elem.getAttribute("valid.max");
|
|
if ( ! isEmpty(maxValue) && ! validateNoLEObj(elem, fieldName, maxValue) ) return false;
|
|
|
|
|
|
/* 기타 유효성 검증 함수가 있으면 호출한다. */
|
|
var validFunc = elem.getAttribute("valid.func");
|
|
if ( ! isEmpty(validFunc) && ! eval(validFunc).call(this, elem, fieldName) ) return false;
|
|
}
|
|
|
|
/* 여기까지 왔으면 이상 없음. */
|
|
return true;
|
|
}
|
|
|
|
|
|
/* 자료형에 대한 유효성을 검증한다. */
|
|
function validateDataType(elem, fieldName, dataType) {
|
|
dataType = dataType.toLowerCase();
|
|
|
|
var valid = true;
|
|
|
|
switch ( dataType ) {
|
|
case "date" : // 일자
|
|
valid = validateDateObj(elem, fieldName); break;
|
|
|
|
case "term" : // 기간
|
|
var rearDateName = elem.getAttribute("valid.rearDate"); // 앞 일자 항목을 구한다.
|
|
var allowSameDate = isEmpty(elem.getAttribute("valid.allowSameDate"))
|
|
|| elem.getAttribute("valid.allowSameDate").toUpperCase == "TRUE";
|
|
|
|
if ( isEmpty(rearDateName) ) {
|
|
showMessage("기간(term)을 검증하기 위해서는 앞 일자 입력 항목(valid.rearDate)이 정의되어야 합니다.");
|
|
valid = false;
|
|
}
|
|
else {
|
|
var rearDateObj = eval("this.form." + rearDateName);
|
|
valid = validateTermObj(rearDateObj, elem, fieldName, allowSameDate);
|
|
}
|
|
break;
|
|
|
|
case "int" : break; //validateNoObj,
|
|
case "float" : break; //validateNoObj,
|
|
case "telno" : // 전화번호, 팩스번호
|
|
valid = validateTelNoObj(elem, fieldName); break;
|
|
|
|
case "hpno" : // 핸드폰번호
|
|
valid = validateHpNoObj(elem, fieldName); break;
|
|
|
|
case "email" : // Email
|
|
valid = validateEmailObj(elem, fieldName); break;
|
|
}
|
|
|
|
return valid;
|
|
} |