@opsnow-mcp/opsnow-mcp-common-ui-server 1.0.21 → 1.0.23
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.
- package/build/components/data/icon-names.js +129 -0
- package/build/components/examples/opsnow-common-calendar-examples-data.js +48 -0
- package/build/components/examples/opsnow-common-chart-examples-data.js +6843 -0
- package/build/components/examples/opsnow-common-data-status-examples-data.js +65 -0
- package/build/components/examples/opsnow-common-file-upload-examples-data.js +95 -0
- package/build/components/examples/opsnow-common-forms-examples-data.js +1715 -0
- package/build/components/examples/opsnow-common-grid-examples-data.js +2389 -0
- package/build/components/examples/opsnow-common-icons-examples-data.js +72 -0
- package/build/components/examples/opsnow-common-layout-examples-data.js +97 -0
- package/build/components/examples/opsnow-common-notification-examples-data.js +78 -0
- package/build/components/examples/opsnow-common-pagination-examples-data.js +82 -0
- package/build/components/examples/opsnow-common-popup-examples-data.js +205 -0
- package/build/components/examples/opsnow-common-progress-examples-data.js +86 -0
- package/build/components/examples/opsnow-common-select-examples-data.js +131 -0
- package/build/components/examples/opsnow-common-stepper-examples-data.js +180 -0
- package/build/components/examples/opsnow-common-storage-examples-data.js +8 -0
- package/build/components/examples/opsnow-common-tab-examples-data.js +87 -0
- package/build/components/examples/opsnow-common-toast-popup-examples-data.js +129 -0
- package/build/components/examples/opsnow-common-tooltip-examples-data.js +80 -0
- package/build/components/examples/opsnow-common-typography-examples-data.js +366 -0
- package/build/components/opsnow-common-calendar.js +228 -0
- package/build/components/opsnow-common-chart.js +1643 -0
- package/build/components/opsnow-common-data-status.js +116 -0
- package/build/components/opsnow-common-examples.js +109 -0
- package/build/components/opsnow-common-file-upload.js +57 -0
- package/build/components/opsnow-common-forms.js +1009 -0
- package/build/components/opsnow-common-grid.js +352 -0
- package/build/components/opsnow-common-icons.js +139 -0
- package/build/components/opsnow-common-layout.js +141 -0
- package/build/components/opsnow-common-notification.js +110 -0
- package/build/components/opsnow-common-pagination.js +164 -0
- package/build/components/opsnow-common-popup.js +71 -0
- package/build/components/opsnow-common-progress.js +177 -0
- package/build/components/opsnow-common-select.js +135 -0
- package/build/components/opsnow-common-stepper.js +72 -0
- package/build/components/opsnow-common-tab.js +111 -0
- package/build/components/opsnow-common-toast-popup.js +135 -0
- package/build/components/opsnow-common-tooltip.js +204 -0
- package/build/components/opsnow-common-typography.js +93 -0
- package/build/index.js +135 -0
- package/package.json +1 -1
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { IconNamesMap, generateIconDescription } from "./data/icon-names.js";
|
|
3
|
+
// DataStatus 컴포넌트 관련 스키마 정의
|
|
4
|
+
export const DataStatusSchema = z.object({
|
|
5
|
+
headline: z
|
|
6
|
+
.string()
|
|
7
|
+
.optional()
|
|
8
|
+
.describe("데이터 상태 아이콘 위에 크게 보이는 헤드라인 메시지"),
|
|
9
|
+
type: z
|
|
10
|
+
.enum(["loading", "noData", "noSearchResults", "withAction", "error"])
|
|
11
|
+
.describe("데이터 상태 및 화면에 노출 되어야하는 데이터 상태 타입"),
|
|
12
|
+
title: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("데이터 상태 아이콘 아래에서 크게 보이는 제목 메시지"),
|
|
16
|
+
useMuiIcon: z.boolean().default(false).describe("MUI 아이콘 사용 여부"),
|
|
17
|
+
description: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("제목 아래 작게 보이는 자세한 설명(데이터 상태 메시지)"),
|
|
21
|
+
iconName: z.string().optional().describe("아이콘 이름"),
|
|
22
|
+
buttonProps: z
|
|
23
|
+
.object({
|
|
24
|
+
label: z.string().describe("버튼 라벨"),
|
|
25
|
+
disabled: z.boolean().default(true).describe("버튼 활성화 여부"),
|
|
26
|
+
action: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("버튼 클릭 시 실행할 함수(기존 onConfirm () => void 오버라이드)"),
|
|
30
|
+
size: z
|
|
31
|
+
.enum(["small", "medium", "large"])
|
|
32
|
+
.default("large")
|
|
33
|
+
.describe("버튼 크기"),
|
|
34
|
+
muiIconName: z.string().optional().describe("MUI 아이콘 이름"),
|
|
35
|
+
iconName: z
|
|
36
|
+
.enum(Object.keys(IconNamesMap))
|
|
37
|
+
.describe(generateIconDescription({ format: "nested" }))
|
|
38
|
+
.optional()
|
|
39
|
+
.describe("아이콘 이름"),
|
|
40
|
+
iconPosition: z.enum(["right", "left"]).describe("버튼 위치"),
|
|
41
|
+
})
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("버튼 속성"),
|
|
44
|
+
}).describe("데이터 상태 컴포넌트 - createIconsComponent에서 iconName을 반드시 참조하여 string으로 입력");
|
|
45
|
+
// DataStatus 컴포넌트 함수 - 배열 반환
|
|
46
|
+
export function createDataStatusComponent() {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
name: "createDataStatus",
|
|
50
|
+
description: `데이터 상태 컴포넌트 - 로딩, 성공, 에러, no Data, 검색 결과 없음 상태 표시
|
|
51
|
+
**style 적용 시:**
|
|
52
|
+
div에 style 적용 보다는 mui/material의 Box, Stack, Typography 컴포넌트를 사용하여 스타일을 적용하는 것을 권장합니다.
|
|
53
|
+
**버튼 액션 적용 시:**
|
|
54
|
+
버튼 클릭 시 실행할 onConfirm 함수를 미리 정의한 후, buttonProps에서 참조하여 사용합니다.
|
|
55
|
+
onConfirm은 콜백 함수이므로 사용자가 직접 구현해서 전달해야 합니다.
|
|
56
|
+
사용 예시: buttonProps={{onConfirm, label: "Add AWS Account", iconName: "ArrowRight"}}
|
|
57
|
+
**import:**
|
|
58
|
+
\`\`\`javascript
|
|
59
|
+
import { useCommonComponents } from '@opsnow-common/opsnow-finops-common-ui-loader';
|
|
60
|
+
const { OpsnowCommonDataStatus } = useCommonComponents();
|
|
61
|
+
\`\`\``,
|
|
62
|
+
parameters: DataStatusSchema,
|
|
63
|
+
handler: async (args) => {
|
|
64
|
+
// 데이터 상태 컴포넌트 로직 구현
|
|
65
|
+
let functionDefinitions = "";
|
|
66
|
+
if (args.type === "withAction") {
|
|
67
|
+
functionDefinitions += `
|
|
68
|
+
const onConfirm = () => {
|
|
69
|
+
${args.buttonProps?.action ? args.buttonProps.action : ""}
|
|
70
|
+
}`;
|
|
71
|
+
}
|
|
72
|
+
// OpsnowCommonDataStatus Props 생성
|
|
73
|
+
const dataStatusProps = [];
|
|
74
|
+
if (args.type)
|
|
75
|
+
dataStatusProps.push(`type="${args.type}"`);
|
|
76
|
+
if (args.title)
|
|
77
|
+
dataStatusProps.push(`title="${args.title}"`);
|
|
78
|
+
if (args.description)
|
|
79
|
+
dataStatusProps.push(`description={${args.description}}`);
|
|
80
|
+
if (args.iconName)
|
|
81
|
+
dataStatusProps.push(`iconName="${args.iconName}"`);
|
|
82
|
+
if (args.buttonProps) {
|
|
83
|
+
const buttonProps = [];
|
|
84
|
+
if (args.buttonProps.action) {
|
|
85
|
+
buttonProps.push(`onConfirm`);
|
|
86
|
+
}
|
|
87
|
+
if (args.buttonProps.label)
|
|
88
|
+
buttonProps.push(`label: "${args.buttonProps.label}"`);
|
|
89
|
+
if (args.buttonProps.size)
|
|
90
|
+
buttonProps.push(`size: "${args.buttonProps.size}"`);
|
|
91
|
+
if (!args.buttonProps.disabled)
|
|
92
|
+
buttonProps.push(`disabled: ${!args.buttonProps.disabled}`);
|
|
93
|
+
if (args.buttonProps.muiIconName)
|
|
94
|
+
buttonProps.push(`muiIconName: "${args.buttonProps.muiIconName}"`);
|
|
95
|
+
if (args.buttonProps.iconName)
|
|
96
|
+
buttonProps.push(`iconName: "${args.buttonProps.iconName}"`);
|
|
97
|
+
if (args.buttonProps.iconPosition)
|
|
98
|
+
buttonProps.push(`iconPosition: "${args.buttonProps.iconPosition}"`);
|
|
99
|
+
if (buttonProps.length > 0) {
|
|
100
|
+
dataStatusProps.push(`buttonProps={{${buttonProps.join(", ")}}}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
let dataStatusCode = `<OpsnowCommonDataStatus ${dataStatusProps.join(" ")} />`;
|
|
104
|
+
const code = `${functionDefinitions}\n${dataStatusCode}`;
|
|
105
|
+
return {
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: "text",
|
|
109
|
+
text: `\`\`\`jsx\n${code}\n\`\`\``,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ButtonExamples, BadgeExamples, TextareaExamples, SwitchExamples, ChipExamples, TextFieldExamples, AvatarExamples, CheckboxExamples, RadioGroupExamples, CollapseExamples, SliderExamples, LinkExamples, TreeViewExamples, InsightCardExamples, InsightContentExamples, ToggleButtonExamples } from "./examples/opsnow-common-forms-examples-data.js";
|
|
2
|
+
import { IconExamples, MuiIconExamples } from "./examples/opsnow-common-icons-examples-data.js";
|
|
3
|
+
import { CalendarExamples } from "./examples/opsnow-common-calendar-examples-data.js";
|
|
4
|
+
import { GaugeChartExamples, PieChartExamples, BarChartExamples, LineChartExamples, StackChartExamples, XyMultiChartExamples } from "./examples/opsnow-common-chart-examples-data.js";
|
|
5
|
+
import { TooltipExamples } from "./examples/opsnow-common-tooltip-examples-data.js";
|
|
6
|
+
import { DataGridExamples } from "./examples/opsnow-common-grid-examples-data.js";
|
|
7
|
+
import { PopupExamples } from "./examples/opsnow-common-popup-examples-data.js";
|
|
8
|
+
import { StepperExamples } from "./examples/opsnow-common-stepper-examples-data.js";
|
|
9
|
+
import { StorageExamples } from "./examples/opsnow-common-storage-examples-data.js";
|
|
10
|
+
import { SelectExamples } from "./examples/opsnow-common-select-examples-data.js";
|
|
11
|
+
import { FileUploaderExamples } from "./examples/opsnow-common-file-upload-examples-data.js";
|
|
12
|
+
import { NotificationExamples } from "./examples/opsnow-common-notification-examples-data.js";
|
|
13
|
+
import { PaginationExamples } from "./examples/opsnow-common-pagination-examples-data.js";
|
|
14
|
+
import { DataStatusExamples } from "./examples/opsnow-common-data-status-examples-data.js";
|
|
15
|
+
import { ProgressExamples } from "./examples/opsnow-common-progress-examples-data.js";
|
|
16
|
+
import { TabExamples } from "./examples/opsnow-common-tab-examples-data.js";
|
|
17
|
+
import { GridLayoutExamples, MegaFilterExamples } from "./examples/opsnow-common-layout-examples-data.js";
|
|
18
|
+
import { TypographyExamples } from "./examples/opsnow-common-typography-examples-data.js";
|
|
19
|
+
import { AutocompleteExamples } from "./examples/opsnow-common-select-examples-data.js";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
const EXAMPLES_MAP = {
|
|
22
|
+
Button: ButtonExamples,
|
|
23
|
+
Badge: BadgeExamples,
|
|
24
|
+
Textarea: TextareaExamples,
|
|
25
|
+
Switch: SwitchExamples,
|
|
26
|
+
Chip: ChipExamples,
|
|
27
|
+
TextField: TextFieldExamples,
|
|
28
|
+
Avatar: AvatarExamples,
|
|
29
|
+
Checkbox: CheckboxExamples,
|
|
30
|
+
RadioGroup: RadioGroupExamples,
|
|
31
|
+
Collapse: CollapseExamples,
|
|
32
|
+
Slider: SliderExamples,
|
|
33
|
+
Link: LinkExamples,
|
|
34
|
+
TreeView: TreeViewExamples,
|
|
35
|
+
InsightCard: InsightCardExamples,
|
|
36
|
+
InsightContent: InsightContentExamples,
|
|
37
|
+
ToggleButtonGroup: ToggleButtonExamples,
|
|
38
|
+
Icon: IconExamples,
|
|
39
|
+
MuiIcon: MuiIconExamples,
|
|
40
|
+
Calendar: CalendarExamples,
|
|
41
|
+
GaugeChart: GaugeChartExamples,
|
|
42
|
+
PieChart: PieChartExamples,
|
|
43
|
+
BarChart: BarChartExamples,
|
|
44
|
+
LineChart: LineChartExamples,
|
|
45
|
+
StackChart: StackChartExamples,
|
|
46
|
+
XyMultiChart: XyMultiChartExamples,
|
|
47
|
+
Tooltip: TooltipExamples,
|
|
48
|
+
DataGrid: DataGridExamples,
|
|
49
|
+
Popup: PopupExamples,
|
|
50
|
+
Stepper: StepperExamples,
|
|
51
|
+
Storage: StorageExamples,
|
|
52
|
+
Select: SelectExamples,
|
|
53
|
+
FileUploader: FileUploaderExamples,
|
|
54
|
+
Notification: NotificationExamples,
|
|
55
|
+
Pagination: PaginationExamples,
|
|
56
|
+
DataStatus: DataStatusExamples,
|
|
57
|
+
Progress: ProgressExamples,
|
|
58
|
+
Tab: TabExamples,
|
|
59
|
+
GridLayout: GridLayoutExamples,
|
|
60
|
+
MegaFilter: MegaFilterExamples,
|
|
61
|
+
Typography: TypographyExamples,
|
|
62
|
+
Autocomplete: AutocompleteExamples,
|
|
63
|
+
};
|
|
64
|
+
export const UIExamplesSchema = z.object({
|
|
65
|
+
uiType: z
|
|
66
|
+
.enum(Object.keys(EXAMPLES_MAP))
|
|
67
|
+
.describe(`UI 컴포넌트 예제명 (예: 'Button', 'Icon') 호출 가능한 예제 항목: ${Object.keys(EXAMPLES_MAP).join(", ")}`)
|
|
68
|
+
});
|
|
69
|
+
export function createCommonExamplesComponent() {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
name: "getUIExamples",
|
|
73
|
+
description: `OpsNow 공통 UI 컴포넌트 예제 목록을 반환합니다.
|
|
74
|
+
uiType: string (예: 'Button', 'Icon')
|
|
75
|
+
호출 가능한 예제 항목: ${Object.keys(EXAMPLES_MAP).join(', ')}
|
|
76
|
+
uiType은 필수값입니다.`,
|
|
77
|
+
parameters: UIExamplesSchema,
|
|
78
|
+
handler: async (args) => {
|
|
79
|
+
// 허용된 key만 있는지 검사
|
|
80
|
+
const allowedKeys = ["uiType"];
|
|
81
|
+
const extraKeys = Object.keys(args).filter(k => !allowedKeys.includes(k));
|
|
82
|
+
if (extraKeys.length > 0) {
|
|
83
|
+
return { content: [], error: `허용되지 않은 파라미터가 포함되어 있습니다: ${extraKeys.join(", ")}` };
|
|
84
|
+
}
|
|
85
|
+
const type = args.uiType;
|
|
86
|
+
if (!type) {
|
|
87
|
+
return { content: [] };
|
|
88
|
+
}
|
|
89
|
+
// 단일 예제만 반환
|
|
90
|
+
const result = [];
|
|
91
|
+
const examples = EXAMPLES_MAP[type];
|
|
92
|
+
if (examples) {
|
|
93
|
+
for (const example of examples) {
|
|
94
|
+
result.push({
|
|
95
|
+
type: "text",
|
|
96
|
+
text: `**${example.title}** 예제:\n` +
|
|
97
|
+
"```jsx\n" +
|
|
98
|
+
`${example.code}\n` +
|
|
99
|
+
"```\n" +
|
|
100
|
+
`${'code_props_usage' in example && example.code_props_usage ? `\n**속성 사용 예제:**\n\`\`\`jsx\n${example.code_props_usage}\n\`\`\`\n` : ''}` +
|
|
101
|
+
`${example.description}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { content: result };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// FileUploader 컴포넌트 관련 스키마 정의
|
|
3
|
+
export const FileUploaderSchema = z.object({
|
|
4
|
+
accept: z.record(z.string(), z.array(z.string())).optional().describe("허용할 파일 타입 (예: { 'application/pdf': ['.pdf'] })"),
|
|
5
|
+
multiple: z.boolean().optional().default(false).describe("다중 파일 업로드 가능 여부"),
|
|
6
|
+
targetUrl: z.string().optional().describe("업로드 대상 URL"),
|
|
7
|
+
disabled: z.boolean().optional().default(false).describe("비활성화 여부"),
|
|
8
|
+
helperText: z.string().optional().describe("도움말 텍스트"),
|
|
9
|
+
fileNotSelectedText: z.string().optional().describe("파일 미선택 시 텍스트"),
|
|
10
|
+
fileSizeEmptyText: z.string().optional().describe("파일 크기 없음 텍스트"),
|
|
11
|
+
fileUploadFailText: z.string().optional().describe("업로드 실패 텍스트"),
|
|
12
|
+
invalidFileFormatText: z.string().optional().describe("잘못된 포맷 텍스트"),
|
|
13
|
+
loadingText: z.string().optional().describe("로딩 텍스트"),
|
|
14
|
+
browseText: z.string().optional().describe("찾아보기 버튼 텍스트"),
|
|
15
|
+
placeholder: z.string().optional().describe("플레이스홀더 텍스트"),
|
|
16
|
+
onChange: z.string().optional().describe("onChange 핸들러 함수명"),
|
|
17
|
+
});
|
|
18
|
+
// FileUploader MCP 툴 함수 - Stepper MCP 툴 구조 참고
|
|
19
|
+
export function createFileUploaderComponent() {
|
|
20
|
+
return [
|
|
21
|
+
{
|
|
22
|
+
name: "createFileUploader",
|
|
23
|
+
description: `파일 업로더 컴포넌트 - 파일 선택 및 업로드 기능
|
|
24
|
+
|
|
25
|
+
**import 예시(React의 모든 훅(useState, useEffect, useCommonComponents 등)은 반드시 함수 컴포넌트 내부에서 호출):**
|
|
26
|
+
\`\`\`javascript
|
|
27
|
+
import { useCommonComponents } from '@opsnow-common/opsnow-finops-common-ui-loader';
|
|
28
|
+
const { OpsnowCommonFileUploader } = useCommonComponents();
|
|
29
|
+
\`\`\``,
|
|
30
|
+
parameters: FileUploaderSchema,
|
|
31
|
+
handler: async (args) => {
|
|
32
|
+
// props 변환
|
|
33
|
+
const propList = Object.entries(args)
|
|
34
|
+
.filter(([_, v]) => v !== undefined)
|
|
35
|
+
.map(([k, v]) => {
|
|
36
|
+
if (typeof v === 'string')
|
|
37
|
+
return `${k}="${v}"`;
|
|
38
|
+
if (typeof v === 'boolean')
|
|
39
|
+
return v ? `${k}` : '';
|
|
40
|
+
if (typeof v === 'object')
|
|
41
|
+
return `${k}={${JSON.stringify(v)}}`;
|
|
42
|
+
return '';
|
|
43
|
+
})
|
|
44
|
+
.filter(Boolean);
|
|
45
|
+
const code = `<OpsnowCommonFileUploader\n ${propList.join('\n ')}\n/>`;
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: `\`\`\`jsx\n${code}\n\`\`\``
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
}
|