Skip to content

Commit ba65bbb

Browse files
committed
v2.1.3
placeholder 옵션 제거 disabled 옵션 적용
1 parent f784603 commit ba65bbb

File tree

8 files changed

+112
-91
lines changed

8 files changed

+112
-91
lines changed

package/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@shinyongjun/react-datepicker",
3-
"version": "2.1.2",
3+
"version": "2.1.3",
44
"main": "./dist/cjs/index.js",
55
"module": "./dist/esm/index.js",
66
"source": "./src/index.tsx",

package/src/assets/global.css

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
align-items: center;
1010
padding: 8px 10px;
1111
border: 1px solid #ccc;
12+
&[aria-disabled='true'] {
13+
background-color: #ddd;
14+
}
1215
}
1316
.react-datepicker__input-range-container {
1417
position: relative;
@@ -85,12 +88,12 @@
8588
border: none;
8689
background-color: transparent;
8790
cursor: pointer;
88-
}
89-
.react-datepicker__controller-label:not(:disabled):hover {
90-
background-color: #f7f7f7;
91-
}
92-
.react-datepicker__controller-label:disabled {
93-
cursor: default;
91+
&:not(:disabled):hover {
92+
background-color: #f7f7f7;
93+
}
94+
&:disabled {
95+
cursor: default;
96+
}
9497
}
9598
.react-datepicker__controller-arrow {
9699
width: 36px;
@@ -101,9 +104,9 @@
101104
border: none;
102105
background-color: transparent;
103106
cursor: pointer;
104-
}
105-
.react-datepicker__controller-arrow:hover {
106-
background-color: #f7f7f7;
107+
&:hover {
108+
background-color: #f7f7f7;
109+
}
107110
}
108111
.react-datepicker__controller-extra-prev {
109112
background-image: url('data:image/svg+xml;base64,PHN2ZyBzdHJva2U9ImN1cnJlbnRDb2xvciIgZmlsbD0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaGVpZ2h0PSIxZW0iIHdpZHRoPSIxZW0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiI+PC9wYXRoPjxwYXRoIGQ9Ik0xNy41OSAxOEwxOSAxNi41OSAxNC40MiAxMiAxOSA3LjQxIDE3LjU5IDZsLTYgNnoiPjwvcGF0aD48cGF0aCBkPSJNMTEgMThsMS40MS0xLjQxTDcuODMgMTJsNC41OC00LjU5TDExIDZsLTYgNnoiPjwvcGF0aD48L3N2Zz4=');

package/src/components/Datepicker.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,9 @@ interface IProps {
3131
weekdayLabels?: string[];
3232
withPortal?: boolean;
3333
className?: string;
34-
placeholder?: string;
3534
disabled?: boolean;
3635
timepicker?: false | ITimepicker;
3736
timeStep?: ITimeStep;
38-
hourStep?: number;
39-
minuteStep?: number;
40-
secondStep?: number;
4137
onChange?: (activeDate: Date | null) => void;
4238
}
4339

@@ -53,7 +49,6 @@ function Datepicker({
5349
weekdayLabels = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
5450
withPortal = false,
5551
className = '',
56-
placeholder = '',
5752
disabled = false,
5853
timepicker = false,
5954
timeStep = { hour: 1, minute: 1, second: 1 },
@@ -154,7 +149,6 @@ function Datepicker({
154149
timeValue={timeValue}
155150
setTimeValue={setTimeValue}
156151
useClearButton={useClearButton}
157-
placeholder={placeholder}
158152
disabled={disabled}
159153
setIsVisible={setIsVisible}
160154
viewDate={viewDate}

package/src/components/Rangepicker.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ interface IProps {
3131
weekdayLabels?: string[];
3232
withPortal?: boolean;
3333
className?: string;
34-
placeholder?: string;
3534
disabled?: boolean;
3635
/** 시간선택기 사용 여부를 결정합니다. */
3736
timepicker?: false | ITimepicker;
@@ -52,7 +51,6 @@ export default function Rangepicker({
5251
weekdayLabels = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
5352
withPortal = false,
5453
className = '',
55-
placeholder = '',
5654
disabled = false,
5755
timepicker = false,
5856
timeStep = { hour: 1, minute: 1, second: 1 },
@@ -252,7 +250,6 @@ export default function Rangepicker({
252250
timeEndValue={timeEndValue}
253251
setTimeEndValue={setTimeEndValue}
254252
useClearButton={useClearButton}
255-
placeholder={placeholder}
256253
disabled={disabled}
257254
setIsVisible={setIsVisible}
258255
viewStartDate={viewStartDate}

package/src/components/input/DatepickerInput.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ interface IProps {
1313
timeValue: ITimeValue;
1414
setTimeValue: (value: ITimeValue) => void;
1515
useClearButton: boolean;
16-
placeholder: string;
1716
disabled: boolean;
1817
setIsVisible: (value: TIsVisible) => void;
1918
viewDate: string;
@@ -32,11 +31,16 @@ export default function DatepickerInput({
3231
setViewDate,
3332
inputRef,
3433
useClearButton,
34+
disabled,
3535
}: IProps) {
3636
const formatArray = useMemo(() => splitString(valueFormat), [valueFormat]);
3737

3838
return (
39-
<div className={`${NAME_SPACE}__input-container`} ref={inputRef}>
39+
<div
40+
className={`${NAME_SPACE}__input-container`}
41+
ref={inputRef}
42+
aria-disabled={disabled}
43+
>
4044
{formatArray.map((type, i) => {
4145
return (
4246
<InputUnit
@@ -49,6 +53,7 @@ export default function DatepickerInput({
4953
type={type}
5054
viewDate={viewDate}
5155
setViewDate={setViewDate}
56+
disabled={disabled}
5257
/>
5358
);
5459
})}

package/src/components/input/InputUnit.tsx

Lines changed: 83 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ interface IProps {
2323
setIsVisible: (value: TIsVisible) => void;
2424
viewDate: string;
2525
setViewDate: (value: string) => void;
26+
disabled: boolean;
2627
}
2728

2829
// Function to select text
@@ -65,6 +66,7 @@ function InputUnit({
6566
setIsVisible,
6667
viewDate,
6768
setViewDate,
69+
disabled,
6870
}: IProps) {
6971
const inputRef = useRef<HTMLDivElement>(null);
7072
const nextRef = useRef<HTMLElement>();
@@ -87,10 +89,6 @@ function InputUnit({
8789
}, [type, dateValue, timeValue]);
8890
const [text, setText] = useState<string>(displayUnit);
8991

90-
useEffect(() => {
91-
setText(displayUnit);
92-
}, [displayUnit]);
93-
9492
const utilSetDateValue = ({
9593
year,
9694
month,
@@ -147,43 +145,8 @@ function InputUnit({
147145
}
148146
};
149147

150-
// Text의 변화를 감지하여 Value에 최종 저장
151-
useEffect(() => {
152-
if (!isNumeric(text as string)) return;
153-
154-
switch (type) {
155-
case 'YYYY':
156-
utilSetDateValue({ ...dateValue, year: Number(text) });
157-
setViewDate(
158-
`${text}-${viewDate.split('-')[1]}-${viewDate.split('-')[2]}`
159-
);
160-
return;
161-
case 'MM':
162-
utilSetDateValue({ ...dateValue, month: Number(text) - 1 });
163-
setViewDate(
164-
`${viewDate.split('-')[0]}-${text}-${viewDate.split('-')[2]}`
165-
);
166-
return;
167-
case 'DD':
168-
utilSetDateValue({ ...dateValue, date: Number(text) });
169-
return;
170-
case 'hh':
171-
utilSetTimeValue({ ...timeValue, hour: Number(text) });
172-
return;
173-
case 'mm':
174-
utilSetTimeValue({ ...timeValue, minute: Number(text) });
175-
return;
176-
case 'ss':
177-
utilSetTimeValue({ ...timeValue, second: Number(text) });
178-
return;
179-
default:
180-
return;
181-
}
182-
// eslint-disable-next-line react-hooks/exhaustive-deps
183-
}, [text]);
184-
185148
// Type마다 특정 자리수 입력 시 다음 Input으로 focusing
186-
const handleInput = (e: FormEvent<HTMLDivElement>) => {
149+
const inputHandler = (e: FormEvent<HTMLDivElement>) => {
187150
const target = e.target as HTMLDivElement;
188151
const count = target.textContent?.length || 0;
189152
const value = Number(target.textContent);
@@ -256,17 +219,6 @@ function InputUnit({
256219
}
257220
};
258221

259-
// 다음 Input Unit을 nextRef에 저장.
260-
useEffect(() => {
261-
if (inputRef.current) {
262-
const nextSiblings = getNextSiblingsWithDataValueTrue(inputRef.current);
263-
264-
if (nextSiblings.length) {
265-
nextRef.current = nextSiblings[0];
266-
}
267-
}
268-
}, []);
269-
270222
// 허용된 입력 외 prevent
271223
const numberChecker = (e: KeyboardEvent) => {
272224
const allowKeys = [
@@ -283,31 +235,95 @@ function InputUnit({
283235
}
284236
};
285237

238+
const focusHandler = (e: React.FocusEvent<HTMLDivElement>) => {
239+
if (disabled) return;
240+
setIsVisible(visibleType);
241+
setTimeout(() => {
242+
selectText(e.target);
243+
}, 10);
244+
};
245+
246+
const clickHandler = (e: React.MouseEvent<HTMLDivElement>) => {
247+
if (disabled) return;
248+
if (!isValue) {
249+
if (nextRef.current) {
250+
nextRef.current.focus();
251+
}
252+
} else {
253+
const target = e.target as HTMLElement;
254+
selectText(target);
255+
}
256+
};
257+
258+
const blurHandler = (e: React.FocusEvent<HTMLDivElement>) => {
259+
if (disabled) return;
260+
setValue(e.target);
261+
};
262+
263+
useEffect(() => {
264+
setText(displayUnit);
265+
}, [displayUnit]);
266+
267+
// Text의 변화를 감지하여 Value에 최종 저장
268+
useEffect(() => {
269+
if (!isNumeric(text as string)) return;
270+
271+
switch (type) {
272+
case 'YYYY':
273+
utilSetDateValue({ ...dateValue, year: Number(text) });
274+
setViewDate(
275+
`${text}-${viewDate.split('-')[1]}-${viewDate.split('-')[2]}`
276+
);
277+
return;
278+
case 'MM':
279+
utilSetDateValue({ ...dateValue, month: Number(text) - 1 });
280+
setViewDate(
281+
`${viewDate.split('-')[0]}-${text}-${viewDate.split('-')[2]}`
282+
);
283+
return;
284+
case 'DD':
285+
utilSetDateValue({ ...dateValue, date: Number(text) });
286+
return;
287+
case 'hh':
288+
utilSetTimeValue({ ...timeValue, hour: Number(text) });
289+
return;
290+
case 'mm':
291+
utilSetTimeValue({ ...timeValue, minute: Number(text) });
292+
return;
293+
case 'ss':
294+
utilSetTimeValue({ ...timeValue, second: Number(text) });
295+
return;
296+
default:
297+
return;
298+
}
299+
// eslint-disable-next-line react-hooks/exhaustive-deps
300+
}, [text]);
301+
302+
// 다음 Input Unit을 nextRef에 저장.
303+
useEffect(() => {
304+
if (inputRef.current) {
305+
const nextSiblings = getNextSiblingsWithDataValueTrue(inputRef.current);
306+
307+
if (nextSiblings.length) {
308+
nextRef.current = nextSiblings[0];
309+
}
310+
}
311+
}, []);
312+
286313
return (
287314
<div
288315
role="presentation"
289316
ref={inputRef}
290317
data-value={isValue}
291318
className={`${NAME_SPACE}__input-unit`}
292319
dangerouslySetInnerHTML={{ __html: text }}
293-
contentEditable={isValue}
320+
contentEditable={isValue && !disabled}
294321
suppressContentEditableWarning={true}
295-
onFocus={(e) => {
296-
setIsVisible(visibleType);
297-
setTimeout(() => {
298-
selectText(e.target);
299-
}, 10);
300-
}}
301-
onClick={(e) => {
302-
if (!isValue) return;
303-
const target = e.target as HTMLElement;
304-
selectText(target);
305-
}}
306-
onInput={handleInput}
322+
onFocus={focusHandler}
323+
onClick={clickHandler}
324+
onInput={inputHandler}
307325
onKeyDown={numberChecker}
308-
onBlur={(e) => {
309-
setValue(e.target);
310-
}}
326+
onBlur={blurHandler}
311327
inputMode="numeric"
312328
/>
313329
);

package/src/components/input/RangepickerInput.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ interface IProps {
1717
timeEndValue: ITimeValue;
1818
setTimeEndValue: (value: ITimeValue) => void;
1919
useClearButton: boolean;
20-
placeholder: string;
2120
disabled: boolean;
2221
setIsVisible: (value: TIsVisible) => void;
2322
viewStartDate: string;
@@ -46,11 +45,16 @@ export default function RangepickerInput({
4645
inputRef,
4746
isVisible,
4847
useClearButton,
48+
disabled,
4949
}: IProps) {
5050
const formatArray = useMemo(() => splitString(valueFormat), [valueFormat]);
5151

5252
return (
53-
<div className={`${NAME_SPACE}__input-container`} ref={inputRef}>
53+
<div
54+
className={`${NAME_SPACE}__input-container`}
55+
ref={inputRef}
56+
aria-disabled={disabled}
57+
>
5458
<div
5559
className={`${NAME_SPACE}__input-range-container`}
5660
data-active={isVisible === 'start'}
@@ -68,6 +72,7 @@ export default function RangepickerInput({
6872
type={type}
6973
viewDate={viewStartDate}
7074
setViewDate={setViewStartDate}
75+
disabled={disabled}
7176
/>
7277
);
7378
})}
@@ -90,6 +95,7 @@ export default function RangepickerInput({
9095
type={type}
9196
viewDate={viewEndDate}
9297
setViewDate={setViewEndDate}
98+
disabled={disabled}
9399
/>
94100
);
95101
})}

test/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function App() {
88
return (
99
<div>
1010
<section>
11-
<Datepicker disabled />
11+
<Rangepicker disabled />
1212
</section>
1313
<section>
1414
<h3>useClearButton</h3>

0 commit comments

Comments
 (0)