Summary
i-AUD 클라이언트 스크립트 개발 가이드. 브라우저에서 실행되는 TypeScript 스크립트 작성법을 안내합니다. "클라이언트 스크립트", "버튼 이벤트", "그리드 조작", "UI 컨트롤", "Matrix API", "화면 개발" 등을 물어볼 때 사용하세요.
smithery.ai
i-AUD 클라이언트 스크립트 개발 가이드.
i-AUD 클라이언트 스크립트 개발 가이드. 브라우저에서 실행되는 TypeScript 스크립트 작성법을 안내합니다. "클라이언트 스크립트", "버튼 이벤트", "그리드 조작", "UI 컨트롤", "Matrix API", "화면 개발" 등을 물어볼 때 사용하세요.
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Guidance for distinctive, intentional visual design when building new UI or reshaping an existi…
866.4K installsBrowser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
617.3K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
576.5K installsDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe …
568.9K installsOther skills from smithery.ai · top by installs.
npx skills add https://smithery.ai
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Files included with this skill beyond the listing page.
SKILL.md
17,007 B
SUMMARY.md
320 B
클라이언트 스크립트는 브라우저에서 실행되며, UI 컨트롤 조작, 이벤트 처리, 데이터 바인딩 등을 담당합니다.
파일 위치: [보고서폴더]/[보고서명].script.ts 또는 [보고서폴더]/[보고서명].script.js
// 필수 import 구문
import { Matrix } from "@AUD_CLIENT/control/Matrix";
import { Button } from "@AUD_CLIENT/control/Button";
import { DataGrid } from "@AUD_CLIENT/control/DataGrid";
import { TextBox } from "@AUD_CLIENT/control/TextBox";
import { ComboBox } from "@AUD_CLIENT/control/ComboBox";
import { DataSet } from "@AUD_CLIENT/data/DataSet";
// Matrix 변수 선언 (필수)
let Matrix: Matrix;
// 컨트롤 변수 선언
let btnSearch: Button;
let grdData: DataGrid;
let txtKeyword: TextBox;
// 컨트롤 바인딩
btnSearch = Matrix.getObject("btnSearch") as Button;
grdData = Matrix.getObject("grdData") as DataGrid;
txtKeyword = Matrix.getObject("txtKeyword") as TextBox;
// 이벤트 등록
btnSearch.OnClick = btnSearchOnClick;
// 버튼 클릭 이벤트
const btnSearchOnClick = function(sender, args){
};
VS Code에서
AUD: Generate Starter Code명령을 사용하면 자동으로 생성됩니다.
| 이벤트 | 설명 | 용도 |
|---|---|---|
OnDocumentLoadComplete |
문서 로드 완료 후 발생. 스크립트 최상위와 실행 시점 동일하므로 별도 사용 불필요 | - |
OnLoadComplete |
모든 데이터 실행 완료 후 발생 | 일반 초기화 |
Matrix는 i-AUD 클라이언트의 핵심 객체로, 모든 컨트롤 접근과 유틸리티 기능을 제공합니다.
// 일반 컨트롤 가져오기
let button = Matrix.getObject("Button1") as Button;
let grid = Matrix.getObject("DataGrid1") as DataGrid;
let textbox = Matrix.getObject("TextBox1") as TextBox;
AddIn 타입 컨트롤(BaseControl, GridHtmlView 등)은 Matrix.getObject()가 AddIn 래퍼를 반환합니다. 컴포넌트는 비동기로 로딩되므로, OnComponentClassLoaded 이벤트 안에서 getScriptClass()를 호출해야 합니다.
// [올바른 패턴] OnComponentClassLoaded 에서 getScriptClass()로 컴포넌트 접근
let addIn = Matrix.getObject("myCtrl") as AddIn;
addIn.OnComponentClassLoaded = function(sender, args) {
let ctrl = addIn.getScriptClass() as BaseControl;
ctrl.addCSS('.card { padding: 10px; }');
ctrl.addHTML('<div class="card">내용</div>');
};
// GridHtmlView도 동일한 패턴
let addIn2 = Matrix.getObject("myView") as AddIn;
addIn2.OnComponentClassLoaded = function(sender, args) {
let view = addIn2.getScriptClass() as GridHtmlView;
view.DataGrid = Matrix.getObject("GRD") as DataGrid;
view.HTML = '<div aud-for="ROWS"><span aud-bind="NAME"></span></div>';
};
// [잘못된 패턴] 직접 캐스팅은 동작하지 않음
// let ctrl = Matrix.getObject("myCtrl") as BaseControl; // X - AddIn 래퍼가 반환됨
// let ctrl = addIn.getScriptClass() as BaseControl; // X - 비동기 로딩 전이면 null
// 알림창
Matrix.Alert("저장되었습니다.");
// 확인 대화상자
Matrix.Confirm("삭제하시겠습니까?", "확인", function(ok) {
if (ok) {
// 확인 클릭 시 처리
}
}, 0); // 0: 예/아니오, 1: 확인/취소
// 파라미터 리스트
let paramList ={"VS_CODE":"codevalue"
,"VS_NAME":"name value"
};
//서비스 호출
Matrix.RunScriptEx(["gridName"], "ServerScriptName"
, paramList
,function (p) {
//call back
if (p.Success == false) {
Matrix.Alert(p.Message);
return;
}
var ds = p.DataSet;
});
// 전역 파라미터 설정
Matrix.AddGlobalParams("YEAR", "2025", enQueryParamType.String);
// 전역 파라미터 삭제
Matrix.ClearGlobalParams();
let btn = Matrix.getObject("Button1") as Button;
// 속성
btn.Text = "검색";
btn.IsEnabled = false; // 비활성화
btn.Visible = false; // 숨김
// 이벤트
btn.OnClick = function(sender, args) {
Matrix.Alert("버튼 클릭: " + args.Id);
};
let txt = Matrix.getObject("TextBox1") as TextBox;
// 속성
let value = txt.Text; // 값 읽기
txt.Text = "새 값"; // 값 설정
txt.MaxLength = 100; // 최대 길이
// 이벤트
txt.OnTextChange = function(sender : TextBox, args : {Id: string, Text: string}) {
console.log("변경된 값:", args.Text);
};
let combo = Matrix.getObject("ComboBox1") as ComboBox;
// 속성
let selectedValue = combo.Value;
let selectedText = combo.Text;
combo.SelectedIndex = 0; // 첫 번째 항목 선택
// 이벤트
combo.OnValueChanged = function(sender : ComboBox, args : {Id: string,Value: string,SelectedIndex: number}) {
console.log("선택값:", args.Value);
};
콤보박스의 초기 선택값을 지정하려면 InitType과 InitValue를 함께 설정해야 합니다. InitValue만 설정하면 적용되지 않습니다.
| InitType 값 | 숫자 | 동작 |
|---|---|---|
CurrentValue |
0 | 현재 선택값을 유지 (기본값) |
InitValue |
1 | InitValue 속성의 값으로 초기화 |
None |
2 | 초기값을 설정하지 않음 |
// ComboBox 초기값 설정
let combo = Matrix.getObject("cboStatus") as ComboBox;
combo.InitType = 1; // enInitType.InitValue (반드시 설정!)
combo.InitValue = "Y"; // 데이터 조회 후 "Y" 항목이 자동 선택됨
// MultiComboBox 초기값 설정
let mcb = Matrix.getObject("mcbDept") as MultiComboBox;
mcb.InitType = 1; // enInitType.InitValue (반드시 설정!)
mcb.InitValue = "001,002"; // 데이터 조회 후 "001", "002" 항목이 자동 선택됨
주의: MTSD 디자이너에서도 동일하게
[InitType]을InitValue로 변경해야[InitValue]속성이 반영됩니다.
let cal = Matrix.getObject("Calendar1") as Calendar;
// 속성
let value = cal.Value; // DataFormat 형식 값 (예: "20240115")
let text = cal.Text; // ViewFormat 형식 값 (예: "2024-01-15")
let date = cal.Date; // Date 객체
cal.DataFormat = "yyyyMMdd"; // 데이터 저장용 포맷
cal.ViewFormat = "yyyy-MM-dd"; // 화면 표시용 포맷
cal.IsReadOnly = true; // 읽기 전용
// 이벤트
cal.OnValueChanged = function(sender : Calendar, args : {Id: string, Text: string, Date: Date}) {
console.log("선택 날짜:", args.Text, args.Date);
};
InitDate, MinDate, MaxDate 속성에 함수 형식 문자열을 사용할 수 있습니다. MTSD 디자이너 속성 또는 스크립트에서 동일하게 사용 가능합니다.
| 함수 | 설명 | 예시 결과 (오늘 2024-07-15 기준) |
|---|---|---|
NOW() |
현재 날짜 | 2024-07-15 |
DATE(0, 0, 0) |
오늘 | 2024-07-15 |
DATE(-1, 0, 0) |
1년 전 | 2023-07-15 |
DATE(0, -3, 0) |
3개월 전 | 2024-04-15 |
DATE(0, 0, -7) |
7일 전 | 2024-07-08 |
DATE(0, 0, F) |
이번 달 1일 | 2024-07-01 |
DATE(0, 0, L) |
이번 달 말일 | 2024-07-31 |
DATE(0, F, F) |
올해 1월 1일 | 2024-01-01 |
DATE(0, L, L) |
올해 12월 31일 | 2024-12-31 |
DATE(F, F, F) |
최소 날짜 (1900-01-01) | 1900-01-01 |
DATE(L, L, L) |
최대 날짜 (2999-12-31) | 2999-12-31 |
파라미터 규칙: DATE(Year, Month, Day)
F: First — 년도(1900), 월(1월), 일(1일)L: Last — 년도(2999), 월(12월), 일(해당 월 말일)// 스크립트에서 사용
cal.InitDate = "NOW()"; // 초기값: 오늘
cal.MinDate = "DATE(0, -6, 0)"; // 최소: 6개월 전
cal.MaxDate = "DATE(1, 0, 0)"; // 최대: 1년 후
let dataGrid = Matrix.getObject("DataGrid1") as DataGrid;
// 행 조회
let rowCount = dataGrid.GetRowCount();
let row = dataGrid.GetRow(0); // 첫 번째 행
// 셀 값 읽기/쓰기
let cellValue = row.GetValue("ColumnName");
row.SetValue("ColumnName", "새 값");
// 행 추가/삭제
let newRow = dataGrid.AppendRow();
dataGrid.RemoveRowAt(0, true);
// 페이징
dataGrid.UsePaging = true;
dataGrid.PageSize = 20;
dataGrid.MovePage(2); // 2페이지로 이동
// 이벤트
dataGrid.OnCellClick = function(sender : DataGrid, args : { Id: string,Row: DataGridRow,Cell: DataGridCell,Field: DataGridColumn,Handled: boolean}) {
console.log("클릭한 셀:", args.Row.GetValue("fieldName"), args.Field.Name);
};
let igrid = Matrix.getObject("iGrid1") as iGrid;
//엑셀 저장 하기
igrid.ExportServiceCall(enExportType.Excel,
function(p){
//
// p.FolderName = file path
// p.FileName = file name
//
var newName = "MXGrid_" + Matrix.GetDateTime().ToString("yyyyMMddHHmmss") + ".xlsx";
Matrix.DownloadFile(p.FolderName, p.FileName ,newName ,true);
} );
let chart = Matrix.getObject("Chart1") as Chart;
// 차트 옵션 접근
let options = chart.ChartOptions;
// 차트 다시 그리기
chart.Update();
let olap = Matrix.getObject("OlapGrid1") as OlapGrid;
// 필터 설정
olap.setDimensionFilterIn("DimensionName", ["Value1", "Value2"]);
// 데이터 새로고침
olap.Refresh();
// 이벤트
olap.OnDataCellDoubleClick = function(sender, args) {
console.log("더블클릭:", args);
};
모든 컨트롤이 상속받는 기본 속성입니다.
// 위치/크기
control.Left = 100;
control.Top = 50;
control.Width = 200;
control.Height = 30;
// 표시 여부
control.Visible = true;
control.IsEnabled = true;
// 스타일
control.Tooltip = "도움말 텍스트";
control.ZIndex = 10;
// 메서드
control.Focus(); // 포커스 설정
control.Update(); // 화면 갱신
control.Resize(); // 크기 재계산
// 위치/크기 일괄 설정
control.setRect({Left: 100, Top: 50, Width: 200, Height: 30} as Rect);
control.Resize();
let ds: DataSet = Matrix.CreateDataSet("DataSetName");
// 테이블 접근
let table = ds.GetTable(0); // 인덱스로
let table = ds.GetTable("TableName"); // 이름으로
// 테이블 생성
let newTable = ds.CreateTable("NewTable");
let table = ds.GetTable("Table1");
let rowCount = table.GetRowCount();
// 행 접근
let row = table.GetRow(0);
// 행 추가
let nIdx = table.AppendRow();
table.setRowValue(nIdx, "FIELD_NAME", "value")
// 컬럼 정보
let columnNames = table.GetColumnNames();
for(let i=0,i2=columnNames.length;i<i2; i++){
table.setRowValue(nIdx, columnNames[i], "value...");
}
let row = table.GetRow(0);
// 값 읽기/쓰기
let value = row.GetValue("ColumnName");
row.SetValue("ColumnName", "새 값");
// 인덱스로 접근
let value = row.GetValue(0);
//날자로 변환
let date = Matrix.getDate("2025-12-12", "yyyy-MM-dd");
let addDay = date.AddDays(10).Day;
//현재일자
let nowdate = Matrix.getDate();
let text = nowdate.AddDays(-7).ToString("yyyy-MM-dd");
let strUtil = Matrix.getStringUtility();
let formatted = strUtil.Format("{0}년 {1}월", "2025", "01");
// 사용자 정보
let userInfo = Matrix.getUserInfo();
let userId = userInfo.UserCode;
let userName = userInfo.UserName;
// 보고서 정보
let reportInfo = Matrix.getReportInfo();
let reportCode = reportInfo.ReportCode;
// 버튼 클릭 이벤트
let btnSearch = Matrix.getObject("btnSearch") as Button;
btnSearch.OnClick = function(sender, args) {
// 검색 로직
Matrix.ExecuteService("SearchService", function(result) {
if (result.Success) {
Matrix.Alert("조회 완료");
}
});
};
// 그리드 셀 변경 이벤트
let grid = Matrix.getObject("DataGrid1") as DataGrid;
grid.OnEndEdit = function(sender, args) {
console.log("변경됨:", args.Row.GetValue("필드명"), args.AfterValue, args.BeforeValue, args.Field.Name);
};
실제 구현 예제는 다음 폴더를 참조하세요:
src/reports/samples/MX_GRID/ - MX-GRID 관련 샘플src/reports/samples/OLAP/ - OLAP 그리드 샘플src/reports/samples/ETC/ - 기타 기능 샘플클라이언트 스크립트는 ES5/ES6 환경에서 실행되므로, ES2017+ 메서드는 사용할 수 없습니다.
| 사용 불가 (ES2017+) | 대체 방법 |
|---|---|
String.padStart() |
lpad() 헬퍼 함수 사용 |
String.padEnd() |
rpad() 헬퍼 함수 사용 |
Object.entries() |
Object.keys() + 인덱스 접근 |
Object.values() |
Object.keys() + map |
Array.includes() |
Array.indexOf() >= 0 |
async/await |
콜백 또는 Promise.then() |
// padStart 대체
function lpad(val: number | string, len: number, ch?: string): string {
let s = String(val);
let pad = ch || '0';
while (s.length < len) s = pad + s;
return s;
}
// padEnd 대체
function rpad(val: number | string, len: number, ch?: string): string {
let s = String(val);
let pad = ch || ' ';
while (s.length < len) s = s + pad;
return s;
}
// 사용 예
lpad(5, 3); // "005"
lpad(12, 4); // "0012"
lpad("AB", 5, '_'); // "___AB"
i-AUD 프레임워크는 keydown 이벤트를 전역으로 가로챕니다 (단축키 처리, 셀 이동 등). 이로 인해 HTML <input>, <textarea> 요소에서 Backspace, Delete, 방향키 등이 동작하지 않을 수 있습니다.
특히 영향받는 경우:
<input> / <textarea>addHTML()로 동적 생성한 입력 요소해결: 입력 요소에 keydown 이벤트의 stopPropagation()을 등록하여 프레임워크로의 이벤트 전파를 차단합니다.
let input = element.querySelector("input") as HTMLInputElement;
input.addEventListener('keydown', function(e) {
e.stopPropagation(); // i-AUD 프레임워크의 키 가로채기 방지
});
주의:
preventDefault()는 사용하지 마세요 — 입력 자체가 차단됩니다.stopPropagation()만 사용합니다.
클라이언트 스크립트에서 types/aud/enums/ 의 enum을 import하면 안 됩니다. import 구문으로 타입 파일을 참조하면 런타임에 모듈을 찾을 수 없어 오류가 발생합니다.
enum 값이 필요하면 스크립트 파일 안에 직접 복사하여 사용하세요.
// ✗ 잘못된 패턴 — import 금지
import { enDataType } from "@AUD_CLIENT/enums/comm/enDataType";
// ✓ 올바른 패턴 — 스크립트 내에 직접 선언
enum enDataType { Numeric = 0, String = 1, DateTime8 = 2, DateTimeNow = 3, UserCode = 4 }
types/aud/enums/파일을 열어 값을 확인한 뒤, 필요한 항목만 복사하세요.
상세 API 정의는 types/aud/ 폴더를 참조하세요:
types/aud/control/ - UI 컨트롤 인터페이스types/aud/data/ - 데이터 관련 인터페이스types/aud/common/ - 공통 유틸리티types/aud/enums/ - 열거형 타입