react-big-schedule 8.1.0 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -1129
- package/dist/calendar/Calendar.d.ts +28 -0
- package/dist/calendar/Calendar.js +95 -0
- package/dist/calendar/Toolbar.d.ts +18 -0
- package/dist/calendar/Toolbar.js +6 -0
- package/dist/calendar/recurrence.check.d.ts +1 -0
- package/dist/calendar/recurrence.check.js +49 -0
- package/dist/calendar/recurrence.d.ts +8 -0
- package/dist/calendar/recurrence.js +90 -0
- package/dist/calendar/timezone.d.ts +6 -0
- package/dist/calendar/timezone.js +14 -0
- package/dist/calendar/types.d.ts +187 -0
- package/dist/calendar/types.js +1 -0
- package/dist/calendar/useEventSources.d.ts +11 -0
- package/dist/calendar/useEventSources.js +89 -0
- package/dist/calendar/useRecurrence.d.ts +4 -0
- package/dist/calendar/useRecurrence.js +15 -0
- package/dist/calendar/utils.d.ts +38 -0
- package/dist/calendar/utils.js +143 -0
- package/dist/calendar/views/DayGridView.d.ts +3 -0
- package/dist/calendar/views/DayGridView.js +375 -0
- package/dist/calendar/views/ListView.d.ts +4 -0
- package/dist/calendar/views/ListView.js +56 -0
- package/dist/calendar/views/MultiMonthView.d.ts +4 -0
- package/dist/calendar/views/MultiMonthView.js +36 -0
- package/dist/calendar/views/TimeGridView.d.ts +3 -0
- package/dist/calendar/views/TimeGridView.js +334 -0
- package/dist/calendar/views/daygrid/DayCell.d.ts +19 -0
- package/dist/calendar/views/daygrid/DayCell.js +17 -0
- package/dist/calendar/views/daygrid/EventChip.d.ts +19 -0
- package/dist/calendar/views/daygrid/EventChip.js +40 -0
- package/dist/calendar/views/daygrid/layout.d.ts +30 -0
- package/dist/calendar/views/daygrid/layout.js +63 -0
- package/dist/calendar/views/list/bucket.d.ts +8 -0
- package/dist/calendar/views/list/bucket.js +37 -0
- package/dist/calendar/views/multimonth/Cell.d.ts +12 -0
- package/dist/calendar/views/multimonth/Cell.js +44 -0
- package/dist/calendar/views/multimonth/Continuous.d.ts +8 -0
- package/dist/calendar/views/multimonth/Continuous.js +28 -0
- package/dist/calendar/views/multimonth/MonthGrid.d.ts +10 -0
- package/dist/calendar/views/multimonth/MonthGrid.js +36 -0
- package/dist/calendar/views/multimonth/shared.d.ts +27 -0
- package/dist/calendar/views/multimonth/shared.js +40 -0
- package/dist/calendar/views/timegrid/DayColumn.d.ts +49 -0
- package/dist/calendar/views/timegrid/DayColumn.js +86 -0
- package/dist/calendar/views/timegrid/model.d.ts +55 -0
- package/dist/calendar/views/timegrid/model.js +102 -0
- package/dist/components/AddMore.d.ts +13 -0
- package/dist/components/AddMore.js +9 -42
- package/dist/components/AddMorePopover.d.ts +13 -0
- package/dist/components/AddMorePopover.js +24 -95
- package/dist/components/AgendaEventItem.d.ts +10 -0
- package/dist/components/AgendaEventItem.js +33 -81
- package/dist/components/AgendaResourceEvents.d.ts +10 -0
- package/dist/components/AgendaResourceEvents.js +37 -91
- package/dist/components/AgendaView.d.ts +9 -0
- package/dist/components/AgendaView.js +10 -69
- package/dist/components/BodyView.d.ts +11 -0
- package/dist/components/BodyView.js +36 -67
- package/dist/components/DnDContext.d.ts +48 -0
- package/dist/components/DnDContext.js +200 -221
- package/dist/components/DnDSource.d.ts +49 -0
- package/dist/components/DnDSource.js +125 -120
- package/dist/components/EventItem.d.ts +41 -0
- package/dist/components/EventItem.js +585 -787
- package/dist/components/EventItemPopover.d.ts +12 -0
- package/dist/components/EventItemPopover.js +19 -143
- package/dist/components/HeaderView.d.ts +14 -0
- package/dist/components/HeaderView.js +123 -186
- package/dist/components/ResourceEvents.d.ts +54 -0
- package/dist/components/ResourceEvents.js +534 -703
- package/dist/components/ResourceView.d.ts +26 -0
- package/dist/components/ResourceView.js +64 -184
- package/dist/components/SchedulerData.d.ts +136 -0
- package/dist/components/SchedulerData.js +1296 -1226
- package/dist/components/SchedulerHeader.d.ts +25 -0
- package/dist/components/SchedulerHeader.js +50 -150
- package/dist/components/SelectedArea.d.ts +8 -0
- package/dist/components/SelectedArea.js +11 -26
- package/dist/components/Summary.d.ts +11 -0
- package/dist/components/Summary.js +21 -50
- package/dist/components/WrapperFun.d.ts +2 -0
- package/dist/components/WrapperFun.js +5 -10
- package/dist/components/index.d.ts +44 -0
- package/dist/components/index.js +428 -654
- package/dist/components/ui/Icons.d.ts +8 -0
- package/dist/components/ui/Icons.js +7 -0
- package/dist/components/ui/MiniCalendar.d.ts +9 -0
- package/dist/components/ui/MiniCalendar.js +17 -0
- package/dist/components/ui/Popover.d.ts +13 -0
- package/dist/components/ui/Popover.js +80 -0
- package/dist/config/default.d.ts +36 -0
- package/dist/config/default.js +17 -26
- package/dist/config/i18n.d.ts +27 -0
- package/dist/config/i18n.js +21 -37
- package/dist/config/scheduler.d.ts +12 -0
- package/dist/config/scheduler.js +126 -119
- package/dist/css/style.css +2 -316
- package/dist/helper/behaviors.d.ts +14 -0
- package/dist/helper/behaviors.js +75 -75
- package/dist/helper/utility.d.ts +26 -0
- package/dist/helper/utility.js +23 -30
- package/dist/index.d.ts +6 -477
- package/dist/index.js +4 -2
- package/dist/sample-data/sample1.d.ts +11 -0
- package/dist/sample-data/sample1.js +427 -372
- package/dist/types.d.ts +267 -0
- package/dist/types.js +1 -0
- package/package.json +30 -27
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo } from 'react';
|
|
3
|
+
import Cell from './Cell';
|
|
4
|
+
import { weekdayOrder } from './MonthGrid';
|
|
5
|
+
import { onGridKey, weekNumber } from './shared';
|
|
6
|
+
function Continuous({ range, shared }) {
|
|
7
|
+
const { firstDay, weekends, weekNumbers, today } = shared;
|
|
8
|
+
const cols = weekdayOrder(firstDay, weekends);
|
|
9
|
+
const weeks = useMemo(() => {
|
|
10
|
+
const out = [];
|
|
11
|
+
for (let d = range.start; d.isBefore(range.end);) {
|
|
12
|
+
const row = [];
|
|
13
|
+
for (let i = 0; i < 7; i++, d = d.add(1, 'day'))
|
|
14
|
+
if (weekends || (d.day() !== 0 && d.day() !== 6))
|
|
15
|
+
row.push(d);
|
|
16
|
+
out.push(row);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}, [range, weekends]);
|
|
20
|
+
const template = `5.5rem ${weekNumbers ? '1.75rem ' : ''}repeat(${cols.length}, minmax(0, 1fr))`;
|
|
21
|
+
const tabDay = today.isSame(range.start, 'year') ? today : range.start.add(7, 'day');
|
|
22
|
+
return (_jsxs("div", { role: "grid", "aria-label": "Year", onKeyDown: e => onGridKey(e), children: [_jsxs("div", { role: "row", className: "rbs-mm-row rbs-mm-head rbs-mm-sticky", style: { gridTemplateColumns: template }, children: [_jsx("span", { role: "columnheader" }), weekNumbers && _jsx("span", { role: "columnheader", className: "rbs-mm-wk" }), cols.map(d => (_jsx("span", { role: "columnheader", className: "rbs-mm-dow", children: today.day(d).format('ddd') }, d)))] }), weeks.map(row => {
|
|
23
|
+
const first = row[0];
|
|
24
|
+
const marker = row.find(d => d.date() === 1);
|
|
25
|
+
return (_jsxs("div", { role: "row", className: "rbs-mm-row", style: { gridTemplateColumns: template }, children: [_jsx("span", { className: `rbs-mm-marker${marker ? ' rbs-mm-marker-on' : ''}`, children: marker ? marker.format('MMMM') : '' }), weekNumbers && _jsx("span", { className: "rbs-mm-wk", children: weekNumber(first, firstDay) }), row.map(d => (_jsx(Cell, { day: d, shared: shared, tabbable: d.isSame(tabDay, 'day'), alt: d.month() % 2 === 1 }, d.valueOf())))] }, first.valueOf()));
|
|
26
|
+
})] }));
|
|
27
|
+
}
|
|
28
|
+
export default memo(Continuous);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Dayjs } from 'dayjs';
|
|
2
|
+
import { type MonthShared } from './shared';
|
|
3
|
+
/** Weekday columns in display order (firstDay-rotated, weekends optionally dropped). */
|
|
4
|
+
export declare function weekdayOrder(firstDay: number, weekends: boolean): number[];
|
|
5
|
+
declare function MonthGrid({ month, shared }: {
|
|
6
|
+
month: Dayjs;
|
|
7
|
+
shared: MonthShared;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
declare const _default: import("react").MemoExoticComponent<typeof MonthGrid>;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo } from 'react';
|
|
3
|
+
import Cell from './Cell';
|
|
4
|
+
import { onGridKey, weekNumber } from './shared';
|
|
5
|
+
/** Weekday columns in display order (firstDay-rotated, weekends optionally dropped). */
|
|
6
|
+
export function weekdayOrder(firstDay, weekends) {
|
|
7
|
+
return Array.from({ length: 7 }, (_, i) => (firstDay + i) % 7).filter(d => weekends || (d !== 0 && d !== 6));
|
|
8
|
+
}
|
|
9
|
+
function MonthGrid({ month, shared }) {
|
|
10
|
+
const { firstDay, weekends, weekNumbers, today, goTo } = shared;
|
|
11
|
+
const cols = weekdayOrder(firstDay, weekends);
|
|
12
|
+
const weeks = useMemo(() => {
|
|
13
|
+
const out = [];
|
|
14
|
+
const start = month.startOf('month');
|
|
15
|
+
const lead = (start.day() - firstDay + 7) % 7;
|
|
16
|
+
let d = start.subtract(lead, 'day');
|
|
17
|
+
const end = month.endOf('month');
|
|
18
|
+
while (!d.isAfter(end)) {
|
|
19
|
+
const row = [];
|
|
20
|
+
for (let i = 0; i < 7; i++, d = d.add(1, 'day')) {
|
|
21
|
+
if (weekends || (d.day() !== 0 && d.day() !== 6))
|
|
22
|
+
row.push(d.month() === month.month() ? d : null);
|
|
23
|
+
}
|
|
24
|
+
out.push(row);
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}, [month, firstDay, weekends]);
|
|
28
|
+
const tabDay = today.isSame(month, 'month') ? today : month.startOf('month');
|
|
29
|
+
const label = month.format('MMMM YYYY');
|
|
30
|
+
const template = `${weekNumbers ? '1.75rem ' : ''}repeat(${cols.length}, minmax(0, 1fr))`;
|
|
31
|
+
return (_jsxs("section", { className: "rbs-mm-month", "aria-label": label, children: [_jsx("h3", { className: "rbs-mm-title", children: _jsxs("button", { type: "button", onClick: () => goTo('dayGridMonth', month.startOf('month')), children: [month.format('MMMM'), _jsxs("span", { className: "rbs-mm-year-lbl", children: [" ", month.format('YYYY')] })] }) }), _jsxs("div", { role: "grid", "aria-label": label, onKeyDown: e => onGridKey(e), children: [_jsxs("div", { role: "row", className: "rbs-mm-row rbs-mm-head", style: { gridTemplateColumns: template }, children: [weekNumbers && _jsx("span", { role: "columnheader", className: "rbs-mm-wk" }), cols.map(d => (_jsx("span", { role: "columnheader", className: "rbs-mm-dow", children: today.day(d).format('dd') }, d)))] }), weeks.map((row, i) => {
|
|
32
|
+
const first = row.find((x) => x !== null);
|
|
33
|
+
return (_jsxs("div", { role: "row", className: "rbs-mm-row", style: { gridTemplateColumns: template }, children: [weekNumbers && _jsx("span", { className: "rbs-mm-wk", children: weekNumber(first, firstDay) }), row.map((d, j) => d ? (_jsx(Cell, { day: d, shared: shared, tabbable: d.isSame(tabDay, 'day') }, d.valueOf())) : (_jsx("span", { role: "gridcell", className: "rbs-mm-pad" }, `${i}-${j}`)))] }, first.valueOf()));
|
|
34
|
+
})] })] }));
|
|
35
|
+
}
|
|
36
|
+
export default memo(MonthGrid);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Dayjs } from 'dayjs';
|
|
2
|
+
import type { KeyboardEvent } from 'react';
|
|
3
|
+
import type { CalendarViewName, CalendarViewProps } from '../../types';
|
|
4
|
+
import type { NormalizedEvent } from '../../utils';
|
|
5
|
+
export interface MonthShared extends Pick<CalendarViewProps, 'eventClassNames' | 'eventContent' | 'onDateClick' | 'onEventClick' | 'goTo' | 'dayCellClassNames'> {
|
|
6
|
+
buckets: Map<string, NormalizedEvent[]>;
|
|
7
|
+
/** background events by day: tint busy days */
|
|
8
|
+
bgBuckets: Map<string, NormalizedEvent[]>;
|
|
9
|
+
today: Dayjs;
|
|
10
|
+
firstDay: number;
|
|
11
|
+
weekends: boolean;
|
|
12
|
+
weekNumbers: boolean;
|
|
13
|
+
/** year grid: dot instead of chips */
|
|
14
|
+
compact: boolean;
|
|
15
|
+
view: CalendarViewName;
|
|
16
|
+
}
|
|
17
|
+
export declare const MAX_CHIPS = 3;
|
|
18
|
+
/** ISO-8601 number of the week containing `d`, judged by that week's Thursday (weeks start on `firstDay`). */
|
|
19
|
+
export declare function weekNumber(d: Dayjs, firstDay: number): number;
|
|
20
|
+
export declare const dayTitle: (d: Dayjs, list: NormalizedEvent[] | undefined) => string;
|
|
21
|
+
/** Hover-card text for a day: its date, then one line per event. */
|
|
22
|
+
export declare const dayTip: (d: Dayjs, list: NormalizedEvent[] | undefined) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Arrow-key navigation by date: left/right = +-1 day, up/down = +-1 week. Looks the target day up in the whole
|
|
25
|
+
* multi-month root, so focus crosses from one month's grid to the next; hidden weekend days are skipped.
|
|
26
|
+
*/
|
|
27
|
+
export declare function onGridKey(e: KeyboardEvent<HTMLElement>): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const MAX_CHIPS = 3;
|
|
2
|
+
/** ISO-8601 number of the week containing `d`, judged by that week's Thursday (weeks start on `firstDay`). */
|
|
3
|
+
export function weekNumber(d, firstDay) {
|
|
4
|
+
const thu = d
|
|
5
|
+
.startOf('day')
|
|
6
|
+
.subtract((d.day() - firstDay + 7) % 7, 'day')
|
|
7
|
+
.add((4 - firstDay + 7) % 7, 'day');
|
|
8
|
+
return Math.floor(thu.diff(thu.startOf('year'), 'day') / 7) + 1;
|
|
9
|
+
}
|
|
10
|
+
export const dayTitle = (d, list) => list?.length ? `${d.format('ddd, MMM D')}: ${list.map(e => e.source.title).join(', ')}` : d.format('ddd, MMM D');
|
|
11
|
+
/** Hover-card text for a day: its date, then one line per event. */
|
|
12
|
+
export const dayTip = (d, list) => [
|
|
13
|
+
d.format('dddd, MMM D'),
|
|
14
|
+
...(list ?? []).map(e => `${e.allDay ? 'All day' : e.start.format('HH:mm')} ${e.source.title}`),
|
|
15
|
+
].join('\n');
|
|
16
|
+
const shiftDay = (key, n) => {
|
|
17
|
+
const [y = 0, m = 1, d = 1] = key.split('-').map(Number);
|
|
18
|
+
return new Date(Date.UTC(y, m - 1, d + n)).toISOString().slice(0, 10);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Arrow-key navigation by date: left/right = +-1 day, up/down = +-1 week. Looks the target day up in the whole
|
|
22
|
+
* multi-month root, so focus crosses from one month's grid to the next; hidden weekend days are skipped.
|
|
23
|
+
*/
|
|
24
|
+
export function onGridKey(e) {
|
|
25
|
+
const step = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -7, ArrowDown: 7 }[e.key];
|
|
26
|
+
const key = e.target.closest('[data-day]')?.dataset.day;
|
|
27
|
+
if (!step || !key)
|
|
28
|
+
return;
|
|
29
|
+
e.preventDefault();
|
|
30
|
+
const root = e.currentTarget.closest('.rbs-mm') ?? e.currentTarget;
|
|
31
|
+
let target = key;
|
|
32
|
+
for (let i = 0; i < 3; i++) {
|
|
33
|
+
target = shiftDay(target, step);
|
|
34
|
+
const el = root.querySelector(`[data-day="${target}"]`);
|
|
35
|
+
if (el)
|
|
36
|
+
return el.focus();
|
|
37
|
+
if (Math.abs(step) > 1)
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Dayjs } from 'dayjs';
|
|
2
|
+
import { type CSSProperties, type ReactNode, type PointerEvent as ReactPointerEvent } from 'react';
|
|
3
|
+
import type { CalendarEvent, CalendarViewName, EventContentArg } from '../../types';
|
|
4
|
+
import { type NormalizedEvent } from '../../utils';
|
|
5
|
+
import type { DayData } from './model';
|
|
6
|
+
export interface Geometry {
|
|
7
|
+
minMin: number;
|
|
8
|
+
maxMin: number;
|
|
9
|
+
slotDur: number;
|
|
10
|
+
slotH: number;
|
|
11
|
+
ppm: number;
|
|
12
|
+
}
|
|
13
|
+
export interface EventRender {
|
|
14
|
+
view: CalendarViewName;
|
|
15
|
+
timeFormat: string;
|
|
16
|
+
eventContent?: (arg: EventContentArg) => ReactNode;
|
|
17
|
+
eventClassNames?: (arg: EventContentArg) => string | string[];
|
|
18
|
+
now: Dayjs;
|
|
19
|
+
}
|
|
20
|
+
export interface Ghost {
|
|
21
|
+
ev: NormalizedEvent;
|
|
22
|
+
sMin: number;
|
|
23
|
+
eMin: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DayColumnProps {
|
|
26
|
+
data: DayData;
|
|
27
|
+
dayIdx: number;
|
|
28
|
+
isToday: boolean;
|
|
29
|
+
geo: Geometry;
|
|
30
|
+
render: EventRender;
|
|
31
|
+
/** Minutes since midnight, only on today's column. */
|
|
32
|
+
nowMin: number | null;
|
|
33
|
+
selStart: number | null;
|
|
34
|
+
selEnd: number | null;
|
|
35
|
+
ghost: Ghost | null;
|
|
36
|
+
/** Editability resolved by the view: [startEditable, durationEditable]. */
|
|
37
|
+
canEdit: (e: CalendarEvent) => [boolean, boolean];
|
|
38
|
+
onSlotDown: (e: ReactPointerEvent, dayIdx: number) => void;
|
|
39
|
+
onEventDown: (e: ReactPointerEvent, ev: NormalizedEvent, dayIdx: number) => void;
|
|
40
|
+
onResizeDown: (e: ReactPointerEvent, ev: NormalizedEvent, dayIdx: number) => void;
|
|
41
|
+
onEventActivate: (e: MouseEvent, ev: NormalizedEvent) => void;
|
|
42
|
+
onSlotActivate: (date: Dayjs) => void;
|
|
43
|
+
}
|
|
44
|
+
export declare function eventArg(r: EventRender, ev: NormalizedEvent, isStart: boolean, isEnd: boolean): EventContentArg;
|
|
45
|
+
export declare const joinClasses: (...parts: (string | string[] | undefined | false)[]) => string;
|
|
46
|
+
export declare const eventStyle: (ev: NormalizedEvent) => CSSProperties;
|
|
47
|
+
declare function DayColumn({ data, dayIdx, isToday, geo, render, nowMin, selStart, selEnd, ghost, canEdit, onSlotDown, onEventDown, onResizeDown, onEventActivate, onSlotActivate, }: DayColumnProps): import("react").JSX.Element;
|
|
48
|
+
declare const _default: import("react").MemoExoticComponent<typeof DayColumn>;
|
|
49
|
+
export default _default;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
+
import { layoutLanes, tipText } from '../../utils';
|
|
4
|
+
export function eventArg(r, ev, isStart, isEnd) {
|
|
5
|
+
const fmt = (d) => d.format(r.timeFormat);
|
|
6
|
+
return {
|
|
7
|
+
event: ev.source,
|
|
8
|
+
view: r.view,
|
|
9
|
+
timeText: ev.allDay ? '' : `${fmt(ev.start)} - ${fmt(ev.end)}`,
|
|
10
|
+
isStart,
|
|
11
|
+
isEnd,
|
|
12
|
+
isPast: ev.end.isBefore(r.now),
|
|
13
|
+
isFuture: ev.start.isAfter(r.now),
|
|
14
|
+
isToday: ev.start.isSame(r.now, 'day'),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export const joinClasses = (...parts) => parts.flat().filter(Boolean).join(' ');
|
|
18
|
+
export const eventStyle = (ev) => ({
|
|
19
|
+
background: ev.source.color ?? 'var(--rbs-accent)',
|
|
20
|
+
color: ev.source.textColor ?? 'var(--rbs-event-fg)',
|
|
21
|
+
});
|
|
22
|
+
function EventBody({ arg, render }) {
|
|
23
|
+
if (render.eventContent)
|
|
24
|
+
return _jsx(_Fragment, { children: render.eventContent(arg) });
|
|
25
|
+
return (_jsxs(_Fragment, { children: [arg.timeText && _jsx("div", { className: "rbs-tg-ev-time", children: arg.timeText }), _jsx("div", { className: "rbs-tg-ev-title", children: arg.event.title })] }));
|
|
26
|
+
}
|
|
27
|
+
function DayColumn({ data, dayIdx, isToday, geo, render, nowMin, selStart, selEnd, ghost, canEdit, onSlotDown, onEventDown, onResizeDown, onEventActivate, onSlotActivate, }) {
|
|
28
|
+
const { minMin, maxMin, slotDur, slotH, ppm } = geo;
|
|
29
|
+
const y = (min) => (min - minMin) * ppm;
|
|
30
|
+
const [kb, setKb] = useState(null);
|
|
31
|
+
const kbRef = useRef(null);
|
|
32
|
+
const laid = useMemo(() => layoutLanes(data.segs), [data.segs]);
|
|
33
|
+
const hourPx = (60 / slotDur) * slotH;
|
|
34
|
+
const gridStyle = {
|
|
35
|
+
height: (maxMin - minMin) * ppm,
|
|
36
|
+
backgroundImage: 'linear-gradient(var(--rbs-border) 1px, transparent 1px), linear-gradient(color-mix(in srgb, var(--rbs-border) 45%, transparent) 1px, transparent 1px)',
|
|
37
|
+
backgroundSize: `100% ${hourPx}px, 100% ${slotH}px`,
|
|
38
|
+
backgroundPosition: `0 ${((60 - (minMin % 60)) % 60) * ppm}px, 0 0`,
|
|
39
|
+
};
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (kb !== null)
|
|
42
|
+
kbRef.current?.scrollIntoView({ block: 'nearest' });
|
|
43
|
+
}, [kb]);
|
|
44
|
+
const onKeyDown = (e) => {
|
|
45
|
+
if (e.target !== e.currentTarget || kb === null)
|
|
46
|
+
return;
|
|
47
|
+
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
const next = kb + (e.key === 'ArrowDown' ? slotDur : -slotDur);
|
|
50
|
+
setKb(Math.max(minMin, Math.min(maxMin - slotDur, next)));
|
|
51
|
+
}
|
|
52
|
+
else if (e.key === 'Enter' || e.key === ' ') {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
onSlotActivate(data.day.startOf('day').add(kb, 'minute'));
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const label = data.day.format('dddd, MMMM D');
|
|
58
|
+
const kbText = kb === null ? '' : `, ${data.day.startOf('day').add(kb, 'minute').format(render.timeFormat)}`;
|
|
59
|
+
return (_jsxs("div", { role: "gridcell", tabIndex: 0, "aria-label": label + kbText, className: joinClasses('rbs-tg-col', isToday && 'rbs-tg-today'), style: gridStyle, onPointerDown: e => onSlotDown(e, dayIdx), onKeyDown: onKeyDown, onFocus: e => {
|
|
60
|
+
if (e.target === e.currentTarget && e.currentTarget.matches(':focus-visible')) {
|
|
61
|
+
setKb(k => k ?? Math.max(minMin, Math.min(maxMin - slotDur, 8 * 60)));
|
|
62
|
+
}
|
|
63
|
+
}, onBlur: () => setKb(null), children: [data.nonBiz.map(([s, e]) => (_jsx("div", { className: "rbs-tg-nonbiz", style: { top: y(s), height: (e - s) * ppm } }, s))), data.bgs.map(b => (_jsx("div", { className: "rbs-tg-bg", style: { top: y(b.sMin), height: (b.eMin - b.sMin) * ppm, background: b.color ?? 'var(--rbs-accent)' } }, b.id))), selStart !== null && selEnd !== null && (_jsx("div", { className: "rbs-tg-select", style: { top: y(selStart), height: (selEnd - selStart) * ppm } })), kb !== null && _jsx("div", { ref: kbRef, className: "rbs-tg-kb", style: { top: y(kb), height: slotH } }), laid.map(({ item, lane, lanes }) => (_jsx(EventSeg, { seg: item, lane: lane, lanes: lanes, dayIdx: dayIdx, geo: geo, render: render, canEdit: canEdit, isToday: isToday, onEventDown: onEventDown, onResizeDown: onResizeDown, onEventActivate: onEventActivate }, `${item.ev.id}-${item.sMin}`))), ghost && (_jsx("div", { className: "rbs-tg-ev rbs-tg-ghost", style: {
|
|
64
|
+
...eventStyle(ghost.ev),
|
|
65
|
+
top: y(ghost.sMin),
|
|
66
|
+
height: Math.max((ghost.eMin - ghost.sMin) * ppm, 20),
|
|
67
|
+
left: 0,
|
|
68
|
+
right: 2,
|
|
69
|
+
}, children: _jsx("div", { className: "rbs-tg-ev-title", children: ghost.ev.source.title }) })), nowMin !== null && nowMin >= minMin && nowMin <= maxMin && (_jsx("div", { className: "rbs-tg-now", style: { top: y(nowMin) } }))] }));
|
|
70
|
+
}
|
|
71
|
+
function EventSeg({ seg, lane, lanes, dayIdx, geo, render, canEdit, onEventDown, onResizeDown, onEventActivate, }) {
|
|
72
|
+
const { ev } = seg;
|
|
73
|
+
const [startEditable, durationEditable] = canEdit(ev.source);
|
|
74
|
+
const height = Math.max((seg.eMin - seg.sMin) * geo.ppm - 1, 20);
|
|
75
|
+
const arg = eventArg(render, ev, seg.isStart, seg.isEnd);
|
|
76
|
+
const width = 100 / lanes;
|
|
77
|
+
return (_jsxs("button", { type: "button", "data-event-id": String(ev.id), "aria-label": `${ev.source.title}, ${arg.timeText}`, "data-tip": tipText(ev), "data-tip-color": ev.source.color, className: joinClasses('rbs-tg-ev', height < 36 && 'rbs-tg-ev-sm', !seg.isStart && 'rbs-tg-ev-cont-top', !seg.isEnd && 'rbs-tg-ev-cont-bottom', startEditable && 'rbs-tg-ev-editable', ev.source.classNames, render.eventClassNames?.(arg)), style: {
|
|
78
|
+
...eventStyle(ev),
|
|
79
|
+
top: (seg.sMin - geo.minMin) * geo.ppm,
|
|
80
|
+
height,
|
|
81
|
+
left: `${lane * width}%`,
|
|
82
|
+
width: `calc(${width}% - 2px)`,
|
|
83
|
+
zIndex: lane + 1,
|
|
84
|
+
}, onPointerDown: e => onEventDown(e, ev, dayIdx), onClick: e => onEventActivate(e.nativeEvent, ev), children: [_jsx(EventBody, { arg: arg, render: render }), seg.isEnd && durationEditable && (_jsx("span", { className: "rbs-tg-resize", onPointerDown: e => onResizeDown(e, ev, dayIdx) }))] }));
|
|
85
|
+
}
|
|
86
|
+
export default memo(DayColumn);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Dayjs } from 'dayjs';
|
|
2
|
+
import type { BusinessHours, CalendarEvent } from '../../types';
|
|
3
|
+
import { type NormalizedEvent } from '../../utils';
|
|
4
|
+
/** The slice of a timed event that falls inside one day column. */
|
|
5
|
+
export interface Seg {
|
|
6
|
+
ev: NormalizedEvent;
|
|
7
|
+
start: Dayjs;
|
|
8
|
+
end: Dayjs;
|
|
9
|
+
/** Minutes since the start of the day. */
|
|
10
|
+
sMin: number;
|
|
11
|
+
eMin: number;
|
|
12
|
+
isStart: boolean;
|
|
13
|
+
isEnd: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface BgSeg {
|
|
16
|
+
id: CalendarEvent['id'];
|
|
17
|
+
color?: string;
|
|
18
|
+
sMin: number;
|
|
19
|
+
eMin: number;
|
|
20
|
+
}
|
|
21
|
+
export interface DayData {
|
|
22
|
+
day: Dayjs;
|
|
23
|
+
segs: Seg[];
|
|
24
|
+
bgs: BgSeg[];
|
|
25
|
+
/** Minute ranges shaded as non-business time. */
|
|
26
|
+
nonBiz: [number, number][];
|
|
27
|
+
}
|
|
28
|
+
export interface AllDayBar {
|
|
29
|
+
ev: NormalizedEvent;
|
|
30
|
+
/** Visible column indexes, inclusive. */
|
|
31
|
+
si: number;
|
|
32
|
+
ei: number;
|
|
33
|
+
lane: number;
|
|
34
|
+
isStart: boolean;
|
|
35
|
+
isEnd: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare const DEFAULT_BUSINESS: Required<BusinessHours>;
|
|
38
|
+
export declare const isHidden: (e: NormalizedEvent) => boolean;
|
|
39
|
+
export declare const isBackground: (e: NormalizedEvent) => boolean;
|
|
40
|
+
export declare function buildDays(days: Dayjs[], events: NormalizedEvent[], minMin: number, maxMin: number, businessHours: boolean | BusinessHours | undefined): DayData[];
|
|
41
|
+
/** Clip all-day events to the visible columns and stack them into lanes. */
|
|
42
|
+
export declare function buildAllDayBars(days: Dayjs[], events: NormalizedEvent[]): {
|
|
43
|
+
bars: AllDayBar[];
|
|
44
|
+
lanes: number;
|
|
45
|
+
};
|
|
46
|
+
/** Column span of an event over the visible days, or null when it is outside them. */
|
|
47
|
+
export declare function spanOf(days: Dayjs[], ev: {
|
|
48
|
+
start: Dayjs;
|
|
49
|
+
end: Dayjs;
|
|
50
|
+
}): {
|
|
51
|
+
si: number;
|
|
52
|
+
ei: number;
|
|
53
|
+
} | null;
|
|
54
|
+
/** ISO 8601 week number. */
|
|
55
|
+
export declare function isoWeek(d: Dayjs): number;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { parseTime } from '../../utils';
|
|
2
|
+
export const DEFAULT_BUSINESS = {
|
|
3
|
+
daysOfWeek: [1, 2, 3, 4, 5],
|
|
4
|
+
startTime: '09:00',
|
|
5
|
+
endTime: '17:00',
|
|
6
|
+
};
|
|
7
|
+
export const isHidden = (e) => e.source.display === 'none';
|
|
8
|
+
export const isBackground = (e) => e.source.display === 'background';
|
|
9
|
+
export function buildDays(days, events, minMin, maxMin, businessHours) {
|
|
10
|
+
const bh = businessHours ? { ...DEFAULT_BUSINESS, ...(businessHours === true ? {} : businessHours) } : null;
|
|
11
|
+
return days.map(day => {
|
|
12
|
+
const base = day.startOf('day');
|
|
13
|
+
const wStart = base.add(minMin, 'minute');
|
|
14
|
+
const wEnd = base.add(maxMin, 'minute');
|
|
15
|
+
const dayEnd = base.add(1, 'day');
|
|
16
|
+
const segs = [];
|
|
17
|
+
const bgs = [];
|
|
18
|
+
for (const ev of events) {
|
|
19
|
+
if (isHidden(ev) || !ev.start.isBefore(wEnd) || !ev.end.isAfter(wStart))
|
|
20
|
+
continue;
|
|
21
|
+
const start = ev.start.isAfter(wStart) ? ev.start : wStart;
|
|
22
|
+
const end = ev.end.isBefore(wEnd) ? ev.end : wEnd;
|
|
23
|
+
const sMin = start.diff(base, 'minute');
|
|
24
|
+
const eMin = end.diff(base, 'minute');
|
|
25
|
+
if (isBackground(ev)) {
|
|
26
|
+
bgs.push({
|
|
27
|
+
id: ev.id,
|
|
28
|
+
color: ev.source.color,
|
|
29
|
+
sMin: ev.allDay ? minMin : sMin,
|
|
30
|
+
eMin: ev.allDay ? maxMin : eMin,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else if (!ev.allDay) {
|
|
34
|
+
segs.push({ ev, start, end, sMin, eMin, isStart: !ev.start.isBefore(base), isEnd: !ev.end.isAfter(dayEnd) });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const nonBiz = [];
|
|
38
|
+
if (bh) {
|
|
39
|
+
const bs = parseTime(bh.startTime);
|
|
40
|
+
const be = parseTime(bh.endTime);
|
|
41
|
+
if (!bh.daysOfWeek.includes(day.day()))
|
|
42
|
+
nonBiz.push([minMin, maxMin]);
|
|
43
|
+
else {
|
|
44
|
+
if (bs > minMin)
|
|
45
|
+
nonBiz.push([minMin, Math.min(bs, maxMin)]);
|
|
46
|
+
if (be < maxMin)
|
|
47
|
+
nonBiz.push([Math.max(be, minMin), maxMin]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { day, segs, bgs, nonBiz };
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Clip all-day events to the visible columns and stack them into lanes. */
|
|
54
|
+
export function buildAllDayBars(days, events) {
|
|
55
|
+
const bars = [];
|
|
56
|
+
for (const ev of events)
|
|
57
|
+
if (ev.allDay && !isHidden(ev) && !isBackground(ev))
|
|
58
|
+
addBar(bars, days, ev);
|
|
59
|
+
bars.sort((a, b) => a.si - b.si || b.ei - b.si - (a.ei - a.si));
|
|
60
|
+
const laneEnds = [];
|
|
61
|
+
for (const b of bars) {
|
|
62
|
+
let lane = laneEnds.findIndex(end => end < b.si);
|
|
63
|
+
if (lane === -1)
|
|
64
|
+
lane = laneEnds.length;
|
|
65
|
+
laneEnds[lane] = b.ei;
|
|
66
|
+
b.lane = lane;
|
|
67
|
+
}
|
|
68
|
+
return { bars, lanes: laneEnds.length };
|
|
69
|
+
}
|
|
70
|
+
/** Column span of an event over the visible days, or null when it is outside them. */
|
|
71
|
+
export function spanOf(days, ev) {
|
|
72
|
+
let si = -1;
|
|
73
|
+
let ei = -1;
|
|
74
|
+
days.forEach((d, i) => {
|
|
75
|
+
if (d.startOf('day').isBefore(ev.end) && d.startOf('day').add(1, 'day').isAfter(ev.start)) {
|
|
76
|
+
if (si === -1)
|
|
77
|
+
si = i;
|
|
78
|
+
ei = i;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return si === -1 ? null : { si, ei };
|
|
82
|
+
}
|
|
83
|
+
function addBar(bars, days, ev) {
|
|
84
|
+
const span = spanOf(days, ev);
|
|
85
|
+
if (!span)
|
|
86
|
+
return;
|
|
87
|
+
bars.push({
|
|
88
|
+
ev,
|
|
89
|
+
...span,
|
|
90
|
+
lane: 0,
|
|
91
|
+
isStart: !ev.start.isBefore(days[span.si].startOf('day')),
|
|
92
|
+
isEnd: !ev.end.isAfter(days[span.ei].startOf('day').add(1, 'day')),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** ISO 8601 week number. */
|
|
96
|
+
export function isoWeek(d) {
|
|
97
|
+
const date = new Date(Date.UTC(d.year(), d.month(), d.date()));
|
|
98
|
+
const dow = date.getUTCDay() || 7;
|
|
99
|
+
date.setUTCDate(date.getUTCDate() + 4 - dow);
|
|
100
|
+
const yearStart = Date.UTC(date.getUTCFullYear(), 0, 1);
|
|
101
|
+
return Math.ceil(((date.getTime() - yearStart) / 86400000 + 1) / 7);
|
|
102
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HeaderItem } from '../types';
|
|
2
|
+
import type SchedulerData from './SchedulerData';
|
|
3
|
+
export interface AddMoreProps {
|
|
4
|
+
schedulerData: SchedulerData;
|
|
5
|
+
number: number;
|
|
6
|
+
left: number;
|
|
7
|
+
width: number;
|
|
8
|
+
top: number;
|
|
9
|
+
clickAction: (headerItem: HeaderItem) => void;
|
|
10
|
+
headerItem: HeaderItem;
|
|
11
|
+
}
|
|
12
|
+
declare function AddMore({ schedulerData, number, left, width, top, clickAction, headerItem }: AddMoreProps): import("react").JSX.Element;
|
|
13
|
+
export default AddMore;
|
|
@@ -1,44 +1,11 @@
|
|
|
1
|
-
import PropTypes from 'prop-types';
|
|
2
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
function AddMore({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}) {
|
|
12
|
-
const {
|
|
13
|
-
config
|
|
14
|
-
} = schedulerData;
|
|
15
|
-
const content = `+${number} more`;
|
|
16
|
-
return /*#__PURE__*/_jsx("button", {
|
|
17
|
-
type: "button",
|
|
18
|
-
className: "timeline-event",
|
|
19
|
-
style: {
|
|
20
|
-
left,
|
|
21
|
-
width,
|
|
22
|
-
top
|
|
23
|
-
},
|
|
24
|
-
onClick: () => clickAction(headerItem),
|
|
25
|
-
children: /*#__PURE__*/_jsx("div", {
|
|
26
|
-
style: {
|
|
27
|
-
height: config.eventItemHeight,
|
|
28
|
-
color: '#999',
|
|
29
|
-
textAlign: 'center'
|
|
30
|
-
},
|
|
31
|
-
children: content
|
|
32
|
-
})
|
|
33
|
-
});
|
|
2
|
+
function AddMore({ schedulerData, number, left, width, top, clickAction, headerItem }) {
|
|
3
|
+
const { config } = schedulerData;
|
|
4
|
+
const content = `+${number} more`;
|
|
5
|
+
return (_jsx("button", { type: "button", className: "timeline-event", style: { left, width, top }, onClick: () => clickAction(headerItem), children: _jsx("div", { style: {
|
|
6
|
+
height: config.eventItemHeight,
|
|
7
|
+
color: 'var(--rbs-muted)',
|
|
8
|
+
textAlign: 'center',
|
|
9
|
+
}, children: content }) }));
|
|
34
10
|
}
|
|
35
|
-
|
|
36
|
-
schedulerData: PropTypes.object.isRequired,
|
|
37
|
-
number: PropTypes.number.isRequired,
|
|
38
|
-
left: PropTypes.number.isRequired,
|
|
39
|
-
width: PropTypes.number.isRequired,
|
|
40
|
-
top: PropTypes.number.isRequired,
|
|
41
|
-
clickAction: PropTypes.func.isRequired,
|
|
42
|
-
headerItem: PropTypes.object.isRequired
|
|
43
|
-
};
|
|
44
|
-
export default AddMore;
|
|
11
|
+
export default AddMore;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EventPopoverCallbacks, HeaderItem } from '../types';
|
|
2
|
+
import type SchedulerData from './SchedulerData';
|
|
3
|
+
export interface AddMorePopoverProps extends EventPopoverCallbacks {
|
|
4
|
+
schedulerData: SchedulerData;
|
|
5
|
+
headerItem: HeaderItem;
|
|
6
|
+
left: number;
|
|
7
|
+
top: number;
|
|
8
|
+
height: number;
|
|
9
|
+
closeAction: (headerItem?: HeaderItem) => void;
|
|
10
|
+
moveEvent?: (...args: unknown[]) => void;
|
|
11
|
+
}
|
|
12
|
+
declare function AddMorePopover(props: AddMorePopoverProps): import("react").JSX.Element;
|
|
13
|
+
export default AddMorePopover;
|
|
@@ -1,99 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import { useState, createElement as _createElement } from 'react';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createElement as _createElement } from "react";
|
|
3
|
+
import { useState } from 'react';
|
|
5
4
|
import DnDSource from './DnDSource';
|
|
6
5
|
import EventItem from './EventItem';
|
|
7
|
-
import {
|
|
6
|
+
import { Close } from './ui/Icons';
|
|
8
7
|
function AddMorePopover(props) {
|
|
9
|
-
|
|
10
|
-
schedulerData
|
|
11
|
-
headerItem
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const header = localeDayjs(new Date(time)).format(config.addMorePopoverHeaderFormat);
|
|
29
|
-
const durationStart = localeDayjs(new Date(start));
|
|
30
|
-
const durationEnd = localeDayjs(end);
|
|
31
|
-
const eventList = events.map((evt, i) => {
|
|
32
|
-
if (evt !== undefined) {
|
|
33
|
-
const eventStart = localeDayjs(evt.eventItem.start);
|
|
34
|
-
const eventEnd = localeDayjs(evt.eventItem.end);
|
|
35
|
-
const isStart = eventStart >= durationStart;
|
|
36
|
-
const isEnd = eventEnd < durationEnd;
|
|
37
|
-
const eventItemTop = 12 + (i + 1) * config.eventItemLineHeight;
|
|
38
|
-
return /*#__PURE__*/_createElement(EventItem, {
|
|
39
|
-
...props,
|
|
40
|
-
key: evt.eventItem.id,
|
|
41
|
-
eventItem: evt.eventItem,
|
|
42
|
-
dndSource: dndSource,
|
|
43
|
-
leftIndex: 0,
|
|
44
|
-
isInPopover: true,
|
|
45
|
-
isStart: isStart,
|
|
46
|
-
isEnd: isEnd,
|
|
47
|
-
rightIndex: 1,
|
|
48
|
-
left: 10,
|
|
49
|
-
width: 138,
|
|
50
|
-
top: eventItemTop
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
});
|
|
55
|
-
return /*#__PURE__*/_jsxs("div", {
|
|
56
|
-
className: "rbs-add-more-popover-overlay",
|
|
57
|
-
style: {
|
|
58
|
-
left,
|
|
59
|
-
top,
|
|
60
|
-
height,
|
|
61
|
-
minWidth: '170px'
|
|
62
|
-
},
|
|
63
|
-
children: [/*#__PURE__*/_jsxs(Row, {
|
|
64
|
-
justify: "space-between",
|
|
65
|
-
align: "middle",
|
|
66
|
-
children: [/*#__PURE__*/_jsx(Col, {
|
|
67
|
-
span: 22,
|
|
68
|
-
children: /*#__PURE__*/_jsx("span", {
|
|
69
|
-
className: "base-text",
|
|
70
|
-
children: header
|
|
71
|
-
})
|
|
72
|
-
}), /*#__PURE__*/_jsx(Col, {
|
|
73
|
-
span: 2,
|
|
74
|
-
children: /*#__PURE__*/_jsx("button", {
|
|
75
|
-
type: "button",
|
|
76
|
-
onClick: () => closeAction(undefined),
|
|
77
|
-
children: /*#__PURE__*/_jsx(CloseOutlined, {})
|
|
78
|
-
})
|
|
79
|
-
})]
|
|
80
|
-
}), eventList?.filter(Boolean)]
|
|
81
|
-
});
|
|
8
|
+
const { schedulerData, headerItem, left, top, height, closeAction } = props;
|
|
9
|
+
const { config, localeDayjs } = schedulerData;
|
|
10
|
+
const { time, start, end, events } = headerItem;
|
|
11
|
+
const [dndSource] = useState(() => new DnDSource((p) => p.eventItem, schedulerData.config.dragAndDropEnabled));
|
|
12
|
+
const header = localeDayjs(new Date(time)).format(config.addMorePopoverHeaderFormat);
|
|
13
|
+
const durationStart = localeDayjs(new Date(start));
|
|
14
|
+
const durationEnd = localeDayjs(end);
|
|
15
|
+
const eventList = events.map((evt, i) => {
|
|
16
|
+
if (evt !== undefined) {
|
|
17
|
+
const eventStart = localeDayjs(evt.eventItem.start);
|
|
18
|
+
const eventEnd = localeDayjs(evt.eventItem.end);
|
|
19
|
+
const isStart = eventStart >= durationStart;
|
|
20
|
+
const isEnd = eventEnd < durationEnd;
|
|
21
|
+
const eventItemTop = 12 + (i + 1) * config.eventItemLineHeight;
|
|
22
|
+
return (_createElement(EventItem, { ...props, key: evt.eventItem.id, eventItem: evt.eventItem, dndSource: dndSource, leftIndex: 0, isInPopover: true, isStart: isStart, isEnd: isEnd, rightIndex: 1, left: 10, width: 138, top: eventItemTop }));
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
});
|
|
26
|
+
return (_jsxs("div", { className: "rbs-add-more-popover-overlay", style: { left, top, height, minWidth: '170px' }, children: [_jsxs("div", { className: "rbs:flex rbs:items-center rbs:justify-between", children: [_jsx("span", { className: "base-text rbs:min-w-0 rbs:flex-1", children: header }), _jsx("button", { type: "button", className: "rbs-icon-btn", "aria-label": "Close", onClick: () => closeAction(undefined), children: _jsx(Close, {}) })] }), eventList.filter(Boolean)] }));
|
|
82
27
|
}
|
|
83
|
-
|
|
84
|
-
schedulerData: PropTypes.object.isRequired,
|
|
85
|
-
headerItem: PropTypes.object.isRequired,
|
|
86
|
-
left: PropTypes.number.isRequired,
|
|
87
|
-
top: PropTypes.number.isRequired,
|
|
88
|
-
height: PropTypes.number.isRequired,
|
|
89
|
-
closeAction: PropTypes.func.isRequired,
|
|
90
|
-
subtitleGetter: PropTypes.func,
|
|
91
|
-
moveEvent: PropTypes.func,
|
|
92
|
-
eventItemClick: PropTypes.func,
|
|
93
|
-
viewEventClick: PropTypes.func,
|
|
94
|
-
viewEventText: PropTypes.string,
|
|
95
|
-
viewEvent2Click: PropTypes.func,
|
|
96
|
-
viewEvent2Text: PropTypes.string,
|
|
97
|
-
eventItemTemplateResolver: PropTypes.func
|
|
98
|
-
};
|
|
99
|
-
export default AddMorePopover;
|
|
28
|
+
export default AddMorePopover;
|