From d1c1e446029a282497f4275b5e85e2912932101b Mon Sep 17 00:00:00 2001 From: "jinli.lyy" Date: Fri, 30 Nov 2018 21:42:27 +0800 Subject: [PATCH] feat(Calendar): support rtl --- src/calendar/calendar.jsx | 11 +++- src/calendar/head/date-panel-header.jsx | 15 ++++-- src/calendar/head/month-panel-header.jsx | 8 +-- src/calendar/head/range-panel-header.jsx | 14 +++-- src/calendar/head/year-panel-header.jsx | 8 +-- src/calendar/main.scss | 1 + src/calendar/range-calendar.jsx | 10 +++- src/calendar/rtl.scss | 69 ++++++++++++++++++++++++ src/calendar/table/year-table.jsx | 6 +-- 9 files changed, 120 insertions(+), 22 deletions(-) create mode 100644 src/calendar/rtl.scss diff --git a/src/calendar/calendar.jsx b/src/calendar/calendar.jsx index 46c8673067..d3b1240802 100644 --- a/src/calendar/calendar.jsx +++ b/src/calendar/calendar.jsx @@ -17,6 +17,7 @@ import { checkMomentObj, formatDateValue, getVisibleMonth, isSameYearMonth, CALE class Calendar extends Component { static propTypes = { prefix: PropTypes.string, + rtl: PropTypes.bool, /** * 默认选中的日期(moment 对象) */ @@ -84,6 +85,7 @@ class Calendar extends Component { static defaultProps = { prefix: 'next-', + rtl: false, shape: 'fullscreen', modes: CALENDAR_MODES, format: 'YYYY-MM-DD', @@ -188,7 +190,7 @@ class Calendar extends Component { } render() { - const { prefix, className, shape, showOtherMonth, format, locale, dateCellRender, monthCellRender, disabledDate, ...others } = this.props; + const { prefix, rtl, className, shape, showOtherMonth, format, locale, dateCellRender, monthCellRender, disabledDate, ...others } = this.props; const state = this.state; const classNames = classnames({ @@ -196,6 +198,10 @@ class Calendar extends Component { [`${prefix}calendar-${shape}`]: shape, }, className); + if (rtl) { + others.dir = 'rtl'; + } + const visibleMonth = state.visibleMonth; // reset moment locale @@ -211,6 +217,7 @@ class Calendar extends Component { value: state.value, mode: state.mode, locale, + rtl, visibleMonth, momentLocale: localeData, changeMode: this.changeMode, @@ -242,7 +249,7 @@ class Calendar extends Component { const tables = { [CALENDAR_MODE_DATE]: , [CALENDAR_MODE_MONTH]: , - [CALENDAR_MODE_YEAR]: , + [CALENDAR_MODE_YEAR]: , }; const panelHeaders = { diff --git a/src/calendar/head/date-panel-header.jsx b/src/calendar/head/date-panel-header.jsx index d74634b96d..cff0872178 100644 --- a/src/calendar/head/date-panel-header.jsx +++ b/src/calendar/head/date-panel-header.jsx @@ -4,24 +4,29 @@ import Icon from '../../icon'; class DatePanelHeader extends React.PureComponent { render() { - const { prefix, visibleMonth, momentLocale, locale, changeMode, goNextMonth, goNextYear, goPrevMonth, goPrevYear } = this.props; + const { prefix, rtl, visibleMonth, momentLocale, locale, changeMode, goNextMonth, goNextYear, goPrevMonth, goPrevYear } = this.props; const localedMonths = momentLocale.months(); const monthLabel = localedMonths[visibleMonth.month()]; const yearLable = visibleMonth.year(); const btnCls = `${prefix}calendar-btn`; + const leftIcon = rtl ? : ; + const rightIcon = rtl ? : ; + const leftDoubleIcon = rtl ? : ; + const rightDoubleIcon = rtl ? : ; + return (
+ onClick={goPrevYear}>{leftDoubleIcon} + onClick={goPrevMonth}>{leftIcon}
@@ -30,12 +35,12 @@ class DatePanelHeader extends React.PureComponent { role="button" title={locale.nextMonth} className={`${btnCls} ${btnCls}-next-month`} - onClick={goNextMonth}> + onClick={goNextMonth}>{rightIcon} + onClick={goNextYear}>{rightDoubleIcon}
); } } diff --git a/src/calendar/head/month-panel-header.jsx b/src/calendar/head/month-panel-header.jsx index 9a4d441bb5..8a075642af 100644 --- a/src/calendar/head/month-panel-header.jsx +++ b/src/calendar/head/month-panel-header.jsx @@ -4,16 +4,18 @@ import Icon from '../../icon'; class MonthPanelHeader extends React.PureComponent { render() { - const { prefix, visibleMonth, locale, changeMode, goPrevYear, goNextYear } = this.props; + const { prefix, rtl, visibleMonth, locale, changeMode, goPrevYear, goNextYear } = this.props; const yearLabel = visibleMonth.year(); const btnCls = `${prefix}calendar-btn`; + const leftDoubleIcon = rtl ? : ; + const rightDoubleIcon = rtl ? : ; return (
+ onClick={goPrevYear}>{leftDoubleIcon}
@@ -21,7 +23,7 @@ class MonthPanelHeader extends React.PureComponent { role="button" title={locale.nextYear} className={`${btnCls} ${btnCls}-next-year`} - onClick={goNextYear}> + onClick={goNextYear}>{rightDoubleIcon}
); } } diff --git a/src/calendar/head/range-panel-header.jsx b/src/calendar/head/range-panel-header.jsx index b56e0ff65e..d3041abf68 100644 --- a/src/calendar/head/range-panel-header.jsx +++ b/src/calendar/head/range-panel-header.jsx @@ -4,7 +4,7 @@ import Icon from '../../icon'; class RangePanelHeader extends React.PureComponent { render() { - const { prefix, startVisibleMonth, endVisibleMonth, momentLocale, locale, changeMode, goNextMonth, goNextYear, goPrevMonth, goPrevYear } = this.props; + const { prefix, rtl, startVisibleMonth, endVisibleMonth, momentLocale, locale, changeMode, goNextMonth, goNextYear, goPrevMonth, goPrevYear } = this.props; const localedMonths = momentLocale.months(); const startMonthLabel = localedMonths[startVisibleMonth.month()]; @@ -12,18 +12,22 @@ class RangePanelHeader extends React.PureComponent { const startYearLable = startVisibleMonth.year(); const endYearLabel = endVisibleMonth.year(); const btnCls = `${prefix}calendar-btn`; + const leftIcon = rtl ? : ; + const rightIcon = rtl ? : ; + const leftDoubleIcon = rtl ? : ; + const rightDoubleIcon = rtl ? : ; return (
+ onClick={goPrevYear}>{leftDoubleIcon} + onClick={goPrevMonth}>{leftIcon}
@@ -36,12 +40,12 @@ class RangePanelHeader extends React.PureComponent { role="button" title={locale.nextMonth} className={`${btnCls} ${btnCls}-next-month`} - onClick={goNextMonth}> + onClick={goNextMonth}>{rightIcon} + onClick={goNextYear}>{rightDoubleIcon}
); } } diff --git a/src/calendar/head/year-panel-header.jsx b/src/calendar/head/year-panel-header.jsx index 0233cdf8bf..2678ba26a3 100644 --- a/src/calendar/head/year-panel-header.jsx +++ b/src/calendar/head/year-panel-header.jsx @@ -11,16 +11,18 @@ class YearPanelHeader extends React.PureComponent { } render() { - const { prefix, visibleMonth, locale, goPrevDecade, goNextDecade } = this.props; + const { prefix, rtl, visibleMonth, locale, goPrevDecade, goNextDecade } = this.props; const decadeLable = this.getDecadeLabel(visibleMonth); const btnCls = `${prefix}calendar-btn`; + const leftDoubleIcon = rtl ? : ; + const rightDoubleIcon = rtl ? : ; return (
+ onClick={goPrevDecade}>{leftDoubleIcon}
@@ -28,7 +30,7 @@ class YearPanelHeader extends React.PureComponent { role="button" title={locale.nextDecade} className={`${btnCls} ${btnCls}-next-decade`} - onClick={goNextDecade}> + onClick={goNextDecade}>{rightDoubleIcon}
); } } diff --git a/src/calendar/main.scss b/src/calendar/main.scss index a55d1108d3..688ed83ddd 100644 --- a/src/calendar/main.scss +++ b/src/calendar/main.scss @@ -7,6 +7,7 @@ @import "scss/header"; @import "scss/table"; +@import "./rtl.scss"; #{$calendar-prefix} { &-table { diff --git a/src/calendar/range-calendar.jsx b/src/calendar/range-calendar.jsx index 14b84e7524..9588a7d9c9 100644 --- a/src/calendar/range-calendar.jsx +++ b/src/calendar/range-calendar.jsx @@ -20,6 +20,7 @@ class RangeCalendar extends React.Component { * 样式前缀 */ prefix: PropTypes.string, + rtl: PropTypes.bool, /** * 默认的开始日期 */ @@ -75,6 +76,7 @@ class RangeCalendar extends React.Component { static defaultProps = { prefix: 'next-', + rtl: false, mode: CALENDAR_MODE_DATE, format: 'YYYY-MM-DD', dateCellRender: (value) => value.date(), @@ -189,7 +191,7 @@ class RangeCalendar extends React.Component { } render() { - const { prefix, dateCellRender, className, format, locale, showOtherMonth, disabledDate, ...others } = this.props; + const { prefix, rtl, dateCellRender, className, format, locale, showOtherMonth, disabledDate, ...others } = this.props; const { startValue, endValue, mode, startVisibleMonth, activePanel } = this.state; // reset moment locale @@ -199,11 +201,16 @@ class RangeCalendar extends React.Component { startVisibleMonth.locale(locale.momentLocale); } + if (rtl) { + others.dir = 'rtl'; + } + const localeData = startVisibleMonth.localeData(); const endVisibleMonth = startVisibleMonth.clone().add(1, 'months'); const headerProps = { prefix, + rtl, mode, locale, momentLocale: localeData, @@ -264,6 +271,7 @@ class RangeCalendar extends React.Component { case CALENDAR_MODE_YEAR: { table = (; + content = rtl ? : ; } else if (i === lastRowIndex && j === lastColIndex) { title = locale.nextDecade; onClick = goNextDecade; - content = ; + content = rtl ? : ; } else { year = startYear + counter++; content = year;