makula-schedule 2.1.3 → 2.2.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.
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _antd = require("antd");
9
+ var _dayjs = _interopRequireDefault(require("dayjs"));
10
+ var _isoWeek = _interopRequireDefault(require("dayjs/plugin/isoWeek"));
11
+ var _propTypes = _interopRequireDefault(require("prop-types"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ require("../css/month-calendar.css");
14
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
16
+ // eslint-disable-next-line no-unused-vars
17
+
18
+ _dayjs["default"].extend(_isoWeek["default"]);
19
+ var DEFAULT_BG_COLOR = '#80C5F6';
20
+ function buildMonthGrid(date, weekStartsOn) {
21
+ var current = (0, _dayjs["default"])(date);
22
+ var firstOfMonth = current.startOf('month');
23
+ var lastOfMonth = current.endOf('month');
24
+
25
+ // Find the start of the grid (first day of the week containing the 1st)
26
+ var gridStart;
27
+ if (weekStartsOn === 1) {
28
+ // Monday start
29
+ gridStart = firstOfMonth.startOf('isoWeek');
30
+ } else {
31
+ // Sunday start
32
+ var day = firstOfMonth.day();
33
+ gridStart = day === 0 ? firstOfMonth : firstOfMonth.subtract(day, 'days');
34
+ }
35
+
36
+ // Build weeks until we pass the end of the month
37
+ var weeks = [];
38
+ var cursor = gridStart;
39
+ while (cursor.isBefore(lastOfMonth) || cursor.isSame(lastOfMonth, 'day') || weeks.length === 0) {
40
+ var week = [];
41
+ for (var i = 0; i < 7; i++) {
42
+ week.push({
43
+ date: cursor,
44
+ isCurrentMonth: cursor.month() === current.month() && cursor.year() === current.year(),
45
+ isToday: cursor.isSame((0, _dayjs["default"])(), 'day')
46
+ });
47
+ cursor = cursor.add(1, 'day');
48
+ }
49
+ weeks.push(week);
50
+ // Stop if we've filled weeks beyond the month
51
+ if (cursor.month() !== current.month() && weeks.length >= 4) {
52
+ // Check if we need one more week
53
+ if (cursor.isAfter(lastOfMonth)) break;
54
+ }
55
+ }
56
+ return weeks;
57
+ }
58
+ function getEventsForDay(events, day) {
59
+ var dayStart = day.startOf('day');
60
+ var dayEnd = day.endOf('day');
61
+ return events.filter(function (event) {
62
+ var eventStart = (0, _dayjs["default"])(event.start);
63
+ var eventEnd = (0, _dayjs["default"])(event.end);
64
+ return eventStart.isBefore(dayEnd) && eventEnd.isAfter(dayStart);
65
+ });
66
+ }
67
+ function getDayHeaderLabels(weekStartsOn, headerFormat) {
68
+ var base = weekStartsOn === 1 ? (0, _dayjs["default"])().startOf('isoWeek') : (0, _dayjs["default"])().day(0);
69
+ var labels = [];
70
+ for (var i = 0; i < 7; i++) {
71
+ labels.push(base.add(i, 'day').format(headerFormat));
72
+ }
73
+ return labels;
74
+ }
75
+ function EventPill(_ref) {
76
+ var event = _ref.event,
77
+ eventItemPopoverEnabled = _ref.eventItemPopoverEnabled,
78
+ eventItemPopoverTrigger = _ref.eventItemPopoverTrigger,
79
+ CustomEventPopover = _ref.CustomEventPopover,
80
+ onEventClick = _ref.onEventClick;
81
+ var bgColor = event.bgColor || DEFAULT_BG_COLOR;
82
+ var startTime = (0, _dayjs["default"])(event.start);
83
+ var endTime = (0, _dayjs["default"])(event.end);
84
+ var pill = /*#__PURE__*/_react["default"].createElement("span", {
85
+ className: "rbs-month-calendar-event",
86
+ style: {
87
+ backgroundColor: bgColor
88
+ },
89
+ onClick: function onClick(e) {
90
+ if (onEventClick) {
91
+ e.stopPropagation();
92
+ onEventClick(event);
93
+ }
94
+ },
95
+ title: event.title
96
+ }, event.title);
97
+ if (!eventItemPopoverEnabled) {
98
+ return pill;
99
+ }
100
+ var popoverContent = CustomEventPopover ? CustomEventPopover(event, event.title, startTime, endTime, bgColor) : /*#__PURE__*/_react["default"].createElement("div", {
101
+ style: {
102
+ width: 280
103
+ }
104
+ }, /*#__PURE__*/_react["default"].createElement("div", {
105
+ style: {
106
+ display: 'flex',
107
+ alignItems: 'center',
108
+ marginBottom: 6
109
+ }
110
+ }, /*#__PURE__*/_react["default"].createElement("div", {
111
+ style: {
112
+ width: 12,
113
+ height: 12,
114
+ borderRadius: 6,
115
+ backgroundColor: bgColor,
116
+ marginRight: 8,
117
+ flexShrink: 0
118
+ }
119
+ }), /*#__PURE__*/_react["default"].createElement("span", {
120
+ style: {
121
+ fontWeight: 500,
122
+ fontSize: 14,
123
+ overflow: 'hidden',
124
+ textOverflow: 'ellipsis',
125
+ whiteSpace: 'nowrap'
126
+ }
127
+ }, event.title)), /*#__PURE__*/_react["default"].createElement("div", {
128
+ style: {
129
+ color: '#666',
130
+ fontSize: 13
131
+ }
132
+ }, /*#__PURE__*/_react["default"].createElement("span", {
133
+ style: {
134
+ fontWeight: 500
135
+ }
136
+ }, startTime.format('HH:mm')), /*#__PURE__*/_react["default"].createElement("span", {
137
+ style: {
138
+ margin: '0 6px',
139
+ color: '#999'
140
+ }
141
+ }, startTime.format('MMM D')), /*#__PURE__*/_react["default"].createElement("span", {
142
+ style: {
143
+ margin: '0 4px'
144
+ }
145
+ }, "-"), /*#__PURE__*/_react["default"].createElement("span", {
146
+ style: {
147
+ fontWeight: 500
148
+ }
149
+ }, endTime.format('HH:mm')), /*#__PURE__*/_react["default"].createElement("span", {
150
+ style: {
151
+ margin: '0 6px',
152
+ color: '#999'
153
+ }
154
+ }, endTime.format('MMM D'))));
155
+ return /*#__PURE__*/_react["default"].createElement(_antd.Popover, {
156
+ content: popoverContent,
157
+ trigger: eventItemPopoverTrigger,
158
+ placement: "bottomLeft"
159
+ }, pill);
160
+ }
161
+ EventPill.propTypes = {
162
+ event: _propTypes["default"].object.isRequired,
163
+ eventItemPopoverEnabled: _propTypes["default"].bool,
164
+ eventItemPopoverTrigger: _propTypes["default"].string,
165
+ CustomEventPopover: _propTypes["default"].func,
166
+ onEventClick: _propTypes["default"].func
167
+ };
168
+ function MonthCalendarView(_ref2) {
169
+ var _ref2$events = _ref2.events,
170
+ events = _ref2$events === void 0 ? [] : _ref2$events,
171
+ date = _ref2.date,
172
+ onEventClick = _ref2.onEventClick,
173
+ CustomEventPopover = _ref2.CustomEventPopover,
174
+ _ref2$eventItemPopove = _ref2.eventItemPopoverEnabled,
175
+ eventItemPopoverEnabled = _ref2$eventItemPopove === void 0 ? true : _ref2$eventItemPopove,
176
+ _ref2$eventItemPopove2 = _ref2.eventItemPopoverTrigger,
177
+ eventItemPopoverTrigger = _ref2$eventItemPopove2 === void 0 ? 'hover' : _ref2$eventItemPopove2,
178
+ _ref2$maxEventsPerCel = _ref2.maxEventsPerCell,
179
+ maxEventsPerCell = _ref2$maxEventsPerCel === void 0 ? 3 : _ref2$maxEventsPerCel,
180
+ onMoreClick = _ref2.onMoreClick,
181
+ _ref2$weekStartsOn = _ref2.weekStartsOn,
182
+ weekStartsOn = _ref2$weekStartsOn === void 0 ? 1 : _ref2$weekStartsOn,
183
+ _ref2$headerFormat = _ref2.headerFormat,
184
+ headerFormat = _ref2$headerFormat === void 0 ? 'ddd' : _ref2$headerFormat,
185
+ className = _ref2.className;
186
+ var currentDate = date ? (0, _dayjs["default"])(date) : (0, _dayjs["default"])();
187
+ var weeks = (0, _react.useMemo)(function () {
188
+ return buildMonthGrid(currentDate, weekStartsOn);
189
+ }, [currentDate.format('YYYY-MM'), weekStartsOn]);
190
+ var dayHeaders = (0, _react.useMemo)(function () {
191
+ return getDayHeaderLabels(weekStartsOn, headerFormat);
192
+ }, [weekStartsOn, headerFormat]);
193
+ var rootClassName = ['rbs-month-calendar', className].filter(Boolean).join(' ');
194
+ return /*#__PURE__*/_react["default"].createElement("div", {
195
+ className: rootClassName
196
+ }, dayHeaders.map(function (label, i) {
197
+ return /*#__PURE__*/_react["default"].createElement("div", {
198
+ key: "header-".concat(i),
199
+ className: "rbs-month-calendar-header-cell"
200
+ }, label);
201
+ }), weeks.map(function (week, wi) {
202
+ return week.map(function (day, di) {
203
+ var dayEvents = getEventsForDay(events, day.date);
204
+ var visibleEvents = dayEvents.slice(0, maxEventsPerCell);
205
+ var overflowCount = dayEvents.length - maxEventsPerCell;
206
+ var cellClasses = ['rbs-month-calendar-cell', !day.isCurrentMonth && 'rbs-month-calendar-cell--outside', day.isToday && 'rbs-month-calendar-cell--today'].filter(Boolean).join(' ');
207
+ return /*#__PURE__*/_react["default"].createElement("div", {
208
+ key: "".concat(wi, "-").concat(di),
209
+ className: cellClasses
210
+ }, /*#__PURE__*/_react["default"].createElement("div", {
211
+ className: "rbs-month-calendar-day-number"
212
+ }, day.date.date()), /*#__PURE__*/_react["default"].createElement("div", {
213
+ className: "rbs-month-calendar-events"
214
+ }, visibleEvents.map(function (event) {
215
+ return /*#__PURE__*/_react["default"].createElement(EventPill, {
216
+ key: event.id,
217
+ event: event,
218
+ eventItemPopoverEnabled: eventItemPopoverEnabled,
219
+ eventItemPopoverTrigger: eventItemPopoverTrigger,
220
+ CustomEventPopover: CustomEventPopover,
221
+ onEventClick: onEventClick
222
+ });
223
+ }), overflowCount > 0 && /*#__PURE__*/_react["default"].createElement("button", {
224
+ className: "rbs-month-calendar-more",
225
+ type: "button",
226
+ onClick: function onClick() {
227
+ if (onMoreClick) onMoreClick(day.date, dayEvents);
228
+ }
229
+ }, "+", overflowCount, " more")));
230
+ });
231
+ }));
232
+ }
233
+ MonthCalendarView.propTypes = {
234
+ events: _propTypes["default"].arrayOf(_propTypes["default"].shape({
235
+ id: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]).isRequired,
236
+ title: _propTypes["default"].string.isRequired,
237
+ start: _propTypes["default"].string.isRequired,
238
+ end: _propTypes["default"].string.isRequired,
239
+ bgColor: _propTypes["default"].string
240
+ })),
241
+ date: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]),
242
+ onEventClick: _propTypes["default"].func,
243
+ CustomEventPopover: _propTypes["default"].func,
244
+ eventItemPopoverEnabled: _propTypes["default"].bool,
245
+ eventItemPopoverTrigger: _propTypes["default"].string,
246
+ maxEventsPerCell: _propTypes["default"].number,
247
+ onMoreClick: _propTypes["default"].func,
248
+ weekStartsOn: _propTypes["default"].oneOf([0, 1]),
249
+ headerFormat: _propTypes["default"].string,
250
+ className: _propTypes["default"].string
251
+ };
252
+ var _default = exports["default"] = MonthCalendarView;
@@ -46,6 +46,12 @@ Object.defineProperty(exports, "DnDSource", {
46
46
  return _DnDSource["default"];
47
47
  }
48
48
  });
49
+ Object.defineProperty(exports, "MonthCalendarView", {
50
+ enumerable: true,
51
+ get: function get() {
52
+ return _MonthCalendarView["default"];
53
+ }
54
+ });
49
55
  exports.Scheduler = Scheduler;
50
56
  Object.defineProperty(exports, "SchedulerData", {
51
57
  enumerable: true,
@@ -81,6 +87,7 @@ var _BodyView = _interopRequireDefault(require("./BodyView"));
81
87
  var _DnDContext = _interopRequireDefault(require("./DnDContext"));
82
88
  var _DnDSource = _interopRequireDefault(require("./DnDSource"));
83
89
  var _HeaderView = _interopRequireDefault(require("./HeaderView"));
90
+ var _MonthCalendarView = _interopRequireDefault(require("./MonthCalendarView"));
84
91
  var _ResourceEvents = _interopRequireDefault(require("./ResourceEvents"));
85
92
  var _ResourceView = _interopRequireDefault(require("./ResourceView"));
86
93
  var _SchedulerData = _interopRequireDefault(require("./SchedulerData"));
@@ -0,0 +1,109 @@
1
+ .rbs-month-calendar {
2
+ display: grid;
3
+ grid-template-columns: repeat(7, 1fr);
4
+ border: 1px solid #e9e9e9;
5
+ font-family: inherit;
6
+ font-size: 13px;
7
+ }
8
+
9
+ .rbs-month-calendar-header-cell {
10
+ padding: 8px 4px;
11
+ text-align: center;
12
+ font-weight: 600;
13
+ font-size: 12px;
14
+ color: #666;
15
+ border-bottom: 1px solid #e9e9e9;
16
+ border-right: 1px solid #e9e9e9;
17
+ background: #fafafa;
18
+ }
19
+
20
+ .rbs-month-calendar-header-cell:last-child {
21
+ border-right: none;
22
+ }
23
+
24
+ .rbs-month-calendar-cell {
25
+ min-height: 100px;
26
+ border-bottom: 1px solid #e9e9e9;
27
+ border-right: 1px solid #e9e9e9;
28
+ padding: 4px;
29
+ display: flex;
30
+ flex-direction: column;
31
+ background: #fff;
32
+ overflow: hidden;
33
+ }
34
+
35
+ .rbs-month-calendar-cell:nth-child(7n) {
36
+ border-right: none;
37
+ }
38
+
39
+ .rbs-month-calendar-cell:nth-last-child(-n+7) {
40
+ border-bottom: none;
41
+ }
42
+
43
+ .rbs-month-calendar-cell--outside {
44
+ background: #fafafa;
45
+ }
46
+
47
+ .rbs-month-calendar-cell--outside .rbs-month-calendar-day-number {
48
+ color: #bbb;
49
+ }
50
+
51
+ .rbs-month-calendar-cell--today .rbs-month-calendar-day-number {
52
+ background: #1890ff;
53
+ color: #fff;
54
+ border-radius: 50%;
55
+ width: 24px;
56
+ height: 24px;
57
+ display: inline-flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ }
61
+
62
+ .rbs-month-calendar-day-number {
63
+ font-size: 13px;
64
+ font-weight: 500;
65
+ color: #333;
66
+ margin-bottom: 4px;
67
+ line-height: 24px;
68
+ }
69
+
70
+ .rbs-month-calendar-events {
71
+ flex: 1;
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 2px;
75
+ min-width: 0;
76
+ }
77
+
78
+ .rbs-month-calendar-event {
79
+ display: block;
80
+ padding: 2px 6px;
81
+ border-radius: 4px;
82
+ font-size: 12px;
83
+ line-height: 18px;
84
+ color: #fff;
85
+ white-space: nowrap;
86
+ overflow: hidden;
87
+ text-overflow: ellipsis;
88
+ cursor: pointer;
89
+ min-width: 0;
90
+ }
91
+
92
+ .rbs-month-calendar-event:hover {
93
+ opacity: 0.85;
94
+ }
95
+
96
+ .rbs-month-calendar-more {
97
+ font-size: 11px;
98
+ color: #1890ff;
99
+ cursor: pointer;
100
+ padding: 2px 4px;
101
+ margin-top: 2px;
102
+ background: none;
103
+ border: none;
104
+ text-align: left;
105
+ }
106
+
107
+ .rbs-month-calendar-more:hover {
108
+ text-decoration: underline;
109
+ }
package/dist/index.d.ts CHANGED
@@ -464,3 +464,34 @@ export interface SchedulerDataBehaviors<EventType extends EventItem = EventItem>
464
464
  export const DATE_FORMAT = 'YYYY-MM-DD';
465
465
 
466
466
  export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
467
+
468
+ export interface MonthCalendarEvent {
469
+ id: string | number;
470
+ title: string;
471
+ start: string;
472
+ end: string;
473
+ bgColor?: string;
474
+ [x: string]: unknown;
475
+ }
476
+
477
+ export interface MonthCalendarViewProps {
478
+ events?: MonthCalendarEvent[];
479
+ date?: string | Dayjs | Date;
480
+ onEventClick?: (event: MonthCalendarEvent) => void;
481
+ CustomEventPopover?: (
482
+ event: MonthCalendarEvent,
483
+ title: string,
484
+ start: Dayjs,
485
+ end: Dayjs,
486
+ color: string
487
+ ) => React.ReactNode;
488
+ eventItemPopoverEnabled?: boolean;
489
+ eventItemPopoverTrigger?: 'hover' | 'click';
490
+ maxEventsPerCell?: number;
491
+ onMoreClick?: (date: Dayjs, events: MonthCalendarEvent[]) => void;
492
+ weekStartsOn?: 0 | 1;
493
+ headerFormat?: string;
494
+ className?: string;
495
+ }
496
+
497
+ export const MonthCalendarView: React.FC<MonthCalendarViewProps>;
package/dist/index.js CHANGED
@@ -45,6 +45,12 @@ Object.defineProperty(exports, "DnDSource", {
45
45
  return _index.DnDSource;
46
46
  }
47
47
  });
48
+ Object.defineProperty(exports, "MonthCalendarView", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _index.MonthCalendarView;
52
+ }
53
+ });
48
54
  Object.defineProperty(exports, "Scheduler", {
49
55
  enumerable: true,
50
56
  get: function get() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makula-schedule",
3
- "version": "2.1.3",
3
+ "version": "2.2.1",
4
4
  "description": "React Big Schedule is a powerful and intuitive scheduler and resource planning solution built with React. Seamlessly integrate this modern browser-compatible component into your applications to effectively manage time, appointments, and resources. With drag-and-drop functionality, interactive UI, and granular views, react-big-schedule empowers users to effortlessly schedule and allocate resources with precision. Enhance productivity and streamline your workflow with this React-based solution, designed to optimize time management and simplify calendar-based operations. Perfect for applications requiring advanced scheduling capabilities, react-big-schedule offers a seamless and intuitive experience for managing appointments, resource allocation, and time slots. Unlock the potential of your React projects with react-big-schedule and revolutionize the way you handle scheduling and resource planning. It is the updated version of react-big-scheduler",
5
5
  "keywords": [
6
6
  "react-big-schedule",