react-calendar-timeline
Version:
react-calendar-timeline
230 lines (229 loc) • 6.72 kB
TypeScript
import { Dayjs } from 'dayjs';
import { ReactNode, CSSProperties, HTMLProps, MouseEventHandler, Ref, Component, ReactElement } from 'react';
import { Dimension, ItemDimension } from './dimension';
import { ResizeEdge } from '../items/Item';
import { SelectUnits } from '../utility/calendar';
export type Id = number | string;
export interface TimelineGroupBase {
id: Id;
title: ReactNode;
rightTitle?: ReactNode | undefined;
height?: number | undefined;
stackItems?: boolean | undefined;
dimensions?: Dimension | undefined;
}
export type GroupOrder = {
index: number;
group: TimelineGroupBase;
};
export type GroupOrders = Record<Id, GroupOrder>;
export type GroupedItem = {
index: number;
group: TimelineGroupBase;
items: ItemDimension[];
};
export interface TimelineItemBase<DateType> {
id: Id;
group: Id;
title?: ReactNode | undefined;
start_time: DateType;
end_time: DateType;
canMove?: boolean | undefined;
canResize?: boolean | 'left' | 'right' | 'both' | undefined;
canChangeGroup?: boolean | undefined;
className?: string | undefined;
style?: CSSProperties | undefined;
itemProps?: HTMLProps<HTMLDivElement>;
isOverlay?: boolean | undefined;
dimensions?: Dimension | undefined;
/**
* Fixed pixel height for this item.
* Overrides `lineHeight` for this item only.
*/
height?: number | undefined;
}
export interface TimelineContext {
timelineWidth: number;
visibleTimeStart: number;
visibleTimeEnd: number;
canvasTimeStart: number;
canvasTimeEnd: number;
canvasWidth: number;
timelineUnit: SelectUnits;
}
export type GroupStack = {
groupHeight: number;
verticalMargin: number;
itemTop: number;
};
export interface ItemContext {
dimensions: {
collisionLeft: number;
collisionWidth: number;
height: number;
isDragging: boolean;
left: number;
order: GroupOrder;
originalLeft: number;
stack: boolean;
top: number | null;
width: number;
};
useResizeHandle: boolean;
title: string;
canMove: boolean;
canResizeLeft: boolean;
canResizeRight: boolean;
selected: boolean;
dragging: boolean;
dragStart: {
x: number;
y: number;
} | null;
dragTime: number | null;
dragGroupDelta: number | null;
resizing: boolean;
resizeEdge: 'left' | 'right' | null;
resizeStart: number | null;
resizeTime: number | null;
}
export interface ReactCalendarGroupRendererProps<CustomGroup extends TimelineGroupBase = TimelineGroupBase> {
group: CustomGroup;
isRightSidebar?: boolean | undefined;
}
export interface OnItemDragObjectBase {
itemId: Id;
time: number;
}
export interface OnItemDragObjectMove extends OnItemDragObjectBase {
eventType: 'move';
newGroupOrder: number;
}
export interface OnItemDragObjectResize extends OnItemDragObjectBase {
eventType: 'resize';
edge?: ResizeEdge | undefined;
}
export interface TimelineKeys {
groupIdKey: string;
groupTitleKey: string;
groupLabelKey: string;
groupRightTitleKey: string;
itemIdKey: string;
itemTitleKey: string;
itemDivTitleKey: string;
itemGroupKey: string;
itemTimeStartKey: string;
itemTimeEndKey: string;
}
export type dateType = number;
export interface TimelineTimeSteps {
second: number;
minute: number;
hour: number;
day: number;
month: number;
year: number;
}
export declare class TimelineMarkers extends Component {
}
export interface CustomMarkerChildrenProps {
styles: CSSProperties;
date: number;
}
export interface MarkerProps {
date: Date | number;
children?: ((props: CustomMarkerChildrenProps) => ReactNode) | undefined;
}
export declare class CustomMarker extends Component<MarkerProps> {
}
export interface TodayMarkerProps extends MarkerProps {
interval?: number | undefined;
}
export declare class TodayMarker extends Component<TodayMarkerProps> {
}
export type CursorMarkerProps = Omit<MarkerProps, 'date'>;
export declare class CursorMarker extends Component<CursorMarkerProps> {
}
export interface TimelineHeadersProps {
children?: ReactNode;
style?: CSSProperties | undefined;
className?: string | undefined;
calendarHeaderStyle?: CSSProperties | undefined;
calendarHeaderClassName?: string | undefined;
headerRef?: Ref<any> | undefined;
}
export declare class TimelineHeaders extends Component<TimelineHeadersProps> {
}
export interface SidebarHeaderChildrenFnProps<Data> {
getRootProps: (propsToOverride?: {
style: CSSProperties;
}) => {
style: CSSProperties;
};
data: Data;
}
export interface SidebarHeaderProps<Data> {
variant?: 'left' | 'right' | undefined;
headerData?: Data | undefined;
children: (props: SidebarHeaderChildrenFnProps<Data>) => ReactNode;
}
export declare class SidebarHeader<Data = any> extends Component<SidebarHeaderProps<Data>> {
}
export type Unit = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'isoWeek' | 'month' | 'year';
export interface IntervalContext {
interval: Interval;
intervalText: string;
}
export interface GetIntervalProps {
interval?: Interval | undefined;
style?: CSSProperties | undefined;
onClick?: MouseEventHandler | undefined;
}
export interface IntervalRenderer<Data> {
intervalContext: IntervalContext;
getIntervalProps: (props?: GetIntervalProps) => HTMLProps<HTMLDivElement>;
data?: Data | undefined;
}
export interface Interval {
startTime: Dayjs;
endTime: Dayjs;
labelWidth: number;
left: number;
}
export interface HeaderContext {
intervals: Array<{
startTime: Dayjs;
endTime: Dayjs;
}>;
unit: string;
}
export interface CustomHeaderPropsChildrenFnProps<Data> {
timelineContext: TimelineContext;
headerContext: HeaderContext;
getIntervalProps: (props?: GetIntervalProps) => Required<GetIntervalProps> & {
key: string | number;
};
getRootProps: (propsToOverride?: {
style: CSSProperties;
}) => {
style: CSSProperties;
};
showPeriod: (startDate: Dayjs | number, endDate: Dayjs | number) => void;
data: Data;
}
export interface CustomHeaderProps<Data> {
unit?: Unit | undefined;
headerData?: Data | undefined;
height?: number | undefined;
children: (props?: CustomHeaderPropsChildrenFnProps<Data>) => ReactNode;
}
export declare class CustomHeader<Data = any> extends Component<CustomHeaderProps<Data>> {
}
export type ElementWithSecret = ReactElement & {
props: {
variant: string;
};
type: {
secretKey: string;
};
};