Skip to content

Commit ea6934a

Browse files
committed
Browser Focus Out 버그 Fix, (Trigger 버튼 추가)
1 parent 1fdc1fa commit ea6934a

File tree

6 files changed

+62
-11
lines changed

6 files changed

+62
-11
lines changed

package/src/assets/calendar.svg

+4
Loading

package/src/assets/global.css

+13
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,19 @@
4949
font-size: 0;
5050
cursor: pointer;
5151
}
52+
.react-datepicker__trigger {
53+
margin-left: 0.4rem;
54+
width: 18px;
55+
height: 18px;
56+
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4NCjxwYXRoIGQ9Ik0zIDlIMjFNNyAzVjVNMTcgM1Y1TTYgMTNIOE02IDE3SDhNMTEgMTNIMTNNMTEgMTdIMTNNMTYgMTNIMThNMTYgMTdIMThNNi4yIDIxSDE3LjhDMTguOTIwMSAyMSAxOS40ODAyIDIxIDE5LjkwOCAyMC43ODJDMjAuMjg0MyAyMC41OTAzIDIwLjU5MDMgMjAuMjg0MyAyMC43ODIgMTkuOTA4QzIxIDE5LjQ4MDIgMjEgMTguOTIwMSAyMSAxNy44VjguMkMyMSA3LjA3OTg5IDIxIDYuNTE5ODQgMjAuNzgyIDYuMDkyMDJDMjAuNTkwMyA1LjcxNTY5IDIwLjI4NDMgNS40MDk3MyAxOS45MDggNS4yMTc5OUMxOS40ODAyIDUgMTguOTIwMSA1IDE3LjggNUg2LjJDNS4wNzk5IDUgNC41MTk4NCA1IDQuMDkyMDIgNS4yMTc5OUMzLjcxNTY5IDUuNDA5NzMgMy40MDk3MyA1LjcxNTY5IDMuMjE3OTkgNi4wOTIwMkMzIDYuNTE5ODQgMyA3LjA3OTg5IDMgOC4yVjE3LjhDMyAxOC45MjAxIDMgMTkuNDgwMiAzLjIxNzk5IDE5LjkwOEMzLjQwOTczIDIwLjI4NDMgMy43MTU2OSAyMC41OTAzIDQuMDkyMDIgMjAuNzgyQzQuNTE5ODQgMjEgNS4wNzk4OSAyMSA2LjIgMjFaIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+DQo8L3N2Zz4=');
57+
background-repeat: no-repeat;
58+
background-position: center;
59+
background-size: 100%;
60+
border: none;
61+
background-color: transparent;
62+
font-size: 0;
63+
cursor: pointer;
64+
}
5265

5366
/* portal */
5467
.react-datepicker__portal {

package/src/components/Datepicker.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,19 @@ function Datepicker({
140140
setViewDate(formatDate(value || NEW_DATE, 'YYYY-MM-DD'));
141141
}, [value]);
142142

143+
// browser에서 focus가 사라졌을 때 picker close
144+
const windowBlurHandler = () => {
145+
setIsVisible(false);
146+
};
147+
148+
useEffect(() => {
149+
window.addEventListener('blur', windowBlurHandler);
150+
// return window.removeEventListener('blur', windowBlurHandler);
151+
return () => {
152+
window.removeEventListener('blur', windowBlurHandler);
153+
};
154+
}, []);
155+
143156
return (
144157
<div className={`${NAME_SPACE}__wrapper ${className}`}>
145158
<DatepickerInput

package/src/components/input/DatepickerInput.tsx

+12-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ export default function DatepickerInput({
3535
}: IProps) {
3636
const formatArray = useMemo(() => splitString(valueFormat), [valueFormat]);
3737

38+
const triggerHandler = () => {
39+
if (disabled) return;
40+
setIsVisible(true);
41+
};
42+
3843
return (
3944
<div
4045
className={`${NAME_SPACE}__input-container`}
@@ -49,14 +54,20 @@ export default function DatepickerInput({
4954
setDateValue={setDateValue}
5055
timeValue={timeValue}
5156
setTimeValue={setTimeValue}
52-
setIsVisible={setIsVisible}
5357
type={type}
5458
viewDate={viewDate}
5559
setViewDate={setViewDate}
5660
disabled={disabled}
5761
/>
5862
);
5963
})}
64+
<button
65+
type="button"
66+
className={`${NAME_SPACE}__trigger`}
67+
onClick={triggerHandler}
68+
>
69+
Trigger
70+
</button>
6071
{useClearButton && (
6172
<button
6273
type="button"

package/src/components/input/InputUnit.tsx

+1-6
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,16 @@ import {
99
useState,
1010
} from 'react';
1111
import { NAME_SPACE, VALUE_TYPES } from '../../constants/core';
12-
import { IDateValue, ITimeValue, TIsVisible } from '../../types/props';
12+
import { IDateValue, ITimeValue } from '../../types/props';
1313
import { getDateValueUnit, getTimeValueUnit } from '../../utils/datetime';
1414
import { addLeadingZero, isNumeric } from '../../utils/string';
1515

1616
interface IProps {
17-
visibleType?: TIsVisible;
1817
type: string;
1918
dateValue: IDateValue;
2019
setDateValue: (value: IDateValue) => void;
2120
timeValue: ITimeValue;
2221
setTimeValue: (value: ITimeValue) => void;
23-
setIsVisible: (value: TIsVisible) => void;
2422
viewDate: string;
2523
setViewDate: (value: string) => void;
2624
disabled: boolean;
@@ -57,13 +55,11 @@ function getNextSiblingsWithDataValueTrue(
5755
}
5856

5957
function InputUnit({
60-
visibleType = true,
6158
type,
6259
dateValue,
6360
setDateValue,
6461
timeValue,
6562
setTimeValue,
66-
setIsVisible,
6763
viewDate,
6864
setViewDate,
6965
disabled,
@@ -237,7 +233,6 @@ function InputUnit({
237233

238234
const focusHandler = (e: React.FocusEvent<HTMLDivElement>) => {
239235
if (disabled) return;
240-
setIsVisible(visibleType);
241236
setTimeout(() => {
242237
selectText(e.target);
243238
}, 10);

package/src/components/input/RangepickerInput.tsx

+19-4
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ export default function RangepickerInput({
4949
}: IProps) {
5050
const formatArray = useMemo(() => splitString(valueFormat), [valueFormat]);
5151

52+
const triggerHandler = (type: 'start' | 'end') => {
53+
if (disabled) return;
54+
setIsVisible(type);
55+
};
56+
5257
return (
5358
<div
5459
className={`${NAME_SPACE}__input-container`}
@@ -63,12 +68,10 @@ export default function RangepickerInput({
6368
return (
6469
<InputUnit
6570
key={i}
66-
visibleType="start"
6771
dateValue={dateStartValue}
6872
setDateValue={setDateStartValue}
6973
timeValue={timeStartValue}
7074
setTimeValue={setTimeStartValue}
71-
setIsVisible={setIsVisible}
7275
type={type}
7376
viewDate={viewStartDate}
7477
setViewDate={setViewStartDate}
@@ -77,6 +80,13 @@ export default function RangepickerInput({
7780
);
7881
})}
7982
</div>
83+
<button
84+
type="button"
85+
className={`${NAME_SPACE}__trigger`}
86+
onClick={() => triggerHandler('start')}
87+
>
88+
Trigger
89+
</button>
8090
<div className={`${NAME_SPACE}__input-range-separator`}> ~ </div>
8191
<div
8292
className={`${NAME_SPACE}__input-range-container`}
@@ -86,12 +96,10 @@ export default function RangepickerInput({
8696
return (
8797
<InputUnit
8898
key={i}
89-
visibleType="end"
9099
dateValue={dateEndValue}
91100
setDateValue={setDateEndValue}
92101
timeValue={timeEndValue}
93102
setTimeValue={setTimeEndValue}
94-
setIsVisible={setIsVisible}
95103
type={type}
96104
viewDate={viewEndDate}
97105
setViewDate={setViewEndDate}
@@ -100,6 +108,13 @@ export default function RangepickerInput({
100108
);
101109
})}
102110
</div>
111+
<button
112+
type="button"
113+
className={`${NAME_SPACE}__trigger`}
114+
onClick={() => triggerHandler('end')}
115+
>
116+
Trigger
117+
</button>
103118
{useClearButton && (
104119
<button
105120
type="button"

0 commit comments

Comments
 (0)