react-big-schedule 8.0.0 → 9.0.0
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 +20 -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 +38 -90
- 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 +35 -26
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EventPopoverCallbacks, SchedulerEvent } from '../types';
|
|
2
|
+
import type SchedulerData from './SchedulerData';
|
|
3
|
+
export interface EventItemPopoverProps extends EventPopoverCallbacks {
|
|
4
|
+
schedulerData: SchedulerData;
|
|
5
|
+
eventItem: SchedulerEvent;
|
|
6
|
+
title: string;
|
|
7
|
+
startTime: string;
|
|
8
|
+
endTime: string;
|
|
9
|
+
statusColor: string;
|
|
10
|
+
}
|
|
11
|
+
declare function EventItemPopover({ schedulerData, eventItem, title, startTime, endTime, statusColor, subtitleGetter, viewEventClick, viewEventText, viewEvent2Click, viewEvent2Text, eventItemPopoverTemplateResolver, }: EventItemPopoverProps): import("react").JSX.Element;
|
|
12
|
+
export default EventItemPopover;
|
|
@@ -1,144 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
localeDayjs,
|
|
20
|
-
config
|
|
21
|
-
} = schedulerData;
|
|
22
|
-
const start = localeDayjs(new Date(startTime));
|
|
23
|
-
const end = localeDayjs(new Date(endTime));
|
|
24
|
-
if (eventItemPopoverTemplateResolver) {
|
|
25
|
-
return eventItemPopoverTemplateResolver(schedulerData, eventItem, title, start, end, statusColor);
|
|
26
|
-
}
|
|
27
|
-
const subtitle = subtitleGetter ? subtitleGetter(schedulerData, eventItem) : null;
|
|
28
|
-
const showViewEvent = viewEventText && viewEventClick && (eventItem.clickable1 === undefined || eventItem.clickable1);
|
|
29
|
-
const showViewEvent2 = viewEvent2Text && viewEvent2Click && (eventItem.clickable2 === undefined || eventItem.clickable2);
|
|
30
|
-
const renderViewEvent = (text, clickHandler, marginLeft = 0) => /*#__PURE__*/_jsx("button", {
|
|
31
|
-
className: "header2-text rbs-txt-btn-dis",
|
|
32
|
-
type: "button",
|
|
33
|
-
style: {
|
|
34
|
-
color: '#108EE9',
|
|
35
|
-
cursor: 'pointer',
|
|
36
|
-
marginLeft: `${marginLeft}px`
|
|
37
|
-
},
|
|
38
|
-
onClick: () => clickHandler(schedulerData, eventItem),
|
|
39
|
-
children: text
|
|
40
|
-
});
|
|
41
|
-
return /*#__PURE__*/_jsxs("div", {
|
|
42
|
-
style: {
|
|
43
|
-
width: config.eventItemPopoverWidth
|
|
44
|
-
},
|
|
45
|
-
children: [/*#__PURE__*/_jsxs(Row, {
|
|
46
|
-
type: "flex",
|
|
47
|
-
align: "middle",
|
|
48
|
-
children: [config.eventItemPopoverShowColor && /*#__PURE__*/_jsx(Col, {
|
|
49
|
-
span: 2,
|
|
50
|
-
children: /*#__PURE__*/_jsx("div", {
|
|
51
|
-
className: "status-dot",
|
|
52
|
-
style: {
|
|
53
|
-
backgroundColor: statusColor
|
|
54
|
-
}
|
|
55
|
-
})
|
|
56
|
-
}), /*#__PURE__*/_jsx(Col, {
|
|
57
|
-
span: 22,
|
|
58
|
-
className: "overflow-text",
|
|
59
|
-
children: /*#__PURE__*/_jsx("span", {
|
|
60
|
-
className: "header2-text",
|
|
61
|
-
title: title,
|
|
62
|
-
children: title
|
|
63
|
-
})
|
|
64
|
-
})]
|
|
65
|
-
}), subtitle && /*#__PURE__*/_jsxs(Row, {
|
|
66
|
-
type: "flex",
|
|
67
|
-
align: "middle",
|
|
68
|
-
children: [/*#__PURE__*/_jsx(Col, {
|
|
69
|
-
span: 2,
|
|
70
|
-
children: /*#__PURE__*/_jsx("div", {})
|
|
71
|
-
}), /*#__PURE__*/_jsx(Col, {
|
|
72
|
-
span: 22,
|
|
73
|
-
className: "overflow-text",
|
|
74
|
-
children: /*#__PURE__*/_jsx("span", {
|
|
75
|
-
className: "header2-text",
|
|
76
|
-
title: subtitle,
|
|
77
|
-
children: subtitle
|
|
78
|
-
})
|
|
79
|
-
})]
|
|
80
|
-
}), /*#__PURE__*/_jsxs(Row, {
|
|
81
|
-
type: "flex",
|
|
82
|
-
align: "middle",
|
|
83
|
-
children: [/*#__PURE__*/_jsx(Col, {
|
|
84
|
-
span: 2,
|
|
85
|
-
children: /*#__PURE__*/_jsx("div", {})
|
|
86
|
-
}), /*#__PURE__*/_jsxs(Col, {
|
|
87
|
-
span: 22,
|
|
88
|
-
children: [/*#__PURE__*/_jsx("span", {
|
|
89
|
-
className: "header1-text",
|
|
90
|
-
children: start.format('HH:mm')
|
|
91
|
-
}), config.eventItemPopoverDateFormat && /*#__PURE__*/_jsx("span", {
|
|
92
|
-
className: "help-text",
|
|
93
|
-
style: {
|
|
94
|
-
marginLeft: '8px'
|
|
95
|
-
},
|
|
96
|
-
children: start.format(config.eventItemPopoverDateFormat)
|
|
97
|
-
}), /*#__PURE__*/_jsx("span", {
|
|
98
|
-
className: "header2-text",
|
|
99
|
-
style: {
|
|
100
|
-
marginLeft: '8px'
|
|
101
|
-
},
|
|
102
|
-
children: "-"
|
|
103
|
-
}), /*#__PURE__*/_jsx("span", {
|
|
104
|
-
className: "header1-text",
|
|
105
|
-
style: {
|
|
106
|
-
marginLeft: '8px'
|
|
107
|
-
},
|
|
108
|
-
children: end.format('HH:mm')
|
|
109
|
-
}), config.eventItemPopoverDateFormat && /*#__PURE__*/_jsx("span", {
|
|
110
|
-
className: "help-text",
|
|
111
|
-
style: {
|
|
112
|
-
marginLeft: '8px'
|
|
113
|
-
},
|
|
114
|
-
children: end.format(config.eventItemPopoverDateFormat)
|
|
115
|
-
})]
|
|
116
|
-
})]
|
|
117
|
-
}), (showViewEvent || showViewEvent2) && /*#__PURE__*/_jsxs(Row, {
|
|
118
|
-
type: "flex",
|
|
119
|
-
align: "middle",
|
|
120
|
-
children: [/*#__PURE__*/_jsx(Col, {
|
|
121
|
-
span: 2,
|
|
122
|
-
children: /*#__PURE__*/_jsx("div", {})
|
|
123
|
-
}), /*#__PURE__*/_jsxs(Col, {
|
|
124
|
-
span: 22,
|
|
125
|
-
children: [showViewEvent && renderViewEvent(viewEventText, viewEventClick), showViewEvent2 && renderViewEvent(viewEvent2Text, viewEvent2Click, 16)]
|
|
126
|
-
})]
|
|
127
|
-
})]
|
|
128
|
-
});
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const Row = ({ dot, children, truncate }) => (_jsxs("div", { className: "rbs:flex rbs:items-center", children: [_jsx("div", { className: "rbs:w-6 rbs:shrink-0", children: dot ?? _jsx("div", {}) }), _jsx("div", { className: `rbs:min-w-0 rbs:flex-1${truncate ? ' overflow-text' : ''}`, children: children })] }));
|
|
3
|
+
function EventItemPopover({ schedulerData, eventItem, title, startTime, endTime, statusColor, subtitleGetter, viewEventClick, viewEventText, viewEvent2Click, viewEvent2Text, eventItemPopoverTemplateResolver, }) {
|
|
4
|
+
const { localeDayjs, config } = schedulerData;
|
|
5
|
+
const start = localeDayjs(new Date(startTime));
|
|
6
|
+
const end = localeDayjs(new Date(endTime));
|
|
7
|
+
if (eventItemPopoverTemplateResolver) {
|
|
8
|
+
return _jsx(_Fragment, { children: eventItemPopoverTemplateResolver(schedulerData, eventItem, title, start, end, statusColor) });
|
|
9
|
+
}
|
|
10
|
+
const subtitle = subtitleGetter ? subtitleGetter(schedulerData, eventItem) : null;
|
|
11
|
+
const showViewEvent = viewEventText && viewEventClick && (eventItem.clickable1 === undefined || eventItem.clickable1);
|
|
12
|
+
const showViewEvent2 = viewEvent2Text && viewEvent2Click && (eventItem.clickable2 === undefined || eventItem.clickable2);
|
|
13
|
+
const renderViewEvent = (text, clickHandler, marginLeft = 0) => (_jsx("button", { className: "header2-text rbs-txt-btn-dis", type: "button", style: {
|
|
14
|
+
color: 'var(--rbs-accent)',
|
|
15
|
+
cursor: 'pointer',
|
|
16
|
+
marginLeft: `${marginLeft}px`,
|
|
17
|
+
}, onClick: () => clickHandler(schedulerData, eventItem), children: text }));
|
|
18
|
+
return (_jsxs("div", { style: { width: config.eventItemPopoverWidth }, children: [_jsx(Row, { truncate: true, dot: config.eventItemPopoverShowColor ? (_jsx("div", { className: "status-dot", style: { backgroundColor: statusColor } })) : null, children: _jsx("span", { className: "header2-text", title: title, children: title }) }), subtitle && (_jsx(Row, { truncate: true, children: _jsx("span", { className: "header2-text", title: typeof subtitle === 'string' ? subtitle : undefined, children: subtitle }) })), _jsxs(Row, { children: [_jsx("span", { className: "header1-text", children: start.format('HH:mm') }), config.eventItemPopoverDateFormat && (_jsx("span", { className: "help-text", style: { marginLeft: '8px' }, children: start.format(config.eventItemPopoverDateFormat) })), _jsx("span", { className: "header2-text", style: { marginLeft: '8px' }, children: "-" }), _jsx("span", { className: "header1-text", style: { marginLeft: '8px' }, children: end.format('HH:mm') }), config.eventItemPopoverDateFormat && (_jsx("span", { className: "help-text", style: { marginLeft: '8px' }, children: end.format(config.eventItemPopoverDateFormat) }))] }), (showViewEvent || showViewEvent2) && (_jsxs(Row, { children: [showViewEvent && renderViewEvent(viewEventText, viewEventClick), showViewEvent2 && renderViewEvent(viewEvent2Text, viewEvent2Click, 16)] }))] }));
|
|
129
19
|
}
|
|
130
|
-
|
|
131
|
-
schedulerData: PropTypes.object.isRequired,
|
|
132
|
-
eventItem: PropTypes.object.isRequired,
|
|
133
|
-
title: PropTypes.string.isRequired,
|
|
134
|
-
startTime: PropTypes.string.isRequired,
|
|
135
|
-
endTime: PropTypes.string.isRequired,
|
|
136
|
-
statusColor: PropTypes.string.isRequired,
|
|
137
|
-
subtitleGetter: PropTypes.func,
|
|
138
|
-
viewEventClick: PropTypes.func,
|
|
139
|
-
viewEventText: PropTypes.string,
|
|
140
|
-
viewEvent2Click: PropTypes.func,
|
|
141
|
-
viewEvent2Text: PropTypes.string,
|
|
142
|
-
eventItemPopoverTemplateResolver: PropTypes.func
|
|
143
|
-
};
|
|
144
|
-
export default EventItemPopover;
|
|
20
|
+
export default EventItemPopover;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import type { HeaderCell } from '../types';
|
|
3
|
+
import type SchedulerData from './SchedulerData';
|
|
4
|
+
export type NonAgendaCellHeaderTemplateResolver = (schedulerData: SchedulerData, item: HeaderCell, formattedList: string[], style: CSSProperties) => ReactNode;
|
|
5
|
+
export interface HeaderViewProps {
|
|
6
|
+
schedulerData: SchedulerData;
|
|
7
|
+
/** Changes whenever schedulerData mutates, so the memoised view re-renders. */
|
|
8
|
+
schedulerDataVersion?: number;
|
|
9
|
+
nonAgendaCellHeaderTemplateResolver?: NonAgendaCellHeaderTemplateResolver;
|
|
10
|
+
}
|
|
11
|
+
/** Render the table header rows: optional month and week-number rows plus the main header row. */
|
|
12
|
+
declare function HeaderView({ schedulerData, nonAgendaCellHeaderTemplateResolver }: HeaderViewProps): React.JSX.Element;
|
|
13
|
+
declare const _default: React.MemoExoticComponent<typeof HeaderView>;
|
|
14
|
+
export default _default;
|
|
@@ -1,190 +1,127 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useCallback, useMemo } from 'react';
|
|
3
3
|
import { CellUnit } from '../config/default';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
},
|
|
70
|
-
children: group.label
|
|
71
|
-
}) : group.label
|
|
72
|
-
}, group.key));
|
|
73
|
-
}, [headers, localeDayjs, config.headerBorderColor, cellWidth]);
|
|
74
|
-
const isGrouped = !schedulerData.isVerticalResourceView();
|
|
75
|
-
const weekNumberRow = useMemo(() => showWeekNumber && isGrouped ? buildGroupRow(d => `w-${d.year()}-${d.isoWeek()}`, d => `W${d.isoWeek()}`) : null, [showWeekNumber, isGrouped, buildGroupRow]);
|
|
76
|
-
const monthRow = useMemo(() => showMonthRow && isGrouped ? buildGroupRow(d => `m-${d.year()}-${d.month()}`, d => d.format('MMMM YYYY'), true) : null, [showMonthRow, isGrouped, buildGroupRow]);
|
|
77
|
-
|
|
78
|
-
// Extract common style creation logic
|
|
79
|
-
const createCellStyle = useCallback((item, width, isLastCell) => {
|
|
80
|
-
if (isLastCell) {
|
|
81
|
-
return item.nonWorkingTime ? {
|
|
82
|
-
color: config.nonWorkingTimeHeadColor,
|
|
83
|
-
backgroundColor: config.nonWorkingTimeHeadBgColor
|
|
84
|
-
} : {};
|
|
85
|
-
}
|
|
86
|
-
return item.nonWorkingTime ? {
|
|
87
|
-
width,
|
|
88
|
-
color: config.nonWorkingTimeHeadColor,
|
|
89
|
-
backgroundColor: config.nonWorkingTimeHeadBgColor
|
|
90
|
-
} : {
|
|
91
|
-
width
|
|
92
|
-
};
|
|
93
|
-
}, [config]);
|
|
94
|
-
|
|
95
|
-
// Extract cell format selection logic
|
|
96
|
-
const getCellFormat = useCallback(cellUnitParam => {
|
|
97
|
-
const formatMap = {
|
|
98
|
-
[CellUnit.Week]: config.nonAgendaWeekCellHeaderFormat,
|
|
99
|
-
[CellUnit.Month]: config.nonAgendaMonthCellHeaderFormat,
|
|
100
|
-
[CellUnit.Year]: config.nonAgendaYearCellHeaderFormat,
|
|
101
|
-
[CellUnit.Quarter]: config.nonAgendaQuarterCellHeaderFormat
|
|
102
|
-
};
|
|
103
|
-
return formatMap[cellUnitParam] || config.nonAgendaOtherCellHeaderFormat;
|
|
104
|
-
}, [config]);
|
|
105
|
-
|
|
106
|
-
// Render cell content helper
|
|
107
|
-
const renderCellContent = useCallback((item, formattedList, style) => {
|
|
108
|
-
if (typeof nonAgendaCellHeaderTemplateResolver === 'function') {
|
|
109
|
-
return nonAgendaCellHeaderTemplateResolver(schedulerData, item, formattedList, style);
|
|
110
|
-
}
|
|
111
|
-
const content = formattedList.map(text => /*#__PURE__*/_jsx("div", {
|
|
112
|
-
children: text
|
|
113
|
-
}, `${item.time}-${text}`));
|
|
114
|
-
return /*#__PURE__*/_jsx("th", {
|
|
115
|
-
className: "header3-text",
|
|
116
|
-
style: style,
|
|
117
|
-
children: /*#__PURE__*/_jsx("div", {
|
|
118
|
-
children: content
|
|
119
|
-
})
|
|
120
|
-
}, `header-${item.time}`);
|
|
121
|
-
}, [nonAgendaCellHeaderTemplateResolver, schedulerData]);
|
|
122
|
-
|
|
123
|
-
// Memoize header list generation
|
|
124
|
-
const headerList = useMemo(() => {
|
|
125
|
-
if (schedulerData.isVerticalResourceView()) {
|
|
126
|
-
return headers.map(item => {
|
|
127
|
-
const style = {
|
|
128
|
-
width: cellWidth,
|
|
129
|
-
minWidth: cellWidth
|
|
4
|
+
/** Render the table header rows: optional month and week-number rows plus the main header row. */
|
|
5
|
+
function HeaderView({ schedulerData, nonAgendaCellHeaderTemplateResolver }) {
|
|
6
|
+
const { headers, cellUnit, config, localeDayjs } = schedulerData;
|
|
7
|
+
const { showWeekNumber, weekNumberRowHeight = 24, showMonthRow, monthRowHeight = 24 } = config;
|
|
8
|
+
const headerHeight = schedulerData.getTableHeaderHeight();
|
|
9
|
+
const cellWidth = schedulerData.getContentCellWidth();
|
|
10
|
+
const minuteStepsInHour = schedulerData.getMinuteStepsInHour();
|
|
11
|
+
// Group consecutive headers sharing a key into spanning <th>s (week number row, month row)
|
|
12
|
+
const buildGroupRow = useCallback((keyOf, labelOf, stickyLabel = false) => {
|
|
13
|
+
const groups = [];
|
|
14
|
+
headers.forEach(item => {
|
|
15
|
+
const d = localeDayjs(new Date(item.time));
|
|
16
|
+
const key = keyOf(d);
|
|
17
|
+
const last = groups[groups.length - 1];
|
|
18
|
+
if (last && last.key === key)
|
|
19
|
+
last.colspan += 1;
|
|
20
|
+
else
|
|
21
|
+
groups.push({ key, label: labelOf(d), colspan: 1 });
|
|
22
|
+
});
|
|
23
|
+
const cellStyle = {
|
|
24
|
+
fontSize: '0.85em',
|
|
25
|
+
opacity: 0.7,
|
|
26
|
+
borderBottom: `1px solid ${config.headerBorderColor || 'var(--rbs-border)'}`,
|
|
27
|
+
padding: '4px 8px',
|
|
28
|
+
textAlign: 'center',
|
|
29
|
+
};
|
|
30
|
+
return groups.map(group => (_jsx("th", { colSpan: group.colspan, style: {
|
|
31
|
+
...cellStyle,
|
|
32
|
+
...(stickyLabel && { textAlign: 'left' }),
|
|
33
|
+
width: group.colspan * cellWidth,
|
|
34
|
+
minWidth: group.colspan * cellWidth,
|
|
35
|
+
}, children: stickyLabel ? _jsx("span", { style: { position: 'sticky', left: 8 }, children: group.label }) : group.label }, group.key)));
|
|
36
|
+
}, [headers, localeDayjs, config.headerBorderColor, cellWidth]);
|
|
37
|
+
const isGrouped = !schedulerData.isVerticalResourceView();
|
|
38
|
+
const weekNumberRow = useMemo(() => showWeekNumber && isGrouped
|
|
39
|
+
? buildGroupRow(d => `w-${d.year()}-${d.isoWeek()}`, d => `W${d.isoWeek()}`)
|
|
40
|
+
: null, [showWeekNumber, isGrouped, buildGroupRow]);
|
|
41
|
+
const monthRow = useMemo(() => showMonthRow && isGrouped
|
|
42
|
+
? buildGroupRow(d => `m-${d.year()}-${d.month()}`, d => d.format('MMMM YYYY'), true)
|
|
43
|
+
: null, [showMonthRow, isGrouped, buildGroupRow]);
|
|
44
|
+
// Extract common style creation logic
|
|
45
|
+
const createCellStyle = useCallback((item, width, isLastCell) => {
|
|
46
|
+
if (isLastCell) {
|
|
47
|
+
return item.nonWorkingTime
|
|
48
|
+
? {
|
|
49
|
+
color: config.nonWorkingTimeHeadColor,
|
|
50
|
+
backgroundColor: config.nonWorkingTimeHeadBgColor,
|
|
51
|
+
}
|
|
52
|
+
: {};
|
|
53
|
+
}
|
|
54
|
+
return item.nonWorkingTime
|
|
55
|
+
? {
|
|
56
|
+
width,
|
|
57
|
+
color: config.nonWorkingTimeHeadColor,
|
|
58
|
+
backgroundColor: config.nonWorkingTimeHeadBgColor,
|
|
59
|
+
}
|
|
60
|
+
: { width };
|
|
61
|
+
}, [config]);
|
|
62
|
+
// Extract cell format selection logic
|
|
63
|
+
const getCellFormat = useCallback((cellUnitParam) => {
|
|
64
|
+
const formatMap = {
|
|
65
|
+
[CellUnit.Week]: config.nonAgendaWeekCellHeaderFormat,
|
|
66
|
+
[CellUnit.Month]: config.nonAgendaMonthCellHeaderFormat,
|
|
67
|
+
[CellUnit.Year]: config.nonAgendaYearCellHeaderFormat,
|
|
68
|
+
[CellUnit.Quarter]: config.nonAgendaQuarterCellHeaderFormat,
|
|
130
69
|
};
|
|
131
|
-
return
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
70
|
+
return formatMap[cellUnitParam] || config.nonAgendaOtherCellHeaderFormat;
|
|
71
|
+
}, [config]);
|
|
72
|
+
// Render cell content helper
|
|
73
|
+
const renderCellContent = useCallback((item, formattedList, style) => {
|
|
74
|
+
if (typeof nonAgendaCellHeaderTemplateResolver === 'function') {
|
|
75
|
+
return nonAgendaCellHeaderTemplateResolver(schedulerData, item, formattedList, style);
|
|
76
|
+
}
|
|
77
|
+
const content = formattedList.map(text => _jsx("div", { children: text }, `${item.time}-${text}`));
|
|
78
|
+
return (_jsx("th", { className: "header3-text", style: style, children: _jsx("div", { children: content }) }, `header-${item.time}`));
|
|
79
|
+
}, [nonAgendaCellHeaderTemplateResolver, schedulerData]);
|
|
80
|
+
// Memoize header list generation
|
|
81
|
+
const headerList = useMemo(() => {
|
|
82
|
+
if (schedulerData.isVerticalResourceView()) {
|
|
83
|
+
return headers.map(item => {
|
|
84
|
+
const style = { width: cellWidth, minWidth: cellWidth };
|
|
85
|
+
return (_jsx("th", { className: "header3-text", style: style, children: _jsx("div", { children: item.name }) }, `header-${item.id}`));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
if (cellUnit === CellUnit.Hour) {
|
|
89
|
+
const result = [];
|
|
90
|
+
const lastIndex = headers.length - minuteStepsInHour;
|
|
91
|
+
headers.forEach((item, index) => {
|
|
92
|
+
if (index % minuteStepsInHour !== 0)
|
|
93
|
+
return;
|
|
94
|
+
const datetime = localeDayjs(new Date(item.time));
|
|
95
|
+
const width = cellWidth * minuteStepsInHour;
|
|
96
|
+
const isLastCell = index === lastIndex;
|
|
97
|
+
const style = createCellStyle(item, width, isLastCell);
|
|
98
|
+
const formattedList = config.nonAgendaDayCellHeaderFormat.split('|').map(format => datetime.format(format));
|
|
99
|
+
result.push(renderCellContent(item, formattedList, style));
|
|
100
|
+
});
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
// Non-hour cell units
|
|
104
|
+
const cellFormat = getCellFormat(cellUnit);
|
|
105
|
+
const lastIndex = headers.length - 1;
|
|
106
|
+
return headers.map((item, index) => {
|
|
107
|
+
const datetime = localeDayjs(new Date(item.time));
|
|
108
|
+
const isLastCell = index === lastIndex;
|
|
109
|
+
const style = createCellStyle(item, cellWidth, isLastCell);
|
|
110
|
+
const formattedList = cellFormat.split('|').map(format => datetime.format(format));
|
|
111
|
+
return renderCellContent(item, formattedList, style);
|
|
112
|
+
});
|
|
113
|
+
}, [
|
|
114
|
+
cellUnit,
|
|
115
|
+
headers,
|
|
116
|
+
minuteStepsInHour,
|
|
117
|
+
cellWidth,
|
|
118
|
+
config,
|
|
119
|
+
localeDayjs,
|
|
120
|
+
createCellStyle,
|
|
121
|
+
getCellFormat,
|
|
122
|
+
renderCellContent,
|
|
123
|
+
schedulerData.isVerticalResourceView,
|
|
124
|
+
]);
|
|
125
|
+
return (_jsxs("thead", { children: [monthRow && _jsx("tr", { style: { height: monthRowHeight }, children: monthRow }), weekNumberRow && _jsx("tr", { style: { height: weekNumberRowHeight }, children: weekNumberRow }), _jsx("tr", { style: { height: headerHeight }, children: headerList })] }));
|
|
184
126
|
}
|
|
185
|
-
|
|
186
|
-
schedulerData: PropTypes.object.isRequired,
|
|
187
|
-
schedulerDataVersion: PropTypes.number,
|
|
188
|
-
nonAgendaCellHeaderTemplateResolver: PropTypes.func
|
|
189
|
-
};
|
|
190
|
-
export default /*#__PURE__*/React.memo(HeaderView);
|
|
127
|
+
export default React.memo(HeaderView);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { HeaderItem, Id, RenderItem } from '../types';
|
|
3
|
+
import type DnDContext from './DnDContext';
|
|
4
|
+
import type DnDSource from './DnDSource';
|
|
5
|
+
import { type EventItemProps } from './EventItem';
|
|
6
|
+
import type SchedulerData from './SchedulerData';
|
|
7
|
+
export interface SelectionPreview {
|
|
8
|
+
isSelecting?: boolean;
|
|
9
|
+
left?: number;
|
|
10
|
+
width?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface AddMoreState {
|
|
13
|
+
headerItem: HeaderItem;
|
|
14
|
+
left: number;
|
|
15
|
+
top: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
18
|
+
export interface DropPreview {
|
|
19
|
+
left: number;
|
|
20
|
+
width: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ResourceEventsProps extends Pick<EventItemProps, 'updateEventStart' | 'updateEventEnd' | 'moveEvent' | 'conflictOccurred' | 'subtitleGetter' | 'eventItemClick' | 'viewEventClick' | 'viewEventText' | 'viewEvent2Click' | 'viewEvent2Text' | 'eventItemTemplateResolver' | 'eventItemPopoverTemplateResolver'> {
|
|
23
|
+
resourceEvents: RenderItem;
|
|
24
|
+
schedulerData: SchedulerData;
|
|
25
|
+
schedulerDataVersion?: number;
|
|
26
|
+
dndSource: DnDSource;
|
|
27
|
+
dndContext?: DnDContext;
|
|
28
|
+
onSetAddMoreState?: (state: AddMoreState) => void;
|
|
29
|
+
movingEvent?: (schedulerData: SchedulerData, slotId: Id, slotName: string, newStart: string, newEnd: string, action: string, type: string, item: unknown) => void;
|
|
30
|
+
newEvent?: (schedulerData: SchedulerData, slotId: Id, slotName: string, start: string, end: string, type?: string, item?: {
|
|
31
|
+
resourceIds?: Id[];
|
|
32
|
+
}) => void;
|
|
33
|
+
onSelectionChange?: (isSelecting: boolean, selectedResourceIds: Id[], preview: SelectionPreview) => void;
|
|
34
|
+
isRowSelected?: boolean;
|
|
35
|
+
selectionPreview?: SelectionPreview;
|
|
36
|
+
}
|
|
37
|
+
export interface ResourceEventsState {
|
|
38
|
+
isSelecting: boolean;
|
|
39
|
+
left: number;
|
|
40
|
+
width: number;
|
|
41
|
+
originalStartRowIndex: number;
|
|
42
|
+
startRowIndex: number;
|
|
43
|
+
endRowIndex: number;
|
|
44
|
+
dropPreview: DropPreview | null;
|
|
45
|
+
startX?: number;
|
|
46
|
+
leftIndex?: number;
|
|
47
|
+
rightIndex?: number;
|
|
48
|
+
}
|
|
49
|
+
declare const ResourceEventsWithDnD: {
|
|
50
|
+
(props: ResourceEventsProps): React.JSX.Element;
|
|
51
|
+
displayName: string;
|
|
52
|
+
};
|
|
53
|
+
declare const _default: React.MemoExoticComponent<typeof ResourceEventsWithDnD>;
|
|
54
|
+
export default _default;
|