@uniai-fe/uds-primitives 0.12.6 → 0.12.7
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/dist/styles.css +251 -838
- package/package.json +9 -9
- package/src/components/button/markup/Base.tsx +3 -2
- package/src/components/button/styles/button.scss +99 -326
- package/src/components/button/styles/round-button.scss +12 -39
- package/src/components/button/styles/text-button.scss +16 -52
- package/src/components/button/styles/variables.scss +33 -55
- package/src/components/button/types/options.ts +7 -4
- package/src/components/button/types/props.ts +11 -14
- package/src/components/button/utils/index.ts +14 -3
- package/src/components/input/markup/date/Template.tsx +33 -83
- package/src/components/input/markup/date/Trigger.tsx +12 -28
- package/src/components/input/markup/date/range/Template.tsx +35 -94
- package/src/components/input/markup/time/Template.tsx +5 -118
- package/src/components/input/markup/time/Trigger.tsx +2 -35
- package/src/components/input/styles/date.scss +1 -1
- package/src/components/input/styles/text.scss +1 -1
- package/src/components/input/types/date.ts +33 -176
- package/src/components/input/types/time.ts +4 -10
- package/src/components/time-picker/markup/Footer.tsx +5 -5
- package/src/components/time-picker/markup/HourSection.tsx +7 -7
- package/src/components/time-picker/markup/MinuteSection.tsx +5 -5
- package/src/components/time-picker/markup/Summary.tsx +2 -2
- package/src/components/time-picker/markup/Template.tsx +11 -11
- package/src/components/time-picker/types/time-picker.ts +0 -6
- package/src/components/time-picker/utils/time.ts +9 -21
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
ChangeEvent,
|
|
5
|
-
FocusEvent as ReactFocusEvent,
|
|
6
|
-
MouseEvent as ReactMouseEvent,
|
|
7
|
-
} from "react";
|
|
3
|
+
import type { ChangeEvent, MouseEvent as ReactMouseEvent } from "react";
|
|
8
4
|
import { forwardRef, useCallback, useMemo, useState } from "react";
|
|
9
5
|
import { useUncontrolled } from "@mantine/hooks";
|
|
10
6
|
import { Calendar } from "../../../calendar";
|
|
@@ -30,39 +26,30 @@ const INPUT_DATE_TABLE_FORMAT = "YY-MM-DD";
|
|
|
30
26
|
* placeholder는 format과 별도 props로 처리되며, format 변경으로 placeholder가 자동 치환되지는 않는다.
|
|
31
27
|
* @component
|
|
32
28
|
* @param {InputCalendarProps} props
|
|
33
|
-
* @
|
|
34
|
-
* @
|
|
35
|
-
* @
|
|
36
|
-
* @
|
|
37
|
-
* @
|
|
38
|
-
* @
|
|
39
|
-
* @
|
|
40
|
-
* @
|
|
41
|
-
* @
|
|
42
|
-
* @
|
|
43
|
-
* @
|
|
44
|
-
* @
|
|
45
|
-
* @
|
|
46
|
-
* @
|
|
47
|
-
* @
|
|
48
|
-
* @
|
|
49
|
-
* @
|
|
50
|
-
* @
|
|
51
|
-
* @
|
|
52
|
-
* @
|
|
53
|
-
* @
|
|
54
|
-
* @
|
|
55
|
-
* @
|
|
56
|
-
* @
|
|
57
|
-
* @property {InputCalendarTexts} [props.texts] 기본 Date 문구
|
|
58
|
-
* @property {unknown} [props.timePicker] 미구현 compatibility prop
|
|
59
|
-
* @property {boolean} [props.calendarOpened] calendar 열림 제어 상태
|
|
60
|
-
* @property {(open: boolean) => void} [props.onCalendarOpen] calendar 열림 변경 이벤트
|
|
61
|
-
* @property {(event: MouseEvent<Element>) => void} [props.onClick] trigger 클릭 핸들러
|
|
62
|
-
* @property {string} [props.id] trigger id
|
|
63
|
-
* @property {ReactNode} [props.trigger] 커스텀 trigger 슬롯
|
|
64
|
-
* @property {(props: InputCalendarTriggerRenderProps) => ReactNode} [props.renderTrigger] 커스텀 trigger 렌더 함수
|
|
65
|
-
* @desc 날짜 표시 trigger, Calendar panel과 YYYY-MM-DD hidden form storage를 조합한다.
|
|
29
|
+
* @param {CalendarMode} [props.mode="date"] 날짜/시간 모드
|
|
30
|
+
* @param {CalendarColumns} [props.columns=1] 동시 노출 달력 수
|
|
31
|
+
* @param {CalendarValue} [props.value] 제어형 값
|
|
32
|
+
* @param {CalendarValue} [props.defaultValue] 비제어 초기값
|
|
33
|
+
* @param {CalendarOnChange} [props.onChange] 값 변경 이벤트
|
|
34
|
+
* @param {CalendarOnChange} [props.onValueChange] onChange alias
|
|
35
|
+
* @param {boolean} [props.readOnly] 읽기 전용 여부
|
|
36
|
+
* @param {boolean} [props.disabled] 비활성화 여부
|
|
37
|
+
* @param {CalendarDatePickerProps} [props.datePickerProps] Mantine DatePicker 옵션
|
|
38
|
+
* @param {string} [props.name] form name/RHF name
|
|
39
|
+
* @param {UseFormRegisterReturn} [props.register] RHF register
|
|
40
|
+
* @param {string} [props.placeholder="YYYY-MM-DD"] placeholder
|
|
41
|
+
* @param {"primary" | "secondary" | "tertiary" | "table"} [props.priority="primary"] trigger input priority
|
|
42
|
+
* @param {"default" | "active" | "focused" | "success" | "error" | "disabled" | "loading"} [props.state="default"] trigger input state
|
|
43
|
+
* @param {ReactNode} [props.header] 패널 header 콘텐츠
|
|
44
|
+
* @param {ReactNode} [props.footer] 패널 footer 콘텐츠
|
|
45
|
+
* @param {InputCalendarTexts} [props.texts] 기본 Date 문구
|
|
46
|
+
* @param {unknown} [props.timePicker] TimePicker 확장용 예약 슬롯(현재 미구현)
|
|
47
|
+
* @param {boolean} [props.calendarOpened] calendar 열림 제어 상태
|
|
48
|
+
* @param {(open: boolean) => void} [props.onCalendarOpen] calendar 열림 변경 이벤트
|
|
49
|
+
* @param {(event: MouseEvent<Element>) => void} [props.onClick] trigger 클릭 핸들러
|
|
50
|
+
* @param {string} [props.id] trigger id
|
|
51
|
+
* @param {ReactNode} [props.trigger] 커스텀 trigger 슬롯
|
|
52
|
+
* @param {(props: InputCalendarTriggerRenderProps) => ReactNode} [props.renderTrigger] 커스텀 trigger 렌더 함수
|
|
66
53
|
*/
|
|
67
54
|
const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
68
55
|
(
|
|
@@ -77,18 +64,10 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
77
64
|
disabled,
|
|
78
65
|
datePickerProps,
|
|
79
66
|
name,
|
|
80
|
-
form,
|
|
81
67
|
register,
|
|
82
|
-
required,
|
|
83
|
-
hiddenInputProps,
|
|
84
68
|
placeholder = "YYYY-MM-DD",
|
|
85
69
|
priority = "primary",
|
|
86
|
-
size = "medium",
|
|
87
70
|
state = "default",
|
|
88
|
-
block = false,
|
|
89
|
-
width,
|
|
90
|
-
onFocus,
|
|
91
|
-
onBlur,
|
|
92
71
|
header,
|
|
93
72
|
footer,
|
|
94
73
|
texts,
|
|
@@ -109,7 +88,7 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
109
88
|
* Input Date Template; Calendar open 상태 변경 전달 함수.
|
|
110
89
|
* 비제어 사용을 위해 내부 상태를 갱신하고, 제어형 사용을 위해 외부 owner에게 next open 값을 전달한다.
|
|
111
90
|
* @param {boolean} nextOpen 다음 calendar open 상태
|
|
112
|
-
* @
|
|
91
|
+
* @returns {void}
|
|
113
92
|
*/
|
|
114
93
|
const handleCalendarOpenChange = useCallback(
|
|
115
94
|
(nextOpen: boolean) => {
|
|
@@ -134,7 +113,7 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
134
113
|
* Input Date Template; RHF hidden input 변경 이벤트 동기화 함수.
|
|
135
114
|
* trigger 표시값과 form 저장값을 분리하기 위해 CalendarValue를 직렬화한 synthetic change를 register에 전달한다.
|
|
136
115
|
* @param {CalendarValue} nextValue 다음 calendar 선택 값
|
|
137
|
-
* @
|
|
116
|
+
* @returns {void}
|
|
138
117
|
*/
|
|
139
118
|
const emitRegisterChange = useCallback(
|
|
140
119
|
(nextValue: CalendarValue) => {
|
|
@@ -161,7 +140,7 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
161
140
|
* Input Date Template; calendar value 갱신 함수.
|
|
162
141
|
* 내부/제어형 value pipeline을 갱신한 뒤 RHF register 저장값을 같은 CalendarValue 기준으로 동기화한다.
|
|
163
142
|
* @param {CalendarValue} nextValue 다음 calendar 선택 값
|
|
164
|
-
* @
|
|
143
|
+
* @returns {void}
|
|
165
144
|
*/
|
|
166
145
|
const updateValue = useCallback(
|
|
167
146
|
(nextValue: CalendarValue) => {
|
|
@@ -185,33 +164,17 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
185
164
|
* Input Date Template; trigger click 위임 함수.
|
|
186
165
|
* Calendar Root의 PopOver toggle은 asChild trigger props가 담당하고, 이 함수는 소비자가 넘긴 trigger onClick만 보존한다.
|
|
187
166
|
* @param {ReactMouseEvent<Element>} event trigger click event
|
|
188
|
-
* @
|
|
167
|
+
* @returns {void}
|
|
189
168
|
*/
|
|
190
169
|
const handleTriggerClick = (event: ReactMouseEvent<Element>) => {
|
|
191
170
|
triggerOnClick?.(event);
|
|
192
171
|
};
|
|
193
172
|
|
|
194
|
-
/**
|
|
195
|
-
* Input Date Template; trigger blur와 RHF touched 상태 동기화 함수.
|
|
196
|
-
* 표시 trigger는 form name을 소유하지 않으므로 직렬화된 hidden input 값을 synthetic blur event로 전달한다.
|
|
197
|
-
* @utility
|
|
198
|
-
* @param {ReactFocusEvent<HTMLInputElement>} event trigger blur event
|
|
199
|
-
* @desc 소비자 blur callback과 hidden input register blur를 같은 날짜 값으로 동기화한다.
|
|
200
|
-
* @return {void}
|
|
201
|
-
*/
|
|
202
|
-
const handleTriggerBlur = (event: ReactFocusEvent<HTMLInputElement>) => {
|
|
203
|
-
register?.onBlur({
|
|
204
|
-
target: { name: register.name, value: serializedCalendarValue },
|
|
205
|
-
type: "blur",
|
|
206
|
-
});
|
|
207
|
-
onBlur?.(event);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
173
|
/**
|
|
211
174
|
* Input Date Template; Calendar Core change adapter 함수.
|
|
212
175
|
* Calendar.Root의 onChange 값을 Template value/RHF 동기화 pipeline으로 연결한다.
|
|
213
176
|
* @param {CalendarValue} nextValue 다음 calendar 선택 값
|
|
214
|
-
* @
|
|
177
|
+
* @returns {void}
|
|
215
178
|
*/
|
|
216
179
|
const handleCalendarChange = (nextValue: CalendarValue) => {
|
|
217
180
|
updateValue(nextValue);
|
|
@@ -238,12 +201,7 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
238
201
|
readOnly,
|
|
239
202
|
onClick: handleTriggerClick,
|
|
240
203
|
priority,
|
|
241
|
-
size,
|
|
242
204
|
state,
|
|
243
|
-
block,
|
|
244
|
-
width,
|
|
245
|
-
onFocus,
|
|
246
|
-
onBlur: handleTriggerBlur,
|
|
247
205
|
};
|
|
248
206
|
|
|
249
207
|
const triggerNode = trigger ?? renderTrigger?.(triggerRenderProps) ?? (
|
|
@@ -256,11 +214,6 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
256
214
|
readOnly={readOnly}
|
|
257
215
|
onClick={handleTriggerClick}
|
|
258
216
|
priority={priority}
|
|
259
|
-
size={size}
|
|
260
|
-
block={block}
|
|
261
|
-
width={width}
|
|
262
|
-
onFocus={onFocus}
|
|
263
|
-
onBlur={handleTriggerBlur}
|
|
264
217
|
/>
|
|
265
218
|
);
|
|
266
219
|
|
|
@@ -275,7 +228,7 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
275
228
|
readOnly={readOnly}
|
|
276
229
|
value={calendarValue}
|
|
277
230
|
onChange={handleCalendarChange}
|
|
278
|
-
// Mantine DatePicker는 valueFormat prop을 지원하지 않으므로 옵션을 그대로 전달한다.
|
|
231
|
+
// 변경: Mantine DatePicker는 valueFormat prop을 지원하지 않으므로 옵션을 그대로 전달한다.
|
|
279
232
|
datePickerProps={datePickerProps}
|
|
280
233
|
header={header}
|
|
281
234
|
footer={footerContent}
|
|
@@ -286,14 +239,11 @@ const InputDateTemplate = forwardRef<HTMLDivElement, InputCalendarProps>(
|
|
|
286
239
|
</Calendar.Root>
|
|
287
240
|
{(register?.name || name) && (
|
|
288
241
|
<input
|
|
289
|
-
// trigger 표시값과 form
|
|
290
|
-
{...hiddenInputProps}
|
|
291
|
-
{...register}
|
|
242
|
+
// 변경: trigger 표시값과 저장값을 분리하기 위해 form 참여는 hidden input만 담당한다.
|
|
292
243
|
type="hidden"
|
|
293
244
|
value={serializedCalendarValue}
|
|
294
245
|
name={register?.name ?? name}
|
|
295
|
-
|
|
296
|
-
required={required ?? hiddenInputProps?.required}
|
|
246
|
+
{...register}
|
|
297
247
|
/>
|
|
298
248
|
)}
|
|
299
249
|
</>
|
|
@@ -19,23 +19,17 @@ import type { InputCalendarTriggerViewProps } from "../../types";
|
|
|
19
19
|
* 그 외 priority에서는 기존처럼 right 슬롯을 유지한다.
|
|
20
20
|
* @component
|
|
21
21
|
* @param {InputCalendarTriggerViewProps} props
|
|
22
|
-
* @
|
|
23
|
-
* @
|
|
24
|
-
* @
|
|
25
|
-
* @
|
|
26
|
-
* @
|
|
27
|
-
* @
|
|
28
|
-
* @
|
|
29
|
-
* @
|
|
30
|
-
* @
|
|
31
|
-
* @
|
|
32
|
-
* @
|
|
33
|
-
* @property {(event: FocusEvent<HTMLInputElement>) => void} [props.onFocus] trigger focus 핸들러
|
|
34
|
-
* @property {(event: FocusEvent<HTMLInputElement>) => void} [props.onBlur] trigger blur 핸들러
|
|
35
|
-
* @property {string} [props.id] input id
|
|
36
|
-
* @property {string} [props.name] form name
|
|
37
|
-
* @property {UseFormRegisterReturn} [props.register] RHF register
|
|
38
|
-
* @desc Date 값을 직접 편집하지 않고 Calendar 선택값을 표시하는 기본 trigger다.
|
|
22
|
+
* @param {string} [props.className] trigger className
|
|
23
|
+
* @param {string} [props.placeholder] placeholder
|
|
24
|
+
* @param {string} [props.displayValue] 표시 문자열
|
|
25
|
+
* @param {(event: MouseEvent<Element>) => void} [props.onClick] 클릭 핸들러
|
|
26
|
+
* @param {boolean} [props.disabled] disabled 여부
|
|
27
|
+
* @param {boolean} [props.readOnly] readOnly 여부
|
|
28
|
+
* @param {"primary" | "secondary" | "tertiary" | "table"} [props.priority] trigger input priority
|
|
29
|
+
* @param {"default" | "active" | "focused" | "success" | "error" | "disabled" | "loading"} [props.state] trigger input state
|
|
30
|
+
* @param {string} [props.id] input id
|
|
31
|
+
* @param {string} [props.name] form name
|
|
32
|
+
* @param {UseFormRegisterReturn} [props.register] RHF register
|
|
39
33
|
*/
|
|
40
34
|
const InputDateTrigger = forwardRef<
|
|
41
35
|
HTMLInputElement,
|
|
@@ -50,12 +44,7 @@ const InputDateTrigger = forwardRef<
|
|
|
50
44
|
disabled,
|
|
51
45
|
readOnly,
|
|
52
46
|
priority,
|
|
53
|
-
size,
|
|
54
47
|
state,
|
|
55
|
-
block,
|
|
56
|
-
width,
|
|
57
|
-
onFocus,
|
|
58
|
-
onBlur,
|
|
59
48
|
id,
|
|
60
49
|
name,
|
|
61
50
|
register,
|
|
@@ -101,7 +90,7 @@ const InputDateTrigger = forwardRef<
|
|
|
101
90
|
triggerInputRef.current?.click();
|
|
102
91
|
};
|
|
103
92
|
|
|
104
|
-
// Date trigger는 직접 타이핑을
|
|
93
|
+
// 변경: Date trigger는 기본적으로 직접 타이핑을 막고, 달력 선택을 단일 입력 경로로 유지한다.
|
|
105
94
|
const shouldBlockTyping = !disabled && !readOnly;
|
|
106
95
|
|
|
107
96
|
const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
@@ -181,14 +170,9 @@ const InputDateTrigger = forwardRef<
|
|
|
181
170
|
name={name ?? register?.name}
|
|
182
171
|
register={register}
|
|
183
172
|
priority={priority}
|
|
184
|
-
size={size}
|
|
185
173
|
state={state}
|
|
186
|
-
block={block}
|
|
187
|
-
width={width}
|
|
188
174
|
placeholder={placeholder}
|
|
189
175
|
className={clsx("input-date-trigger-input", className)}
|
|
190
|
-
onFocus={onFocus}
|
|
191
|
-
onBlur={onBlur}
|
|
192
176
|
onClick={handleInputClick}
|
|
193
177
|
onKeyDown={handleKeyDown}
|
|
194
178
|
onBeforeInput={handleBeforeInput}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
ChangeEvent,
|
|
5
|
-
FocusEvent as ReactFocusEvent,
|
|
6
|
-
MouseEvent as ReactMouseEvent,
|
|
7
|
-
} from "react";
|
|
3
|
+
import type { ChangeEvent, MouseEvent as ReactMouseEvent } from "react";
|
|
8
4
|
import { forwardRef, useCallback, useMemo, useState } from "react";
|
|
9
5
|
import { useUncontrolled } from "@mantine/hooks";
|
|
10
6
|
import type { UseFormRegisterReturn } from "react-hook-form";
|
|
@@ -35,39 +31,29 @@ const INPUT_DATE_RANGE_TABLE_FORMAT = "YY-MM-DD";
|
|
|
35
31
|
* form 저장은 start/end hidden input 2개로 분리한다.
|
|
36
32
|
* @component
|
|
37
33
|
* @param {InputCalendarRangeProps} props range date props
|
|
38
|
-
* @
|
|
39
|
-
* @
|
|
40
|
-
* @
|
|
41
|
-
* @
|
|
42
|
-
* @
|
|
43
|
-
* @
|
|
44
|
-
* @
|
|
45
|
-
* @
|
|
46
|
-
* @
|
|
47
|
-
* @
|
|
48
|
-
* @
|
|
49
|
-
* @
|
|
50
|
-
* @
|
|
51
|
-
* @
|
|
52
|
-
* @
|
|
53
|
-
* @
|
|
54
|
-
* @
|
|
55
|
-
* @
|
|
56
|
-
* @
|
|
57
|
-
* @
|
|
58
|
-
* @
|
|
59
|
-
* @
|
|
60
|
-
* @
|
|
61
|
-
* @property {ReactNode} [props.header] 패널 header 콘텐츠
|
|
62
|
-
* @property {ReactNode} [props.footer] 패널 footer 콘텐츠
|
|
63
|
-
* @property {InputCalendarTexts} [props.texts] 기본 Date 문구
|
|
64
|
-
* @property {boolean} [props.calendarOpened] calendar 열림 제어 상태
|
|
65
|
-
* @property {(open: boolean) => void} [props.onCalendarOpen] calendar 열림 변경 이벤트
|
|
66
|
-
* @property {string} [props.id] trigger id
|
|
67
|
-
* @property {ReactNode} [props.trigger] 커스텀 trigger 슬롯
|
|
68
|
-
* @property {(props: InputCalendarTriggerRenderProps) => ReactNode} [props.renderTrigger] 커스텀 trigger 렌더 함수
|
|
69
|
-
* @property {(event: MouseEvent<Element>) => void} [props.onClick] trigger 클릭 핸들러
|
|
70
|
-
* @desc 기간 표시 trigger, Calendar.Range panel과 start/end hidden form storage를 조합한다.
|
|
34
|
+
* @param {CalendarRangeValue} [props.value] 제어형 range 값
|
|
35
|
+
* @param {CalendarRangeValue} [props.defaultValue] 비제어 range 초기값
|
|
36
|
+
* @param {CalendarRangeOnChange} [props.onChange] range 값 변경 이벤트
|
|
37
|
+
* @param {CalendarRangeOnChange} [props.onValueChange] onChange alias
|
|
38
|
+
* @param {boolean} [props.readOnly] 읽기 전용 여부
|
|
39
|
+
* @param {boolean} [props.disabled] 비활성화 여부
|
|
40
|
+
* @param {CalendarRangeDatePickerProps} [props.datePickerProps] Mantine range DatePicker 옵션
|
|
41
|
+
* @param {string} [props.startName] 시작일 hidden input name
|
|
42
|
+
* @param {string} [props.endName] 종료일 hidden input name
|
|
43
|
+
* @param {UseFormRegisterReturn} [props.startRegister] 시작일 RHF register
|
|
44
|
+
* @param {UseFormRegisterReturn} [props.endRegister] 종료일 RHF register
|
|
45
|
+
* @param {string} [props.placeholder="YYYY-MM-DD ~ YYYY-MM-DD"] placeholder
|
|
46
|
+
* @param {"primary" | "secondary" | "tertiary" | "table"} [props.priority="primary"] trigger input priority
|
|
47
|
+
* @param {"default" | "active" | "focused" | "success" | "error" | "disabled" | "loading"} [props.state="default"] trigger input state
|
|
48
|
+
* @param {ReactNode} [props.header] 패널 header 콘텐츠
|
|
49
|
+
* @param {ReactNode} [props.footer] 패널 footer 콘텐츠
|
|
50
|
+
* @param {InputCalendarTexts} [props.texts] 기본 Date 문구
|
|
51
|
+
* @param {boolean} [props.calendarOpened] calendar 열림 제어 상태
|
|
52
|
+
* @param {(open: boolean) => void} [props.onCalendarOpen] calendar 열림 변경 이벤트
|
|
53
|
+
* @param {string} [props.id] trigger id
|
|
54
|
+
* @param {ReactNode} [props.trigger] 커스텀 trigger 슬롯
|
|
55
|
+
* @param {(props: InputCalendarTriggerRenderProps) => ReactNode} [props.renderTrigger] 커스텀 trigger 렌더 함수
|
|
56
|
+
* @param {(event: MouseEvent<Element>) => void} [props.onClick] trigger 클릭 핸들러
|
|
71
57
|
* @example
|
|
72
58
|
* <Input.Date.Range.Template
|
|
73
59
|
* startName="start_date"
|
|
@@ -88,20 +74,11 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
88
74
|
datePickerProps,
|
|
89
75
|
startName,
|
|
90
76
|
endName,
|
|
91
|
-
form,
|
|
92
77
|
startRegister,
|
|
93
78
|
endRegister,
|
|
94
|
-
required,
|
|
95
|
-
startHiddenInputProps,
|
|
96
|
-
endHiddenInputProps,
|
|
97
79
|
placeholder = "YYYY-MM-DD ~ YYYY-MM-DD",
|
|
98
80
|
priority = "primary",
|
|
99
|
-
size = "medium",
|
|
100
81
|
state = "default",
|
|
101
|
-
block = false,
|
|
102
|
-
width,
|
|
103
|
-
onFocus,
|
|
104
|
-
onBlur,
|
|
105
82
|
header,
|
|
106
83
|
footer,
|
|
107
84
|
texts,
|
|
@@ -122,7 +99,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
122
99
|
* Input Date Range Template; Calendar open 상태 변경 전달 함수.
|
|
123
100
|
* 비제어 range calendar 상태를 갱신하고, 제어형 owner가 열림 상태를 조율할 수 있게 next open 값을 전달한다.
|
|
124
101
|
* @param {boolean} nextOpen 다음 range calendar open 상태
|
|
125
|
-
* @
|
|
102
|
+
* @returns {void}
|
|
126
103
|
*/
|
|
127
104
|
const handleCalendarOpenChange = useCallback(
|
|
128
105
|
(nextOpen: boolean) => {
|
|
@@ -148,7 +125,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
148
125
|
* Input Date Range Template; RHF hidden input 변경 이벤트 동기화 함수.
|
|
149
126
|
* range tuple의 start/end 값을 각각 직렬화해 startRegister/endRegister에 synthetic change로 전달한다.
|
|
150
127
|
* @param {CalendarRangeValue} nextValue 다음 range calendar 선택 값
|
|
151
|
-
* @
|
|
128
|
+
* @returns {void}
|
|
152
129
|
*/
|
|
153
130
|
const emitRegisterChange = useCallback(
|
|
154
131
|
(nextValue: CalendarRangeValue) => {
|
|
@@ -157,7 +134,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
157
134
|
* start 또는 end register 한쪽에 직렬화 값을 전달한다.
|
|
158
135
|
* @param {UseFormRegisterReturn | undefined} register RHF register 결과
|
|
159
136
|
* @param {CalendarValue} nextCalendarValue 다음 start/end 선택 값
|
|
160
|
-
* @
|
|
137
|
+
* @returns {void}
|
|
161
138
|
*/
|
|
162
139
|
const emit = (
|
|
163
140
|
register: UseFormRegisterReturn | undefined,
|
|
@@ -192,7 +169,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
192
169
|
* Input Date Range Template; range value 갱신 함수.
|
|
193
170
|
* Calendar.Range tuple 값을 갱신하고 start/end hidden input 저장값을 같은 tuple 기준으로 동기화한다.
|
|
194
171
|
* @param {CalendarRangeValue} nextValue 다음 range calendar 선택 값
|
|
195
|
-
* @
|
|
172
|
+
* @returns {void}
|
|
196
173
|
*/
|
|
197
174
|
const updateValue = useCallback(
|
|
198
175
|
(nextValue: CalendarRangeValue) => {
|
|
@@ -217,37 +194,17 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
217
194
|
* Input Date Range Template; trigger click 위임 함수.
|
|
218
195
|
* Calendar.Range Root의 PopOver toggle은 asChild trigger props가 담당하고, 이 함수는 소비자가 넘긴 trigger onClick만 보존한다.
|
|
219
196
|
* @param {ReactMouseEvent<Element>} event trigger click event
|
|
220
|
-
* @
|
|
197
|
+
* @returns {void}
|
|
221
198
|
*/
|
|
222
199
|
const handleTriggerClick = (event: ReactMouseEvent<Element>) => {
|
|
223
200
|
triggerOnClick?.(event);
|
|
224
201
|
};
|
|
225
202
|
|
|
226
|
-
/**
|
|
227
|
-
* Input Date Range Template; trigger blur와 start/end RHF touched 상태 동기화 함수.
|
|
228
|
-
* 표시 trigger는 저장 endpoint를 소유하지 않으므로 직렬화한 start/end 값을 각 register에 전달한다.
|
|
229
|
-
* @utility
|
|
230
|
-
* @param {ReactFocusEvent<HTMLInputElement>} event trigger blur event
|
|
231
|
-
* @desc 소비자 blur callback과 두 hidden input register blur를 같은 range 값으로 동기화한다.
|
|
232
|
-
* @return {void}
|
|
233
|
-
*/
|
|
234
|
-
const handleTriggerBlur = (event: ReactFocusEvent<HTMLInputElement>) => {
|
|
235
|
-
startRegister?.onBlur({
|
|
236
|
-
target: { name: startRegister.name, value: serializedStartValue },
|
|
237
|
-
type: "blur",
|
|
238
|
-
});
|
|
239
|
-
endRegister?.onBlur({
|
|
240
|
-
target: { name: endRegister.name, value: serializedEndValue },
|
|
241
|
-
type: "blur",
|
|
242
|
-
});
|
|
243
|
-
onBlur?.(event);
|
|
244
|
-
};
|
|
245
|
-
|
|
246
203
|
/**
|
|
247
204
|
* Input Date Range Template; Calendar Range Core change adapter 함수.
|
|
248
205
|
* Calendar.Range.Root의 onChange 값을 Template tuple/RHF 동기화 pipeline으로 연결한다.
|
|
249
206
|
* @param {CalendarRangeValue} nextValue 다음 range calendar 선택 값
|
|
250
|
-
* @
|
|
207
|
+
* @returns {void}
|
|
251
208
|
*/
|
|
252
209
|
const handleCalendarChange = (nextValue: CalendarRangeValue) => {
|
|
253
210
|
updateValue(nextValue);
|
|
@@ -275,7 +232,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
275
232
|
>
|
|
276
233
|
{texts?.clear ?? "삭제하기"}
|
|
277
234
|
</InputDateClearButton>
|
|
278
|
-
{/* range footer는 삭제/적용을 같은 row에 두고 Apply 폭을 content 기준으로 줄인다. */}
|
|
235
|
+
{/* 변경: range footer는 삭제/적용을 같은 row에 두고 Apply 폭을 content 기준으로 줄인다. */}
|
|
279
236
|
<InputDateApplyButton
|
|
280
237
|
className="input-date-range-apply-button"
|
|
281
238
|
disabled={disabled}
|
|
@@ -295,12 +252,7 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
295
252
|
readOnly,
|
|
296
253
|
onClick: handleTriggerClick,
|
|
297
254
|
priority,
|
|
298
|
-
size,
|
|
299
255
|
state,
|
|
300
|
-
block,
|
|
301
|
-
width,
|
|
302
|
-
onFocus,
|
|
303
|
-
onBlur: handleTriggerBlur,
|
|
304
256
|
};
|
|
305
257
|
|
|
306
258
|
const triggerNode = trigger ?? renderTrigger?.(triggerRenderProps) ?? (
|
|
@@ -313,11 +265,6 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
313
265
|
readOnly={readOnly}
|
|
314
266
|
onClick={handleTriggerClick}
|
|
315
267
|
priority={priority}
|
|
316
|
-
size={size}
|
|
317
|
-
block={block}
|
|
318
|
-
width={width}
|
|
319
|
-
onFocus={onFocus}
|
|
320
|
-
onBlur={handleTriggerBlur}
|
|
321
268
|
/>
|
|
322
269
|
);
|
|
323
270
|
|
|
@@ -340,26 +287,20 @@ const InputDateRangeTemplate = forwardRef<HTMLElement, InputCalendarRangeProps>(
|
|
|
340
287
|
</Calendar.Range.Root>
|
|
341
288
|
{(startRegister?.name || startName) && (
|
|
342
289
|
<input
|
|
343
|
-
// range 시작일 저장값은 trigger 표시와 분리해 hidden input이 담당한다.
|
|
344
|
-
{...startHiddenInputProps}
|
|
345
|
-
{...startRegister}
|
|
290
|
+
// 변경: range 시작일 저장값은 trigger 표시와 분리해 hidden input이 담당한다.
|
|
346
291
|
type="hidden"
|
|
347
292
|
value={serializedStartValue}
|
|
348
293
|
name={startRegister?.name ?? startName}
|
|
349
|
-
|
|
350
|
-
required={required ?? startHiddenInputProps?.required}
|
|
294
|
+
{...startRegister}
|
|
351
295
|
/>
|
|
352
296
|
)}
|
|
353
297
|
{(endRegister?.name || endName) && (
|
|
354
298
|
<input
|
|
355
|
-
// range 종료일 저장값은 trigger 표시와 분리해 hidden input이 담당한다.
|
|
356
|
-
{...endHiddenInputProps}
|
|
357
|
-
{...endRegister}
|
|
299
|
+
// 변경: range 종료일 저장값은 trigger 표시와 분리해 hidden input이 담당한다.
|
|
358
300
|
type="hidden"
|
|
359
301
|
value={serializedEndValue}
|
|
360
302
|
name={endRegister?.name ?? endName}
|
|
361
|
-
|
|
362
|
-
required={required ?? endHiddenInputProps?.required}
|
|
303
|
+
{...endRegister}
|
|
363
304
|
/>
|
|
364
305
|
)}
|
|
365
306
|
</>
|