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.
Files changed (109) hide show
  1. package/README.md +20 -1129
  2. package/dist/calendar/Calendar.d.ts +28 -0
  3. package/dist/calendar/Calendar.js +95 -0
  4. package/dist/calendar/Toolbar.d.ts +18 -0
  5. package/dist/calendar/Toolbar.js +6 -0
  6. package/dist/calendar/recurrence.check.d.ts +1 -0
  7. package/dist/calendar/recurrence.check.js +49 -0
  8. package/dist/calendar/recurrence.d.ts +8 -0
  9. package/dist/calendar/recurrence.js +90 -0
  10. package/dist/calendar/timezone.d.ts +6 -0
  11. package/dist/calendar/timezone.js +14 -0
  12. package/dist/calendar/types.d.ts +187 -0
  13. package/dist/calendar/types.js +1 -0
  14. package/dist/calendar/useEventSources.d.ts +11 -0
  15. package/dist/calendar/useEventSources.js +89 -0
  16. package/dist/calendar/useRecurrence.d.ts +4 -0
  17. package/dist/calendar/useRecurrence.js +15 -0
  18. package/dist/calendar/utils.d.ts +38 -0
  19. package/dist/calendar/utils.js +143 -0
  20. package/dist/calendar/views/DayGridView.d.ts +3 -0
  21. package/dist/calendar/views/DayGridView.js +375 -0
  22. package/dist/calendar/views/ListView.d.ts +4 -0
  23. package/dist/calendar/views/ListView.js +56 -0
  24. package/dist/calendar/views/MultiMonthView.d.ts +4 -0
  25. package/dist/calendar/views/MultiMonthView.js +36 -0
  26. package/dist/calendar/views/TimeGridView.d.ts +3 -0
  27. package/dist/calendar/views/TimeGridView.js +334 -0
  28. package/dist/calendar/views/daygrid/DayCell.d.ts +19 -0
  29. package/dist/calendar/views/daygrid/DayCell.js +17 -0
  30. package/dist/calendar/views/daygrid/EventChip.d.ts +19 -0
  31. package/dist/calendar/views/daygrid/EventChip.js +40 -0
  32. package/dist/calendar/views/daygrid/layout.d.ts +30 -0
  33. package/dist/calendar/views/daygrid/layout.js +63 -0
  34. package/dist/calendar/views/list/bucket.d.ts +8 -0
  35. package/dist/calendar/views/list/bucket.js +37 -0
  36. package/dist/calendar/views/multimonth/Cell.d.ts +12 -0
  37. package/dist/calendar/views/multimonth/Cell.js +44 -0
  38. package/dist/calendar/views/multimonth/Continuous.d.ts +8 -0
  39. package/dist/calendar/views/multimonth/Continuous.js +28 -0
  40. package/dist/calendar/views/multimonth/MonthGrid.d.ts +10 -0
  41. package/dist/calendar/views/multimonth/MonthGrid.js +36 -0
  42. package/dist/calendar/views/multimonth/shared.d.ts +27 -0
  43. package/dist/calendar/views/multimonth/shared.js +40 -0
  44. package/dist/calendar/views/timegrid/DayColumn.d.ts +49 -0
  45. package/dist/calendar/views/timegrid/DayColumn.js +86 -0
  46. package/dist/calendar/views/timegrid/model.d.ts +55 -0
  47. package/dist/calendar/views/timegrid/model.js +102 -0
  48. package/dist/components/AddMore.d.ts +13 -0
  49. package/dist/components/AddMore.js +9 -42
  50. package/dist/components/AddMorePopover.d.ts +13 -0
  51. package/dist/components/AddMorePopover.js +24 -95
  52. package/dist/components/AgendaEventItem.d.ts +10 -0
  53. package/dist/components/AgendaEventItem.js +33 -81
  54. package/dist/components/AgendaResourceEvents.d.ts +10 -0
  55. package/dist/components/AgendaResourceEvents.js +38 -90
  56. package/dist/components/AgendaView.d.ts +9 -0
  57. package/dist/components/AgendaView.js +10 -69
  58. package/dist/components/BodyView.d.ts +11 -0
  59. package/dist/components/BodyView.js +36 -67
  60. package/dist/components/DnDContext.d.ts +48 -0
  61. package/dist/components/DnDContext.js +200 -221
  62. package/dist/components/DnDSource.d.ts +49 -0
  63. package/dist/components/DnDSource.js +125 -120
  64. package/dist/components/EventItem.d.ts +41 -0
  65. package/dist/components/EventItem.js +585 -787
  66. package/dist/components/EventItemPopover.d.ts +12 -0
  67. package/dist/components/EventItemPopover.js +19 -143
  68. package/dist/components/HeaderView.d.ts +14 -0
  69. package/dist/components/HeaderView.js +123 -186
  70. package/dist/components/ResourceEvents.d.ts +54 -0
  71. package/dist/components/ResourceEvents.js +534 -703
  72. package/dist/components/ResourceView.d.ts +26 -0
  73. package/dist/components/ResourceView.js +64 -184
  74. package/dist/components/SchedulerData.d.ts +136 -0
  75. package/dist/components/SchedulerData.js +1296 -1226
  76. package/dist/components/SchedulerHeader.d.ts +25 -0
  77. package/dist/components/SchedulerHeader.js +50 -150
  78. package/dist/components/SelectedArea.d.ts +8 -0
  79. package/dist/components/SelectedArea.js +11 -26
  80. package/dist/components/Summary.d.ts +11 -0
  81. package/dist/components/Summary.js +21 -50
  82. package/dist/components/WrapperFun.d.ts +2 -0
  83. package/dist/components/WrapperFun.js +5 -10
  84. package/dist/components/index.d.ts +44 -0
  85. package/dist/components/index.js +428 -654
  86. package/dist/components/ui/Icons.d.ts +8 -0
  87. package/dist/components/ui/Icons.js +7 -0
  88. package/dist/components/ui/MiniCalendar.d.ts +9 -0
  89. package/dist/components/ui/MiniCalendar.js +17 -0
  90. package/dist/components/ui/Popover.d.ts +13 -0
  91. package/dist/components/ui/Popover.js +80 -0
  92. package/dist/config/default.d.ts +36 -0
  93. package/dist/config/default.js +17 -26
  94. package/dist/config/i18n.d.ts +27 -0
  95. package/dist/config/i18n.js +21 -37
  96. package/dist/config/scheduler.d.ts +12 -0
  97. package/dist/config/scheduler.js +126 -119
  98. package/dist/css/style.css +2 -316
  99. package/dist/helper/behaviors.d.ts +14 -0
  100. package/dist/helper/behaviors.js +75 -75
  101. package/dist/helper/utility.d.ts +26 -0
  102. package/dist/helper/utility.js +23 -30
  103. package/dist/index.d.ts +6 -477
  104. package/dist/index.js +4 -2
  105. package/dist/sample-data/sample1.d.ts +11 -0
  106. package/dist/sample-data/sample1.js +427 -372
  107. package/dist/types.d.ts +267 -0
  108. package/dist/types.js +1 -0
  109. 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 { Col, Row } from 'antd';
2
- import PropTypes from 'prop-types';
3
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
- function EventItemPopover({
5
- schedulerData,
6
- eventItem,
7
- title,
8
- startTime,
9
- endTime,
10
- statusColor,
11
- subtitleGetter,
12
- viewEventClick,
13
- viewEventText,
14
- viewEvent2Click,
15
- viewEvent2Text,
16
- eventItemPopoverTemplateResolver
17
- }) {
18
- const {
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
- EventItemPopover.propTypes = {
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 PropTypes from 'prop-types';
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
- * Render the table header rows for a scheduler view, including an optional week-number row and the main header cells.
7
- * @param {Object} props.schedulerData - Scheduler configuration and utilities (headers array,
8
- * cell unit, formatting, sizing, and locale/date functions).
9
- * @param {Function} [props.nonAgendaCellHeaderTemplateResolver] - Optional resolver to customize
10
- * rendering of individual header cells. Called with (schedulerData, headerItem, formattedList, style).
11
- * @returns {JSX.Element} A <thead> element containing the optional week-number row and the
12
- * main header row for the scheduler table.
13
- */
14
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
- function HeaderView({
16
- schedulerData,
17
- nonAgendaCellHeaderTemplateResolver
18
- }) {
19
- const {
20
- headers,
21
- cellUnit,
22
- config,
23
- localeDayjs
24
- } = schedulerData;
25
- const {
26
- showWeekNumber,
27
- weekNumberRowHeight = 24,
28
- showMonthRow,
29
- monthRowHeight = 24
30
- } = config;
31
- const headerHeight = schedulerData.getTableHeaderHeight();
32
- const cellWidth = schedulerData.getContentCellWidth();
33
- const minuteStepsInHour = schedulerData.getMinuteStepsInHour();
34
-
35
- // Group consecutive headers sharing a key into spanning <th>s (week number row, month row)
36
- const buildGroupRow = useCallback((keyOf, labelOf, stickyLabel = false) => {
37
- const groups = [];
38
- headers.forEach(item => {
39
- const d = localeDayjs(new Date(item.time));
40
- const key = keyOf(d);
41
- const last = groups[groups.length - 1];
42
- if (last && last.key === key) last.colspan += 1;else groups.push({
43
- key,
44
- label: labelOf(d),
45
- colspan: 1
46
- });
47
- });
48
- const cellStyle = {
49
- fontSize: '0.85em',
50
- opacity: 0.7,
51
- borderBottom: `1px solid ${config.headerBorderColor || '#e9e9e9'}`,
52
- padding: '4px 8px',
53
- textAlign: 'center'
54
- };
55
- return groups.map(group => /*#__PURE__*/_jsx("th", {
56
- colSpan: group.colspan,
57
- style: {
58
- ...cellStyle,
59
- ...(stickyLabel && {
60
- textAlign: 'left'
61
- }),
62
- width: group.colspan * cellWidth,
63
- minWidth: group.colspan * cellWidth
64
- },
65
- children: stickyLabel ? /*#__PURE__*/_jsx("span", {
66
- style: {
67
- position: 'sticky',
68
- left: 8
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 /*#__PURE__*/_jsx("th", {
132
- className: "header3-text",
133
- style: style,
134
- children: /*#__PURE__*/_jsx("div", {
135
- children: item.name
136
- })
137
- }, `header-${item.id}`);
138
- });
139
- }
140
- if (cellUnit === CellUnit.Hour) {
141
- const result = [];
142
- const lastIndex = headers.length - minuteStepsInHour;
143
- headers.forEach((item, index) => {
144
- if (index % minuteStepsInHour !== 0) return;
145
- const datetime = localeDayjs(new Date(item.time));
146
- const width = cellWidth * minuteStepsInHour;
147
- const isLastCell = index === lastIndex;
148
- const style = createCellStyle(item, width, isLastCell);
149
- const formattedList = config.nonAgendaDayCellHeaderFormat.split('|').map(format => datetime.format(format));
150
- result.push(renderCellContent(item, formattedList, style));
151
- });
152
- return result;
153
- }
154
-
155
- // Non-hour cell units
156
- const cellFormat = getCellFormat(cellUnit);
157
- const lastIndex = headers.length - 1;
158
- return headers.map((item, index) => {
159
- const datetime = localeDayjs(new Date(item.time));
160
- const isLastCell = index === lastIndex;
161
- const style = createCellStyle(item, cellWidth, isLastCell);
162
- const formattedList = cellFormat.split('|').map(format => datetime.format(format));
163
- return renderCellContent(item, formattedList, style);
164
- });
165
- }, [cellUnit, headers, minuteStepsInHour, cellWidth, config, localeDayjs, createCellStyle, getCellFormat, renderCellContent, schedulerData.isVerticalResourceView]);
166
- return /*#__PURE__*/_jsxs("thead", {
167
- children: [monthRow && /*#__PURE__*/_jsx("tr", {
168
- style: {
169
- height: monthRowHeight
170
- },
171
- children: monthRow
172
- }), weekNumberRow && /*#__PURE__*/_jsx("tr", {
173
- style: {
174
- height: weekNumberRowHeight
175
- },
176
- children: weekNumberRow
177
- }), /*#__PURE__*/_jsx("tr", {
178
- style: {
179
- height: headerHeight
180
- },
181
- children: headerList
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
- HeaderView.propTypes = {
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;