@opsnow-mcp/opsnow-mcp-common-ui-server 1.0.28 → 1.0.30
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/all-component-tools.js +45 -0
- package/build/components/examples/opsnow-common-select-examples-data.js +21 -0
- package/build/components/opsnow-common-calendar.js +11 -12
- package/build/components/opsnow-common-chart.js +433 -17
- package/build/components/opsnow-common-coach-mark.js +9 -2
- package/build/components/opsnow-common-data-status.js +0 -5
- package/build/components/opsnow-common-examples.js +113 -29
- package/build/components/opsnow-common-file-upload.js +1 -0
- package/build/components/opsnow-common-forms.js +82 -3
- package/build/components/opsnow-common-icons.js +2 -5
- package/build/components/opsnow-common-notification.js +6 -4
- package/build/components/opsnow-common-pagination.js +9 -6
- package/build/components/opsnow-common-popup.js +30 -9
- package/build/components/opsnow-common-select.js +23 -7
- package/build/components/opsnow-common-spec-tools.js +166 -0
- package/build/components/opsnow-common-stepper.js +5 -8
- package/build/components/opsnow-common-toast-popup.js +29 -17
- package/build/components/opsnow-common-tooltip.js +0 -6
- package/build/components/opsnow-common-typography.js +6 -0
- package/build/components/opsnow-common-validate-props.js +0 -0
- package/build/index.js +33 -51
- package/build/validate-props-cli.js +71 -0
- package/package.json +5 -2
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// createXxx 툴 정의 수집 (서버 index.ts와 validate-props CLI가 공용)
|
|
2
|
+
// 새 컴포넌트 파일 추가 시 여기에만 팩토리를 등록하면 서버/CLI 모두 반영된다.
|
|
3
|
+
import { createCalendarComponent } from "./opsnow-common-calendar.js";
|
|
4
|
+
import { createChartComponent } from "./opsnow-common-chart.js";
|
|
5
|
+
import { createDataGridComponent } from "./opsnow-common-grid.js";
|
|
6
|
+
import { createFormsComponent } from "./opsnow-common-forms.js";
|
|
7
|
+
import { createDataStatusComponent } from "./opsnow-common-data-status.js";
|
|
8
|
+
import { createProgressComponent } from "./opsnow-common-progress.js";
|
|
9
|
+
import { createNotificationComponent } from "./opsnow-common-notification.js";
|
|
10
|
+
import { createPaginationComponent } from "./opsnow-common-pagination.js";
|
|
11
|
+
import { createIconsComponent } from "./opsnow-common-icons.js";
|
|
12
|
+
import { createTabComponent } from "./opsnow-common-tab.js";
|
|
13
|
+
import { createGridLayoutComponent } from "./opsnow-common-layout.js";
|
|
14
|
+
import { createTypographyComponent } from "./opsnow-common-typography.js";
|
|
15
|
+
import { createTooltipComponent } from "./opsnow-common-tooltip.js";
|
|
16
|
+
import { createCoachMarkComponent } from "./opsnow-common-coach-mark.js";
|
|
17
|
+
import { createSelectComponent } from "./opsnow-common-select.js";
|
|
18
|
+
import { createPopupComponent } from "./opsnow-common-popup.js";
|
|
19
|
+
import { createStepperComponent } from "./opsnow-common-stepper.js";
|
|
20
|
+
import { createToastPopupComponent } from "./opsnow-common-toast-popup.js";
|
|
21
|
+
import { createFileUploaderComponent } from "./opsnow-common-file-upload.js";
|
|
22
|
+
const componentFactories = [
|
|
23
|
+
createCalendarComponent,
|
|
24
|
+
createChartComponent,
|
|
25
|
+
createDataGridComponent,
|
|
26
|
+
createFormsComponent,
|
|
27
|
+
createIconsComponent,
|
|
28
|
+
createDataStatusComponent,
|
|
29
|
+
createProgressComponent,
|
|
30
|
+
createNotificationComponent,
|
|
31
|
+
createPaginationComponent,
|
|
32
|
+
createTabComponent,
|
|
33
|
+
createGridLayoutComponent,
|
|
34
|
+
createTypographyComponent,
|
|
35
|
+
createTooltipComponent,
|
|
36
|
+
createCoachMarkComponent,
|
|
37
|
+
createSelectComponent,
|
|
38
|
+
createPopupComponent,
|
|
39
|
+
createStepperComponent,
|
|
40
|
+
createToastPopupComponent,
|
|
41
|
+
createFileUploaderComponent,
|
|
42
|
+
];
|
|
43
|
+
export function collectComponentTools() {
|
|
44
|
+
return componentFactories.flatMap(factory => factory());
|
|
45
|
+
}
|
|
@@ -127,5 +127,26 @@ export const AutocompleteExamples = [
|
|
|
127
127
|
title: 'Autocomplete - Placeholder only (no label)',
|
|
128
128
|
code: `<OpsnowCommonAutocomplete items={[{ value: '1', label: 'Option 1' }, { value: '2', label: 'Option 2' }, { value: '3', label: 'Option 3' }]} multiple={false} value={value} onChange={setValue} placeholder="Search..." />`,
|
|
129
129
|
description: 'label 없이 placeholder만 사용하는 오토컴플리트 예제입니다.'
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
title: 'Autocomplete - 긴 라벨 기본 동작 (드롭다운 자동 확장)',
|
|
133
|
+
code: `<FormControl sx={{ width: 200 }}>
|
|
134
|
+
<OpsnowCommonAutocomplete items={[{ value: '1', label: 'aws-prod-123456789012-ap-northeast-2-billing-account' }, { value: '2', label: 'gcp-organization-opsnow-cost-analytics-project' }, { value: '3', label: 'Short option' }]} multiple disableCloseOnSelect value={value} onChange={setValue} useCheckboxOption useSelectAll />
|
|
135
|
+
</FormControl>`,
|
|
136
|
+
description: '긴 라벨 기본 동작 예제입니다. 별도 prop 없이 사용하면 드롭다운이 옵션 라벨 폭에 맞게 넓어지고(최대 뷰포트 폭), 화면 오른쪽 공간이 부족하면 잘리는 대신 왼쪽으로 이동합니다. 드롭다운 너비 동작은 fitDropdownWidth, dropdownMaxWidth prop으로 제어합니다.'
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
title: 'Autocomplete - fitDropdownWidth (드롭다운을 입력 필드 폭에 고정)',
|
|
140
|
+
code: `<FormControl sx={{ width: 200 }}>
|
|
141
|
+
<OpsnowCommonAutocomplete items={[{ value: '1', label: 'aws-prod-123456789012-ap-northeast-2-billing-account' }, { value: '2', label: 'Short option' }]} multiple disableCloseOnSelect value={value} onChange={setValue} useCheckboxOption useSelectAll fitDropdownWidth />
|
|
142
|
+
</FormControl>`,
|
|
143
|
+
description: 'fitDropdownWidth prop을 주면 드롭다운이 입력 필드 폭에 고정되고 긴 라벨은 여러 줄로 줄바꿈됩니다. 좁은 레이아웃에서 드롭다운이 넓어지면 안 되는 곳에 사용하세요.'
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
title: 'Autocomplete - dropdownMaxWidth (확장 최대 너비 제한)',
|
|
147
|
+
code: `<FormControl sx={{ width: 200 }}>
|
|
148
|
+
<OpsnowCommonAutocomplete items={[{ value: '1', label: 'azure-subscription-9f8e7d6c-5b4a-3210-fedc-ba0987654321-management-group' }, { value: '2', label: 'Short option' }]} multiple disableCloseOnSelect value={value} onChange={setValue} useCheckboxOption useSelectAll dropdownMaxWidth={360} />
|
|
149
|
+
</FormControl>`,
|
|
150
|
+
description: 'dropdownMaxWidth prop으로 확장 최대 너비(px)를 지정하는 예제입니다. 드롭다운이 입력 필드보다 넓게 확장되되 지정한 너비(360px)로 제한되고, 그보다 긴 라벨은 줄바꿈됩니다.'
|
|
130
151
|
}
|
|
131
152
|
];
|
|
@@ -5,12 +5,8 @@ export const CalendarSchema = z.object({
|
|
|
5
5
|
type: z
|
|
6
6
|
.enum(["date", "dateRange", "dateTime", "dateTimeRange"])
|
|
7
7
|
.describe("단일 날짜, 날짜 범위, 날짜 + 시간 타입 중 선택"),
|
|
8
|
-
date: z
|
|
9
|
-
.enum(["month", "week", "day"])
|
|
10
|
-
.optional()
|
|
11
|
-
.describe("날짜 (YYYY-MM-DD 형식)"),
|
|
12
8
|
views: z
|
|
13
|
-
.array(z.enum(["month", "year", "
|
|
9
|
+
.array(z.enum(["month", "year", "day", "hours", "minutes", "seconds"]))
|
|
14
10
|
.optional()
|
|
15
11
|
.describe("캘린더 뷰 타입 (여러개 선택 가능)"),
|
|
16
12
|
activate: z
|
|
@@ -26,7 +22,7 @@ export const CalendarSchema = z.object({
|
|
|
26
22
|
useShortcuts: z
|
|
27
23
|
.boolean()
|
|
28
24
|
.optional()
|
|
29
|
-
.describe("쇼트컷 - 달력에서 자주 사용하는 날짜 범위를 빠르게 선택할 수 있는 원클릭 버튼들 표시 여부 (예: 오늘, 어제, 지난 7일, 이번 달 등)"),
|
|
25
|
+
.describe("쇼트컷 - 달력에서 자주 사용하는 날짜 범위를 빠르게 선택할 수 있는 원클릭 버튼들 표시 여부 (예: 오늘, 어제, 지난 7일, 이번 달 등). ⚠️ type이 'dateRange'일 때만 동작 (다른 타입에서는 무시됨)"),
|
|
30
26
|
customShortcuts: z
|
|
31
27
|
.array(z
|
|
32
28
|
.object({
|
|
@@ -58,7 +54,9 @@ export const CalendarSchema = z.object({
|
|
|
58
54
|
message: "Reset일 때는 num, direction 없이 사용하고, Months/Weeks/Days 때는 num과 direction을 모두 설정하세요.",
|
|
59
55
|
}))
|
|
60
56
|
.optional()
|
|
61
|
-
.describe("커스텀 쇼트컷 - 기본 쇼트컷 대신 사용자가 원하는 날짜 범위 버튼들을 직접 설정 (예: {num: 2, date: 'Months', direction: 'Last'}, {date: 'Reset'})"),
|
|
57
|
+
.describe("커스텀 쇼트컷 - 기본 쇼트컷 대신 사용자가 원하는 날짜 범위 버튼들을 직접 설정 (예: {num: 2, date: 'Months', direction: 'Last'}, {date: 'Reset'}). ⚠️ type이 'dateRange'일 때만 동작 (다른 타입에서는 무시됨)"),
|
|
58
|
+
locale: z.enum(["ko", "en", "ja", "zh"]).optional().describe("달력 표시 언어 로케일 ('ko' | 'en' | 'ja' | 'zh'). 생성 코드는 항상 i18n.getLocale()과 연동된 locale 상태를 자동 전달하므로 보통 지정 불필요. 특정 언어로 고정하려면 생성된 코드의 locale 값을 직접 수정"),
|
|
59
|
+
onChange: z.string().optional().describe("날짜 선택(변경) 시 호출되는 콜백 - 라이브러리 prop으로 (newValue, context) 인자를 받음. 생성 코드에 setSelectedDate 기반 onChange 핸들러가 항상 자동 포함되므로 보통 지정 불필요. 추가 로직은 생성된 onChange 내부에 덧붙이면 됨"),
|
|
62
60
|
});
|
|
63
61
|
// Calendar 컴포넌트 함수 - 배열 반환
|
|
64
62
|
export function createCalendarComponent() {
|
|
@@ -116,8 +114,9 @@ export function createCalendarComponent() {
|
|
|
116
114
|
return disabledDates.includes(date.format('YYYY-MM-DD'))
|
|
117
115
|
}\n`;
|
|
118
116
|
}
|
|
119
|
-
// 커스텀 쇼트컷 생성
|
|
120
|
-
|
|
117
|
+
// 커스텀 쇼트컷 생성 (useShortcuts/customShortcuts는 lib에서 dateRange 타입 전용)
|
|
118
|
+
const isDateRangeType = args.type === "dateRange";
|
|
119
|
+
if (isDateRangeType && args.customShortcuts && args.customShortcuts.length > 0) {
|
|
121
120
|
functionDefinitions += `const customShortcuts = [\n`;
|
|
122
121
|
args.customShortcuts.forEach((shortcut) => {
|
|
123
122
|
if (shortcut.date === "Reset") {
|
|
@@ -178,11 +177,11 @@ export function createCalendarComponent() {
|
|
|
178
177
|
props.push(`minDate={dayjs("${args.minDate}")}`);
|
|
179
178
|
if (args.maxDate)
|
|
180
179
|
props.push(`maxDate={dayjs("${args.maxDate}")}`);
|
|
181
|
-
// customShortcuts가 있으면 useShortcuts는 무조건 true
|
|
182
|
-
if (args.useShortcuts || args.customShortcuts) {
|
|
180
|
+
// customShortcuts가 있으면 useShortcuts는 무조건 true (dateRange 타입 전용)
|
|
181
|
+
if (isDateRangeType && (args.useShortcuts || args.customShortcuts)) {
|
|
183
182
|
props.push("useShortcuts");
|
|
184
183
|
}
|
|
185
|
-
if (args.customShortcuts)
|
|
184
|
+
if (isDateRangeType && args.customShortcuts)
|
|
186
185
|
props.push(`customShortcuts={customShortcuts}`);
|
|
187
186
|
props.push(`locale={locale}`);
|
|
188
187
|
if (args.views)
|