Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add date picker #2644

Merged
merged 32 commits into from
Jun 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5847318
feat: add react-datepicker
JimmFly Jun 1, 2023
286c30d
chore: add type of react-datepicker
JimmFly Jun 1, 2023
a78d736
feat: init date picker component
JimmFly Jun 1, 2023
866e887
chore: update style
JimmFly Jun 2, 2023
98fae44
chore: add date-picker to storybook
JimmFly Jun 2, 2023
8f42cea
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 2, 2023
90b1b10
chore: update style
JimmFly Jun 5, 2023
54f6a49
chore: add icon to filter item
JimmFly Jun 5, 2023
6fd7308
chore: adjust style
JimmFly Jun 5, 2023
a18adbb
feat: init month-picker
JimmFly Jun 5, 2023
08eab9d
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 5, 2023
7da2ef7
chore: update test
JimmFly Jun 5, 2023
2d92451
chore: adjust icon color
JimmFly Jun 5, 2023
b2a9cb3
fix: wrong storage of react element
JimmFly Jun 5, 2023
fff3bce
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 6, 2023
423167a
chore: update type name
JimmFly Jun 6, 2023
1b961e8
chore: adjust style
JimmFly Jun 6, 2023
6183abc
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 6, 2023
4983ee3
refactor: month picker
JimmFly Jun 6, 2023
5aa27f9
fix: ci
himself65 Jun 7, 2023
cc95189
test: add date picker test
JimmFly Jun 7, 2023
3dcfa3d
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 7, 2023
4f74402
chore: update style
JimmFly Jun 7, 2023
4c67674
chore: move file
JimmFly Jun 7, 2023
70c4adc
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 7, 2023
3fbaf77
fix: code
himself65 Jun 7, 2023
5f72216
Merge branch 'master' into feat/add-date-picker
himself65 Jun 7, 2023
db1e3b9
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 8, 2023
0715422
chore: add onClick handler
JimmFly Jun 8, 2023
3fb37d7
chore: update test
JimmFly Jun 8, 2023
9797a16
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 8, 2023
c317745
Merge branch 'master' into feat/add-date-picker
JimmFly Jun 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/component/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"lit": "^2.7.5",
"lottie-web": "^5.12.0",
"react": "18.3.0-canary-16d053d59-20230506",
"react-datepicker": "^4.12.0",
"react-dom": "18.3.0-canary-16d053d59-20230506",
"react-error-boundary": "^4.0.9",
"react-is": "^18.2.0",
Expand All @@ -56,6 +57,7 @@
"@blocksuite/lit": "0.0.0-20230606130340-805f430b-nightly",
"@blocksuite/store": "0.0.0-20230606130340-805f430b-nightly",
"@types/react": "^18.2.6",
"@types/react-datepicker": "^4.11.2",
"@types/react-dnd": "^3.0.2",
"@types/react-dom": "18.2.4",
"@vanilla-extract/css": "^1.11.0",
Expand Down
191 changes: 191 additions & 0 deletions packages/component/src/components/date-picker/date-picker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
import {
ArrowDownSmallIcon,
ArrowLeftSmallIcon,
ArrowRightSmallIcon,
} from '@blocksuite/icons';
import dayjs from 'dayjs';
import { useCallback, useState } from 'react';
import DatePicker from 'react-datepicker';

import * as styles from './index.css';
const months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December',
];
type DatePickerProps = {
value?: string;
onChange: (value: string) => void;
};

export const AFFiNEDatePicker = (props: DatePickerProps) => {
const { value, onChange } = props;
const [openMonthPicker, setOpenMonthPicker] = useState(false);
const [selectedDate, setSelectedDate] = useState<Date | null>(
value ? dayjs(value).toDate() : null
);
const handleOpenMonthPicker = useCallback(() => {
setOpenMonthPicker(true);
}, []);
const handleCloseMonthPicker = useCallback(() => {
setOpenMonthPicker(false);
}, []);
const handleSelectDate = (date: Date | null) => {
if (date) {
setSelectedDate(date);
onChange(dayjs(date).format('YYYY-MM-DD'));
setOpenMonthPicker(false);
}
};
const renderCustomHeader = ({
date,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
}: {
date: Date;
decreaseMonth: () => void;
increaseMonth: () => void;
prevMonthButtonDisabled: boolean;
nextMonthButtonDisabled: boolean;
}) => {
const selectedYear = dayjs(date).year();
const selectedMonth = dayjs(date).month();
return (
<div className={styles.headerStyle}>
<div
data-testid="date-picker-current-month"
className={styles.mouthStyle}
>
{months[selectedMonth]}
</div>
<div
data-testid="date-picker-current-year"
className={styles.yearStyle}
>
{selectedYear}
</div>
<div
data-testid="month-picker-button"
className={styles.arrowDownStyle}
onClick={handleOpenMonthPicker}
>
<ArrowDownSmallIcon />
</div>
<button
data-testid="date-picker-prev-button"
className={styles.arrowLeftStyle}
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
>
<ArrowLeftSmallIcon />
</button>
<button
data-testid="date-picker-next-button"
className={styles.arrowRightStyle}
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
>
<ArrowRightSmallIcon />
</button>
</div>
);
};
const renderCustomMonthHeader = ({
date,
decreaseYear,
increaseYear,
prevYearButtonDisabled,
nextYearButtonDisabled,
}: {
date: Date;
decreaseYear: () => void;
increaseYear: () => void;
prevYearButtonDisabled: boolean;
nextYearButtonDisabled: boolean;
}) => {
const selectedYear = dayjs(date).year();
return (
<div className={styles.monthHeaderStyle}>
<div
data-testid="month-picker-current-year"
className={styles.monthTitleStyle}
>
{selectedYear}
</div>
<button
data-testid="month-picker-prev-button"
className={styles.arrowLeftStyle}
onClick={decreaseYear}
disabled={prevYearButtonDisabled}
>
<ArrowLeftSmallIcon />
</button>
<button
data-testid="month-picker-next-button"
className={styles.arrowRightStyle}
onClick={increaseYear}
disabled={nextYearButtonDisabled}
>
<ArrowRightSmallIcon />
</button>
</div>
);
};
return (
<DatePicker
onClickOutside={handleCloseMonthPicker}
className={styles.inputStyle}
calendarClassName={styles.calendarStyle}
weekDayClassName={() => styles.weekStyle}
dayClassName={() => styles.dayStyle}
popperClassName={styles.popperStyle}
monthClassName={() => styles.mouthsStyle}
selected={selectedDate}
onChange={handleSelectDate}
showPopperArrow={false}
dateFormat="MMM dd"
showMonthYearPicker={openMonthPicker}
shouldCloseOnSelect={!openMonthPicker}
renderCustomHeader={({
date,
decreaseYear,
increaseYear,
decreaseMonth,
increaseMonth,
prevYearButtonDisabled,
nextYearButtonDisabled,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
}) =>
openMonthPicker
? renderCustomMonthHeader({
date,
decreaseYear,
increaseYear,
prevYearButtonDisabled,
nextYearButtonDisabled,
})
: renderCustomHeader({
date,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
})
}
/>
);
};

export default AFFiNEDatePicker;