react-calendar-full
Version:
A full-featured React calendar component with event scheduling and monthly, weekly, and daily views.
113 lines (112 loc) • 6.14 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CalendarEventStore = void 0;
const react_1 = __importStar(require("react"));
const views_1 = require("./views");
const date_1 = require("./utils/date");
const calendar_event_store_1 = __importDefault(require("./calendar-event-store"));
exports.CalendarEventStore = calendar_event_store_1.default;
require("bootstrap/dist/css/bootstrap.css");
require("./calendar.css");
const Calendar = ({ activeDate, dayStartTime, dayEndTime, eventStore, }) => {
const [view, setView] = (0, react_1.useState)('WEEK');
const [activeDateState, setActiveDateState] = (0, react_1.useState)(activeDate || new Date());
const [, setEventStoreUpdateNumber] = (0, react_1.useState)(0); // TO DO: Refactor - A not-so-great way to force re-render on event store update.
(0, react_1.useEffect)(() => {
eventStore.onAdd(() => setEventStoreUpdateNumber((prev) => prev + 1));
eventStore.onUpdate(() => setEventStoreUpdateNumber((prev) => prev + 1));
eventStore.onDelete(() => setEventStoreUpdateNumber((prev) => prev + 1));
}, [eventStore]);
(0, react_1.useEffect)(() => {
setActiveDateState(activeDate || new Date());
}, [activeDate]);
let viewEL;
switch (view) {
case 'DAY':
viewEL = (react_1.default.createElement(views_1.DayView, { activeDate: activeDateState, dayStartTime: dayStartTime, dayEndTime: dayEndTime, eventStore: eventStore }));
break;
case 'WEEK':
viewEL = (react_1.default.createElement(views_1.WeekView, { activeDate: activeDateState, dayStartTime: dayStartTime, dayEndTime: dayEndTime, eventStore: eventStore }));
break;
case 'MONTH':
viewEL = (react_1.default.createElement(views_1.MonthView, { activeDate: activeDateState, eventStore: eventStore, onDayClick: (date) => {
setActiveDateState(date);
setView('DAY');
} }));
break;
}
const moveDateLeft = () => {
switch (view) {
case 'DAY':
setActiveDateState((0, date_1.moveDate)(activeDateState, -1));
break;
case 'WEEK':
setActiveDateState((0, date_1.moveDate)(activeDateState, -7));
break;
case 'MONTH':
setActiveDateState((0, date_1.moveMonth)(activeDateState, -1));
break;
}
};
const moveDateRight = () => {
switch (view) {
case 'DAY':
setActiveDateState((0, date_1.moveDate)(activeDateState, 1));
break;
case 'WEEK':
setActiveDateState((0, date_1.moveDate)(activeDateState, 7));
break;
case 'MONTH':
setActiveDateState((0, date_1.moveMonth)(activeDateState, 1));
break;
}
};
const dateInfo = (0, date_1.getDateInfo)(activeDateState);
return (react_1.default.createElement("div", { className: "calendar" },
react_1.default.createElement("div", { className: "d-flex justify-content-between m-4" },
react_1.default.createElement("div", { className: "fs-4" },
react_1.default.createElement("span", { className: 'd-none d-sm-block' },
react_1.default.createElement("strong", null, dateInfo.month),
" ",
dateInfo.year),
react_1.default.createElement("span", { className: 'd-block d-sm-none' },
react_1.default.createElement("strong", null, dateInfo.month.substring(0, 3)),
" ",
dateInfo.year.toString().substring(2, 4))),
react_1.default.createElement("div", { className: "btn-group btn-group-sm", role: "group" },
react_1.default.createElement("button", { className: 'btn btn-outline-secondary' + (view === 'DAY' ? ' active' : ''), onClick: () => setView('DAY') }, "Day"),
react_1.default.createElement("button", { className: 'btn btn-outline-secondary' + (view === 'WEEK' ? ' active' : ''), onClick: () => setView('WEEK') }, "Week"),
react_1.default.createElement("button", { className: 'btn btn-outline-secondary' + (view === 'MONTH' ? ' active' : ''), onClick: () => setView('MONTH') }, "Month")),
react_1.default.createElement("div", { className: "btn-group btn-group-sm", role: "group" },
react_1.default.createElement("button", { className: "btn btn-outline-secondary", onClick: moveDateLeft }, "<"),
react_1.default.createElement("button", { className: "btn btn-outline-secondary", onClick: () => setActiveDateState(new Date()) }, "Today"),
react_1.default.createElement("button", { className: "btn btn-outline-secondary", onClick: moveDateRight }, ">"))),
viewEL));
};
exports.default = Calendar;