zioinfo-mail/zioinfo/js/valid.form.js
DESKTOP-TKLFCPR\ython e228faabf5 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
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>
2026-05-29 18:18:52 +09:00

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