@bimatrix-aud-platform/aud_mcp_server 1.1.15 → 1.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { readFileSync, writeFileSync } from "fs";
2
+ import { createDefaultOlapField, isNumericColumnType } from "./olap-field.js";
2
3
  /**
3
4
  * MTSD 파일을 읽고, 자동 보정 규칙을 적용한 뒤, 파일을 덮어씁니다.
4
5
  */
@@ -92,73 +93,7 @@ function fixDataSourceReferences(doc, dsNameToId, dsIdSet, fixes) {
92
93
  }
93
94
  }
94
95
  // ---- Rule 2: OlapGrid DataSource 기반 Fields 자동 생성 ----
95
- // DataSource Column.Type이 "Numeric"이면 숫자형으로 판단
96
- const NUMERIC_COLUMN_TYPES = new Set([
97
- "Numeric",
98
- // SQL 타입 호환
99
- "INT", "INTEGER", "BIGINT", "SMALLINT", "TINYINT",
100
- "NUMERIC", "DECIMAL", "FLOAT", "DOUBLE", "REAL", "NUMBER", "MONEY",
101
- ]);
102
- function isNumericColumnType(type) {
103
- return NUMERIC_COLUMN_TYPES.has(type) || NUMERIC_COLUMN_TYPES.has(type.toUpperCase());
104
- }
105
- /** OlapField 기본값 생성 (OlapField constructor + Serialize 기준) */
106
- function createDefaultOlapField(key, caption) {
107
- return {
108
- Key: key,
109
- Caption: caption,
110
- ToolTipField: "",
111
- ToolTipText: "",
112
- Category: 1, // enCategory.Dimension
113
- Area: 0, // enArea.Hidden
114
- SummaryType: 0, // enSummaryType.None
115
- TotalSummaryType: 0,
116
- SummaryVariation: 0,
117
- GroupByType: 0, // enGroupByType.Auto
118
- Format: "",
119
- Formula: "",
120
- Formula2: "",
121
- RefFormula: "",
122
- Width: 100,
123
- Unit: 1,
124
- CreateType: 0, // enOlapFieldCreateType.Default
125
- SortType: 0, // enSortType.None
126
- MeasureSortField: "",
127
- SortBaseField: "",
128
- MoveAble: true,
129
- SortAble: true,
130
- FilterAble: true,
131
- AllowFilter: true,
132
- AllowRow: true,
133
- AllowColumn: true,
134
- AllowData: true,
135
- KeyType: 0, // enKeyType.None
136
- DataType: 0, // enDataType.Numeric
137
- SaveMode: 0, // enSaveMode.All
138
- LanguageCode: "",
139
- UseChartSource: true,
140
- VisibleSubTotal: true,
141
- SummaryBaseFieldKey: "",
142
- TextAlignment: 1, // enHorizonAlign.Right
143
- HeaderAlignment: 0, // enHorizonAlign.Left
144
- InDimensions: "",
145
- Visible: true,
146
- Expanded: true,
147
- MetaItemCode: "",
148
- MetaItemName: "",
149
- MetaRollupType: 0,
150
- MetaCalculatorField: false,
151
- MetaSummaryTypeIsDistinct: false,
152
- FilterInfo: {
153
- FilterType: 0, // enOlapFilterType.In
154
- FilterKind: 0, // enOlapFilterKind.Dimension
155
- HasMeasureFilter: false,
156
- MeasureFilterTypeA: 0, // enOlapMeasureFilterType.Equals
157
- MeasureFilterTypeB: 0,
158
- MeasureAndOrOperator: 2, // enAndOrOperator.And
159
- },
160
- };
161
- }
96
+ // createDefaultOlapField, isNumericColumnType는 olap-field.ts에서 import
162
97
  function fixOlapGridFields(doc, datas, fixes) {
163
98
  // DataSource Id → DataSource 객체 매핑
164
99
  const dsById = new Map();
@@ -0,0 +1,45 @@
1
+ /**
2
+ * OlapGrid iOLAPView.Fields 생성기
3
+ *
4
+ * 컬럼 정의를 입력받아 OlapField 배열을 생성합니다.
5
+ * iOLAP.OlapGrid.ts의 createDataSourceFields (UseMeta==false) 로직을 기반으로 합니다.
6
+ *
7
+ * @see 2.Sources/src/control/olapgrid/iOLAP.OlapGrid.ts:4592-4657 — 필드 생성
8
+ * @see 2.Sources/src/control/olapgrid/iOLAP.OlapGrid.ts:1806-1837 — Area 자동 배치
9
+ * @see 2.Sources/src/control/olapgrid/iOLAP.Enums.ts — enCategory, enArea 등
10
+ */
11
+ export declare function isNumericColumnType(type: string): boolean;
12
+ export declare function createDefaultOlapField(key: string, caption: string): any;
13
+ export interface OlapFieldColumn {
14
+ name: string;
15
+ caption?: string;
16
+ type?: string;
17
+ area?: string;
18
+ summaryType?: string;
19
+ format?: string;
20
+ sortType?: string;
21
+ width?: number;
22
+ }
23
+ export interface GenerateOlapFieldsInput {
24
+ columns: OlapFieldColumn[];
25
+ autoPlace?: boolean;
26
+ includeOptions?: boolean;
27
+ }
28
+ export interface GenerateOlapFieldsResult {
29
+ fields: any[];
30
+ iOLAPView?: any;
31
+ warnings: string[];
32
+ summary: {
33
+ total: number;
34
+ dimensions: number;
35
+ measures: number;
36
+ areaMap: {
37
+ row: string[];
38
+ column: string[];
39
+ data: string[];
40
+ filter: string[];
41
+ hidden: string[];
42
+ };
43
+ };
44
+ }
45
+ export declare function generateOlapFields(input: GenerateOlapFieldsInput): GenerateOlapFieldsResult;
@@ -0,0 +1,316 @@
1
+ /**
2
+ * OlapGrid iOLAPView.Fields 생성기
3
+ *
4
+ * 컬럼 정의를 입력받아 OlapField 배열을 생성합니다.
5
+ * iOLAP.OlapGrid.ts의 createDataSourceFields (UseMeta==false) 로직을 기반으로 합니다.
6
+ *
7
+ * @see 2.Sources/src/control/olapgrid/iOLAP.OlapGrid.ts:4592-4657 — 필드 생성
8
+ * @see 2.Sources/src/control/olapgrid/iOLAP.OlapGrid.ts:1806-1837 — Area 자동 배치
9
+ * @see 2.Sources/src/control/olapgrid/iOLAP.Enums.ts — enCategory, enArea 등
10
+ */
11
+ // ─── enums (iOLAP.Enums.ts 기준) ───
12
+ const enArea = { Hidden: 0, Row: 1, Column: 2, Filter: 3, Data: 4 };
13
+ const enCategory = { Default: 0, Dimension: 1, Measure: 2, Attribute: 3, Period: 4 };
14
+ const enSummaryType = { None: 0, Sum: 1, Min: 2, Max: 3, Average: 4, Count: 5, Calculate: 9, DistinctCount: 13, Text: 14 };
15
+ const enSortType = { None: 0, Asc: 1, Desc: 2, Custom: 3 };
16
+ const enDataType = { Numeric: 0, String: 1, DateTime8: 2, DateTimeNow: 3, UserCode: 4, CLOB: 5 };
17
+ // ─── 숫자형 컬럼 타입 판별 ───
18
+ const NUMERIC_COLUMN_TYPES = new Set([
19
+ "Numeric",
20
+ "INT", "INTEGER", "BIGINT", "SMALLINT", "TINYINT",
21
+ "NUMERIC", "DECIMAL", "FLOAT", "DOUBLE", "REAL", "NUMBER", "MONEY",
22
+ ]);
23
+ export function isNumericColumnType(type) {
24
+ return NUMERIC_COLUMN_TYPES.has(type) || NUMERIC_COLUMN_TYPES.has(type.toUpperCase());
25
+ }
26
+ // ─── OlapField 기본값 생성 (OlapField constructor + Serialize 기준) ───
27
+ export function createDefaultOlapField(key, caption) {
28
+ return {
29
+ Key: key,
30
+ Caption: caption,
31
+ ToolTipField: "",
32
+ ToolTipText: "",
33
+ Category: enCategory.Dimension,
34
+ Area: enArea.Hidden,
35
+ SummaryType: enSummaryType.None,
36
+ TotalSummaryType: 0,
37
+ SummaryVariation: 0,
38
+ GroupByType: 0,
39
+ Format: "",
40
+ Formula: "",
41
+ Formula2: "",
42
+ RefFormula: "",
43
+ Width: 100,
44
+ Unit: 1,
45
+ CreateType: 0,
46
+ SortType: enSortType.None,
47
+ MeasureSortField: "",
48
+ SortBaseField: "",
49
+ MoveAble: true,
50
+ SortAble: true,
51
+ FilterAble: true,
52
+ AllowFilter: true,
53
+ AllowRow: true,
54
+ AllowColumn: true,
55
+ AllowData: true,
56
+ KeyType: 0,
57
+ DataType: enDataType.Numeric,
58
+ SaveMode: 0,
59
+ LanguageCode: "",
60
+ UseChartSource: true,
61
+ VisibleSubTotal: true,
62
+ SummaryBaseFieldKey: "",
63
+ TextAlignment: 1, // Right
64
+ HeaderAlignment: 0, // Left
65
+ InDimensions: "",
66
+ Visible: true,
67
+ Expanded: true,
68
+ MetaItemCode: "",
69
+ MetaItemName: "",
70
+ MetaRollupType: 0,
71
+ MetaCalculatorField: false,
72
+ MetaSummaryTypeIsDistinct: false,
73
+ FilterInfo: {
74
+ FilterType: 0,
75
+ FilterKind: 0,
76
+ HasMeasureFilter: false,
77
+ MeasureFilterTypeA: 0,
78
+ MeasureFilterTypeB: 0,
79
+ MeasureAndOrOperator: 2,
80
+ },
81
+ };
82
+ }
83
+ // ─── summaryType 문자열 → enum 변환 ───
84
+ function parseSummaryType(s) {
85
+ switch (s.toLowerCase()) {
86
+ case "sum": return enSummaryType.Sum;
87
+ case "count": return enSummaryType.Count;
88
+ case "average":
89
+ case "avg": return enSummaryType.Average;
90
+ case "min": return enSummaryType.Min;
91
+ case "max": return enSummaryType.Max;
92
+ case "none": return enSummaryType.None;
93
+ case "distinctcount": return enSummaryType.DistinctCount;
94
+ case "text": return enSummaryType.Text;
95
+ default: return enSummaryType.None;
96
+ }
97
+ }
98
+ // ─── sortType 문자열 → enum 변환 ───
99
+ function parseSortType(s) {
100
+ switch (s.toLowerCase()) {
101
+ case "asc": return enSortType.Asc;
102
+ case "desc": return enSortType.Desc;
103
+ case "none": return enSortType.None;
104
+ default: return enSortType.None;
105
+ }
106
+ }
107
+ // ─── area 문자열 → enum 변환 ───
108
+ function parseArea(s) {
109
+ switch (s.toLowerCase()) {
110
+ case "row": return enArea.Row;
111
+ case "column":
112
+ case "col": return enArea.Column;
113
+ case "data": return enArea.Data;
114
+ case "filter": return enArea.Filter;
115
+ case "hidden": return enArea.Hidden;
116
+ default: return enArea.Hidden;
117
+ }
118
+ }
119
+ // ─── iOLAPView.Options 기본값 ───
120
+ function createDefaultOptions() {
121
+ return {
122
+ ViewType: 0,
123
+ IsExpandAll: true,
124
+ ShowExpandButtons: true,
125
+ EmptyCellText: "",
126
+ NotAvaliableCellText: "",
127
+ ZeroDivisioinCellText: "",
128
+ ErrorCellText: "",
129
+ RowGrandTotalText: "총계",
130
+ ColumnGrandTotalText: "총계",
131
+ RowTotalText: "소계",
132
+ ColumnTotalText: "소계",
133
+ RowTotalLocation: 1,
134
+ ColumnTotalLocation: 1,
135
+ RowGrandTotalLocation: 1,
136
+ ColumnGrandTotalLocation: 1,
137
+ DisplayColumnSubTotal: true,
138
+ DisplayRowSubTotal: true,
139
+ DisplayColumnGrandTotal: true,
140
+ DisplayRowGrandTotal: true,
141
+ ShowFilterArea: true,
142
+ ShowColumnrArea: true,
143
+ ShowRowArea: true,
144
+ ShowDataArea: true,
145
+ UseMultiHeader: false,
146
+ AutoSelection: false,
147
+ HideHorizontalScrollBar: false,
148
+ HideVerticalScrollBar: false,
149
+ DisableClipBoard: false,
150
+ CellHeight: 24,
151
+ HeaderCellHeight: 24,
152
+ CanResizeCellWidth: true,
153
+ RowHeaderUnFix: false,
154
+ MeasuresCreateArea: 1,
155
+ TreeHeaderWidth: 200,
156
+ TreeIndentWidth: 16,
157
+ DisableColumnSort: false,
158
+ EnableWriteBack: false,
159
+ MergeColumnHeaders: false,
160
+ MergeRowHeaders: false,
161
+ CacheOption: {
162
+ UseHybrid: true,
163
+ },
164
+ };
165
+ }
166
+ export function generateOlapFields(input) {
167
+ const warnings = [];
168
+ const columns = input.columns || [];
169
+ const autoPlace = input.autoPlace !== false; // 기본 true
170
+ const includeOptions = input.includeOptions === true;
171
+ if (columns.length === 0) {
172
+ warnings.push("columns 배열이 비어 있습니다.");
173
+ return {
174
+ fields: [],
175
+ warnings,
176
+ summary: { total: 0, dimensions: 0, measures: 0, areaMap: { row: [], column: [], data: [], filter: [], hidden: [] } },
177
+ };
178
+ }
179
+ // 1. 필드 생성
180
+ const fields = [];
181
+ const nameSet = new Set();
182
+ for (const col of columns) {
183
+ if (!col.name) {
184
+ warnings.push("name이 비어있는 컬럼이 있어 건너뜁니다.");
185
+ continue;
186
+ }
187
+ if (nameSet.has(col.name)) {
188
+ warnings.push(`중복 컬럼명 "${col.name}" 발견, 건너뜁니다.`);
189
+ continue;
190
+ }
191
+ nameSet.add(col.name);
192
+ const caption = col.caption || col.name;
193
+ const field = createDefaultOlapField(col.name, caption);
194
+ const isNumeric = isNumericColumnType(col.type || "string");
195
+ // 타입 기반 기본값 설정 (createDataSourceFields 로직)
196
+ if (isNumeric) {
197
+ field.Category = enCategory.Measure;
198
+ field.Format = "{0:N0}";
199
+ field.DataType = enDataType.Numeric;
200
+ field.SummaryType = enSummaryType.Sum;
201
+ field.TextAlignment = 1; // Right
202
+ }
203
+ else {
204
+ field.Category = enCategory.Dimension;
205
+ field.DataType = enDataType.String;
206
+ field.SortType = enSortType.Asc;
207
+ field.SummaryType = enSummaryType.Count;
208
+ field.TextAlignment = 1; // Right
209
+ }
210
+ // 커스텀 오버라이드
211
+ if (col.summaryType) {
212
+ field.SummaryType = parseSummaryType(col.summaryType);
213
+ }
214
+ if (col.format) {
215
+ field.Format = col.format;
216
+ }
217
+ if (col.sortType) {
218
+ field.SortType = parseSortType(col.sortType);
219
+ }
220
+ if (col.width != null) {
221
+ field.Width = col.width;
222
+ }
223
+ // 수동 Area 지정
224
+ if (col.area) {
225
+ field.Area = parseArea(col.area);
226
+ }
227
+ fields.push(field);
228
+ }
229
+ // 2. Area 자동 배치 (setDataSource 로직 준용)
230
+ if (autoPlace) {
231
+ let rowCnt = 0;
232
+ let colCnt = 0;
233
+ let dataCnt = 0;
234
+ for (const field of fields) {
235
+ // 수동 area가 이미 지정된 경우 스킵 (Hidden=0이 아닌 경우)
236
+ if (field.Area !== enArea.Hidden)
237
+ continue;
238
+ if (field.DataType === enDataType.Numeric) {
239
+ // Numeric → Data(최대 3개) → Filter
240
+ if (dataCnt < 3) {
241
+ field.Area = enArea.Data;
242
+ dataCnt++;
243
+ }
244
+ else {
245
+ field.Area = enArea.Filter;
246
+ }
247
+ }
248
+ else {
249
+ // String → Row(최대 2개) → Column(최대 2개) → Filter
250
+ if (rowCnt < 2) {
251
+ field.Area = enArea.Row;
252
+ rowCnt++;
253
+ }
254
+ else if (colCnt < 2) {
255
+ field.Area = enArea.Column;
256
+ colCnt++;
257
+ }
258
+ else {
259
+ field.Area = enArea.Filter;
260
+ }
261
+ }
262
+ }
263
+ }
264
+ // 3. 요약 정보 생성
265
+ const areaMap = { row: [], column: [], data: [], filter: [], hidden: [] };
266
+ let dimensions = 0;
267
+ let measures = 0;
268
+ for (const field of fields) {
269
+ if (field.Category === enCategory.Measure)
270
+ measures++;
271
+ else
272
+ dimensions++;
273
+ switch (field.Area) {
274
+ case enArea.Row:
275
+ areaMap.row.push(field.Key);
276
+ break;
277
+ case enArea.Column:
278
+ areaMap.column.push(field.Key);
279
+ break;
280
+ case enArea.Data:
281
+ areaMap.data.push(field.Key);
282
+ break;
283
+ case enArea.Filter:
284
+ areaMap.filter.push(field.Key);
285
+ break;
286
+ default:
287
+ areaMap.hidden.push(field.Key);
288
+ break;
289
+ }
290
+ }
291
+ // 4. 결과 조립
292
+ const result = {
293
+ fields,
294
+ warnings,
295
+ summary: {
296
+ total: fields.length,
297
+ dimensions,
298
+ measures,
299
+ areaMap,
300
+ },
301
+ };
302
+ // includeOptions: iOLAPView 전체 구조 포함
303
+ if (includeOptions) {
304
+ result.iOLAPView = {
305
+ Options: createDefaultOptions(),
306
+ TopFilter: {
307
+ Dimension: "",
308
+ Measure: "",
309
+ Rank: 0,
310
+ IsTop: true,
311
+ },
312
+ Fields: fields,
313
+ };
314
+ }
315
+ return result;
316
+ }
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ import { generateGridColumns } from "./generators/grid-column.js";
12
12
  import { generateDataSource } from "./generators/datasource.js";
13
13
  import { fixMtsd } from "./generators/fixer.js";
14
14
  import { getControlInfo } from "./generators/control-info.js";
15
+ import { generateOlapFields } from "./generators/olap-field.js";
15
16
  import { callSchemaService, callDbmsList, isAudConfigured, setWorkspaceRoots } from "./utils/aud-api-client.js";
16
17
  const __filename = fileURLToPath(import.meta.url);
17
18
  const __dirname = dirname(__filename);
@@ -494,6 +495,54 @@ const tools = [
494
495
  additionalProperties: true,
495
496
  },
496
497
  },
498
+ {
499
+ name: "generate_olap_fields",
500
+ description: "OlapGrid의 iOLAPView.Fields 배열을 생성합니다. 컬럼 정의를 입력하면 Dimension/Measure 분류, Area 자동 배치, SummaryType 설정이 완료된 OlapField 배열을 반환합니다.",
501
+ inputSchema: {
502
+ type: "object",
503
+ properties: {
504
+ columns: {
505
+ type: "array",
506
+ items: {
507
+ type: "object",
508
+ properties: {
509
+ name: { type: "string", description: "컬럼명 (OlapField Key)" },
510
+ caption: { type: "string", description: "표시명 (생략 시 name)" },
511
+ type: {
512
+ type: "string",
513
+ enum: ["string", "number", "numeric", "date", "datetime", "int", "float", "decimal", "varchar", "nvarchar", "char"],
514
+ description: "컬럼 데이터 타입 (number/numeric/int/float/decimal → Measure, 그 외 → Dimension)",
515
+ },
516
+ area: {
517
+ type: "string",
518
+ enum: ["row", "column", "data", "filter", "hidden"],
519
+ description: "수동 Area 배치 (생략 시 자동 배치)",
520
+ },
521
+ summaryType: {
522
+ type: "string",
523
+ enum: ["sum", "count", "average", "min", "max", "none", "distinctcount", "text"],
524
+ description: "집계 함수 (Measure 기본: sum, Dimension 기본: count)",
525
+ },
526
+ format: { type: "string", description: "표시 포맷 (예: {0:N0})" },
527
+ sortType: { type: "string", enum: ["asc", "desc", "none"], description: "정렬" },
528
+ width: { type: "number", description: "너비 (기본 100)" },
529
+ },
530
+ required: ["name"],
531
+ },
532
+ description: "컬럼 정의 배열",
533
+ },
534
+ autoPlace: {
535
+ type: "boolean",
536
+ description: "Area 자동 배치 (기본: true). false면 수동 area 지정 필드만 배치, 나머지 Hidden",
537
+ },
538
+ includeOptions: {
539
+ type: "boolean",
540
+ description: "iOLAPView 전체 구조(Options + Fields) 포함 여부 (기본: false)",
541
+ },
542
+ },
543
+ required: ["columns"],
544
+ },
545
+ },
497
546
  {
498
547
  name: "fix_mtsd",
499
548
  description: "MTSD 파일을 읽어 자동 보정 규칙을 적용하고 파일을 덮어씁니다. DataSource Name→Id 참조 보정, Params Value 누락 보정, Columns Type 누락 보정, Docking/Border 필수 속성 보정을 수행합니다.",
@@ -942,6 +991,25 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
942
991
  ],
943
992
  };
944
993
  }
994
+ case "generate_olap_fields": {
995
+ const result = generateOlapFields(args);
996
+ return {
997
+ content: [
998
+ {
999
+ type: "text",
1000
+ text: JSON.stringify({
1001
+ success: true,
1002
+ fields: result.fields,
1003
+ iOLAPView: result.iOLAPView,
1004
+ summary: result.summary,
1005
+ warnings: result.warnings.length > 0
1006
+ ? result.warnings
1007
+ : undefined,
1008
+ }, null, 2),
1009
+ },
1010
+ ],
1011
+ };
1012
+ }
945
1013
  case "fix_mtsd": {
946
1014
  const filePath = args?.path;
947
1015
  if (!filePath) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bimatrix-aud-platform/aud_mcp_server",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "description": "MCP Server for i-AUD MTSD document validation and generation",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -394,24 +394,33 @@ export type ElementType =
394
394
  | 'CalendarFromTo' // 기간 선택 달력 (시작~종료)
395
395
  | 'CalendarWeeklyFromTo' // 주간 기간 선택 달력
396
396
  | 'CalendarYM' // 년월 선택 달력
397
+ | 'CalendarYear' // 년도 선택 달력
397
398
  | 'Chart' // 일반 차트
398
399
  | 'PieChart' // 원형 차트
399
400
  | 'ScatterChart' // 산점도 차트
401
+ | 'PolygonChart' // 다각형 차트 (레이더)
400
402
  | 'TreeGrid' // 트리형 그리드
401
403
  | 'OlapGrid' // OLAP 그리드
404
+ | 'iGrid' // MX-GRID (인터랙티브 그리드)
405
+ | 'CompactDataGrid' // 컴팩트 데이터 그리드
402
406
  | 'Slider' // 슬라이더
403
407
  | 'FileUpload' // 파일 업로드
404
408
  | 'FileUploadButton' // 파일 업로드 버튼
405
409
  | 'Browser' // 웹 브라우저 컨테이너 (iframe)
406
410
  | 'WebContainer' // 웹 컨테이너
407
- | 'ColorPicker' // 색상 선택기
411
+ | 'ColorPicker' // 색상 선택기 (구버전 호환)
412
+ | 'ColorSelector' // 색상 선택기
408
413
  | 'MultiComboBox' // 다중선택 콤보박스
409
414
  | 'PickList' // 픽 리스트
410
415
  | 'Tab' // 탭 컨트롤
416
+ | 'TableLayout' // 테이블 레이아웃 컨테이너
411
417
  | 'Tree' // 트리 컨트롤
418
+ | 'TreeView' // 트리뷰 컨트롤
412
419
  | 'UserComponent' // 보고서 컨테이너 (ReportContainer) - 실제 저장되는 Type 값
413
420
  | 'AddIn' // 애드인 컨트롤
414
- | 'ListGrid'; // 리스트 그리드
421
+ | 'ListGrid' // 리스트 그리드
422
+ | 'DiagramControl' // 다이어그램 (워크플로우)
423
+ | 'Slicer'; // 슬라이서 (OLAP 필터)
415
424
 
416
425
  /**
417
426
  * 컨트롤 기본 인터페이스
@@ -542,11 +551,11 @@ export interface IDataGridElement extends IBaseElement {
542
551
  DataSource?: string;
543
552
  /** 셀 내부 여백 (예: "2,2,2,2") */
544
553
  CellMargin: string;
545
- /** 자동 새로고침 여부 */
546
- AutoRefresh?: boolean;
554
+ /** 보고서 로딩 시 데이터 조회 여부 */
555
+ AutoRefresh: boolean;
547
556
  /** 수동 새로고침 버튼 표시 여부 */
548
- DoRefresh?: boolean;
549
- /** 내보내기 버튼 표시 여부 */
557
+ DoRefresh: boolean;
558
+ /** 파일 내보내기(다운로드) 가능 여부 */
550
559
  DoExport?: boolean;
551
560
  /** 헤더 표시 방식 (0: 표시, 1: 숨김 등) */
552
561
  ShowHeader?: number;
@@ -857,6 +866,96 @@ export interface IComboBoxElement extends IBaseElement {
857
866
  SelectedValue?: string;
858
867
  /** 고정 항목 목록 (JSON 형식, 데이터소스 대신 사용) */
859
868
  DefinedItems?: string;
869
+ /** 보고서 로딩 시 데이터 조회 여부 */
870
+ AutoRefresh: boolean;
871
+ /** 수동 새로고침 버튼 표시 여부 */
872
+ DoRefresh: boolean;
873
+ }
874
+
875
+ // ============================================
876
+ // MultiComboBox Element
877
+ // ============================================
878
+
879
+ /**
880
+ * 다중 선택 콤보박스 컨트롤 인터페이스
881
+ * 트리 구조 또는 플랫 목록에서 여러 항목을 선택할 수 있는 팝업 콤보박스입니다.
882
+ * @see src/control/combobox/MultiComboBox.ts
883
+ */
884
+ export interface IMultiComboBoxElement extends IBaseElement {
885
+ Type: 'MultiComboBox';
886
+ /** 목록 데이터를 제공할 데이터소스 이름 */
887
+ DataSource?: string;
888
+ /** 선택된 값 (쉼표 구분) */
889
+ EditValue?: string;
890
+ /** 캡션 텍스트 (선택된 항목 요약 표시) */
891
+ CaptionText?: string;
892
+ /** 초기화 타입 (0: 없음, 1: 초기값 사용) */
893
+ InitType?: number;
894
+ /** 초기값 */
895
+ InitValue?: string;
896
+ /** 새로고침 타입 */
897
+ RefreshType?: number;
898
+ /** 읽기 전용 여부 */
899
+ IsReadOnly?: boolean;
900
+ /** 정렬 타입 */
901
+ SortType?: number;
902
+ /** 보고서 로딩 시 데이터 조회 여부 */
903
+ AutoRefresh: boolean;
904
+ /** 새로고침 후 호출할 함수명 */
905
+ AfterRefesh?: string;
906
+ /** 연동 대상 데이터 초기화 여부 */
907
+ ClearTargetData?: boolean;
908
+ /** 다중 선택 여부 */
909
+ IsMultiSelect?: boolean;
910
+ /** 자식 노드 자동 선택 여부 */
911
+ AutoChildSelect?: boolean;
912
+ /** 리프 노드만 선택 가능 여부 */
913
+ LeafNodeOnly?: boolean;
914
+ /** 체크박스 숨김 여부 */
915
+ HideCheckBox?: boolean;
916
+ /** 트리 자동 확장 레벨 (0: 확장 없음) */
917
+ AutoExpandLevel?: number;
918
+ /** 트리 들여쓰기 크기 (px) */
919
+ IndentSize?: number;
920
+ /** 빈 값 대체 텍스트 */
921
+ EmptyValue?: string;
922
+ /** 트리뷰 타입 (0: 플랫, 1: 트리) */
923
+ TreeViewType?: number;
924
+ /** 팝업 너비 (px) */
925
+ DialogWidth?: number;
926
+ /** 팝업 높이 (px) */
927
+ DialogHeight?: number;
928
+ /** 전체선택 시 쿼리 파라미터 값 사용 여부 */
929
+ UsedSelectAllQueryParamValue?: boolean;
930
+ /** 전체 체크 여부 */
931
+ CheckedAll?: boolean;
932
+ /** 값 텍스트 직접 편집 가능 여부 */
933
+ EditableValueText?: boolean;
934
+ /** '전체' 선택 텍스트 사용 여부 */
935
+ UseSelectedAllText?: boolean;
936
+ /** '전체' 선택 시 표시 텍스트 */
937
+ SelectedAllText?: string;
938
+ /** 전체 항목 사용 여부 */
939
+ UseAllItems?: boolean;
940
+ /** 전체 항목 텍스트 */
941
+ UseAllItemsText?: string;
942
+ /** 데이터소스 필드 매핑 정보 */
943
+ DataSourceInfo?: {
944
+ /** 상위 노드 필드명 (트리 구조 시) */
945
+ ParentField?: string;
946
+ /** 하위 노드 필드명 (트리 구조 시) */
947
+ ChildField?: string;
948
+ /** 표시 텍스트 필드명 */
949
+ CaptionField?: string;
950
+ /** 값 필드명 */
951
+ ValueField?: string;
952
+ /** 아이콘 필드명 */
953
+ ImageField?: string;
954
+ /** 툴팁 필드명 */
955
+ TooltipField?: string;
956
+ };
957
+ /** 데이터 바인딩 정보 */
958
+ BindingInfo?: IBindingInfo;
860
959
  }
861
960
 
862
961
  // ============================================
@@ -918,7 +1017,7 @@ export interface IUserComponentElement extends IBaseElement {
918
1017
  // ========== 필수 속성 (항상 저장) ==========
919
1018
  /** 수동 새로고침 버튼 표시 여부 */
920
1019
  DoRefresh: boolean;
921
- /** 내보내기 버튼 표시 여부 */
1020
+ /** 파일 내보내기(다운로드) 가능 여부 */
922
1021
  DoExport: boolean;
923
1022
  /** 포함된 보고서 정보 */
924
1023
  ReportInfo: IContainerReportInfo;
@@ -950,20 +1049,20 @@ export interface IContainerReportInfo {
950
1049
  */
951
1050
  export interface IOlapGridElement extends IBaseElement {
952
1051
  Type: 'OlapGrid';
953
- /** 바인딩할 데이터소스 이름 */
954
- DataSource?: string;
1052
+ /** 바인딩할 데이터소스 Id */
1053
+ DataSource: string;
955
1054
  /** 서버 스크립트 이름 */
956
1055
  ServerScript?: string;
957
- /** 데이터 자동 새로고침 여부 */
958
- AutoRefresh?: boolean;
1056
+ /** 데이터 보고서 로딩 시 데이터 조회 여부 */
1057
+ AutoRefresh: boolean;
959
1058
  /** 수동 새로고침 버튼 표시 여부 */
960
- DoRefresh?: boolean;
961
- /** 내보내기 버튼 표시 여부 */
962
- DoExport?: boolean;
1059
+ DoRefresh: boolean;
1060
+ /** 파일 내보내기(다운로드) 가능 여부 */
1061
+ DoExport: boolean;
963
1062
  /** iOLAP 뷰 모델 직렬화 데이터 */
964
- iOLAPView?: IOlapViewModel;
1063
+ iOLAPView: IOlapViewModel;
965
1064
  /** OLAP 그리드 추가 옵션 (eniPivotSerializeOption 기반) */
966
- ExtraOption?: IOlapGridExtraOption;
1065
+ ExtraOption: IOlapGridExtraOption;
967
1066
  }
968
1067
 
969
1068
  /**
@@ -1053,7 +1152,7 @@ export interface IOlapViewModel {
1053
1152
  /** 사전 필터 배열 */
1054
1153
  PreFilters?: string[];
1055
1154
  /** OLAP 필드 배열 */
1056
- Fields?: IOlapField[];
1155
+ Fields: IOlapField[];
1057
1156
  /** 조건부 서식 설정 */
1058
1157
  ConditionalStyle?: string;
1059
1158
  /** 멀티 헤더 셀 배열 (2차원 배열) */
@@ -2339,6 +2438,369 @@ export interface IWorkFlowLink {
2339
2438
  FromParam: string;
2340
2439
  }
2341
2440
 
2441
+ // ============================================
2442
+ // RadioButton Element
2443
+ // ============================================
2444
+
2445
+ /**
2446
+ * 라디오 버튼 컨트롤 인터페이스
2447
+ * 그룹 내에서 하나만 선택 가능한 버튼입니다.
2448
+ * @see src/control/checkbox/RadioButton.ts
2449
+ */
2450
+ export interface IRadioButtonElement extends IBaseElement {
2451
+ Type: 'RadioButton';
2452
+ /** 라디오 버튼 옆에 표시될 텍스트 */
2453
+ Text: string;
2454
+ /** 텍스트 위치 ("front", "back") */
2455
+ TextPosition?: string;
2456
+ /** 라디오 버튼 그룹명 (같은 그룹명끼리 상호 배타적 선택) */
2457
+ GroupName: string;
2458
+ /** 선택 시 반환할 값 */
2459
+ CheckedValue: string;
2460
+ /** 초기 선택 상태 */
2461
+ Checked: boolean;
2462
+ /** 데이터 바인딩 정보 */
2463
+ BindingInfo?: IBindingInfo;
2464
+ }
2465
+
2466
+ // ============================================
2467
+ // MaskTextBox Element
2468
+ // ============================================
2469
+
2470
+ /**
2471
+ * 마스크 텍스트 입력 컨트롤 인터페이스
2472
+ * 입력 마스크 패턴을 사용하여 형식화된 텍스트를 입력받는 컨트롤입니다.
2473
+ * @see src/control/inputbox/MaskTextBox.ts
2474
+ */
2475
+ export interface IMaskTextBoxElement extends IBaseElement {
2476
+ Type: 'MaskTextBox';
2477
+ /** 입력 마스크 패턴 */
2478
+ Format?: string;
2479
+ /** 텍스트를 동적으로 계산할 수식 */
2480
+ Formula?: string;
2481
+ /** 읽기 전용 여부 */
2482
+ IsReadOnly?: boolean;
2483
+ /** 텍스트 값 */
2484
+ Text?: string;
2485
+ /** 입력 값 */
2486
+ Value?: any;
2487
+ /** 데이터 바인딩 정보 */
2488
+ BindingInfo?: IBindingInfo;
2489
+ /** MX-Grid와의 바인딩 정보 */
2490
+ MxBinding?: string;
2491
+ }
2492
+
2493
+ // ============================================
2494
+ // Calendar Element (Calendar, CalendarYear, CalendarYM 공통)
2495
+ // ============================================
2496
+
2497
+ /**
2498
+ * 달력 컨트롤 인터페이스
2499
+ * 날짜를 선택하는 컨트롤입니다. Calendar, CalendarYear, CalendarYM 타입에서 공용으로 사용됩니다.
2500
+ * @see src/control/calendar/Calendar.ts
2501
+ */
2502
+ export interface ICalendarElement extends IBaseElement {
2503
+ Type: 'Calendar' | 'CalendarYear' | 'CalendarYM' | 'CalendarFromTo' | 'CalendarWeeklyFromTo';
2504
+ /** 초기 날짜 (예: "TODAY", "TODAY-7", "TODAY-1M") */
2505
+ InitDate?: string;
2506
+ /** 데이터 포맷 (예: "yyyyMMdd", "yyyy") */
2507
+ DataFormat?: string;
2508
+ /** 표시 포맷 (예: "yyyy-MM-dd", "yyyy년 MM월") */
2509
+ ViewFormat?: string;
2510
+ /** 읽기 전용 여부 */
2511
+ IsReadOnly?: boolean;
2512
+ /** 텍스트 값 */
2513
+ Text?: string;
2514
+ /** 최소 날짜 */
2515
+ MinDate?: string;
2516
+ /** 최대 날짜 */
2517
+ MaxDate?: string;
2518
+ /** 데이터 바인딩 정보 */
2519
+ BindingInfo?: IBindingInfo;
2520
+ /** MX-Grid와의 바인딩 정보 */
2521
+ MxBinding?: string;
2522
+ }
2523
+
2524
+ // ============================================
2525
+ // Chart Element (Chart, PieChart, ScatterChart, PolygonChart 공통)
2526
+ // ============================================
2527
+
2528
+ /**
2529
+ * 차트 컨트롤 인터페이스
2530
+ * 데이터를 시각적 차트로 표시하는 컨트롤입니다.
2531
+ * Chart, PieChart, ScatterChart, PolygonChart 타입에서 공용으로 사용됩니다.
2532
+ * @see src/control/chart/ChartControl.ts
2533
+ */
2534
+ export interface IChartElement extends IBaseElement {
2535
+ Type: 'Chart' | 'PieChart' | 'ScatterChart' | 'PolygonChart';
2536
+ /** 바인딩할 데이터소스 이름 */
2537
+ DataSource?: string;
2538
+ /** 보고서 로딩 시 데이터 조회 여부 */
2539
+ AutoRefresh?: boolean;
2540
+ /** 수동 새로고침 버튼 표시 여부 */
2541
+ DoRefresh?: boolean;
2542
+ /** 파일 내보내기(다운로드) 가능 여부 */
2543
+ DoExport?: boolean;
2544
+ /** 연결된 피벗 그리드 컨트롤 이름 */
2545
+ PivotGrid?: string;
2546
+ /** 연결된 데이터 그리드 컨트롤 이름 */
2547
+ DataGrid?: string;
2548
+ /** 차트 옵션 (ChartType, SubChartType 등) */
2549
+ Chart?: object;
2550
+ /** 축 설정 (XAxis, Y1Axis, Y2Axis) */
2551
+ Axis?: object;
2552
+ /** 플롯 옵션 */
2553
+ PlotOptions?: object;
2554
+ /** 차트 제목 설정 */
2555
+ Title?: object;
2556
+ /** 범례 설정 */
2557
+ Legend?: object;
2558
+ /** 시리즈 배열 */
2559
+ SeriesSet?: any[];
2560
+ }
2561
+
2562
+ // ============================================
2563
+ // TreeGrid Element
2564
+ // ============================================
2565
+
2566
+ /**
2567
+ * 트리 그리드 컨트롤 인터페이스
2568
+ * 트리 구조의 계층형 데이터를 그리드 형태로 표시하는 컨트롤입니다.
2569
+ * @see src/control/grid/TreeGrid.ts
2570
+ */
2571
+ export interface ITreeGridElement extends IBaseElement {
2572
+ Type: 'TreeGrid';
2573
+ /** 셀 내부 여백 (예: "2,2,2,2") */
2574
+ CellMargin?: string;
2575
+ /** 그리드 컬럼 정의 배열 */
2576
+ Columns?: IGridColumn[];
2577
+ /** 바인딩할 데이터소스 이름 */
2578
+ DataSource?: string;
2579
+ /** 보고서 로딩 시 데이터 조회 여부 */
2580
+ AutoRefresh?: boolean;
2581
+ /** 수동 새로고침 버튼 표시 여부 */
2582
+ DoRefresh?: boolean;
2583
+ /** 파일 내보내기(다운로드) 가능 여부 */
2584
+ DoExport?: boolean;
2585
+ /** 트리 들여쓰기 여백 (px) */
2586
+ TreeMargin?: number;
2587
+ /** 토글 버튼 크기 (px) */
2588
+ ToggleBtnSize?: number;
2589
+ /** 트리 설정 (계층 구조 정의) */
2590
+ TreeInfo?: object;
2591
+ /** 자동 확장 레벨 */
2592
+ AutoExpandLevel?: number;
2593
+ /** 들여쓰기 폭 (px) */
2594
+ IndentWidth?: number;
2595
+ /** 최대 레벨 수 */
2596
+ MaxLevel?: number;
2597
+ /** 셀 편집 가능 여부 */
2598
+ Editable?: boolean;
2599
+ }
2600
+
2601
+ // ============================================
2602
+ // iGrid (MX-GRID) Element
2603
+ // ============================================
2604
+
2605
+ /**
2606
+ * MX-GRID (인터랙티브 그리드) 컨트롤 인터페이스
2607
+ * Excel과 유사한 스프레드시트 기능을 제공하는 고급 그리드 컨트롤입니다.
2608
+ */
2609
+ export interface IiGridElement extends IBaseElement {
2610
+ Type: 'iGrid';
2611
+ /** 서버 스크립트 이름 */
2612
+ ServerScript?: string;
2613
+ /** 보고서 로딩 시 데이터 조회 여부 */
2614
+ AutoRefresh: boolean;
2615
+ /** 수동 새로고침 버튼 표시 여부 */
2616
+ DoRefresh: boolean;
2617
+ /** 파일 내보내기(다운로드) 가능 여부 */
2618
+ DoExport: boolean;
2619
+ /** 템플릿 코드 (.json2 파일 코드) */
2620
+ TemplateCode?: string;
2621
+ /** 활성 시트 이름 */
2622
+ ActiveSheet?: string;
2623
+ /** 다중 시트 사용 여부 */
2624
+ UseMultiSheet?: boolean;
2625
+ /** 줌 활성화 여부 */
2626
+ EnableZoom?: boolean;
2627
+ /** 고정 행 수 */
2628
+ FreezeRow?: number;
2629
+ /** 고정 열 수 */
2630
+ FreezeColumn?: number;
2631
+ /** 자식 컨트롤 배열 */
2632
+ Controls?: any[];
2633
+ }
2634
+
2635
+ // ============================================
2636
+ // TableLayout Element
2637
+ // ============================================
2638
+
2639
+ /**
2640
+ * 테이블 레이아웃 컨테이너 컨트롤 인터페이스
2641
+ * 행/열 기반 테이블 레이아웃으로 자식 컨트롤을 배치하는 컨테이너입니다.
2642
+ */
2643
+ export interface ITableLayoutElement extends IBaseElement {
2644
+ Type: 'TableLayout';
2645
+ /** 폰트 크기 */
2646
+ FontSize?: number;
2647
+ /** 기본 여백 */
2648
+ BasicMargin?: any;
2649
+ /** 고정 레이아웃 여부 */
2650
+ IsFixed?: boolean;
2651
+ /** 테두리 표시 여부 */
2652
+ BorderVisible?: boolean;
2653
+ /** 컬럼 정의 배열 */
2654
+ Cols?: any[];
2655
+ /** 행 정의 배열 */
2656
+ Rows?: any[];
2657
+ /** 셀 병합 정의 */
2658
+ MergeCellList?: any[];
2659
+ }
2660
+
2661
+ // ============================================
2662
+ // Tab Element
2663
+ // ============================================
2664
+
2665
+ /**
2666
+ * 탭 컨테이너 컨트롤 인터페이스
2667
+ * 여러 탭 페이지로 컨트롤을 구분하여 표시하는 컨테이너입니다.
2668
+ */
2669
+ export interface ITabElement extends IBaseElement {
2670
+ Type: 'Tab';
2671
+ /** 탭 버튼 위치 (enTabPositionType) */
2672
+ TabButtonPosition?: number;
2673
+ /** 탭 버튼 높이 (px) */
2674
+ TabButtonHeight?: number;
2675
+ /** 활성 탭 스타일 */
2676
+ ActiveStyle?: object;
2677
+ /** 비활성 탭 스타일 */
2678
+ InactiveStyle?: object;
2679
+ /** 마우스 오버 시 스타일 */
2680
+ MouseOverStyle?: object;
2681
+ /** 마우스 다운 시 스타일 */
2682
+ MouseDownStyle?: object;
2683
+ /** 파일 내보내기(다운로드) 가능 여부 */
2684
+ DoExport?: boolean;
2685
+ /** 탭 아이템 배열 (각 탭 페이지와 자식 컨트롤) */
2686
+ TabItems?: any[];
2687
+ }
2688
+
2689
+ // ============================================
2690
+ // Slider Element
2691
+ // ============================================
2692
+
2693
+ /**
2694
+ * 슬라이더 컨트롤 인터페이스
2695
+ * 범위 값을 슬라이더로 선택하는 컨트롤입니다.
2696
+ */
2697
+ export interface ISliderElement extends IBaseElement {
2698
+ Type: 'Slider';
2699
+ /** 데이터소스 이름 */
2700
+ DataSource?: string;
2701
+ /** 슬라이더 설정 정보 */
2702
+ SliderInfo?: {
2703
+ /** 읽기 전용 여부 */
2704
+ IsReadOnly?: boolean;
2705
+ /** 그리드 간격 */
2706
+ Grid?: number;
2707
+ /** 이동 단위 */
2708
+ Step?: number;
2709
+ /** 표시 포맷 */
2710
+ Format?: string;
2711
+ /** 슬라이더 타입 */
2712
+ Type?: string;
2713
+ };
2714
+ /** 데이터소스 범위 정보 */
2715
+ DataSourceInfo?: {
2716
+ /** 최소값 */
2717
+ Min?: number;
2718
+ /** 최대값 */
2719
+ Max?: number;
2720
+ /** 시작값 */
2721
+ From?: number;
2722
+ /** 종료값 */
2723
+ To?: number;
2724
+ };
2725
+ }
2726
+
2727
+ // ============================================
2728
+ // ColorSelector Element
2729
+ // ============================================
2730
+
2731
+ /**
2732
+ * 색상 선택기 컨트롤 인터페이스
2733
+ * @see src/control/ColorSelector.ts
2734
+ */
2735
+ export interface IColorSelectorElement extends IBaseElement {
2736
+ Type: 'ColorSelector';
2737
+ /** 색상 값 (hex) */
2738
+ ColorValue?: string;
2739
+ /** 버튼 표시 여부 */
2740
+ ShowButton?: boolean;
2741
+ }
2742
+
2743
+ // ============================================
2744
+ // FileUploadButton Element
2745
+ // ============================================
2746
+
2747
+ /**
2748
+ * 파일 업로드 버튼 컨트롤 인터페이스
2749
+ * 파일 업로드 기능을 가진 버튼 컨트롤입니다.
2750
+ */
2751
+ export interface IFileUploadButtonElement extends IBaseElement {
2752
+ Type: 'FileUploadButton';
2753
+ /** 버튼 텍스트 */
2754
+ Value?: string;
2755
+ /** 마우스 커서 스타일 */
2756
+ Cursor?: string;
2757
+ /** 허용 파일 확장자 (예: ".xlsx,.csv") */
2758
+ AllowExt?: string;
2759
+ /** 업로드 크기 제한 (bytes) */
2760
+ SaveLimitSize?: number;
2761
+ /** 저장 폴더명 */
2762
+ SaveFolderName?: string;
2763
+ }
2764
+
2765
+ // ============================================
2766
+ // PickList Element
2767
+ // ============================================
2768
+
2769
+ /**
2770
+ * 픽리스트 컨트롤 인터페이스
2771
+ * 팝업 창에서 항목을 선택하는 컨트롤입니다.
2772
+ * @see src/control/combobox/PickList.ts
2773
+ */
2774
+ export interface IPickListElement extends IBaseElement {
2775
+ Type: 'PickList';
2776
+ /** 읽기 전용 여부 */
2777
+ IsReadOnly?: boolean;
2778
+ /** 새로고침 후 호출할 함수명 */
2779
+ AfterRefresh?: string;
2780
+ /** 팝업 너비 (px) */
2781
+ DialogWidth?: number;
2782
+ /** 팝업 높이 (px) */
2783
+ DialogHeight?: number;
2784
+ }
2785
+
2786
+ // ============================================
2787
+ // WebContainer Element
2788
+ // ============================================
2789
+
2790
+ /**
2791
+ * 웹 컨테이너 컨트롤 인터페이스
2792
+ * 외부 URL을 iframe으로 표시하는 컨트롤입니다.
2793
+ */
2794
+ export interface IWebContainerElement extends IBaseElement {
2795
+ Type: 'WebContainer';
2796
+ /** 대상 URL */
2797
+ TargetURL?: string;
2798
+ /** 보고서 로딩 시 자동 로딩 여부 */
2799
+ AutoRefresh?: boolean;
2800
+ /** 수동 새로고침 버튼 표시 여부 */
2801
+ DoRefresh?: boolean;
2802
+ }
2803
+
2342
2804
  // ============================================
2343
2805
  // Union Type for all Elements
2344
2806
  // ============================================
@@ -2356,10 +2818,24 @@ export type IElement =
2356
2818
  | IRichTextBoxElement
2357
2819
  | ICheckBoxElement
2358
2820
  | IComboBoxElement
2821
+ | IMultiComboBoxElement
2359
2822
  | ITextBoxElement
2360
2823
  | INumberBoxElement
2361
2824
  | IUserComponentElement
2362
2825
  | IOlapGridElement
2826
+ | IRadioButtonElement
2827
+ | IMaskTextBoxElement
2828
+ | ICalendarElement
2829
+ | IChartElement
2830
+ | ITreeGridElement
2831
+ | IiGridElement
2832
+ | ITableLayoutElement
2833
+ | ITabElement
2834
+ | ISliderElement
2835
+ | IColorSelectorElement
2836
+ | IFileUploadButtonElement
2837
+ | IPickListElement
2838
+ | IWebContainerElement
2363
2839
  | IBaseElement;
2364
2840
 
2365
2841
  // ============================================
@@ -2415,6 +2891,20 @@ export function isCheckBoxElement(element: IElement): element is ICheckBoxElemen
2415
2891
  return element.Type === 'CheckBox';
2416
2892
  }
2417
2893
 
2894
+ /**
2895
+ * ComboBox 타입 가드
2896
+ */
2897
+ export function isComboBoxElement(element: IElement): element is IComboBoxElement {
2898
+ return element.Type === 'ComboBox';
2899
+ }
2900
+
2901
+ /**
2902
+ * MultiComboBox 타입 가드
2903
+ */
2904
+ export function isMultiComboBoxElement(element: IElement): element is IMultiComboBoxElement {
2905
+ return element.Type === 'MultiComboBox';
2906
+ }
2907
+
2418
2908
  /**
2419
2909
  * UserComponent (ReportContainer) 타입 가드
2420
2910
  */
@@ -2428,3 +2918,95 @@ export function isUserComponentElement(element: IElement): element is IUserCompo
2428
2918
  export function isOlapGridElement(element: IElement): element is IOlapGridElement {
2429
2919
  return element.Type === 'OlapGrid';
2430
2920
  }
2921
+
2922
+ /**
2923
+ * RadioButton 타입 가드
2924
+ */
2925
+ export function isRadioButtonElement(element: IElement): element is IRadioButtonElement {
2926
+ return element.Type === 'RadioButton';
2927
+ }
2928
+
2929
+ /**
2930
+ * MaskTextBox 타입 가드
2931
+ */
2932
+ export function isMaskTextBoxElement(element: IElement): element is IMaskTextBoxElement {
2933
+ return element.Type === 'MaskTextBox';
2934
+ }
2935
+
2936
+ /**
2937
+ * Calendar 타입 가드 (Calendar, CalendarYear, CalendarYM)
2938
+ */
2939
+ export function isCalendarElement(element: IElement): element is ICalendarElement {
2940
+ return element.Type === 'Calendar' || element.Type === 'CalendarYear' || element.Type === 'CalendarYM'
2941
+ || element.Type === 'CalendarFromTo' || element.Type === 'CalendarWeeklyFromTo';
2942
+ }
2943
+
2944
+ /**
2945
+ * Chart 타입 가드 (Chart, PieChart, ScatterChart, PolygonChart)
2946
+ */
2947
+ export function isChartElement(element: IElement): element is IChartElement {
2948
+ return element.Type === 'Chart' || element.Type === 'PieChart' || element.Type === 'ScatterChart' || element.Type === 'PolygonChart';
2949
+ }
2950
+
2951
+ /**
2952
+ * TreeGrid 타입 가드
2953
+ */
2954
+ export function isTreeGridElement(element: IElement): element is ITreeGridElement {
2955
+ return element.Type === 'TreeGrid';
2956
+ }
2957
+
2958
+ /**
2959
+ * iGrid (MX-GRID) 타입 가드
2960
+ */
2961
+ export function isiGridElement(element: IElement): element is IiGridElement {
2962
+ return element.Type === 'iGrid';
2963
+ }
2964
+
2965
+ /**
2966
+ * TableLayout 타입 가드
2967
+ */
2968
+ export function isTableLayoutElement(element: IElement): element is ITableLayoutElement {
2969
+ return element.Type === 'TableLayout';
2970
+ }
2971
+
2972
+ /**
2973
+ * Tab 타입 가드
2974
+ */
2975
+ export function isTabElement(element: IElement): element is ITabElement {
2976
+ return element.Type === 'Tab';
2977
+ }
2978
+
2979
+ /**
2980
+ * Slider 타입 가드
2981
+ */
2982
+ export function isSliderElement(element: IElement): element is ISliderElement {
2983
+ return element.Type === 'Slider';
2984
+ }
2985
+
2986
+ /**
2987
+ * ColorSelector 타입 가드
2988
+ */
2989
+ export function isColorSelectorElement(element: IElement): element is IColorSelectorElement {
2990
+ return element.Type === 'ColorSelector';
2991
+ }
2992
+
2993
+ /**
2994
+ * FileUploadButton 타입 가드
2995
+ */
2996
+ export function isFileUploadButtonElement(element: IElement): element is IFileUploadButtonElement {
2997
+ return element.Type === 'FileUploadButton';
2998
+ }
2999
+
3000
+ /**
3001
+ * PickList 타입 가드
3002
+ */
3003
+ export function isPickListElement(element: IElement): element is IPickListElement {
3004
+ return element.Type === 'PickList';
3005
+ }
3006
+
3007
+ /**
3008
+ * WebContainer 타입 가드
3009
+ */
3010
+ export function isWebContainerElement(element: IElement): element is IWebContainerElement {
3011
+ return element.Type === 'WebContainer';
3012
+ }
@@ -183,15 +183,14 @@
183
183
  "Label", "Button", "Image",
184
184
  "TextBox", "MaskTextBox", "NumberBox", "RichTextBox",
185
185
  "ComboBox", "MultiComboBox", "PickList",
186
- "CheckBox", "RadioButton", "Tree",
187
- "ColorSelector", "Slider",
188
- "Calendar", "CalendarYear", "CalendarYM",
189
- "FileUploadButton",
190
- "DataGrid", "TreeGrid", "OlapGrid", "iGrid", "CompactDataGrid",
191
- "TreeView",
186
+ "CheckBox", "RadioButton", "Tree", "TreeView",
187
+ "ColorPicker", "ColorSelector", "Slider",
188
+ "Calendar", "CalendarYear", "CalendarYM", "CalendarFromTo", "CalendarWeeklyFromTo",
189
+ "FileUpload", "FileUploadButton",
190
+ "DataGrid", "TreeGrid", "OlapGrid", "iGrid", "CompactDataGrid", "ListGrid",
192
191
  "Chart", "PieChart", "ScatterChart", "PolygonChart",
193
192
  "Group", "Tab", "TableLayout", "AddIn", "UserComponent",
194
- "WebContainer", "DiagramControl", "Slicer"
193
+ "Browser", "WebContainer", "DiagramControl", "Slicer"
195
194
  ],
196
195
  "description": "컨트롤 타입"
197
196
  },
@@ -332,6 +331,14 @@
332
331
  {
333
332
  "if": { "properties": { "Type": { "const": "PickList" } } },
334
333
  "then": { "$ref": "#/$defs/PickListElement" }
334
+ },
335
+ {
336
+ "if": { "properties": { "Type": { "const": "CalendarFromTo" } } },
337
+ "then": { "$ref": "#/$defs/CalendarElement" }
338
+ },
339
+ {
340
+ "if": { "properties": { "Type": { "const": "CalendarWeeklyFromTo" } } },
341
+ "then": { "$ref": "#/$defs/CalendarElement" }
335
342
  }
336
343
  ]
337
344
  },
@@ -584,9 +591,9 @@
584
591
  "properties": {
585
592
  "DataSource": { "type": "string", "description": "바인딩할 데이터소스 이름" },
586
593
  "ServerScript": { "type": "string", "description": "서버 스크립트 이름" },
587
- "AutoRefresh": { "type": "boolean", "description": "데이터 자동 새로고침 여부" },
594
+ "AutoRefresh": { "type": "boolean", "description": "보고서 로딩 시 데이터 조회 여부" },
588
595
  "DoRefresh": { "type": "boolean", "description": "수동 새로고침 버튼 표시 여부" },
589
- "DoExport": { "type": "boolean", "description": "내보내기 버튼 표시 여부" },
596
+ "DoExport": { "type": "boolean", "description": "파일 내보내기(다운로드) 가능 여부" },
590
597
  "iOLAPView": { "$ref": "#/$defs/OlapViewModel", "description": "iOLAP 뷰 모델 직렬화 데이터" },
591
598
  "ExtraOption": { "$ref": "#/$defs/OlapGridExtraOption", "description": "OLAP 그리드 추가 옵션" }
592
599
  }