UNPKG

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
"use strict"; 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;