You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.8 KiB
153 lines
4.8 KiB
5 years ago
|
import * as React from 'react';
|
||
|
import { GenerateConfig } from 'rc-picker/lib/generate/index';
|
||
|
import {
|
||
|
PickerBaseProps as RCPickerBaseProps,
|
||
|
PickerDateProps as RCPickerDateProps,
|
||
|
PickerTimeProps as RCPickerTimeProps,
|
||
|
} from 'rc-picker/lib/Picker';
|
||
|
import { SharedTimeProps } from 'rc-picker/lib/panels/TimePanel';
|
||
|
import {
|
||
|
RangePickerBaseProps as RCRangePickerBaseProps,
|
||
|
RangePickerDateProps as RCRangePickerDateProps,
|
||
|
RangePickerTimeProps as RCRangePickerTimeProps,
|
||
|
} from 'rc-picker/lib/RangePicker';
|
||
|
import { PickerMode, Locale as RcPickerLocale } from 'rc-picker/lib/interface';
|
||
|
import { SizeType } from '../../config-provider/SizeContext';
|
||
|
import PickerButton from '../PickerButton';
|
||
|
import PickerTag from '../PickerTag';
|
||
|
import { TimePickerLocale } from '../../time-picker';
|
||
|
import generateSinglePicker from './generateSinglePicker';
|
||
|
import generateRangePicker from './generateRangePicker';
|
||
|
|
||
|
export const Components = { button: PickerButton, rangeItem: PickerTag };
|
||
|
|
||
|
function toArray<T>(list: T | T[]): T[] {
|
||
|
if (!list) {
|
||
|
return [];
|
||
|
}
|
||
|
return Array.isArray(list) ? list : [list];
|
||
|
}
|
||
|
|
||
|
export function getTimeProps<DateType>(
|
||
|
props: { format?: string; picker?: PickerMode } & SharedTimeProps<DateType>,
|
||
|
) {
|
||
|
const { format, picker, showHour, showMinute, showSecond, use12Hours } = props;
|
||
|
|
||
|
const firstFormat = toArray(format)[0];
|
||
|
const showTimeObj: SharedTimeProps<DateType> = { ...props };
|
||
|
|
||
|
if (firstFormat) {
|
||
|
if (!firstFormat.includes('s') && showSecond === undefined) {
|
||
|
showTimeObj.showSecond = false;
|
||
|
}
|
||
|
if (!firstFormat.includes('m') && showMinute === undefined) {
|
||
|
showTimeObj.showMinute = false;
|
||
|
}
|
||
|
if (!firstFormat.includes('H') && !firstFormat.includes('h') && showHour === undefined) {
|
||
|
showTimeObj.showHour = false;
|
||
|
}
|
||
|
|
||
|
if ((firstFormat.includes('a') || firstFormat.includes('A')) && use12Hours === undefined) {
|
||
|
showTimeObj.use12Hours = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (picker === 'time') {
|
||
|
return showTimeObj;
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
showTime: showTimeObj,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
type InjectDefaultProps<Props> = Omit<
|
||
|
Props,
|
||
|
| 'locale'
|
||
|
| 'generateConfig'
|
||
|
| 'prevIcon'
|
||
|
| 'nextIcon'
|
||
|
| 'superPrevIcon'
|
||
|
| 'superNextIcon'
|
||
|
| 'hideHeader'
|
||
|
| 'components'
|
||
|
> & {
|
||
|
locale?: PickerLocale;
|
||
|
size?: SizeType;
|
||
|
bordered?: boolean;
|
||
|
};
|
||
|
|
||
|
export type PickerLocale = {
|
||
|
lang: RcPickerLocale & AdditionalPickerLocaleLangProps;
|
||
|
timePickerLocale: TimePickerLocale;
|
||
|
} & AdditionalPickerLocaleProps;
|
||
|
|
||
|
export type AdditionalPickerLocaleProps = {
|
||
|
dateFormat?: string;
|
||
|
dateTimeFormat?: string;
|
||
|
weekFormat?: string;
|
||
|
monthFormat?: string;
|
||
|
};
|
||
|
|
||
|
export type AdditionalPickerLocaleLangProps = {
|
||
|
placeholder: string;
|
||
|
yearPlaceholder?: string;
|
||
|
quarterPlaceholder?: string;
|
||
|
monthPlaceholder?: string;
|
||
|
weekPlaceholder?: string;
|
||
|
rangeYearPlaceholder?: [string, string];
|
||
|
rangeMonthPlaceholder?: [string, string];
|
||
|
rangeWeekPlaceholder?: [string, string];
|
||
|
rangePlaceholder?: [string, string];
|
||
|
};
|
||
|
|
||
|
// Picker Props
|
||
|
export type PickerBaseProps<DateType> = InjectDefaultProps<RCPickerBaseProps<DateType>>;
|
||
|
export type PickerDateProps<DateType> = InjectDefaultProps<RCPickerDateProps<DateType>>;
|
||
|
export type PickerTimeProps<DateType> = InjectDefaultProps<RCPickerTimeProps<DateType>>;
|
||
|
|
||
|
export type PickerProps<DateType> =
|
||
|
| PickerBaseProps<DateType>
|
||
|
| PickerDateProps<DateType>
|
||
|
| PickerTimeProps<DateType>;
|
||
|
|
||
|
// Range Picker Props
|
||
|
export type RangePickerBaseProps<DateType> = InjectDefaultProps<RCRangePickerBaseProps<DateType>>;
|
||
|
export type RangePickerDateProps<DateType> = InjectDefaultProps<RCRangePickerDateProps<DateType>>;
|
||
|
export type RangePickerTimeProps<DateType> = InjectDefaultProps<RCRangePickerTimeProps<DateType>>;
|
||
|
|
||
|
export type RangePickerProps<DateType> =
|
||
|
| RangePickerBaseProps<DateType>
|
||
|
| RangePickerDateProps<DateType>
|
||
|
| RangePickerTimeProps<DateType>;
|
||
|
|
||
|
function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
||
|
// =========================== Picker ===========================
|
||
|
const { DatePicker, WeekPicker, MonthPicker, YearPicker, TimePicker } = generateSinglePicker(
|
||
|
generateConfig,
|
||
|
);
|
||
|
|
||
|
// ======================== Range Picker ========================
|
||
|
const RangePicker = generateRangePicker(generateConfig);
|
||
|
|
||
|
// =========================== Export ===========================
|
||
|
type MergedDatePicker = typeof DatePicker & {
|
||
|
WeekPicker: typeof WeekPicker;
|
||
|
MonthPicker: typeof MonthPicker;
|
||
|
YearPicker: typeof YearPicker;
|
||
|
RangePicker: React.ComponentClass<RangePickerProps<DateType>>;
|
||
|
TimePicker: typeof TimePicker;
|
||
|
};
|
||
|
|
||
|
const MergedDatePicker = DatePicker as MergedDatePicker;
|
||
|
MergedDatePicker.WeekPicker = WeekPicker;
|
||
|
MergedDatePicker.MonthPicker = MonthPicker;
|
||
|
MergedDatePicker.YearPicker = YearPicker;
|
||
|
MergedDatePicker.RangePicker = RangePicker;
|
||
|
MergedDatePicker.TimePicker = TimePicker;
|
||
|
|
||
|
return MergedDatePicker;
|
||
|
}
|
||
|
|
||
|
export default generatePicker;
|