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

chore: optimize disabledDate logic #191

Merged
merged 11 commits into from
Dec 30, 2020
Next Next commit
chore: optimize disabledDate logic
kerm1it committed Dec 19, 2020

Unverified

This commit is not signed, but one or more authors requires that any commit attributed to them is signed.
commit b7c3ca10e01e6ea9d1b9977963be354fba2b739b
3 changes: 2 additions & 1 deletion src/PanelContext.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { OnSelect } from './interface';
import { OnSelect, PanelMode } from './interface';

export type ContextOperationRefProps = {
onKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => boolean;
@@ -18,6 +18,7 @@ export interface PanelContextProps {
onSelect?: OnSelect<any>;
hideRanges?: boolean;
open?: boolean;
mode?: PanelMode;

/** Only used for TimePicker and this is a deprecated prop */
defaultOpenValue?: any;
3 changes: 2 additions & 1 deletion src/PickerPanel.tsx
Original file line number Diff line number Diff line change
@@ -347,7 +347,7 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
onViewDateChange: setViewDate,
sourceMode,
onPanelChange: onInternalPanelChange,
disabledDate: mergedMode !== 'decade' ? disabledDate : undefined,
disabledDate,
};
delete pickerProps.onChange;
delete pickerProps.onSelect;
@@ -521,6 +521,7 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
<PanelContext.Provider
value={{
...panelContext,
mode: mergedMode,
hideHeader: 'hideHeader' in props ? hideHeader : panelContext.hideHeader,
hidePrevBtn: inRange && panelPosition === 'right',
hideNextBtn: inRange && panelPosition === 'left',
17 changes: 13 additions & 4 deletions src/panels/PanelBody.tsx
Original file line number Diff line number Diff line change
@@ -4,6 +4,7 @@ import PanelContext from '../PanelContext';
import { GenerateConfig } from '../generate';
import { getLastDay } from '../utils/timeUtil';
import { PanelMode } from '../interface';
import { getCellDateDisabled } from '../utils/dateUtil';

export interface PanelBodyProps<DateType> {
prefixCls: string;
@@ -46,7 +47,7 @@ export default function PanelBody<DateType>({
titleCell,
headerCells,
}: PanelBodyProps<DateType>) {
const { onDateMouseEnter, onDateMouseLeave } = React.useContext(PanelContext);
const { onDateMouseEnter, onDateMouseLeave, mode } = React.useContext(PanelContext);

const cellPrefixCls = `${prefixCls}-cell`;

@@ -60,7 +61,12 @@ export default function PanelBody<DateType>({
for (let j = 0; j < colNum; j += 1) {
const offset = i * colNum + j;
const currentDate = getCellDate(baseDate, offset);
const disabled = disabledDate && disabledDate(currentDate);
const disabled = getCellDateDisabled({
cellDate: currentDate,
mode,
disabledDate,
generateConfig,
});

if (j === 0) {
rowStartDate = currentDate;
@@ -78,8 +84,11 @@ export default function PanelBody<DateType>({
title={title}
className={classNames(cellPrefixCls, {
[`${cellPrefixCls}-disabled`]: disabled,
[`${cellPrefixCls}-start`]: getCellText(currentDate) === 1 || picker === 'year' && Number(title) % 10 === 0,
[`${cellPrefixCls}-end`]: title === getLastDay(generateConfig, currentDate) || picker === 'year' && Number(title) % 10 === 9,
[`${cellPrefixCls}-start`]:
getCellText(currentDate) === 1 || (picker === 'year' && Number(title) % 10 === 0),
[`${cellPrefixCls}-end`]:
title === getLastDay(generateConfig, currentDate) ||
(picker === 'year' && Number(title) % 10 === 9),
...getCellClassName(currentDate),
})}
onClick={() => {
98 changes: 97 additions & 1 deletion src/utils/dateUtil.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { DECADE_UNIT_DIFF } from '../panels/DecadePanel/index';
import { PanelMode, NullableDateType, PickerMode, Locale, CustomFormat } from '../interface';
import { GenerateConfig } from '../generate';
import { NullableDateType, PickerMode, Locale, CustomFormat } from '../interface';

export const WEEK_DAY_COUNT = 7;

@@ -228,3 +229,98 @@ export function parseValue<DateType>(

return generateConfig.locale.parse(locale.locale, value, formatList as string[]);
}

export function getCellDateDisabled<DateType>({
cellDate,
mode,
disabledDate,
generateConfig,
}: {
cellDate: DateType;
mode: PanelMode;
generateConfig: GenerateConfig<DateType>;
disabledDate?: (date: DateType) => boolean;
}): boolean {
if (!disabledDate) return false;
switch (mode) {
case 'date':
case 'week': {
return disabledDate(cellDate);
}
case 'month': {
const startDate = 1;
const endDate = generateConfig.getDate(generateConfig.getEndDate(cellDate));
let currentDate = startDate;
while (currentDate <= endDate) {
const date = generateConfig.setDate(cellDate, currentDate);
if (!disabledDate(date)) {
return false;
}
currentDate += 1;
}
return true;
}
case 'quarter': {
const startMonth = Math.floor(generateConfig.getMonth(cellDate) / 3) * 3;
const endMonth = startMonth + 2;
let currentMonth = startMonth;
while (currentMonth <= endMonth) {
const date = generateConfig.setMonth(cellDate, currentMonth);
if (
!getCellDateDisabled({
cellDate: date,
mode: 'month',
generateConfig,
disabledDate,
})
) {
return false;
}
currentMonth += 1;
}
return true;
}
case 'year': {
const startMonth = 0;
const endMonth = 11;
let currentMonth = startMonth;
while (currentMonth <= endMonth) {
const date = generateConfig.setMonth(cellDate, currentMonth);
if (
!getCellDateDisabled({
cellDate: date,
mode: 'month',
generateConfig,
disabledDate,
})
) {
return false;
}
currentMonth += 1;
}
return true;
}
case 'decade': {
const year = generateConfig.getYear(cellDate);
const startYear = Math.floor(year / DECADE_UNIT_DIFF) * DECADE_UNIT_DIFF;
const endYear = startYear + DECADE_UNIT_DIFF - 1;
let currentYear = startYear;
while (currentYear <= endYear) {
const date = generateConfig.setYear(cellDate, currentYear);
if (
!getCellDateDisabled({
cellDate: date,
mode: 'year',
generateConfig,
disabledDate,
})
) {
return false;
}
currentYear += 1;
}
return true;
}
}
return false;
}