From cebc19ef236aac2968d2ffccfcff9b975b63fa8d Mon Sep 17 00:00:00 2001 From: polo Date: Mon, 23 Jun 2025 03:33:38 +0200 Subject: fullcalendar --- public/css/calendar.css | 51 + public/js/calendar.js | 110 + public/js/calendar_admin.js | 375 + public/js/fullcalendar/LICENSE.md | 22 + public/js/fullcalendar/README.md | 73 + public/js/fullcalendar/dist/index.global.js | 14775 +++++++++++++++++++ public/js/fullcalendar/dist/index.global.min.js | 6 + .../fullcalendar/examples/background-events.html | 101 + public/js/fullcalendar/examples/daygrid-views.html | 104 + .../examples/external-dragging-2cals.html | 69 + .../examples/external-dragging-builtin.html | 149 + public/js/fullcalendar/examples/full-height.html | 125 + .../fullcalendar/examples/list-sticky-header.html | 76 + public/js/fullcalendar/examples/list-views.html | 114 + public/js/fullcalendar/examples/month-view.html | 100 + .../js/fullcalendar/examples/multimonth-view.html | 110 + .../js/fullcalendar/examples/multiweek-view.html | 107 + .../js/fullcalendar/examples/natural-height.html | 108 + public/js/fullcalendar/examples/selectable.html | 123 + .../examples/timegrid-views-modal.html | 180 + .../js/fullcalendar/examples/timegrid-views.html | 108 + .../packages/bootstrap4/index.global.js | 64 + .../packages/bootstrap4/index.global.min.js | 6 + .../packages/bootstrap5/index.global.js | 64 + .../packages/bootstrap5/index.global.min.js | 6 + .../js/fullcalendar/packages/core/index.global.js | 9929 +++++++++++++ .../fullcalendar/packages/core/index.global.min.js | 6 + .../packages/core/locales-all.global.js | 1933 +++ .../packages/core/locales-all.global.min.js | 6 + .../packages/core/locales/af.global.js | 32 + .../packages/core/locales/af.global.min.js | 6 + .../packages/core/locales/ar-dz.global.js | 34 + .../packages/core/locales/ar-dz.global.min.js | 6 + .../packages/core/locales/ar-kw.global.js | 34 + .../packages/core/locales/ar-kw.global.min.js | 6 + .../packages/core/locales/ar-ly.global.js | 34 + .../packages/core/locales/ar-ly.global.min.js | 6 + .../packages/core/locales/ar-ma.global.js | 34 + .../packages/core/locales/ar-ma.global.min.js | 6 + .../packages/core/locales/ar-sa.global.js | 34 + .../packages/core/locales/ar-sa.global.min.js | 6 + .../packages/core/locales/ar-tn.global.js | 34 + .../packages/core/locales/ar-tn.global.min.js | 6 + .../packages/core/locales/ar.global.js | 34 + .../packages/core/locales/ar.global.min.js | 6 + .../packages/core/locales/az.global.js | 35 + .../packages/core/locales/az.global.min.js | 6 + .../packages/core/locales/bg.global.js | 34 + .../packages/core/locales/bg.global.min.js | 6 + .../packages/core/locales/bn.global.js | 35 + .../packages/core/locales/bn.global.min.js | 6 + .../packages/core/locales/bs.global.js | 35 + .../packages/core/locales/bs.global.min.js | 6 + .../packages/core/locales/ca.global.js | 33 + .../packages/core/locales/ca.global.min.js | 6 + .../packages/core/locales/cs.global.js | 35 + .../packages/core/locales/cs.global.min.js | 6 + .../packages/core/locales/cy.global.js | 33 + .../packages/core/locales/cy.global.min.js | 6 + .../packages/core/locales/da.global.js | 33 + .../packages/core/locales/da.global.min.js | 6 + .../packages/core/locales/de-at.global.js | 69 + .../packages/core/locales/de-at.global.min.js | 6 + .../packages/core/locales/de.global.js | 69 + .../packages/core/locales/de.global.min.js | 6 + .../packages/core/locales/el.global.js | 33 + .../packages/core/locales/el.global.min.js | 6 + .../packages/core/locales/en-au.global.js | 29 + .../packages/core/locales/en-au.global.min.js | 6 + .../packages/core/locales/en-gb.global.js | 29 + .../packages/core/locales/en-gb.global.min.js | 6 + .../packages/core/locales/en-nz.global.js | 29 + .../packages/core/locales/en-nz.global.min.js | 6 + .../packages/core/locales/eo.global.js | 33 + .../packages/core/locales/eo.global.min.js | 6 + .../packages/core/locales/es-us.global.js | 33 + .../packages/core/locales/es-us.global.min.js | 6 + .../packages/core/locales/es.global.js | 52 + .../packages/core/locales/es.global.min.js | 6 + .../packages/core/locales/et.global.js | 35 + .../packages/core/locales/et.global.min.js | 6 + .../packages/core/locales/eu.global.js | 33 + .../packages/core/locales/eu.global.min.js | 6 + .../packages/core/locales/fa.global.js | 36 + .../packages/core/locales/fa.global.min.js | 6 + .../packages/core/locales/fi.global.js | 33 + .../packages/core/locales/fi.global.min.js | 6 + .../packages/core/locales/fr-ca.global.js | 29 + .../packages/core/locales/fr-ca.global.min.js | 6 + .../packages/core/locales/fr-ch.global.js | 33 + .../packages/core/locales/fr-ch.global.min.js | 6 + .../packages/core/locales/fr.global.js | 34 + .../packages/core/locales/fr.global.min.js | 6 + .../packages/core/locales/gl.global.js | 52 + .../packages/core/locales/gl.global.min.js | 6 + .../packages/core/locales/he.global.js | 30 + .../packages/core/locales/he.global.min.js | 6 + .../packages/core/locales/hi.global.js | 35 + .../packages/core/locales/hi.global.min.js | 6 + .../packages/core/locales/hr.global.js | 35 + .../packages/core/locales/hr.global.min.js | 6 + .../packages/core/locales/hu.global.js | 33 + .../packages/core/locales/hu.global.min.js | 6 + .../packages/core/locales/hy-am.global.js | 35 + .../packages/core/locales/hy-am.global.min.js | 6 + .../packages/core/locales/id.global.js | 33 + .../packages/core/locales/id.global.min.js | 6 + .../packages/core/locales/is.global.js | 33 + .../packages/core/locales/is.global.min.js | 6 + .../packages/core/locales/it.global.js | 35 + .../packages/core/locales/it.global.min.js | 6 + .../packages/core/locales/ja.global.js | 31 + .../packages/core/locales/ja.global.min.js | 6 + .../packages/core/locales/ka.global.js | 35 + .../packages/core/locales/ka.global.min.js | 6 + .../packages/core/locales/kk.global.js | 35 + .../packages/core/locales/kk.global.min.js | 6 + .../packages/core/locales/km.global.js | 33 + .../packages/core/locales/km.global.min.js | 6 + .../packages/core/locales/ko.global.js | 29 + .../packages/core/locales/ko.global.min.js | 6 + .../packages/core/locales/ku.global.js | 34 + .../packages/core/locales/ku.global.min.js | 6 + .../packages/core/locales/lb.global.js | 33 + .../packages/core/locales/lb.global.min.js | 6 + .../packages/core/locales/lt.global.js | 33 + .../packages/core/locales/lt.global.min.js | 6 + .../packages/core/locales/lv.global.js | 35 + .../packages/core/locales/lv.global.min.js | 6 + .../packages/core/locales/mk.global.js | 31 + .../packages/core/locales/mk.global.min.js | 6 + .../packages/core/locales/ms.global.js | 35 + .../packages/core/locales/ms.global.min.js | 6 + .../packages/core/locales/nb.global.js | 44 + .../packages/core/locales/nb.global.min.js | 6 + .../packages/core/locales/ne.global.js | 33 + .../packages/core/locales/ne.global.min.js | 6 + .../packages/core/locales/nl.global.js | 32 + .../packages/core/locales/nl.global.min.js | 6 + .../packages/core/locales/nn.global.js | 33 + .../packages/core/locales/nn.global.min.js | 6 + .../packages/core/locales/pl.global.js | 33 + .../packages/core/locales/pl.global.min.js | 6 + .../packages/core/locales/pt-br.global.js | 52 + .../packages/core/locales/pt-br.global.min.js | 6 + .../packages/core/locales/pt.global.js | 33 + .../packages/core/locales/pt.global.min.js | 6 + .../packages/core/locales/ro.global.js | 35 + .../packages/core/locales/ro.global.min.js | 6 + .../packages/core/locales/ru.global.js | 35 + .../packages/core/locales/ru.global.min.js | 6 + .../packages/core/locales/si-lk.global.js | 33 + .../packages/core/locales/si-lk.global.min.js | 6 + .../packages/core/locales/sk.global.js | 35 + .../packages/core/locales/sk.global.min.js | 6 + .../packages/core/locales/sl.global.js | 33 + .../packages/core/locales/sl.global.min.js | 6 + .../packages/core/locales/sm.global.js | 29 + .../packages/core/locales/sm.global.min.js | 6 + .../packages/core/locales/sq.global.js | 35 + .../packages/core/locales/sq.global.min.js | 6 + .../packages/core/locales/sr-cyrl.global.js | 35 + .../packages/core/locales/sr-cyrl.global.min.js | 6 + .../packages/core/locales/sr.global.js | 35 + .../packages/core/locales/sr.global.min.js | 6 + .../packages/core/locales/sv.global.js | 53 + .../packages/core/locales/sv.global.min.js | 6 + .../packages/core/locales/ta-in.global.js | 35 + .../packages/core/locales/ta-in.global.min.js | 6 + .../packages/core/locales/th.global.js | 35 + .../packages/core/locales/th.global.min.js | 6 + .../packages/core/locales/tr.global.js | 33 + .../packages/core/locales/tr.global.min.js | 6 + .../packages/core/locales/ug.global.js | 26 + .../packages/core/locales/ug.global.min.js | 6 + .../packages/core/locales/uk.global.js | 35 + .../packages/core/locales/uk.global.min.js | 6 + .../packages/core/locales/uz-cy.global.js | 34 + .../packages/core/locales/uz-cy.global.min.js | 6 + .../packages/core/locales/uz.global.js | 34 + .../packages/core/locales/uz.global.min.js | 6 + .../packages/core/locales/vi.global.js | 35 + .../packages/core/locales/vi.global.min.js | 6 + .../packages/core/locales/zh-cn.global.js | 36 + .../packages/core/locales/zh-cn.global.min.js | 6 + .../packages/core/locales/zh-tw.global.js | 29 + .../packages/core/locales/zh-tw.global.min.js | 6 + .../fullcalendar/packages/daygrid/index.global.js | 1040 ++ .../packages/daygrid/index.global.min.js | 6 + .../packages/google-calendar/index.global.js | 150 + .../packages/google-calendar/index.global.min.js | 6 + .../packages/icalendar/index.global.js | 225 + .../packages/icalendar/index.global.min.js | 6 + .../packages/interaction/index.global.js | 2141 +++ .../packages/interaction/index.global.min.js | 6 + .../js/fullcalendar/packages/list/index.global.js | 332 + .../fullcalendar/packages/list/index.global.min.js | 6 + .../fullcalendar/packages/luxon1/index.global.js | 128 + .../packages/luxon1/index.global.min.js | 6 + .../fullcalendar/packages/luxon2/index.global.js | 131 + .../packages/luxon2/index.global.min.js | 6 + .../fullcalendar/packages/luxon3/index.global.js | 131 + .../packages/luxon3/index.global.min.js | 6 + .../packages/moment-timezone/index.global.js | 35 + .../packages/moment-timezone/index.global.min.js | 6 + .../fullcalendar/packages/moment/index.global.js | 113 + .../packages/moment/index.global.min.js | 6 + .../packages/multimonth/index.global.js | 252 + .../packages/multimonth/index.global.min.js | 6 + .../js/fullcalendar/packages/rrule/index.global.js | 169 + .../packages/rrule/index.global.min.js | 6 + .../fullcalendar/packages/timegrid/index.global.js | 1198 ++ .../packages/timegrid/index.global.min.js | 6 + .../packages/web-component/index.global.js | 79 + .../packages/web-component/index.global.min.js | 6 + src/controller/ajax_calendar.php | 74 + src/controller/post.php | 1 + src/model/EventDTO.php | 49 + src/model/entities/Event.php | 125 + src/model/entities/Node.php | 2 +- src/view/templates/calendar.php | 20 + src/view/templates/main.php | 16 +- 222 files changed, 38747 insertions(+), 9 deletions(-) create mode 100644 public/css/calendar.css create mode 100644 public/js/calendar.js create mode 100644 public/js/calendar_admin.js create mode 100644 public/js/fullcalendar/LICENSE.md create mode 100644 public/js/fullcalendar/README.md create mode 100644 public/js/fullcalendar/dist/index.global.js create mode 100644 public/js/fullcalendar/dist/index.global.min.js create mode 100644 public/js/fullcalendar/examples/background-events.html create mode 100644 public/js/fullcalendar/examples/daygrid-views.html create mode 100644 public/js/fullcalendar/examples/external-dragging-2cals.html create mode 100644 public/js/fullcalendar/examples/external-dragging-builtin.html create mode 100644 public/js/fullcalendar/examples/full-height.html create mode 100644 public/js/fullcalendar/examples/list-sticky-header.html create mode 100644 public/js/fullcalendar/examples/list-views.html create mode 100644 public/js/fullcalendar/examples/month-view.html create mode 100644 public/js/fullcalendar/examples/multimonth-view.html create mode 100644 public/js/fullcalendar/examples/multiweek-view.html create mode 100644 public/js/fullcalendar/examples/natural-height.html create mode 100644 public/js/fullcalendar/examples/selectable.html create mode 100644 public/js/fullcalendar/examples/timegrid-views-modal.html create mode 100644 public/js/fullcalendar/examples/timegrid-views.html create mode 100644 public/js/fullcalendar/packages/bootstrap4/index.global.js create mode 100644 public/js/fullcalendar/packages/bootstrap4/index.global.min.js create mode 100644 public/js/fullcalendar/packages/bootstrap5/index.global.js create mode 100644 public/js/fullcalendar/packages/bootstrap5/index.global.min.js create mode 100644 public/js/fullcalendar/packages/core/index.global.js create mode 100644 public/js/fullcalendar/packages/core/index.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales-all.global.js create mode 100644 public/js/fullcalendar/packages/core/locales-all.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/af.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/af.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-dz.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-dz.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-kw.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-kw.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-ly.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-ly.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-ma.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-ma.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-sa.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-sa.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-tn.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar-tn.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ar.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/az.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/az.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/bg.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/bg.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/bn.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/bn.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/bs.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/bs.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ca.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ca.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/cs.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/cs.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/cy.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/cy.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/da.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/da.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/de-at.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/de-at.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/de.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/de.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/el.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/el.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-au.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-au.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-gb.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-gb.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-nz.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/en-nz.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/eo.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/eo.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/es-us.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/es-us.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/es.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/es.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/et.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/et.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/eu.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/eu.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/fa.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/fa.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/fi.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/fi.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr-ca.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr-ca.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr-ch.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr-ch.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/fr.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/gl.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/gl.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/he.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/he.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/hi.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/hi.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/hr.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/hr.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/hu.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/hu.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/hy-am.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/hy-am.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/id.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/id.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/is.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/is.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/it.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/it.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ja.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ja.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ka.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ka.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/kk.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/kk.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/km.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/km.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ko.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ko.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ku.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ku.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/lb.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/lb.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/lt.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/lt.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/lv.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/lv.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/mk.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/mk.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ms.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ms.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/nb.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/nb.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ne.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ne.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/nl.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/nl.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/nn.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/nn.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/pl.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/pl.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/pt-br.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/pt-br.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/pt.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/pt.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ro.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ro.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ru.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ru.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/si-lk.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/si-lk.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sk.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sk.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sl.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sl.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sm.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sm.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sq.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sq.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sr-cyrl.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sr-cyrl.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sr.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sr.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/sv.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/sv.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ta-in.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ta-in.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/th.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/th.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/tr.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/tr.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/ug.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/ug.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/uk.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/uk.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/uz-cy.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/uz-cy.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/uz.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/uz.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/vi.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/vi.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/zh-cn.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/zh-cn.global.min.js create mode 100644 public/js/fullcalendar/packages/core/locales/zh-tw.global.js create mode 100644 public/js/fullcalendar/packages/core/locales/zh-tw.global.min.js create mode 100644 public/js/fullcalendar/packages/daygrid/index.global.js create mode 100644 public/js/fullcalendar/packages/daygrid/index.global.min.js create mode 100644 public/js/fullcalendar/packages/google-calendar/index.global.js create mode 100644 public/js/fullcalendar/packages/google-calendar/index.global.min.js create mode 100644 public/js/fullcalendar/packages/icalendar/index.global.js create mode 100644 public/js/fullcalendar/packages/icalendar/index.global.min.js create mode 100644 public/js/fullcalendar/packages/interaction/index.global.js create mode 100644 public/js/fullcalendar/packages/interaction/index.global.min.js create mode 100644 public/js/fullcalendar/packages/list/index.global.js create mode 100644 public/js/fullcalendar/packages/list/index.global.min.js create mode 100644 public/js/fullcalendar/packages/luxon1/index.global.js create mode 100644 public/js/fullcalendar/packages/luxon1/index.global.min.js create mode 100644 public/js/fullcalendar/packages/luxon2/index.global.js create mode 100644 public/js/fullcalendar/packages/luxon2/index.global.min.js create mode 100644 public/js/fullcalendar/packages/luxon3/index.global.js create mode 100644 public/js/fullcalendar/packages/luxon3/index.global.min.js create mode 100644 public/js/fullcalendar/packages/moment-timezone/index.global.js create mode 100644 public/js/fullcalendar/packages/moment-timezone/index.global.min.js create mode 100644 public/js/fullcalendar/packages/moment/index.global.js create mode 100644 public/js/fullcalendar/packages/moment/index.global.min.js create mode 100644 public/js/fullcalendar/packages/multimonth/index.global.js create mode 100644 public/js/fullcalendar/packages/multimonth/index.global.min.js create mode 100644 public/js/fullcalendar/packages/rrule/index.global.js create mode 100644 public/js/fullcalendar/packages/rrule/index.global.min.js create mode 100644 public/js/fullcalendar/packages/timegrid/index.global.js create mode 100644 public/js/fullcalendar/packages/timegrid/index.global.min.js create mode 100644 public/js/fullcalendar/packages/web-component/index.global.js create mode 100644 public/js/fullcalendar/packages/web-component/index.global.min.js create mode 100644 src/controller/ajax_calendar.php create mode 100644 src/model/EventDTO.php create mode 100644 src/model/entities/Event.php diff --git a/public/css/calendar.css b/public/css/calendar.css new file mode 100644 index 0000000..87ce75f --- /dev/null +++ b/public/css/calendar.css @@ -0,0 +1,51 @@ +.event{ + border: 2px double; + border-radius: 5px; + width: max-content; +} +#calendar_zone{ + display: flex; + gap: 15px; + padding: 15px; + /*max-width: 1000px;*/ +} +#calendar{ + width: -moz-available; +} +.event_title_box{ + display: flex; + align-items: center; + justify-content: space-between; +} +.event_close_button{ + height: fit-content; +} +.fc-toolbar-title{ + font-size: x-large !important; +} +.fc-button{ + padding: 0.2em 0.4em !important; +} +td .fc-timegrid-axis{ + font-size: small; + text-align: center; +} +.fc-day-other{ + background-color: #f0f0f0; +} +.fc-daygrid-day-top{ + justify-content: center; +} +.fc-day-today .fc-daygrid-day-number{ /* vue mois */ + color: white; + background-color: #00679e; + border-radius: 5px; + height: 27px; + aspect-ratio: 1 / 1; + text-align: center; +} +.fc-day-today .fc-col-header-cell-cushion{ /* vue semaine */ + color: white; + background-color: #00679e; + border-radius: 5px; +} diff --git a/public/js/calendar.js b/public/js/calendar.js new file mode 100644 index 0000000..2193272 --- /dev/null +++ b/public/js/calendar.js @@ -0,0 +1,110 @@ +// js/calendar.js + +document.addEventListener('DOMContentLoaded', function(){ + const calendarEl = document.getElementById('calendar'); + let selected_start_string = null; + + const calendar = new FullCalendar.Calendar(calendarEl,{ + editable: true, + locale: 'fr', + //timeZone: 'local', // à modifier pour être à l'heure d'un autre pays + initialView: 'dayGridMonth', + headerToolbar:{ + left: 'prev,next today', + center: 'title', + right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek' + //right: 'dayGridMonth,timeGridWeek' + }, + slotMinWidth: 70, + defaultAllDay: false, + + // numéros de semaine + //weekNumbers: true, + //weekText: 's', + + // vue mois + contentHeight: 600, // après initialisation: calendar.setOption('contentHeight', 650); + //aspectRatio: 1.5, // après initialisation: calendar.setOption('aspectRatio', 1.8); + // pour recalculer la taille au redimensionnement du parent, exécuter: calendar.updateSize() + stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll + fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois + selectable: true, // sélection de jours multiples + navLinks: true, // numéros de jour et de semaines clicables + + // vue semaine + slotEventOverlap: true, // superposition (limitée) de deux évènements simultanés + allDayContent: 'Journée', // texte dans la case "toute la journée" + nowIndicator: true, // barre rouge pour maintenant + + // params en plus: https://fullcalendar.io/docs/events-json-feed + events: 'index.php?action=get_events', // fichier PHP qui retourne les événements + + select: function(info){ + selected_start_string = info.startStr; // variable "globale" + hideModal(); + }, + //unselect: function(event, view){}, + + eventClick: function(info){ + const aside = document.querySelector('aside'); + const checked = info.event.allDay ? 'checked' : ''; + + // change des objets Date en chaînes compatibles avec les input + function formatDate(date){ + return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, '0') + '-' + date.getDate().toString().padStart(2, '0') + + (info.event.allDay ? '' : 'T' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0')); + } + function minusOneDay(date){ + date.setDate(date.getDate() - 1); // jour de fin modifié pour ne pas faire bizarre pour l'utilisateur + return date; + } + + const start = formatDate(info.event.start); + const start_date = start.split('T')[0]; + const start_hour = (info.event.allDay ? '' : '
à ' + start.split('T')[1]).replace(":", "h"); + const formated_start = 'le ' + start_date.split('-')[2] + '/' + start_date.split('-')[1] + '/' + start_date.split('-')[0] + start_hour; + const end = formatDate(info.event.allDay ? minusOneDay(info.event.end) : info.event.end, info.event.allDay); + const end_date = end.split('T')[0]; + const end_hour = (info.event.allDay ? '' : '
à ' + end.split('T')[1]).replace(":", "h"); + const formated_end = 'le ' + end_date.split('-')[2] + '/' + end_date.split('-')[1] + '/' + end_date.split('-')[0] + end_hour; + + const aside_content = `
+

` + info.event.title + `

+

` + info.event.extendedProps.description + `

+

Journée entière:
` + (checked ? 'oui' : 'non') + `

+

Début:
` + formated_start + `

+

Fin:
` + formated_end + `

+
`; + + aside.innerHTML = aside_content; + calendar.updateSize(); + }, + viewDidMount: function(info){ // déclenché lorsque qu'une nouvelle vue est chargée (mois, semaine...) + if(selected_start_string){ + calendar.gotoDate(new Date(selected_start_string)); + } + }, + //datesSet: function(info){}, // déclenché lorsque des dates affichées sont chargées (= comme viewDidMount + changement de date) + }); + + function hideModal(){ + const aside = document.querySelector('aside'); + aside.innerHTML = ''; + calendar.updateSize(); + } + + document.addEventListener('keydown', function(event){ + if(event.key === 'Escape') { + hideModal(); + } + }); + + // technique de la délégation d'événements pour utiliser un bouton ajouté dynamiquement + document.addEventListener('click', function(event){ + if(event.target.classList.contains('event_close_button')){ + hideModal(); + } + }); + + calendar.render(); +}); \ No newline at end of file diff --git a/public/js/calendar_admin.js b/public/js/calendar_admin.js new file mode 100644 index 0000000..a99b069 --- /dev/null +++ b/public/js/calendar_admin.js @@ -0,0 +1,375 @@ +// js/calendar_admin.js + +document.addEventListener('DOMContentLoaded', function(){ + const calendarEl = document.getElementById('calendar'); + let selected_start_string = null; + let event_selected = false; // pour event.remove() + + const calendar = new FullCalendar.Calendar(calendarEl,{ + editable: true, + locale: 'fr', + //timeZone: 'local', // à modifier pour être à l'heure d'un autre pays + initialView: 'dayGridMonth', + headerToolbar:{ + left: 'prev,next today', + center: 'title', + right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek' + //right: 'dayGridMonth,timeGridWeek' + }, + slotMinWidth: 70, + defaultAllDay: false, + + // numéros de semaine + //weekNumbers: true, + //weekText: 's', + + // vue mois + contentHeight: 600, // après initialisation: calendar.setOption('contentHeight', 650); + //aspectRatio: 1.5, // après initialisation: calendar.setOption('aspectRatio', 1.8); + // pour recalculer la taille au redimensionnement du parent, exécuter: calendar.updateSize() + stickyHeaderDates: true, // garder les en-tête de colonnes lors du scroll + fixedWeekCount: false, // avec false, affiche 4, 5 ou 6 semaines selon le mois + selectable: true, // sélection de jours multiples + navLinks: true, // numéros de jour et de semaines clicables + + // vue semaine + slotEventOverlap: true, // superposition (limitée) de deux évènements simultanés + allDayContent: 'Journée', // texte dans la case "toute la journée" + nowIndicator: true, // barre rouge pour maintenant + + // params en plus: https://fullcalendar.io/docs/events-json-feed + events: 'index.php?action=get_events', // fichier PHP qui retourne les événements + + select: function(info){ + selected_start_string = info.startStr; // variable "globale" + event_selected = false; + const aside = document.querySelector('aside'); + let checked = ''; + let input = 'datetime-local'; + + // on veut des chaines de la forme 2025-05-20T07:05 + // il faut retirer les secondes et le fuseau horaire du format ISO, c'est chiant + // on enverra par contre une chaine ISO au serveur pour avoir un enregistrement correct + + let start_value; + let end_value; + const end = new Date(info.endStr); + + if(calendar.view.type == 'dayGridMonth'){ + start_value = info.startStr + 'T10:00'; + end.setDate(end.getDate() - 1); // jour de fin modifié pour ne pas faire bizarre pour l'utilisateur + end.setHours(11); + end_value = end.toISOString().split('T')[0] + 'T11:00'; + } + else if(calendar.view.type == 'timeGridWeek' || calendar.view.type == 'timeGridDay'){ + const start_array = info.startStr.split("T"); + const end_array = info.endStr.split("T"); + + // clic sur la ligne "Journée", = 'dayGridMonth' + if(start_array.length == 1){ + checked = 'checked'; + input = 'date'; + start_value = info.startStr; + end.setDate(end.getDate() - 1); + end_value = end.toISOString().split('T')[0]; + } + else if(start_array.length == 2){ + start_value = start_array[0] + "T" + start_array[1].substr(0,5); // format 2025-06-12T10:00 + end_value = end_array[0] + "T" + end_array[1].substr(0,5); + } + } + + const aside_content = `
+
+

Nouvel évènement

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
`; + aside.innerHTML = aside_content; + calendar.updateSize(); + }, + //unselect: function(event, view){}, + eventClick: function(info){ + event_selected = true; // variable "globale" + const aside = document.querySelector('aside'); + const checked = info.event.allDay ? 'checked' : ''; + const input = info.event.allDay ? 'date' : 'datetime-local'; + + // change des objets Date en chaînes compatibles avec les input + function formatDate(date){ + return date.getFullYear() + '-' + (date.getMonth() + 1).toString().padStart(2, '0') + '-' + date.getDate().toString().padStart(2, '0') + + (info.event.allDay ? '' : 'T' + date.getHours().toString().padStart(2, '0') + ':' + date.getMinutes().toString().padStart(2, '0')); + } + function minusOneDay(date){ + date.setDate(date.getDate() - 1); // jour de fin modifié pour ne pas faire bizarre pour l'utilisateur + return date; + } + + const formated_start = formatDate(info.event.start); + const formated_end = formatDate(info.event.allDay ? minusOneDay(info.event.end) : info.event.end, info.event.allDay); + + const aside_content = `
+
+

Modifier un évènement

+
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + + +
`; + aside.innerHTML = aside_content; + calendar.updateSize(); + }, + viewDidMount: function(info){ // déclenché lorsque qu'une nouvelle vue est chargée (mois, semaine...) + if(selected_start_string){ + calendar.gotoDate(new Date(selected_start_string)); + } + }, + //datesSet: function(info){}, // déclenché lorsque des dates affichées sont chargées (= comme viewDidMount + changement de date) + }); + + function hideModal(){ + const aside = document.querySelector('aside'); + event_selected = false; + aside.innerHTML = ''; + calendar.updateSize(); + } + + function submitEvent(new_event){ + const event_title = document.getElementById('event_title').value; + const event_description = document.getElementById('event_description').value; + const event_all_day = document.getElementById('event_all_day').checked; + let event_start = document.getElementById('event_start').value; + let event_end = document.getElementById('event_end').value; + const event_color = document.getElementById('event_color').value; // #3788d8 par défaut + const event_id = new_event ? '' : document.getElementById('event_id').value; + + if(event_title.length !== 0 && event_start.length !== 0 && event_end.length !== 0 && event_color.length !== 0 + && (new_event || event_id.length !== 0)) + { + if(event_all_day){ + // on remet le jour de fin exclu + const tmp_object = new Date(event_end); + tmp_object.setDate(tmp_object.getDate() + 1); + event_end = tmp_object.toISOString().split('T')[0]; + } + else{ + event_start = new Date(event_start).toISOString(); + event_end = new Date(event_end).toISOString(); + } + console.log(event_end); + + if(event_start > event_end || (!event_all_day && event_start == event_end)){ + return; + } + + // création + if(new_event){ + const event = { + title: event_title, + description: event_description, + allDay: event_all_day, + start: event_start, + end: event_end, + color: event_color + }; + + fetch('index.php?action=new_event', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(event), + }) + .then(response => response.json()) + .then(data => { + if(data.success){ + event.id = data.id; + calendar.addEvent(event); + hideModal(); + } + }) + .catch((error) => { + console.error('Error:', error); + }); + + } + // modification + else{ + const event = calendar.getEventById(event_id); + + if(event){ + const event_copy = { + id: parseInt(event.id), + description: event_description, + title: event_title, + allDay: event_all_day, + start: event_start, + end: event_end, + color: event_color + }; + + fetch('index.php?action=update_event', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(event_copy), + }) + .then(response => response.json()) + .then(data => { + if(data.success){ + event.setProp('title', event_title); + event.setExtendedProp('description', event_description); + event.setAllDay(event_all_day); + event.setStart(event_start); + event.setEnd(event_end); + event.setProp('color', event_color); + hideModal(); + } + }) + .catch((error) => { + console.error('Error:', error); + }); + } + else{ + console.log("Événement non trouvé !"); + } + } + } + else{ + // notif input vide + console.log('erreur: input vide'); + } + } + + function checkAllDay(){ + const event_start_input = document.getElementById('event_start'); + const event_end_input = document.getElementById('event_end'); + + const start = event_start_input.value; + const end = event_end_input.value; + + if(document.getElementById('event_all_day').checked){ + event_start_input.type = 'date'; + event_end_input.type = 'date'; + + event_start_input.value = start.split('T')[0]; + event_end_input.value = end.split('T')[0]; + } + else{ + event_start_input.type = 'datetime-local'; + event_end_input.type = 'datetime-local'; + + event_start_input.value = start + 'T10:00'; + event_end_input.value = end + 'T11:00'; + } + } + function removeEvent(){ + if(!confirm("Voulez-vous vraiment supprimer cet évènement du calendrier?")){ + return; + } + const event_id = document.getElementById('event_id').value; + const event = calendar.getEventById(event_id); + + fetch('index.php?action=remove_event', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({'id': event_id}), + }) + .then(response => response.json()) + .then(data => { + if(data.success){ + event.remove(); + hideModal(); + } + }) + .catch((error) => { + console.error('Error:', error); + }); + event_selected = false; + } + + // touches de clavier + document.addEventListener('keydown', function(event){ + if(event.key === 'Escape'){ + hideModal(); + } + else if(event.key === 'Delete' && event_selected === true){ + removeEvent(); + } + }); + + // boutons dans la "modale" + // technique de la délégation d'événements pour utiliser un bouton ajouté dynamiquement + document.addEventListener('click', function(event){ + if(event.target.classList.contains('event_close_button')){ + hideModal(); + } + else if(event.target.classList.contains('event_all_day')){ + checkAllDay(); + } + else if(event.target.classList.contains('submit_new_event')){ + submitEvent(true); + } + else if(event.target.classList.contains('submit_update_event')){ + submitEvent(false); + } + else if(event.target.classList.contains('delete_event')){ + removeEvent(); + } + }); + + calendar.render(); +}); \ No newline at end of file diff --git a/public/js/fullcalendar/LICENSE.md b/public/js/fullcalendar/LICENSE.md new file mode 100644 index 0000000..18ac667 --- /dev/null +++ b/public/js/fullcalendar/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2021 Adam Shaw + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/js/fullcalendar/README.md b/public/js/fullcalendar/README.md new file mode 100644 index 0000000..379e2c3 --- /dev/null +++ b/public/js/fullcalendar/README.md @@ -0,0 +1,73 @@ +# FullCalendar + +Full-sized drag & drop calendar in JavaScript + +- [Project Website](https://fullcalendar.io/) +- [Documentation](https://fullcalendar.io/docs) +- [Changelog](CHANGELOG.md) +- [Support](https://fullcalendar.io/support) +- [License](LICENSE.md) +- [Roadmap](https://fullcalendar.io/roadmap) + +Connectors: + +- [React](https://github.com/fullcalendar/fullcalendar-react) +- [Angular](https://github.com/fullcalendar/fullcalendar-angular) +- [Vue 3](https://github.com/fullcalendar/fullcalendar-vue) | + [2](https://github.com/fullcalendar/fullcalendar-vue2) + +## Bundle + +The [FullCalendar Standard Bundle](bundle) is easier to install than individual plugins, though filesize will be larger. It works well with a CDN. + +## Installation + +Install the FullCalendar core package and any plugins you plan to use: + +```sh +npm install @fullcalendar/core @fullcalendar/interaction @fullcalendar/daygrid +``` + +## Usage + +Instantiate a Calendar with plugins and options: + +```js +import { Calendar } from '@fullcalendar/core' +import interactionPlugin from '@fullcalendar/interaction' +import dayGridPlugin from '@fullcalendar/daygrid' + +const calendarEl = document.getElementById('calendar') +const calendar = new Calendar(calendarEl, { + plugins: [ + interactionPlugin, + dayGridPlugin + ], + initialView: 'timeGridWeek', + editable: true, + events: [ + { title: 'Meeting', start: new Date() } + ] +}) + +calendar.render() +``` + +## Development + +You must install this repo with [PNPM](https://pnpm.io/): + +``` +pnpm install +``` + +Available scripts (via `pnpm run + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/daygrid-views.html b/public/js/fullcalendar/examples/daygrid-views.html new file mode 100644 index 0000000..9dafe43 --- /dev/null +++ b/public/js/fullcalendar/examples/daygrid-views.html @@ -0,0 +1,104 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/external-dragging-2cals.html b/public/js/fullcalendar/examples/external-dragging-2cals.html new file mode 100644 index 0000000..066685d --- /dev/null +++ b/public/js/fullcalendar/examples/external-dragging-2cals.html @@ -0,0 +1,69 @@ + + + + + + + + + + +
+
+ + + diff --git a/public/js/fullcalendar/examples/external-dragging-builtin.html b/public/js/fullcalendar/examples/external-dragging-builtin.html new file mode 100644 index 0000000..78fcd89 --- /dev/null +++ b/public/js/fullcalendar/examples/external-dragging-builtin.html @@ -0,0 +1,149 @@ + + + + + + + + + +
+ +
+

Draggable Events

+ +
+
+
My Event 1
+
+
+
My Event 2
+
+
+
My Event 3
+
+
+
My Event 4
+
+
+
My Event 5
+
+
+ +

+ + +

+
+ +
+
+
+ +
+ + diff --git a/public/js/fullcalendar/examples/full-height.html b/public/js/fullcalendar/examples/full-height.html new file mode 100644 index 0000000..18b55f8 --- /dev/null +++ b/public/js/fullcalendar/examples/full-height.html @@ -0,0 +1,125 @@ + + + + + + + + + + +
+
+
+ + + diff --git a/public/js/fullcalendar/examples/list-sticky-header.html b/public/js/fullcalendar/examples/list-sticky-header.html new file mode 100644 index 0000000..487af31 --- /dev/null +++ b/public/js/fullcalendar/examples/list-sticky-header.html @@ -0,0 +1,76 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/list-views.html b/public/js/fullcalendar/examples/list-views.html new file mode 100644 index 0000000..cb219d0 --- /dev/null +++ b/public/js/fullcalendar/examples/list-views.html @@ -0,0 +1,114 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/month-view.html b/public/js/fullcalendar/examples/month-view.html new file mode 100644 index 0000000..dbd8861 --- /dev/null +++ b/public/js/fullcalendar/examples/month-view.html @@ -0,0 +1,100 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/multimonth-view.html b/public/js/fullcalendar/examples/multimonth-view.html new file mode 100644 index 0000000..feb9d23 --- /dev/null +++ b/public/js/fullcalendar/examples/multimonth-view.html @@ -0,0 +1,110 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/multiweek-view.html b/public/js/fullcalendar/examples/multiweek-view.html new file mode 100644 index 0000000..5a175fb --- /dev/null +++ b/public/js/fullcalendar/examples/multiweek-view.html @@ -0,0 +1,107 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/natural-height.html b/public/js/fullcalendar/examples/natural-height.html new file mode 100644 index 0000000..b62c41d --- /dev/null +++ b/public/js/fullcalendar/examples/natural-height.html @@ -0,0 +1,108 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/selectable.html b/public/js/fullcalendar/examples/selectable.html new file mode 100644 index 0000000..785e90e --- /dev/null +++ b/public/js/fullcalendar/examples/selectable.html @@ -0,0 +1,123 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/examples/timegrid-views-modal.html b/public/js/fullcalendar/examples/timegrid-views-modal.html new file mode 100644 index 0000000..3b4a0fc --- /dev/null +++ b/public/js/fullcalendar/examples/timegrid-views-modal.html @@ -0,0 +1,180 @@ + + + + + + + + + + + + +
+ + + + + diff --git a/public/js/fullcalendar/examples/timegrid-views.html b/public/js/fullcalendar/examples/timegrid-views.html new file mode 100644 index 0000000..9cd2527 --- /dev/null +++ b/public/js/fullcalendar/examples/timegrid-views.html @@ -0,0 +1,108 @@ + + + + + + + + + + +
+ + + diff --git a/public/js/fullcalendar/packages/bootstrap4/index.global.js b/public/js/fullcalendar/packages/bootstrap4/index.global.js new file mode 100644 index 0000000..a699c90 --- /dev/null +++ b/public/js/fullcalendar/packages/bootstrap4/index.global.js @@ -0,0 +1,64 @@ +/*! +FullCalendar Bootstrap 4 Plugin v6.1.17 +Docs & License: https://fullcalendar.io/docs/bootstrap4 +(c) 2024 Adam Shaw +*/ +FullCalendar.Bootstrap = (function (exports, core, internal$1) { + 'use strict'; + + class BootstrapTheme extends internal$1.Theme { + } + BootstrapTheme.prototype.classes = { + root: 'fc-theme-bootstrap', + table: 'table-bordered', + tableCellShaded: 'table-active', + buttonGroup: 'btn-group', + button: 'btn btn-primary', + buttonActive: 'active', + popover: 'popover', + popoverHeader: 'popover-header', + popoverContent: 'popover-body', + }; + BootstrapTheme.prototype.baseIconClass = 'fa'; + BootstrapTheme.prototype.iconClasses = { + close: 'fa-times', + prev: 'fa-chevron-left', + next: 'fa-chevron-right', + prevYear: 'fa-angle-double-left', + nextYear: 'fa-angle-double-right', + }; + BootstrapTheme.prototype.rtlIconClasses = { + prev: 'fa-chevron-right', + next: 'fa-chevron-left', + prevYear: 'fa-angle-double-right', + nextYear: 'fa-angle-double-left', + }; + BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin + BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome'; + BootstrapTheme.prototype.iconOverridePrefix = 'fa-'; + + var css_248z = ".fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap .fc-more-link:hover{text-decoration:none}"; + internal$1.injectStyles(css_248z); + + var plugin = core.createPlugin({ + name: '@fullcalendar/bootstrap', + themeClasses: { + bootstrap: BootstrapTheme, + }, + }); + + var internal = { + __proto__: null, + BootstrapTheme: BootstrapTheme + }; + + core.globalPlugins.push(plugin); + + exports.Internal = internal; + exports["default"] = plugin; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}, FullCalendar, FullCalendar.Internal); diff --git a/public/js/fullcalendar/packages/bootstrap4/index.global.min.js b/public/js/fullcalendar/packages/bootstrap4/index.global.min.js new file mode 100644 index 0000000..80100d7 --- /dev/null +++ b/public/js/fullcalendar/packages/bootstrap4/index.global.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Bootstrap 4 Plugin v6.1.17 +Docs & License: https://fullcalendar.io/docs/bootstrap4 +(c) 2024 Adam Shaw +*/ +FullCalendar.Bootstrap=function(e,t,o){"use strict";class r extends o.Theme{}r.prototype.classes={root:"fc-theme-bootstrap",table:"table-bordered",tableCellShaded:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},r.prototype.baseIconClass="fa",r.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},r.prototype.rtlIconClasses={prev:"fa-chevron-right",next:"fa-chevron-left",prevYear:"fa-angle-double-right",nextYear:"fa-angle-double-left"},r.prototype.iconOverrideOption="bootstrapFontAwesome",r.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",r.prototype.iconOverridePrefix="fa-";o.injectStyles(".fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap .fc-more-link:hover{text-decoration:none}");var a=t.createPlugin({name:"@fullcalendar/bootstrap",themeClasses:{bootstrap:r}}),n={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=n,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/public/js/fullcalendar/packages/bootstrap5/index.global.js b/public/js/fullcalendar/packages/bootstrap5/index.global.js new file mode 100644 index 0000000..0368f6a --- /dev/null +++ b/public/js/fullcalendar/packages/bootstrap5/index.global.js @@ -0,0 +1,64 @@ +/*! +FullCalendar Bootstrap 5 Plugin v6.1.17 +Docs & License: https://fullcalendar.io/docs/bootstrap5 +(c) 2024 Adam Shaw +*/ +FullCalendar.Bootstrap5 = (function (exports, core, internal$1) { + 'use strict'; + + class BootstrapTheme extends internal$1.Theme { + } + BootstrapTheme.prototype.classes = { + root: 'fc-theme-bootstrap5', + tableCellShaded: 'fc-theme-bootstrap5-shaded', + buttonGroup: 'btn-group', + button: 'btn btn-primary', + buttonActive: 'active', + popover: 'popover', + popoverHeader: 'popover-header', + popoverContent: 'popover-body', + }; + BootstrapTheme.prototype.baseIconClass = 'bi'; + BootstrapTheme.prototype.iconClasses = { + close: 'bi-x-lg', + prev: 'bi-chevron-left', + next: 'bi-chevron-right', + prevYear: 'bi-chevron-double-left', + nextYear: 'bi-chevron-double-right', + }; + BootstrapTheme.prototype.rtlIconClasses = { + prev: 'bi-chevron-right', + next: 'bi-chevron-left', + prevYear: 'bi-chevron-double-right', + nextYear: 'bi-chevron-double-left', + }; + // wtf + BootstrapTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly + BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + BootstrapTheme.prototype.iconOverridePrefix = 'bi-'; + + var css_248z = ".fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.fc-theme-bootstrap5 .fc-list,.fc-theme-bootstrap5 .fc-scrollgrid,.fc-theme-bootstrap5 td,.fc-theme-bootstrap5 th{border:1px solid var(--bs-gray-400)}.fc-theme-bootstrap5 .fc-scrollgrid{border-bottom-width:0;border-right-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)}"; + internal$1.injectStyles(css_248z); + + var plugin = core.createPlugin({ + name: '@fullcalendar/bootstrap5', + themeClasses: { + bootstrap5: BootstrapTheme, + }, + }); + + var internal = { + __proto__: null, + BootstrapTheme: BootstrapTheme + }; + + core.globalPlugins.push(plugin); + + exports.Internal = internal; + exports["default"] = plugin; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}, FullCalendar, FullCalendar.Internal); diff --git a/public/js/fullcalendar/packages/bootstrap5/index.global.min.js b/public/js/fullcalendar/packages/bootstrap5/index.global.min.js new file mode 100644 index 0000000..d3b54e1 --- /dev/null +++ b/public/js/fullcalendar/packages/bootstrap5/index.global.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Bootstrap 5 Plugin v6.1.17 +Docs & License: https://fullcalendar.io/docs/bootstrap5 +(c) 2024 Adam Shaw +*/ +FullCalendar.Bootstrap5=function(e,t,o){"use strict";class r extends o.Theme{}r.prototype.classes={root:"fc-theme-bootstrap5",tableCellShaded:"fc-theme-bootstrap5-shaded",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},r.prototype.baseIconClass="bi",r.prototype.iconClasses={close:"bi-x-lg",prev:"bi-chevron-left",next:"bi-chevron-right",prevYear:"bi-chevron-double-left",nextYear:"bi-chevron-double-right"},r.prototype.rtlIconClasses={prev:"bi-chevron-right",next:"bi-chevron-left",prevYear:"bi-chevron-double-right",nextYear:"bi-chevron-double-left"},r.prototype.iconOverrideOption="buttonIcons",r.prototype.iconOverrideCustomButtonOption="icon",r.prototype.iconOverridePrefix="bi-";o.injectStyles(".fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.fc-theme-bootstrap5 .fc-list,.fc-theme-bootstrap5 .fc-scrollgrid,.fc-theme-bootstrap5 td,.fc-theme-bootstrap5 th{border:1px solid var(--bs-gray-400)}.fc-theme-bootstrap5 .fc-scrollgrid{border-bottom-width:0;border-right-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)}");var a=t.createPlugin({name:"@fullcalendar/bootstrap5",themeClasses:{bootstrap5:r}}),n={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=n,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file diff --git a/public/js/fullcalendar/packages/core/index.global.js b/public/js/fullcalendar/packages/core/index.global.js new file mode 100644 index 0000000..5c22940 --- /dev/null +++ b/public/js/fullcalendar/packages/core/index.global.js @@ -0,0 +1,9929 @@ +/*! +FullCalendar Core v6.1.17 +Docs & License: https://fullcalendar.io +(c) 2024 Adam Shaw +*/ +var FullCalendar = (function (exports) { + 'use strict'; + + const styleTexts = []; + const styleEls = new Map(); + function injectStyles(styleText) { + styleTexts.push(styleText); + styleEls.forEach((styleEl) => { + appendStylesTo(styleEl, styleText); + }); + } + function ensureElHasStyles(el) { + if (el.isConnected && // sometimes true if SSR system simulates DOM + el.getRootNode // sometimes undefined if SSR system simulates DOM + ) { + registerStylesRoot(el.getRootNode()); + } + } + function registerStylesRoot(rootNode) { + let styleEl = styleEls.get(rootNode); + if (!styleEl || !styleEl.isConnected) { + styleEl = rootNode.querySelector('style[data-fullcalendar]'); + if (!styleEl) { + styleEl = document.createElement('style'); + styleEl.setAttribute('data-fullcalendar', ''); + const nonce = getNonceValue(); + if (nonce) { + styleEl.nonce = nonce; + } + const parentEl = rootNode === document ? document.head : rootNode; + const insertBefore = rootNode === document + ? parentEl.querySelector('script,link[rel=stylesheet],link[as=style],style') + : parentEl.firstChild; + parentEl.insertBefore(styleEl, insertBefore); + } + styleEls.set(rootNode, styleEl); + hydrateStylesRoot(styleEl); + } + } + function hydrateStylesRoot(styleEl) { + for (const styleText of styleTexts) { + appendStylesTo(styleEl, styleText); + } + } + function appendStylesTo(styleEl, styleText) { + const { sheet } = styleEl; + const ruleCnt = sheet.cssRules.length; + styleText.split('}').forEach((styleStr, i) => { + styleStr = styleStr.trim(); + if (styleStr) { + sheet.insertRule(styleStr + '}', ruleCnt + i); + } + }); + } + // nonce + // ------------------------------------------------------------------------------------------------- + let queriedNonceValue; + function getNonceValue() { + if (queriedNonceValue === undefined) { + queriedNonceValue = queryNonceValue(); + } + return queriedNonceValue; + } + /* + TODO: discourage meta tag and instead put nonce attribute on placeholder