@opsnow-mcp/opsnow-mcp-common-ui-server 1.0.39 → 1.0.41

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.
Files changed (37) hide show
  1. package/build/components/all-component-tools.js +2 -0
  2. package/build/components/data/icon-names.generated.js +341 -0
  3. package/build/components/data/icon-names.js +32 -16
  4. package/build/components/examples/opsnow-common-chart-examples-data.js +73 -78
  5. package/build/components/examples/opsnow-common-forms-examples-data.js +1 -11
  6. package/build/components/examples/opsnow-common-grid-examples-data.js +271 -20
  7. package/build/components/examples/opsnow-common-layout-examples-data.js +12 -13
  8. package/build/components/examples/opsnow-common-popup-examples-data.js +14 -28
  9. package/build/components/examples/opsnow-common-progress-examples-data.js +0 -5
  10. package/build/components/examples/opsnow-common-stepper-examples-data.js +2 -3
  11. package/build/components/examples/opsnow-common-storage-examples-data.js +23 -4
  12. package/build/components/examples/opsnow-common-tooltip-examples-data.js +1 -21
  13. package/build/components/opsnow-common-calendar.js +36 -15
  14. package/build/components/opsnow-common-chart.js +213 -132
  15. package/build/components/opsnow-common-coach-mark.js +3 -2
  16. package/build/components/opsnow-common-data-status.js +17 -11
  17. package/build/components/opsnow-common-dropdown.js +80 -0
  18. package/build/components/opsnow-common-examples.js +4 -2
  19. package/build/components/opsnow-common-file-upload.js +4 -1
  20. package/build/components/opsnow-common-forms.js +73 -36
  21. package/build/components/opsnow-common-grid.js +72 -29
  22. package/build/components/opsnow-common-icons.js +23 -39
  23. package/build/components/opsnow-common-jsx-helper.js +36 -0
  24. package/build/components/opsnow-common-layout.js +66 -25
  25. package/build/components/opsnow-common-notification.js +3 -2
  26. package/build/components/opsnow-common-pagination.js +4 -4
  27. package/build/components/opsnow-common-popup.js +12 -11
  28. package/build/components/opsnow-common-progress.js +10 -16
  29. package/build/components/opsnow-common-select.js +26 -13
  30. package/build/components/opsnow-common-stepper.js +30 -7
  31. package/build/components/opsnow-common-tab.js +5 -3
  32. package/build/components/opsnow-common-toast-popup.js +1 -0
  33. package/build/components/opsnow-common-tooltip.js +44 -46
  34. package/build/components/opsnow-common-typography.js +11 -5
  35. package/build/components/opsnow-common-validate-props.js +0 -0
  36. package/build/index.js +2 -0
  37. package/package.json +2 -1
@@ -3,12 +3,12 @@ import { z } from "zod";
3
3
  export const CalendarSchema = z.object({
4
4
  // 캘린더 관련 파라미터들
5
5
  type: z
6
- .enum(["date", "dateRange", "dateTime", "dateTimeRange"])
7
- .describe("단일 날짜, 날짜 범위, 날짜 + 시간 타입 중 선택"),
6
+ .enum(["date", "dateRange", "dateTime", "dateTimeRange", "time"])
7
+ .describe("단일 날짜, 날짜 범위, 날짜 + 시간, 시간만(time — TimePicker) 중 선택"),
8
8
  views: z
9
9
  .array(z.enum(["month", "year", "day", "hours", "minutes", "seconds"]))
10
10
  .optional()
11
- .describe("캘린더 뷰 타입 (여러개 선택 가능)"),
11
+ .describe("캘린더 뷰 타입 (여러개 선택 가능). date·dateRange·dateTimeRange는 day/month/year만, time은 hours/minutes/seconds만 유효. 월 단위 레인지는 type: 'dateRange' + views: ['year', 'month']"),
12
12
  activate: z
13
13
  .boolean()
14
14
  .describe("캘린더 전체 활성화/비활성화 (false시 전체 캘린더 사용 불가)"),
@@ -16,8 +16,17 @@ export const CalendarSchema = z.object({
16
16
  .array(z.string())
17
17
  .optional()
18
18
  .describe("캘린더는 활성화된 상태에서 특정 날짜만 비활성화 (YYYY-MM-DD 형식 배열)"),
19
- minDate: z.string().optional().describe("최소 날짜 (YYYY-MM-DD 형식)"),
20
- maxDate: z.string().optional().describe("최대 날짜 (YYYY-MM-DD 형식)"),
19
+ minDate: z.string().optional().describe("최소 날짜 (YYYY-MM-DD 형식) — 생성기 입력. 실제 prop 타입은 Dayjs이므로 직접 작성 시 minDate={dayjs('2026-01-01')}"),
20
+ maxDate: z.string().optional().describe("최대 날짜 (YYYY-MM-DD 형식) — 생성기 입력. 실제 prop 타입은 Dayjs이므로 직접 작성 시 maxDate={dayjs('2026-12-31')}"),
21
+ // 이하 실제 DatePicker prop
22
+ value: z.string().optional().describe("선택값 상태 변수명. 단일 타입은 Dayjs | null, range 타입은 [Dayjs | null, Dayjs | null]"),
23
+ disabled: z.boolean().optional().describe("캘린더 전체 비활성화"),
24
+ shouldDisableDate: z.string().optional().describe("특정 날짜 비활성화 함수명 ((date: Dayjs) => boolean)"),
25
+ format: z.string().optional().describe("입력 표시 포맷 (예: 'YYYY-MM-DD')"),
26
+ disablePast: z.boolean().optional().describe("오늘 이전 날짜 선택 불가"),
27
+ disableFuture: z.boolean().optional().describe("오늘 이후 날짜 선택 불가"),
28
+ readOnly: z.boolean().optional().describe("읽기 전용"),
29
+ size: z.enum(["small", "medium"]).optional().describe("입력 필드 크기"),
21
30
  // useShortcusts 부분
22
31
  useShortcuts: z
23
32
  .boolean()
@@ -54,9 +63,10 @@ export const CalendarSchema = z.object({
54
63
  message: "Reset일 때는 num, direction 없이 사용하고, Months/Weeks/Days 때는 num과 direction을 모두 설정하세요.",
55
64
  }))
56
65
  .optional()
57
- .describe("커스텀 쇼트컷 - 기본 쇼트컷 대신 사용자가 원하는 날짜 범위 버튼들을 직접 설정 (예: {num: 2, date: 'Months', direction: 'Last'}, {date: 'Reset'}). ⚠️ type이 'dateRange'일 때만 동작 (다른 타입에서는 무시됨)"),
66
+ .describe("커스텀 쇼트컷 - 기본 쇼트컷 대신 사용자가 원하는 날짜 범위 버튼들을 직접 설정 (예: {num: 2, date: 'Months', direction: 'Last'}, {date: 'Reset'}). ⚠️ type이 'dateRange'일 때만 동작 (다른 타입에서는 무시됨). ⚠️ 이 {num, date, direction} 형식은 생성기 입력이고, 실제 prop은 [{ label: string, getValue: () => [Dayjs, Dayjs] }] — 직접 작성 시 이 형식으로"),
58
67
  locale: z.enum(["ko", "en", "ja", "zh"]).optional().describe("달력 표시 언어 로케일 ('ko' | 'en' | 'ja' | 'zh'). 생성 코드는 항상 i18n.getLocale()과 연동된 locale 상태를 자동 전달하므로 보통 지정 불필요. 특정 언어로 고정하려면 생성된 코드의 locale 값을 직접 수정"),
59
68
  onChange: z.string().optional().describe("날짜 선택(변경) 시 호출되는 콜백 - 라이브러리 prop으로 (newValue, context) 인자를 받음. 생성 코드에 setSelectedDate 기반 onChange 핸들러가 항상 자동 포함되므로 보통 지정 불필요. 추가 로직은 생성된 onChange 내부에 덧붙이면 됨"),
69
+ copilotId: z.string().optional().describe("Copilot 연동 ID — Copilot 매니페스트의 bind.copilotId와 매칭되어 AI가 이 컨트롤을 조작할 수 있게 함. useCommonComponents()로 받은 컴포넌트에서만 동작(로더 HOC가 소비 후 제거)"),
60
70
  });
61
71
  // Calendar 컴포넌트 함수 - 배열 반환
62
72
  export function createCalendarComponent() {
@@ -83,6 +93,7 @@ export function createCalendarComponent() {
83
93
  \`\`\`javascript
84
94
  import { useCommonComponents } from '@opsnow-common/opsnow-finops-common-ui-loader';
85
95
  import i18n from '@opsnow-common/opsnow-finops-common-i18n'
96
+ import dayjs from 'dayjs' // calendar 2.x의 peer 의존성 — 앱 package.json에 dayjs 설치 필요
86
97
  const { OpsnowCommonDatePicker } = useCommonComponents();
87
98
  \`\`\``,
88
99
  parameters: CalendarSchema,
@@ -157,10 +168,13 @@ export function createCalendarComponent() {
157
168
  functionDefinitions += `]\n\n`;
158
169
  }
159
170
  // Props 생성
171
+ const isRangeType = !!args.type && args.type.includes("Range");
172
+ const valueVar = isRangeType ? "selectedDateRange" : "selectedDate";
173
+ const setValueFn = isRangeType ? "setSelectedDateRange" : "setSelectedDate";
160
174
  const props = [];
161
175
  if (args.type)
162
176
  props.push(`type="${args.type}"`);
163
- props.push(`value={selectedDate}`);
177
+ props.push(`value={${valueVar}}`);
164
178
  if (!args.activate) {
165
179
  props.push(`disabled={${!args.activate}}`);
166
180
  props.push(`onChange={(newValue) => {
@@ -171,13 +185,13 @@ export function createCalendarComponent() {
171
185
  props.push(`shouldDisableDate={disableSpecificDates}`);
172
186
  props.push(`onChange={(newValue) => {
173
187
  console.log('Selected Date with specific disabled dates:', newValue)
174
- setSelectedDate(newValue)
188
+ ${setValueFn}(newValue)
175
189
  }}`);
176
190
  }
177
191
  else {
178
192
  props.push(`onChange={(newValue) => {
179
193
  console.log('Selected ${args.type}:', newValue)
180
- setSelectedDate(newValue)
194
+ ${setValueFn}(newValue)
181
195
  }}`);
182
196
  }
183
197
  if (args.minDate)
@@ -191,8 +205,15 @@ export function createCalendarComponent() {
191
205
  if (isDateRangeType && args.customShortcuts)
192
206
  props.push(`customShortcuts={customShortcuts}`);
193
207
  props.push(`locale={locale}`);
194
- if (args.views)
195
- props.push(`views={[${args.views.map((view) => `'${view}'`).join(", ")}]}`);
208
+ // range·date 타입은 day/month/year 뷰만 허용
209
+ const dayOnlyViews = isRangeType || args.type === "date";
210
+ const views = dayOnlyViews
211
+ ? args.views?.filter((view) => ["day", "month", "year"].includes(view))
212
+ : args.type === "time"
213
+ ? args.views?.filter((view) => ["hours", "minutes", "seconds"].includes(view))
214
+ : args.views;
215
+ if (views && views.length > 0)
216
+ props.push(`views={[${views.map((view) => `'${view}'`).join(", ")}]}`);
196
217
  const datePickerCode = `<OpsnowCommonDatePicker ${props.join(" ")} />`;
197
218
  // OpsnowCommonDatePicker 아래 <p> 태그 생성
198
219
  const generateSelectedDateCode = () => {
@@ -200,21 +221,21 @@ export function createCalendarComponent() {
200
221
  return "";
201
222
  const isTime = args.type.includes("Time");
202
223
  const isRange = args.type.includes("Range");
203
- const format = isTime ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD";
224
+ const format = args.type === "time" ? "HH:mm" : isTime ? "YYYY-MM-DD HH:mm" : "YYYY-MM-DD";
204
225
  if (isRange) {
205
226
  const label = isTime
206
227
  ? "Selected DateTime Range"
207
228
  : "Selected Date Range";
208
229
  return `<p>
209
- ${label}: \${selectedDateRange[0] && selectedDateRange[1]
230
+ ${label}: {selectedDateRange[0] && selectedDateRange[1]
210
231
  ? \`\${selectedDateRange[0].format('${format}')} ~ \${selectedDateRange[1].format('${format}')}\`
211
232
  : 'None'}
212
233
  </p>`;
213
234
  }
214
235
  else {
215
- const label = isTime ? "Selected DateTime" : "Selected Date";
236
+ const label = args.type === "time" ? "Selected Time" : isTime ? "Selected DateTime" : "Selected Date";
216
237
  return `<p>
217
- ${label}: \${selectedDate ? selectedDate.format('${format}') : 'None'}
238
+ ${label}: {selectedDate ? selectedDate.format('${format}') : 'None'}
218
239
  </p>`;
219
240
  }
220
241
  };