aboutsummaryrefslogtreecommitdiffstats
path: root/library/fullcalendar/packages
diff options
context:
space:
mode:
Diffstat (limited to 'library/fullcalendar/packages')
-rw-r--r--library/fullcalendar/packages/bootstrap/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/bootstrap/README.md8
-rw-r--r--library/fullcalendar/packages/bootstrap/main.css36
-rw-r--r--library/fullcalendar/packages/bootstrap/main.d.ts12
-rw-r--r--library/fullcalendar/packages/bootstrap/main.esm.js83
-rw-r--r--library/fullcalendar/packages/bootstrap/main.js91
-rw-r--r--library/fullcalendar/packages/bootstrap/main.min.css1
-rw-r--r--library/fullcalendar/packages/bootstrap/main.min.js6
-rw-r--r--library/fullcalendar/packages/bootstrap/package.json33
-rw-r--r--library/fullcalendar/packages/bootstrap4/index.global.js64
-rw-r--r--library/fullcalendar/packages/bootstrap4/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/bootstrap5/index.global.js64
-rw-r--r--library/fullcalendar/packages/bootstrap5/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/core/README.md8
-rw-r--r--library/fullcalendar/packages/core/index.global.js9646
-rw-r--r--library/fullcalendar/packages/core/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales-all.global.js1794
-rw-r--r--library/fullcalendar/packages/core/locales-all.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales-all.js1405
-rw-r--r--library/fullcalendar/packages/core/locales-all.min.js1
-rw-r--r--library/fullcalendar/packages/core/locales/af.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/af.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/af.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ar-dz.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-dz.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-dz.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-kw.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-kw.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-kw.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ly.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ly.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ly.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ma.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ma.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-ma.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-sa.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-sa.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-sa.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar-tn.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar-tn.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar-tn.js31
-rw-r--r--library/fullcalendar/packages/core/locales/ar.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ar.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ar.js31
-rw-r--r--library/fullcalendar/packages/core/locales/az.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/az.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/az.js32
-rw-r--r--library/fullcalendar/packages/core/locales/bg.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/bg.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/bg.js31
-rw-r--r--library/fullcalendar/packages/core/locales/bn.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/bn.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/bs.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/bs.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/bs.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ca.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ca.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ca.js30
-rw-r--r--library/fullcalendar/packages/core/locales/cs.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/cs.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/cs.js32
-rw-r--r--library/fullcalendar/packages/core/locales/cy.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/cy.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/da.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/da.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/da.js30
-rw-r--r--library/fullcalendar/packages/core/locales/de-at.global.js69
-rw-r--r--library/fullcalendar/packages/core/locales/de-at.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/de.global.js69
-rw-r--r--library/fullcalendar/packages/core/locales/de.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/de.js33
-rw-r--r--library/fullcalendar/packages/core/locales/el.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/el.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/el.js30
-rw-r--r--library/fullcalendar/packages/core/locales/en-au.global.js29
-rw-r--r--library/fullcalendar/packages/core/locales/en-au.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/en-au.js17
-rw-r--r--library/fullcalendar/packages/core/locales/en-gb.global.js29
-rw-r--r--library/fullcalendar/packages/core/locales/en-gb.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/en-gb.js17
-rw-r--r--library/fullcalendar/packages/core/locales/en-nz.global.js29
-rw-r--r--library/fullcalendar/packages/core/locales/en-nz.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/en-nz.js17
-rw-r--r--library/fullcalendar/packages/core/locales/eo.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/eo.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/es-us.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/es-us.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/es-us.js30
-rw-r--r--library/fullcalendar/packages/core/locales/es.global.js51
-rw-r--r--library/fullcalendar/packages/core/locales/es.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/es.js30
-rw-r--r--library/fullcalendar/packages/core/locales/et.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/et.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/et.js32
-rw-r--r--library/fullcalendar/packages/core/locales/eu.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/eu.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/eu.js30
-rw-r--r--library/fullcalendar/packages/core/locales/fa.global.js35
-rw-r--r--library/fullcalendar/packages/core/locales/fa.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/fa.js33
-rw-r--r--library/fullcalendar/packages/core/locales/fi.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/fi.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/fi.js30
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ca.global.js29
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ca.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ca.js27
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ch.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ch.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/fr-ch.js31
-rw-r--r--library/fullcalendar/packages/core/locales/fr.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/fr.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/fr.js31
-rw-r--r--library/fullcalendar/packages/core/locales/gl.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/gl.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/gl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/he.global.js29
-rw-r--r--library/fullcalendar/packages/core/locales/he.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/he.js27
-rw-r--r--library/fullcalendar/packages/core/locales/hi.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/hi.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/hi.js32
-rw-r--r--library/fullcalendar/packages/core/locales/hr.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/hr.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/hr.js32
-rw-r--r--library/fullcalendar/packages/core/locales/hu.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/hu.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/hu.js30
-rw-r--r--library/fullcalendar/packages/core/locales/hy-am.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/hy-am.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/id.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/id.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/id.js30
-rw-r--r--library/fullcalendar/packages/core/locales/is.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/is.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/is.js30
-rw-r--r--library/fullcalendar/packages/core/locales/it.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/it.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/it.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ja.global.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ja.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ja.js28
-rw-r--r--library/fullcalendar/packages/core/locales/ka.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/ka.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ka.js32
-rw-r--r--library/fullcalendar/packages/core/locales/kk.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/kk.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/kk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/km.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/km.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ko.global.js28
-rw-r--r--library/fullcalendar/packages/core/locales/ko.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ko.js26
-rw-r--r--library/fullcalendar/packages/core/locales/ku.global.js33
-rw-r--r--library/fullcalendar/packages/core/locales/ku.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/lb.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/lb.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/lb.js30
-rw-r--r--library/fullcalendar/packages/core/locales/lt.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/lt.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/lt.js30
-rw-r--r--library/fullcalendar/packages/core/locales/lv.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/lv.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/lv.js32
-rw-r--r--library/fullcalendar/packages/core/locales/mk.global.js30
-rw-r--r--library/fullcalendar/packages/core/locales/mk.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/mk.js28
-rw-r--r--library/fullcalendar/packages/core/locales/ms.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/ms.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ms.js32
-rw-r--r--library/fullcalendar/packages/core/locales/nb.global.js43
-rw-r--r--library/fullcalendar/packages/core/locales/nb.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/nb.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ne.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ne.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/nl.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/nl.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/nl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/nn.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/nn.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/nn.js30
-rw-r--r--library/fullcalendar/packages/core/locales/pl.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/pl.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/pl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/pt-br.global.js30
-rw-r--r--library/fullcalendar/packages/core/locales/pt-br.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/pt-br.js28
-rw-r--r--library/fullcalendar/packages/core/locales/pt.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/pt.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/pt.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ro.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/ro.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ro.js32
-rw-r--r--library/fullcalendar/packages/core/locales/ru.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/ru.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ru.js32
-rw-r--r--library/fullcalendar/packages/core/locales/si-lk.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/si-lk.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sk.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/sk.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sl.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sl.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sl.js30
-rw-r--r--library/fullcalendar/packages/core/locales/sm.global.js28
-rw-r--r--library/fullcalendar/packages/core/locales/sm.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sq.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/sq.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sq.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sr-cyrl.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/sr-cyrl.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sr-cyrl.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sr.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/sr.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sr.js32
-rw-r--r--library/fullcalendar/packages/core/locales/sv.global.js52
-rw-r--r--library/fullcalendar/packages/core/locales/sv.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/sv.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ta-in.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/ta-in.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/th.global.js35
-rw-r--r--library/fullcalendar/packages/core/locales/th.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/th.js33
-rw-r--r--library/fullcalendar/packages/core/locales/tr.global.js32
-rw-r--r--library/fullcalendar/packages/core/locales/tr.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/tr.js30
-rw-r--r--library/fullcalendar/packages/core/locales/ug.global.js22
-rw-r--r--library/fullcalendar/packages/core/locales/ug.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/ug.js20
-rw-r--r--library/fullcalendar/packages/core/locales/uk.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/uk.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/uk.js32
-rw-r--r--library/fullcalendar/packages/core/locales/uz.global.js26
-rw-r--r--library/fullcalendar/packages/core/locales/uz.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/uz.js24
-rw-r--r--library/fullcalendar/packages/core/locales/vi.global.js34
-rw-r--r--library/fullcalendar/packages/core/locales/vi.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/vi.js32
-rw-r--r--library/fullcalendar/packages/core/locales/zh-cn.global.js35
-rw-r--r--library/fullcalendar/packages/core/locales/zh-cn.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/zh-cn.js33
-rw-r--r--library/fullcalendar/packages/core/locales/zh-tw.global.js28
-rw-r--r--library/fullcalendar/packages/core/locales/zh-tw.global.min.js6
-rw-r--r--library/fullcalendar/packages/core/locales/zh-tw.js26
-rw-r--r--library/fullcalendar/packages/core/main.css1052
-rw-r--r--library/fullcalendar/packages/core/main.d.ts2736
-rw-r--r--library/fullcalendar/packages/core/main.esm.js8582
-rw-r--r--library/fullcalendar/packages/core/main.js8745
-rw-r--r--library/fullcalendar/packages/core/main.min.css1
-rw-r--r--library/fullcalendar/packages/core/main.min.js6
-rw-r--r--library/fullcalendar/packages/core/package.json30
-rw-r--r--library/fullcalendar/packages/daygrid/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/daygrid/README.md8
-rw-r--r--library/fullcalendar/packages/daygrid/index.global.js909
-rw-r--r--library/fullcalendar/packages/daygrid/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/daygrid/main.css78
-rw-r--r--library/fullcalendar/packages/daygrid/main.d.ts316
-rw-r--r--library/fullcalendar/packages/daygrid/main.esm.js1655
-rw-r--r--library/fullcalendar/packages/daygrid/main.js1669
-rw-r--r--library/fullcalendar/packages/daygrid/main.min.css1
-rw-r--r--library/fullcalendar/packages/daygrid/main.min.js6
-rw-r--r--library/fullcalendar/packages/daygrid/package.json33
-rw-r--r--library/fullcalendar/packages/google-calendar/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/google-calendar/README.md8
-rw-r--r--library/fullcalendar/packages/google-calendar/index.global.js150
-rw-r--r--library/fullcalendar/packages/google-calendar/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/google-calendar/main.d.ts21
-rw-r--r--library/fullcalendar/packages/google-calendar/main.esm.js167
-rw-r--r--library/fullcalendar/packages/google-calendar/main.js175
-rw-r--r--library/fullcalendar/packages/google-calendar/main.min.js6
-rw-r--r--library/fullcalendar/packages/google-calendar/package.json33
-rw-r--r--library/fullcalendar/packages/icalendar/index.global.js225
-rw-r--r--library/fullcalendar/packages/icalendar/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/interaction/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/interaction/README.md8
-rw-r--r--library/fullcalendar/packages/interaction/index.global.js2114
-rw-r--r--library/fullcalendar/packages/interaction/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/interaction/main.d.ts323
-rw-r--r--library/fullcalendar/packages/interaction/main.esm.js2141
-rw-r--r--library/fullcalendar/packages/interaction/main.js2152
-rw-r--r--library/fullcalendar/packages/interaction/main.min.js6
-rw-r--r--library/fullcalendar/packages/interaction/package.json33
-rw-r--r--library/fullcalendar/packages/list/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/list/README.md8
-rw-r--r--library/fullcalendar/packages/list/index.global.js332
-rw-r--r--library/fullcalendar/packages/list/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/list/main.css118
-rw-r--r--library/fullcalendar/packages/list/main.d.ts36
-rw-r--r--library/fullcalendar/packages/list/main.esm.js348
-rw-r--r--library/fullcalendar/packages/list/main.js356
-rw-r--r--library/fullcalendar/packages/list/main.min.css1
-rw-r--r--library/fullcalendar/packages/list/main.min.js6
-rw-r--r--library/fullcalendar/packages/list/package.json33
-rw-r--r--library/fullcalendar/packages/luxon/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/luxon/README.md8
-rw-r--r--library/fullcalendar/packages/luxon/main.d.ts14
-rw-r--r--library/fullcalendar/packages/luxon/main.esm.js162
-rw-r--r--library/fullcalendar/packages/luxon/main.js170
-rw-r--r--library/fullcalendar/packages/luxon/main.min.js6
-rw-r--r--library/fullcalendar/packages/luxon/package.json34
-rw-r--r--library/fullcalendar/packages/luxon1/index.global.js128
-rw-r--r--library/fullcalendar/packages/luxon1/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/luxon2/index.global.js131
-rw-r--r--library/fullcalendar/packages/luxon2/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/moment-timezone/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/moment-timezone/README.md8
-rw-r--r--library/fullcalendar/packages/moment-timezone/index.global.js35
-rw-r--r--library/fullcalendar/packages/moment-timezone/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/moment-timezone/main.d.ts11
-rw-r--r--library/fullcalendar/packages/moment-timezone/main.esm.js58
-rw-r--r--library/fullcalendar/packages/moment-timezone/main.js64
-rw-r--r--library/fullcalendar/packages/moment-timezone/main.min.js6
-rw-r--r--library/fullcalendar/packages/moment-timezone/package.json35
-rw-r--r--library/fullcalendar/packages/moment/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/moment/README.md8
-rw-r--r--library/fullcalendar/packages/moment/index.global.js113
-rw-r--r--library/fullcalendar/packages/moment/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/moment/main.d.ts14
-rw-r--r--library/fullcalendar/packages/moment/main.esm.js102
-rw-r--r--library/fullcalendar/packages/moment/main.js110
-rw-r--r--library/fullcalendar/packages/moment/main.min.js6
-rw-r--r--library/fullcalendar/packages/moment/package.json34
-rw-r--r--library/fullcalendar/packages/rrule/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/rrule/README.md8
-rw-r--r--library/fullcalendar/packages/rrule/index.global.js145
-rw-r--r--library/fullcalendar/packages/rrule/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/rrule/main.d.ts9
-rw-r--r--library/fullcalendar/packages/rrule/main.esm.js121
-rw-r--r--library/fullcalendar/packages/rrule/main.js128
-rw-r--r--library/fullcalendar/packages/rrule/main.min.js6
-rw-r--r--library/fullcalendar/packages/rrule/package.json34
-rw-r--r--library/fullcalendar/packages/timegrid/LICENSE.txt20
-rw-r--r--library/fullcalendar/packages/timegrid/README.md8
-rw-r--r--library/fullcalendar/packages/timegrid/index.global.js1198
-rw-r--r--library/fullcalendar/packages/timegrid/index.global.min.js6
-rw-r--r--library/fullcalendar/packages/timegrid/main.css309
-rw-r--r--library/fullcalendar/packages/timegrid/main.d.ts224
-rw-r--r--library/fullcalendar/packages/timegrid/main.esm.js1391
-rw-r--r--library/fullcalendar/packages/timegrid/main.js1403
-rw-r--r--library/fullcalendar/packages/timegrid/main.min.css1
-rw-r--r--library/fullcalendar/packages/timegrid/main.min.js6
-rw-r--r--library/fullcalendar/packages/timegrid/package.json36
-rw-r--r--library/fullcalendar/packages/web-component/index.global.js70
-rw-r--r--library/fullcalendar/packages/web-component/index.global.min.js6
344 files changed, 20319 insertions, 39330 deletions
diff --git a/library/fullcalendar/packages/bootstrap/LICENSE.txt b/library/fullcalendar/packages/bootstrap/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/bootstrap/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/bootstrap/README.md b/library/fullcalendar/packages/bootstrap/README.md
deleted file mode 100644
index 1da7990c1..000000000
--- a/library/fullcalendar/packages/bootstrap/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Bootstrap Plugin
-
-Bootstrap 4 theming for your calendar
-
-[View the docs »](https://fullcalendar.io/docs/bootstrap-theme)
-
-This package was created from the [FullCalendar monorepo »](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/bootstrap/main.css b/library/fullcalendar/packages/bootstrap/main.css
deleted file mode 100644
index 3dc71f583..000000000
--- a/library/fullcalendar/packages/bootstrap/main.css
+++ /dev/null
@@ -1,36 +0,0 @@
-.fc.fc-bootstrap a {
- text-decoration: none;
-}
-
-.fc.fc-bootstrap a[data-goto]:hover {
- text-decoration: underline;
-}
-
-.fc-bootstrap hr.fc-divider {
- border-color: inherit;
-}
-
-.fc-bootstrap .fc-today.alert {
- border-radius: 0;
-}
-
-.fc-bootstrap a.fc-event:not([href]):not([tabindex]) {
- color: #fff;
-}
-
-.fc-bootstrap .fc-popover.card {
- position: absolute;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap .fc-popover .card-body {
- padding: 0;
-}
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap .fc-time-grid .fc-slats table {
- /* some themes have background color. see through to slats */
- background: none;
-}
diff --git a/library/fullcalendar/packages/bootstrap/main.d.ts b/library/fullcalendar/packages/bootstrap/main.d.ts
deleted file mode 100644
index 4aa91f33d..000000000
--- a/library/fullcalendar/packages/bootstrap/main.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/bootstrap' {
- import { Theme } from '@fullcalendar/core';
- export class BootstrapTheme extends Theme {
- }
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/bootstrap/main.esm.js b/library/fullcalendar/packages/bootstrap/main.esm.js
deleted file mode 100644
index 1a8a2f833..000000000
--- a/library/fullcalendar/packages/bootstrap/main.esm.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { createPlugin, Theme } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var BootstrapTheme = /** @class */ (function (_super) {
- __extends(BootstrapTheme, _super);
- function BootstrapTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return BootstrapTheme;
-}(Theme));
-BootstrapTheme.prototype.classes = {
- widget: 'fc-bootstrap',
- tableGrid: 'table-bordered',
- tableList: 'table',
- tableListHeading: 'table-active',
- buttonGroup: 'btn-group',
- button: 'btn btn-primary',
- buttonActive: 'active',
- today: 'alert alert-info',
- popover: 'card card-primary',
- popoverHeader: 'card-header',
- popoverContent: 'card-body',
- // day grid
- // for left/right border color when border is inset from edges (all-day in timeGrid view)
- // avoid `table` class b/c don't want margins/padding/structure. only border color.
- headerRow: 'table-bordered',
- dayRow: 'table-bordered',
- // list view
- listView: 'card card-primary'
-};
-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.iconOverrideOption = 'bootstrapFontAwesome';
-BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
-BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
-var main = createPlugin({
- themeClasses: {
- bootstrap: BootstrapTheme
- }
-});
-
-export default main;
-export { BootstrapTheme };
diff --git a/library/fullcalendar/packages/bootstrap/main.js b/library/fullcalendar/packages/bootstrap/main.js
deleted file mode 100644
index 455ca78a2..000000000
--- a/library/fullcalendar/packages/bootstrap/main.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarBootstrap = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var BootstrapTheme = /** @class */ (function (_super) {
- __extends(BootstrapTheme, _super);
- function BootstrapTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return BootstrapTheme;
- }(core.Theme));
- BootstrapTheme.prototype.classes = {
- widget: 'fc-bootstrap',
- tableGrid: 'table-bordered',
- tableList: 'table',
- tableListHeading: 'table-active',
- buttonGroup: 'btn-group',
- button: 'btn btn-primary',
- buttonActive: 'active',
- today: 'alert alert-info',
- popover: 'card card-primary',
- popoverHeader: 'card-header',
- popoverContent: 'card-body',
- // day grid
- // for left/right border color when border is inset from edges (all-day in timeGrid view)
- // avoid `table` class b/c don't want margins/padding/structure. only border color.
- headerRow: 'table-bordered',
- dayRow: 'table-bordered',
- // list view
- listView: 'card card-primary'
- };
- 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.iconOverrideOption = 'bootstrapFontAwesome';
- BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
- BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
- var main = core.createPlugin({
- themeClasses: {
- bootstrap: BootstrapTheme
- }
- });
-
- exports.BootstrapTheme = BootstrapTheme;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/bootstrap/main.min.css b/library/fullcalendar/packages/bootstrap/main.min.css
deleted file mode 100644
index e9249b568..000000000
--- a/library/fullcalendar/packages/bootstrap/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc.fc-bootstrap a{text-decoration:none}.fc.fc-bootstrap a[data-goto]:hover{text-decoration:underline}.fc-bootstrap hr.fc-divider{border-color:inherit}.fc-bootstrap .fc-today.alert{border-radius:0}.fc-bootstrap a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap .fc-popover.card{position:absolute}.fc-bootstrap .fc-popover .card-body{padding:0}.fc-bootstrap .fc-time-grid .fc-slats table{background:0 0} \ No newline at end of file
diff --git a/library/fullcalendar/packages/bootstrap/main.min.js b/library/fullcalendar/packages/bootstrap/main.min.js
deleted file mode 100644
index 9510309c6..000000000
--- a/library/fullcalendar/packages/bootstrap/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarBootstrap={},e.FullCalendar)}(this,(function(e,t){"use strict";var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)};var r=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function r(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}(t,e),t}(t.Theme);r.prototype.classes={widget:"fc-bootstrap",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},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.iconOverrideOption="bootstrapFontAwesome",r.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",r.prototype.iconOverridePrefix="fa-";var a=t.createPlugin({themeClasses:{bootstrap:r}});e.BootstrapTheme=r,e.default=a,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/bootstrap/package.json b/library/fullcalendar/packages/bootstrap/package.json
deleted file mode 100644
index cef495a8c..000000000
--- a/library/fullcalendar/packages/bootstrap/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/bootstrap",
- "version": "4.4.2",
- "title": "FullCalendar Bootstrap Plugin",
- "description": "Bootstrap 4 theming for your calendar",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/bootstrap-theme",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/bootstrap4/index.global.js b/library/fullcalendar/packages/bootstrap4/index.global.js
new file mode 100644
index 000000000..90d3aedf8
--- /dev/null
+++ b/library/fullcalendar/packages/bootstrap4/index.global.js
@@ -0,0 +1,64 @@
+/*!
+FullCalendar Bootstrap 4 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/bootstrap4
+(c) 2022 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}";
+ 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/library/fullcalendar/packages/bootstrap4/index.global.min.js b/library/fullcalendar/packages/bootstrap4/index.global.min.js
new file mode 100644
index 000000000..64a7ceade
--- /dev/null
+++ b/library/fullcalendar/packages/bootstrap4/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Bootstrap 4 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/bootstrap4
+(c) 2022 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}");var a=t.createPlugin({name:"@fullcalendar/bootstrap",themeClasses:{bootstrap:r}}),l={__proto__:null,BootstrapTheme:r};return t.globalPlugins.push(a),e.Internal=l,e.default=a,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/bootstrap5/index.global.js b/library/fullcalendar/packages/bootstrap5/index.global.js
new file mode 100644
index 000000000..eee322a49
--- /dev/null
+++ b/library/fullcalendar/packages/bootstrap5/index.global.js
@@ -0,0 +1,64 @@
+/*!
+FullCalendar Bootstrap 5 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/bootstrap5
+(c) 2022 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/library/fullcalendar/packages/bootstrap5/index.global.min.js b/library/fullcalendar/packages/bootstrap5/index.global.min.js
new file mode 100644
index 000000000..8f17785f8
--- /dev/null
+++ b/library/fullcalendar/packages/bootstrap5/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Bootstrap 5 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/bootstrap5
+(c) 2022 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/library/fullcalendar/packages/core/LICENSE.txt b/library/fullcalendar/packages/core/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/core/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/core/README.md b/library/fullcalendar/packages/core/README.md
deleted file mode 100644
index 7ed36f442..000000000
--- a/library/fullcalendar/packages/core/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Core Package
-
-Provides core functionality, including the Calendar class
-
-[View the docs »](https://fullcalendar.io/docs/initialize-es6)
-
-This package was created from the [FullCalendar monorepo »](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/core/index.global.js b/library/fullcalendar/packages/core/index.global.js
new file mode 100644
index 000000000..6f2696bae
--- /dev/null
+++ b/library/fullcalendar/packages/core/index.global.js
@@ -0,0 +1,9646 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+var FullCalendar = (function (exports) {
+ 'use strict';
+
+ function removeElement(el) {
+ if (el.parentNode) {
+ el.parentNode.removeChild(el);
+ }
+ }
+ // Querying
+ // ----------------------------------------------------------------------------------------------------------------
+ function elementClosest(el, selector) {
+ if (el.closest) {
+ return el.closest(selector);
+ // really bad fallback for IE
+ // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
+ }
+ if (!document.documentElement.contains(el)) {
+ return null;
+ }
+ do {
+ if (elementMatches(el, selector)) {
+ return el;
+ }
+ el = (el.parentElement || el.parentNode);
+ } while (el !== null && el.nodeType === 1);
+ return null;
+ }
+ function elementMatches(el, selector) {
+ let method = el.matches || el.matchesSelector || el.msMatchesSelector;
+ return method.call(el, selector);
+ }
+ // accepts multiple subject els
+ // returns a real array. good for methods like forEach
+ // TODO: accept the document
+ function findElements(container, selector) {
+ let containers = container instanceof HTMLElement ? [container] : container;
+ let allMatches = [];
+ for (let i = 0; i < containers.length; i += 1) {
+ let matches = containers[i].querySelectorAll(selector);
+ for (let j = 0; j < matches.length; j += 1) {
+ allMatches.push(matches[j]);
+ }
+ }
+ return allMatches;
+ }
+ // accepts multiple subject els
+ // only queries direct child elements // TODO: rename to findDirectChildren!
+ function findDirectChildren(parent, selector) {
+ let parents = parent instanceof HTMLElement ? [parent] : parent;
+ let allMatches = [];
+ for (let i = 0; i < parents.length; i += 1) {
+ let childNodes = parents[i].children; // only ever elements
+ for (let j = 0; j < childNodes.length; j += 1) {
+ let childNode = childNodes[j];
+ if (!selector || elementMatches(childNode, selector)) {
+ allMatches.push(childNode);
+ }
+ }
+ }
+ return allMatches;
+ }
+ // Style
+ // ----------------------------------------------------------------------------------------------------------------
+ const PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
+ function applyStyle(el, props) {
+ for (let propName in props) {
+ applyStyleProp(el, propName, props[propName]);
+ }
+ }
+ function applyStyleProp(el, name, val) {
+ if (val == null) {
+ el.style[name] = '';
+ }
+ else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
+ el.style[name] = `${val}px`;
+ }
+ else {
+ el.style[name] = val;
+ }
+ }
+ // Event Handling
+ // ----------------------------------------------------------------------------------------------------------------
+ // if intercepting bubbled events at the document/window/body level,
+ // and want to see originating element (the 'target'), use this util instead
+ // of `ev.target` because it goes within web-component boundaries.
+ function getEventTargetViaRoot(ev) {
+ var _a, _b;
+ return (_b = (_a = ev.composedPath) === null || _a === void 0 ? void 0 : _a.call(ev)[0]) !== null && _b !== void 0 ? _b : ev.target;
+ }
+ // Shadow DOM consuderations
+ // ----------------------------------------------------------------------------------------------------------------
+ function getElRoot(el) {
+ return el.getRootNode ? el.getRootNode() : document;
+ }
+ // Unique ID for DOM attribute
+ let guid$1 = 0;
+ function getUniqueDomId() {
+ guid$1 += 1;
+ return 'fc-dom-' + guid$1;
+ }
+
+ // Stops a mouse/touch event from doing it's native browser action
+ function preventDefault(ev) {
+ ev.preventDefault();
+ }
+ // Event Delegation
+ // ----------------------------------------------------------------------------------------------------------------
+ function buildDelegationHandler(selector, handler) {
+ return (ev) => {
+ let matchedChild = elementClosest(ev.target, selector);
+ if (matchedChild) {
+ handler.call(matchedChild, ev, matchedChild);
+ }
+ };
+ }
+ function listenBySelector(container, eventType, selector, handler) {
+ let attachedHandler = buildDelegationHandler(selector, handler);
+ container.addEventListener(eventType, attachedHandler);
+ return () => {
+ container.removeEventListener(eventType, attachedHandler);
+ };
+ }
+ function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
+ let currentMatchedChild;
+ return listenBySelector(container, 'mouseover', selector, (mouseOverEv, matchedChild) => {
+ if (matchedChild !== currentMatchedChild) {
+ currentMatchedChild = matchedChild;
+ onMouseEnter(mouseOverEv, matchedChild);
+ let realOnMouseLeave = (mouseLeaveEv) => {
+ currentMatchedChild = null;
+ onMouseLeave(mouseLeaveEv, matchedChild);
+ matchedChild.removeEventListener('mouseleave', realOnMouseLeave);
+ };
+ // listen to the next mouseleave, and then unattach
+ matchedChild.addEventListener('mouseleave', realOnMouseLeave);
+ }
+ });
+ }
+ // Animation
+ // ----------------------------------------------------------------------------------------------------------------
+ const transitionEventNames = [
+ 'webkitTransitionEnd',
+ 'otransitionend',
+ 'oTransitionEnd',
+ 'msTransitionEnd',
+ 'transitionend',
+ ];
+ // triggered only when the next single subsequent transition finishes
+ function whenTransitionDone(el, callback) {
+ let realCallback = (ev) => {
+ callback(ev);
+ transitionEventNames.forEach((eventName) => {
+ el.removeEventListener(eventName, realCallback);
+ });
+ };
+ transitionEventNames.forEach((eventName) => {
+ el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
+ });
+ }
+ // ARIA workarounds
+ // ----------------------------------------------------------------------------------------------------------------
+ function createAriaClickAttrs(handler) {
+ return Object.assign({ onClick: handler }, createAriaKeyboardAttrs(handler));
+ }
+ function createAriaKeyboardAttrs(handler) {
+ return {
+ tabIndex: 0,
+ onKeyDown(ev) {
+ if (ev.key === 'Enter' || ev.key === ' ') {
+ handler(ev);
+ ev.preventDefault(); // if space, don't scroll down page
+ }
+ },
+ };
+ }
+
+ let guidNumber = 0;
+ function guid() {
+ guidNumber += 1;
+ return String(guidNumber);
+ }
+ /* FullCalendar-specific DOM Utilities
+ ----------------------------------------------------------------------------------------------------------------------*/
+ // Make the mouse cursor express that an event is not allowed in the current area
+ function disableCursor() {
+ document.body.classList.add('fc-not-allowed');
+ }
+ // Returns the mouse cursor to its original look
+ function enableCursor() {
+ document.body.classList.remove('fc-not-allowed');
+ }
+ /* Selection
+ ----------------------------------------------------------------------------------------------------------------------*/
+ function preventSelection(el) {
+ el.classList.add('fc-unselectable');
+ el.addEventListener('selectstart', preventDefault);
+ }
+ function allowSelection(el) {
+ el.classList.remove('fc-unselectable');
+ el.removeEventListener('selectstart', preventDefault);
+ }
+ /* Context Menu
+ ----------------------------------------------------------------------------------------------------------------------*/
+ function preventContextMenu(el) {
+ el.addEventListener('contextmenu', preventDefault);
+ }
+ function allowContextMenu(el) {
+ el.removeEventListener('contextmenu', preventDefault);
+ }
+ function parseFieldSpecs(input) {
+ let specs = [];
+ let tokens = [];
+ let i;
+ let token;
+ if (typeof input === 'string') {
+ tokens = input.split(/\s*,\s*/);
+ }
+ else if (typeof input === 'function') {
+ tokens = [input];
+ }
+ else if (Array.isArray(input)) {
+ tokens = input;
+ }
+ for (i = 0; i < tokens.length; i += 1) {
+ token = tokens[i];
+ if (typeof token === 'string') {
+ specs.push(token.charAt(0) === '-' ?
+ { field: token.substring(1), order: -1 } :
+ { field: token, order: 1 });
+ }
+ else if (typeof token === 'function') {
+ specs.push({ func: token });
+ }
+ }
+ return specs;
+ }
+ function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
+ let i;
+ let cmp;
+ for (i = 0; i < fieldSpecs.length; i += 1) {
+ cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
+ if (cmp) {
+ return cmp;
+ }
+ }
+ return 0;
+ }
+ function compareByFieldSpec(obj0, obj1, fieldSpec) {
+ if (fieldSpec.func) {
+ return fieldSpec.func(obj0, obj1);
+ }
+ return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
+ * (fieldSpec.order || 1);
+ }
+ function flexibleCompare(a, b) {
+ if (!a && !b) {
+ return 0;
+ }
+ if (b == null) {
+ return -1;
+ }
+ if (a == null) {
+ return 1;
+ }
+ if (typeof a === 'string' || typeof b === 'string') {
+ return String(a).localeCompare(String(b));
+ }
+ return a - b;
+ }
+ /* String Utilities
+ ----------------------------------------------------------------------------------------------------------------------*/
+ function padStart(val, len) {
+ let s = String(val);
+ return '000'.substr(0, len - s.length) + s;
+ }
+ function formatWithOrdinals(formatter, args, fallbackText) {
+ if (typeof formatter === 'function') {
+ return formatter(...args);
+ }
+ if (typeof formatter === 'string') { // non-blank string
+ return args.reduce((str, arg, index) => (str.replace('$' + index, arg || '')), formatter);
+ }
+ return fallbackText;
+ }
+ /* Number Utilities
+ ----------------------------------------------------------------------------------------------------------------------*/
+ function compareNumbers(a, b) {
+ return a - b;
+ }
+ function isInt(n) {
+ return n % 1 === 0;
+ }
+ /* FC-specific DOM dimension stuff
+ ----------------------------------------------------------------------------------------------------------------------*/
+ function computeSmallestCellWidth(cellEl) {
+ let allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame');
+ let contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion');
+ if (!allWidthEl) {
+ throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const
+ }
+ if (!contentWidthEl) {
+ throw new Error('needs fc-scrollgrid-shrink-cushion className');
+ }
+ return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border
+ contentWidthEl.getBoundingClientRect().width;
+ }
+
+ const INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
+ const PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
+ // Parsing and Creation
+ function createDuration(input, unit) {
+ if (typeof input === 'string') {
+ return parseString(input);
+ }
+ if (typeof input === 'object' && input) { // non-null object
+ return parseObject(input);
+ }
+ if (typeof input === 'number') {
+ return parseObject({ [unit || 'milliseconds']: input });
+ }
+ return null;
+ }
+ function parseString(s) {
+ let m = PARSE_RE.exec(s);
+ if (m) {
+ let sign = m[1] ? -1 : 1;
+ return {
+ years: 0,
+ months: 0,
+ days: sign * (m[2] ? parseInt(m[2], 10) : 0),
+ milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
+ (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
+ (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
+ (m[6] ? parseInt(m[6], 10) : 0) // ms
+ ),
+ };
+ }
+ return null;
+ }
+ function parseObject(obj) {
+ let duration = {
+ years: obj.years || obj.year || 0,
+ months: obj.months || obj.month || 0,
+ days: obj.days || obj.day || 0,
+ milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
+ (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
+ (obj.seconds || obj.second || 0) * 1000 + // seconds
+ (obj.milliseconds || obj.millisecond || obj.ms || 0), // ms
+ };
+ let weeks = obj.weeks || obj.week;
+ if (weeks) {
+ duration.days += weeks * 7;
+ duration.specifiedWeeks = true;
+ }
+ return duration;
+ }
+ // Equality
+ function durationsEqual(d0, d1) {
+ return d0.years === d1.years &&
+ d0.months === d1.months &&
+ d0.days === d1.days &&
+ d0.milliseconds === d1.milliseconds;
+ }
+ function asCleanDays(dur) {
+ if (!dur.years && !dur.months && !dur.milliseconds) {
+ return dur.days;
+ }
+ return 0;
+ }
+ // Simple Math
+ function addDurations(d0, d1) {
+ return {
+ years: d0.years + d1.years,
+ months: d0.months + d1.months,
+ days: d0.days + d1.days,
+ milliseconds: d0.milliseconds + d1.milliseconds,
+ };
+ }
+ function subtractDurations(d1, d0) {
+ return {
+ years: d1.years - d0.years,
+ months: d1.months - d0.months,
+ days: d1.days - d0.days,
+ milliseconds: d1.milliseconds - d0.milliseconds,
+ };
+ }
+ function multiplyDuration(d, n) {
+ return {
+ years: d.years * n,
+ months: d.months * n,
+ days: d.days * n,
+ milliseconds: d.milliseconds * n,
+ };
+ }
+ // Conversions
+ // "Rough" because they are based on average-case Gregorian months/years
+ function asRoughYears(dur) {
+ return asRoughDays(dur) / 365;
+ }
+ function asRoughMonths(dur) {
+ return asRoughDays(dur) / 30;
+ }
+ function asRoughDays(dur) {
+ return asRoughMs(dur) / 864e5;
+ }
+ function asRoughMinutes(dur) {
+ return asRoughMs(dur) / (1000 * 60);
+ }
+ function asRoughSeconds(dur) {
+ return asRoughMs(dur) / 1000;
+ }
+ function asRoughMs(dur) {
+ return dur.years * (365 * 864e5) +
+ dur.months * (30 * 864e5) +
+ dur.days * 864e5 +
+ dur.milliseconds;
+ }
+ // Advanced Math
+ function wholeDivideDurations(numerator, denominator) {
+ let res = null;
+ for (let i = 0; i < INTERNAL_UNITS.length; i += 1) {
+ let unit = INTERNAL_UNITS[i];
+ if (denominator[unit]) {
+ let localRes = numerator[unit] / denominator[unit];
+ if (!isInt(localRes) || (res !== null && res !== localRes)) {
+ return null;
+ }
+ res = localRes;
+ }
+ else if (numerator[unit]) {
+ // needs to divide by something but can't!
+ return null;
+ }
+ }
+ return res;
+ }
+ function greatestDurationDenominator(dur) {
+ let ms = dur.milliseconds;
+ if (ms) {
+ if (ms % 1000 !== 0) {
+ return { unit: 'millisecond', value: ms };
+ }
+ if (ms % (1000 * 60) !== 0) {
+ return { unit: 'second', value: ms / 1000 };
+ }
+ if (ms % (1000 * 60 * 60) !== 0) {
+ return { unit: 'minute', value: ms / (1000 * 60) };
+ }
+ if (ms) {
+ return { unit: 'hour', value: ms / (1000 * 60 * 60) };
+ }
+ }
+ if (dur.days) {
+ if (dur.specifiedWeeks && dur.days % 7 === 0) {
+ return { unit: 'week', value: dur.days / 7 };
+ }
+ return { unit: 'day', value: dur.days };
+ }
+ if (dur.months) {
+ return { unit: 'month', value: dur.months };
+ }
+ if (dur.years) {
+ return { unit: 'year', value: dur.years };
+ }
+ return { unit: 'millisecond', value: 0 };
+ }
+
+ const { hasOwnProperty } = Object.prototype;
+ // Merges an array of objects into a single object.
+ // The second argument allows for an array of property names who's object values will be merged together.
+ function mergeProps(propObjs, complexPropsMap) {
+ let dest = {};
+ if (complexPropsMap) {
+ for (let name in complexPropsMap) {
+ let complexObjs = [];
+ // collect the trailing object values, stopping when a non-object is discovered
+ for (let i = propObjs.length - 1; i >= 0; i -= 1) {
+ let val = propObjs[i][name];
+ if (typeof val === 'object' && val) { // non-null object
+ complexObjs.unshift(val);
+ }
+ else if (val !== undefined) {
+ dest[name] = val; // if there were no objects, this value will be used
+ break;
+ }
+ }
+ // if the trailing values were objects, use the merged value
+ if (complexObjs.length) {
+ dest[name] = mergeProps(complexObjs);
+ }
+ }
+ }
+ // copy values into the destination, going from last to first
+ for (let i = propObjs.length - 1; i >= 0; i -= 1) {
+ let props = propObjs[i];
+ for (let name in props) {
+ if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
+ dest[name] = props[name];
+ }
+ }
+ }
+ return dest;
+ }
+ function filterHash(hash, func) {
+ let filtered = {};
+ for (let key in hash) {
+ if (func(hash[key], key)) {
+ filtered[key] = hash[key];
+ }
+ }
+ return filtered;
+ }
+ function mapHash(hash, func) {
+ let newHash = {};
+ for (let key in hash) {
+ newHash[key] = func(hash[key], key);
+ }
+ return newHash;
+ }
+ function arrayToHash(a) {
+ let hash = {};
+ for (let item of a) {
+ hash[item] = true;
+ }
+ return hash;
+ }
+ // TODO: reassess browser support
+ // https://caniuse.com/?search=object.values
+ function hashValuesToArray(obj) {
+ let a = [];
+ for (let key in obj) {
+ a.push(obj[key]);
+ }
+ return a;
+ }
+ function isPropsEqual(obj0, obj1) {
+ if (obj0 === obj1) {
+ return true;
+ }
+ for (let key in obj0) {
+ if (hasOwnProperty.call(obj0, key)) {
+ if (!(key in obj1)) {
+ return false;
+ }
+ }
+ }
+ for (let key in obj1) {
+ if (hasOwnProperty.call(obj1, key)) {
+ if (obj0[key] !== obj1[key]) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ const HANDLER_RE = /^on[A-Z]/;
+ function isNonHandlerPropsEqual(obj0, obj1) {
+ const keys = getUnequalProps(obj0, obj1);
+ for (let key of keys) {
+ if (!HANDLER_RE.test(key)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function getUnequalProps(obj0, obj1) {
+ let keys = [];
+ for (let key in obj0) {
+ if (hasOwnProperty.call(obj0, key)) {
+ if (!(key in obj1)) {
+ keys.push(key);
+ }
+ }
+ }
+ for (let key in obj1) {
+ if (hasOwnProperty.call(obj1, key)) {
+ if (obj0[key] !== obj1[key]) {
+ keys.push(key);
+ }
+ }
+ }
+ return keys;
+ }
+ function compareObjs(oldProps, newProps, equalityFuncs = {}) {
+ if (oldProps === newProps) {
+ return true;
+ }
+ for (let key in newProps) {
+ if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;
+ else {
+ return false;
+ }
+ }
+ // check for props that were omitted in the new
+ for (let key in oldProps) {
+ if (!(key in newProps)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ /*
+ assumed "true" equality for handler names like "onReceiveSomething"
+ */
+ function isObjValsEqual(val0, val1, comparator) {
+ if (val0 === val1 || comparator === true) {
+ return true;
+ }
+ if (comparator) {
+ return comparator(val0, val1);
+ }
+ return false;
+ }
+ function collectFromHash(hash, startIndex = 0, endIndex, step = 1) {
+ let res = [];
+ if (endIndex == null) {
+ endIndex = Object.keys(hash).length;
+ }
+ for (let i = startIndex; i < endIndex; i += step) {
+ let val = hash[i];
+ if (val !== undefined) { // will disregard undefined for sparse arrays
+ res.push(val);
+ }
+ }
+ return res;
+ }
+
+ const DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
+ // Adding
+ function addWeeks(m, n) {
+ let a = dateToUtcArray(m);
+ a[2] += n * 7;
+ return arrayToUtcDate(a);
+ }
+ function addDays(m, n) {
+ let a = dateToUtcArray(m);
+ a[2] += n;
+ return arrayToUtcDate(a);
+ }
+ function addMs(m, n) {
+ let a = dateToUtcArray(m);
+ a[6] += n;
+ return arrayToUtcDate(a);
+ }
+ // Diffing (all return floats)
+ // TODO: why not use ranges?
+ function diffWeeks(m0, m1) {
+ return diffDays(m0, m1) / 7;
+ }
+ function diffDays(m0, m1) {
+ return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
+ }
+ function diffHours(m0, m1) {
+ return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
+ }
+ function diffMinutes(m0, m1) {
+ return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
+ }
+ function diffSeconds(m0, m1) {
+ return (m1.valueOf() - m0.valueOf()) / 1000;
+ }
+ function diffDayAndTime(m0, m1) {
+ let m0day = startOfDay(m0);
+ let m1day = startOfDay(m1);
+ return {
+ years: 0,
+ months: 0,
+ days: Math.round(diffDays(m0day, m1day)),
+ milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()),
+ };
+ }
+ // Diffing Whole Units
+ function diffWholeWeeks(m0, m1) {
+ let d = diffWholeDays(m0, m1);
+ if (d !== null && d % 7 === 0) {
+ return d / 7;
+ }
+ return null;
+ }
+ function diffWholeDays(m0, m1) {
+ if (timeAsMs(m0) === timeAsMs(m1)) {
+ return Math.round(diffDays(m0, m1));
+ }
+ return null;
+ }
+ // Start-Of
+ function startOfDay(m) {
+ return arrayToUtcDate([
+ m.getUTCFullYear(),
+ m.getUTCMonth(),
+ m.getUTCDate(),
+ ]);
+ }
+ function startOfHour(m) {
+ return arrayToUtcDate([
+ m.getUTCFullYear(),
+ m.getUTCMonth(),
+ m.getUTCDate(),
+ m.getUTCHours(),
+ ]);
+ }
+ function startOfMinute(m) {
+ return arrayToUtcDate([
+ m.getUTCFullYear(),
+ m.getUTCMonth(),
+ m.getUTCDate(),
+ m.getUTCHours(),
+ m.getUTCMinutes(),
+ ]);
+ }
+ function startOfSecond(m) {
+ return arrayToUtcDate([
+ m.getUTCFullYear(),
+ m.getUTCMonth(),
+ m.getUTCDate(),
+ m.getUTCHours(),
+ m.getUTCMinutes(),
+ m.getUTCSeconds(),
+ ]);
+ }
+ // Week Computation
+ function weekOfYear(marker, dow, doy) {
+ let y = marker.getUTCFullYear();
+ let w = weekOfGivenYear(marker, y, dow, doy);
+ if (w < 1) {
+ return weekOfGivenYear(marker, y - 1, dow, doy);
+ }
+ let nextW = weekOfGivenYear(marker, y + 1, dow, doy);
+ if (nextW >= 1) {
+ return Math.min(w, nextW);
+ }
+ return w;
+ }
+ function weekOfGivenYear(marker, year, dow, doy) {
+ let firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
+ let dayStart = startOfDay(marker);
+ let days = Math.round(diffDays(firstWeekStart, dayStart));
+ return Math.floor(days / 7) + 1; // zero-indexed
+ }
+ // start-of-first-week - start-of-year
+ function firstWeekOffset(year, dow, doy) {
+ // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+ let fwd = 7 + dow - doy;
+ // first-week day local weekday -- which local weekday is fwd
+ let fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
+ return -fwdlw + fwd - 1;
+ }
+ // Array Conversion
+ function dateToLocalArray(date) {
+ return [
+ date.getFullYear(),
+ date.getMonth(),
+ date.getDate(),
+ date.getHours(),
+ date.getMinutes(),
+ date.getSeconds(),
+ date.getMilliseconds(),
+ ];
+ }
+ function arrayToLocalDate(a) {
+ return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
+ a[3] || 0, a[4] || 0, a[5] || 0);
+ }
+ function dateToUtcArray(date) {
+ return [
+ date.getUTCFullYear(),
+ date.getUTCMonth(),
+ date.getUTCDate(),
+ date.getUTCHours(),
+ date.getUTCMinutes(),
+ date.getUTCSeconds(),
+ date.getUTCMilliseconds(),
+ ];
+ }
+ function arrayToUtcDate(a) {
+ // according to web standards (and Safari), a month index is required.
+ // massage if only given a year.
+ if (a.length === 1) {
+ a = a.concat([0]);
+ }
+ return new Date(Date.UTC(...a));
+ }
+ // Other Utils
+ function isValidDate(m) {
+ return !isNaN(m.valueOf());
+ }
+ function timeAsMs(m) {
+ return m.getUTCHours() * 1000 * 60 * 60 +
+ m.getUTCMinutes() * 1000 * 60 +
+ m.getUTCSeconds() * 1000 +
+ m.getUTCMilliseconds();
+ }
+
+ // timeZoneOffset is in minutes
+ function buildIsoString(marker, timeZoneOffset, stripZeroTime = false) {
+ let s = marker.toISOString();
+ s = s.replace('.000', '');
+ if (stripZeroTime) {
+ s = s.replace('T00:00:00Z', '');
+ }
+ if (s.length > 10) { // time part wasn't stripped, can add timezone info
+ if (timeZoneOffset == null) {
+ s = s.replace('Z', '');
+ }
+ else if (timeZoneOffset !== 0) {
+ s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
+ }
+ // otherwise, its UTC-0 and we want to keep the Z
+ }
+ return s;
+ }
+ // formats the date, but with no time part
+ // TODO: somehow merge with buildIsoString and stripZeroTime
+ // TODO: rename. omit "string"
+ function formatDayString(marker) {
+ return marker.toISOString().replace(/T.*$/, '');
+ }
+ // TODO: use Date::toISOString and use everything after the T?
+ function formatIsoTimeString(marker) {
+ return padStart(marker.getUTCHours(), 2) + ':' +
+ padStart(marker.getUTCMinutes(), 2) + ':' +
+ padStart(marker.getUTCSeconds(), 2);
+ }
+ function formatTimeZoneOffset(minutes, doIso = false) {
+ let sign = minutes < 0 ? '-' : '+';
+ let abs = Math.abs(minutes);
+ let hours = Math.floor(abs / 60);
+ let mins = Math.round(abs % 60);
+ if (doIso) {
+ return `${sign + padStart(hours, 2)}:${padStart(mins, 2)}`;
+ }
+ return `GMT${sign}${hours}${mins ? `:${padStart(mins, 2)}` : ''}`;
+ }
+
+ // TODO: new util arrayify?
+ function removeExact(array, exactVal) {
+ let removeCnt = 0;
+ let i = 0;
+ while (i < array.length) {
+ if (array[i] === exactVal) {
+ array.splice(i, 1);
+ removeCnt += 1;
+ }
+ else {
+ i += 1;
+ }
+ }
+ return removeCnt;
+ }
+ function isArraysEqual(a0, a1, equalityFunc) {
+ if (a0 === a1) {
+ return true;
+ }
+ let len = a0.length;
+ let i;
+ if (len !== a1.length) { // not array? or not same length?
+ return false;
+ }
+ for (i = 0; i < len; i += 1) {
+ if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function memoize(workerFunc, resEquality, teardownFunc) {
+ let currentArgs;
+ let currentRes;
+ return function (...newArgs) {
+ if (!currentArgs) {
+ currentRes = workerFunc.apply(this, newArgs);
+ }
+ else if (!isArraysEqual(currentArgs, newArgs)) {
+ if (teardownFunc) {
+ teardownFunc(currentRes);
+ }
+ let res = workerFunc.apply(this, newArgs);
+ if (!resEquality || !resEquality(res, currentRes)) {
+ currentRes = res;
+ }
+ }
+ currentArgs = newArgs;
+ return currentRes;
+ };
+ }
+ function memoizeObjArg(workerFunc, resEquality, teardownFunc) {
+ let currentArg;
+ let currentRes;
+ return (newArg) => {
+ if (!currentArg) {
+ currentRes = workerFunc.call(this, newArg);
+ }
+ else if (!isPropsEqual(currentArg, newArg)) {
+ if (teardownFunc) {
+ teardownFunc(currentRes);
+ }
+ let res = workerFunc.call(this, newArg);
+ if (!resEquality || !resEquality(res, currentRes)) {
+ currentRes = res;
+ }
+ }
+ currentArg = newArg;
+ return currentRes;
+ };
+ }
+ function memoizeArraylike(// used at all?
+ workerFunc, resEquality, teardownFunc) {
+ let currentArgSets = [];
+ let currentResults = [];
+ return (newArgSets) => {
+ let currentLen = currentArgSets.length;
+ let newLen = newArgSets.length;
+ let i = 0;
+ for (; i < currentLen; i += 1) {
+ if (!newArgSets[i]) { // one of the old sets no longer exists
+ if (teardownFunc) {
+ teardownFunc(currentResults[i]);
+ }
+ }
+ else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) {
+ if (teardownFunc) {
+ teardownFunc(currentResults[i]);
+ }
+ let res = workerFunc.apply(this, newArgSets[i]);
+ if (!resEquality || !resEquality(res, currentResults[i])) {
+ currentResults[i] = res;
+ }
+ }
+ }
+ for (; i < newLen; i += 1) {
+ currentResults[i] = workerFunc.apply(this, newArgSets[i]);
+ }
+ currentArgSets = newArgSets;
+ currentResults.splice(newLen); // remove excess
+ return currentResults;
+ };
+ }
+ function memoizeHashlike(workerFunc, resEquality, teardownFunc) {
+ let currentArgHash = {};
+ let currentResHash = {};
+ return (newArgHash) => {
+ let newResHash = {};
+ for (let key in newArgHash) {
+ if (!currentResHash[key]) {
+ newResHash[key] = workerFunc.apply(this, newArgHash[key]);
+ }
+ else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) {
+ if (teardownFunc) {
+ teardownFunc(currentResHash[key]);
+ }
+ let res = workerFunc.apply(this, newArgHash[key]);
+ newResHash[key] = (resEquality && resEquality(res, currentResHash[key]))
+ ? currentResHash[key]
+ : res;
+ }
+ else {
+ newResHash[key] = currentResHash[key];
+ }
+ }
+ currentArgHash = newArgHash;
+ currentResHash = newResHash;
+ return newResHash;
+ };
+ }
+
+ const EXTENDED_SETTINGS_AND_SEVERITIES = {
+ week: 3,
+ separator: 0,
+ omitZeroMinute: 0,
+ meridiem: 0,
+ omitCommas: 0,
+ };
+ const STANDARD_DATE_PROP_SEVERITIES = {
+ timeZoneName: 7,
+ era: 6,
+ year: 5,
+ month: 4,
+ day: 2,
+ weekday: 2,
+ hour: 1,
+ minute: 1,
+ second: 1,
+ };
+ const MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
+ const COMMA_RE = /,/g; // we need re for globalness
+ const MULTI_SPACE_RE = /\s+/g;
+ const LTR_RE = /\u200e/g; // control character
+ const UTC_RE = /UTC|GMT/;
+ class NativeFormatter {
+ constructor(formatSettings) {
+ let standardDateProps = {};
+ let extendedSettings = {};
+ let severity = 0;
+ for (let name in formatSettings) {
+ if (name in EXTENDED_SETTINGS_AND_SEVERITIES) {
+ extendedSettings[name] = formatSettings[name];
+ severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name], severity);
+ }
+ else {
+ standardDateProps[name] = formatSettings[name];
+ if (name in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity
+ severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name], severity);
+ }
+ }
+ }
+ this.standardDateProps = standardDateProps;
+ this.extendedSettings = extendedSettings;
+ this.severity = severity;
+ this.buildFormattingFunc = memoize(buildFormattingFunc);
+ }
+ format(date, context) {
+ return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
+ }
+ formatRange(start, end, context, betterDefaultSeparator) {
+ let { standardDateProps, extendedSettings } = this;
+ let diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
+ if (!diffSeverity) {
+ return this.format(start, context);
+ }
+ let biggestUnitForPartial = diffSeverity;
+ if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
+ (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
+ (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
+ (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
+ biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
+ }
+ let full0 = this.format(start, context);
+ let full1 = this.format(end, context);
+ if (full0 === full1) {
+ return full0;
+ }
+ let partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
+ let partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
+ let partial0 = partialFormattingFunc(start);
+ let partial1 = partialFormattingFunc(end);
+ let insertion = findCommonInsertion(full0, partial0, full1, partial1);
+ let separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || '';
+ if (insertion) {
+ return insertion.before + partial0 + separator + partial1 + insertion.after;
+ }
+ return full0 + separator + full1;
+ }
+ getLargestUnit() {
+ switch (this.severity) {
+ case 7:
+ case 6:
+ case 5:
+ return 'year';
+ case 4:
+ return 'month';
+ case 3:
+ return 'week';
+ case 2:
+ return 'day';
+ default:
+ return 'time'; // really?
+ }
+ }
+ }
+ function buildFormattingFunc(standardDateProps, extendedSettings, context) {
+ let standardDatePropCnt = Object.keys(standardDateProps).length;
+ if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
+ return (date) => (formatTimeZoneOffset(date.timeZoneOffset));
+ }
+ if (standardDatePropCnt === 0 && extendedSettings.week) {
+ return (date) => (formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week));
+ }
+ return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
+ }
+ function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
+ standardDateProps = Object.assign({}, standardDateProps); // copy
+ extendedSettings = Object.assign({}, extendedSettings); // copy
+ sanitizeSettings(standardDateProps, extendedSettings);
+ standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
+ let normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
+ let zeroFormat; // needed?
+ if (extendedSettings.omitZeroMinute) {
+ let zeroProps = Object.assign({}, standardDateProps);
+ delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
+ zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
+ }
+ return (date) => {
+ let { marker } = date;
+ let format;
+ if (zeroFormat && !marker.getUTCMinutes()) {
+ format = zeroFormat;
+ }
+ else {
+ format = normalFormat;
+ }
+ let s = format.format(marker);
+ return postProcess(s, date, standardDateProps, extendedSettings, context);
+ };
+ }
+ function sanitizeSettings(standardDateProps, extendedSettings) {
+ // deal with a browser inconsistency where formatting the timezone
+ // requires that the hour/minute be present.
+ if (standardDateProps.timeZoneName) {
+ if (!standardDateProps.hour) {
+ standardDateProps.hour = '2-digit';
+ }
+ if (!standardDateProps.minute) {
+ standardDateProps.minute = '2-digit';
+ }
+ }
+ // only support short timezone names
+ if (standardDateProps.timeZoneName === 'long') {
+ standardDateProps.timeZoneName = 'short';
+ }
+ // if requesting to display seconds, MUST display minutes
+ if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
+ delete extendedSettings.omitZeroMinute;
+ }
+ }
+ function postProcess(s, date, standardDateProps, extendedSettings, context) {
+ s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
+ if (standardDateProps.timeZoneName === 'short') {
+ s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
+ 'UTC' : // important to normalize for IE, which does "GMT"
+ formatTimeZoneOffset(date.timeZoneOffset));
+ }
+ if (extendedSettings.omitCommas) {
+ s = s.replace(COMMA_RE, '').trim();
+ }
+ if (extendedSettings.omitZeroMinute) {
+ s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
+ }
+ // ^ do anything that might create adjacent spaces before this point,
+ // because MERIDIEM_RE likes to eat up loading spaces
+ if (extendedSettings.meridiem === false) {
+ s = s.replace(MERIDIEM_RE, '').trim();
+ }
+ else if (extendedSettings.meridiem === 'narrow') { // a/p
+ s = s.replace(MERIDIEM_RE, (m0, m1) => m1.toLocaleLowerCase());
+ }
+ else if (extendedSettings.meridiem === 'short') { // am/pm
+ s = s.replace(MERIDIEM_RE, (m0, m1) => `${m1.toLocaleLowerCase()}m`);
+ }
+ else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
+ s = s.replace(MERIDIEM_RE, (m0) => m0.toLocaleLowerCase());
+ }
+ s = s.replace(MULTI_SPACE_RE, ' ');
+ s = s.trim();
+ return s;
+ }
+ function injectTzoStr(s, tzoStr) {
+ let replaced = false;
+ s = s.replace(UTC_RE, () => {
+ replaced = true;
+ return tzoStr;
+ });
+ // IE11 doesn't include UTC/GMT in the original string, so append to end
+ if (!replaced) {
+ s += ` ${tzoStr}`;
+ }
+ return s;
+ }
+ function formatWeekNumber(num, weekText, weekTextLong, locale, display) {
+ let parts = [];
+ if (display === 'long') {
+ parts.push(weekTextLong);
+ }
+ else if (display === 'short' || display === 'narrow') {
+ parts.push(weekText);
+ }
+ if (display === 'long' || display === 'short') {
+ parts.push(' ');
+ }
+ parts.push(locale.simpleNumberFormat.format(num));
+ if (locale.options.direction === 'rtl') { // TODO: use control characters instead?
+ parts.reverse();
+ }
+ return parts.join('');
+ }
+ // Range Formatting Utils
+ // 0 = exactly the same
+ // 1 = different by time
+ // and bigger
+ function computeMarkerDiffSeverity(d0, d1, ca) {
+ if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
+ return 5;
+ }
+ if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
+ return 4;
+ }
+ if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
+ return 2;
+ }
+ if (timeAsMs(d0) !== timeAsMs(d1)) {
+ return 1;
+ }
+ return 0;
+ }
+ function computePartialFormattingOptions(options, biggestUnit) {
+ let partialOptions = {};
+ for (let name in options) {
+ if (!(name in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
+ STANDARD_DATE_PROP_SEVERITIES[name] <= biggestUnit) {
+ partialOptions[name] = options[name];
+ }
+ }
+ return partialOptions;
+ }
+ function findCommonInsertion(full0, partial0, full1, partial1) {
+ let i0 = 0;
+ while (i0 < full0.length) {
+ let found0 = full0.indexOf(partial0, i0);
+ if (found0 === -1) {
+ break;
+ }
+ let before0 = full0.substr(0, found0);
+ i0 = found0 + partial0.length;
+ let after0 = full0.substr(i0);
+ let i1 = 0;
+ while (i1 < full1.length) {
+ let found1 = full1.indexOf(partial1, i1);
+ if (found1 === -1) {
+ break;
+ }
+ let before1 = full1.substr(0, found1);
+ i1 = found1 + partial1.length;
+ let after1 = full1.substr(i1);
+ if (before0 === before1 && after0 === after1) {
+ return {
+ before: before0,
+ after: after0,
+ };
+ }
+ }
+ }
+ return null;
+ }
+
+ function expandZonedMarker(dateInfo, calendarSystem) {
+ let a = calendarSystem.markerToArray(dateInfo.marker);
+ return {
+ marker: dateInfo.marker,
+ timeZoneOffset: dateInfo.timeZoneOffset,
+ array: a,
+ year: a[0],
+ month: a[1],
+ day: a[2],
+ hour: a[3],
+ minute: a[4],
+ second: a[5],
+ millisecond: a[6],
+ };
+ }
+
+ function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) {
+ let startInfo = expandZonedMarker(start, context.calendarSystem);
+ let endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
+ return {
+ date: startInfo,
+ start: startInfo,
+ end: endInfo,
+ timeZone: context.timeZone,
+ localeCodes: context.locale.codes,
+ defaultSeparator: betterDefaultSeparator || context.defaultSeparator,
+ };
+ }
+
+ /*
+ TODO: fix the terminology of "formatter" vs "formatting func"
+ */
+ /*
+ At the time of instantiation, this object does not know which cmd-formatting system it will use.
+ It receives this at the time of formatting, as a setting.
+ */
+ class CmdFormatter {
+ constructor(cmdStr) {
+ this.cmdStr = cmdStr;
+ }
+ format(date, context, betterDefaultSeparator) {
+ return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
+ }
+ formatRange(start, end, context, betterDefaultSeparator) {
+ return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
+ }
+ }
+
+ class FuncFormatter {
+ constructor(func) {
+ this.func = func;
+ }
+ format(date, context, betterDefaultSeparator) {
+ return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
+ }
+ formatRange(start, end, context, betterDefaultSeparator) {
+ return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
+ }
+ }
+
+ function createFormatter(input) {
+ if (typeof input === 'object' && input) { // non-null object
+ return new NativeFormatter(input);
+ }
+ if (typeof input === 'string') {
+ return new CmdFormatter(input);
+ }
+ if (typeof input === 'function') {
+ return new FuncFormatter(input);
+ }
+ return null;
+ }
+
+ // base options
+ // ------------
+ const BASE_OPTION_REFINERS = {
+ navLinkDayClick: identity,
+ navLinkWeekClick: identity,
+ duration: createDuration,
+ bootstrapFontAwesome: identity,
+ buttonIcons: identity,
+ customButtons: identity,
+ defaultAllDayEventDuration: createDuration,
+ defaultTimedEventDuration: createDuration,
+ nextDayThreshold: createDuration,
+ scrollTime: createDuration,
+ scrollTimeReset: Boolean,
+ slotMinTime: createDuration,
+ slotMaxTime: createDuration,
+ dayPopoverFormat: createFormatter,
+ slotDuration: createDuration,
+ snapDuration: createDuration,
+ headerToolbar: identity,
+ footerToolbar: identity,
+ defaultRangeSeparator: String,
+ titleRangeSeparator: String,
+ forceEventDuration: Boolean,
+ dayHeaders: Boolean,
+ dayHeaderFormat: createFormatter,
+ dayHeaderClassNames: identity,
+ dayHeaderContent: identity,
+ dayHeaderDidMount: identity,
+ dayHeaderWillUnmount: identity,
+ dayCellClassNames: identity,
+ dayCellContent: identity,
+ dayCellDidMount: identity,
+ dayCellWillUnmount: identity,
+ initialView: String,
+ aspectRatio: Number,
+ weekends: Boolean,
+ weekNumberCalculation: identity,
+ weekNumbers: Boolean,
+ weekNumberClassNames: identity,
+ weekNumberContent: identity,
+ weekNumberDidMount: identity,
+ weekNumberWillUnmount: identity,
+ editable: Boolean,
+ viewClassNames: identity,
+ viewDidMount: identity,
+ viewWillUnmount: identity,
+ nowIndicator: Boolean,
+ nowIndicatorClassNames: identity,
+ nowIndicatorContent: identity,
+ nowIndicatorDidMount: identity,
+ nowIndicatorWillUnmount: identity,
+ showNonCurrentDates: Boolean,
+ lazyFetching: Boolean,
+ startParam: String,
+ endParam: String,
+ timeZoneParam: String,
+ timeZone: String,
+ locales: identity,
+ locale: identity,
+ themeSystem: String,
+ dragRevertDuration: Number,
+ dragScroll: Boolean,
+ allDayMaintainDuration: Boolean,
+ unselectAuto: Boolean,
+ dropAccept: identity,
+ eventOrder: parseFieldSpecs,
+ eventOrderStrict: Boolean,
+ handleWindowResize: Boolean,
+ windowResizeDelay: Number,
+ longPressDelay: Number,
+ eventDragMinDistance: Number,
+ expandRows: Boolean,
+ height: identity,
+ contentHeight: identity,
+ direction: String,
+ weekNumberFormat: createFormatter,
+ eventResizableFromStart: Boolean,
+ displayEventTime: Boolean,
+ displayEventEnd: Boolean,
+ weekText: String,
+ weekTextLong: String,
+ progressiveEventRendering: Boolean,
+ businessHours: identity,
+ initialDate: identity,
+ now: identity,
+ eventDataTransform: identity,
+ stickyHeaderDates: identity,
+ stickyFooterScrollbar: identity,
+ viewHeight: identity,
+ defaultAllDay: Boolean,
+ eventSourceFailure: identity,
+ eventSourceSuccess: identity,
+ eventDisplay: String,
+ eventStartEditable: Boolean,
+ eventDurationEditable: Boolean,
+ eventOverlap: identity,
+ eventConstraint: identity,
+ eventAllow: identity,
+ eventBackgroundColor: String,
+ eventBorderColor: String,
+ eventTextColor: String,
+ eventColor: String,
+ eventClassNames: identity,
+ eventContent: identity,
+ eventDidMount: identity,
+ eventWillUnmount: identity,
+ selectConstraint: identity,
+ selectOverlap: identity,
+ selectAllow: identity,
+ droppable: Boolean,
+ unselectCancel: String,
+ slotLabelFormat: identity,
+ slotLaneClassNames: identity,
+ slotLaneContent: identity,
+ slotLaneDidMount: identity,
+ slotLaneWillUnmount: identity,
+ slotLabelClassNames: identity,
+ slotLabelContent: identity,
+ slotLabelDidMount: identity,
+ slotLabelWillUnmount: identity,
+ dayMaxEvents: identity,
+ dayMaxEventRows: identity,
+ dayMinWidth: Number,
+ slotLabelInterval: createDuration,
+ allDayText: String,
+ allDayClassNames: identity,
+ allDayContent: identity,
+ allDayDidMount: identity,
+ allDayWillUnmount: identity,
+ slotMinWidth: Number,
+ navLinks: Boolean,
+ eventTimeFormat: createFormatter,
+ rerenderDelay: Number,
+ moreLinkText: identity,
+ moreLinkHint: identity,
+ selectMinDistance: Number,
+ selectable: Boolean,
+ selectLongPressDelay: Number,
+ eventLongPressDelay: Number,
+ selectMirror: Boolean,
+ eventMaxStack: Number,
+ eventMinHeight: Number,
+ eventMinWidth: Number,
+ eventShortHeight: Number,
+ slotEventOverlap: Boolean,
+ plugins: identity,
+ firstDay: Number,
+ dayCount: Number,
+ dateAlignment: String,
+ dateIncrement: createDuration,
+ hiddenDays: identity,
+ monthMode: Boolean,
+ fixedWeekCount: Boolean,
+ validRange: identity,
+ visibleRange: identity,
+ titleFormat: identity,
+ eventInteractive: Boolean,
+ // only used by list-view, but languages define the value, so we need it in base options
+ noEventsText: String,
+ viewHint: identity,
+ navLinkHint: identity,
+ closeHint: String,
+ timeHint: String,
+ eventHint: String,
+ moreLinkClick: identity,
+ moreLinkClassNames: identity,
+ moreLinkContent: identity,
+ moreLinkDidMount: identity,
+ moreLinkWillUnmount: identity,
+ // for connectors
+ // (can't be part of plugin system b/c must be provided at runtime)
+ handleCustomRendering: identity,
+ customRenderingMetaMap: identity,
+ customRenderingReplacesEl: Boolean,
+ };
+ // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results.
+ // raw values.
+ const BASE_OPTION_DEFAULTS = {
+ eventDisplay: 'auto',
+ defaultRangeSeparator: ' - ',
+ titleRangeSeparator: ' \u2013 ',
+ defaultTimedEventDuration: '01:00:00',
+ defaultAllDayEventDuration: { day: 1 },
+ forceEventDuration: false,
+ nextDayThreshold: '00:00:00',
+ dayHeaders: true,
+ initialView: '',
+ aspectRatio: 1.35,
+ headerToolbar: {
+ start: 'title',
+ center: '',
+ end: 'today prev,next',
+ },
+ weekends: true,
+ weekNumbers: false,
+ weekNumberCalculation: 'local',
+ editable: false,
+ nowIndicator: false,
+ scrollTime: '06:00:00',
+ scrollTimeReset: true,
+ slotMinTime: '00:00:00',
+ slotMaxTime: '24:00:00',
+ showNonCurrentDates: true,
+ lazyFetching: true,
+ startParam: 'start',
+ endParam: 'end',
+ timeZoneParam: 'timeZone',
+ timeZone: 'local',
+ locales: [],
+ locale: '',
+ themeSystem: 'standard',
+ dragRevertDuration: 500,
+ dragScroll: true,
+ allDayMaintainDuration: false,
+ unselectAuto: true,
+ dropAccept: '*',
+ eventOrder: 'start,-duration,allDay,title',
+ dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
+ handleWindowResize: true,
+ windowResizeDelay: 100,
+ longPressDelay: 1000,
+ eventDragMinDistance: 5,
+ expandRows: false,
+ navLinks: false,
+ selectable: false,
+ eventMinHeight: 15,
+ eventMinWidth: 30,
+ eventShortHeight: 30,
+ };
+ // calendar listeners
+ // ------------------
+ const CALENDAR_LISTENER_REFINERS = {
+ datesSet: identity,
+ eventsSet: identity,
+ eventAdd: identity,
+ eventChange: identity,
+ eventRemove: identity,
+ windowResize: identity,
+ eventClick: identity,
+ eventMouseEnter: identity,
+ eventMouseLeave: identity,
+ select: identity,
+ unselect: identity,
+ loading: identity,
+ // internal
+ _unmount: identity,
+ _beforeprint: identity,
+ _afterprint: identity,
+ _noEventDrop: identity,
+ _noEventResize: identity,
+ _resize: identity,
+ _scrollRequest: identity,
+ };
+ // calendar-specific options
+ // -------------------------
+ const CALENDAR_OPTION_REFINERS = {
+ buttonText: identity,
+ buttonHints: identity,
+ views: identity,
+ plugins: identity,
+ initialEvents: identity,
+ events: identity,
+ eventSources: identity,
+ };
+ const COMPLEX_OPTION_COMPARATORS = {
+ headerToolbar: isMaybeObjectsEqual,
+ footerToolbar: isMaybeObjectsEqual,
+ buttonText: isMaybeObjectsEqual,
+ buttonHints: isMaybeObjectsEqual,
+ buttonIcons: isMaybeObjectsEqual,
+ dateIncrement: isMaybeObjectsEqual,
+ };
+ function isMaybeObjectsEqual(a, b) {
+ if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects
+ return isPropsEqual(a, b);
+ }
+ return a === b;
+ }
+ // view-specific options
+ // ---------------------
+ const VIEW_OPTION_REFINERS = {
+ type: String,
+ component: identity,
+ buttonText: String,
+ buttonTextKey: String,
+ dateProfileGeneratorClass: identity,
+ usesMinMaxTime: Boolean,
+ classNames: identity,
+ content: identity,
+ didMount: identity,
+ willUnmount: identity,
+ };
+ // util funcs
+ // ----------------------------------------------------------------------------------------------------
+ function mergeRawOptions(optionSets) {
+ return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS);
+ }
+ function refineProps(input, refiners) {
+ let refined = {};
+ let extra = {};
+ for (let propName in refiners) {
+ if (propName in input) {
+ refined[propName] = refiners[propName](input[propName]);
+ }
+ }
+ for (let propName in input) {
+ if (!(propName in refiners)) {
+ extra[propName] = input[propName];
+ }
+ }
+ return { refined, extra };
+ }
+ function identity(raw) {
+ return raw;
+ }
+
+ function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
+ return {
+ instanceId: guid(),
+ defId,
+ range,
+ forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
+ forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo,
+ };
+ }
+
+ function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) {
+ for (let i = 0; i < recurringTypes.length; i += 1) {
+ let parsed = recurringTypes[i].parse(refined, dateEnv);
+ if (parsed) {
+ let { allDay } = refined;
+ if (allDay == null) {
+ allDay = defaultAllDay;
+ if (allDay == null) {
+ allDay = parsed.allDayGuess;
+ if (allDay == null) {
+ allDay = false;
+ }
+ }
+ }
+ return {
+ allDay,
+ duration: parsed.duration,
+ typeData: parsed.typeData,
+ typeId: i,
+ };
+ }
+ }
+ return null;
+ }
+ function expandRecurring(eventStore, framingRange, context) {
+ let { dateEnv, pluginHooks, options } = context;
+ let { defs, instances } = eventStore;
+ // remove existing recurring instances
+ // TODO: bad. always expand events as a second step
+ instances = filterHash(instances, (instance) => !defs[instance.defId].recurringDef);
+ for (let defId in defs) {
+ let def = defs[defId];
+ if (def.recurringDef) {
+ let { duration } = def.recurringDef;
+ if (!duration) {
+ duration = def.allDay ?
+ options.defaultAllDayEventDuration :
+ options.defaultTimedEventDuration;
+ }
+ let starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes);
+ for (let start of starts) {
+ let instance = createEventInstance(defId, {
+ start,
+ end: dateEnv.add(start, duration),
+ });
+ instances[instance.instanceId] = instance;
+ }
+ }
+ }
+ return { defs, instances };
+ }
+ /*
+ Event MUST have a recurringDef
+ */
+ function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
+ let typeDef = recurringTypes[eventDef.recurringDef.typeId];
+ let markers = typeDef.expand(eventDef.recurringDef.typeData, {
+ start: dateEnv.subtract(framingRange.start, duration),
+ end: framingRange.end,
+ }, dateEnv);
+ // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
+ if (eventDef.allDay) {
+ markers = markers.map(startOfDay);
+ }
+ return markers;
+ }
+
+ function parseEvents(rawEvents, eventSource, context, allowOpenRange) {
+ let eventStore = createEmptyEventStore();
+ let eventRefiners = buildEventRefiners(context);
+ for (let rawEvent of rawEvents) {
+ let tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners);
+ if (tuple) {
+ eventTupleToStore(tuple, eventStore);
+ }
+ }
+ return eventStore;
+ }
+ function eventTupleToStore(tuple, eventStore = createEmptyEventStore()) {
+ eventStore.defs[tuple.def.defId] = tuple.def;
+ if (tuple.instance) {
+ eventStore.instances[tuple.instance.instanceId] = tuple.instance;
+ }
+ return eventStore;
+ }
+ // retrieves events that have the same groupId as the instance specified by `instanceId`
+ // or they are the same as the instance.
+ // why might instanceId not be in the store? an event from another calendar?
+ function getRelevantEvents(eventStore, instanceId) {
+ let instance = eventStore.instances[instanceId];
+ if (instance) {
+ let def = eventStore.defs[instance.defId];
+ // get events/instances with same group
+ let newStore = filterEventStoreDefs(eventStore, (lookDef) => isEventDefsGrouped(def, lookDef));
+ // add the original
+ // TODO: wish we could use eventTupleToStore or something like it
+ newStore.defs[def.defId] = def;
+ newStore.instances[instance.instanceId] = instance;
+ return newStore;
+ }
+ return createEmptyEventStore();
+ }
+ function isEventDefsGrouped(def0, def1) {
+ return Boolean(def0.groupId && def0.groupId === def1.groupId);
+ }
+ function createEmptyEventStore() {
+ return { defs: {}, instances: {} };
+ }
+ function mergeEventStores(store0, store1) {
+ return {
+ defs: Object.assign(Object.assign({}, store0.defs), store1.defs),
+ instances: Object.assign(Object.assign({}, store0.instances), store1.instances),
+ };
+ }
+ function filterEventStoreDefs(eventStore, filterFunc) {
+ let defs = filterHash(eventStore.defs, filterFunc);
+ let instances = filterHash(eventStore.instances, (instance) => (defs[instance.defId] // still exists?
+ ));
+ return { defs, instances };
+ }
+ function excludeSubEventStore(master, sub) {
+ let { defs, instances } = master;
+ let filteredDefs = {};
+ let filteredInstances = {};
+ for (let defId in defs) {
+ if (!sub.defs[defId]) { // not explicitly excluded
+ filteredDefs[defId] = defs[defId];
+ }
+ }
+ for (let instanceId in instances) {
+ if (!sub.instances[instanceId] && // not explicitly excluded
+ filteredDefs[instances[instanceId].defId] // def wasn't filtered away
+ ) {
+ filteredInstances[instanceId] = instances[instanceId];
+ }
+ }
+ return {
+ defs: filteredDefs,
+ instances: filteredInstances,
+ };
+ }
+
+ function normalizeConstraint(input, context) {
+ if (Array.isArray(input)) {
+ return parseEvents(input, null, context, true); // allowOpenRange=true
+ }
+ if (typeof input === 'object' && input) { // non-null object
+ return parseEvents([input], null, context, true); // allowOpenRange=true
+ }
+ if (input != null) {
+ return String(input);
+ }
+ return null;
+ }
+
+ function parseClassNames(raw) {
+ if (Array.isArray(raw)) {
+ return raw;
+ }
+ if (typeof raw === 'string') {
+ return raw.split(/\s+/);
+ }
+ return [];
+ }
+
+ // TODO: better called "EventSettings" or "EventConfig"
+ // TODO: move this file into structs
+ // TODO: separate constraint/overlap/allow, because selection uses only that, not other props
+ const EVENT_UI_REFINERS = {
+ display: String,
+ editable: Boolean,
+ startEditable: Boolean,
+ durationEditable: Boolean,
+ constraint: identity,
+ overlap: identity,
+ allow: identity,
+ className: parseClassNames,
+ classNames: parseClassNames,
+ color: String,
+ backgroundColor: String,
+ borderColor: String,
+ textColor: String,
+ };
+ const EMPTY_EVENT_UI = {
+ display: null,
+ startEditable: null,
+ durationEditable: null,
+ constraints: [],
+ overlap: null,
+ allows: [],
+ backgroundColor: '',
+ borderColor: '',
+ textColor: '',
+ classNames: [],
+ };
+ function createEventUi(refined, context) {
+ let constraint = normalizeConstraint(refined.constraint, context);
+ return {
+ display: refined.display || null,
+ startEditable: refined.startEditable != null ? refined.startEditable : refined.editable,
+ durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable,
+ constraints: constraint != null ? [constraint] : [],
+ overlap: refined.overlap != null ? refined.overlap : null,
+ allows: refined.allow != null ? [refined.allow] : [],
+ backgroundColor: refined.backgroundColor || refined.color || '',
+ borderColor: refined.borderColor || refined.color || '',
+ textColor: refined.textColor || '',
+ classNames: (refined.className || []).concat(refined.classNames || []), // join singular and plural
+ };
+ }
+ // TODO: prevent against problems with <2 args!
+ function combineEventUis(uis) {
+ return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
+ }
+ function combineTwoEventUis(item0, item1) {
+ return {
+ display: item1.display != null ? item1.display : item0.display,
+ startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
+ durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
+ constraints: item0.constraints.concat(item1.constraints),
+ overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
+ allows: item0.allows.concat(item1.allows),
+ backgroundColor: item1.backgroundColor || item0.backgroundColor,
+ borderColor: item1.borderColor || item0.borderColor,
+ textColor: item1.textColor || item0.textColor,
+ classNames: item0.classNames.concat(item1.classNames),
+ };
+ }
+
+ const EVENT_NON_DATE_REFINERS = {
+ id: String,
+ groupId: String,
+ title: String,
+ url: String,
+ interactive: Boolean,
+ };
+ const EVENT_DATE_REFINERS = {
+ start: identity,
+ end: identity,
+ date: identity,
+ allDay: Boolean,
+ };
+ const EVENT_REFINERS = Object.assign(Object.assign(Object.assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity });
+ function parseEvent(raw, eventSource, context, allowOpenRange, refiners = buildEventRefiners(context)) {
+ let { refined, extra } = refineEventDef(raw, context, refiners);
+ let defaultAllDay = computeIsDefaultAllDay(eventSource, context);
+ let recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes);
+ if (recurringRes) {
+ let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context);
+ def.recurringDef = {
+ typeId: recurringRes.typeId,
+ typeData: recurringRes.typeData,
+ duration: recurringRes.duration,
+ };
+ return { def, instance: null };
+ }
+ let singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange);
+ if (singleRes) {
+ let def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context);
+ let instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
+ return { def, instance };
+ }
+ return null;
+ }
+ function refineEventDef(raw, context, refiners = buildEventRefiners(context)) {
+ return refineProps(raw, refiners);
+ }
+ function buildEventRefiners(context) {
+ return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners);
+ }
+ /*
+ Will NOT populate extendedProps with the leftover properties.
+ Will NOT populate date-related props.
+ */
+ function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) {
+ let def = {
+ title: refined.title || '',
+ groupId: refined.groupId || '',
+ publicId: refined.id || '',
+ url: refined.url || '',
+ recurringDef: null,
+ defId: guid(),
+ sourceId,
+ allDay,
+ hasEnd,
+ interactive: refined.interactive,
+ ui: createEventUi(refined, context),
+ extendedProps: Object.assign(Object.assign({}, (refined.extendedProps || {})), extra),
+ };
+ for (let memberAdder of context.pluginHooks.eventDefMemberAdders) {
+ Object.assign(def, memberAdder(refined));
+ }
+ // help out EventImpl from having user modify props
+ Object.freeze(def.ui.classNames);
+ Object.freeze(def.extendedProps);
+ return def;
+ }
+ function parseSingle(refined, defaultAllDay, context, allowOpenRange) {
+ let { allDay } = refined;
+ let startMeta;
+ let startMarker = null;
+ let hasEnd = false;
+ let endMeta;
+ let endMarker = null;
+ let startInput = refined.start != null ? refined.start : refined.date;
+ startMeta = context.dateEnv.createMarkerMeta(startInput);
+ if (startMeta) {
+ startMarker = startMeta.marker;
+ }
+ else if (!allowOpenRange) {
+ return null;
+ }
+ if (refined.end != null) {
+ endMeta = context.dateEnv.createMarkerMeta(refined.end);
+ }
+ if (allDay == null) {
+ if (defaultAllDay != null) {
+ allDay = defaultAllDay;
+ }
+ else {
+ // fall back to the date props LAST
+ allDay = (!startMeta || startMeta.isTimeUnspecified) &&
+ (!endMeta || endMeta.isTimeUnspecified);
+ }
+ }
+ if (allDay && startMarker) {
+ startMarker = startOfDay(startMarker);
+ }
+ if (endMeta) {
+ endMarker = endMeta.marker;
+ if (allDay) {
+ endMarker = startOfDay(endMarker);
+ }
+ if (startMarker && endMarker <= startMarker) {
+ endMarker = null;
+ }
+ }
+ if (endMarker) {
+ hasEnd = true;
+ }
+ else if (!allowOpenRange) {
+ hasEnd = context.options.forceEventDuration || false;
+ endMarker = context.dateEnv.add(startMarker, allDay ?
+ context.options.defaultAllDayEventDuration :
+ context.options.defaultTimedEventDuration);
+ }
+ return {
+ allDay,
+ hasEnd,
+ range: { start: startMarker, end: endMarker },
+ forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
+ forcedEndTzo: endMeta ? endMeta.forcedTzo : null,
+ };
+ }
+ function computeIsDefaultAllDay(eventSource, context) {
+ let res = null;
+ if (eventSource) {
+ res = eventSource.defaultAllDay;
+ }
+ if (res == null) {
+ res = context.options.defaultAllDay;
+ }
+ return res;
+ }
+
+ const DEF_DEFAULTS = {
+ startTime: '09:00',
+ endTime: '17:00',
+ daysOfWeek: [1, 2, 3, 4, 5],
+ display: 'inverse-background',
+ classNames: 'fc-non-business',
+ groupId: '_businessHours', // so multiple defs get grouped
+ };
+ /*
+ TODO: pass around as EventDefHash!!!
+ */
+ function parseBusinessHours(input, context) {
+ return parseEvents(refineInputs(input), null, context);
+ }
+ function refineInputs(input) {
+ let rawDefs;
+ if (input === true) {
+ rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
+ }
+ else if (Array.isArray(input)) {
+ // if specifying an array, every sub-definition NEEDS a day-of-week
+ rawDefs = input.filter((rawDef) => rawDef.daysOfWeek);
+ }
+ else if (typeof input === 'object' && input) { // non-null object
+ rawDefs = [input];
+ }
+ else { // is probably false
+ rawDefs = [];
+ }
+ rawDefs = rawDefs.map((rawDef) => (Object.assign(Object.assign({}, DEF_DEFAULTS), rawDef)));
+ return rawDefs;
+ }
+
+ /* Date stuff that doesn't belong in datelib core
+ ----------------------------------------------------------------------------------------------------------------------*/
+ // given a timed range, computes an all-day range that has the same exact duration,
+ // but whose start time is aligned with the start of the day.
+ function computeAlignedDayRange(timedRange) {
+ let dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
+ let start = startOfDay(timedRange.start);
+ let end = addDays(start, dayCnt);
+ return { start, end };
+ }
+ // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
+ // TODO: give nextDayThreshold a default arg
+ function computeVisibleDayRange(timedRange, nextDayThreshold = createDuration(0)) {
+ let startDay = null;
+ let endDay = null;
+ if (timedRange.end) {
+ endDay = startOfDay(timedRange.end);
+ let endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
+ // If the end time is actually inclusively part of the next day and is equal to or
+ // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
+ // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
+ if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
+ endDay = addDays(endDay, 1);
+ }
+ }
+ if (timedRange.start) {
+ startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
+ // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
+ if (endDay && endDay <= startDay) {
+ endDay = addDays(startDay, 1);
+ }
+ }
+ return { start: startDay, end: endDay };
+ }
+ // spans from one day into another?
+ function isMultiDayRange(range) {
+ let visibleRange = computeVisibleDayRange(range);
+ return diffDays(visibleRange.start, visibleRange.end) > 1;
+ }
+ function diffDates(date0, date1, dateEnv, largeUnit) {
+ if (largeUnit === 'year') {
+ return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
+ }
+ if (largeUnit === 'month') {
+ return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
+ }
+ return diffDayAndTime(date0, date1); // returns a duration
+ }
+
+ function pointInsideRect(point, rect) {
+ return point.left >= rect.left &&
+ point.left < rect.right &&
+ point.top >= rect.top &&
+ point.top < rect.bottom;
+ }
+ // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
+ function intersectRects(rect1, rect2) {
+ let res = {
+ left: Math.max(rect1.left, rect2.left),
+ right: Math.min(rect1.right, rect2.right),
+ top: Math.max(rect1.top, rect2.top),
+ bottom: Math.min(rect1.bottom, rect2.bottom),
+ };
+ if (res.left < res.right && res.top < res.bottom) {
+ return res;
+ }
+ return false;
+ }
+ function translateRect(rect, deltaX, deltaY) {
+ return {
+ left: rect.left + deltaX,
+ right: rect.right + deltaX,
+ top: rect.top + deltaY,
+ bottom: rect.bottom + deltaY,
+ };
+ }
+ // Returns a new point that will have been moved to reside within the given rectangle
+ function constrainPoint(point, rect) {
+ return {
+ left: Math.min(Math.max(point.left, rect.left), rect.right),
+ top: Math.min(Math.max(point.top, rect.top), rect.bottom),
+ };
+ }
+ // Returns a point that is the center of the given rectangle
+ function getRectCenter(rect) {
+ return {
+ left: (rect.left + rect.right) / 2,
+ top: (rect.top + rect.bottom) / 2,
+ };
+ }
+ // Subtracts point2's coordinates from point1's coordinates, returning a delta
+ function diffPoints(point1, point2) {
+ return {
+ left: point1.left - point2.left,
+ top: point1.top - point2.top,
+ };
+ }
+
+ let canVGrowWithinCell;
+ function getCanVGrowWithinCell() {
+ if (canVGrowWithinCell == null) {
+ canVGrowWithinCell = computeCanVGrowWithinCell();
+ }
+ return canVGrowWithinCell;
+ }
+ function computeCanVGrowWithinCell() {
+ // for SSR, because this function is call immediately at top-level
+ // TODO: just make this logic execute top-level, immediately, instead of doing lazily
+ if (typeof document === 'undefined') {
+ return true;
+ }
+ let el = document.createElement('div');
+ el.style.position = 'absolute';
+ el.style.top = '0px';
+ el.style.left = '0px';
+ el.innerHTML = '<table><tr><td><div></div></td></tr></table>';
+ el.querySelector('table').style.height = '100px';
+ el.querySelector('div').style.height = '100%';
+ document.body.appendChild(el);
+ let div = el.querySelector('div');
+ let possible = div.offsetHeight > 0;
+ document.body.removeChild(el);
+ return possible;
+ }
+
+ const EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
+ class Splitter {
+ constructor() {
+ this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
+ this.splitDateSelection = memoize(this._splitDateSpan);
+ this.splitEventStore = memoize(this._splitEventStore);
+ this.splitIndividualUi = memoize(this._splitIndividualUi);
+ this.splitEventDrag = memoize(this._splitInteraction);
+ this.splitEventResize = memoize(this._splitInteraction);
+ this.eventUiBuilders = {}; // TODO: typescript protection
+ }
+ splitProps(props) {
+ let keyInfos = this.getKeyInfo(props);
+ let defKeys = this.getKeysForEventDefs(props.eventStore);
+ let dateSelections = this.splitDateSelection(props.dateSelection);
+ let individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
+ let eventStores = this.splitEventStore(props.eventStore, defKeys);
+ let eventDrags = this.splitEventDrag(props.eventDrag);
+ let eventResizes = this.splitEventResize(props.eventResize);
+ let splitProps = {};
+ this.eventUiBuilders = mapHash(keyInfos, (info, key) => this.eventUiBuilders[key] || memoize(buildEventUiForKey));
+ for (let key in keyInfos) {
+ let keyInfo = keyInfos[key];
+ let eventStore = eventStores[key] || EMPTY_EVENT_STORE;
+ let buildEventUi = this.eventUiBuilders[key];
+ splitProps[key] = {
+ businessHours: keyInfo.businessHours || props.businessHours,
+ dateSelection: dateSelections[key] || null,
+ eventStore,
+ eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
+ eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
+ eventDrag: eventDrags[key] || null,
+ eventResize: eventResizes[key] || null,
+ };
+ }
+ return splitProps;
+ }
+ _splitDateSpan(dateSpan) {
+ let dateSpans = {};
+ if (dateSpan) {
+ let keys = this.getKeysForDateSpan(dateSpan);
+ for (let key of keys) {
+ dateSpans[key] = dateSpan;
+ }
+ }
+ return dateSpans;
+ }
+ _getKeysForEventDefs(eventStore) {
+ return mapHash(eventStore.defs, (eventDef) => this.getKeysForEventDef(eventDef));
+ }
+ _splitEventStore(eventStore, defKeys) {
+ let { defs, instances } = eventStore;
+ let splitStores = {};
+ for (let defId in defs) {
+ for (let key of defKeys[defId]) {
+ if (!splitStores[key]) {
+ splitStores[key] = createEmptyEventStore();
+ }
+ splitStores[key].defs[defId] = defs[defId];
+ }
+ }
+ for (let instanceId in instances) {
+ let instance = instances[instanceId];
+ for (let key of defKeys[instance.defId]) {
+ if (splitStores[key]) { // must have already been created
+ splitStores[key].instances[instanceId] = instance;
+ }
+ }
+ }
+ return splitStores;
+ }
+ _splitIndividualUi(eventUiBases, defKeys) {
+ let splitHashes = {};
+ for (let defId in eventUiBases) {
+ if (defId) { // not the '' key
+ for (let key of defKeys[defId]) {
+ if (!splitHashes[key]) {
+ splitHashes[key] = {};
+ }
+ splitHashes[key][defId] = eventUiBases[defId];
+ }
+ }
+ }
+ return splitHashes;
+ }
+ _splitInteraction(interaction) {
+ let splitStates = {};
+ if (interaction) {
+ let affectedStores = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents));
+ // can't rely on defKeys because event data is mutated
+ let mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
+ let mutatedStores = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
+ let populate = (key) => {
+ if (!splitStates[key]) {
+ splitStates[key] = {
+ affectedEvents: affectedStores[key] || EMPTY_EVENT_STORE,
+ mutatedEvents: mutatedStores[key] || EMPTY_EVENT_STORE,
+ isEvent: interaction.isEvent,
+ };
+ }
+ };
+ for (let key in affectedStores) {
+ populate(key);
+ }
+ for (let key in mutatedStores) {
+ populate(key);
+ }
+ }
+ return splitStates;
+ }
+ }
+ function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
+ let baseParts = [];
+ if (allUi) {
+ baseParts.push(allUi);
+ }
+ if (eventUiForKey) {
+ baseParts.push(eventUiForKey);
+ }
+ let stuff = {
+ '': combineEventUis(baseParts),
+ };
+ if (individualUi) {
+ Object.assign(stuff, individualUi);
+ }
+ return stuff;
+ }
+
+ function parseRange(input, dateEnv) {
+ let start = null;
+ let end = null;
+ if (input.start) {
+ start = dateEnv.createMarker(input.start);
+ }
+ if (input.end) {
+ end = dateEnv.createMarker(input.end);
+ }
+ if (!start && !end) {
+ return null;
+ }
+ if (start && end && end < start) {
+ return null;
+ }
+ return { start, end };
+ }
+ // SIDE-EFFECT: will mutate ranges.
+ // Will return a new array result.
+ function invertRanges(ranges, constraintRange) {
+ let invertedRanges = [];
+ let { start } = constraintRange; // the end of the previous range. the start of the new range
+ let i;
+ let dateRange;
+ // ranges need to be in order. required for our date-walking algorithm
+ ranges.sort(compareRanges);
+ for (i = 0; i < ranges.length; i += 1) {
+ dateRange = ranges[i];
+ // add the span of time before the event (if there is any)
+ if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
+ invertedRanges.push({ start, end: dateRange.start });
+ }
+ if (dateRange.end > start) {
+ start = dateRange.end;
+ }
+ }
+ // add the span of time after the last event (if there is any)
+ if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
+ invertedRanges.push({ start, end: constraintRange.end });
+ }
+ return invertedRanges;
+ }
+ function compareRanges(range0, range1) {
+ return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
+ }
+ function intersectRanges(range0, range1) {
+ let { start, end } = range0;
+ let newRange = null;
+ if (range1.start !== null) {
+ if (start === null) {
+ start = range1.start;
+ }
+ else {
+ start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
+ }
+ }
+ if (range1.end != null) {
+ if (end === null) {
+ end = range1.end;
+ }
+ else {
+ end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
+ }
+ }
+ if (start === null || end === null || start < end) {
+ newRange = { start, end };
+ }
+ return newRange;
+ }
+ function rangesEqual(range0, range1) {
+ return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
+ (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
+ }
+ function rangesIntersect(range0, range1) {
+ return (range0.end === null || range1.start === null || range0.end > range1.start) &&
+ (range0.start === null || range1.end === null || range0.start < range1.end);
+ }
+ function rangeContainsRange(outerRange, innerRange) {
+ return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
+ (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
+ }
+ function rangeContainsMarker(range, date) {
+ return (range.start === null || date >= range.start) &&
+ (range.end === null || date < range.end);
+ }
+ // If the given date is not within the given range, move it inside.
+ // (If it's past the end, make it one millisecond before the end).
+ function constrainMarkerToRange(date, range) {
+ if (range.start != null && date < range.start) {
+ return range.start;
+ }
+ if (range.end != null && date >= range.end) {
+ return new Date(range.end.valueOf() - 1);
+ }
+ return date;
+ }
+
+ function getDateMeta(date, todayRange, nowDate, dateProfile) {
+ return {
+ dow: date.getUTCDay(),
+ isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
+ isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
+ isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
+ isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false),
+ isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ? (date >= todayRange.end) : false),
+ };
+ }
+ function getDayClassNames(meta, theme) {
+ let classNames = [
+ 'fc-day',
+ `fc-day-${DAY_IDS[meta.dow]}`,
+ ];
+ if (meta.isDisabled) {
+ classNames.push('fc-day-disabled');
+ }
+ else {
+ if (meta.isToday) {
+ classNames.push('fc-day-today');
+ classNames.push(theme.getClass('today'));
+ }
+ if (meta.isPast) {
+ classNames.push('fc-day-past');
+ }
+ if (meta.isFuture) {
+ classNames.push('fc-day-future');
+ }
+ if (meta.isOther) {
+ classNames.push('fc-day-other');
+ }
+ }
+ return classNames;
+ }
+ function getSlotClassNames(meta, theme) {
+ let classNames = [
+ 'fc-slot',
+ `fc-slot-${DAY_IDS[meta.dow]}`,
+ ];
+ if (meta.isDisabled) {
+ classNames.push('fc-slot-disabled');
+ }
+ else {
+ if (meta.isToday) {
+ classNames.push('fc-slot-today');
+ classNames.push(theme.getClass('today'));
+ }
+ if (meta.isPast) {
+ classNames.push('fc-slot-past');
+ }
+ if (meta.isFuture) {
+ classNames.push('fc-slot-future');
+ }
+ }
+ return classNames;
+ }
+
+ const DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' });
+ const WEEK_FORMAT = createFormatter({ week: 'long' });
+ function buildNavLinkAttrs(context, dateMarker, viewType = 'day', isTabbable = true) {
+ const { dateEnv, options, calendarApi } = context;
+ let dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT);
+ if (options.navLinks) {
+ let zonedDate = dateEnv.toDate(dateMarker);
+ const handleInteraction = (ev) => {
+ let customAction = viewType === 'day' ? options.navLinkDayClick :
+ viewType === 'week' ? options.navLinkWeekClick : null;
+ if (typeof customAction === 'function') {
+ customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev);
+ }
+ else {
+ if (typeof customAction === 'string') {
+ viewType = customAction;
+ }
+ calendarApi.zoomTo(dateMarker, viewType);
+ }
+ };
+ return Object.assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, (isTabbable
+ ? createAriaClickAttrs(handleInteraction)
+ : { onClick: handleInteraction }));
+ }
+ return { 'aria-label': dateStr };
+ }
+
+ let _isRtlScrollbarOnLeft = null;
+ function getIsRtlScrollbarOnLeft() {
+ if (_isRtlScrollbarOnLeft === null) {
+ _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
+ }
+ return _isRtlScrollbarOnLeft;
+ }
+ function computeIsRtlScrollbarOnLeft() {
+ let outerEl = document.createElement('div');
+ applyStyle(outerEl, {
+ position: 'absolute',
+ top: -1000,
+ left: 0,
+ border: 0,
+ padding: 0,
+ overflow: 'scroll',
+ direction: 'rtl',
+ });
+ outerEl.innerHTML = '<div></div>';
+ document.body.appendChild(outerEl);
+ let innerEl = outerEl.firstChild;
+ let res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
+ removeElement(outerEl);
+ return res;
+ }
+
+ let _scrollbarWidths;
+ function getScrollbarWidths() {
+ if (!_scrollbarWidths) {
+ _scrollbarWidths = computeScrollbarWidths();
+ }
+ return _scrollbarWidths;
+ }
+ function computeScrollbarWidths() {
+ let el = document.createElement('div');
+ el.style.overflow = 'scroll';
+ el.style.position = 'absolute';
+ el.style.top = '-9999px';
+ el.style.left = '-9999px';
+ document.body.appendChild(el);
+ let res = computeScrollbarWidthsForEl(el);
+ document.body.removeChild(el);
+ return res;
+ }
+ // WARNING: will include border
+ function computeScrollbarWidthsForEl(el) {
+ return {
+ x: el.offsetHeight - el.clientHeight,
+ y: el.offsetWidth - el.clientWidth,
+ };
+ }
+
+ function computeEdges(el, getPadding = false) {
+ let computedStyle = window.getComputedStyle(el);
+ let borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
+ let borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
+ let borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
+ let borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
+ let badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border!
+ let scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight;
+ let scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom;
+ let res = {
+ borderLeft,
+ borderRight,
+ borderTop,
+ borderBottom,
+ scrollbarBottom,
+ scrollbarLeft: 0,
+ scrollbarRight: 0,
+ };
+ if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
+ res.scrollbarLeft = scrollbarLeftRight;
+ }
+ else {
+ res.scrollbarRight = scrollbarLeftRight;
+ }
+ if (getPadding) {
+ res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
+ res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
+ res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
+ res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
+ }
+ return res;
+ }
+ function computeInnerRect(el, goWithinPadding = false, doFromWindowViewport) {
+ let outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el);
+ let edges = computeEdges(el, goWithinPadding);
+ let res = {
+ left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
+ right: outerRect.right - edges.borderRight - edges.scrollbarRight,
+ top: outerRect.top + edges.borderTop,
+ bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom,
+ };
+ if (goWithinPadding) {
+ res.left += edges.paddingLeft;
+ res.right -= edges.paddingRight;
+ res.top += edges.paddingTop;
+ res.bottom -= edges.paddingBottom;
+ }
+ return res;
+ }
+ function computeRect(el) {
+ let rect = el.getBoundingClientRect();
+ return {
+ left: rect.left + window.pageXOffset,
+ top: rect.top + window.pageYOffset,
+ right: rect.right + window.pageXOffset,
+ bottom: rect.bottom + window.pageYOffset,
+ };
+ }
+ function computeClippedClientRect(el) {
+ let clippingParents = getClippingParents(el);
+ let rect = el.getBoundingClientRect();
+ for (let clippingParent of clippingParents) {
+ let intersection = intersectRects(rect, clippingParent.getBoundingClientRect());
+ if (intersection) {
+ rect = intersection;
+ }
+ else {
+ return null;
+ }
+ }
+ return rect;
+ }
+ // does not return window
+ function getClippingParents(el) {
+ let parents = [];
+ while (el instanceof HTMLElement) { // will stop when gets to document or null
+ let computedStyle = window.getComputedStyle(el);
+ if (computedStyle.position === 'fixed') {
+ break;
+ }
+ if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
+ parents.push(el);
+ }
+ el = el.parentNode;
+ }
+ return parents;
+ }
+
+ /*
+ given a function that resolves a result asynchronously.
+ the function can either call passed-in success and failure callbacks,
+ or it can return a promise.
+ if you need to pass additional params to func, bind them first.
+ */
+ function unpromisify(func, normalizedSuccessCallback, normalizedFailureCallback) {
+ // guard against success/failure callbacks being called more than once
+ // and guard against a promise AND callback being used together.
+ let isResolved = false;
+ let wrappedSuccess = function (res) {
+ if (!isResolved) {
+ isResolved = true;
+ normalizedSuccessCallback(res);
+ }
+ };
+ let wrappedFailure = function (error) {
+ if (!isResolved) {
+ isResolved = true;
+ normalizedFailureCallback(error);
+ }
+ };
+ let res = func(wrappedSuccess, wrappedFailure);
+ if (res && typeof res.then === 'function') {
+ res.then(wrappedSuccess, wrappedFailure);
+ }
+ }
+
+ class Emitter {
+ constructor() {
+ this.handlers = {};
+ this.thisContext = null;
+ }
+ setThisContext(thisContext) {
+ this.thisContext = thisContext;
+ }
+ setOptions(options) {
+ this.options = options;
+ }
+ on(type, handler) {
+ addToHash(this.handlers, type, handler);
+ }
+ off(type, handler) {
+ removeFromHash(this.handlers, type, handler);
+ }
+ trigger(type, ...args) {
+ let attachedHandlers = this.handlers[type] || [];
+ let optionHandler = this.options && this.options[type];
+ let handlers = [].concat(optionHandler || [], attachedHandlers);
+ for (let handler of handlers) {
+ handler.apply(this.thisContext, args);
+ }
+ }
+ hasHandlers(type) {
+ return Boolean((this.handlers[type] && this.handlers[type].length) ||
+ (this.options && this.options[type]));
+ }
+ }
+ function addToHash(hash, type, handler) {
+ (hash[type] || (hash[type] = []))
+ .push(handler);
+ }
+ function removeFromHash(hash, type, handler) {
+ if (handler) {
+ if (hash[type]) {
+ hash[type] = hash[type].filter((func) => func !== handler);
+ }
+ }
+ else {
+ delete hash[type]; // remove all handler funcs for this type
+ }
+ }
+
+ /*
+ Records offset information for a set of elements, relative to an origin element.
+ Can record the left/right OR the top/bottom OR both.
+ Provides methods for querying the cache by position.
+ */
+ class PositionCache {
+ constructor(originEl, els, isHorizontal, isVertical) {
+ this.els = els;
+ let originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left
+ if (isHorizontal) {
+ this.buildElHorizontals(originClientRect.left);
+ }
+ if (isVertical) {
+ this.buildElVerticals(originClientRect.top);
+ }
+ }
+ // Populates the left/right internal coordinate arrays
+ buildElHorizontals(originClientLeft) {
+ let lefts = [];
+ let rights = [];
+ for (let el of this.els) {
+ let rect = el.getBoundingClientRect();
+ lefts.push(rect.left - originClientLeft);
+ rights.push(rect.right - originClientLeft);
+ }
+ this.lefts = lefts;
+ this.rights = rights;
+ }
+ // Populates the top/bottom internal coordinate arrays
+ buildElVerticals(originClientTop) {
+ let tops = [];
+ let bottoms = [];
+ for (let el of this.els) {
+ let rect = el.getBoundingClientRect();
+ tops.push(rect.top - originClientTop);
+ bottoms.push(rect.bottom - originClientTop);
+ }
+ this.tops = tops;
+ this.bottoms = bottoms;
+ }
+ // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
+ // If no intersection is made, returns undefined.
+ leftToIndex(leftPosition) {
+ let { lefts, rights } = this;
+ let len = lefts.length;
+ let i;
+ for (i = 0; i < len; i += 1) {
+ if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
+ return i;
+ }
+ }
+ return undefined; // TODO: better
+ }
+ // Given a top offset (from document top), returns the index of the el that it vertically intersects.
+ // If no intersection is made, returns undefined.
+ topToIndex(topPosition) {
+ let { tops, bottoms } = this;
+ let len = tops.length;
+ let i;
+ for (i = 0; i < len; i += 1) {
+ if (topPosition >= tops[i] && topPosition < bottoms[i]) {
+ return i;
+ }
+ }
+ return undefined; // TODO: better
+ }
+ // Gets the width of the element at the given index
+ getWidth(leftIndex) {
+ return this.rights[leftIndex] - this.lefts[leftIndex];
+ }
+ // Gets the height of the element at the given index
+ getHeight(topIndex) {
+ return this.bottoms[topIndex] - this.tops[topIndex];
+ }
+ similarTo(otherCache) {
+ return similarNumArrays(this.tops || [], otherCache.tops || []) &&
+ similarNumArrays(this.bottoms || [], otherCache.bottoms || []) &&
+ similarNumArrays(this.lefts || [], otherCache.lefts || []) &&
+ similarNumArrays(this.rights || [], otherCache.rights || []);
+ }
+ }
+ function similarNumArrays(a, b) {
+ const len = a.length;
+ if (len !== b.length) {
+ return false;
+ }
+ for (let i = 0; i < len; i++) {
+ if (Math.round(a[i]) !== Math.round(b[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /* eslint max-classes-per-file: "off" */
+ /*
+ An object for getting/setting scroll-related information for an element.
+ Internally, this is done very differently for window versus DOM element,
+ so this object serves as a common interface.
+ */
+ class ScrollController {
+ getMaxScrollTop() {
+ return this.getScrollHeight() - this.getClientHeight();
+ }
+ getMaxScrollLeft() {
+ return this.getScrollWidth() - this.getClientWidth();
+ }
+ canScrollVertically() {
+ return this.getMaxScrollTop() > 0;
+ }
+ canScrollHorizontally() {
+ return this.getMaxScrollLeft() > 0;
+ }
+ canScrollUp() {
+ return this.getScrollTop() > 0;
+ }
+ canScrollDown() {
+ return this.getScrollTop() < this.getMaxScrollTop();
+ }
+ canScrollLeft() {
+ return this.getScrollLeft() > 0;
+ }
+ canScrollRight() {
+ return this.getScrollLeft() < this.getMaxScrollLeft();
+ }
+ }
+ class ElementScrollController extends ScrollController {
+ constructor(el) {
+ super();
+ this.el = el;
+ }
+ getScrollTop() {
+ return this.el.scrollTop;
+ }
+ getScrollLeft() {
+ return this.el.scrollLeft;
+ }
+ setScrollTop(top) {
+ this.el.scrollTop = top;
+ }
+ setScrollLeft(left) {
+ this.el.scrollLeft = left;
+ }
+ getScrollWidth() {
+ return this.el.scrollWidth;
+ }
+ getScrollHeight() {
+ return this.el.scrollHeight;
+ }
+ getClientHeight() {
+ return this.el.clientHeight;
+ }
+ getClientWidth() {
+ return this.el.clientWidth;
+ }
+ }
+ class WindowScrollController extends ScrollController {
+ getScrollTop() {
+ return window.pageYOffset;
+ }
+ getScrollLeft() {
+ return window.pageXOffset;
+ }
+ setScrollTop(n) {
+ window.scroll(window.pageXOffset, n);
+ }
+ setScrollLeft(n) {
+ window.scroll(n, window.pageYOffset);
+ }
+ getScrollWidth() {
+ return document.documentElement.scrollWidth;
+ }
+ getScrollHeight() {
+ return document.documentElement.scrollHeight;
+ }
+ getClientHeight() {
+ return document.documentElement.clientHeight;
+ }
+ getClientWidth() {
+ return document.documentElement.clientWidth;
+ }
+ }
+
+ class Theme {
+ constructor(calendarOptions) {
+ if (this.iconOverrideOption) {
+ this.setIconOverride(calendarOptions[this.iconOverrideOption]);
+ }
+ }
+ setIconOverride(iconOverrideHash) {
+ let iconClassesCopy;
+ let buttonName;
+ if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
+ iconClassesCopy = Object.assign({}, this.iconClasses);
+ for (buttonName in iconOverrideHash) {
+ iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
+ }
+ this.iconClasses = iconClassesCopy;
+ }
+ else if (iconOverrideHash === false) {
+ this.iconClasses = {};
+ }
+ }
+ applyIconOverridePrefix(className) {
+ let prefix = this.iconOverridePrefix;
+ if (prefix && className.indexOf(prefix) !== 0) { // if not already present
+ className = prefix + className;
+ }
+ return className;
+ }
+ getClass(key) {
+ return this.classes[key] || '';
+ }
+ getIconClass(buttonName, isRtl) {
+ let className;
+ if (isRtl && this.rtlIconClasses) {
+ className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName];
+ }
+ else {
+ className = this.iconClasses[buttonName];
+ }
+ if (className) {
+ return `${this.baseIconClass} ${className}`;
+ }
+ return '';
+ }
+ getCustomButtonIconClass(customButtonProps) {
+ let className;
+ if (this.iconOverrideCustomButtonOption) {
+ className = customButtonProps[this.iconOverrideCustomButtonOption];
+ if (className) {
+ return `${this.baseIconClass} ${this.applyIconOverridePrefix(className)}`;
+ }
+ }
+ return '';
+ }
+ }
+ Theme.prototype.classes = {};
+ Theme.prototype.iconClasses = {};
+ Theme.prototype.baseIconClass = '';
+ Theme.prototype.iconOverridePrefix = '';
+
+ var n,l$1,u$1,i$1,t,o,r$1,f$1={},e$1=[],c$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(n,l){for(var u in l)n[u]=l[u];return n}function a$1(n){var l=n.parentNode;l&&l.removeChild(n);}function h(l,u,i){var t,o,r,f={};for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return v$1(l,f,t,o,null)}function v$1(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u$1:r};return null==r&&null!=l$1.vnode&&l$1.vnode(f),f}function y(){return {current:null}}function p(n){return n.children}function d(n,l){this.props=n,this.context=l;}function _(n,l){if(null==l)return n.__?_(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return "function"==typeof n.type?_(n):null}function k$1(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k$1(n)}}function b$1(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g$2.__r++||o!==l$1.debounceRendering)&&((o=l$1.debounceRendering)||setTimeout)(g$2);}function g$2(){for(var n;g$2.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=s({},t)).__v=t.__v+1,j$2(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?_(t):o,t.__h),z$1(u,t),t.__e!=o&&k$1(t)));});}function w$2(n,l,u,i,t,o,r,c,s,a){var h,y,d,k,b,g,w,x=i&&i.__k||e$1,C=x.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(k=u.__k[h]=null==(k=l[h])||"boolean"==typeof k?null:"string"==typeof k||"number"==typeof k||"bigint"==typeof k?v$1(null,k,null,null,k):Array.isArray(k)?v$1(p,{children:k},null,null,null):k.__b>0?v$1(k.type,k.props,k.key,k.ref?k.ref:null,k.__v):k)){if(k.__=u,k.__b=u.__b+1,null===(d=x[h])||d&&k.key==d.key&&k.type===d.type)x[h]=void 0;else for(y=0;y<C;y++){if((d=x[y])&&k.key==d.key&&k.type===d.type){x[y]=void 0;break}d=null;}j$2(n,k,d=d||f$1,t,o,r,c,s,a),b=k.__e,(y=k.ref)&&d.ref!=y&&(w||(w=[]),d.ref&&w.push(d.ref,null,k),w.push(y,k.__c||b,k)),null!=b?(null==g&&(g=b),"function"==typeof k.type&&k.__k===d.__k?k.__d=s=m$1(k,s,n):s=A(n,k,d,x,b,s),"function"==typeof u.type&&(u.__d=s)):s&&d.__e==s&&s.parentNode!=n&&(s=_(d));}for(u.__e=g,h=C;h--;)null!=x[h]&&N(x[h],x[h]);if(w)for(h=0;h<w.length;h++)M(w[h],w[++h],w[++h]);}function m$1(n,l,u){for(var i,t=n.__k,o=0;t&&o<t.length;o++)(i=t[o])&&(i.__=n,l="function"==typeof i.type?m$1(i,l,u):A(u,i,i,t,i.__e,l));return l}function x$1(n,l){return l=l||[],null==n||"boolean"==typeof n||(Array.isArray(n)?n.some(function(n){x$1(n,l);}):l.push(n)),l}function A(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else {for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=1)if(f==t)break n;n.insertBefore(t,o),r=o;}return void 0!==r?r:t.nextSibling}function C$1(n,l,u,i,t){var o;for(o in u)"children"===o||"key"===o||o in l||H$1(n,o,null,u[o],i);for(o in l)t&&"function"!=typeof l[o]||"children"===o||"key"===o||"value"===o||"checked"===o||u[o]===l[o]||H$1(n,o,l[o],u[o],i);}function $$1(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]=null==u?"":"number"!=typeof u||c$1.test(l)?u:u+"px";}function H$1(n,l,u,i,t){var o;n:if("style"===l)if("string"==typeof u)n.style.cssText=u;else {if("string"==typeof i&&(n.style.cssText=i=""),i)for(l in i)u&&l in u||$$1(n.style,l,"");if(u)for(l in u)i&&u[l]===i[l]||$$1(n.style,l,u[l]);}else if("o"===l[0]&&"n"===l[1])o=l!==(l=l.replace(/Capture$/,"")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T$1:I$1,o):n.removeEventListener(l,o?T$1:I$1,o);else if("dangerouslySetInnerHTML"!==l){if(t)l=l.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("href"!==l&&"list"!==l&&"form"!==l&&"tabIndex"!==l&&"download"!==l&&l in n)try{n[l]=null==u?"":u;break n}catch(n){}"function"==typeof u||(null==u||!1===u&&-1==l.indexOf("-")?n.removeAttribute(l):n.setAttribute(l,u));}}function I$1(n){this.l[n.type+!1](l$1.event?l$1.event(n):n);}function T$1(n){this.l[n.type+!0](l$1.event?l$1.event(n):n);}function j$2(n,u,i,t,o,r,f,e,c){var a,h,v,y,_,k,b,g,m,x,A,C,$,H,I,T=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(a=l$1.__b)&&a(u);try{n:if("function"==typeof T){if(g=u.props,m=(a=T.contextType)&&t[a.__c],x=a?m?m.props.value:a.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:("prototype"in T&&T.prototype.render?u.__c=h=new T(g,x):(u.__c=h=new d(g,x),h.constructor=T,h.render=O),m&&m.sub(h),h.props=g,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[],h._sb=[]),null==h.__s&&(h.__s=h.state),null!=T.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=s({},h.__s)),s(h.__s,T.getDerivedStateFromProps(g,h.__s))),y=h.props,_=h.state,v)null==T.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else {if(null==T.getDerivedStateFromProps&&g!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(g,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(g,h.__s,x)||u.__v===i.__v){for(h.props=g,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u);}),A=0;A<h._sb.length;A++)h.__h.push(h._sb[A]);h._sb=[],h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(g,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,_,k);});}if(h.context=x,h.props=g,h.__v=u,h.__P=n,C=l$1.__r,$=0,"prototype"in T&&T.prototype.render){for(h.state=h.__s,h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[];}else do{h.__d=!1,C&&C(u),a=h.render(h.props,h.state,h.context),h.state=h.__s;}while(h.__d&&++$<25);h.state=h.__s,null!=h.getChildContext&&(t=s(s({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,_)),I=null!=a&&a.type===p&&null==a.key?a.props.children:a,w$2(n,Array.isArray(I)?I:[I],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1;}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L$1(i.__e,u,i,t,o,r,f,c);(a=l$1.diffed)&&a(u);}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l$1.__e(n,u,i);}}function z$1(n,u){l$1.__c&&l$1.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u);});}catch(n){l$1.__e(n,u.__v);}});}function L$1(l,u,i,t,o,r,e,c){var s,h,v,y=i.props,p=u.props,d=u.type,k=0;if("svg"===d&&(o=!0),null!=r)for(;k<r.length;k++)if((s=r[k])&&"setAttribute"in s==!!d&&(d?s.localName===d:3===s.nodeType)){l=s,r[k]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS("http://www.w3.org/2000/svg",d):document.createElement(d,p.is&&p),r=null,c=!1;}if(null===d)y===p||c&&l.data===p||(l.data=p);else {if(r=r&&n.call(l.childNodes),h=(y=i.props||f$1).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},k=0;k<l.attributes.length;k++)y[l.attributes[k].name]=l.attributes[k].value;(v||h)&&(v&&(h&&v.__html==h.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||""));}if(C$1(l,p,y,o,c),v)u.__k=[];else if(k=u.props.children,w$2(l,Array.isArray(k)?k:[k],u,i,t,o&&"foreignObject"!==d,r,e,r?r[0]:i.__k&&_(i,0),c),null!=r)for(k=r.length;k--;)null!=r[k]&&a$1(r[k]);c||("value"in p&&void 0!==(k=p.value)&&(k!==l.value||"progress"===d&&!k||"option"===d&&k!==y.value)&&H$1(l,"value",k,y.value,!1),"checked"in p&&void 0!==(k=p.checked)&&k!==l.checked&&H$1(l,"checked",k,y.checked,!1));}return l}function M(n,u,i){try{"function"==typeof n?n(u):n.current=u;}catch(n){l$1.__e(n,i);}}function N(n,u,i){var t,o;if(l$1.unmount&&l$1.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(n){l$1.__e(n,u);}t.base=t.__P=null,n.__c=void 0;}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,i||"function"!=typeof n.type);i||null==n.__e||a$1(n.__e),n.__=n.__e=n.__d=void 0;}function O(n,l,u){return this.constructor(n,u)}function P$1(u,i,t){var o,r,e;l$1.__&&l$1.__(u,i),r=(o="function"==typeof t)?null:t&&t.__k||i.__k,e=[],j$2(i,u=(!o&&t||i).__k=h(p,null,[u]),r||f$1,f$1,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,e,!o&&t?t:r?r.__e:i.firstChild,o),z$1(e,u);}function S(n,l){P$1(n,l,S);}function q(l,u,i){var t,o,r,f=s({},l.props);for(r in u)"key"==r?t=u[r]:"ref"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),v$1(l.type,f,t||l.key,o||l.ref,null)}function B$1(n,l){var u={__c:l="__cC"+r$1++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(b$1);},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=e$1.slice,l$1={__e:function(n,l,u,i){for(var t,o,r;l=l.__;)if((t=l.__c)&&!t.__)try{if((o=t.constructor)&&null!=o.getDerivedStateFromError&&(t.setState(o.getDerivedStateFromError(n)),r=t.__d),null!=t.componentDidCatch&&(t.componentDidCatch(n,i||{}),r=t.__d),r)return t.__E=t}catch(l){n=l;}throw n}},u$1=0,i$1=function(n){return null!=n&&void 0===n.constructor},d.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=s({},this.state),"function"==typeof n&&(n=n(s({},u),this.props)),n&&s(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),b$1(this));},d.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),b$1(this));},d.prototype.render=p,t=[],g$2.__r=0,r$1=0;
+
+ var r,u,i,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function b(){for(var t;t=f.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(k),t.__H.__h.forEach(w$1),t.__H.__h=[];}catch(r){t.__H.__h=[],l$1.__e(r,t.__v);}}l$1.__b=function(n){r=null,e&&e(n);},l$1.__r=function(n){a&&a(n);var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0;})):(i.__h.forEach(k),i.__h.forEach(w$1),i.__h=[])),u=r;},l$1.diffed=function(t){v&&v(t);var o=t.__c;o&&o.__H&&(o.__H.__h.length&&(1!==f.push(o)&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),o.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c;})),u=r=null;},l$1.__c=function(t,r){r.some(function(t){try{t.__h.forEach(k),t.__h=t.__h.filter(function(n){return !n.__||w$1(n)});}catch(u){r.some(function(n){n.__h&&(n.__h=[]);}),r=[],l$1.__e(u,t.__v);}}),l&&l(t,r);},l$1.unmount=function(t){m&&m(t);var r,u=t.__c;u&&u.__H&&(u.__H.__.forEach(function(n){try{k(n);}catch(n){r=n;}}),u.__H=void 0,r&&l$1.__e(r,u.__v));};var g$1="function"==typeof requestAnimationFrame;function j$1(n){var t,r=function(){clearTimeout(u),g$1&&cancelAnimationFrame(t),setTimeout(n);},u=setTimeout(r,100);g$1&&(t=requestAnimationFrame(r));}function k(n){var t=r,u=n.__c;"function"==typeof u&&(n.__c=void 0,u()),r=t;}function w$1(n){var t=r;n.__c=n.__(),r=t;}
+
+ function g(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if("__source"!==e&&!(e in t))return !0;for(var r in t)if("__source"!==r&&n[r]!==t[r])return !0;return !1}function w(n){this.props=n;}(w.prototype=new d).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var x=l$1.__b;l$1.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),x&&x(n);};var T=l$1.__e;l$1.__e=function(n,t,e,r){if(n.then)for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),u.__c(n,t);T(n,t,e,r);};var I=l$1.unmount;function L(n,t,e){return n&&(n.__c&&n.__c.__H&&(n.__c.__H.__.forEach(function(n){"function"==typeof n.__c&&n.__c();}),n.__c.__H=null),null!=(n=g({},n)).__c&&(n.__c.__P===e&&(n.__c.__P=t),n.__c=null),n.__k=n.__k&&n.__k.map(function(n){return L(n,t,e)})),n}function U(n,t,e){return n&&(n.__v=null,n.__k=n.__k&&n.__k.map(function(n){return U(n,t,e)}),n.__c&&n.__c.__P===t&&(n.__e&&e.insertBefore(n.__e,n.__d),n.__c.__e=!0,n.__c.__P=e)),n}function D(){this.__u=0,this.t=null,this.__b=null;}function F(n){var t=n.__.__c;return t&&t.__a&&t.__a(n)}function V(){this.u=null,this.o=null;}l$1.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),I&&I(n);},(D.prototype=new d).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=F(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l());};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__a){var n=r.state.__a;r.__v.__k[0]=U(n,n.__c.__P,n.__c.__O);}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate();}},c=!0===t.__h;r.__u++||c||r.setState({__a:r.__b=r.__v.__k[0]}),n.then(i,i);},D.prototype.componentWillUnmount=function(){this.t=[];},D.prototype.render=function(n,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),o=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,r,o.__O=o.__P);}this.__b=null;}var i=e.__a&&h(p,null,n.fallback);return i&&(i.__h=null),[h(p,null,e.__a?null:n.children),i]};var W=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&("t"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]<e[0])break;n.u=e=e[2];}};function P(n){return this.getChildContext=function(){return n.context},n.children}function $(n){var e=this,r=n.i;e.componentWillUnmount=function(){P$1(null,e.l),e.l=null,e.i=null;},e.i&&e.i!==r&&e.componentWillUnmount(),n.__v?(e.l||(e.i=r,e.l={nodeType:1,parentNode:r,childNodes:[],appendChild:function(n){this.childNodes.push(n),e.i.appendChild(n);},insertBefore:function(n,t){this.childNodes.push(n),e.i.appendChild(n);},removeChild:function(n){this.childNodes.splice(this.childNodes.indexOf(n)>>>1,1),e.i.removeChild(n);}}),P$1(h(P,{context:e.context},n.__v),e.l)):e.l&&e.componentWillUnmount();}function j(n,e){var r=h($,{__v:n,i:e});return r.containerInfo=e,r}(V.prototype=new d).__a=function(n){var t=this,e=F(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),W(t,n,r)):u();};e?e(o):o();}},V.prototype.render=function(n){this.u=null,this.o=new Map;var t=x$1(n.children);n.revealOrder&&"b"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){W(n,e,t);});};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,B=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,H="undefined"!=typeof document,Z=function(n){return ("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};d.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(d.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(n){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:n});}});});var G=l$1.event;function J(){}function K(){return this.cancelBubble}function Q(){return this.defaultPrevented}l$1.event=function(n){return G&&(n=G(n)),n.persist=J,n.isPropagationStopped=K,n.isDefaultPrevented=Q,n.nativeEvent=n};var nn={configurable:!0,get:function(){return this.class}},tn=l$1.vnode;l$1.vnode=function(n){var t=n.type,e=n.props,u=e;if("string"==typeof t){var o=-1===t.indexOf("-");for(var i in u={},e){var l=e[i];H&&"children"===i&&"noscript"===t||"value"===i&&"defaultValue"in e&&null==l||("defaultValue"===i&&"value"in e&&null==e.value?i="value":"download"===i&&!0===l?l="":/ondoubleclick/i.test(i)?i="ondblclick":/^onchange(textarea|input)/i.test(i+t)&&!Z(e.type)?i="oninput":/^onfocus$/i.test(i)?i="onfocusin":/^onblur$/i.test(i)?i="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i)?i=i.toLowerCase():o&&B.test(i)?i=i.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===l&&(l=void 0),/^oninput$/i.test(i)&&(i=i.toLowerCase(),u[i]&&(i="oninputCapture")),u[i]=l);}"select"==t&&u.multiple&&Array.isArray(u.value)&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=-1!=u.value.indexOf(n.props.value);})),"select"==t&&null!=u.defaultValue&&(u.value=x$1(e.children).forEach(function(n){n.props.selected=u.multiple?-1!=u.defaultValue.indexOf(n.props.value):u.defaultValue==n.props.value;})),n.props=u,e.class!=e.className&&(nn.enumerable="className"in e,null!=e.className&&(u.class=e.className),Object.defineProperty(u,"className",nn));}n.$$typeof=z,tn&&tn(n);};var en=l$1.__r;l$1.__r=function(n){en&&en(n),n.__c;};
+
+ /*
+ NOTE: this can be a public API, especially createElement for hooks.
+ See examples/typescript-scheduler/src/index.ts
+ */
+ function flushSync(runBeforeFlush) {
+ runBeforeFlush();
+ let oldDebounceRendering = l$1.debounceRendering; // orig
+ let callbackQ = [];
+ function execCallbackSync(callback) {
+ callbackQ.push(callback);
+ }
+ l$1.debounceRendering = execCallbackSync;
+ P$1(h(FakeComponent, {}), document.createElement('div'));
+ while (callbackQ.length) {
+ callbackQ.shift()();
+ }
+ l$1.debounceRendering = oldDebounceRendering;
+ }
+ class FakeComponent extends d {
+ render() { return h('div', {}); }
+ componentDidMount() { this.setState({}); }
+ }
+ // TODO: use preact/compat instead?
+ function createContext(defaultValue) {
+ let ContextType = B$1(defaultValue);
+ let origProvider = ContextType.Provider;
+ ContextType.Provider = function () {
+ let isNew = !this.getChildContext;
+ let children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ if (isNew) {
+ let subs = [];
+ this.shouldComponentUpdate = (_props) => {
+ if (this.props.value !== _props.value) {
+ subs.forEach((c) => {
+ c.context = _props.value;
+ c.forceUpdate();
+ });
+ }
+ };
+ this.sub = (c) => {
+ subs.push(c);
+ let old = c.componentWillUnmount;
+ c.componentWillUnmount = () => {
+ subs.splice(subs.indexOf(c), 1);
+ old && old.call(c);
+ };
+ };
+ }
+ return children;
+ };
+ return ContextType;
+ }
+
+ var preact = {
+ __proto__: null,
+ flushSync: flushSync,
+ createContext: createContext,
+ createPortal: j,
+ Component: d,
+ Fragment: p,
+ cloneElement: q,
+ createElement: h,
+ createRef: y,
+ h: h,
+ hydrate: S,
+ get isValidElement () { return i$1; },
+ get options () { return l$1; },
+ render: P$1,
+ toChildArray: x$1
+ };
+
+ class ScrollResponder {
+ constructor(execFunc, emitter, scrollTime, scrollTimeReset) {
+ this.execFunc = execFunc;
+ this.emitter = emitter;
+ this.scrollTime = scrollTime;
+ this.scrollTimeReset = scrollTimeReset;
+ this.handleScrollRequest = (request) => {
+ this.queuedRequest = Object.assign({}, this.queuedRequest || {}, request);
+ this.drain();
+ };
+ emitter.on('_scrollRequest', this.handleScrollRequest);
+ this.fireInitialScroll();
+ }
+ detach() {
+ this.emitter.off('_scrollRequest', this.handleScrollRequest);
+ }
+ update(isDatesNew) {
+ if (isDatesNew && this.scrollTimeReset) {
+ this.fireInitialScroll(); // will drain
+ }
+ else {
+ this.drain();
+ }
+ }
+ fireInitialScroll() {
+ this.handleScrollRequest({
+ time: this.scrollTime,
+ });
+ }
+ drain() {
+ if (this.queuedRequest && this.execFunc(this.queuedRequest)) {
+ this.queuedRequest = null;
+ }
+ }
+ }
+
+ const ViewContextType = createContext({}); // for Components
+ function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
+ return {
+ dateEnv,
+ options: viewOptions,
+ pluginHooks,
+ emitter,
+ dispatch,
+ getCurrentData,
+ calendarApi,
+ viewSpec,
+ viewApi,
+ dateProfileGenerator,
+ theme,
+ isRtl: viewOptions.direction === 'rtl',
+ addResizeHandler(handler) {
+ emitter.on('_resize', handler);
+ },
+ removeResizeHandler(handler) {
+ emitter.off('_resize', handler);
+ },
+ createScrollResponder(execFunc) {
+ return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset);
+ },
+ registerInteractiveComponent,
+ unregisterInteractiveComponent,
+ };
+ }
+
+ /* eslint max-classes-per-file: off */
+ class PureComponent extends d {
+ shouldComponentUpdate(nextProps, nextState) {
+ if (this.debug) {
+ // eslint-disable-next-line no-console
+ console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state));
+ }
+ return !compareObjs(this.props, nextProps, this.propEquality) ||
+ !compareObjs(this.state, nextState, this.stateEquality);
+ }
+ // HACK for freakin' React StrictMode
+ safeSetState(newState) {
+ if (!compareObjs(this.state, Object.assign(Object.assign({}, this.state), newState), this.stateEquality)) {
+ this.setState(newState);
+ }
+ }
+ }
+ PureComponent.addPropsEquality = addPropsEquality;
+ PureComponent.addStateEquality = addStateEquality;
+ PureComponent.contextType = ViewContextType;
+ PureComponent.prototype.propEquality = {};
+ PureComponent.prototype.stateEquality = {};
+ class BaseComponent extends PureComponent {
+ }
+ BaseComponent.contextType = ViewContextType;
+ function addPropsEquality(propEquality) {
+ let hash = Object.create(this.prototype.propEquality);
+ Object.assign(hash, propEquality);
+ this.prototype.propEquality = hash;
+ }
+ function addStateEquality(stateEquality) {
+ let hash = Object.create(this.prototype.stateEquality);
+ Object.assign(hash, stateEquality);
+ this.prototype.stateEquality = hash;
+ }
+ // use other one
+ function setRef(ref, current) {
+ if (typeof ref === 'function') {
+ ref(current);
+ }
+ else if (ref) {
+ // see https://github.com/facebook/react/issues/13029
+ ref.current = current;
+ }
+ }
+
+ /*
+ an INTERACTABLE date component
+
+ PURPOSES:
+ - hook up to fg, fill, and mirror renderers
+ - interface for dragging and hits
+ */
+ class DateComponent extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.uid = guid();
+ }
+ // Hit System
+ // -----------------------------------------------------------------------------------------------------------------
+ prepareHits() {
+ }
+ queryHit(positionLeft, positionTop, elWidth, elHeight) {
+ return null; // this should be abstract
+ }
+ // Pointer Interaction Utils
+ // -----------------------------------------------------------------------------------------------------------------
+ isValidSegDownEl(el) {
+ return !this.props.eventDrag && // HACK
+ !this.props.eventResize && // HACK
+ !elementClosest(el, '.fc-event-mirror');
+ }
+ isValidDateDownEl(el) {
+ return !elementClosest(el, '.fc-event:not(.fc-bg-event)') &&
+ !elementClosest(el, '.fc-more-link') && // a "more.." link
+ !elementClosest(el, 'a[data-navlink]') && // a clickable nav link
+ !elementClosest(el, '.fc-popover'); // hack
+ }
+ }
+
+ function reduceCurrentDate(currentDate, action) {
+ switch (action.type) {
+ case 'CHANGE_DATE':
+ return action.dateMarker;
+ default:
+ return currentDate;
+ }
+ }
+ function getInitialDate(options, dateEnv) {
+ let initialDateInput = options.initialDate;
+ // compute the initial ambig-timezone date
+ if (initialDateInput != null) {
+ return dateEnv.createMarker(initialDateInput);
+ }
+ return getNow(options.now, dateEnv); // getNow already returns unzoned
+ }
+ function getNow(nowInput, dateEnv) {
+ if (typeof nowInput === 'function') {
+ nowInput = nowInput();
+ }
+ if (nowInput == null) {
+ return dateEnv.createNowMarker();
+ }
+ return dateEnv.createMarker(nowInput);
+ }
+
+ class DateProfileGenerator {
+ constructor(props) {
+ this.props = props;
+ this.nowDate = getNow(props.nowInput, props.dateEnv);
+ this.initHiddenDays();
+ }
+ /* Date Range Computation
+ ------------------------------------------------------------------------------------------------------------------*/
+ // Builds a structure with info about what the dates/ranges will be for the "prev" view.
+ buildPrev(currentDateProfile, currentDate, forceToValid) {
+ let { dateEnv } = this.props;
+ let prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+ currentDateProfile.dateIncrement);
+ return this.build(prevDate, -1, forceToValid);
+ }
+ // Builds a structure with info about what the dates/ranges will be for the "next" view.
+ buildNext(currentDateProfile, currentDate, forceToValid) {
+ let { dateEnv } = this.props;
+ let nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+ currentDateProfile.dateIncrement);
+ return this.build(nextDate, 1, forceToValid);
+ }
+ // Builds a structure holding dates/ranges for rendering around the given date.
+ // Optional direction param indicates whether the date is being incremented/decremented
+ // from its previous value. decremented = -1, incremented = 1 (default).
+ build(currentDate, direction, forceToValid = true) {
+ let { props } = this;
+ let validRange;
+ let currentInfo;
+ let isRangeAllDay;
+ let renderRange;
+ let activeRange;
+ let isValid;
+ validRange = this.buildValidRange();
+ validRange = this.trimHiddenDays(validRange);
+ if (forceToValid) {
+ currentDate = constrainMarkerToRange(currentDate, validRange);
+ }
+ currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
+ isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
+ renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
+ renderRange = this.trimHiddenDays(renderRange);
+ activeRange = renderRange;
+ if (!props.showNonCurrentDates) {
+ activeRange = intersectRanges(activeRange, currentInfo.range);
+ }
+ activeRange = this.adjustActiveRange(activeRange);
+ activeRange = intersectRanges(activeRange, validRange); // might return null
+ // it's invalid if the originally requested date is not contained,
+ // or if the range is completely outside of the valid range.
+ isValid = rangesIntersect(currentInfo.range, validRange);
+ return {
+ // constraint for where prev/next operations can go and where events can be dragged/resized to.
+ // an object with optional start and end properties.
+ validRange,
+ // range the view is formally responsible for.
+ // for example, a month view might have 1st-31st, excluding padded dates
+ currentRange: currentInfo.range,
+ // name of largest unit being displayed, like "month" or "week"
+ currentRangeUnit: currentInfo.unit,
+ isRangeAllDay,
+ // dates that display events and accept drag-n-drop
+ // will be `null` if no dates accept events
+ activeRange,
+ // date range with a rendered skeleton
+ // includes not-active days that need some sort of DOM
+ renderRange,
+ // Duration object that denotes the first visible time of any given day
+ slotMinTime: props.slotMinTime,
+ // Duration object that denotes the exclusive visible end time of any given day
+ slotMaxTime: props.slotMaxTime,
+ isValid,
+ // how far the current date will move for a prev/next operation
+ dateIncrement: this.buildDateIncrement(currentInfo.duration),
+ // pass a fallback (might be null) ^
+ };
+ }
+ // Builds an object with optional start/end properties.
+ // Indicates the minimum/maximum dates to display.
+ // not responsible for trimming hidden days.
+ buildValidRange() {
+ let input = this.props.validRangeInput;
+ let simpleInput = typeof input === 'function'
+ ? input.call(this.props.calendarApi, this.nowDate)
+ : input;
+ return this.refineRange(simpleInput) ||
+ { start: null, end: null }; // completely open-ended
+ }
+ // Builds a structure with info about the "current" range, the range that is
+ // highlighted as being the current month for example.
+ // See build() for a description of `direction`.
+ // Guaranteed to have `range` and `unit` properties. `duration` is optional.
+ buildCurrentRangeInfo(date, direction) {
+ let { props } = this;
+ let duration = null;
+ let unit = null;
+ let range = null;
+ let dayCount;
+ if (props.duration) {
+ duration = props.duration;
+ unit = props.durationUnit;
+ range = this.buildRangeFromDuration(date, direction, duration, unit);
+ }
+ else if ((dayCount = this.props.dayCount)) {
+ unit = 'day';
+ range = this.buildRangeFromDayCount(date, direction, dayCount);
+ }
+ else if ((range = this.buildCustomVisibleRange(date))) {
+ unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit;
+ }
+ else {
+ duration = this.getFallbackDuration();
+ unit = greatestDurationDenominator(duration).unit;
+ range = this.buildRangeFromDuration(date, direction, duration, unit);
+ }
+ return { duration, unit, range };
+ }
+ getFallbackDuration() {
+ return createDuration({ day: 1 });
+ }
+ // Returns a new activeRange to have time values (un-ambiguate)
+ // slotMinTime or slotMaxTime causes the range to expand.
+ adjustActiveRange(range) {
+ let { dateEnv, usesMinMaxTime, slotMinTime, slotMaxTime } = this.props;
+ let { start, end } = range;
+ if (usesMinMaxTime) {
+ // expand active range if slotMinTime is negative (why not when positive?)
+ if (asRoughDays(slotMinTime) < 0) {
+ start = startOfDay(start); // necessary?
+ start = dateEnv.add(start, slotMinTime);
+ }
+ // expand active range if slotMaxTime is beyond one day (why not when negative?)
+ if (asRoughDays(slotMaxTime) > 1) {
+ end = startOfDay(end); // necessary?
+ end = addDays(end, -1);
+ end = dateEnv.add(end, slotMaxTime);
+ }
+ }
+ return { start, end };
+ }
+ // Builds the "current" range when it is specified as an explicit duration.
+ // `unit` is the already-computed greatestDurationDenominator unit of duration.
+ buildRangeFromDuration(date, direction, duration, unit) {
+ let { dateEnv, dateAlignment } = this.props;
+ let start;
+ let end;
+ let res;
+ // compute what the alignment should be
+ if (!dateAlignment) {
+ let { dateIncrement } = this.props;
+ if (dateIncrement) {
+ // use the smaller of the two units
+ if (asRoughMs(dateIncrement) < asRoughMs(duration)) {
+ dateAlignment = greatestDurationDenominator(dateIncrement).unit;
+ }
+ else {
+ dateAlignment = unit;
+ }
+ }
+ else {
+ dateAlignment = unit;
+ }
+ }
+ // if the view displays a single day or smaller
+ if (asRoughDays(duration) <= 1) {
+ if (this.isHiddenDay(start)) {
+ start = this.skipHiddenDays(start, direction);
+ start = startOfDay(start);
+ }
+ }
+ function computeRes() {
+ start = dateEnv.startOf(date, dateAlignment);
+ end = dateEnv.add(start, duration);
+ res = { start, end };
+ }
+ computeRes();
+ // if range is completely enveloped by hidden days, go past the hidden days
+ if (!this.trimHiddenDays(res)) {
+ date = this.skipHiddenDays(date, direction);
+ computeRes();
+ }
+ return res;
+ }
+ // Builds the "current" range when a dayCount is specified.
+ buildRangeFromDayCount(date, direction, dayCount) {
+ let { dateEnv, dateAlignment } = this.props;
+ let runningCount = 0;
+ let start = date;
+ let end;
+ if (dateAlignment) {
+ start = dateEnv.startOf(start, dateAlignment);
+ }
+ start = startOfDay(start);
+ start = this.skipHiddenDays(start, direction);
+ end = start;
+ do {
+ end = addDays(end, 1);
+ if (!this.isHiddenDay(end)) {
+ runningCount += 1;
+ }
+ } while (runningCount < dayCount);
+ return { start, end };
+ }
+ // Builds a normalized range object for the "visible" range,
+ // which is a way to define the currentRange and activeRange at the same time.
+ buildCustomVisibleRange(date) {
+ let { props } = this;
+ let input = props.visibleRangeInput;
+ let simpleInput = typeof input === 'function'
+ ? input.call(props.calendarApi, props.dateEnv.toDate(date))
+ : input;
+ let range = this.refineRange(simpleInput);
+ if (range && (range.start == null || range.end == null)) {
+ return null;
+ }
+ return range;
+ }
+ // Computes the range that will represent the element/cells for *rendering*,
+ // but which may have voided days/times.
+ // not responsible for trimming hidden days.
+ buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) {
+ return currentRange;
+ }
+ // Compute the duration value that should be added/substracted to the current date
+ // when a prev/next operation happens.
+ buildDateIncrement(fallback) {
+ let { dateIncrement } = this.props;
+ let customAlignment;
+ if (dateIncrement) {
+ return dateIncrement;
+ }
+ if ((customAlignment = this.props.dateAlignment)) {
+ return createDuration(1, customAlignment);
+ }
+ if (fallback) {
+ return fallback;
+ }
+ return createDuration({ days: 1 });
+ }
+ refineRange(rangeInput) {
+ if (rangeInput) {
+ let range = parseRange(rangeInput, this.props.dateEnv);
+ if (range) {
+ range = computeVisibleDayRange(range);
+ }
+ return range;
+ }
+ return null;
+ }
+ /* Hidden Days
+ ------------------------------------------------------------------------------------------------------------------*/
+ // Initializes internal variables related to calculating hidden days-of-week
+ initHiddenDays() {
+ let hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden
+ let isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
+ let dayCnt = 0;
+ let i;
+ if (this.props.weekends === false) {
+ hiddenDays.push(0, 6); // 0=sunday, 6=saturday
+ }
+ for (i = 0; i < 7; i += 1) {
+ if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
+ dayCnt += 1;
+ }
+ }
+ if (!dayCnt) {
+ throw new Error('invalid hiddenDays'); // all days were hidden? bad.
+ }
+ this.isHiddenDayHash = isHiddenDayHash;
+ }
+ // Remove days from the beginning and end of the range that are computed as hidden.
+ // If the whole range is trimmed off, returns null
+ trimHiddenDays(range) {
+ let { start, end } = range;
+ if (start) {
+ start = this.skipHiddenDays(start);
+ }
+ if (end) {
+ end = this.skipHiddenDays(end, -1, true);
+ }
+ if (start == null || end == null || start < end) {
+ return { start, end };
+ }
+ return null;
+ }
+ // Is the current day hidden?
+ // `day` is a day-of-week index (0-6), or a Date (used for UTC)
+ isHiddenDay(day) {
+ if (day instanceof Date) {
+ day = day.getUTCDay();
+ }
+ return this.isHiddenDayHash[day];
+ }
+ // Incrementing the current day until it is no longer a hidden day, returning a copy.
+ // DOES NOT CONSIDER validRange!
+ // If the initial value of `date` is not a hidden day, don't do anything.
+ // Pass `isExclusive` as `true` if you are dealing with an end date.
+ // `inc` defaults to `1` (increment one day forward each time)
+ skipHiddenDays(date, inc = 1, isExclusive = false) {
+ while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
+ date = addDays(date, inc);
+ }
+ return date;
+ }
+ }
+
+ function triggerDateSelect(selection, pev, context) {
+ context.emitter.trigger('select', Object.assign(Object.assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }));
+ }
+ function triggerDateUnselect(pev, context) {
+ context.emitter.trigger('unselect', {
+ jsEvent: pev ? pev.origEvent : null,
+ view: context.viewApi || context.calendarApi.view,
+ });
+ }
+ function buildDateSpanApiWithContext(dateSpan, context) {
+ let props = {};
+ for (let transform of context.pluginHooks.dateSpanTransforms) {
+ Object.assign(props, transform(dateSpan, context));
+ }
+ Object.assign(props, buildDateSpanApi(dateSpan, context.dateEnv));
+ return props;
+ }
+ // Given an event's allDay status and start date, return what its fallback end date should be.
+ // TODO: rename to computeDefaultEventEnd
+ function getDefaultEventEnd(allDay, marker, context) {
+ let { dateEnv, options } = context;
+ let end = marker;
+ if (allDay) {
+ end = startOfDay(end);
+ end = dateEnv.add(end, options.defaultAllDayEventDuration);
+ }
+ else {
+ end = dateEnv.add(end, options.defaultTimedEventDuration);
+ }
+ return end;
+ }
+
+ // applies the mutation to ALL defs/instances within the event store
+ function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) {
+ let eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
+ let dest = createEmptyEventStore();
+ for (let defId in eventStore.defs) {
+ let def = eventStore.defs[defId];
+ dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context);
+ }
+ for (let instanceId in eventStore.instances) {
+ let instance = eventStore.instances[instanceId];
+ let def = dest.defs[instance.defId]; // important to grab the newly modified def
+ dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context);
+ }
+ return dest;
+ }
+ function applyMutationToEventDef(eventDef, eventConfig, mutation, context) {
+ let standardProps = mutation.standardProps || {};
+ // if hasEnd has not been specified, guess a good value based on deltas.
+ // if duration will change, there's no way the default duration will persist,
+ // and thus, we need to mark the event as having a real end
+ if (standardProps.hasEnd == null &&
+ eventConfig.durationEditable &&
+ (mutation.startDelta || mutation.endDelta)) {
+ standardProps.hasEnd = true; // TODO: is this mutation okay?
+ }
+ let copy = Object.assign(Object.assign(Object.assign({}, eventDef), standardProps), { ui: Object.assign(Object.assign({}, eventDef.ui), standardProps.ui) });
+ if (mutation.extendedProps) {
+ copy.extendedProps = Object.assign(Object.assign({}, copy.extendedProps), mutation.extendedProps);
+ }
+ for (let applier of context.pluginHooks.eventDefMutationAppliers) {
+ applier(copy, mutation, context);
+ }
+ if (!copy.hasEnd && context.options.forceEventDuration) {
+ copy.hasEnd = true;
+ }
+ return copy;
+ }
+ function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
+ eventConfig, mutation, context) {
+ let { dateEnv } = context;
+ let forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
+ let clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
+ let copy = Object.assign({}, eventInstance);
+ if (forceAllDay) {
+ copy.range = computeAlignedDayRange(copy.range);
+ }
+ if (mutation.datesDelta && eventConfig.startEditable) {
+ copy.range = {
+ start: dateEnv.add(copy.range.start, mutation.datesDelta),
+ end: dateEnv.add(copy.range.end, mutation.datesDelta),
+ };
+ }
+ if (mutation.startDelta && eventConfig.durationEditable) {
+ copy.range = {
+ start: dateEnv.add(copy.range.start, mutation.startDelta),
+ end: copy.range.end,
+ };
+ }
+ if (mutation.endDelta && eventConfig.durationEditable) {
+ copy.range = {
+ start: copy.range.start,
+ end: dateEnv.add(copy.range.end, mutation.endDelta),
+ };
+ }
+ if (clearEnd) {
+ copy.range = {
+ start: copy.range.start,
+ end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context),
+ };
+ }
+ // in case event was all-day but the supplied deltas were not
+ // better util for this?
+ if (eventDef.allDay) {
+ copy.range = {
+ start: startOfDay(copy.range.start),
+ end: startOfDay(copy.range.end),
+ };
+ }
+ // handle invalid durations
+ if (copy.range.end < copy.range.start) {
+ copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context);
+ }
+ return copy;
+ }
+
+ class EventSourceImpl {
+ constructor(context, internalEventSource) {
+ this.context = context;
+ this.internalEventSource = internalEventSource;
+ }
+ remove() {
+ this.context.dispatch({
+ type: 'REMOVE_EVENT_SOURCE',
+ sourceId: this.internalEventSource.sourceId,
+ });
+ }
+ refetch() {
+ this.context.dispatch({
+ type: 'FETCH_EVENT_SOURCES',
+ sourceIds: [this.internalEventSource.sourceId],
+ isRefetch: true,
+ });
+ }
+ get id() {
+ return this.internalEventSource.publicId;
+ }
+ get url() {
+ return this.internalEventSource.meta.url;
+ }
+ get format() {
+ return this.internalEventSource.meta.format; // TODO: bad. not guaranteed
+ }
+ }
+
+ class EventImpl {
+ // instance will be null if expressing a recurring event that has no current instances,
+ // OR if trying to validate an incoming external event that has no dates assigned
+ constructor(context, def, instance) {
+ this._context = context;
+ this._def = def;
+ this._instance = instance || null;
+ }
+ /*
+ TODO: make event struct more responsible for this
+ */
+ setProp(name, val) {
+ if (name in EVENT_DATE_REFINERS) {
+ console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.');
+ // TODO: make proper aliasing system?
+ }
+ else if (name === 'id') {
+ val = EVENT_NON_DATE_REFINERS[name](val);
+ this.mutate({
+ standardProps: { publicId: val }, // hardcoded internal name
+ });
+ }
+ else if (name in EVENT_NON_DATE_REFINERS) {
+ val = EVENT_NON_DATE_REFINERS[name](val);
+ this.mutate({
+ standardProps: { [name]: val },
+ });
+ }
+ else if (name in EVENT_UI_REFINERS) {
+ let ui = EVENT_UI_REFINERS[name](val);
+ if (name === 'color') {
+ ui = { backgroundColor: val, borderColor: val };
+ }
+ else if (name === 'editable') {
+ ui = { startEditable: val, durationEditable: val };
+ }
+ else {
+ ui = { [name]: val };
+ }
+ this.mutate({
+ standardProps: { ui },
+ });
+ }
+ else {
+ console.warn(`Could not set prop '${name}'. Use setExtendedProp instead.`);
+ }
+ }
+ setExtendedProp(name, val) {
+ this.mutate({
+ extendedProps: { [name]: val },
+ });
+ }
+ setStart(startInput, options = {}) {
+ let { dateEnv } = this._context;
+ let start = dateEnv.createMarker(startInput);
+ if (start && this._instance) { // TODO: warning if parsed bad
+ let instanceRange = this._instance.range;
+ let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
+ if (options.maintainDuration) {
+ this.mutate({ datesDelta: startDelta });
+ }
+ else {
+ this.mutate({ startDelta });
+ }
+ }
+ }
+ setEnd(endInput, options = {}) {
+ let { dateEnv } = this._context;
+ let end;
+ if (endInput != null) {
+ end = dateEnv.createMarker(endInput);
+ if (!end) {
+ return; // TODO: warning if parsed bad
+ }
+ }
+ if (this._instance) {
+ if (end) {
+ let endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
+ this.mutate({ endDelta });
+ }
+ else {
+ this.mutate({ standardProps: { hasEnd: false } });
+ }
+ }
+ }
+ setDates(startInput, endInput, options = {}) {
+ let { dateEnv } = this._context;
+ let standardProps = { allDay: options.allDay };
+ let start = dateEnv.createMarker(startInput);
+ let end;
+ if (!start) {
+ return; // TODO: warning if parsed bad
+ }
+ if (endInput != null) {
+ end = dateEnv.createMarker(endInput);
+ if (!end) { // TODO: warning if parsed bad
+ return;
+ }
+ }
+ if (this._instance) {
+ let instanceRange = this._instance.range;
+ // when computing the diff for an event being converted to all-day,
+ // compute diff off of the all-day values the way event-mutation does.
+ if (options.allDay === true) {
+ instanceRange = computeAlignedDayRange(instanceRange);
+ }
+ let startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
+ if (end) {
+ let endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
+ if (durationsEqual(startDelta, endDelta)) {
+ this.mutate({ datesDelta: startDelta, standardProps });
+ }
+ else {
+ this.mutate({ startDelta, endDelta, standardProps });
+ }
+ }
+ else { // means "clear the end"
+ standardProps.hasEnd = false;
+ this.mutate({ datesDelta: startDelta, standardProps });
+ }
+ }
+ }
+ moveStart(deltaInput) {
+ let delta = createDuration(deltaInput);
+ if (delta) { // TODO: warning if parsed bad
+ this.mutate({ startDelta: delta });
+ }
+ }
+ moveEnd(deltaInput) {
+ let delta = createDuration(deltaInput);
+ if (delta) { // TODO: warning if parsed bad
+ this.mutate({ endDelta: delta });
+ }
+ }
+ moveDates(deltaInput) {
+ let delta = createDuration(deltaInput);
+ if (delta) { // TODO: warning if parsed bad
+ this.mutate({ datesDelta: delta });
+ }
+ }
+ setAllDay(allDay, options = {}) {
+ let standardProps = { allDay };
+ let { maintainDuration } = options;
+ if (maintainDuration == null) {
+ maintainDuration = this._context.options.allDayMaintainDuration;
+ }
+ if (this._def.allDay !== allDay) {
+ standardProps.hasEnd = maintainDuration;
+ }
+ this.mutate({ standardProps });
+ }
+ formatRange(formatInput) {
+ let { dateEnv } = this._context;
+ let instance = this._instance;
+ let formatter = createFormatter(formatInput);
+ if (this._def.hasEnd) {
+ return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
+ forcedStartTzo: instance.forcedStartTzo,
+ forcedEndTzo: instance.forcedEndTzo,
+ });
+ }
+ return dateEnv.format(instance.range.start, formatter, {
+ forcedTzo: instance.forcedStartTzo,
+ });
+ }
+ mutate(mutation) {
+ let instance = this._instance;
+ if (instance) {
+ let def = this._def;
+ let context = this._context;
+ let { eventStore } = context.getCurrentData();
+ let relevantEvents = getRelevantEvents(eventStore, instance.instanceId);
+ let eventConfigBase = {
+ '': {
+ display: '',
+ startEditable: true,
+ durationEditable: true,
+ constraints: [],
+ overlap: null,
+ allows: [],
+ backgroundColor: '',
+ borderColor: '',
+ textColor: '',
+ classNames: [],
+ },
+ };
+ relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context);
+ let oldEvent = new EventImpl(context, def, instance); // snapshot
+ this._def = relevantEvents.defs[def.defId];
+ this._instance = relevantEvents.instances[instance.instanceId];
+ context.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: relevantEvents,
+ });
+ context.emitter.trigger('eventChange', {
+ oldEvent,
+ event: this,
+ relatedEvents: buildEventApis(relevantEvents, context, instance),
+ revert() {
+ context.dispatch({
+ type: 'RESET_EVENTS',
+ eventStore, // the ORIGINAL store
+ });
+ },
+ });
+ }
+ }
+ remove() {
+ let context = this._context;
+ let asStore = eventApiToStore(this);
+ context.dispatch({
+ type: 'REMOVE_EVENTS',
+ eventStore: asStore,
+ });
+ context.emitter.trigger('eventRemove', {
+ event: this,
+ relatedEvents: [],
+ revert() {
+ context.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: asStore,
+ });
+ },
+ });
+ }
+ get source() {
+ let { sourceId } = this._def;
+ if (sourceId) {
+ return new EventSourceImpl(this._context, this._context.getCurrentData().eventSources[sourceId]);
+ }
+ return null;
+ }
+ get start() {
+ return this._instance ?
+ this._context.dateEnv.toDate(this._instance.range.start) :
+ null;
+ }
+ get end() {
+ return (this._instance && this._def.hasEnd) ?
+ this._context.dateEnv.toDate(this._instance.range.end) :
+ null;
+ }
+ get startStr() {
+ let instance = this._instance;
+ if (instance) {
+ return this._context.dateEnv.formatIso(instance.range.start, {
+ omitTime: this._def.allDay,
+ forcedTzo: instance.forcedStartTzo,
+ });
+ }
+ return '';
+ }
+ get endStr() {
+ let instance = this._instance;
+ if (instance && this._def.hasEnd) {
+ return this._context.dateEnv.formatIso(instance.range.end, {
+ omitTime: this._def.allDay,
+ forcedTzo: instance.forcedEndTzo,
+ });
+ }
+ return '';
+ }
+ // computable props that all access the def
+ // TODO: find a TypeScript-compatible way to do this at scale
+ get id() { return this._def.publicId; }
+ get groupId() { return this._def.groupId; }
+ get allDay() { return this._def.allDay; }
+ get title() { return this._def.title; }
+ get url() { return this._def.url; }
+ get display() { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier
+ get startEditable() { return this._def.ui.startEditable; }
+ get durationEditable() { return this._def.ui.durationEditable; }
+ get constraint() { return this._def.ui.constraints[0] || null; }
+ get overlap() { return this._def.ui.overlap; }
+ get allow() { return this._def.ui.allows[0] || null; }
+ get backgroundColor() { return this._def.ui.backgroundColor; }
+ get borderColor() { return this._def.ui.borderColor; }
+ get textColor() { return this._def.ui.textColor; }
+ // NOTE: user can't modify these because Object.freeze was called in event-def parsing
+ get classNames() { return this._def.ui.classNames; }
+ get extendedProps() { return this._def.extendedProps; }
+ toPlainObject(settings = {}) {
+ let def = this._def;
+ let { ui } = def;
+ let { startStr, endStr } = this;
+ let res = {};
+ if (def.title) {
+ res.title = def.title;
+ }
+ if (startStr) {
+ res.start = startStr;
+ }
+ if (endStr) {
+ res.end = endStr;
+ }
+ if (def.publicId) {
+ res.id = def.publicId;
+ }
+ if (def.groupId) {
+ res.groupId = def.groupId;
+ }
+ if (def.url) {
+ res.url = def.url;
+ }
+ if (ui.display && ui.display !== 'auto') {
+ res.display = ui.display;
+ }
+ // TODO: what about recurring-event properties???
+ // TODO: include startEditable/durationEditable/constraint/overlap/allow
+ if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {
+ res.color = ui.backgroundColor;
+ }
+ else {
+ if (ui.backgroundColor) {
+ res.backgroundColor = ui.backgroundColor;
+ }
+ if (ui.borderColor) {
+ res.borderColor = ui.borderColor;
+ }
+ }
+ if (ui.textColor) {
+ res.textColor = ui.textColor;
+ }
+ if (ui.classNames.length) {
+ res.classNames = ui.classNames;
+ }
+ if (Object.keys(def.extendedProps).length) {
+ if (settings.collapseExtendedProps) {
+ Object.assign(res, def.extendedProps);
+ }
+ else {
+ res.extendedProps = def.extendedProps;
+ }
+ }
+ return res;
+ }
+ toJSON() {
+ return this.toPlainObject();
+ }
+ }
+ function eventApiToStore(eventApi) {
+ let def = eventApi._def;
+ let instance = eventApi._instance;
+ return {
+ defs: { [def.defId]: def },
+ instances: instance
+ ? { [instance.instanceId]: instance }
+ : {},
+ };
+ }
+ function buildEventApis(eventStore, context, excludeInstance) {
+ let { defs, instances } = eventStore;
+ let eventApis = [];
+ let excludeInstanceId = excludeInstance ? excludeInstance.instanceId : '';
+ for (let id in instances) {
+ let instance = instances[id];
+ let def = defs[instance.defId];
+ if (instance.instanceId !== excludeInstanceId) {
+ eventApis.push(new EventImpl(context, def, instance));
+ }
+ }
+ return eventApis;
+ }
+
+ /*
+ Specifying nextDayThreshold signals that all-day ranges should be sliced.
+ */
+ function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
+ let inverseBgByGroupId = {};
+ let inverseBgByDefId = {};
+ let defByGroupId = {};
+ let bgRanges = [];
+ let fgRanges = [];
+ let eventUis = compileEventUis(eventStore.defs, eventUiBases);
+ for (let defId in eventStore.defs) {
+ let def = eventStore.defs[defId];
+ let ui = eventUis[def.defId];
+ if (ui.display === 'inverse-background') {
+ if (def.groupId) {
+ inverseBgByGroupId[def.groupId] = [];
+ if (!defByGroupId[def.groupId]) {
+ defByGroupId[def.groupId] = def;
+ }
+ }
+ else {
+ inverseBgByDefId[defId] = [];
+ }
+ }
+ }
+ for (let instanceId in eventStore.instances) {
+ let instance = eventStore.instances[instanceId];
+ let def = eventStore.defs[instance.defId];
+ let ui = eventUis[def.defId];
+ let origRange = instance.range;
+ let normalRange = (!def.allDay && nextDayThreshold) ?
+ computeVisibleDayRange(origRange, nextDayThreshold) :
+ origRange;
+ let slicedRange = intersectRanges(normalRange, framingRange);
+ if (slicedRange) {
+ if (ui.display === 'inverse-background') {
+ if (def.groupId) {
+ inverseBgByGroupId[def.groupId].push(slicedRange);
+ }
+ else {
+ inverseBgByDefId[instance.defId].push(slicedRange);
+ }
+ }
+ else if (ui.display !== 'none') {
+ (ui.display === 'background' ? bgRanges : fgRanges).push({
+ def,
+ ui,
+ instance,
+ range: slicedRange,
+ isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
+ isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf(),
+ });
+ }
+ }
+ }
+ for (let groupId in inverseBgByGroupId) { // BY GROUP
+ let ranges = inverseBgByGroupId[groupId];
+ let invertedRanges = invertRanges(ranges, framingRange);
+ for (let invertedRange of invertedRanges) {
+ let def = defByGroupId[groupId];
+ let ui = eventUis[def.defId];
+ bgRanges.push({
+ def,
+ ui,
+ instance: null,
+ range: invertedRange,
+ isStart: false,
+ isEnd: false,
+ });
+ }
+ }
+ for (let defId in inverseBgByDefId) {
+ let ranges = inverseBgByDefId[defId];
+ let invertedRanges = invertRanges(ranges, framingRange);
+ for (let invertedRange of invertedRanges) {
+ bgRanges.push({
+ def: eventStore.defs[defId],
+ ui: eventUis[defId],
+ instance: null,
+ range: invertedRange,
+ isStart: false,
+ isEnd: false,
+ });
+ }
+ }
+ return { bg: bgRanges, fg: fgRanges };
+ }
+ function hasBgRendering(def) {
+ return def.ui.display === 'background' || def.ui.display === 'inverse-background';
+ }
+ function setElSeg(el, seg) {
+ el.fcSeg = seg;
+ }
+ function getElSeg(el) {
+ return el.fcSeg ||
+ el.parentNode.fcSeg || // for the harness
+ null;
+ }
+ // event ui computation
+ function compileEventUis(eventDefs, eventUiBases) {
+ return mapHash(eventDefs, (eventDef) => compileEventUi(eventDef, eventUiBases));
+ }
+ function compileEventUi(eventDef, eventUiBases) {
+ let uis = [];
+ if (eventUiBases['']) {
+ uis.push(eventUiBases['']);
+ }
+ if (eventUiBases[eventDef.defId]) {
+ uis.push(eventUiBases[eventDef.defId]);
+ }
+ uis.push(eventDef.ui);
+ return combineEventUis(uis);
+ }
+ function sortEventSegs(segs, eventOrderSpecs) {
+ let objs = segs.map(buildSegCompareObj);
+ objs.sort((obj0, obj1) => compareByFieldSpecs(obj0, obj1, eventOrderSpecs));
+ return objs.map((c) => c._seg);
+ }
+ // returns a object with all primitive props that can be compared
+ function buildSegCompareObj(seg) {
+ let { eventRange } = seg;
+ let eventDef = eventRange.def;
+ let range = eventRange.instance ? eventRange.instance.range : eventRange.range;
+ let start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
+ let end = range.end ? range.end.valueOf() : 0; // "
+ return Object.assign(Object.assign(Object.assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start,
+ end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg });
+ }
+ function computeSegDraggable(seg, context) {
+ let { pluginHooks } = context;
+ let transformers = pluginHooks.isDraggableTransformers;
+ let { def, ui } = seg.eventRange;
+ let val = ui.startEditable;
+ for (let transformer of transformers) {
+ val = transformer(val, def, ui, context);
+ }
+ return val;
+ }
+ function computeSegStartResizable(seg, context) {
+ return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart;
+ }
+ function computeSegEndResizable(seg, context) {
+ return seg.isEnd && seg.eventRange.ui.durationEditable;
+ }
+ function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true
+ defaultDisplayEventEnd, // defaults to true
+ startOverride, endOverride) {
+ let { dateEnv, options } = context;
+ let { displayEventTime, displayEventEnd } = options;
+ let eventDef = seg.eventRange.def;
+ let eventInstance = seg.eventRange.instance;
+ if (displayEventTime == null) {
+ displayEventTime = defaultDisplayEventTime !== false;
+ }
+ if (displayEventEnd == null) {
+ displayEventEnd = defaultDisplayEventEnd !== false;
+ }
+ let wholeEventStart = eventInstance.range.start;
+ let wholeEventEnd = eventInstance.range.end;
+ let segStart = startOverride || seg.start || seg.eventRange.range.start;
+ let segEnd = endOverride || seg.end || seg.eventRange.range.end;
+ let isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf();
+ let isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf();
+ if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) {
+ segStart = isStartDay ? wholeEventStart : segStart;
+ segEnd = isEndDay ? wholeEventEnd : segEnd;
+ if (displayEventEnd && eventDef.hasEnd) {
+ return dateEnv.formatRange(segStart, segEnd, timeFormat, {
+ forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo,
+ forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo,
+ });
+ }
+ return dateEnv.format(segStart, timeFormat, {
+ forcedTzo: startOverride ? null : eventInstance.forcedStartTzo, // nooooo, same
+ });
+ }
+ return '';
+ }
+ function getSegMeta(seg, todayRange, nowDate) {
+ let segRange = seg.eventRange.range;
+ return {
+ isPast: segRange.end < (nowDate || todayRange.start),
+ isFuture: segRange.start >= (nowDate || todayRange.end),
+ isToday: todayRange && rangeContainsMarker(todayRange, segRange.start),
+ };
+ }
+ function getEventClassNames(props) {
+ let classNames = ['fc-event'];
+ if (props.isMirror) {
+ classNames.push('fc-event-mirror');
+ }
+ if (props.isDraggable) {
+ classNames.push('fc-event-draggable');
+ }
+ if (props.isStartResizable || props.isEndResizable) {
+ classNames.push('fc-event-resizable');
+ }
+ if (props.isDragging) {
+ classNames.push('fc-event-dragging');
+ }
+ if (props.isResizing) {
+ classNames.push('fc-event-resizing');
+ }
+ if (props.isSelected) {
+ classNames.push('fc-event-selected');
+ }
+ if (props.isStart) {
+ classNames.push('fc-event-start');
+ }
+ if (props.isEnd) {
+ classNames.push('fc-event-end');
+ }
+ if (props.isPast) {
+ classNames.push('fc-event-past');
+ }
+ if (props.isToday) {
+ classNames.push('fc-event-today');
+ }
+ if (props.isFuture) {
+ classNames.push('fc-event-future');
+ }
+ return classNames;
+ }
+ function buildEventRangeKey(eventRange) {
+ return eventRange.instance
+ ? eventRange.instance.instanceId
+ : `${eventRange.def.defId}:${eventRange.range.start.toISOString()}`;
+ // inverse-background events don't have specific instances. TODO: better solution
+ }
+ function getSegAnchorAttrs(seg, context) {
+ let { def, instance } = seg.eventRange;
+ let { url } = def;
+ if (url) {
+ return { href: url };
+ }
+ let { emitter, options } = context;
+ let { eventInteractive } = options;
+ if (eventInteractive == null) {
+ eventInteractive = def.interactive;
+ if (eventInteractive == null) {
+ eventInteractive = Boolean(emitter.hasHandlers('eventClick'));
+ }
+ }
+ // mock what happens in EventClicking
+ if (eventInteractive) {
+ // only attach keyboard-related handlers because click handler is already done in EventClicking
+ return createAriaKeyboardAttrs((ev) => {
+ emitter.trigger('eventClick', {
+ el: ev.target,
+ event: new EventImpl(context, def, instance),
+ jsEvent: ev,
+ view: context.viewApi,
+ });
+ });
+ }
+ return {};
+ }
+
+ const STANDARD_PROPS = {
+ start: identity,
+ end: identity,
+ allDay: Boolean,
+ };
+ function parseDateSpan(raw, dateEnv, defaultDuration) {
+ let span = parseOpenDateSpan(raw, dateEnv);
+ let { range } = span;
+ if (!range.start) {
+ return null;
+ }
+ if (!range.end) {
+ if (defaultDuration == null) {
+ return null;
+ }
+ range.end = dateEnv.add(range.start, defaultDuration);
+ }
+ return span;
+ }
+ /*
+ TODO: somehow combine with parseRange?
+ Will return null if the start/end props were present but parsed invalidly.
+ */
+ function parseOpenDateSpan(raw, dateEnv) {
+ let { refined: standardProps, extra } = refineProps(raw, STANDARD_PROPS);
+ let startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
+ let endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
+ let { allDay } = standardProps;
+ if (allDay == null) {
+ allDay = (startMeta && startMeta.isTimeUnspecified) &&
+ (!endMeta || endMeta.isTimeUnspecified);
+ }
+ return Object.assign({ range: {
+ start: startMeta ? startMeta.marker : null,
+ end: endMeta ? endMeta.marker : null,
+ }, allDay }, extra);
+ }
+ function isDateSpansEqual(span0, span1) {
+ return rangesEqual(span0.range, span1.range) &&
+ span0.allDay === span1.allDay &&
+ isSpanPropsEqual(span0, span1);
+ }
+ // the NON-DATE-RELATED props
+ function isSpanPropsEqual(span0, span1) {
+ for (let propName in span1) {
+ if (propName !== 'range' && propName !== 'allDay') {
+ if (span0[propName] !== span1[propName]) {
+ return false;
+ }
+ }
+ }
+ // are there any props that span0 has that span1 DOESN'T have?
+ // both have range/allDay, so no need to special-case.
+ for (let propName in span0) {
+ if (!(propName in span1)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function buildDateSpanApi(span, dateEnv) {
+ return Object.assign(Object.assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay });
+ }
+ function buildRangeApiWithTimeZone(range, dateEnv, omitTime) {
+ return Object.assign(Object.assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone });
+ }
+ function buildRangeApi(range, dateEnv, omitTime) {
+ return {
+ start: dateEnv.toDate(range.start),
+ end: dateEnv.toDate(range.end),
+ startStr: dateEnv.formatIso(range.start, { omitTime }),
+ endStr: dateEnv.formatIso(range.end, { omitTime }),
+ };
+ }
+ function fabricateEventRange(dateSpan, eventUiBases, context) {
+ let res = refineEventDef({ editable: false }, context);
+ let def = parseEventDef(res.refined, res.extra, '', // sourceId
+ dateSpan.allDay, true, // hasEnd
+ context);
+ return {
+ def,
+ ui: compileEventUi(def, eventUiBases),
+ instance: createEventInstance(def.defId, dateSpan.range),
+ range: dateSpan.range,
+ isStart: true,
+ isEnd: true,
+ };
+ }
+
+ let calendarSystemClassMap = {};
+ function registerCalendarSystem(name, theClass) {
+ calendarSystemClassMap[name] = theClass;
+ }
+ function createCalendarSystem(name) {
+ return new calendarSystemClassMap[name]();
+ }
+ class GregorianCalendarSystem {
+ getMarkerYear(d) {
+ return d.getUTCFullYear();
+ }
+ getMarkerMonth(d) {
+ return d.getUTCMonth();
+ }
+ getMarkerDay(d) {
+ return d.getUTCDate();
+ }
+ arrayToMarker(arr) {
+ return arrayToUtcDate(arr);
+ }
+ markerToArray(marker) {
+ return dateToUtcArray(marker);
+ }
+ }
+ registerCalendarSystem('gregory', GregorianCalendarSystem);
+
+ const ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
+ function parse(str) {
+ let m = ISO_RE.exec(str);
+ if (m) {
+ let marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number(`0.${m[12]}`) * 1000 : 0));
+ if (isValidDate(marker)) {
+ let timeZoneOffset = null;
+ if (m[13]) {
+ timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
+ Number(m[18] || 0));
+ }
+ return {
+ marker,
+ isTimeUnspecified: !m[6],
+ timeZoneOffset,
+ };
+ }
+ }
+ return null;
+ }
+
+ class DateEnv {
+ constructor(settings) {
+ let timeZone = this.timeZone = settings.timeZone;
+ let isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
+ if (settings.namedTimeZoneImpl && isNamedTimeZone) {
+ this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
+ }
+ this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
+ this.calendarSystem = createCalendarSystem(settings.calendarSystem);
+ this.locale = settings.locale;
+ this.weekDow = settings.locale.week.dow;
+ this.weekDoy = settings.locale.week.doy;
+ if (settings.weekNumberCalculation === 'ISO') {
+ this.weekDow = 1;
+ this.weekDoy = 4;
+ }
+ if (typeof settings.firstDay === 'number') {
+ this.weekDow = settings.firstDay;
+ }
+ if (typeof settings.weekNumberCalculation === 'function') {
+ this.weekNumberFunc = settings.weekNumberCalculation;
+ }
+ this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText;
+ this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText;
+ this.cmdFormatter = settings.cmdFormatter;
+ this.defaultSeparator = settings.defaultSeparator;
+ }
+ // Creating / Parsing
+ createMarker(input) {
+ let meta = this.createMarkerMeta(input);
+ if (meta === null) {
+ return null;
+ }
+ return meta.marker;
+ }
+ createNowMarker() {
+ if (this.canComputeOffset) {
+ return this.timestampToMarker(new Date().valueOf());
+ }
+ // if we can't compute the current date val for a timezone,
+ // better to give the current local date vals than UTC
+ return arrayToUtcDate(dateToLocalArray(new Date()));
+ }
+ createMarkerMeta(input) {
+ if (typeof input === 'string') {
+ return this.parse(input);
+ }
+ let marker = null;
+ if (typeof input === 'number') {
+ marker = this.timestampToMarker(input);
+ }
+ else if (input instanceof Date) {
+ input = input.valueOf();
+ if (!isNaN(input)) {
+ marker = this.timestampToMarker(input);
+ }
+ }
+ else if (Array.isArray(input)) {
+ marker = arrayToUtcDate(input);
+ }
+ if (marker === null || !isValidDate(marker)) {
+ return null;
+ }
+ return { marker, isTimeUnspecified: false, forcedTzo: null };
+ }
+ parse(s) {
+ let parts = parse(s);
+ if (parts === null) {
+ return null;
+ }
+ let { marker } = parts;
+ let forcedTzo = null;
+ if (parts.timeZoneOffset !== null) {
+ if (this.canComputeOffset) {
+ marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
+ }
+ else {
+ forcedTzo = parts.timeZoneOffset;
+ }
+ }
+ return { marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo };
+ }
+ // Accessors
+ getYear(marker) {
+ return this.calendarSystem.getMarkerYear(marker);
+ }
+ getMonth(marker) {
+ return this.calendarSystem.getMarkerMonth(marker);
+ }
+ // Adding / Subtracting
+ add(marker, dur) {
+ let a = this.calendarSystem.markerToArray(marker);
+ a[0] += dur.years;
+ a[1] += dur.months;
+ a[2] += dur.days;
+ a[6] += dur.milliseconds;
+ return this.calendarSystem.arrayToMarker(a);
+ }
+ subtract(marker, dur) {
+ let a = this.calendarSystem.markerToArray(marker);
+ a[0] -= dur.years;
+ a[1] -= dur.months;
+ a[2] -= dur.days;
+ a[6] -= dur.milliseconds;
+ return this.calendarSystem.arrayToMarker(a);
+ }
+ addYears(marker, n) {
+ let a = this.calendarSystem.markerToArray(marker);
+ a[0] += n;
+ return this.calendarSystem.arrayToMarker(a);
+ }
+ addMonths(marker, n) {
+ let a = this.calendarSystem.markerToArray(marker);
+ a[1] += n;
+ return this.calendarSystem.arrayToMarker(a);
+ }
+ // Diffing Whole Units
+ diffWholeYears(m0, m1) {
+ let { calendarSystem } = this;
+ if (timeAsMs(m0) === timeAsMs(m1) &&
+ calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
+ calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
+ return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
+ }
+ return null;
+ }
+ diffWholeMonths(m0, m1) {
+ let { calendarSystem } = this;
+ if (timeAsMs(m0) === timeAsMs(m1) &&
+ calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
+ return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
+ (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
+ }
+ return null;
+ }
+ // Range / Duration
+ greatestWholeUnit(m0, m1) {
+ let n = this.diffWholeYears(m0, m1);
+ if (n !== null) {
+ return { unit: 'year', value: n };
+ }
+ n = this.diffWholeMonths(m0, m1);
+ if (n !== null) {
+ return { unit: 'month', value: n };
+ }
+ n = diffWholeWeeks(m0, m1);
+ if (n !== null) {
+ return { unit: 'week', value: n };
+ }
+ n = diffWholeDays(m0, m1);
+ if (n !== null) {
+ return { unit: 'day', value: n };
+ }
+ n = diffHours(m0, m1);
+ if (isInt(n)) {
+ return { unit: 'hour', value: n };
+ }
+ n = diffMinutes(m0, m1);
+ if (isInt(n)) {
+ return { unit: 'minute', value: n };
+ }
+ n = diffSeconds(m0, m1);
+ if (isInt(n)) {
+ return { unit: 'second', value: n };
+ }
+ return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
+ }
+ countDurationsBetween(m0, m1, d) {
+ // TODO: can use greatestWholeUnit
+ let diff;
+ if (d.years) {
+ diff = this.diffWholeYears(m0, m1);
+ if (diff !== null) {
+ return diff / asRoughYears(d);
+ }
+ }
+ if (d.months) {
+ diff = this.diffWholeMonths(m0, m1);
+ if (diff !== null) {
+ return diff / asRoughMonths(d);
+ }
+ }
+ if (d.days) {
+ diff = diffWholeDays(m0, m1);
+ if (diff !== null) {
+ return diff / asRoughDays(d);
+ }
+ }
+ return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
+ }
+ // Start-Of
+ // these DON'T return zoned-dates. only UTC start-of dates
+ startOf(m, unit) {
+ if (unit === 'year') {
+ return this.startOfYear(m);
+ }
+ if (unit === 'month') {
+ return this.startOfMonth(m);
+ }
+ if (unit === 'week') {
+ return this.startOfWeek(m);
+ }
+ if (unit === 'day') {
+ return startOfDay(m);
+ }
+ if (unit === 'hour') {
+ return startOfHour(m);
+ }
+ if (unit === 'minute') {
+ return startOfMinute(m);
+ }
+ if (unit === 'second') {
+ return startOfSecond(m);
+ }
+ return null;
+ }
+ startOfYear(m) {
+ return this.calendarSystem.arrayToMarker([
+ this.calendarSystem.getMarkerYear(m),
+ ]);
+ }
+ startOfMonth(m) {
+ return this.calendarSystem.arrayToMarker([
+ this.calendarSystem.getMarkerYear(m),
+ this.calendarSystem.getMarkerMonth(m),
+ ]);
+ }
+ startOfWeek(m) {
+ return this.calendarSystem.arrayToMarker([
+ this.calendarSystem.getMarkerYear(m),
+ this.calendarSystem.getMarkerMonth(m),
+ m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7),
+ ]);
+ }
+ // Week Number
+ computeWeekNumber(marker) {
+ if (this.weekNumberFunc) {
+ return this.weekNumberFunc(this.toDate(marker));
+ }
+ return weekOfYear(marker, this.weekDow, this.weekDoy);
+ }
+ // TODO: choke on timeZoneName: long
+ format(marker, formatter, dateOptions = {}) {
+ return formatter.format({
+ marker,
+ timeZoneOffset: dateOptions.forcedTzo != null ?
+ dateOptions.forcedTzo :
+ this.offsetForMarker(marker),
+ }, this);
+ }
+ formatRange(start, end, formatter, dateOptions = {}) {
+ if (dateOptions.isEndExclusive) {
+ end = addMs(end, -1);
+ }
+ return formatter.formatRange({
+ marker: start,
+ timeZoneOffset: dateOptions.forcedStartTzo != null ?
+ dateOptions.forcedStartTzo :
+ this.offsetForMarker(start),
+ }, {
+ marker: end,
+ timeZoneOffset: dateOptions.forcedEndTzo != null ?
+ dateOptions.forcedEndTzo :
+ this.offsetForMarker(end),
+ }, this, dateOptions.defaultSeparator);
+ }
+ /*
+ DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that,
+ might as well use buildIsoString or some other util directly
+ */
+ formatIso(marker, extraOptions = {}) {
+ let timeZoneOffset = null;
+ if (!extraOptions.omitTimeZoneOffset) {
+ if (extraOptions.forcedTzo != null) {
+ timeZoneOffset = extraOptions.forcedTzo;
+ }
+ else {
+ timeZoneOffset = this.offsetForMarker(marker);
+ }
+ }
+ return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
+ }
+ // TimeZone
+ timestampToMarker(ms) {
+ if (this.timeZone === 'local') {
+ return arrayToUtcDate(dateToLocalArray(new Date(ms)));
+ }
+ if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
+ return new Date(ms);
+ }
+ return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
+ }
+ offsetForMarker(m) {
+ if (this.timeZone === 'local') {
+ return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
+ }
+ if (this.timeZone === 'UTC') {
+ return 0;
+ }
+ if (this.namedTimeZoneImpl) {
+ return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
+ }
+ return null;
+ }
+ // Conversion
+ toDate(m, forcedTzo) {
+ if (this.timeZone === 'local') {
+ return arrayToLocalDate(dateToUtcArray(m));
+ }
+ if (this.timeZone === 'UTC') {
+ return new Date(m.valueOf()); // make sure it's a copy
+ }
+ if (!this.namedTimeZoneImpl) {
+ return new Date(m.valueOf() - (forcedTzo || 0));
+ }
+ return new Date(m.valueOf() -
+ this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60);
+ }
+ }
+
+ class NamedTimeZoneImpl {
+ constructor(timeZoneName) {
+ this.timeZoneName = timeZoneName;
+ }
+ }
+
+ class SegHierarchy {
+ constructor() {
+ // settings
+ this.strictOrder = false;
+ this.allowReslicing = false;
+ this.maxCoord = -1; // -1 means no max
+ this.maxStackCnt = -1; // -1 means no max
+ this.levelCoords = []; // ordered
+ this.entriesByLevel = []; // parallel with levelCoords
+ this.stackCnts = {}; // TODO: use better technique!?
+ }
+ addSegs(inputs) {
+ let hiddenEntries = [];
+ for (let input of inputs) {
+ this.insertEntry(input, hiddenEntries);
+ }
+ return hiddenEntries;
+ }
+ insertEntry(entry, hiddenEntries) {
+ let insertion = this.findInsertion(entry);
+ if (this.isInsertionValid(insertion, entry)) {
+ this.insertEntryAt(entry, insertion);
+ return 1;
+ }
+ return this.handleInvalidInsertion(insertion, entry, hiddenEntries);
+ }
+ isInsertionValid(insertion, entry) {
+ return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) &&
+ (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt);
+ }
+ // returns number of new entries inserted
+ handleInvalidInsertion(insertion, entry, hiddenEntries) {
+ if (this.allowReslicing && insertion.touchingEntry) {
+ return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries);
+ }
+ hiddenEntries.push(entry);
+ return 0;
+ }
+ splitEntry(entry, barrier, hiddenEntries) {
+ let partCnt = 0;
+ let splitHiddenEntries = [];
+ let entrySpan = entry.span;
+ let barrierSpan = barrier.span;
+ if (entrySpan.start < barrierSpan.start) {
+ partCnt += this.insertEntry({
+ index: entry.index,
+ thickness: entry.thickness,
+ span: { start: entrySpan.start, end: barrierSpan.start },
+ }, splitHiddenEntries);
+ }
+ if (entrySpan.end > barrierSpan.end) {
+ partCnt += this.insertEntry({
+ index: entry.index,
+ thickness: entry.thickness,
+ span: { start: barrierSpan.end, end: entrySpan.end },
+ }, splitHiddenEntries);
+ }
+ if (partCnt) {
+ hiddenEntries.push({
+ index: entry.index,
+ thickness: entry.thickness,
+ span: intersectSpans(barrierSpan, entrySpan), // guaranteed to intersect
+ }, ...splitHiddenEntries);
+ return partCnt;
+ }
+ hiddenEntries.push(entry);
+ return 0;
+ }
+ insertEntryAt(entry, insertion) {
+ let { entriesByLevel, levelCoords } = this;
+ if (insertion.lateral === -1) {
+ // create a new level
+ insertAt(levelCoords, insertion.level, insertion.levelCoord);
+ insertAt(entriesByLevel, insertion.level, [entry]);
+ }
+ else {
+ // insert into existing level
+ insertAt(entriesByLevel[insertion.level], insertion.lateral, entry);
+ }
+ this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt;
+ }
+ findInsertion(newEntry) {
+ let { levelCoords, entriesByLevel, strictOrder, stackCnts } = this;
+ let levelCnt = levelCoords.length;
+ let candidateCoord = 0;
+ let touchingLevel = -1;
+ let touchingLateral = -1;
+ let touchingEntry = null;
+ let stackCnt = 0;
+ for (let trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) {
+ let trackingCoord = levelCoords[trackingLevel];
+ // if the current level is past the placed entry, we have found a good empty space and can stop.
+ // if strictOrder, keep finding more lateral intersections.
+ if (!strictOrder && trackingCoord >= candidateCoord + newEntry.thickness) {
+ break;
+ }
+ let trackingEntries = entriesByLevel[trackingLevel];
+ let trackingEntry;
+ let searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end
+ let lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one
+ while ( // loop through entries that horizontally intersect
+ (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list
+ trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry
+ ) {
+ let trackingEntryBottom = trackingCoord + trackingEntry.thickness;
+ // intersects into the top of the candidate?
+ if (trackingEntryBottom > candidateCoord) {
+ candidateCoord = trackingEntryBottom;
+ touchingEntry = trackingEntry;
+ touchingLevel = trackingLevel;
+ touchingLateral = lateralIndex;
+ }
+ // butts up against top of candidate? (will happen if just intersected as well)
+ if (trackingEntryBottom === candidateCoord) {
+ // accumulate the highest possible stackCnt of the trackingEntries that butt up
+ stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1);
+ }
+ lateralIndex += 1;
+ }
+ }
+ // the destination level will be after touchingEntry's level. find it
+ let destLevel = 0;
+ if (touchingEntry) {
+ destLevel = touchingLevel + 1;
+ while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) {
+ destLevel += 1;
+ }
+ }
+ // if adding to an existing level, find where to insert
+ let destLateral = -1;
+ if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) {
+ destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0];
+ }
+ return {
+ touchingLevel,
+ touchingLateral,
+ touchingEntry,
+ stackCnt,
+ levelCoord: candidateCoord,
+ level: destLevel,
+ lateral: destLateral,
+ };
+ }
+ // sorted by levelCoord (lowest to highest)
+ toRects() {
+ let { entriesByLevel, levelCoords } = this;
+ let levelCnt = entriesByLevel.length;
+ let rects = [];
+ for (let level = 0; level < levelCnt; level += 1) {
+ let entries = entriesByLevel[level];
+ let levelCoord = levelCoords[level];
+ for (let entry of entries) {
+ rects.push(Object.assign(Object.assign({}, entry), { levelCoord }));
+ }
+ }
+ return rects;
+ }
+ }
+ function getEntrySpanEnd(entry) {
+ return entry.span.end;
+ }
+ function buildEntryKey(entry) {
+ return entry.index + ':' + entry.span.start;
+ }
+ // returns groups with entries sorted by input order
+ function groupIntersectingEntries(entries) {
+ let merges = [];
+ for (let entry of entries) {
+ let filteredMerges = [];
+ let hungryMerge = {
+ span: entry.span,
+ entries: [entry],
+ };
+ for (let merge of merges) {
+ if (intersectSpans(merge.span, hungryMerge.span)) {
+ hungryMerge = {
+ entries: merge.entries.concat(hungryMerge.entries),
+ span: joinSpans(merge.span, hungryMerge.span),
+ };
+ }
+ else {
+ filteredMerges.push(merge);
+ }
+ }
+ filteredMerges.push(hungryMerge);
+ merges = filteredMerges;
+ }
+ return merges;
+ }
+ function joinSpans(span0, span1) {
+ return {
+ start: Math.min(span0.start, span1.start),
+ end: Math.max(span0.end, span1.end),
+ };
+ }
+ function intersectSpans(span0, span1) {
+ let start = Math.max(span0.start, span1.start);
+ let end = Math.min(span0.end, span1.end);
+ if (start < end) {
+ return { start, end };
+ }
+ return null;
+ }
+ // general util
+ // ---------------------------------------------------------------------------------------------------------------------
+ function insertAt(arr, index, item) {
+ arr.splice(index, 0, item);
+ }
+ function binarySearch(a, searchVal, getItemVal) {
+ let startIndex = 0;
+ let endIndex = a.length; // exclusive
+ if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item
+ return [0, 0];
+ }
+ if (searchVal > getItemVal(a[endIndex - 1])) { // after last item
+ return [endIndex, 0];
+ }
+ while (startIndex < endIndex) {
+ let middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2);
+ let middleVal = getItemVal(a[middleIndex]);
+ if (searchVal < middleVal) {
+ endIndex = middleIndex;
+ }
+ else if (searchVal > middleVal) {
+ startIndex = middleIndex + 1;
+ }
+ else { // equal!
+ return [middleIndex, 1];
+ }
+ }
+ return [startIndex, 0];
+ }
+
+ class Interaction {
+ constructor(settings) {
+ this.component = settings.component;
+ this.isHitComboAllowed = settings.isHitComboAllowed || null;
+ }
+ destroy() {
+ }
+ }
+ function parseInteractionSettings(component, input) {
+ return {
+ component,
+ el: input.el,
+ useEventCenter: input.useEventCenter != null ? input.useEventCenter : true,
+ isHitComboAllowed: input.isHitComboAllowed || null,
+ };
+ }
+ function interactionSettingsToStore(settings) {
+ return {
+ [settings.component.uid]: settings,
+ };
+ }
+ // global state
+ const interactionSettingsStore = {};
+
+ /*
+ An abstraction for a dragging interaction originating on an event.
+ Does higher-level things than PointerDragger, such as possibly:
+ - a "mirror" that moves with the pointer
+ - a minimum number of pixels or other criteria for a true drag to begin
+
+ subclasses must emit:
+ - pointerdown
+ - dragstart
+ - dragmove
+ - pointerup
+ - dragend
+ */
+ class ElementDragging {
+ constructor(el, selector) {
+ this.emitter = new Emitter();
+ }
+ destroy() {
+ }
+ setMirrorIsVisible(bool) {
+ // optional if subclass doesn't want to support a mirror
+ }
+ setMirrorNeedsRevert(bool) {
+ // optional if subclass doesn't want to support a mirror
+ }
+ setAutoScrollEnabled(bool) {
+ // optional
+ }
+ }
+
+ // TODO: get rid of this in favor of options system,
+ // tho it's really easy to access this globally rather than pass thru options.
+ const config = {};
+
+ /*
+ Information about what will happen when an external element is dragged-and-dropped
+ onto a calendar. Contains information for creating an event.
+ */
+ const DRAG_META_REFINERS = {
+ startTime: createDuration,
+ duration: createDuration,
+ create: Boolean,
+ sourceId: String,
+ };
+ function parseDragMeta(raw) {
+ let { refined, extra } = refineProps(raw, DRAG_META_REFINERS);
+ return {
+ startTime: refined.startTime || null,
+ duration: refined.duration || null,
+ create: refined.create != null ? refined.create : true,
+ sourceId: refined.sourceId,
+ leftoverProps: extra,
+ };
+ }
+
+ class CalendarRoot extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.state = {
+ forPrint: false,
+ };
+ this.handleBeforePrint = () => {
+ this.setState({ forPrint: true });
+ };
+ this.handleAfterPrint = () => {
+ this.setState({ forPrint: false });
+ };
+ }
+ render() {
+ let { props } = this;
+ let { options } = props;
+ let { forPrint } = this.state;
+ let isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto';
+ let height = (!isHeightAuto && options.height != null) ? options.height : '';
+ let classNames = [
+ 'fc',
+ forPrint ? 'fc-media-print' : 'fc-media-screen',
+ `fc-direction-${options.direction}`,
+ props.theme.getClass('root'),
+ ];
+ if (!getCanVGrowWithinCell()) {
+ classNames.push('fc-liquid-hack');
+ }
+ return props.children(classNames, height, isHeightAuto, forPrint);
+ }
+ componentDidMount() {
+ let { emitter } = this.props;
+ emitter.on('_beforeprint', this.handleBeforePrint);
+ emitter.on('_afterprint', this.handleAfterPrint);
+ }
+ componentWillUnmount() {
+ let { emitter } = this.props;
+ emitter.off('_beforeprint', this.handleBeforePrint);
+ emitter.off('_afterprint', this.handleAfterPrint);
+ }
+ }
+
+ // Computes a default column header formatting string if `colFormat` is not explicitly defined
+ function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
+ // if more than one week row, or if there are a lot of columns with not much space,
+ // put just the day numbers will be in each cell
+ if (!datesRepDistinctDays || dayCnt > 10) {
+ return createFormatter({ weekday: 'short' }); // "Sat"
+ }
+ if (dayCnt > 1) {
+ return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12"
+ }
+ return createFormatter({ weekday: 'long' }); // "Saturday"
+ }
+
+ const CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no
+ function renderInner$1(renderProps) {
+ return renderProps.text;
+ }
+
+ class ContentInjector extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.id = guid();
+ this.currentDomNodes = [];
+ this.queuedDomNodes = [];
+ this.handleEl = (el) => {
+ if (this.props.elRef) {
+ setRef(this.props.elRef, el);
+ }
+ };
+ }
+ render() {
+ const { props, context } = this;
+ const { options } = context;
+ const { generator, renderProps } = props;
+ const attrs = buildElAttrs(props);
+ let innerContent;
+ let queuedDomNodes = [];
+ if (hasCustomRenderingHandler(props.generatorName, options)) {
+ if (options.customRenderingReplacesEl) {
+ delete attrs.elRef; // because handleEl will be used
+ }
+ }
+ else {
+ const customContent = typeof generator === 'function' ?
+ generator(renderProps, h) :
+ generator;
+ if (typeof customContent === 'string' ||
+ i$1(customContent) ||
+ Array.isArray(customContent)) {
+ innerContent = customContent;
+ }
+ else if (typeof customContent === 'object') {
+ if ('html' in customContent) {
+ attrs.dangerouslySetInnerHTML = { __html: customContent.html };
+ }
+ else if ('domNodes' in customContent) {
+ queuedDomNodes = Array.prototype.slice.call(customContent.domNodes);
+ }
+ }
+ }
+ this.queuedDomNodes = queuedDomNodes;
+ return h(props.elTag, attrs, innerContent);
+ }
+ componentDidMount() {
+ this.applyQueueudDomNodes();
+ this.triggerCustomRendering(true);
+ }
+ componentDidUpdate() {
+ this.applyQueueudDomNodes();
+ this.triggerCustomRendering(true);
+ }
+ componentWillUnmount() {
+ this.triggerCustomRendering(false); // TODO: different API for removal?
+ }
+ triggerCustomRendering(isActive) {
+ const { props, context } = this;
+ const { handleCustomRendering, customRenderingMetaMap } = context.options;
+ if (handleCustomRendering) {
+ const customRenderingMeta = customRenderingMetaMap === null || customRenderingMetaMap === void 0 ? void 0 : customRenderingMetaMap[props.generatorName];
+ if (customRenderingMeta) {
+ handleCustomRendering(Object.assign({ id: this.id, isActive, containerEl: this.base, reportNewContainerEl: this.handleEl, generatorMeta: customRenderingMeta }, props));
+ }
+ }
+ }
+ applyQueueudDomNodes() {
+ const { queuedDomNodes, currentDomNodes } = this;
+ const el = this.base;
+ if (!isArraysEqual(queuedDomNodes, currentDomNodes)) {
+ currentDomNodes.forEach(removeElement);
+ for (let newNode of queuedDomNodes) {
+ el.appendChild(newNode);
+ }
+ this.currentDomNodes = queuedDomNodes;
+ }
+ }
+ }
+ ContentInjector.addPropsEquality({
+ elClasses: isArraysEqual,
+ elStyle: isPropsEqual,
+ elAttrs: isNonHandlerPropsEqual,
+ renderProps: isPropsEqual,
+ });
+ // Util
+ function hasCustomRenderingHandler(generatorName, options) {
+ var _a;
+ return Boolean(options.handleCustomRendering &&
+ generatorName &&
+ ((_a = options.customRenderingMetaMap) === null || _a === void 0 ? void 0 : _a[generatorName]));
+ }
+ function buildElAttrs(props, extraClassNames) {
+ const attrs = Object.assign(Object.assign({}, props.elAttrs), { ref: props.elRef });
+ if (props.elClasses || extraClassNames) {
+ attrs.className = (props.elClasses || [])
+ .concat(extraClassNames || [])
+ .concat(attrs.className || [])
+ .filter(Boolean)
+ .join(' ');
+ }
+ if (props.elStyle) {
+ attrs.style = props.elStyle;
+ }
+ return attrs;
+ }
+
+ const RenderId = createContext(0);
+
+ class ContentContainer extends d {
+ constructor() {
+ super(...arguments);
+ this.InnerContent = InnerContentInjector.bind(undefined, this);
+ }
+ render() {
+ const { props } = this;
+ const generatedClassNames = generateClassNames(props.classNameGenerator, props.renderProps);
+ if (props.children) {
+ const elAttrs = buildElAttrs(props, generatedClassNames);
+ const children = props.children(this.InnerContent, props.renderProps, elAttrs);
+ if (props.elTag) {
+ return h(props.elTag, elAttrs, children);
+ }
+ else {
+ return children;
+ }
+ }
+ else {
+ return h((ContentInjector), Object.assign(Object.assign({}, props), { elTag: props.elTag || 'div', elClasses: (props.elClasses || []).concat(generatedClassNames), renderId: this.context }));
+ }
+ }
+ componentDidMount() {
+ var _a, _b;
+ (_b = (_a = this.props).didMount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base }));
+ }
+ componentWillUnmount() {
+ var _a, _b;
+ (_b = (_a = this.props).willUnmount) === null || _b === void 0 ? void 0 : _b.call(_a, Object.assign(Object.assign({}, this.props.renderProps), { el: this.base }));
+ }
+ }
+ ContentContainer.contextType = RenderId;
+ function InnerContentInjector(containerComponent, props) {
+ const parentProps = containerComponent.props;
+ return h((ContentInjector), Object.assign({ renderProps: parentProps.renderProps, generatorName: parentProps.generatorName, generator: parentProps.generator, renderId: containerComponent.context }, props));
+ }
+ // Utils
+ function generateClassNames(classNameGenerator, renderProps) {
+ const classNames = typeof classNameGenerator === 'function' ?
+ classNameGenerator(renderProps) :
+ classNameGenerator || [];
+ return typeof classNames === 'string' ? [classNames] : classNames;
+ }
+
+ // BAD name for this class now. used in the Header
+ class TableDateCell extends BaseComponent {
+ render() {
+ let { dateEnv, options, theme, viewApi } = this.context;
+ let { props } = this;
+ let { date, dateProfile } = props;
+ let dayMeta = getDateMeta(date, props.todayRange, null, dateProfile);
+ let classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme));
+ let text = dateEnv.format(date, props.dayHeaderFormat);
+ // if colCnt is 1, we are already in a day-view and don't need a navlink
+ let navLinkAttrs = (!dayMeta.isDisabled && props.colCnt > 1)
+ ? buildNavLinkAttrs(this.context, date)
+ : {};
+ let renderProps = Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraRenderProps), { text }), dayMeta);
+ return (h(ContentContainer, { elTag: "th", elClasses: classNames, elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan, 'data-date': !dayMeta.isDisabled ? formatDayString(date) : undefined }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContainer) => (h("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && (h(InnerContainer, { elTag: "a", elAttrs: navLinkAttrs, elClasses: [
+ 'fc-col-header-cell-cushion',
+ props.isSticky && 'fc-sticky',
+ ] }))))));
+ }
+ }
+
+ const WEEKDAY_FORMAT = createFormatter({ weekday: 'long' });
+ class TableDowCell extends BaseComponent {
+ render() {
+ let { props } = this;
+ let { dateEnv, theme, viewApi, options } = this.context;
+ let date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT
+ let dateMeta = {
+ dow: props.dow,
+ isDisabled: false,
+ isFuture: false,
+ isPast: false,
+ isToday: false,
+ isOther: false,
+ };
+ let text = dateEnv.format(date, props.dayHeaderFormat);
+ let renderProps = Object.assign(Object.assign(Object.assign(Object.assign({ // TODO: make this public?
+ date }, dateMeta), { view: viewApi }), props.extraRenderProps), { text });
+ return (h(ContentContainer, { elTag: "th", elClasses: [
+ CLASS_NAME,
+ ...getDayClassNames(dateMeta, theme),
+ ...(props.extraClassNames || []),
+ ], elAttrs: Object.assign({ role: 'columnheader', colSpan: props.colSpan }, props.extraDataAttrs), renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInner$1, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => (h("div", { className: "fc-scrollgrid-sync-inner" },
+ h(InnerContent, { elTag: "a", elClasses: [
+ 'fc-col-header-cell-cushion',
+ props.isSticky && 'fc-sticky',
+ ], elAttrs: {
+ 'aria-label': dateEnv.format(date, WEEKDAY_FORMAT),
+ } })))));
+ }
+ }
+
+ class NowTimer extends d {
+ constructor(props, context) {
+ super(props, context);
+ this.initialNowDate = getNow(context.options.now, context.dateEnv);
+ this.initialNowQueriedMs = new Date().valueOf();
+ this.state = this.computeTiming().currentState;
+ }
+ render() {
+ let { props, state } = this;
+ return props.children(state.nowDate, state.todayRange);
+ }
+ componentDidMount() {
+ this.setTimeout();
+ }
+ componentDidUpdate(prevProps) {
+ if (prevProps.unit !== this.props.unit) {
+ this.clearTimeout();
+ this.setTimeout();
+ }
+ }
+ componentWillUnmount() {
+ this.clearTimeout();
+ }
+ computeTiming() {
+ let { props, context } = this;
+ let unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs);
+ let currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
+ let nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
+ let waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
+ // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342)
+ // ensure no longer than a day
+ waitMs = Math.min(1000 * 60 * 60 * 24, waitMs);
+ return {
+ currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
+ nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) },
+ waitMs,
+ };
+ }
+ setTimeout() {
+ let { nextState, waitMs } = this.computeTiming();
+ this.timeoutId = setTimeout(() => {
+ this.setState(nextState, () => {
+ this.setTimeout();
+ });
+ }, waitMs);
+ }
+ clearTimeout() {
+ if (this.timeoutId) {
+ clearTimeout(this.timeoutId);
+ }
+ }
+ }
+ NowTimer.contextType = ViewContextType;
+ function buildDayRange(date) {
+ let start = startOfDay(date);
+ let end = addDays(start, 1);
+ return { start, end };
+ }
+
+ class DayHeader extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.createDayHeaderFormatter = memoize(createDayHeaderFormatter);
+ }
+ render() {
+ let { context } = this;
+ let { dates, dateProfile, datesRepDistinctDays, renderIntro } = this.props;
+ let dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length);
+ return (h(NowTimer, { unit: "day" }, (nowDate, todayRange) => (h("tr", { role: "row" },
+ renderIntro && renderIntro('day'),
+ dates.map((date) => (datesRepDistinctDays ? (h(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat })) : (h(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat }))))))));
+ }
+ }
+ function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) {
+ return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt);
+ }
+
+ class DaySeriesModel {
+ constructor(range, dateProfileGenerator) {
+ let date = range.start;
+ let { end } = range;
+ let indices = [];
+ let dates = [];
+ let dayIndex = -1;
+ while (date < end) { // loop each day from start to end
+ if (dateProfileGenerator.isHiddenDay(date)) {
+ indices.push(dayIndex + 0.5); // mark that it's between indices
+ }
+ else {
+ dayIndex += 1;
+ indices.push(dayIndex);
+ dates.push(date);
+ }
+ date = addDays(date, 1);
+ }
+ this.dates = dates;
+ this.indices = indices;
+ this.cnt = dates.length;
+ }
+ sliceRange(range) {
+ let firstIndex = this.getDateDayIndex(range.start); // inclusive first index
+ let lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
+ let clippedFirstIndex = Math.max(0, firstIndex);
+ let clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
+ // deal with in-between indices
+ clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
+ clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
+ if (clippedFirstIndex <= clippedLastIndex) {
+ return {
+ firstIndex: clippedFirstIndex,
+ lastIndex: clippedLastIndex,
+ isStart: firstIndex === clippedFirstIndex,
+ isEnd: lastIndex === clippedLastIndex,
+ };
+ }
+ return null;
+ }
+ // Given a date, returns its chronolocial cell-index from the first cell of the grid.
+ // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
+ // If before the first offset, returns a negative number.
+ // If after the last offset, returns an offset past the last cell offset.
+ // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
+ getDateDayIndex(date) {
+ let { indices } = this;
+ let dayOffset = Math.floor(diffDays(this.dates[0], date));
+ if (dayOffset < 0) {
+ return indices[0] - 1;
+ }
+ if (dayOffset >= indices.length) {
+ return indices[indices.length - 1] + 1;
+ }
+ return indices[dayOffset];
+ }
+ }
+
+ class DayTableModel {
+ constructor(daySeries, breakOnWeeks) {
+ let { dates } = daySeries;
+ let daysPerRow;
+ let firstDay;
+ let rowCnt;
+ if (breakOnWeeks) {
+ // count columns until the day-of-week repeats
+ firstDay = dates[0].getUTCDay();
+ for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) {
+ if (dates[daysPerRow].getUTCDay() === firstDay) {
+ break;
+ }
+ }
+ rowCnt = Math.ceil(dates.length / daysPerRow);
+ }
+ else {
+ rowCnt = 1;
+ daysPerRow = dates.length;
+ }
+ this.rowCnt = rowCnt;
+ this.colCnt = daysPerRow;
+ this.daySeries = daySeries;
+ this.cells = this.buildCells();
+ this.headerDates = this.buildHeaderDates();
+ }
+ buildCells() {
+ let rows = [];
+ for (let row = 0; row < this.rowCnt; row += 1) {
+ let cells = [];
+ for (let col = 0; col < this.colCnt; col += 1) {
+ cells.push(this.buildCell(row, col));
+ }
+ rows.push(cells);
+ }
+ return rows;
+ }
+ buildCell(row, col) {
+ let date = this.daySeries.dates[row * this.colCnt + col];
+ return {
+ key: date.toISOString(),
+ date,
+ };
+ }
+ buildHeaderDates() {
+ let dates = [];
+ for (let col = 0; col < this.colCnt; col += 1) {
+ dates.push(this.cells[0][col].date);
+ }
+ return dates;
+ }
+ sliceRange(range) {
+ let { colCnt } = this;
+ let seriesSeg = this.daySeries.sliceRange(range);
+ let segs = [];
+ if (seriesSeg) {
+ let { firstIndex, lastIndex } = seriesSeg;
+ let index = firstIndex;
+ while (index <= lastIndex) {
+ let row = Math.floor(index / colCnt);
+ let nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
+ segs.push({
+ row,
+ firstCol: index % colCnt,
+ lastCol: (nextIndex - 1) % colCnt,
+ isStart: seriesSeg.isStart && index === firstIndex,
+ isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex,
+ });
+ index = nextIndex;
+ }
+ }
+ return segs;
+ }
+ }
+
+ class Slicer {
+ constructor() {
+ this.sliceBusinessHours = memoize(this._sliceBusinessHours);
+ this.sliceDateSelection = memoize(this._sliceDateSpan);
+ this.sliceEventStore = memoize(this._sliceEventStore);
+ this.sliceEventDrag = memoize(this._sliceInteraction);
+ this.sliceEventResize = memoize(this._sliceInteraction);
+ this.forceDayIfListItem = false; // hack
+ }
+ sliceProps(props, dateProfile, nextDayThreshold, context, ...extraArgs) {
+ let { eventUiBases } = props;
+ let eventSegs = this.sliceEventStore(props.eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs);
+ return {
+ dateSelectionSegs: this.sliceDateSelection(props.dateSelection, eventUiBases, context, ...extraArgs),
+ businessHourSegs: this.sliceBusinessHours(props.businessHours, dateProfile, nextDayThreshold, context, ...extraArgs),
+ fgEventSegs: eventSegs.fg,
+ bgEventSegs: eventSegs.bg,
+ eventDrag: this.sliceEventDrag(props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs),
+ eventResize: this.sliceEventResize(props.eventResize, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs),
+ eventSelection: props.eventSelection,
+ }; // TODO: give interactionSegs?
+ }
+ sliceNowDate(// does not memoize
+ date, context, ...extraArgs) {
+ return this._sliceDateSpan({ range: { start: date, end: addMs(date, 1) }, allDay: false }, // add 1 ms, protect against null range
+ {}, context, ...extraArgs);
+ }
+ _sliceBusinessHours(businessHours, dateProfile, nextDayThreshold, context, ...extraArgs) {
+ if (!businessHours) {
+ return [];
+ }
+ return this._sliceEventStore(expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold, ...extraArgs).bg;
+ }
+ _sliceEventStore(eventStore, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) {
+ if (eventStore) {
+ let rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+ return {
+ bg: this.sliceEventRanges(rangeRes.bg, extraArgs),
+ fg: this.sliceEventRanges(rangeRes.fg, extraArgs),
+ };
+ }
+ return { bg: [], fg: [] };
+ }
+ _sliceInteraction(interaction, eventUiBases, dateProfile, nextDayThreshold, ...extraArgs) {
+ if (!interaction) {
+ return null;
+ }
+ let rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+ return {
+ segs: this.sliceEventRanges(rangeRes.fg, extraArgs),
+ affectedInstances: interaction.affectedEvents.instances,
+ isEvent: interaction.isEvent,
+ };
+ }
+ _sliceDateSpan(dateSpan, eventUiBases, context, ...extraArgs) {
+ if (!dateSpan) {
+ return [];
+ }
+ let eventRange = fabricateEventRange(dateSpan, eventUiBases, context);
+ let segs = this.sliceRange(dateSpan.range, ...extraArgs);
+ for (let seg of segs) {
+ seg.eventRange = eventRange;
+ }
+ return segs;
+ }
+ /*
+ "complete" seg means it has component and eventRange
+ */
+ sliceEventRanges(eventRanges, extraArgs) {
+ let segs = [];
+ for (let eventRange of eventRanges) {
+ segs.push(...this.sliceEventRange(eventRange, extraArgs));
+ }
+ return segs;
+ }
+ /*
+ "complete" seg means it has component and eventRange
+ */
+ sliceEventRange(eventRange, extraArgs) {
+ let dateRange = eventRange.range;
+ // hack to make multi-day events that are being force-displayed as list-items to take up only one day
+ if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') {
+ dateRange = {
+ start: dateRange.start,
+ end: addDays(dateRange.start, 1),
+ };
+ }
+ let segs = this.sliceRange(dateRange, ...extraArgs);
+ for (let seg of segs) {
+ seg.eventRange = eventRange;
+ seg.isStart = eventRange.isStart && seg.isStart;
+ seg.isEnd = eventRange.isEnd && seg.isEnd;
+ }
+ return segs;
+ }
+ }
+ /*
+ for incorporating slotMinTime/slotMaxTime if appropriate
+ TODO: should be part of DateProfile!
+ TimelineDateProfile already does this btw
+ */
+ function computeActiveRange(dateProfile, isComponentAllDay) {
+ let range = dateProfile.activeRange;
+ if (isComponentAllDay) {
+ return range;
+ }
+ return {
+ start: addMs(range.start, dateProfile.slotMinTime.milliseconds),
+ end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5), // 864e5 = ms in a day
+ };
+ }
+
+ function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
+ switch (action.type) {
+ case 'RECEIVE_EVENTS': // raw
+ return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
+ case 'ADD_EVENTS': // already parsed, but not expanded
+ return addEvent(eventStore, action.eventStore, // new ones
+ dateProfile ? dateProfile.activeRange : null, context);
+ case 'RESET_EVENTS':
+ return action.eventStore;
+ case 'MERGE_EVENTS': // already parsed and expanded
+ return mergeEventStores(eventStore, action.eventStore);
+ case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+ case 'NEXT':
+ case 'CHANGE_DATE':
+ case 'CHANGE_VIEW_TYPE':
+ if (dateProfile) {
+ return expandRecurring(eventStore, dateProfile.activeRange, context);
+ }
+ return eventStore;
+ case 'REMOVE_EVENTS':
+ return excludeSubEventStore(eventStore, action.eventStore);
+ case 'REMOVE_EVENT_SOURCE':
+ return excludeEventsBySourceId(eventStore, action.sourceId);
+ case 'REMOVE_ALL_EVENT_SOURCES':
+ return filterEventStoreDefs(eventStore, (eventDef) => (!eventDef.sourceId // only keep events with no source id
+ ));
+ case 'REMOVE_ALL_EVENTS':
+ return createEmptyEventStore();
+ default:
+ return eventStore;
+ }
+ }
+ function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
+ if (eventSource && // not already removed
+ fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
+ ) {
+ let subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
+ if (fetchRange) {
+ subset = expandRecurring(subset, fetchRange, context);
+ }
+ return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
+ }
+ return eventStore;
+ }
+ function transformRawEvents(rawEvents, eventSource, context) {
+ let calEachTransform = context.options.eventDataTransform;
+ let sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
+ if (sourceEachTransform) {
+ rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
+ }
+ if (calEachTransform) {
+ rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
+ }
+ return rawEvents;
+ }
+ function transformEachRawEvent(rawEvents, func) {
+ let refinedEvents;
+ if (!func) {
+ refinedEvents = rawEvents;
+ }
+ else {
+ refinedEvents = [];
+ for (let rawEvent of rawEvents) {
+ let refinedEvent = func(rawEvent);
+ if (refinedEvent) {
+ refinedEvents.push(refinedEvent);
+ }
+ else if (refinedEvent == null) {
+ refinedEvents.push(rawEvent);
+ } // if a different falsy value, do nothing
+ }
+ }
+ return refinedEvents;
+ }
+ function addEvent(eventStore, subset, expandRange, context) {
+ if (expandRange) {
+ subset = expandRecurring(subset, expandRange, context);
+ }
+ return mergeEventStores(eventStore, subset);
+ }
+ function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) {
+ let { defs } = eventStore;
+ let instances = mapHash(eventStore.instances, (instance) => {
+ let def = defs[instance.defId];
+ if (def.allDay || def.recurringDef) {
+ return instance; // isn't dependent on timezone
+ }
+ return Object.assign(Object.assign({}, instance), { range: {
+ start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
+ end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)),
+ }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
+ });
+ return { defs, instances };
+ }
+ function excludeEventsBySourceId(eventStore, sourceId) {
+ return filterEventStoreDefs(eventStore, (eventDef) => eventDef.sourceId !== sourceId);
+ }
+ // QUESTION: why not just return instances? do a general object-property-exclusion util
+ function excludeInstances(eventStore, removals) {
+ return {
+ defs: eventStore.defs,
+ instances: filterHash(eventStore.instances, (instance) => !removals[instance.instanceId]),
+ };
+ }
+
+ // high-level segmenting-aware tester functions
+ // ------------------------------------------------------------------------------------------------------------------------
+ function isInteractionValid(interaction, dateProfile, context) {
+ let { instances } = interaction.mutatedEvents;
+ for (let instanceId in instances) {
+ if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
+ return false;
+ }
+ }
+ return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions
+ }
+ function isDateSelectionValid(dateSelection, dateProfile, context) {
+ if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) {
+ return false;
+ }
+ return isNewPropsValid({ dateSelection }, context);
+ }
+ function isNewPropsValid(newProps, context) {
+ let calendarState = context.getCurrentData();
+ let props = Object.assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
+ return (context.pluginHooks.isPropsValid || isPropsValid)(props, context);
+ }
+ function isPropsValid(state, context, dateSpanMeta = {}, filterConfig) {
+ if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) {
+ return false;
+ }
+ if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) {
+ return false;
+ }
+ return true;
+ }
+ // Moving Event Validation
+ // ------------------------------------------------------------------------------------------------------------------------
+ function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) {
+ let currentState = context.getCurrentData();
+ let interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
+ let subjectEventStore = interaction.mutatedEvents;
+ let subjectDefs = subjectEventStore.defs;
+ let subjectInstances = subjectEventStore.instances;
+ let subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
+ state.eventUiBases :
+ { '': currentState.selectionConfig });
+ if (filterConfig) {
+ subjectConfigs = mapHash(subjectConfigs, filterConfig);
+ }
+ // exclude the subject events. TODO: exclude defs too?
+ let otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances);
+ let otherDefs = otherEventStore.defs;
+ let otherInstances = otherEventStore.instances;
+ let otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
+ for (let subjectInstanceId in subjectInstances) {
+ let subjectInstance = subjectInstances[subjectInstanceId];
+ let subjectRange = subjectInstance.range;
+ let subjectConfig = subjectConfigs[subjectInstance.defId];
+ let subjectDef = subjectDefs[subjectInstance.defId];
+ // constraint
+ if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) {
+ return false;
+ }
+ // overlap
+ let { eventOverlap } = context.options;
+ let eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null;
+ for (let otherInstanceId in otherInstances) {
+ let otherInstance = otherInstances[otherInstanceId];
+ // intersect! evaluate
+ if (rangesIntersect(subjectRange, otherInstance.range)) {
+ let otherOverlap = otherConfigs[otherInstance.defId].overlap;
+ // consider the other event's overlap. only do this if the subject event is a "real" event
+ if (otherOverlap === false && interaction.isEvent) {
+ return false;
+ }
+ if (subjectConfig.overlap === false) {
+ return false;
+ }
+ if (eventOverlapFunc && !eventOverlapFunc(new EventImpl(context, otherDefs[otherInstance.defId], otherInstance), // still event
+ new EventImpl(context, subjectDef, subjectInstance))) {
+ return false;
+ }
+ }
+ }
+ // allow (a function)
+ let calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state
+ for (let subjectAllow of subjectConfig.allows) {
+ let subjectDateSpan = Object.assign(Object.assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay });
+ let origDef = calendarEventStore.defs[subjectDef.defId];
+ let origInstance = calendarEventStore.instances[subjectInstanceId];
+ let eventApi;
+ if (origDef) { // was previously in the calendar
+ eventApi = new EventImpl(context, origDef, origInstance);
+ }
+ else { // was an external event
+ eventApi = new EventImpl(context, subjectDef); // no instance, because had no dates
+ }
+ if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ // Date Selection Validation
+ // ------------------------------------------------------------------------------------------------------------------------
+ function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) {
+ let relevantEventStore = state.eventStore;
+ let relevantDefs = relevantEventStore.defs;
+ let relevantInstances = relevantEventStore.instances;
+ let selection = state.dateSelection;
+ let selectionRange = selection.range;
+ let { selectionConfig } = context.getCurrentData();
+ if (filterConfig) {
+ selectionConfig = filterConfig(selectionConfig);
+ }
+ // constraint
+ if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) {
+ return false;
+ }
+ // overlap
+ let { selectOverlap } = context.options;
+ let selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null;
+ for (let relevantInstanceId in relevantInstances) {
+ let relevantInstance = relevantInstances[relevantInstanceId];
+ // intersect! evaluate
+ if (rangesIntersect(selectionRange, relevantInstance.range)) {
+ if (selectionConfig.overlap === false) {
+ return false;
+ }
+ if (selectOverlapFunc && !selectOverlapFunc(new EventImpl(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) {
+ return false;
+ }
+ }
+ }
+ // allow (a function)
+ for (let selectionAllow of selectionConfig.allows) {
+ let fullDateSpan = Object.assign(Object.assign({}, dateSpanMeta), selection);
+ if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ // Constraint Utils
+ // ------------------------------------------------------------------------------------------------------------------------
+ function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) {
+ for (let constraint of constraints) {
+ if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
+ otherEventStore, // for if constraint is an even group ID
+ businessHoursUnexpanded, // for if constraint is 'businessHours'
+ context) {
+ if (constraint === 'businessHours') {
+ return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context));
+ }
+ if (typeof constraint === 'string') { // an group ID
+ return eventStoreToRanges(filterEventStoreDefs(otherEventStore, (eventDef) => eventDef.groupId === constraint));
+ }
+ if (typeof constraint === 'object' && constraint) { // non-null object
+ return eventStoreToRanges(expandRecurring(constraint, subjectRange, context));
+ }
+ return []; // if it's false
+ }
+ // TODO: move to event-store file?
+ function eventStoreToRanges(eventStore) {
+ let { instances } = eventStore;
+ let ranges = [];
+ for (let instanceId in instances) {
+ ranges.push(instances[instanceId].range);
+ }
+ return ranges;
+ }
+ // TODO: move to geom file?
+ function anyRangesContainRange(outerRanges, innerRange) {
+ for (let outerRange of outerRanges) {
+ if (rangeContainsRange(outerRange, innerRange)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ class JsonRequestError extends Error {
+ constructor(message, response) {
+ super(message);
+ this.response = response;
+ }
+ }
+ function requestJson(method, url, params) {
+ method = method.toUpperCase();
+ const fetchOptions = {
+ method,
+ };
+ if (method === 'GET') {
+ url += (url.indexOf('?') === -1 ? '?' : '&') +
+ new URLSearchParams(params);
+ }
+ else {
+ fetchOptions.body = new URLSearchParams(params);
+ fetchOptions.headers = {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ };
+ }
+ return fetch(url, fetchOptions).then((fetchRes) => {
+ if (fetchRes.ok) {
+ return fetchRes.json().then((parsedResponse) => {
+ return [parsedResponse, fetchRes];
+ }, () => {
+ throw new JsonRequestError('Failure parsing JSON', fetchRes);
+ });
+ }
+ else {
+ throw new JsonRequestError('Request failed', fetchRes);
+ }
+ });
+ }
+
+ class DelayedRunner {
+ constructor(drainedOption) {
+ this.drainedOption = drainedOption;
+ this.isRunning = false;
+ this.isDirty = false;
+ this.pauseDepths = {};
+ this.timeoutId = 0;
+ }
+ request(delay) {
+ this.isDirty = true;
+ if (!this.isPaused()) {
+ this.clearTimeout();
+ if (delay == null) {
+ this.tryDrain();
+ }
+ else {
+ this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look at debounce
+ this.tryDrain.bind(this), delay);
+ }
+ }
+ }
+ pause(scope = '') {
+ let { pauseDepths } = this;
+ pauseDepths[scope] = (pauseDepths[scope] || 0) + 1;
+ this.clearTimeout();
+ }
+ resume(scope = '', force) {
+ let { pauseDepths } = this;
+ if (scope in pauseDepths) {
+ if (force) {
+ delete pauseDepths[scope];
+ }
+ else {
+ pauseDepths[scope] -= 1;
+ let depth = pauseDepths[scope];
+ if (depth <= 0) {
+ delete pauseDepths[scope];
+ }
+ }
+ this.tryDrain();
+ }
+ }
+ isPaused() {
+ return Object.keys(this.pauseDepths).length;
+ }
+ tryDrain() {
+ if (!this.isRunning && !this.isPaused()) {
+ this.isRunning = true;
+ while (this.isDirty) {
+ this.isDirty = false;
+ this.drained(); // might set isDirty to true again
+ }
+ this.isRunning = false;
+ }
+ }
+ clear() {
+ this.clearTimeout();
+ this.isDirty = false;
+ this.pauseDepths = {};
+ }
+ clearTimeout() {
+ if (this.timeoutId) {
+ clearTimeout(this.timeoutId);
+ this.timeoutId = 0;
+ }
+ }
+ drained() {
+ if (this.drainedOption) {
+ this.drainedOption();
+ }
+ }
+ }
+
+ const VISIBLE_HIDDEN_RE = /^(visible|hidden)$/;
+ class Scroller extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.handleEl = (el) => {
+ this.el = el;
+ setRef(this.props.elRef, el);
+ };
+ }
+ render() {
+ let { props } = this;
+ let { liquid, liquidIsAbsolute } = props;
+ let isAbsolute = liquid && liquidIsAbsolute;
+ let className = ['fc-scroller'];
+ if (liquid) {
+ if (liquidIsAbsolute) {
+ className.push('fc-scroller-liquid-absolute');
+ }
+ else {
+ className.push('fc-scroller-liquid');
+ }
+ }
+ return (h("div", { ref: this.handleEl, className: className.join(' '), style: {
+ overflowX: props.overflowX,
+ overflowY: props.overflowY,
+ left: (isAbsolute && -(props.overcomeLeft || 0)) || '',
+ right: (isAbsolute && -(props.overcomeRight || 0)) || '',
+ bottom: (isAbsolute && -(props.overcomeBottom || 0)) || '',
+ marginLeft: (!isAbsolute && -(props.overcomeLeft || 0)) || '',
+ marginRight: (!isAbsolute && -(props.overcomeRight || 0)) || '',
+ marginBottom: (!isAbsolute && -(props.overcomeBottom || 0)) || '',
+ maxHeight: props.maxHeight || '',
+ } }, props.children));
+ }
+ needsXScrolling() {
+ if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
+ return false;
+ }
+ // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers.
+ // much more reliable to see if children are taller than the scroller, even tho doesn't account for
+ // inner-child margins and absolute positioning
+ let { el } = this;
+ let realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth();
+ let { children } = el;
+ for (let i = 0; i < children.length; i += 1) {
+ let childEl = children[i];
+ if (childEl.getBoundingClientRect().width > realClientWidth) {
+ return true;
+ }
+ }
+ return false;
+ }
+ needsYScrolling() {
+ if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
+ return false;
+ }
+ // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers.
+ // much more reliable to see if children are taller than the scroller, even tho doesn't account for
+ // inner-child margins and absolute positioning
+ let { el } = this;
+ let realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth();
+ let { children } = el;
+ for (let i = 0; i < children.length; i += 1) {
+ let childEl = children[i];
+ if (childEl.getBoundingClientRect().height > realClientHeight) {
+ return true;
+ }
+ }
+ return false;
+ }
+ getXScrollbarWidth() {
+ if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
+ return 0;
+ }
+ return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important?
+ }
+ getYScrollbarWidth() {
+ if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
+ return 0;
+ }
+ return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important?
+ }
+ }
+
+ /*
+ TODO: somehow infer OtherArgs from masterCallback?
+ TODO: infer RefType from masterCallback if provided
+ */
+ class RefMap {
+ constructor(masterCallback) {
+ this.masterCallback = masterCallback;
+ this.currentMap = {};
+ this.depths = {};
+ this.callbackMap = {};
+ this.handleValue = (val, key) => {
+ let { depths, currentMap } = this;
+ let removed = false;
+ let added = false;
+ if (val !== null) {
+ // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore
+ removed = (key in currentMap);
+ currentMap[key] = val;
+ depths[key] = (depths[key] || 0) + 1;
+ added = true;
+ }
+ else {
+ depths[key] -= 1;
+ if (!depths[key]) {
+ delete currentMap[key];
+ delete this.callbackMap[key];
+ removed = true;
+ }
+ }
+ if (this.masterCallback) {
+ if (removed) {
+ this.masterCallback(null, String(key));
+ }
+ if (added) {
+ this.masterCallback(val, String(key));
+ }
+ }
+ };
+ }
+ createRef(key) {
+ let refCallback = this.callbackMap[key];
+ if (!refCallback) {
+ refCallback = this.callbackMap[key] = (val) => {
+ this.handleValue(val, String(key));
+ };
+ }
+ return refCallback;
+ }
+ // TODO: check callers that don't care about order. should use getAll instead
+ // NOTE: this method has become less valuable now that we are encouraged to map order by some other index
+ // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect"
+ collect(startIndex, endIndex, step) {
+ return collectFromHash(this.currentMap, startIndex, endIndex, step);
+ }
+ getAll() {
+ return hashValuesToArray(this.currentMap);
+ }
+ }
+
+ function computeShrinkWidth(chunkEls) {
+ let shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink');
+ let largestWidth = 0;
+ for (let shrinkCell of shrinkCells) {
+ largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell));
+ }
+ return Math.ceil(largestWidth); // <table> elements work best with integers. round up to ensure contents fits
+ }
+ function getSectionHasLiquidHeight(props, sectionConfig) {
+ return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well)
+ }
+ function getAllowYScrolling(props, sectionConfig) {
+ return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars
+ getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars
+ }
+ // TODO: ONLY use `arg`. force out internal function to use same API
+ function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) {
+ let { expandRows } = arg;
+ let content = typeof chunkConfig.content === 'function' ?
+ chunkConfig.content(arg) :
+ h('table', {
+ role: 'presentation',
+ className: [
+ chunkConfig.tableClassName,
+ sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : '',
+ ].join(' '),
+ style: {
+ minWidth: arg.tableMinWidth,
+ width: arg.clientWidth,
+ height: expandRows ? arg.clientHeight : '', // css `height` on a <table> serves as a min-height
+ },
+ }, arg.tableColGroupNode, h(isHeader ? 'thead' : 'tbody', {
+ role: 'presentation',
+ }, typeof chunkConfig.rowContent === 'function'
+ ? chunkConfig.rowContent(arg)
+ : chunkConfig.rowContent));
+ return content;
+ }
+ function isColPropsEqual(cols0, cols1) {
+ return isArraysEqual(cols0, cols1, isPropsEqual);
+ }
+ function renderMicroColGroup(cols, shrinkWidth) {
+ let colNodes = [];
+ /*
+ for ColProps with spans, it would have been great to make a single <col span="">
+ HOWEVER, Chrome was getting messing up distributing the width to <td>/<th> elements with colspans.
+ SOLUTION: making individual <col> elements makes Chrome behave.
+ */
+ for (let colProps of cols) {
+ let span = colProps.span || 1;
+ for (let i = 0; i < span; i += 1) {
+ colNodes.push(h("col", { style: {
+ width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''),
+ minWidth: colProps.minWidth || '',
+ } }));
+ }
+ }
+ return h('colgroup', {}, ...colNodes);
+ }
+ function sanitizeShrinkWidth(shrinkWidth) {
+ /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth
+ 4 accounts for 2 2-pixel borders. TODO: better solution? */
+ return shrinkWidth == null ? 4 : shrinkWidth;
+ }
+ function hasShrinkWidth(cols) {
+ for (let col of cols) {
+ if (col.width === 'shrink') {
+ return true;
+ }
+ }
+ return false;
+ }
+ function getScrollGridClassNames(liquid, context) {
+ let classNames = [
+ 'fc-scrollgrid',
+ context.theme.getClass('table'),
+ ];
+ if (liquid) {
+ classNames.push('fc-scrollgrid-liquid');
+ }
+ return classNames;
+ }
+ function getSectionClassNames(sectionConfig, wholeTableVGrow) {
+ let classNames = [
+ 'fc-scrollgrid-section',
+ `fc-scrollgrid-section-${sectionConfig.type}`,
+ sectionConfig.className, // used?
+ ];
+ if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) {
+ classNames.push('fc-scrollgrid-section-liquid');
+ }
+ if (sectionConfig.isSticky) {
+ classNames.push('fc-scrollgrid-section-sticky');
+ }
+ return classNames;
+ }
+ function renderScrollShim(arg) {
+ return (h("div", { className: "fc-scrollgrid-sticky-shim", style: {
+ width: arg.clientWidth,
+ minWidth: arg.tableMinWidth,
+ } }));
+ }
+ function getStickyHeaderDates(options) {
+ let { stickyHeaderDates } = options;
+ if (stickyHeaderDates == null || stickyHeaderDates === 'auto') {
+ stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto';
+ }
+ return stickyHeaderDates;
+ }
+ function getStickyFooterScrollbar(options) {
+ let { stickyFooterScrollbar } = options;
+ if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') {
+ stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto';
+ }
+ return stickyFooterScrollbar;
+ }
+
+ class SimpleScrollGrid extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.processCols = memoize((a) => a, isColPropsEqual); // so we get same `cols` props every time
+ // yucky to memoize VNodes, but much more efficient for consumers
+ this.renderMicroColGroup = memoize(renderMicroColGroup);
+ this.scrollerRefs = new RefMap();
+ this.scrollerElRefs = new RefMap(this._handleScrollerEl.bind(this));
+ this.state = {
+ shrinkWidth: null,
+ forceYScrollbars: false,
+ scrollerClientWidths: {},
+ scrollerClientHeights: {},
+ };
+ // TODO: can do a really simple print-view. dont need to join rows
+ this.handleSizing = () => {
+ this.safeSetState(Object.assign({ shrinkWidth: this.computeShrinkWidth() }, this.computeScrollerDims()));
+ };
+ }
+ render() {
+ let { props, state, context } = this;
+ let sectionConfigs = props.sections || [];
+ let cols = this.processCols(props.cols);
+ let microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth);
+ let classNames = getScrollGridClassNames(props.liquid, context);
+ if (props.collapsibleWidth) {
+ classNames.push('fc-scrollgrid-collapsible');
+ }
+ // TODO: make DRY
+ let configCnt = sectionConfigs.length;
+ let configI = 0;
+ let currentConfig;
+ let headSectionNodes = [];
+ let bodySectionNodes = [];
+ let footSectionNodes = [];
+ while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') {
+ headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true));
+ configI += 1;
+ }
+ while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') {
+ bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false));
+ configI += 1;
+ }
+ while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') {
+ footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true));
+ configI += 1;
+ }
+ // firefox bug: when setting height on table and there is a thead or tfoot,
+ // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524)
+ // use getCanVGrowWithinCell as a way to detect table-stupid firefox.
+ // if so, use a simpler dom structure, jam everything into a lone tbody.
+ let isBuggy = !getCanVGrowWithinCell();
+ const roleAttrs = { role: 'rowgroup' };
+ return h('table', {
+ role: 'grid',
+ className: classNames.join(' '),
+ style: { height: props.height },
+ }, Boolean(!isBuggy && headSectionNodes.length) && h('thead', roleAttrs, ...headSectionNodes), Boolean(!isBuggy && bodySectionNodes.length) && h('tbody', roleAttrs, ...bodySectionNodes), Boolean(!isBuggy && footSectionNodes.length) && h('tfoot', roleAttrs, ...footSectionNodes), isBuggy && h('tbody', roleAttrs, ...headSectionNodes, ...bodySectionNodes, ...footSectionNodes));
+ }
+ renderSection(sectionConfig, microColGroupNode, isHeader) {
+ if ('outerContent' in sectionConfig) {
+ return (h(p, { key: sectionConfig.key }, sectionConfig.outerContent));
+ }
+ return (h("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader)));
+ }
+ renderChunkTd(sectionConfig, microColGroupNode, chunkConfig, isHeader) {
+ if ('outerContent' in chunkConfig) {
+ return chunkConfig.outerContent;
+ }
+ let { props } = this;
+ let { forceYScrollbars, scrollerClientWidths, scrollerClientHeights } = this.state;
+ let needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config?
+ let isLiquid = getSectionHasLiquidHeight(props, sectionConfig);
+ // for `!props.liquid` - is WHOLE scrollgrid natural height?
+ // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars
+ let overflowY = !props.liquid ? 'visible' :
+ forceYScrollbars ? 'scroll' :
+ !needsYScrolling ? 'hidden' :
+ 'auto';
+ let sectionKey = sectionConfig.key;
+ let content = renderChunkContent(sectionConfig, chunkConfig, {
+ tableColGroupNode: microColGroupNode,
+ tableMinWidth: '',
+ clientWidth: (!props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined) ? scrollerClientWidths[sectionKey] : null,
+ clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null,
+ expandRows: sectionConfig.expandRows,
+ syncRowHeights: false,
+ rowSyncHeights: [],
+ reportRowHeightChange: () => { },
+ }, isHeader);
+ return h(isHeader ? 'th' : 'td', {
+ ref: chunkConfig.elRef,
+ role: 'presentation',
+ }, h("div", { className: `fc-scroller-harness${isLiquid ? ' fc-scroller-harness-liquid' : ''}` },
+ h(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness
+ : true }, content)));
+ }
+ _handleScrollerEl(scrollerEl, key) {
+ let section = getSectionByKey(this.props.sections, key);
+ if (section) {
+ setRef(section.chunk.scrollerElRef, scrollerEl);
+ }
+ }
+ componentDidMount() {
+ this.handleSizing();
+ this.context.addResizeHandler(this.handleSizing);
+ }
+ componentDidUpdate() {
+ // TODO: need better solution when state contains non-sizing things
+ this.handleSizing();
+ }
+ componentWillUnmount() {
+ this.context.removeResizeHandler(this.handleSizing);
+ }
+ computeShrinkWidth() {
+ return hasShrinkWidth(this.props.cols)
+ ? computeShrinkWidth(this.scrollerElRefs.getAll())
+ : 0;
+ }
+ computeScrollerDims() {
+ let scrollbarWidth = getScrollbarWidths();
+ let { scrollerRefs, scrollerElRefs } = this;
+ let forceYScrollbars = false;
+ let scrollerClientWidths = {};
+ let scrollerClientHeights = {};
+ for (let sectionKey in scrollerRefs.currentMap) {
+ let scroller = scrollerRefs.currentMap[sectionKey];
+ if (scroller && scroller.needsYScrolling()) {
+ forceYScrollbars = true;
+ break;
+ }
+ }
+ for (let section of this.props.sections) {
+ let sectionKey = section.key;
+ let scrollerEl = scrollerElRefs.currentMap[sectionKey];
+ if (scrollerEl) {
+ let harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders
+ scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars
+ ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future
+ : 0));
+ scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height);
+ }
+ }
+ return { forceYScrollbars, scrollerClientWidths, scrollerClientHeights };
+ }
+ }
+ SimpleScrollGrid.addStateEquality({
+ scrollerClientWidths: isPropsEqual,
+ scrollerClientHeights: isPropsEqual,
+ });
+ function getSectionByKey(sections, key) {
+ for (let section of sections) {
+ if (section.key === key) {
+ return section;
+ }
+ }
+ return null;
+ }
+
+ class EventContainer extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.handleEl = (el) => {
+ this.el = el;
+ if (el) {
+ setElSeg(el, this.props.seg);
+ }
+ };
+ }
+ render() {
+ const { props, context } = this;
+ const { options } = context;
+ const { seg } = props;
+ const { eventRange } = seg;
+ const { ui } = eventRange;
+ const renderProps = {
+ event: new EventImpl(context, eventRange.def, eventRange.instance),
+ view: context.viewApi,
+ timeText: props.timeText,
+ textColor: ui.textColor,
+ backgroundColor: ui.backgroundColor,
+ borderColor: ui.borderColor,
+ isDraggable: !props.disableDragging && computeSegDraggable(seg, context),
+ isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context),
+ isEndResizable: !props.disableResizing && computeSegEndResizable(seg),
+ isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting),
+ isStart: Boolean(seg.isStart),
+ isEnd: Boolean(seg.isEnd),
+ isPast: Boolean(props.isPast),
+ isFuture: Boolean(props.isFuture),
+ isToday: Boolean(props.isToday),
+ isSelected: Boolean(props.isSelected),
+ isDragging: Boolean(props.isDragging),
+ isResizing: Boolean(props.isResizing),
+ };
+ return (h(ContentContainer, Object.assign({}, props /* contains children */, { elRef: this.handleEl, elClasses: [
+ ...getEventClassNames(renderProps),
+ ...seg.eventRange.ui.classNames,
+ ...(props.elClasses || []),
+ ], renderProps: renderProps, generatorName: "eventContent", generator: options.eventContent || props.defaultGenerator, classNameGenerator: options.eventClassNames, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount })));
+ }
+ componentDidUpdate(prevProps) {
+ if (this.el && this.props.seg !== prevProps.seg) {
+ setElSeg(this.el, this.props.seg);
+ }
+ }
+ }
+
+ // should not be a purecomponent
+ class StandardEvent extends BaseComponent {
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let { seg } = props;
+ let { ui } = seg.eventRange;
+ let timeFormat = options.eventTimeFormat || props.defaultTimeFormat;
+ let timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd);
+ return (h(EventContainer, Object.assign({}, props /* includes elRef */, { elTag: "a", elStyle: {
+ borderColor: ui.borderColor,
+ backgroundColor: ui.backgroundColor,
+ }, elAttrs: getSegAnchorAttrs(seg, context), defaultGenerator: renderInnerContent$1, timeText: timeText }), (InnerContent, eventContentArg) => (h(p, null,
+ h(InnerContent, { elTag: "div", elClasses: ['fc-event-main'], elStyle: { color: eventContentArg.textColor } }),
+ Boolean(eventContentArg.isStartResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-start" })),
+ Boolean(eventContentArg.isEndResizable) && (h("div", { className: "fc-event-resizer fc-event-resizer-end" }))))));
+ }
+ }
+ function renderInnerContent$1(innerProps) {
+ return (h("div", { className: "fc-event-main-frame" },
+ innerProps.timeText && (h("div", { className: "fc-event-time" }, innerProps.timeText)),
+ h("div", { className: "fc-event-title-container" },
+ h("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || h(p, null, "\u00A0")))));
+ }
+
+ const NowIndicatorContainer = (props) => (h(ViewContextType.Consumer, null, (context) => {
+ let { options } = context;
+ let renderProps = {
+ isAxis: props.isAxis,
+ date: context.dateEnv.toDate(props.date),
+ view: context.viewApi,
+ };
+ return (h(ContentContainer, Object.assign({}, props /* includes children */, { elTag: props.elTag || 'div', renderProps: renderProps, generatorName: "nowIndicatorContent", generator: options.nowIndicatorContent, classNameGenerator: options.nowIndicatorClassNames, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount })));
+ }));
+
+ const DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
+ class DayCellContainer extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.refineRenderProps = memoizeObjArg(refineRenderProps);
+ }
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let renderProps = this.refineRenderProps({
+ date: props.date,
+ dateProfile: props.dateProfile,
+ todayRange: props.todayRange,
+ showDayNumber: props.showDayNumber,
+ extraRenderProps: props.extraRenderProps,
+ viewApi: context.viewApi,
+ dateEnv: context.dateEnv,
+ });
+ return (h(ContentContainer, Object.assign({}, props /* includes children */, { elClasses: [
+ ...getDayClassNames(renderProps, context.theme),
+ ...(props.elClasses || []),
+ ], elAttrs: Object.assign(Object.assign({}, props.elAttrs), (renderProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) })), renderProps: renderProps, generatorName: "dayCellContent", generator: options.dayCellContent || props.defaultGenerator, classNameGenerator:
+ // don't use custom classNames if disabled
+ renderProps.isDisabled ? undefined : options.dayCellClassNames, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount })));
+ }
+ }
+ function hasCustomDayCellContent(options) {
+ return Boolean(options.dayCellContent || hasCustomRenderingHandler('dayCellContent', options));
+ }
+ function refineRenderProps(raw) {
+ let { date, dateEnv } = raw;
+ let dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile);
+ return Object.assign(Object.assign(Object.assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraRenderProps);
+ }
+
+ class BgEvent extends BaseComponent {
+ render() {
+ let { props } = this;
+ let { seg } = props;
+ return (h(EventContainer, { elTag: "div", elClasses: ['fc-bg-event'], elStyle: { backgroundColor: seg.eventRange.ui.backgroundColor }, defaultGenerator: renderInnerContent, seg: seg, timeText: "", isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, disableDragging: true, disableResizing: true }));
+ }
+ }
+ function renderInnerContent(props) {
+ let { title } = props.event;
+ return title && (h("div", { className: "fc-event-title" }, props.event.title));
+ }
+ function renderFill(fillType) {
+ return (h("div", { className: `fc-${fillType}` }));
+ }
+
+ const WeekNumberContainer = (props) => (h(ViewContextType.Consumer, null, (context) => {
+ let { dateEnv, options } = context;
+ let { date } = props;
+ let format = options.weekNumberFormat || props.defaultFormat;
+ let num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well?
+ let text = dateEnv.format(date, format);
+ let renderProps = { num, text, date };
+ return (h(ContentContainer // why isn't WeekNumberContentArg being auto-detected?
+ , Object.assign({}, props /* includes children */, { renderProps: renderProps, generatorName: "weekNumberContent", generator: options.weekNumberContent || renderInner, classNameGenerator: options.weekNumberClassNames, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount })));
+ }));
+ function renderInner(innerProps) {
+ return innerProps.text;
+ }
+
+ const PADDING_FROM_VIEWPORT = 10;
+ class Popover extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.state = {
+ titleId: getUniqueDomId(),
+ };
+ this.handleRootEl = (el) => {
+ this.rootEl = el;
+ if (this.props.elRef) {
+ setRef(this.props.elRef, el);
+ }
+ };
+ // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
+ this.handleDocumentMouseDown = (ev) => {
+ // only hide the popover if the click happened outside the popover
+ const target = getEventTargetViaRoot(ev);
+ if (!this.rootEl.contains(target)) {
+ this.handleCloseClick();
+ }
+ };
+ this.handleDocumentKeyDown = (ev) => {
+ if (ev.key === 'Escape') {
+ this.handleCloseClick();
+ }
+ };
+ this.handleCloseClick = () => {
+ let { onClose } = this.props;
+ if (onClose) {
+ onClose();
+ }
+ };
+ }
+ render() {
+ let { theme, options } = this.context;
+ let { props, state } = this;
+ let classNames = [
+ 'fc-popover',
+ theme.getClass('popover'),
+ ].concat(props.extraClassNames || []);
+ return j(h("div", Object.assign({}, props.extraAttrs, { id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId, ref: this.handleRootEl }),
+ h("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') },
+ h("span", { className: "fc-popover-title", id: state.titleId }, props.title),
+ h("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })),
+ h("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl);
+ }
+ componentDidMount() {
+ document.addEventListener('mousedown', this.handleDocumentMouseDown);
+ document.addEventListener('keydown', this.handleDocumentKeyDown);
+ this.updateSize();
+ }
+ componentWillUnmount() {
+ document.removeEventListener('mousedown', this.handleDocumentMouseDown);
+ document.removeEventListener('keydown', this.handleDocumentKeyDown);
+ }
+ updateSize() {
+ let { isRtl } = this.context;
+ let { alignmentEl, alignGridTop } = this.props;
+ let { rootEl } = this;
+ let alignmentRect = computeClippedClientRect(alignmentEl);
+ if (alignmentRect) {
+ let popoverDims = rootEl.getBoundingClientRect();
+ // position relative to viewport
+ let popoverTop = alignGridTop
+ ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top
+ : alignmentRect.top;
+ let popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left;
+ // constrain
+ popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT);
+ popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width);
+ popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT);
+ let origin = rootEl.offsetParent.getBoundingClientRect();
+ applyStyle(rootEl, {
+ top: popoverTop - origin.top,
+ left: popoverLeft - origin.left,
+ });
+ }
+ }
+ }
+
+ class MorePopover extends DateComponent {
+ constructor() {
+ super(...arguments);
+ this.handleRootEl = (rootEl) => {
+ this.rootEl = rootEl;
+ if (rootEl) {
+ this.context.registerInteractiveComponent(this, {
+ el: rootEl,
+ useEventCenter: false,
+ });
+ }
+ else {
+ this.context.unregisterInteractiveComponent(this);
+ }
+ };
+ }
+ render() {
+ let { options, dateEnv } = this.context;
+ let { props } = this;
+ let { startDate, todayRange, dateProfile } = props;
+ let title = dateEnv.format(startDate, options.dayPopoverFormat);
+ return (h(DayCellContainer, { elRef: this.handleRootEl, date: startDate, dateProfile: dateProfile, todayRange: todayRange }, (InnerContent, renderProps, elAttrs) => (h(Popover, { elRef: elAttrs.ref, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(elAttrs.className || []), extraAttrs: elAttrs /* TODO: make these time-based when not whole-day? */, parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose },
+ hasCustomDayCellContent(options) && (h(InnerContent, { elTag: "div", elClasses: ['fc-more-popover-misc'] })),
+ props.children))));
+ }
+ queryHit(positionLeft, positionTop, elWidth, elHeight) {
+ let { rootEl, props } = this;
+ if (positionLeft >= 0 && positionLeft < elWidth &&
+ positionTop >= 0 && positionTop < elHeight) {
+ return {
+ dateProfile: props.dateProfile,
+ dateSpan: Object.assign({ allDay: true, range: {
+ start: props.startDate,
+ end: props.endDate,
+ } }, props.extraDateSpan),
+ dayEl: rootEl,
+ rect: {
+ left: 0,
+ top: 0,
+ right: elWidth,
+ bottom: elHeight,
+ },
+ layer: 1, // important when comparing with hits from other components
+ };
+ }
+ return null;
+ }
+ }
+
+ class MoreLinkContainer extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.state = {
+ isPopoverOpen: false,
+ popoverId: getUniqueDomId(),
+ };
+ this.handleLinkEl = (linkEl) => {
+ this.linkEl = linkEl;
+ if (this.props.elRef) {
+ setRef(this.props.elRef, linkEl);
+ }
+ };
+ this.handleClick = (ev) => {
+ let { props, context } = this;
+ let { moreLinkClick } = context.options;
+ let date = computeRange(props).start;
+ function buildPublicSeg(seg) {
+ let { def, instance, range } = seg.eventRange;
+ return {
+ event: new EventImpl(context, def, instance),
+ start: context.dateEnv.toDate(range.start),
+ end: context.dateEnv.toDate(range.end),
+ isStart: seg.isStart,
+ isEnd: seg.isEnd,
+ };
+ }
+ if (typeof moreLinkClick === 'function') {
+ moreLinkClick = moreLinkClick({
+ date,
+ allDay: Boolean(props.allDayDate),
+ allSegs: props.allSegs.map(buildPublicSeg),
+ hiddenSegs: props.hiddenSegs.map(buildPublicSeg),
+ jsEvent: ev,
+ view: context.viewApi,
+ });
+ }
+ if (!moreLinkClick || moreLinkClick === 'popover') {
+ this.setState({ isPopoverOpen: true });
+ }
+ else if (typeof moreLinkClick === 'string') { // a view name
+ context.calendarApi.zoomTo(date, moreLinkClick);
+ }
+ };
+ this.handlePopoverClose = () => {
+ this.setState({ isPopoverOpen: false });
+ };
+ }
+ render() {
+ let { props, state } = this;
+ return (h(ViewContextType.Consumer, null, (context) => {
+ let { viewApi, options, calendarApi } = context;
+ let { moreLinkText } = options;
+ let { moreCnt } = props;
+ let range = computeRange(props);
+ let text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals
+ ? moreLinkText.call(calendarApi, moreCnt)
+ : `+${moreCnt} ${moreLinkText}`;
+ let hint = formatWithOrdinals(options.moreLinkHint, [moreCnt], text);
+ let renderProps = {
+ num: moreCnt,
+ shortText: `+${moreCnt}`,
+ text,
+ view: viewApi,
+ };
+ return (h(p, null,
+ Boolean(props.moreCnt) && (h(ContentContainer, { elTag: props.elTag || 'a', elRef: this.handleLinkEl, elClasses: [
+ ...(props.elClasses || []),
+ 'fc-more-link',
+ ], elStyle: props.elStyle, elAttrs: Object.assign(Object.assign(Object.assign({}, props.elAttrs), createAriaClickAttrs(this.handleClick)), { title: hint, 'aria-expanded': state.isPopoverOpen, 'aria-controls': state.isPopoverOpen ? state.popoverId : '' }), renderProps: renderProps, generatorName: "moreLinkContent", generator: options.moreLinkContent || props.defaultGenerator || renderMoreLinkInner, classNameGenerator: options.moreLinkClassNames, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, props.children)),
+ state.isPopoverOpen && (h(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: this.parentEl, alignmentEl: props.alignmentElRef ?
+ props.alignmentElRef.current :
+ this.linkEl, alignGridTop: props.alignGridTop, onClose: this.handlePopoverClose }, props.popoverContent()))));
+ }));
+ }
+ componentDidMount() {
+ this.updateParentEl();
+ }
+ componentDidUpdate() {
+ this.updateParentEl();
+ }
+ updateParentEl() {
+ if (this.linkEl) {
+ this.parentEl = elementClosest(this.linkEl, '.fc-view-harness');
+ }
+ }
+ }
+ function renderMoreLinkInner(props) {
+ return props.text;
+ }
+ function computeRange(props) {
+ if (props.allDayDate) {
+ return {
+ start: props.allDayDate,
+ end: addDays(props.allDayDate, 1),
+ };
+ }
+ let { hiddenSegs } = props;
+ return {
+ start: computeEarliestSegStart(hiddenSegs),
+ end: computeLatestSegEnd(hiddenSegs),
+ };
+ }
+ function computeEarliestSegStart(segs) {
+ return segs.reduce(pickEarliestStart).eventRange.range.start;
+ }
+ function pickEarliestStart(seg0, seg1) {
+ return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1;
+ }
+ function computeLatestSegEnd(segs) {
+ return segs.reduce(pickLatestEnd).eventRange.range.end;
+ }
+ function pickLatestEnd(seg0, seg1) {
+ return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1;
+ }
+
+ class ViewContainer$1 extends BaseComponent {
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let renderProps = { view: context.viewApi };
+ return (h(ContentContainer, Object.assign({}, props, { elTag: props.elTag || 'div', elClasses: [
+ ...buildViewClassNames(props.viewSpec),
+ ...(props.elClasses || []),
+ ], renderProps: renderProps, classNameGenerator: options.viewClassNames, generatorName: undefined, generator: undefined, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount }), () => props.children));
+ }
+ }
+ function buildViewClassNames(viewSpec) {
+ return [
+ `fc-${viewSpec.type}-view`,
+ 'fc-view',
+ ];
+ }
+
+ function injectStyles(css) {
+ if (!css || typeof document === 'undefined') {
+ return;
+ }
+ const head = document.head || document.getElementsByTagName('head')[0];
+ const style = document.createElement('style');
+ style.type = 'text/css';
+ head.appendChild(style);
+ if (style.styleSheet) {
+ style.styleSheet.cssText = css;
+ }
+ else {
+ style.appendChild(document.createTextNode(css));
+ }
+ }
+
+ const EVENT_SOURCE_REFINERS = {
+ id: String,
+ defaultAllDay: Boolean,
+ url: String,
+ format: String,
+ events: identity,
+ eventDataTransform: identity,
+ // for any network-related sources
+ success: identity,
+ failure: identity,
+ };
+ function parseEventSource(raw, context, refiners = buildEventSourceRefiners(context)) {
+ let rawObj;
+ if (typeof raw === 'string') {
+ rawObj = { url: raw };
+ }
+ else if (typeof raw === 'function' || Array.isArray(raw)) {
+ rawObj = { events: raw };
+ }
+ else if (typeof raw === 'object' && raw) { // not null
+ rawObj = raw;
+ }
+ if (rawObj) {
+ let { refined, extra } = refineProps(rawObj, refiners);
+ let metaRes = buildEventSourceMeta(refined, context);
+ if (metaRes) {
+ return {
+ _raw: raw,
+ isFetching: false,
+ latestFetchId: '',
+ fetchRange: null,
+ defaultAllDay: refined.defaultAllDay,
+ eventDataTransform: refined.eventDataTransform,
+ success: refined.success,
+ failure: refined.failure,
+ publicId: refined.id || '',
+ sourceId: guid(),
+ sourceDefId: metaRes.sourceDefId,
+ meta: metaRes.meta,
+ ui: createEventUi(refined, context),
+ extendedProps: extra,
+ };
+ }
+ }
+ return null;
+ }
+ function buildEventSourceRefiners(context) {
+ return Object.assign(Object.assign(Object.assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners);
+ }
+ function buildEventSourceMeta(raw, context) {
+ let defs = context.pluginHooks.eventSourceDefs;
+ for (let i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence
+ let def = defs[i];
+ let meta = def.parseMeta(raw);
+ if (meta) {
+ return { sourceDefId: i, meta };
+ }
+ }
+ return null;
+ }
+
+ class CalendarImpl {
+ getCurrentData() {
+ return this.currentDataManager.getCurrentData();
+ }
+ dispatch(action) {
+ this.currentDataManager.dispatch(action);
+ }
+ get view() { return this.getCurrentData().viewApi; }
+ batchRendering(callback) {
+ callback();
+ }
+ updateSize() {
+ this.trigger('_resize', true);
+ }
+ // Options
+ // -----------------------------------------------------------------------------------------------------------------
+ setOption(name, val) {
+ this.dispatch({
+ type: 'SET_OPTION',
+ optionName: name,
+ rawOptionValue: val,
+ });
+ }
+ getOption(name) {
+ return this.currentDataManager.currentCalendarOptionsInput[name];
+ }
+ getAvailableLocaleCodes() {
+ return Object.keys(this.getCurrentData().availableRawLocales);
+ }
+ // Trigger
+ // -----------------------------------------------------------------------------------------------------------------
+ on(handlerName, handler) {
+ let { currentDataManager } = this;
+ if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) {
+ currentDataManager.emitter.on(handlerName, handler);
+ }
+ else {
+ console.warn(`Unknown listener name '${handlerName}'`);
+ }
+ }
+ off(handlerName, handler) {
+ this.currentDataManager.emitter.off(handlerName, handler);
+ }
+ // not meant for public use
+ trigger(handlerName, ...args) {
+ this.currentDataManager.emitter.trigger(handlerName, ...args);
+ }
+ // View
+ // -----------------------------------------------------------------------------------------------------------------
+ changeView(viewType, dateOrRange) {
+ this.batchRendering(() => {
+ this.unselect();
+ if (dateOrRange) {
+ if (dateOrRange.start && dateOrRange.end) { // a range
+ this.dispatch({
+ type: 'CHANGE_VIEW_TYPE',
+ viewType,
+ });
+ this.dispatch({
+ type: 'SET_OPTION',
+ optionName: 'visibleRange',
+ rawOptionValue: dateOrRange,
+ });
+ }
+ else {
+ let { dateEnv } = this.getCurrentData();
+ this.dispatch({
+ type: 'CHANGE_VIEW_TYPE',
+ viewType,
+ dateMarker: dateEnv.createMarker(dateOrRange),
+ });
+ }
+ }
+ else {
+ this.dispatch({
+ type: 'CHANGE_VIEW_TYPE',
+ viewType,
+ });
+ }
+ });
+ }
+ // Forces navigation to a view for the given date.
+ // `viewType` can be a specific view name or a generic one like "week" or "day".
+ // needs to change
+ zoomTo(dateMarker, viewType) {
+ let state = this.getCurrentData();
+ let spec;
+ viewType = viewType || 'day'; // day is default zoom
+ spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType);
+ this.unselect();
+ if (spec) {
+ this.dispatch({
+ type: 'CHANGE_VIEW_TYPE',
+ viewType: spec.type,
+ dateMarker,
+ });
+ }
+ else {
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker,
+ });
+ }
+ }
+ // Given a duration singular unit, like "week" or "day", finds a matching view spec.
+ // Preference is given to views that have corresponding buttons.
+ getUnitViewSpec(unit) {
+ let { viewSpecs, toolbarConfig } = this.getCurrentData();
+ let viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []);
+ let i;
+ let spec;
+ for (let viewType in viewSpecs) {
+ viewTypes.push(viewType);
+ }
+ for (i = 0; i < viewTypes.length; i += 1) {
+ spec = viewSpecs[viewTypes[i]];
+ if (spec) {
+ if (spec.singleUnit === unit) {
+ return spec;
+ }
+ }
+ }
+ return null;
+ }
+ // Current Date
+ // -----------------------------------------------------------------------------------------------------------------
+ prev() {
+ this.unselect();
+ this.dispatch({ type: 'PREV' });
+ }
+ next() {
+ this.unselect();
+ this.dispatch({ type: 'NEXT' });
+ }
+ prevYear() {
+ let state = this.getCurrentData();
+ this.unselect();
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker: state.dateEnv.addYears(state.currentDate, -1),
+ });
+ }
+ nextYear() {
+ let state = this.getCurrentData();
+ this.unselect();
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker: state.dateEnv.addYears(state.currentDate, 1),
+ });
+ }
+ today() {
+ let state = this.getCurrentData();
+ this.unselect();
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker: getNow(state.calendarOptions.now, state.dateEnv),
+ });
+ }
+ gotoDate(zonedDateInput) {
+ let state = this.getCurrentData();
+ this.unselect();
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker: state.dateEnv.createMarker(zonedDateInput),
+ });
+ }
+ incrementDate(deltaInput) {
+ let state = this.getCurrentData();
+ let delta = createDuration(deltaInput);
+ if (delta) { // else, warn about invalid input?
+ this.unselect();
+ this.dispatch({
+ type: 'CHANGE_DATE',
+ dateMarker: state.dateEnv.add(state.currentDate, delta),
+ });
+ }
+ }
+ getDate() {
+ let state = this.getCurrentData();
+ return state.dateEnv.toDate(state.currentDate);
+ }
+ // Date Formatting Utils
+ // -----------------------------------------------------------------------------------------------------------------
+ formatDate(d, formatter) {
+ let { dateEnv } = this.getCurrentData();
+ return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
+ }
+ // `settings` is for formatter AND isEndExclusive
+ formatRange(d0, d1, settings) {
+ let { dateEnv } = this.getCurrentData();
+ return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings);
+ }
+ formatIso(d, omitTime) {
+ let { dateEnv } = this.getCurrentData();
+ return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime });
+ }
+ // Date Selection / Event Selection / DayClick
+ // -----------------------------------------------------------------------------------------------------------------
+ select(dateOrObj, endDate) {
+ let selectionInput;
+ if (endDate == null) {
+ if (dateOrObj.start != null) {
+ selectionInput = dateOrObj;
+ }
+ else {
+ selectionInput = {
+ start: dateOrObj,
+ end: null,
+ };
+ }
+ }
+ else {
+ selectionInput = {
+ start: dateOrObj,
+ end: endDate,
+ };
+ }
+ let state = this.getCurrentData();
+ let selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 }));
+ if (selection) { // throw parse error otherwise?
+ this.dispatch({ type: 'SELECT_DATES', selection });
+ triggerDateSelect(selection, null, state);
+ }
+ }
+ unselect(pev) {
+ let state = this.getCurrentData();
+ if (state.dateSelection) {
+ this.dispatch({ type: 'UNSELECT_DATES' });
+ triggerDateUnselect(pev, state);
+ }
+ }
+ // Public Events API
+ // -----------------------------------------------------------------------------------------------------------------
+ addEvent(eventInput, sourceInput) {
+ if (eventInput instanceof EventImpl) {
+ let def = eventInput._def;
+ let instance = eventInput._instance;
+ let currentData = this.getCurrentData();
+ // not already present? don't want to add an old snapshot
+ if (!currentData.eventStore.defs[def.defId]) {
+ this.dispatch({
+ type: 'ADD_EVENTS',
+ eventStore: eventTupleToStore({ def, instance }), // TODO: better util for two args?
+ });
+ this.triggerEventAdd(eventInput);
+ }
+ return eventInput;
+ }
+ let state = this.getCurrentData();
+ let eventSource;
+ if (sourceInput instanceof EventSourceImpl) {
+ eventSource = sourceInput.internalEventSource;
+ }
+ else if (typeof sourceInput === 'boolean') {
+ if (sourceInput) { // true. part of the first event source
+ [eventSource] = hashValuesToArray(state.eventSources);
+ }
+ }
+ else if (sourceInput != null) { // an ID. accepts a number too
+ let sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
+ if (!sourceApi) {
+ console.warn(`Could not find an event source with ID "${sourceInput}"`); // TODO: test
+ return null;
+ }
+ eventSource = sourceApi.internalEventSource;
+ }
+ let tuple = parseEvent(eventInput, eventSource, state, false);
+ if (tuple) {
+ let newEventApi = new EventImpl(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
+ this.dispatch({
+ type: 'ADD_EVENTS',
+ eventStore: eventTupleToStore(tuple),
+ });
+ this.triggerEventAdd(newEventApi);
+ return newEventApi;
+ }
+ return null;
+ }
+ triggerEventAdd(eventApi) {
+ let { emitter } = this.getCurrentData();
+ emitter.trigger('eventAdd', {
+ event: eventApi,
+ relatedEvents: [],
+ revert: () => {
+ this.dispatch({
+ type: 'REMOVE_EVENTS',
+ eventStore: eventApiToStore(eventApi),
+ });
+ },
+ });
+ }
+ // TODO: optimize
+ getEventById(id) {
+ let state = this.getCurrentData();
+ let { defs, instances } = state.eventStore;
+ id = String(id);
+ for (let defId in defs) {
+ let def = defs[defId];
+ if (def.publicId === id) {
+ if (def.recurringDef) {
+ return new EventImpl(state, def, null);
+ }
+ for (let instanceId in instances) {
+ let instance = instances[instanceId];
+ if (instance.defId === def.defId) {
+ return new EventImpl(state, def, instance);
+ }
+ }
+ }
+ }
+ return null;
+ }
+ getEvents() {
+ let currentData = this.getCurrentData();
+ return buildEventApis(currentData.eventStore, currentData);
+ }
+ removeAllEvents() {
+ this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
+ }
+ // Public Event Sources API
+ // -----------------------------------------------------------------------------------------------------------------
+ getEventSources() {
+ let state = this.getCurrentData();
+ let sourceHash = state.eventSources;
+ let sourceApis = [];
+ for (let internalId in sourceHash) {
+ sourceApis.push(new EventSourceImpl(state, sourceHash[internalId]));
+ }
+ return sourceApis;
+ }
+ getEventSourceById(id) {
+ let state = this.getCurrentData();
+ let sourceHash = state.eventSources;
+ id = String(id);
+ for (let sourceId in sourceHash) {
+ if (sourceHash[sourceId].publicId === id) {
+ return new EventSourceImpl(state, sourceHash[sourceId]);
+ }
+ }
+ return null;
+ }
+ addEventSource(sourceInput) {
+ let state = this.getCurrentData();
+ if (sourceInput instanceof EventSourceImpl) {
+ // not already present? don't want to add an old snapshot
+ if (!state.eventSources[sourceInput.internalEventSource.sourceId]) {
+ this.dispatch({
+ type: 'ADD_EVENT_SOURCES',
+ sources: [sourceInput.internalEventSource],
+ });
+ }
+ return sourceInput;
+ }
+ let eventSource = parseEventSource(sourceInput, state);
+ if (eventSource) { // TODO: error otherwise?
+ this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
+ return new EventSourceImpl(state, eventSource);
+ }
+ return null;
+ }
+ removeAllEventSources() {
+ this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
+ }
+ refetchEvents() {
+ this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true });
+ }
+ // Scroll
+ // -----------------------------------------------------------------------------------------------------------------
+ scrollToTime(timeInput) {
+ let time = createDuration(timeInput);
+ if (time) {
+ this.trigger('_scrollRequest', { time });
+ }
+ }
+ }
+
+ class Store {
+ constructor() {
+ this.handlers = [];
+ }
+ set(value) {
+ this.currentValue = value;
+ for (let handler of this.handlers) {
+ handler(value);
+ }
+ }
+ subscribe(handler) {
+ this.handlers.push(handler);
+ if (this.currentValue !== undefined) {
+ handler(this.currentValue);
+ }
+ }
+ }
+
+ /*
+ Subscribers will get a LIST of CustomRenderings
+ */
+ class CustomRenderingStore extends Store {
+ constructor() {
+ super(...arguments);
+ this.map = new Map();
+ }
+ // for consistent order
+ handle(customRendering) {
+ const { map } = this;
+ let updated = false;
+ if (customRendering.isActive) {
+ map.set(customRendering.id, customRendering);
+ updated = true;
+ }
+ else if (map.has(customRendering.id)) {
+ map.delete(customRendering.id);
+ updated = true;
+ }
+ if (updated) {
+ this.set(map);
+ }
+ }
+ }
+
+ var internal = {
+ __proto__: null,
+ BASE_OPTION_DEFAULTS: BASE_OPTION_DEFAULTS,
+ identity: identity,
+ refineProps: refineProps,
+ createEventInstance: createEventInstance,
+ parseEventDef: parseEventDef,
+ refineEventDef: refineEventDef,
+ parseBusinessHours: parseBusinessHours,
+ padStart: padStart,
+ isInt: isInt,
+ parseFieldSpecs: parseFieldSpecs,
+ compareByFieldSpecs: compareByFieldSpecs,
+ flexibleCompare: flexibleCompare,
+ preventSelection: preventSelection,
+ allowSelection: allowSelection,
+ preventContextMenu: preventContextMenu,
+ allowContextMenu: allowContextMenu,
+ compareNumbers: compareNumbers,
+ enableCursor: enableCursor,
+ disableCursor: disableCursor,
+ guid: guid,
+ computeVisibleDayRange: computeVisibleDayRange,
+ isMultiDayRange: isMultiDayRange,
+ diffDates: diffDates,
+ removeExact: removeExact,
+ isArraysEqual: isArraysEqual,
+ memoize: memoize,
+ memoizeObjArg: memoizeObjArg,
+ memoizeArraylike: memoizeArraylike,
+ memoizeHashlike: memoizeHashlike,
+ intersectRects: intersectRects,
+ pointInsideRect: pointInsideRect,
+ constrainPoint: constrainPoint,
+ getRectCenter: getRectCenter,
+ diffPoints: diffPoints,
+ translateRect: translateRect,
+ mapHash: mapHash,
+ filterHash: filterHash,
+ isPropsEqual: isPropsEqual,
+ compareObjs: compareObjs,
+ collectFromHash: collectFromHash,
+ findElements: findElements,
+ findDirectChildren: findDirectChildren,
+ removeElement: removeElement,
+ applyStyle: applyStyle,
+ elementMatches: elementMatches,
+ elementClosest: elementClosest,
+ getElRoot: getElRoot,
+ getEventTargetViaRoot: getEventTargetViaRoot,
+ getUniqueDomId: getUniqueDomId,
+ parseClassNames: parseClassNames,
+ getCanVGrowWithinCell: getCanVGrowWithinCell,
+ createEmptyEventStore: createEmptyEventStore,
+ mergeEventStores: mergeEventStores,
+ getRelevantEvents: getRelevantEvents,
+ eventTupleToStore: eventTupleToStore,
+ combineEventUis: combineEventUis,
+ createEventUi: createEventUi,
+ Splitter: Splitter,
+ getDayClassNames: getDayClassNames,
+ getDateMeta: getDateMeta,
+ getSlotClassNames: getSlotClassNames,
+ buildNavLinkAttrs: buildNavLinkAttrs,
+ preventDefault: preventDefault,
+ whenTransitionDone: whenTransitionDone,
+ computeInnerRect: computeInnerRect,
+ computeEdges: computeEdges,
+ getClippingParents: getClippingParents,
+ computeRect: computeRect,
+ unpromisify: unpromisify,
+ Emitter: Emitter,
+ rangeContainsMarker: rangeContainsMarker,
+ intersectRanges: intersectRanges,
+ rangesEqual: rangesEqual,
+ rangesIntersect: rangesIntersect,
+ rangeContainsRange: rangeContainsRange,
+ PositionCache: PositionCache,
+ ScrollController: ScrollController,
+ ElementScrollController: ElementScrollController,
+ WindowScrollController: WindowScrollController,
+ Theme: Theme,
+ ViewContextType: ViewContextType,
+ DateComponent: DateComponent,
+ DateProfileGenerator: DateProfileGenerator,
+ isDateSpansEqual: isDateSpansEqual,
+ addDays: addDays,
+ startOfDay: startOfDay,
+ addMs: addMs,
+ addWeeks: addWeeks,
+ diffWeeks: diffWeeks,
+ diffWholeWeeks: diffWholeWeeks,
+ diffWholeDays: diffWholeDays,
+ diffDayAndTime: diffDayAndTime,
+ diffDays: diffDays,
+ isValidDate: isValidDate,
+ createDuration: createDuration,
+ asCleanDays: asCleanDays,
+ multiplyDuration: multiplyDuration,
+ addDurations: addDurations,
+ asRoughMinutes: asRoughMinutes,
+ asRoughSeconds: asRoughSeconds,
+ asRoughMs: asRoughMs,
+ wholeDivideDurations: wholeDivideDurations,
+ greatestDurationDenominator: greatestDurationDenominator,
+ DateEnv: DateEnv,
+ createFormatter: createFormatter,
+ formatIsoTimeString: formatIsoTimeString,
+ formatDayString: formatDayString,
+ buildIsoString: buildIsoString,
+ NamedTimeZoneImpl: NamedTimeZoneImpl,
+ parseMarker: parse,
+ SegHierarchy: SegHierarchy,
+ buildEntryKey: buildEntryKey,
+ getEntrySpanEnd: getEntrySpanEnd,
+ binarySearch: binarySearch,
+ groupIntersectingEntries: groupIntersectingEntries,
+ intersectSpans: intersectSpans,
+ Interaction: Interaction,
+ interactionSettingsToStore: interactionSettingsToStore,
+ interactionSettingsStore: interactionSettingsStore,
+ ElementDragging: ElementDragging,
+ config: config,
+ parseDragMeta: parseDragMeta,
+ CalendarRoot: CalendarRoot,
+ DayHeader: DayHeader,
+ computeFallbackHeaderFormat: computeFallbackHeaderFormat,
+ TableDateCell: TableDateCell,
+ TableDowCell: TableDowCell,
+ DaySeriesModel: DaySeriesModel,
+ sliceEventStore: sliceEventStore,
+ hasBgRendering: hasBgRendering,
+ getElSeg: getElSeg,
+ buildSegTimeText: buildSegTimeText,
+ sortEventSegs: sortEventSegs,
+ getSegMeta: getSegMeta,
+ buildEventRangeKey: buildEventRangeKey,
+ getSegAnchorAttrs: getSegAnchorAttrs,
+ DayTableModel: DayTableModel,
+ Slicer: Slicer,
+ applyMutationToEventStore: applyMutationToEventStore,
+ isPropsValid: isPropsValid,
+ isInteractionValid: isInteractionValid,
+ isDateSelectionValid: isDateSelectionValid,
+ requestJson: requestJson,
+ BaseComponent: BaseComponent,
+ setRef: setRef,
+ DelayedRunner: DelayedRunner,
+ SimpleScrollGrid: SimpleScrollGrid,
+ hasShrinkWidth: hasShrinkWidth,
+ renderMicroColGroup: renderMicroColGroup,
+ getScrollGridClassNames: getScrollGridClassNames,
+ getSectionClassNames: getSectionClassNames,
+ getSectionHasLiquidHeight: getSectionHasLiquidHeight,
+ getAllowYScrolling: getAllowYScrolling,
+ renderChunkContent: renderChunkContent,
+ computeShrinkWidth: computeShrinkWidth,
+ sanitizeShrinkWidth: sanitizeShrinkWidth,
+ isColPropsEqual: isColPropsEqual,
+ renderScrollShim: renderScrollShim,
+ getStickyFooterScrollbar: getStickyFooterScrollbar,
+ getStickyHeaderDates: getStickyHeaderDates,
+ Scroller: Scroller,
+ getScrollbarWidths: getScrollbarWidths,
+ RefMap: RefMap,
+ getIsRtlScrollbarOnLeft: getIsRtlScrollbarOnLeft,
+ NowTimer: NowTimer,
+ ScrollResponder: ScrollResponder,
+ StandardEvent: StandardEvent,
+ NowIndicatorContainer: NowIndicatorContainer,
+ DayCellContainer: DayCellContainer,
+ hasCustomDayCellContent: hasCustomDayCellContent,
+ EventContainer: EventContainer,
+ renderFill: renderFill,
+ BgEvent: BgEvent,
+ WeekNumberContainer: WeekNumberContainer,
+ MoreLinkContainer: MoreLinkContainer,
+ computeEarliestSegStart: computeEarliestSegStart,
+ ViewContainer: ViewContainer$1,
+ triggerDateSelect: triggerDateSelect,
+ getDefaultEventEnd: getDefaultEventEnd,
+ injectStyles: injectStyles,
+ CalendarImpl: CalendarImpl,
+ EventImpl: EventImpl,
+ buildEventApis: buildEventApis,
+ buildElAttrs: buildElAttrs,
+ ContentContainer: ContentContainer,
+ CustomRenderingStore: CustomRenderingStore
+ };
+
+ var css_248z = ":root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url(\"data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\") format(\"truetype\")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:\"\\e900\"}.fc-icon-chevron-right:before{content:\"\\e901\"}.fc-icon-chevrons-left:before{content:\"\\e902\"}.fc-icon-chevrons-right:before{content:\"\\e903\"}.fc-icon-minus-square:before{content:\"\\e904\"}.fc-icon-plus-square:before{content:\"\\e905\"}.fc-icon-x:before{content:\"\\e906\"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:\"\";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:\"\";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}";
+ injectStyles(css_248z);
+
+ const globalLocales = [];
+
+ const MINIMAL_RAW_EN_LOCALE = {
+ code: 'en',
+ week: {
+ dow: 0,
+ doy: 4, // 4 days need to be within the year to be considered the first week
+ },
+ direction: 'ltr',
+ buttonText: {
+ prev: 'prev',
+ next: 'next',
+ prevYear: 'prev year',
+ nextYear: 'next year',
+ year: 'year',
+ today: 'today',
+ month: 'month',
+ week: 'week',
+ day: 'day',
+ list: 'list',
+ },
+ weekText: 'W',
+ weekTextLong: 'Week',
+ closeHint: 'Close',
+ timeHint: 'Time',
+ eventHint: 'Event',
+ allDayText: 'all-day',
+ moreLinkText: 'more',
+ noEventsText: 'No events to display',
+ };
+ const RAW_EN_LOCALE = Object.assign(Object.assign({}, MINIMAL_RAW_EN_LOCALE), {
+ // Includes things we don't want other locales to inherit,
+ // things that derive from other translatable strings.
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today(buttonText, unit) {
+ return (unit === 'day')
+ ? 'Today'
+ : `This ${buttonText}`;
+ },
+ }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ } });
+ function organizeRawLocales(explicitRawLocales) {
+ let defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
+ let allRawLocales = globalLocales.concat(explicitRawLocales);
+ let rawLocaleMap = {
+ en: RAW_EN_LOCALE,
+ };
+ for (let rawLocale of allRawLocales) {
+ rawLocaleMap[rawLocale.code] = rawLocale;
+ }
+ return {
+ map: rawLocaleMap,
+ defaultCode,
+ };
+ }
+ function buildLocale(inputSingular, available) {
+ if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
+ return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
+ }
+ return queryLocale(inputSingular, available);
+ }
+ function queryLocale(codeArg, available) {
+ let codes = [].concat(codeArg || []); // will convert to array
+ let raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
+ return parseLocale(codeArg, codes, raw);
+ }
+ function queryRawLocale(codes, available) {
+ for (let i = 0; i < codes.length; i += 1) {
+ let parts = codes[i].toLocaleLowerCase().split('-');
+ for (let j = parts.length; j > 0; j -= 1) {
+ let simpleId = parts.slice(0, j).join('-');
+ if (available[simpleId]) {
+ return available[simpleId];
+ }
+ }
+ }
+ return null;
+ }
+ function parseLocale(codeArg, codes, raw) {
+ let merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']);
+ delete merged.code; // don't want this part of the options
+ let { week } = merged;
+ delete merged.week;
+ return {
+ codeArg,
+ codes,
+ week,
+ simpleNumberFormat: new Intl.NumberFormat(codeArg),
+ options: merged,
+ };
+ }
+
+ // TODO: easier way to add new hooks? need to update a million things
+ function createPlugin(input) {
+ return {
+ id: guid(),
+ name: input.name,
+ premiumReleaseDate: input.premiumReleaseDate ? new Date(input.premiumReleaseDate) : undefined,
+ deps: input.deps || [],
+ reducers: input.reducers || [],
+ isLoadingFuncs: input.isLoadingFuncs || [],
+ contextInit: [].concat(input.contextInit || []),
+ eventRefiners: input.eventRefiners || {},
+ eventDefMemberAdders: input.eventDefMemberAdders || [],
+ eventSourceRefiners: input.eventSourceRefiners || {},
+ isDraggableTransformers: input.isDraggableTransformers || [],
+ eventDragMutationMassagers: input.eventDragMutationMassagers || [],
+ eventDefMutationAppliers: input.eventDefMutationAppliers || [],
+ dateSelectionTransformers: input.dateSelectionTransformers || [],
+ datePointTransforms: input.datePointTransforms || [],
+ dateSpanTransforms: input.dateSpanTransforms || [],
+ views: input.views || {},
+ viewPropsTransformers: input.viewPropsTransformers || [],
+ isPropsValid: input.isPropsValid || null,
+ externalDefTransforms: input.externalDefTransforms || [],
+ viewContainerAppends: input.viewContainerAppends || [],
+ eventDropTransformers: input.eventDropTransformers || [],
+ componentInteractions: input.componentInteractions || [],
+ calendarInteractions: input.calendarInteractions || [],
+ themeClasses: input.themeClasses || {},
+ eventSourceDefs: input.eventSourceDefs || [],
+ cmdFormatter: input.cmdFormatter,
+ recurringTypes: input.recurringTypes || [],
+ namedTimeZonedImpl: input.namedTimeZonedImpl,
+ initialView: input.initialView || '',
+ elementDraggingImpl: input.elementDraggingImpl,
+ optionChangeHandlers: input.optionChangeHandlers || {},
+ scrollGridImpl: input.scrollGridImpl || null,
+ listenerRefiners: input.listenerRefiners || {},
+ optionRefiners: input.optionRefiners || {},
+ propSetHandlers: input.propSetHandlers || {},
+ };
+ }
+ function buildPluginHooks(pluginDefs, globalDefs) {
+ let currentPluginIds = {};
+ let hooks = {
+ premiumReleaseDate: undefined,
+ reducers: [],
+ isLoadingFuncs: [],
+ contextInit: [],
+ eventRefiners: {},
+ eventDefMemberAdders: [],
+ eventSourceRefiners: {},
+ isDraggableTransformers: [],
+ eventDragMutationMassagers: [],
+ eventDefMutationAppliers: [],
+ dateSelectionTransformers: [],
+ datePointTransforms: [],
+ dateSpanTransforms: [],
+ views: {},
+ viewPropsTransformers: [],
+ isPropsValid: null,
+ externalDefTransforms: [],
+ viewContainerAppends: [],
+ eventDropTransformers: [],
+ componentInteractions: [],
+ calendarInteractions: [],
+ themeClasses: {},
+ eventSourceDefs: [],
+ cmdFormatter: null,
+ recurringTypes: [],
+ namedTimeZonedImpl: null,
+ initialView: '',
+ elementDraggingImpl: null,
+ optionChangeHandlers: {},
+ scrollGridImpl: null,
+ listenerRefiners: {},
+ optionRefiners: {},
+ propSetHandlers: {},
+ };
+ function addDefs(defs) {
+ for (let def of defs) {
+ const pluginName = def.name;
+ const currentId = currentPluginIds[pluginName];
+ if (currentId === undefined) {
+ currentPluginIds[pluginName] = def.id;
+ addDefs(def.deps);
+ hooks = combineHooks(hooks, def);
+ }
+ else if (currentId !== def.id) {
+ // different ID than the one already added
+ console.warn(`Duplicate plugin '${pluginName}'`);
+ }
+ }
+ }
+ if (pluginDefs) {
+ addDefs(pluginDefs);
+ }
+ addDefs(globalDefs);
+ return hooks;
+ }
+ function buildBuildPluginHooks() {
+ let currentOverrideDefs = [];
+ let currentGlobalDefs = [];
+ let currentHooks;
+ return (overrideDefs, globalDefs) => {
+ if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
+ currentHooks = buildPluginHooks(overrideDefs, globalDefs);
+ }
+ currentOverrideDefs = overrideDefs;
+ currentGlobalDefs = globalDefs;
+ return currentHooks;
+ };
+ }
+ function combineHooks(hooks0, hooks1) {
+ return {
+ premiumReleaseDate: compareOptionalDates(hooks0.premiumReleaseDate, hooks1.premiumReleaseDate),
+ reducers: hooks0.reducers.concat(hooks1.reducers),
+ isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs),
+ contextInit: hooks0.contextInit.concat(hooks1.contextInit),
+ eventRefiners: Object.assign(Object.assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
+ eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
+ eventSourceRefiners: Object.assign(Object.assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
+ isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
+ eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
+ eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
+ dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
+ datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
+ dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
+ views: Object.assign(Object.assign({}, hooks0.views), hooks1.views),
+ viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
+ isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
+ externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
+ viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
+ eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
+ calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
+ componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
+ themeClasses: Object.assign(Object.assign({}, hooks0.themeClasses), hooks1.themeClasses),
+ eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
+ cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
+ recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
+ namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
+ initialView: hooks0.initialView || hooks1.initialView,
+ elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
+ optionChangeHandlers: Object.assign(Object.assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
+ scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
+ listenerRefiners: Object.assign(Object.assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
+ optionRefiners: Object.assign(Object.assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
+ propSetHandlers: Object.assign(Object.assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers),
+ };
+ }
+ function compareOptionalDates(date0, date1) {
+ if (date0 === undefined) {
+ return date1;
+ }
+ if (date1 === undefined) {
+ return date0;
+ }
+ return new Date(Math.max(date0.valueOf(), date1.valueOf()));
+ }
+
+ class StandardTheme extends Theme {
+ }
+ StandardTheme.prototype.classes = {
+ root: 'fc-theme-standard',
+ tableCellShaded: 'fc-cell-shaded',
+ buttonGroup: 'fc-button-group',
+ button: 'fc-button fc-button-primary',
+ buttonActive: 'fc-button-active',
+ };
+ StandardTheme.prototype.baseIconClass = 'fc-icon';
+ StandardTheme.prototype.iconClasses = {
+ close: 'fc-icon-x',
+ prev: 'fc-icon-chevron-left',
+ next: 'fc-icon-chevron-right',
+ prevYear: 'fc-icon-chevrons-left',
+ nextYear: 'fc-icon-chevrons-right',
+ };
+ StandardTheme.prototype.rtlIconClasses = {
+ prev: 'fc-icon-chevron-right',
+ next: 'fc-icon-chevron-left',
+ prevYear: 'fc-icon-chevrons-right',
+ nextYear: 'fc-icon-chevrons-left',
+ };
+ StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
+ StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
+ StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
+
+ function compileViewDefs(defaultConfigs, overrideConfigs) {
+ let hash = {};
+ let viewType;
+ for (viewType in defaultConfigs) {
+ ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+ }
+ for (viewType in overrideConfigs) {
+ ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+ }
+ return hash;
+ }
+ function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+ if (hash[viewType]) {
+ return hash[viewType];
+ }
+ let viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+ if (viewDef) {
+ hash[viewType] = viewDef;
+ }
+ return viewDef;
+ }
+ function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+ let defaultConfig = defaultConfigs[viewType];
+ let overrideConfig = overrideConfigs[viewType];
+ let queryProp = (name) => ((defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
+ ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null));
+ let theComponent = queryProp('component');
+ let superType = queryProp('superType');
+ let superDef = null;
+ if (superType) {
+ if (superType === viewType) {
+ throw new Error('Can\'t have a custom view type that references itself');
+ }
+ superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
+ }
+ if (!theComponent && superDef) {
+ theComponent = superDef.component;
+ }
+ if (!theComponent) {
+ return null; // don't throw a warning, might be settings for a single-unit view
+ }
+ return {
+ type: viewType,
+ component: theComponent,
+ defaults: Object.assign(Object.assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})),
+ overrides: Object.assign(Object.assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {})),
+ };
+ }
+
+ function parseViewConfigs(inputs) {
+ return mapHash(inputs, parseViewConfig);
+ }
+ function parseViewConfig(input) {
+ let rawOptions = typeof input === 'function' ?
+ { component: input } :
+ input;
+ let { component } = rawOptions;
+ if (rawOptions.content) {
+ component = createViewHookComponent(rawOptions);
+ // TODO: remove content/classNames/didMount/etc from options?
+ }
+ return {
+ superType: rawOptions.type,
+ component: component,
+ rawOptions, // includes type and component too :(
+ };
+ }
+ function createViewHookComponent(options) {
+ return (viewProps) => (h(ViewContextType.Consumer, null, (context) => (h(ContentContainer, { elTag: "div", elClasses: buildViewClassNames(context.viewSpec), renderProps: Object.assign(Object.assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }), generatorName: undefined, generator: options.content, classNameGenerator: options.classNames, didMount: options.didMount, willUnmount: options.willUnmount }))));
+ }
+
+ function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
+ let defaultConfigs = parseViewConfigs(defaultInputs);
+ let overrideConfigs = parseViewConfigs(optionOverrides.views);
+ let viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
+ return mapHash(viewDefs, (viewDef) => buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults));
+ }
+ function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
+ let durationInput = viewDef.overrides.duration ||
+ viewDef.defaults.duration ||
+ dynamicOptionOverrides.duration ||
+ optionOverrides.duration;
+ let duration = null;
+ let durationUnit = '';
+ let singleUnit = '';
+ let singleUnitOverrides = {};
+ if (durationInput) {
+ duration = createDurationCached(durationInput);
+ if (duration) { // valid?
+ let denom = greatestDurationDenominator(duration);
+ durationUnit = denom.unit;
+ if (denom.value === 1) {
+ singleUnit = durationUnit;
+ singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {};
+ }
+ }
+ }
+ let queryButtonText = (optionsSubset) => {
+ let buttonTextMap = optionsSubset.buttonText || {};
+ let buttonTextKey = viewDef.defaults.buttonTextKey;
+ if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
+ return buttonTextMap[buttonTextKey];
+ }
+ if (buttonTextMap[viewDef.type] != null) {
+ return buttonTextMap[viewDef.type];
+ }
+ if (buttonTextMap[singleUnit] != null) {
+ return buttonTextMap[singleUnit];
+ }
+ return null;
+ };
+ let queryButtonTitle = (optionsSubset) => {
+ let buttonHints = optionsSubset.buttonHints || {};
+ let buttonKey = viewDef.defaults.buttonTextKey; // use same key as text
+ if (buttonKey != null && buttonHints[buttonKey] != null) {
+ return buttonHints[buttonKey];
+ }
+ if (buttonHints[viewDef.type] != null) {
+ return buttonHints[viewDef.type];
+ }
+ if (buttonHints[singleUnit] != null) {
+ return buttonHints[singleUnit];
+ }
+ return null;
+ };
+ return {
+ type: viewDef.type,
+ component: viewDef.component,
+ duration,
+ durationUnit,
+ singleUnit,
+ optionDefaults: viewDef.defaults,
+ optionOverrides: Object.assign(Object.assign({}, singleUnitOverrides), viewDef.overrides),
+ buttonTextOverride: queryButtonText(dynamicOptionOverrides) ||
+ queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence
+ viewDef.overrides.buttonText,
+ buttonTextDefault: queryButtonText(localeDefaults) ||
+ viewDef.defaults.buttonText ||
+ queryButtonText(BASE_OPTION_DEFAULTS) ||
+ viewDef.type,
+ // not DRY
+ buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) ||
+ queryButtonTitle(optionOverrides) ||
+ viewDef.overrides.buttonHint,
+ buttonTitleDefault: queryButtonTitle(localeDefaults) ||
+ viewDef.defaults.buttonHint ||
+ queryButtonTitle(BASE_OPTION_DEFAULTS),
+ // will eventually fall back to buttonText
+ };
+ }
+ // hack to get memoization working
+ let durationInputMap = {};
+ function createDurationCached(durationInput) {
+ let json = JSON.stringify(durationInput);
+ let res = durationInputMap[json];
+ if (res === undefined) {
+ res = createDuration(durationInput);
+ durationInputMap[json] = res;
+ }
+ return res;
+ }
+
+ function reduceViewType(viewType, action) {
+ switch (action.type) {
+ case 'CHANGE_VIEW_TYPE':
+ viewType = action.viewType;
+ }
+ return viewType;
+ }
+
+ function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
+ switch (action.type) {
+ case 'SET_OPTION':
+ return Object.assign(Object.assign({}, dynamicOptionOverrides), { [action.optionName]: action.rawOptionValue });
+ default:
+ return dynamicOptionOverrides;
+ }
+ }
+
+ function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
+ let dp;
+ switch (action.type) {
+ case 'CHANGE_VIEW_TYPE':
+ return dateProfileGenerator.build(action.dateMarker || currentDate);
+ case 'CHANGE_DATE':
+ return dateProfileGenerator.build(action.dateMarker);
+ case 'PREV':
+ dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
+ if (dp.isValid) {
+ return dp;
+ }
+ break;
+ case 'NEXT':
+ dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
+ if (dp.isValid) {
+ return dp;
+ }
+ break;
+ }
+ return currentDateProfile;
+ }
+
+ function initEventSources(calendarOptions, dateProfile, context) {
+ let activeRange = dateProfile ? dateProfile.activeRange : null;
+ return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
+ }
+ function reduceEventSources(eventSources, action, dateProfile, context) {
+ let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
+ switch (action.type) {
+ case 'ADD_EVENT_SOURCES': // already parsed
+ return addSources(eventSources, action.sources, activeRange, context);
+ case 'REMOVE_EVENT_SOURCE':
+ return removeSource(eventSources, action.sourceId);
+ case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+ case 'NEXT':
+ case 'CHANGE_DATE':
+ case 'CHANGE_VIEW_TYPE':
+ if (dateProfile) {
+ return fetchDirtySources(eventSources, activeRange, context);
+ }
+ return eventSources;
+ case 'FETCH_EVENT_SOURCES':
+ return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type?
+ arrayToHash(action.sourceIds) :
+ excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context);
+ case 'RECEIVE_EVENTS':
+ case 'RECEIVE_EVENT_ERROR':
+ return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
+ case 'REMOVE_ALL_EVENT_SOURCES':
+ return {};
+ default:
+ return eventSources;
+ }
+ }
+ function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
+ let activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
+ return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context);
+ }
+ function computeEventSourcesLoading(eventSources) {
+ for (let sourceId in eventSources) {
+ if (eventSources[sourceId].isFetching) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function addSources(eventSourceHash, sources, fetchRange, context) {
+ let hash = {};
+ for (let source of sources) {
+ hash[source.sourceId] = source;
+ }
+ if (fetchRange) {
+ hash = fetchDirtySources(hash, fetchRange, context);
+ }
+ return Object.assign(Object.assign({}, eventSourceHash), hash);
+ }
+ function removeSource(eventSourceHash, sourceId) {
+ return filterHash(eventSourceHash, (eventSource) => eventSource.sourceId !== sourceId);
+ }
+ function fetchDirtySources(sourceHash, fetchRange, context) {
+ return fetchSourcesByIds(sourceHash, filterHash(sourceHash, (eventSource) => isSourceDirty(eventSource, fetchRange, context)), fetchRange, false, context);
+ }
+ function isSourceDirty(eventSource, fetchRange, context) {
+ if (!doesSourceNeedRange(eventSource, context)) {
+ return !eventSource.latestFetchId;
+ }
+ return !context.options.lazyFetching ||
+ !eventSource.fetchRange ||
+ eventSource.isFetching || // always cancel outdated in-progress fetches
+ fetchRange.start < eventSource.fetchRange.start ||
+ fetchRange.end > eventSource.fetchRange.end;
+ }
+ function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) {
+ let nextSources = {};
+ for (let sourceId in prevSources) {
+ let source = prevSources[sourceId];
+ if (sourceIdHash[sourceId]) {
+ nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context);
+ }
+ else {
+ nextSources[sourceId] = source;
+ }
+ }
+ return nextSources;
+ }
+ function fetchSource(eventSource, fetchRange, isRefetch, context) {
+ let { options, calendarApi } = context;
+ let sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
+ let fetchId = guid();
+ sourceDef.fetch({
+ eventSource,
+ range: fetchRange,
+ isRefetch,
+ context,
+ }, (res) => {
+ let { rawEvents } = res;
+ if (options.eventSourceSuccess) {
+ rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.response) || rawEvents;
+ }
+ if (eventSource.success) {
+ rawEvents = eventSource.success.call(calendarApi, rawEvents, res.response) || rawEvents;
+ }
+ context.dispatch({
+ type: 'RECEIVE_EVENTS',
+ sourceId: eventSource.sourceId,
+ fetchId,
+ fetchRange,
+ rawEvents,
+ });
+ }, (error) => {
+ let errorHandled = false;
+ if (options.eventSourceFailure) {
+ options.eventSourceFailure.call(calendarApi, error);
+ errorHandled = true;
+ }
+ if (eventSource.failure) {
+ eventSource.failure(error);
+ errorHandled = true;
+ }
+ if (!errorHandled) {
+ console.warn(error.message, error);
+ }
+ context.dispatch({
+ type: 'RECEIVE_EVENT_ERROR',
+ sourceId: eventSource.sourceId,
+ fetchId,
+ fetchRange,
+ error,
+ });
+ });
+ return Object.assign(Object.assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
+ }
+ function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
+ let eventSource = sourceHash[sourceId];
+ if (eventSource && // not already removed
+ fetchId === eventSource.latestFetchId) {
+ return Object.assign(Object.assign({}, sourceHash), { [sourceId]: Object.assign(Object.assign({}, eventSource), { isFetching: false, fetchRange }) });
+ }
+ return sourceHash;
+ }
+ function excludeStaticSources(eventSources, context) {
+ return filterHash(eventSources, (eventSource) => doesSourceNeedRange(eventSource, context));
+ }
+ function parseInitialSources(rawOptions, context) {
+ let refiners = buildEventSourceRefiners(context);
+ let rawSources = [].concat(rawOptions.eventSources || []);
+ let sources = []; // parsed
+ if (rawOptions.initialEvents) {
+ rawSources.unshift(rawOptions.initialEvents);
+ }
+ if (rawOptions.events) {
+ rawSources.unshift(rawOptions.events);
+ }
+ for (let rawSource of rawSources) {
+ let source = parseEventSource(rawSource, context, refiners);
+ if (source) {
+ sources.push(source);
+ }
+ }
+ return sources;
+ }
+ function doesSourceNeedRange(eventSource, context) {
+ let defs = context.pluginHooks.eventSourceDefs;
+ return !defs[eventSource.sourceDefId].ignoreRange;
+ }
+
+ function reduceDateSelection(currentSelection, action) {
+ switch (action.type) {
+ case 'UNSELECT_DATES':
+ return null;
+ case 'SELECT_DATES':
+ return action.selection;
+ default:
+ return currentSelection;
+ }
+ }
+
+ function reduceSelectedEvent(currentInstanceId, action) {
+ switch (action.type) {
+ case 'UNSELECT_EVENT':
+ return '';
+ case 'SELECT_EVENT':
+ return action.eventInstanceId;
+ default:
+ return currentInstanceId;
+ }
+ }
+
+ function reduceEventDrag(currentDrag, action) {
+ let newDrag;
+ switch (action.type) {
+ case 'UNSET_EVENT_DRAG':
+ return null;
+ case 'SET_EVENT_DRAG':
+ newDrag = action.state;
+ return {
+ affectedEvents: newDrag.affectedEvents,
+ mutatedEvents: newDrag.mutatedEvents,
+ isEvent: newDrag.isEvent,
+ };
+ default:
+ return currentDrag;
+ }
+ }
+
+ function reduceEventResize(currentResize, action) {
+ let newResize;
+ switch (action.type) {
+ case 'UNSET_EVENT_RESIZE':
+ return null;
+ case 'SET_EVENT_RESIZE':
+ newResize = action.state;
+ return {
+ affectedEvents: newResize.affectedEvents,
+ mutatedEvents: newResize.mutatedEvents,
+ isEvent: newResize.isEvent,
+ };
+ default:
+ return currentResize;
+ }
+ }
+
+ function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
+ let header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null;
+ let footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null;
+ return { header, footer };
+ }
+ function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
+ let sectionWidgets = {};
+ let viewsWithButtons = [];
+ let hasTitle = false;
+ for (let sectionName in sectionStrHash) {
+ let sectionStr = sectionStrHash[sectionName];
+ let sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi);
+ sectionWidgets[sectionName] = sectionRes.widgets;
+ viewsWithButtons.push(...sectionRes.viewsWithButtons);
+ hasTitle = hasTitle || sectionRes.hasTitle;
+ }
+ return { sectionWidgets, viewsWithButtons, hasTitle };
+ }
+ /*
+ BAD: querying icons and text here. should be done at render time
+ */
+ function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined
+ calendarOptionOverrides, // overrides only!, unrefined :(
+ theme, viewSpecs, calendarApi) {
+ let isRtl = calendarOptions.direction === 'rtl';
+ let calendarCustomButtons = calendarOptions.customButtons || {};
+ let calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {};
+ let calendarButtonText = calendarOptions.buttonText || {};
+ let calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {};
+ let calendarButtonHints = calendarOptions.buttonHints || {};
+ let sectionSubstrs = sectionStr ? sectionStr.split(' ') : [];
+ let viewsWithButtons = [];
+ let hasTitle = false;
+ let widgets = sectionSubstrs.map((buttonGroupStr) => (buttonGroupStr.split(',').map((buttonName) => {
+ if (buttonName === 'title') {
+ hasTitle = true;
+ return { buttonName };
+ }
+ let customButtonProps;
+ let viewSpec;
+ let buttonClick;
+ let buttonIcon; // only one of these will be set
+ let buttonText; // "
+ let buttonHint;
+ // ^ for the title="" attribute, for accessibility
+ if ((customButtonProps = calendarCustomButtons[buttonName])) {
+ buttonClick = (ev) => {
+ if (customButtonProps.click) {
+ customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context?
+ }
+ };
+ (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
+ (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+ (buttonText = customButtonProps.text);
+ buttonHint = customButtonProps.hint || customButtonProps.text;
+ }
+ else if ((viewSpec = viewSpecs[buttonName])) {
+ viewsWithButtons.push(buttonName);
+ buttonClick = () => {
+ calendarApi.changeView(buttonName);
+ };
+ (buttonText = viewSpec.buttonTextOverride) ||
+ (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+ (buttonText = viewSpec.buttonTextDefault);
+ let textFallback = viewSpec.buttonTextOverride ||
+ viewSpec.buttonTextDefault;
+ buttonHint = formatWithOrdinals(viewSpec.buttonTitleOverride ||
+ viewSpec.buttonTitleDefault ||
+ calendarOptions.viewHint, [textFallback, buttonName], // view-name = buttonName
+ textFallback);
+ }
+ else if (calendarApi[buttonName]) { // a calendarApi method
+ buttonClick = () => {
+ calendarApi[buttonName]();
+ };
+ (buttonText = calendarButtonTextOverrides[buttonName]) ||
+ (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+ (buttonText = calendarButtonText[buttonName]); // everything else is considered default
+ if (buttonName === 'prevYear' || buttonName === 'nextYear') {
+ let prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next';
+ buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] ||
+ calendarButtonHints[prevOrNext], [
+ calendarButtonText.year || 'year',
+ 'year',
+ ], calendarButtonText[buttonName]);
+ }
+ else {
+ buttonHint = (navUnit) => formatWithOrdinals(calendarButtonHintOverrides[buttonName] ||
+ calendarButtonHints[buttonName], [
+ calendarButtonText[navUnit] || navUnit,
+ navUnit,
+ ], calendarButtonText[buttonName]);
+ }
+ }
+ return { buttonName, buttonClick, buttonIcon, buttonText, buttonHint };
+ })));
+ return { widgets, viewsWithButtons, hasTitle };
+ }
+
+ // always represents the current view. otherwise, it'd need to change value every time date changes
+ class ViewImpl {
+ constructor(type, getCurrentData, dateEnv) {
+ this.type = type;
+ this.getCurrentData = getCurrentData;
+ this.dateEnv = dateEnv;
+ }
+ get calendar() {
+ return this.getCurrentData().calendarApi;
+ }
+ get title() {
+ return this.getCurrentData().viewTitle;
+ }
+ get activeStart() {
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
+ }
+ get activeEnd() {
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
+ }
+ get currentStart() {
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
+ }
+ get currentEnd() {
+ return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
+ }
+ getOption(name) {
+ return this.getCurrentData().options[name]; // are the view-specific options
+ }
+ }
+
+ let eventSourceDef$2 = {
+ ignoreRange: true,
+ parseMeta(refined) {
+ if (Array.isArray(refined.events)) {
+ return refined.events;
+ }
+ return null;
+ },
+ fetch(arg, successCallback) {
+ successCallback({
+ rawEvents: arg.eventSource.meta,
+ });
+ },
+ };
+ const arrayEventSourcePlugin = createPlugin({
+ name: 'array-event-source',
+ eventSourceDefs: [eventSourceDef$2],
+ });
+
+ let eventSourceDef$1 = {
+ parseMeta(refined) {
+ if (typeof refined.events === 'function') {
+ return refined.events;
+ }
+ return null;
+ },
+ fetch(arg, successCallback, errorCallback) {
+ const { dateEnv } = arg.context;
+ const func = arg.eventSource.meta;
+ unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), (rawEvents) => successCallback({ rawEvents }), errorCallback);
+ },
+ };
+ const funcEventSourcePlugin = createPlugin({
+ name: 'func-event-source',
+ eventSourceDefs: [eventSourceDef$1],
+ });
+
+ const JSON_FEED_EVENT_SOURCE_REFINERS = {
+ method: String,
+ extraParams: identity,
+ startParam: String,
+ endParam: String,
+ timeZoneParam: String,
+ };
+
+ let eventSourceDef = {
+ parseMeta(refined) {
+ if (refined.url && (refined.format === 'json' || !refined.format)) {
+ return {
+ url: refined.url,
+ format: 'json',
+ method: (refined.method || 'GET').toUpperCase(),
+ extraParams: refined.extraParams,
+ startParam: refined.startParam,
+ endParam: refined.endParam,
+ timeZoneParam: refined.timeZoneParam,
+ };
+ }
+ return null;
+ },
+ fetch(arg, successCallback, errorCallback) {
+ const { meta } = arg.eventSource;
+ const requestParams = buildRequestParams(meta, arg.range, arg.context);
+ requestJson(meta.method, meta.url, requestParams).then(([rawEvents, response]) => {
+ successCallback({ rawEvents, response });
+ }, errorCallback);
+ },
+ };
+ const jsonFeedEventSourcePlugin = createPlugin({
+ name: 'json-event-source',
+ eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
+ eventSourceDefs: [eventSourceDef],
+ });
+ function buildRequestParams(meta, range, context) {
+ let { dateEnv, options } = context;
+ let startParam;
+ let endParam;
+ let timeZoneParam;
+ let customRequestParams;
+ let params = {};
+ startParam = meta.startParam;
+ if (startParam == null) {
+ startParam = options.startParam;
+ }
+ endParam = meta.endParam;
+ if (endParam == null) {
+ endParam = options.endParam;
+ }
+ timeZoneParam = meta.timeZoneParam;
+ if (timeZoneParam == null) {
+ timeZoneParam = options.timeZoneParam;
+ }
+ // retrieve any outbound GET/POST data from the options
+ if (typeof meta.extraParams === 'function') {
+ // supplied as a function that returns a key/value object
+ customRequestParams = meta.extraParams();
+ }
+ else {
+ // probably supplied as a straight key/value object
+ customRequestParams = meta.extraParams || {};
+ }
+ Object.assign(params, customRequestParams);
+ params[startParam] = dateEnv.formatIso(range.start);
+ params[endParam] = dateEnv.formatIso(range.end);
+ if (dateEnv.timeZone !== 'local') {
+ params[timeZoneParam] = dateEnv.timeZone;
+ }
+ return params;
+ }
+
+ const SIMPLE_RECURRING_REFINERS = {
+ daysOfWeek: identity,
+ startTime: createDuration,
+ endTime: createDuration,
+ duration: createDuration,
+ startRecur: identity,
+ endRecur: identity,
+ };
+
+ let recurring = {
+ parse(refined, dateEnv) {
+ if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
+ let recurringData = {
+ daysOfWeek: refined.daysOfWeek || null,
+ startTime: refined.startTime || null,
+ endTime: refined.endTime || null,
+ startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
+ endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null,
+ };
+ let duration;
+ if (refined.duration) {
+ duration = refined.duration;
+ }
+ if (!duration && refined.startTime && refined.endTime) {
+ duration = subtractDurations(refined.endTime, refined.startTime);
+ }
+ return {
+ allDayGuess: Boolean(!refined.startTime && !refined.endTime),
+ duration,
+ typeData: recurringData, // doesn't need endTime anymore but oh well
+ };
+ }
+ return null;
+ },
+ expand(typeData, framingRange, dateEnv) {
+ let clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
+ if (clippedFramingRange) {
+ return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
+ }
+ return [];
+ },
+ };
+ const simpleRecurringEventsPlugin = createPlugin({
+ name: 'simple-recurring-event',
+ recurringTypes: [recurring],
+ eventRefiners: SIMPLE_RECURRING_REFINERS,
+ });
+ function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
+ let dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
+ let dayMarker = startOfDay(framingRange.start);
+ let endMarker = framingRange.end;
+ let instanceStarts = [];
+ while (dayMarker < endMarker) {
+ let instanceStart;
+ // if everyday, or this particular day-of-week
+ if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
+ if (startTime) {
+ instanceStart = dateEnv.add(dayMarker, startTime);
+ }
+ else {
+ instanceStart = dayMarker;
+ }
+ instanceStarts.push(instanceStart);
+ }
+ dayMarker = addDays(dayMarker, 1);
+ }
+ return instanceStarts;
+ }
+
+ const changeHandlerPlugin = createPlugin({
+ name: 'change-handler',
+ optionChangeHandlers: {
+ events(events, context) {
+ handleEventSources([events], context);
+ },
+ eventSources: handleEventSources,
+ },
+ });
+ /*
+ BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
+ */
+ function handleEventSources(inputs, context) {
+ let unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
+ let newInputs = [];
+ for (let input of inputs) {
+ let inputFound = false;
+ for (let i = 0; i < unfoundSources.length; i += 1) {
+ if (unfoundSources[i]._raw === input) {
+ unfoundSources.splice(i, 1); // delete
+ inputFound = true;
+ break;
+ }
+ }
+ if (!inputFound) {
+ newInputs.push(input);
+ }
+ }
+ for (let unfoundSource of unfoundSources) {
+ context.dispatch({
+ type: 'REMOVE_EVENT_SOURCE',
+ sourceId: unfoundSource.sourceId,
+ });
+ }
+ for (let newInput of newInputs) {
+ context.calendarApi.addEventSource(newInput);
+ }
+ }
+
+ function handleDateProfile(dateProfile, context) {
+ context.emitter.trigger('datesSet', Object.assign(Object.assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
+ }
+
+ function handleEventStore(eventStore, context) {
+ let { emitter } = context;
+ if (emitter.hasHandlers('eventsSet')) {
+ emitter.trigger('eventsSet', buildEventApis(eventStore, context));
+ }
+ }
+
+ /*
+ this array is exposed on the root namespace so that UMD plugins can add to it.
+ see the rollup-bundles script.
+ */
+ const globalPlugins = [
+ arrayEventSourcePlugin,
+ funcEventSourcePlugin,
+ jsonFeedEventSourcePlugin,
+ simpleRecurringEventsPlugin,
+ changeHandlerPlugin,
+ createPlugin({
+ name: 'misc',
+ isLoadingFuncs: [
+ (state) => computeEventSourcesLoading(state.eventSources),
+ ],
+ propSetHandlers: {
+ dateProfile: handleDateProfile,
+ eventStore: handleEventStore,
+ },
+ }),
+ ];
+
+ class TaskRunner {
+ constructor(runTaskOption, drainedOption) {
+ this.runTaskOption = runTaskOption;
+ this.drainedOption = drainedOption;
+ this.queue = [];
+ this.delayedRunner = new DelayedRunner(this.drain.bind(this));
+ }
+ request(task, delay) {
+ this.queue.push(task);
+ this.delayedRunner.request(delay);
+ }
+ pause(scope) {
+ this.delayedRunner.pause(scope);
+ }
+ resume(scope, force) {
+ this.delayedRunner.resume(scope, force);
+ }
+ drain() {
+ let { queue } = this;
+ while (queue.length) {
+ let completedTasks = [];
+ let task;
+ while ((task = queue.shift())) {
+ this.runTask(task);
+ completedTasks.push(task);
+ }
+ this.drained(completedTasks);
+ } // keep going, in case new tasks were added in the drained handler
+ }
+ runTask(task) {
+ if (this.runTaskOption) {
+ this.runTaskOption(task);
+ }
+ }
+ drained(completedTasks) {
+ if (this.drainedOption) {
+ this.drainedOption(completedTasks);
+ }
+ }
+ }
+
+ // Computes what the title at the top of the calendarApi should be for this view
+ function buildTitle(dateProfile, viewOptions, dateEnv) {
+ let range;
+ // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
+ if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
+ range = dateProfile.currentRange;
+ }
+ else { // for day units or smaller, use the actual day range
+ range = dateProfile.activeRange;
+ }
+ return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), {
+ isEndExclusive: dateProfile.isRangeAllDay,
+ defaultSeparator: viewOptions.titleRangeSeparator,
+ });
+ }
+ // Generates the format string that should be used to generate the title for the current date range.
+ // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
+ function buildTitleFormat(dateProfile) {
+ let { currentRangeUnit } = dateProfile;
+ if (currentRangeUnit === 'year') {
+ return { year: 'numeric' };
+ }
+ if (currentRangeUnit === 'month') {
+ return { year: 'numeric', month: 'long' }; // like "September 2014"
+ }
+ let days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
+ if (days !== null && days > 1) {
+ // multi-day range. shorter, like "Sep 9 - 10 2014"
+ return { year: 'numeric', month: 'short', day: 'numeric' };
+ }
+ // one day. longer, like "September 9 2014"
+ return { year: 'numeric', month: 'long', day: 'numeric' };
+ }
+
+ // in future refactor, do the redux-style function(state=initial) for initial-state
+ // also, whatever is happening in constructor, have it happen in action queue too
+ class CalendarDataManager {
+ constructor(props) {
+ this.computeOptionsData = memoize(this._computeOptionsData);
+ this.computeCurrentViewData = memoize(this._computeCurrentViewData);
+ this.organizeRawLocales = memoize(organizeRawLocales);
+ this.buildLocale = memoize(buildLocale);
+ this.buildPluginHooks = buildBuildPluginHooks();
+ this.buildDateEnv = memoize(buildDateEnv$1);
+ this.buildTheme = memoize(buildTheme);
+ this.parseToolbars = memoize(parseToolbars);
+ this.buildViewSpecs = memoize(buildViewSpecs);
+ this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator);
+ this.buildViewApi = memoize(buildViewApi);
+ this.buildViewUiProps = memoizeObjArg(buildViewUiProps);
+ this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual);
+ this.buildEventUiBases = memoize(buildEventUiBases);
+ this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours);
+ this.buildTitle = memoize(buildTitle);
+ this.emitter = new Emitter();
+ this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
+ this.currentCalendarOptionsInput = {};
+ this.currentCalendarOptionsRefined = {};
+ this.currentViewOptionsInput = {};
+ this.currentViewOptionsRefined = {};
+ this.currentCalendarOptionsRefiners = {};
+ this.getCurrentData = () => this.data;
+ this.dispatch = (action) => {
+ this.actionRunner.request(action); // protects against recursive calls to _handleAction
+ };
+ this.props = props;
+ this.actionRunner.pause();
+ let dynamicOptionOverrides = {};
+ let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
+ let currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView;
+ let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
+ // wire things up
+ // TODO: not DRY
+ props.calendarApi.currentDataManager = this;
+ this.emitter.setThisContext(props.calendarApi);
+ this.emitter.setOptions(currentViewData.options);
+ let currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv);
+ let dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
+ if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
+ currentDate = dateProfile.currentRange.start;
+ }
+ let calendarContext = {
+ dateEnv: optionsData.dateEnv,
+ options: optionsData.calendarOptions,
+ pluginHooks: optionsData.pluginHooks,
+ calendarApi: props.calendarApi,
+ dispatch: this.dispatch,
+ emitter: this.emitter,
+ getCurrentData: this.getCurrentData,
+ };
+ // needs to be after setThisContext
+ for (let callback of optionsData.pluginHooks.contextInit) {
+ callback(calendarContext);
+ }
+ // NOT DRY
+ let eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext);
+ let initialState = {
+ dynamicOptionOverrides,
+ currentViewType,
+ currentDate,
+ dateProfile,
+ businessHours: this.parseContextBusinessHours(calendarContext),
+ eventSources,
+ eventUiBases: {},
+ eventStore: createEmptyEventStore(),
+ renderableEventStore: createEmptyEventStore(),
+ dateSelection: null,
+ eventSelection: '',
+ eventDrag: null,
+ eventResize: null,
+ selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig,
+ };
+ let contextAndState = Object.assign(Object.assign({}, calendarContext), initialState);
+ for (let reducer of optionsData.pluginHooks.reducers) {
+ Object.assign(initialState, reducer(null, null, contextAndState));
+ }
+ if (computeIsLoading(initialState, calendarContext)) {
+ this.emitter.trigger('loading', true); // NOT DRY
+ }
+ this.state = initialState;
+ this.updateData();
+ this.actionRunner.resume();
+ }
+ resetOptions(optionOverrides, append) {
+ let { props } = this;
+ props.optionOverrides = append
+ ? Object.assign(Object.assign({}, props.optionOverrides), optionOverrides) : optionOverrides;
+ this.actionRunner.request({
+ type: 'NOTHING',
+ });
+ }
+ _handleAction(action) {
+ let { props, state, emitter } = this;
+ let dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action);
+ let optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
+ let currentViewType = reduceViewType(state.currentViewType, action);
+ let currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
+ // wire things up
+ // TODO: not DRY
+ props.calendarApi.currentDataManager = this;
+ emitter.setThisContext(props.calendarApi);
+ emitter.setOptions(currentViewData.options);
+ let calendarContext = {
+ dateEnv: optionsData.dateEnv,
+ options: optionsData.calendarOptions,
+ pluginHooks: optionsData.pluginHooks,
+ calendarApi: props.calendarApi,
+ dispatch: this.dispatch,
+ emitter,
+ getCurrentData: this.getCurrentData,
+ };
+ let { currentDate, dateProfile } = state;
+ if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack
+ dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
+ }
+ currentDate = reduceCurrentDate(currentDate, action);
+ dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator);
+ if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator
+ action.type === 'NEXT' || // "
+ !rangeContainsMarker(dateProfile.currentRange, currentDate)) {
+ currentDate = dateProfile.currentRange.start;
+ }
+ let eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext);
+ let eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext);
+ let isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading
+ let renderableEventStore = (isEventsLoading && !currentViewData.options.progressiveEventRendering) ?
+ (state.renderableEventStore || eventStore) : // try from previous state
+ eventStore;
+ let { eventUiSingleBase, selectionConfig } = this.buildViewUiProps(calendarContext); // will memoize obj
+ let eventUiBySource = this.buildEventUiBySource(eventSources);
+ let eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
+ let newState = {
+ dynamicOptionOverrides,
+ currentViewType,
+ currentDate,
+ dateProfile,
+ eventSources,
+ eventStore,
+ renderableEventStore,
+ selectionConfig,
+ eventUiBases,
+ businessHours: this.parseContextBusinessHours(calendarContext),
+ dateSelection: reduceDateSelection(state.dateSelection, action),
+ eventSelection: reduceSelectedEvent(state.eventSelection, action),
+ eventDrag: reduceEventDrag(state.eventDrag, action),
+ eventResize: reduceEventResize(state.eventResize, action),
+ };
+ let contextAndState = Object.assign(Object.assign({}, calendarContext), newState);
+ for (let reducer of optionsData.pluginHooks.reducers) {
+ Object.assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value
+ }
+ let wasLoading = computeIsLoading(state, calendarContext);
+ let isLoading = computeIsLoading(newState, calendarContext);
+ // TODO: use propSetHandlers in plugin system
+ if (!wasLoading && isLoading) {
+ emitter.trigger('loading', true);
+ }
+ else if (wasLoading && !isLoading) {
+ emitter.trigger('loading', false);
+ }
+ this.state = newState;
+ if (props.onAction) {
+ props.onAction(action);
+ }
+ }
+ updateData() {
+ let { props, state } = this;
+ let oldData = this.data;
+ let optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi);
+ let currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides);
+ let data = this.data = Object.assign(Object.assign(Object.assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state);
+ let changeHandlers = optionsData.pluginHooks.optionChangeHandlers;
+ let oldCalendarOptions = oldData && oldData.calendarOptions;
+ let newCalendarOptions = optionsData.calendarOptions;
+ if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) {
+ if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) {
+ // hack
+ state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data);
+ state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv);
+ }
+ for (let optionName in changeHandlers) {
+ if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) {
+ changeHandlers[optionName](newCalendarOptions[optionName], data);
+ }
+ }
+ }
+ if (props.onData) {
+ props.onData(data);
+ }
+ }
+ _computeOptionsData(optionOverrides, dynamicOptionOverrides, calendarApi) {
+ // TODO: blacklist options that are handled by optionChangeHandlers
+ let { refinedOptions, pluginHooks, localeDefaults, availableLocaleData, extra, } = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides);
+ warnUnknownOptions(extra);
+ let dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator);
+ let viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults);
+ let theme = this.buildTheme(refinedOptions, pluginHooks);
+ let toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi);
+ return {
+ calendarOptions: refinedOptions,
+ pluginHooks,
+ dateEnv,
+ viewSpecs,
+ theme,
+ toolbarConfig,
+ localeDefaults,
+ availableRawLocales: availableLocaleData.map,
+ };
+ }
+ // always called from behind a memoizer
+ processRawCalendarOptions(optionOverrides, dynamicOptionOverrides) {
+ let { locales, locale } = mergeRawOptions([
+ BASE_OPTION_DEFAULTS,
+ optionOverrides,
+ dynamicOptionOverrides,
+ ]);
+ let availableLocaleData = this.organizeRawLocales(locales);
+ let availableRawLocales = availableLocaleData.map;
+ let localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options;
+ let pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins);
+ let refiners = this.currentCalendarOptionsRefiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
+ let extra = {};
+ let raw = mergeRawOptions([
+ BASE_OPTION_DEFAULTS,
+ localeDefaults,
+ optionOverrides,
+ dynamicOptionOverrides,
+ ]);
+ let refined = {};
+ let currentRaw = this.currentCalendarOptionsInput;
+ let currentRefined = this.currentCalendarOptionsRefined;
+ let anyChanges = false;
+ for (let optionName in raw) {
+ if (optionName !== 'plugins') { // because plugins is special-cased
+ if (raw[optionName] === currentRaw[optionName] ||
+ (COMPLEX_OPTION_COMPARATORS[optionName] &&
+ (optionName in currentRaw) &&
+ COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) {
+ refined[optionName] = currentRefined[optionName];
+ }
+ else if (refiners[optionName]) {
+ refined[optionName] = refiners[optionName](raw[optionName]);
+ anyChanges = true;
+ }
+ else {
+ extra[optionName] = currentRaw[optionName];
+ }
+ }
+ }
+ if (anyChanges) {
+ this.currentCalendarOptionsInput = raw;
+ this.currentCalendarOptionsRefined = refined;
+ }
+ return {
+ rawOptions: this.currentCalendarOptionsInput,
+ refinedOptions: this.currentCalendarOptionsRefined,
+ pluginHooks,
+ availableLocaleData,
+ localeDefaults,
+ extra,
+ };
+ }
+ _computeCurrentViewData(viewType, optionsData, optionOverrides, dynamicOptionOverrides) {
+ let viewSpec = optionsData.viewSpecs[viewType];
+ if (!viewSpec) {
+ throw new Error(`viewType "${viewType}" is not available. Please make sure you've loaded all neccessary plugins`);
+ }
+ let { refinedOptions, extra } = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides);
+ warnUnknownOptions(extra);
+ let dateProfileGenerator = this.buildDateProfileGenerator({
+ dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass,
+ duration: viewSpec.duration,
+ durationUnit: viewSpec.durationUnit,
+ usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
+ dateEnv: optionsData.dateEnv,
+ calendarApi: this.props.calendarApi,
+ slotMinTime: refinedOptions.slotMinTime,
+ slotMaxTime: refinedOptions.slotMaxTime,
+ showNonCurrentDates: refinedOptions.showNonCurrentDates,
+ dayCount: refinedOptions.dayCount,
+ dateAlignment: refinedOptions.dateAlignment,
+ dateIncrement: refinedOptions.dateIncrement,
+ hiddenDays: refinedOptions.hiddenDays,
+ weekends: refinedOptions.weekends,
+ nowInput: refinedOptions.now,
+ validRangeInput: refinedOptions.validRange,
+ visibleRangeInput: refinedOptions.visibleRange,
+ monthMode: refinedOptions.monthMode,
+ fixedWeekCount: refinedOptions.fixedWeekCount,
+ });
+ let viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv);
+ return { viewSpec, options: refinedOptions, dateProfileGenerator, viewApi };
+ }
+ processRawViewOptions(viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) {
+ let raw = mergeRawOptions([
+ BASE_OPTION_DEFAULTS,
+ viewSpec.optionDefaults,
+ localeDefaults,
+ optionOverrides,
+ viewSpec.optionOverrides,
+ dynamicOptionOverrides,
+ ]);
+ let refiners = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
+ let refined = {};
+ let currentRaw = this.currentViewOptionsInput;
+ let currentRefined = this.currentViewOptionsRefined;
+ let anyChanges = false;
+ let extra = {};
+ for (let optionName in raw) {
+ if (raw[optionName] === currentRaw[optionName] ||
+ (COMPLEX_OPTION_COMPARATORS[optionName] &&
+ COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName]))) {
+ refined[optionName] = currentRefined[optionName];
+ }
+ else {
+ if (raw[optionName] === this.currentCalendarOptionsInput[optionName] ||
+ (COMPLEX_OPTION_COMPARATORS[optionName] &&
+ COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName]))) {
+ if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop
+ refined[optionName] = this.currentCalendarOptionsRefined[optionName];
+ }
+ }
+ else if (refiners[optionName]) {
+ refined[optionName] = refiners[optionName](raw[optionName]);
+ }
+ else {
+ extra[optionName] = raw[optionName];
+ }
+ anyChanges = true;
+ }
+ }
+ if (anyChanges) {
+ this.currentViewOptionsInput = raw;
+ this.currentViewOptionsRefined = refined;
+ }
+ return {
+ rawOptions: this.currentViewOptionsInput,
+ refinedOptions: this.currentViewOptionsRefined,
+ extra,
+ };
+ }
+ }
+ function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) {
+ let locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map);
+ return new DateEnv({
+ calendarSystem: 'gregory',
+ timeZone,
+ namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl,
+ locale,
+ weekNumberCalculation,
+ firstDay,
+ weekText,
+ cmdFormatter: pluginHooks.cmdFormatter,
+ defaultSeparator,
+ });
+ }
+ function buildTheme(options, pluginHooks) {
+ let ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme;
+ return new ThemeClass(options);
+ }
+ function buildDateProfileGenerator(props) {
+ let DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator;
+ return new DateProfileGeneratorClass(props);
+ }
+ function buildViewApi(type, getCurrentData, dateEnv) {
+ return new ViewImpl(type, getCurrentData, dateEnv);
+ }
+ function buildEventUiBySource(eventSources) {
+ return mapHash(eventSources, (eventSource) => eventSource.ui);
+ }
+ function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
+ let eventUiBases = { '': eventUiSingleBase };
+ for (let defId in eventDefs) {
+ let def = eventDefs[defId];
+ if (def.sourceId && eventUiBySource[def.sourceId]) {
+ eventUiBases[defId] = eventUiBySource[def.sourceId];
+ }
+ }
+ return eventUiBases;
+ }
+ function buildViewUiProps(calendarContext) {
+ let { options } = calendarContext;
+ return {
+ eventUiSingleBase: createEventUi({
+ display: options.eventDisplay,
+ editable: options.editable,
+ startEditable: options.eventStartEditable,
+ durationEditable: options.eventDurationEditable,
+ constraint: options.eventConstraint,
+ overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined,
+ allow: options.eventAllow,
+ backgroundColor: options.eventBackgroundColor,
+ borderColor: options.eventBorderColor,
+ textColor: options.eventTextColor,
+ color: options.eventColor,
+ // classNames: options.eventClassNames // render hook will handle this
+ }, calendarContext),
+ selectionConfig: createEventUi({
+ constraint: options.selectConstraint,
+ overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined,
+ allow: options.selectAllow,
+ }, calendarContext),
+ };
+ }
+ function computeIsLoading(state, context) {
+ for (let isLoadingFunc of context.pluginHooks.isLoadingFuncs) {
+ if (isLoadingFunc(state)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function parseContextBusinessHours(calendarContext) {
+ return parseBusinessHours(calendarContext.options.businessHours, calendarContext);
+ }
+ function warnUnknownOptions(options, viewName) {
+ for (let optionName in options) {
+ console.warn(`Unknown option '${optionName}'` +
+ (viewName ? ` for view '${viewName}'` : ''));
+ }
+ }
+
+ class ToolbarSection extends BaseComponent {
+ render() {
+ let children = this.props.widgetGroups.map((widgetGroup) => this.renderWidgetGroup(widgetGroup));
+ return h('div', { className: 'fc-toolbar-chunk' }, ...children);
+ }
+ renderWidgetGroup(widgetGroup) {
+ let { props } = this;
+ let { theme } = this.context;
+ let children = [];
+ let isOnlyButtons = true;
+ for (let widget of widgetGroup) {
+ let { buttonName, buttonClick, buttonText, buttonIcon, buttonHint } = widget;
+ if (buttonName === 'title') {
+ isOnlyButtons = false;
+ children.push(h("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title));
+ }
+ else {
+ let isPressed = buttonName === props.activeButton;
+ let isDisabled = (!props.isTodayEnabled && buttonName === 'today') ||
+ (!props.isPrevEnabled && buttonName === 'prev') ||
+ (!props.isNextEnabled && buttonName === 'next');
+ let buttonClasses = [`fc-${buttonName}-button`, theme.getClass('button')];
+ if (isPressed) {
+ buttonClasses.push(theme.getClass('buttonActive'));
+ }
+ children.push(h("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? h("span", { className: buttonIcon }) : '')));
+ }
+ }
+ if (children.length > 1) {
+ let groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || '';
+ return h('div', { className: groupClassName }, ...children);
+ }
+ return children[0];
+ }
+ }
+
+ class Toolbar extends BaseComponent {
+ render() {
+ let { model, extraClassName } = this.props;
+ let forceLtr = false;
+ let startContent;
+ let endContent;
+ let sectionWidgets = model.sectionWidgets;
+ let centerContent = sectionWidgets.center;
+ if (sectionWidgets.left) {
+ forceLtr = true;
+ startContent = sectionWidgets.left;
+ }
+ else {
+ startContent = sectionWidgets.start;
+ }
+ if (sectionWidgets.right) {
+ forceLtr = true;
+ endContent = sectionWidgets.right;
+ }
+ else {
+ endContent = sectionWidgets.end;
+ }
+ let classNames = [
+ extraClassName || '',
+ 'fc-toolbar',
+ forceLtr ? 'fc-toolbar-ltr' : '',
+ ];
+ return (h("div", { className: classNames.join(' ') },
+ this.renderSection('start', startContent || []),
+ this.renderSection('center', centerContent || []),
+ this.renderSection('end', endContent || [])));
+ }
+ renderSection(key, widgetGroups) {
+ let { props } = this;
+ return (h(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId }));
+ }
+ }
+
+ // TODO: do function component?
+ class ViewContainer extends BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.state = {
+ availableWidth: null,
+ };
+ this.handleEl = (el) => {
+ this.el = el;
+ setRef(this.props.elRef, el);
+ this.updateAvailableWidth();
+ };
+ this.handleResize = () => {
+ this.updateAvailableWidth();
+ };
+ }
+ render() {
+ let { props, state } = this;
+ let { aspectRatio } = props;
+ let classNames = [
+ 'fc-view-harness',
+ (aspectRatio || props.liquid || props.height)
+ ? 'fc-view-harness-active' // harness controls the height
+ : 'fc-view-harness-passive', // let the view do the height
+ ];
+ let height = '';
+ let paddingBottom = '';
+ if (aspectRatio) {
+ if (state.availableWidth !== null) {
+ height = state.availableWidth / aspectRatio;
+ }
+ else {
+ // while waiting to know availableWidth, we can't set height to *zero*
+ // because will cause lots of unnecessary scrollbars within scrollgrid.
+ // BETTER: don't start rendering ANYTHING yet until we know container width
+ // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606)
+ paddingBottom = `${(1 / aspectRatio) * 100}%`;
+ }
+ }
+ else {
+ height = props.height || '';
+ }
+ return (h("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height, paddingBottom } }, props.children));
+ }
+ componentDidMount() {
+ this.context.addResizeHandler(this.handleResize);
+ }
+ componentWillUnmount() {
+ this.context.removeResizeHandler(this.handleResize);
+ }
+ updateAvailableWidth() {
+ if (this.el && // needed. but why?
+ this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth
+ ) {
+ this.setState({ availableWidth: this.el.offsetWidth });
+ }
+ }
+ }
+
+ /*
+ Detects when the user clicks on an event within a DateComponent
+ */
+ class EventClicking extends Interaction {
+ constructor(settings) {
+ super(settings);
+ this.handleSegClick = (ev, segEl) => {
+ let { component } = this;
+ let { context } = component;
+ let seg = getElSeg(segEl);
+ if (seg && // might be the <div> surrounding the more link
+ component.isValidSegDownEl(ev.target)) {
+ // our way to simulate a link click for elements that can't be <a> tags
+ // grab before trigger fired in case trigger trashes DOM thru rerendering
+ let hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url');
+ let url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
+ context.emitter.trigger('eventClick', {
+ el: segEl,
+ event: new EventImpl(component.context, seg.eventRange.def, seg.eventRange.instance),
+ jsEvent: ev,
+ view: context.viewApi,
+ });
+ if (url && !ev.defaultPrevented) {
+ window.location.href = url;
+ }
+ }
+ };
+ this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events
+ this.handleSegClick);
+ }
+ }
+
+ /*
+ Triggers events and adds/removes core classNames when the user's pointer
+ enters/leaves event-elements of a component.
+ */
+ class EventHovering extends Interaction {
+ constructor(settings) {
+ super(settings);
+ // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
+ this.handleEventElRemove = (el) => {
+ if (el === this.currentSegEl) {
+ this.handleSegLeave(null, this.currentSegEl);
+ }
+ };
+ this.handleSegEnter = (ev, segEl) => {
+ if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
+ this.currentSegEl = segEl;
+ this.triggerEvent('eventMouseEnter', ev, segEl);
+ }
+ };
+ this.handleSegLeave = (ev, segEl) => {
+ if (this.currentSegEl) {
+ this.currentSegEl = null;
+ this.triggerEvent('eventMouseLeave', ev, segEl);
+ }
+ };
+ this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events
+ this.handleSegEnter, this.handleSegLeave);
+ }
+ destroy() {
+ this.removeHoverListeners();
+ }
+ triggerEvent(publicEvName, ev, segEl) {
+ let { component } = this;
+ let { context } = component;
+ let seg = getElSeg(segEl);
+ if (!ev || component.isValidSegDownEl(ev.target)) {
+ context.emitter.trigger(publicEvName, {
+ el: segEl,
+ event: new EventImpl(context, seg.eventRange.def, seg.eventRange.instance),
+ jsEvent: ev,
+ view: context.viewApi,
+ });
+ }
+ }
+ }
+
+ class CalendarContent extends PureComponent {
+ constructor() {
+ super(...arguments);
+ this.buildViewContext = memoize(buildViewContext);
+ this.buildViewPropTransformers = memoize(buildViewPropTransformers);
+ this.buildToolbarProps = memoize(buildToolbarProps);
+ this.headerRef = y();
+ this.footerRef = y();
+ this.interactionsStore = {};
+ // eslint-disable-next-line
+ this.state = {
+ viewLabelId: getUniqueDomId(),
+ };
+ // Component Registration
+ // -----------------------------------------------------------------------------------------------------------------
+ this.registerInteractiveComponent = (component, settingsInput) => {
+ let settings = parseInteractionSettings(component, settingsInput);
+ let DEFAULT_INTERACTIONS = [
+ EventClicking,
+ EventHovering,
+ ];
+ let interactionClasses = DEFAULT_INTERACTIONS.concat(this.props.pluginHooks.componentInteractions);
+ let interactions = interactionClasses.map((TheInteractionClass) => new TheInteractionClass(settings));
+ this.interactionsStore[component.uid] = interactions;
+ interactionSettingsStore[component.uid] = settings;
+ };
+ this.unregisterInteractiveComponent = (component) => {
+ let listeners = this.interactionsStore[component.uid];
+ if (listeners) {
+ for (let listener of listeners) {
+ listener.destroy();
+ }
+ delete this.interactionsStore[component.uid];
+ }
+ delete interactionSettingsStore[component.uid];
+ };
+ // Resizing
+ // -----------------------------------------------------------------------------------------------------------------
+ this.resizeRunner = new DelayedRunner(() => {
+ this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ?
+ this.props.emitter.trigger('windowResize', { view: this.props.viewApi });
+ });
+ this.handleWindowResize = (ev) => {
+ let { options } = this.props;
+ if (options.handleWindowResize &&
+ ev.target === window // avoid jqui events
+ ) {
+ this.resizeRunner.request(options.windowResizeDelay);
+ }
+ };
+ }
+ /*
+ renders INSIDE of an outer div
+ */
+ render() {
+ let { props } = this;
+ let { toolbarConfig, options } = props;
+ let toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer????
+ props.viewTitle);
+ let viewVGrow = false;
+ let viewHeight = '';
+ let viewAspectRatio;
+ if (props.isHeightAuto || props.forPrint) {
+ viewHeight = '';
+ }
+ else if (options.height != null) {
+ viewVGrow = true;
+ }
+ else if (options.contentHeight != null) {
+ viewHeight = options.contentHeight;
+ }
+ else {
+ viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall
+ }
+ let viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
+ let viewLabelId = (toolbarConfig.header && toolbarConfig.header.hasTitle)
+ ? this.state.viewLabelId
+ : '';
+ return (h(ViewContextType.Provider, { value: viewContext },
+ toolbarConfig.header && (h(Toolbar, Object.assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps))),
+ h(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId },
+ this.renderView(props),
+ this.buildAppendContent()),
+ toolbarConfig.footer && (h(Toolbar, Object.assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps)))));
+ }
+ componentDidMount() {
+ let { props } = this;
+ this.calendarInteractions = props.pluginHooks.calendarInteractions
+ .map((CalendarInteractionClass) => new CalendarInteractionClass(props));
+ window.addEventListener('resize', this.handleWindowResize);
+ let { propSetHandlers } = props.pluginHooks;
+ for (let propName in propSetHandlers) {
+ propSetHandlers[propName](props[propName], props);
+ }
+ }
+ componentDidUpdate(prevProps) {
+ let { props } = this;
+ let { propSetHandlers } = props.pluginHooks;
+ for (let propName in propSetHandlers) {
+ if (props[propName] !== prevProps[propName]) {
+ propSetHandlers[propName](props[propName], props);
+ }
+ }
+ }
+ componentWillUnmount() {
+ window.removeEventListener('resize', this.handleWindowResize);
+ this.resizeRunner.clear();
+ for (let interaction of this.calendarInteractions) {
+ interaction.destroy();
+ }
+ this.props.emitter.trigger('_unmount');
+ }
+ buildAppendContent() {
+ let { props } = this;
+ let children = props.pluginHooks.viewContainerAppends.map((buildAppendContent) => buildAppendContent(props));
+ return h(p, {}, ...children);
+ }
+ renderView(props) {
+ let { pluginHooks } = props;
+ let { viewSpec } = props;
+ let viewProps = {
+ dateProfile: props.dateProfile,
+ businessHours: props.businessHours,
+ eventStore: props.renderableEventStore,
+ eventUiBases: props.eventUiBases,
+ dateSelection: props.dateSelection,
+ eventSelection: props.eventSelection,
+ eventDrag: props.eventDrag,
+ eventResize: props.eventResize,
+ isHeightAuto: props.isHeightAuto,
+ forPrint: props.forPrint,
+ };
+ let transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
+ for (let transformer of transformers) {
+ Object.assign(viewProps, transformer.transform(viewProps, props));
+ }
+ let ViewComponent = viewSpec.component;
+ return (h(ViewComponent, Object.assign({}, viewProps)));
+ }
+ }
+ function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) {
+ // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid
+ let todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason
+ let prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false);
+ let nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false);
+ return {
+ title,
+ activeButton: viewSpec.type,
+ navUnit: viewSpec.singleUnit,
+ isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
+ isPrevEnabled: prevInfo.isValid,
+ isNextEnabled: nextInfo.isValid,
+ };
+ }
+ // Plugin
+ // -----------------------------------------------------------------------------------------------------------------
+ function buildViewPropTransformers(theClasses) {
+ return theClasses.map((TheClass) => new TheClass());
+ }
+
+ class Calendar extends CalendarImpl {
+ constructor(el, optionOverrides = {}) {
+ super();
+ this.isRendering = false;
+ this.isRendered = false;
+ this.currentClassNames = [];
+ this.customContentRenderId = 0;
+ this.handleAction = (action) => {
+ // actions we know we want to render immediately
+ switch (action.type) {
+ case 'SET_EVENT_DRAG':
+ case 'SET_EVENT_RESIZE':
+ this.renderRunner.tryDrain();
+ }
+ };
+ this.handleData = (data) => {
+ this.currentData = data;
+ this.renderRunner.request(data.calendarOptions.rerenderDelay);
+ };
+ this.handleRenderRequest = () => {
+ if (this.isRendering) {
+ this.isRendered = true;
+ let { currentData } = this;
+ flushSync(() => {
+ P$1(h(CalendarRoot, { options: currentData.calendarOptions, theme: currentData.theme, emitter: currentData.emitter }, (classNames, height, isHeightAuto, forPrint) => {
+ this.setClassNames(classNames);
+ this.setHeight(height);
+ return (h(RenderId.Provider, { value: this.customContentRenderId },
+ h(CalendarContent, Object.assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData))));
+ }), this.el);
+ });
+ }
+ else if (this.isRendered) {
+ this.isRendered = false;
+ P$1(null, this.el);
+ this.setClassNames([]);
+ this.setHeight('');
+ }
+ };
+ this.el = el;
+ this.renderRunner = new DelayedRunner(this.handleRenderRequest);
+ new CalendarDataManager({
+ optionOverrides,
+ calendarApi: this,
+ onAction: this.handleAction,
+ onData: this.handleData,
+ });
+ }
+ render() {
+ let wasRendering = this.isRendering;
+ if (!wasRendering) {
+ this.isRendering = true;
+ }
+ else {
+ this.customContentRenderId += 1;
+ }
+ this.renderRunner.request();
+ if (wasRendering) {
+ this.updateSize();
+ }
+ }
+ destroy() {
+ if (this.isRendering) {
+ this.isRendering = false;
+ this.renderRunner.request();
+ }
+ }
+ updateSize() {
+ flushSync(() => {
+ super.updateSize();
+ });
+ }
+ batchRendering(func) {
+ this.renderRunner.pause('batchRendering');
+ func();
+ this.renderRunner.resume('batchRendering');
+ }
+ pauseRendering() {
+ this.renderRunner.pause('pauseRendering');
+ }
+ resumeRendering() {
+ this.renderRunner.resume('pauseRendering', true);
+ }
+ resetOptions(optionOverrides, append) {
+ this.currentDataManager.resetOptions(optionOverrides, append);
+ }
+ setClassNames(classNames) {
+ if (!isArraysEqual(classNames, this.currentClassNames)) {
+ let { classList } = this.el;
+ for (let className of this.currentClassNames) {
+ classList.remove(className);
+ }
+ for (let className of classNames) {
+ classList.add(className);
+ }
+ this.currentClassNames = classNames;
+ }
+ }
+ setHeight(height) {
+ applyStyleProp(this.el, 'height', height);
+ }
+ }
+
+ function formatDate(dateInput, options = {}) {
+ let dateEnv = buildDateEnv(options);
+ let formatter = createFormatter(options);
+ let dateMeta = dateEnv.createMarkerMeta(dateInput);
+ if (!dateMeta) { // TODO: warning?
+ return '';
+ }
+ return dateEnv.format(dateMeta.marker, formatter, {
+ forcedTzo: dateMeta.forcedTzo,
+ });
+ }
+ function formatRange(startInput, endInput, options) {
+ let dateEnv = buildDateEnv(typeof options === 'object' && options ? options : {}); // pass in if non-null object
+ let formatter = createFormatter(options);
+ let startMeta = dateEnv.createMarkerMeta(startInput);
+ let endMeta = dateEnv.createMarkerMeta(endInput);
+ if (!startMeta || !endMeta) { // TODO: warning?
+ return '';
+ }
+ return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
+ forcedStartTzo: startMeta.forcedTzo,
+ forcedEndTzo: endMeta.forcedTzo,
+ isEndExclusive: options.isEndExclusive,
+ defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator,
+ });
+ }
+ // TODO: more DRY and optimized
+ function buildDateEnv(settings) {
+ let locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
+ return new DateEnv(Object.assign(Object.assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale }));
+ }
+
+ // HELPERS
+ /*
+ if nextDayThreshold is specified, slicing is done in an all-day fashion.
+ you can get nextDayThreshold from context.nextDayThreshold
+ */
+ function sliceEvents(props, allDay) {
+ return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
+ }
+
+ const version = '6.0.3';
+
+ exports.Calendar = Calendar;
+ exports.Internal = internal;
+ exports.JsonRequestError = JsonRequestError;
+ exports.Preact = preact;
+ exports.createPlugin = createPlugin;
+ exports.formatDate = formatDate;
+ exports.formatRange = formatRange;
+ exports.globalLocales = globalLocales;
+ exports.globalPlugins = globalPlugins;
+ exports.sliceEvents = sliceEvents;
+ exports.version = version;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({});
diff --git a/library/fullcalendar/packages/core/index.global.min.js b/library/fullcalendar/packages/core/index.global.min.js
new file mode 100644
index 000000000..8b7f621e9
--- /dev/null
+++ b/library/fullcalendar/packages/core/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+var FullCalendar=function(e){"use strict";function t(e){e.parentNode&&e.parentNode.removeChild(e)}function n(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(r(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function r(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function i(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e<n.length;e+=1){let i=n[e].querySelectorAll(t);for(let e=0;e<i.length;e+=1)r.push(i[e])}return r}const o=/(top|left|right|bottom|width|height)$/i;function s(e,t){for(let n in t)a(e,n,t[n])}function a(e,t,n){null==n?e.style[t]="":"number"==typeof n&&o.test(t)?e.style[t]=n+"px":e.style[t]=n}function l(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}let c=0;function u(){return c+=1,"fc-dom-"+c}function d(e){e.preventDefault()}function f(e,t,r,i){let o=function(e,t){return r=>{let i=n(r.target,e);i&&t.call(i,r,i)}}(r,i);return e.addEventListener(t,o),()=>{e.removeEventListener(t,o)}}const h=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function p(e){return Object.assign({onClick:e},g(e))}function g(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let m=0;function v(){return m+=1,String(m)}function A(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t+=1)n=i[t],"string"==typeof n?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function b(e,t,n){let r,i;for(r=0;r<n.length;r+=1)if(i=y(e,t,n[r]),i)return i;return 0}function y(e,t,n){return n.func?n.func(e,t):_(e[n.field],t[n.field])*(n.order||1)}function _(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function E(e,t){let n=String(e);return"000".substr(0,t-n.length)+n}function D(e,t,n){return"function"==typeof e?e(...t):"string"==typeof e?t.reduce((e,t,n)=>e.replace("$"+n,t||""),e):n}function C(e){return e%1==0}function w(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const S=["years","months","days","milliseconds"],T=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function k(e,t){return"string"==typeof e?function(e){let t=T.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?R(e):"number"==typeof e?R({[t||"milliseconds"]:e}):null}function R(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function x(e){return O(e)/864e5}function O(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function I(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}const{hasOwnProperty:M}=Object.prototype;function N(e,t){let n={};if(t)for(let r in t){let t=[];for(let i=e.length-1;i>=0;i-=1){let o=e[i][r];if("object"==typeof o&&o)t.unshift(o);else if(void 0!==o){n[r]=o;break}}t.length&&(n[r]=N(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function B(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function H(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function P(e){let t={};for(let n of e)t[n]=!0;return t}function U(e){let t=[];for(let n in e)t.push(e[n]);return t}function j(e,t){if(e===t)return!0;for(let n in e)if(M.call(e,n)&&!(n in t))return!1;for(let n in t)if(M.call(t,n)&&e[n]!==t[n])return!1;return!0}const z=/^on[A-Z]/;function L(e,t){let n=[];for(let r in e)M.call(e,r)&&(r in t||n.push(r));for(let r in t)M.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function F(e,t,n={}){if(e===t)return!0;for(let r in t)if(!(r in e)||!V(e[r],t[r],n[r]))return!1;for(let n in e)if(!(n in t))return!1;return!0}function V(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function W(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let o=t;o<n;o+=r){let t=e[o];void 0!==t&&i.push(t)}return i}const Q=["sun","mon","tue","wed","thu","fri","sat"];function G(e,t){let n=re(e);return n[2]+=t,ie(n)}function Z(e,t){let n=re(e);return n[6]+=t,ie(n)}function Y(e,t){return(t.valueOf()-e.valueOf())/864e5}function q(e,t){let n=X(e),r=X(t);return{years:0,months:0,days:Math.round(Y(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function J(e,t){let n=$(e,t);return null!==n&&n%7==0?n/7:null}function $(e,t){return se(e)===se(t)?Math.round(Y(e,t)):null}function X(e){return ie([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function K(e,t,n,r){let i=ie([t,0,1+ee(t,n,r)]),o=X(e),s=Math.round(Y(i,o));return Math.floor(s/7)+1}function ee(e,t,n){let r=7+t-n;return-((7+ie([e,0,r]).getUTCDay()-t)%7)+r-1}function te(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function ne(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function re(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function ie(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC(...e))}function oe(e){return!isNaN(e.valueOf())}function se(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function ae(e,t,n=!1){let r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",ce(t,!0)))),r}function le(e){return e.toISOString().replace(/T.*$/,"")}function ce(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?`${n+E(i,2)}:${E(o,2)}`:`GMT${n}${i}${o?":"+E(o,2):""}`}function ue(e,t,n){if(e===t)return!0;let r,i=e.length;if(i!==t.length)return!1;for(r=0;r<i;r+=1)if(!(n?n(e[r],t[r]):e[r]===t[r]))return!1;return!0}function de(e,t,n){let r,i;return function(...o){if(r){if(!ue(r,o)){n&&n(i);let r=e.apply(this,o);t&&t(r,i)||(i=r)}}else i=e.apply(this,o);return r=o,i}}function fe(e,t,n){let r,i;return o=>{if(r){if(!j(r,o)){n&&n(i);let r=e.call(this,o);t&&t(r,i)||(i=r)}}else i=e.call(this,o);return r=o,i}}const he={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},pe={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},ge=/\s*([ap])\.?m\.?/i,me=/,/g,ve=/\s+/g,Ae=/\u200e/g,be=/UTC|GMT/;class ye{constructor(e){let t={},n={},r=0;for(let i in e)i in he?(n[i]=e[i],r=Math.max(he[i],r)):(t[i]=e[i],i in pe&&(r=Math.max(pe[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=de(_e)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:o}=this,s=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(se(e)!==se(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!s)return this.format(e,n);let a=s;!(a>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(a=1);let l=this.format(e,n),c=this.format(t,n);if(l===c)return l;let u=_e(function(e,t){let n={};for(let r in e)(!(r in pe)||pe[r]<=t)&&(n[r]=e[r]);return n}(i,a),o,n),d=u(e),f=u(t),h=function(e,t,n,r){let i=0;for(;i<e.length;){let o=e.indexOf(t,i);if(-1===o)break;let s=e.substr(0,o);i=o+t.length;let a=e.substr(i),l=0;for(;l<n.length;){let e=n.indexOf(r,l);if(-1===e)break;let t=n.substr(0,e);l=e+r.length;let i=n.substr(l);if(s===t&&a===i)return{before:s,after:a}}}return null}(l,d,c,f),p=o.separator||r||n.defaultSeparator||"";return h?h.before+d+p+f+h.after:l+p+c}getLargestUnit(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}}}function _e(e,t,n){let r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?e=>ce(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let o=[];"long"===i?o.push(n):"short"!==i&&"narrow"!==i||o.push(t);"long"!==i&&"short"!==i||o.push(" ");o.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&o.reverse();return o.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return o=>{let s,{marker:a}=o;return s=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){e=e.replace(Ae,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;e=e.replace(be,()=>(n=!0,t)),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":ce(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(me,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(ge,"").trim():"narrow"===r.meridiem?e=e.replace(ge,(e,t)=>t.toLocaleLowerCase()):"short"===r.meridiem?e=e.replace(ge,(e,t)=>t.toLocaleLowerCase()+"m"):"lowercase"===r.meridiem&&(e=e.replace(ge,e=>e.toLocaleLowerCase()));return e=(e=e.replace(ve," ")).trim()}(s.format(a),o,e,t,n)}}(e,t,n)}function Ee(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function De(e,t,n,r){let i=Ee(e,n.calendarSystem);return{date:i,start:i,end:t?Ee(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class Ce{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,De(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,De(e,t,n,r))}}class we{constructor(e){this.func=e}format(e,t,n){return this.func(De(e,null,t,n))}formatRange(e,t,n,r){return this.func(De(e,t,n,r))}}function Se(e){return"object"==typeof e&&e?new ye(e):"string"==typeof e?new Ce(e):"function"==typeof e?new we(e):null}const Te={navLinkDayClick:He,navLinkWeekClick:He,duration:k,bootstrapFontAwesome:He,buttonIcons:He,customButtons:He,defaultAllDayEventDuration:k,defaultTimedEventDuration:k,nextDayThreshold:k,scrollTime:k,scrollTimeReset:Boolean,slotMinTime:k,slotMaxTime:k,dayPopoverFormat:Se,slotDuration:k,snapDuration:k,headerToolbar:He,footerToolbar:He,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:Se,dayHeaderClassNames:He,dayHeaderContent:He,dayHeaderDidMount:He,dayHeaderWillUnmount:He,dayCellClassNames:He,dayCellContent:He,dayCellDidMount:He,dayCellWillUnmount:He,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:He,weekNumbers:Boolean,weekNumberClassNames:He,weekNumberContent:He,weekNumberDidMount:He,weekNumberWillUnmount:He,editable:Boolean,viewClassNames:He,viewDidMount:He,viewWillUnmount:He,nowIndicator:Boolean,nowIndicatorClassNames:He,nowIndicatorContent:He,nowIndicatorDidMount:He,nowIndicatorWillUnmount:He,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:He,locale:He,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:He,eventOrder:A,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:He,contentHeight:He,direction:String,weekNumberFormat:Se,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:He,initialDate:He,now:He,eventDataTransform:He,stickyHeaderDates:He,stickyFooterScrollbar:He,viewHeight:He,defaultAllDay:Boolean,eventSourceFailure:He,eventSourceSuccess:He,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:He,eventConstraint:He,eventAllow:He,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:He,eventContent:He,eventDidMount:He,eventWillUnmount:He,selectConstraint:He,selectOverlap:He,selectAllow:He,droppable:Boolean,unselectCancel:String,slotLabelFormat:He,slotLaneClassNames:He,slotLaneContent:He,slotLaneDidMount:He,slotLaneWillUnmount:He,slotLabelClassNames:He,slotLabelContent:He,slotLabelDidMount:He,slotLabelWillUnmount:He,dayMaxEvents:He,dayMaxEventRows:He,dayMinWidth:Number,slotLabelInterval:k,allDayText:String,allDayClassNames:He,allDayContent:He,allDayDidMount:He,allDayWillUnmount:He,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:Se,rerenderDelay:Number,moreLinkText:He,moreLinkHint:He,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:He,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:k,hiddenDays:He,monthMode:Boolean,fixedWeekCount:Boolean,validRange:He,visibleRange:He,titleFormat:He,eventInteractive:Boolean,noEventsText:String,viewHint:He,navLinkHint:He,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:He,moreLinkClassNames:He,moreLinkContent:He,moreLinkDidMount:He,moreLinkWillUnmount:He,handleCustomRendering:He,customRenderingMetaMap:He,customRenderingReplacesEl:Boolean},ke={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30},Re={datesSet:He,eventsSet:He,eventAdd:He,eventChange:He,eventRemove:He,windowResize:He,eventClick:He,eventMouseEnter:He,eventMouseLeave:He,select:He,unselect:He,loading:He,_unmount:He,_beforeprint:He,_afterprint:He,_noEventDrop:He,_noEventResize:He,_resize:He,_scrollRequest:He},xe={buttonText:He,buttonHints:He,views:He,plugins:He,initialEvents:He,events:He,eventSources:He},Oe={headerToolbar:Ie,footerToolbar:Ie,buttonText:Ie,buttonHints:Ie,buttonIcons:Ie,dateIncrement:Ie};function Ie(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?j(e,t):e===t}const Me={type:String,component:He,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:He,usesMinMaxTime:Boolean,classNames:He,content:He,didMount:He,willUnmount:He};function Ne(e){return N(e,Oe)}function Be(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function He(e){return e}function Pe(e,t,n,r){return{instanceId:v(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function Ue(e,t,n){let{dateEnv:r,pluginHooks:i,options:o}=n,{defs:s,instances:a}=e;a=B(a,e=>!s[e.defId].recurringDef);for(let e in s){let n=s[e];if(n.recurringDef){let{duration:s}=n.recurringDef;s||(s=n.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration);let l=je(n,s,t,r,i.recurringTypes);for(let t of l){let n=Pe(e,{start:t,end:r.add(t,s)});a[n.instanceId]=n}}}return{defs:s,instances:a}}function je(e,t,n,r,i){let o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map(X)),o}function ze(e,t,n,r){let i={defs:{},instances:{}},o=rt(n);for(let s of e){let e=tt(s,t,n,r,o);e&&Le(e,i)}return i}function Le(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Fe(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=Qe(e,e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r});return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function Ve(){return{defs:{},instances:{}}}function We(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function Qe(e,t){let n=B(e.defs,t),r=B(e.instances,e=>n[e.defId]);return{defs:n,instances:r}}function Ge(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const Ze={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:He,overlap:He,allow:He,className:Ge,classNames:Ge,color:String,backgroundColor:String,borderColor:String,textColor:String},Ye={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function qe(e,t){let n=function(e,t){return Array.isArray(e)?ze(e,null,t,!0):"object"==typeof e&&e?ze([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function Je(e){return e.reduce($e,Ye)}function $e(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const Xe={id:String,groupId:String,title:String,url:String,interactive:Boolean},Ke={start:He,end:He,date:He,allDay:Boolean},et=Object.assign(Object.assign(Object.assign({},Xe),Ke),{extendedProps:He});function tt(e,t,n,r,i=rt(n)){let{refined:o,extra:s}=nt(e,n,i),a=function(e,t){let n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),l=function(e,t,n,r){for(let i=0;i<r.length;i+=1){let o=r[i].parse(e,n);if(o){let{allDay:n}=e;return null==n&&(n=t,null==n&&(n=o.allDayGuess,null==n&&(n=!1))),{allDay:n,duration:o.duration,typeData:o.typeData,typeId:i}}}return null}(o,a,n.dateEnv,n.pluginHooks.recurringTypes);if(l){let e=it(o,s,t?t.sourceId:"",l.allDay,Boolean(l.duration),n);return e.recurringDef={typeId:l.typeId,typeData:l.typeData,duration:l.duration},{def:e,instance:null}}let c=function(e,t,n,r){let i,o,{allDay:s}=e,a=null,l=!1,c=null,u=null!=e.start?e.start:e.date;if(i=n.dateEnv.createMarkerMeta(u),i)a=i.marker;else if(!r)return null;null!=e.end&&(o=n.dateEnv.createMarkerMeta(e.end));null==s&&(s=null!=t?t:(!i||i.isTimeUnspecified)&&(!o||o.isTimeUnspecified));s&&a&&(a=X(a));o&&(c=o.marker,s&&(c=X(c)),a&&c<=a&&(c=null));c?l=!0:r||(l=n.options.forceEventDuration||!1,c=n.dateEnv.add(a,s?n.options.defaultAllDayEventDuration:n.options.defaultTimedEventDuration));return{allDay:s,hasEnd:l,range:{start:a,end:c},forcedStartTzo:i?i.forcedTzo:null,forcedEndTzo:o?o.forcedTzo:null}}(o,a,n,r);if(c){let e=it(o,s,t?t.sourceId:"",c.allDay,c.hasEnd,n);return{def:e,instance:Pe(e.defId,c.range,c.forcedStartTzo,c.forcedEndTzo)}}return null}function nt(e,t,n=rt(t)){return Be(e,n)}function rt(e){return Object.assign(Object.assign(Object.assign({},Ze),et),e.pluginHooks.eventRefiners)}function it(e,t,n,r,i,o){let s={title:e.title||"",groupId:e.groupId||"",publicId:e.id||"",url:e.url||"",recurringDef:null,defId:v(),sourceId:n,allDay:r,hasEnd:i,interactive:e.interactive,ui:qe(e,o),extendedProps:Object.assign(Object.assign({},e.extendedProps||{}),t)};for(let t of o.pluginHooks.eventDefMemberAdders)Object.assign(s,t(e));return Object.freeze(s.ui.classNames),Object.freeze(s.extendedProps),s}const ot={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function st(e,t){return ze(function(e){let t;t=!0===e?[{}]:Array.isArray(e)?e.filter(e=>e.daysOfWeek):"object"==typeof e&&e?[e]:[];return t=t.map(e=>Object.assign(Object.assign({},ot),e)),t}(e),null,t)}function at(e){let t=Math.floor(Y(e.start,e.end))||1,n=X(e.start);return{start:n,end:G(n,t)}}function lt(e,t=k(0)){let n=null,r=null;if(e.end){r=X(e.end);let n=e.end.valueOf()-r.valueOf();n&&n>=O(t)&&(r=G(r,1))}return e.start&&(n=X(e.start),r&&r<=n&&(r=G(n,1))),{start:n,end:r}}function ct(e,t,n,r){return"year"===r?k(n.diffWholeYears(e,t),"year"):"month"===r?k(n.diffWholeMonths(e,t),"month"):q(e,t)}function ut(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}let dt;function ft(){return null==dt&&(dt=function(){if("undefined"==typeof document)return!0;let e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.innerHTML="<table><tr><td><div></div></td></tr></table>",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),dt}const ht={defs:{},instances:{}};function pt(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":Je(r)};return n&&Object.assign(i,n),i}function gt(e,t){let n,r,i=[],{start:o}=t;for(e.sort(mt),n=0;n<e.length;n+=1)r=e[n],r.start>o&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return o<t.end&&i.push({start:o,end:t.end}),i}function mt(e,t){return e.start.valueOf()-t.start.valueOf()}function vt(e,t){let{start:n,end:r}=e,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function At(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function bt(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function yt(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function _t(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function Et(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!_t(r.activeRange,e)),isOther:Boolean(r&&!_t(r.currentRange,e)),isToday:Boolean(t&&_t(t,e)),isPast:Boolean(n?e<n:!!t&&e<t.start),isFuture:Boolean(n?e>n:!!t&&e>=t.end)}}function Dt(e,t){let n=["fc-day","fc-day-"+Q[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}const Ct=Se({year:"numeric",month:"long",day:"numeric"}),wt=Se({week:"long"});function St(e,t,n="day",r=!0){const{dateEnv:i,options:o,calendarApi:s}=e;let a=i.format(t,"week"===n?wt:Ct);if(o.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?o.navLinkDayClick:"week"===n?o.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return Object.assign({title:D(o.navLinkHint,[a,e],a),"data-navlink":""},r?p(l):{onClick:l})}return{"aria-label":a}}let Tt,kt=null;function Rt(){return null===kt&&(kt=function(){let e=document.createElement("div");s(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="<div></div>",document.body.appendChild(e);let n=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return t(e),n}()),kt}function xt(){return Tt||(Tt=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=Ot(e);return document.body.removeChild(e),t}()),Tt}function Ot(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function It(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,s=parseInt(n.borderBottomWidth,10)||0,a=Ot(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:o,borderBottom:s,scrollbarBottom:a.x-o-s,scrollbarLeft:0,scrollbarRight:0};return Rt()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function Mt(e){let t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function Nt(e){let t=[];for(;e instanceof HTMLElement;){let n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function Bt(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},o=function(e){r||(r=!0,n(e))},s=e(i,o);s&&"function"==typeof s.then&&s.then(i,o)}class Ht{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter(e=>e!==n)):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}function Pt(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;r<n;r++)if(Math.round(e[r])!==Math.round(t[r]))return!1;return!0}class Ut{getMaxScrollTop(){return this.getScrollHeight()-this.getClientHeight()}getMaxScrollLeft(){return this.getScrollWidth()-this.getClientWidth()}canScrollVertically(){return this.getMaxScrollTop()>0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()<this.getMaxScrollTop()}canScrollLeft(){return this.getScrollLeft()>0}canScrollRight(){return this.getScrollLeft()<this.getMaxScrollLeft()}}class jt{constructor(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}setIconOverride(e){let t,n;if("object"==typeof e&&e){for(n in t=Object.assign({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})}applyIconOverridePrefix(e){let t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e}getClass(e){return this.classes[e]||""}getIconClass(e,t){let n;return n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e],n?`${this.baseIconClass} ${n}`:""}getCustomButtonIconClass(e){let t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption],t)?`${this.baseIconClass} ${this.applyIconOverridePrefix(t)}`:""}}jt.prototype.classes={},jt.prototype.iconClasses={},jt.prototype.baseIconClass="",jt.prototype.iconOverridePrefix="";var zt,Lt,Ft,Vt,Wt,Qt,Gt,Zt={},Yt=[],qt=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function Jt(e,t){for(var n in t)e[n]=t[n];return e}function $t(e){var t=e.parentNode;t&&t.removeChild(e)}function Xt(e,t,n){var r,i,o,s={};for(o in t)"key"==o?r=t[o]:"ref"==o?i=t[o]:s[o]=t[o];if(arguments.length>2&&(s.children=arguments.length>3?zt.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===s[o]&&(s[o]=e.defaultProps[o]);return Kt(e,s,r,i,null)}function Kt(e,t,n,r,i){var o={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==i?++Ft:i};return null==i&&null!=Lt.vnode&&Lt.vnode(o),o}function en(){return{current:null}}function tn(e){return e.children}function nn(e,t){this.props=e,this.context=t}function rn(e,t){if(null==t)return e.__?rn(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return"function"==typeof e.type?rn(e):null}function on(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return on(e)}}function sn(e){(!e.__d&&(e.__d=!0)&&Wt.push(e)&&!an.__r++||Qt!==Lt.debounceRendering)&&((Qt=Lt.debounceRendering)||setTimeout)(an)}function an(){for(var e;an.__r=Wt.length;)e=Wt.sort((function(e,t){return e.__v.__b-t.__v.__b})),Wt=[],e.some((function(e){var t,n,r,i,o,s;e.__d&&(o=(i=(t=e).__v).__e,(s=t.__P)&&(n=[],(r=Jt({},i)).__v=i.__v+1,mn(s,i,r,t.__n,void 0!==s.ownerSVGElement,null!=i.__h?[o]:null,n,null==o?rn(i):o,i.__h),vn(n,i),i.__e!=o&&on(i)))}))}function ln(e,t,n,r,i,o,s,a,l,c){var u,d,f,h,p,g,m,v=r&&r.__k||Yt,A=v.length;for(n.__k=[],u=0;u<t.length;u++)if(null!=(h=n.__k[u]=null==(h=t[u])||"boolean"==typeof h?null:"string"==typeof h||"number"==typeof h||"bigint"==typeof h?Kt(null,h,null,null,h):Array.isArray(h)?Kt(tn,{children:h},null,null,null):h.__b>0?Kt(h.type,h.props,h.key,h.ref?h.ref:null,h.__v):h)){if(h.__=n,h.__b=n.__b+1,null===(f=v[u])||f&&h.key==f.key&&h.type===f.type)v[u]=void 0;else for(d=0;d<A;d++){if((f=v[d])&&h.key==f.key&&h.type===f.type){v[d]=void 0;break}f=null}mn(e,h,f=f||Zt,i,o,s,a,l,c),p=h.__e,(d=h.ref)&&f.ref!=d&&(m||(m=[]),f.ref&&m.push(f.ref,null,h),m.push(d,h.__c||p,h)),null!=p?(null==g&&(g=p),"function"==typeof h.type&&h.__k===f.__k?h.__d=l=cn(h,l,e):l=dn(e,h,f,v,p,l),"function"==typeof n.type&&(n.__d=l)):l&&f.__e==l&&l.parentNode!=e&&(l=rn(f))}for(n.__e=g,u=A;u--;)null!=v[u]&&yn(v[u],v[u]);if(m)for(u=0;u<m.length;u++)bn(m[u],m[++u],m[++u])}function cn(e,t,n){for(var r,i=e.__k,o=0;i&&o<i.length;o++)(r=i[o])&&(r.__=e,t="function"==typeof r.type?cn(r,t,n):dn(n,r,r,i,r.__e,t));return t}function un(e,t){return t=t||[],null==e||"boolean"==typeof e||(Array.isArray(e)?e.some((function(e){un(e,t)})):t.push(e)),t}function dn(e,t,n,r,i,o){var s,a,l;if(void 0!==t.__d)s=t.__d,t.__d=void 0;else if(null==n||i!=o||null==i.parentNode)e:if(null==o||o.parentNode!==e)e.appendChild(i),s=null;else{for(a=o,l=0;(a=a.nextSibling)&&l<r.length;l+=1)if(a==i)break e;e.insertBefore(i,o),s=o}return void 0!==s?s:i.nextSibling}function fn(e,t,n){"-"===t[0]?e.setProperty(t,n):e[t]=null==n?"":"number"!=typeof n||qt.test(t)?n:n+"px"}function hn(e,t,n,r,i){var o;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||fn(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||fn(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])o=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+o]=n,n?r||e.addEventListener(t,o?gn:pn,o):e.removeEventListener(t,o?gn:pn,o);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function pn(e){this.l[e.type+!1](Lt.event?Lt.event(e):e)}function gn(e){this.l[e.type+!0](Lt.event?Lt.event(e):e)}function mn(e,t,n,r,i,o,s,a,l){var c,u,d,f,h,p,g,m,v,A,b,y,_,E,D,C=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,a=t.__e=n.__e,t.__h=null,o=[a]),(c=Lt.__b)&&c(t);try{e:if("function"==typeof C){if(m=t.props,v=(c=C.contextType)&&r[c.__c],A=c?v?v.props.value:c.__:r,n.__c?g=(u=t.__c=n.__c).__=u.__E:("prototype"in C&&C.prototype.render?t.__c=u=new C(m,A):(t.__c=u=new nn(m,A),u.constructor=C,u.render=_n),v&&v.sub(u),u.props=m,u.state||(u.state={}),u.context=A,u.__n=r,d=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=C.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=Jt({},u.__s)),Jt(u.__s,C.getDerivedStateFromProps(m,u.__s))),f=u.props,h=u.state,d)null==C.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==C.getDerivedStateFromProps&&m!==f&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(m,A),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(m,u.__s,A)||t.__v===n.__v){for(u.props=m,u.state=u.__s,t.__v!==n.__v&&(u.__d=!1),u.__v=t,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),b=0;b<u._sb.length;b++)u.__h.push(u._sb[b]);u._sb=[],u.__h.length&&s.push(u);break e}null!=u.componentWillUpdate&&u.componentWillUpdate(m,u.__s,A),null!=u.componentDidUpdate&&u.__h.push((function(){u.componentDidUpdate(f,h,p)}))}if(u.context=A,u.props=m,u.__v=t,u.__P=e,y=Lt.__r,_=0,"prototype"in C&&C.prototype.render){for(u.state=u.__s,u.__d=!1,y&&y(t),c=u.render(u.props,u.state,u.context),E=0;E<u._sb.length;E++)u.__h.push(u._sb[E]);u._sb=[]}else do{u.__d=!1,y&&y(t),c=u.render(u.props,u.state,u.context),u.state=u.__s}while(u.__d&&++_<25);u.state=u.__s,null!=u.getChildContext&&(r=Jt(Jt({},r),u.getChildContext())),d||null==u.getSnapshotBeforeUpdate||(p=u.getSnapshotBeforeUpdate(f,h)),D=null!=c&&c.type===tn&&null==c.key?c.props.children:c,ln(e,Array.isArray(D)?D:[D],t,n,r,i,o,s,a,l),u.base=t.__e,t.__h=null,u.__h.length&&s.push(u),g&&(u.__E=u.__=null),u.__e=!1}else null==o&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=An(n.__e,t,n,r,i,o,s,l);(c=Lt.diffed)&&c(t)}catch(e){t.__v=null,(l||null!=o)&&(t.__e=a,t.__h=!!l,o[o.indexOf(a)]=null),Lt.__e(e,t,n)}}function vn(e,t){Lt.__c&&Lt.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){Lt.__e(e,t.__v)}}))}function An(e,t,n,r,i,o,s,a){var l,c,u,d=n.props,f=t.props,h=t.type,p=0;if("svg"===h&&(i=!0),null!=o)for(;p<o.length;p++)if((l=o[p])&&"setAttribute"in l==!!h&&(h?l.localName===h:3===l.nodeType)){e=l,o[p]=null;break}if(null==e){if(null===h)return document.createTextNode(f);e=i?document.createElementNS("http://www.w3.org/2000/svg",h):document.createElement(h,f.is&&f),o=null,a=!1}if(null===h)d===f||a&&e.data===f||(e.data=f);else{if(o=o&&zt.call(e.childNodes),c=(d=n.props||Zt).dangerouslySetInnerHTML,u=f.dangerouslySetInnerHTML,!a){if(null!=o)for(d={},p=0;p<e.attributes.length;p++)d[e.attributes[p].name]=e.attributes[p].value;(u||c)&&(u&&(c&&u.__html==c.__html||u.__html===e.innerHTML)||(e.innerHTML=u&&u.__html||""))}if(function(e,t,n,r,i){var o;for(o in n)"children"===o||"key"===o||o in t||hn(e,o,null,n[o],r);for(o in t)i&&"function"!=typeof t[o]||"children"===o||"key"===o||"value"===o||"checked"===o||n[o]===t[o]||hn(e,o,t[o],n[o],r)}(e,f,d,i,a),u)t.__k=[];else if(p=t.props.children,ln(e,Array.isArray(p)?p:[p],t,n,r,i&&"foreignObject"!==h,o,s,o?o[0]:n.__k&&rn(n,0),a),null!=o)for(p=o.length;p--;)null!=o[p]&&$t(o[p]);a||("value"in f&&void 0!==(p=f.value)&&(p!==e.value||"progress"===h&&!p||"option"===h&&p!==d.value)&&hn(e,"value",p,d.value,!1),"checked"in f&&void 0!==(p=f.checked)&&p!==e.checked&&hn(e,"checked",p,d.checked,!1))}return e}function bn(e,t,n){try{"function"==typeof e?e(t):e.current=t}catch(e){Lt.__e(e,n)}}function yn(e,t,n){var r,i;if(Lt.unmount&&Lt.unmount(e),(r=e.ref)&&(r.current&&r.current!==e.__e||bn(r,null,t)),null!=(r=e.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(e){Lt.__e(e,t)}r.base=r.__P=null,e.__c=void 0}if(r=e.__k)for(i=0;i<r.length;i++)r[i]&&yn(r[i],t,n||"function"!=typeof e.type);n||null==e.__e||$t(e.__e),e.__=e.__e=e.__d=void 0}function _n(e,t,n){return this.constructor(e,n)}function En(e,t,n){var r,i,o;Lt.__&&Lt.__(e,t),i=(r="function"==typeof n)?null:n&&n.__k||t.__k,o=[],mn(t,e=(!r&&n||t).__k=Xt(tn,null,[e]),i||Zt,Zt,void 0!==t.ownerSVGElement,!r&&n?[n]:i?null:t.firstChild?zt.call(t.childNodes):null,o,!r&&n?n:i?i.__e:t.firstChild,r),vn(o,e)}zt=Yt.slice,Lt={__e:function(e,t,n,r){for(var i,o,s;t=t.__;)if((i=t.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(e)),s=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),s=i.__d),s)return i.__E=i}catch(t){e=t}throw e}},Ft=0,Vt=function(e){return null!=e&&void 0===e.constructor},nn.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=Jt({},this.state),"function"==typeof e&&(e=e(Jt({},n),this.props)),e&&Jt(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),sn(this))},nn.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),sn(this))},nn.prototype.render=tn,Wt=[],an.__r=0,Gt=0;var Dn,Cn,wn,Sn=[],Tn=[],kn=Lt.__b,Rn=Lt.__r,xn=Lt.diffed,On=Lt.__c,In=Lt.unmount;function Mn(){for(var e;e=Sn.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(Hn),e.__H.__h.forEach(Pn),e.__H.__h=[]}catch(t){e.__H.__h=[],Lt.__e(t,e.__v)}}Lt.__b=function(e){Dn=null,kn&&kn(e)},Lt.__r=function(e){Rn&&Rn(e);var t=(Dn=e.__c).__H;t&&(Cn===Dn?(t.__h=[],Dn.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=Tn,e.__N=e.i=void 0}))):(t.__h.forEach(Hn),t.__h.forEach(Pn),t.__h=[])),Cn=Dn},Lt.diffed=function(e){xn&&xn(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==Sn.push(t)&&wn===Lt.requestAnimationFrame||((wn=Lt.requestAnimationFrame)||Bn)(Mn)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==Tn&&(e.__=e.__V),e.i=void 0,e.__V=Tn}))),Cn=Dn=null},Lt.__c=function(e,t){t.some((function(e){try{e.__h.forEach(Hn),e.__h=e.__h.filter((function(e){return!e.__||Pn(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],Lt.__e(n,e.__v)}})),On&&On(e,t)},Lt.unmount=function(e){In&&In(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{Hn(e)}catch(e){t=e}})),n.__H=void 0,t&&Lt.__e(t,n.__v))};var Nn="function"==typeof requestAnimationFrame;function Bn(e){var t,n=function(){clearTimeout(r),Nn&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);Nn&&(t=requestAnimationFrame(n))}function Hn(e){var t=Dn,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),Dn=t}function Pn(e){var t=Dn;e.__c=e.__(),Dn=t}function Un(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function jn(e){this.props=e}(jn.prototype=new nn).isPureReactComponent=!0,jn.prototype.shouldComponentUpdate=function(e,t){return Un(this.props,e)||Un(this.state,t)};var zn=Lt.__b;Lt.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),zn&&zn(e)};var Ln=Lt.__e;Lt.__e=function(e,t,n,r){if(e.then)for(var i,o=t;o=o.__;)if((i=o.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);Ln(e,t,n,r)};var Fn=Lt.unmount;function Vn(){this.__u=0,this.t=null,this.__b=null}function Wn(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function Qn(){this.u=null,this.o=null}Lt.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Fn&&Fn(e)},(Vn.prototype=new nn).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=Wn(r.__v),o=!1,s=function(){o||(o=!0,n.__R=null,i?i(a):a())};n.__R=s;var a=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=function e(t,n,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)})),t.__c&&t.__c.__P===n&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(s,s)},Vn.prototype.componentWillUnmount=function(){this.t=[]},Vn.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,n,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=function(e,t){for(var n in t)e[n]=t[n];return e}({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=n),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,n,r)}))),t}(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&Xt(tn,null,e.fallback);return i&&(i.__h=null),[Xt(tn,null,t.__a?null:e.children),i]};var Gn=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.u=n=n[2]}};function Zn(e){return this.getChildContext=function(){return e.context},e.children}function Yn(e){var t=this,n=e.i;t.componentWillUnmount=function(){En(null,t.l),t.l=null,t.i=null},t.i&&t.i!==n&&t.componentWillUnmount(),e.__v?(t.l||(t.i=n,t.l={nodeType:1,parentNode:n,childNodes:[],appendChild:function(e){this.childNodes.push(e),t.i.appendChild(e)},insertBefore:function(e,n){this.childNodes.push(e),t.i.appendChild(e)},removeChild:function(e){this.childNodes.splice(this.childNodes.indexOf(e)>>>1,1),t.i.removeChild(e)}}),En(Xt(Zn,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function qn(e,t){var n=Xt(Yn,{__v:e,i:t});return n.containerInfo=t,n}(Qn.prototype=new nn).__a=function(e){var t=this,n=Wn(t.__v),r=t.o.get(e);return r[0]++,function(i){var o=function(){t.props.revealOrder?(r.push(i),Gn(t,e,r)):i()};n?n(o):o()}},Qn.prototype.render=function(e){this.u=null,this.o=new Map;var t=un(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},Qn.prototype.componentDidUpdate=Qn.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){Gn(e,n,t)}))};var Jn="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,$n=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Xn="undefined"!=typeof document,Kn=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};nn.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(nn.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var er=Lt.event;function tr(){}function nr(){return this.cancelBubble}function rr(){return this.defaultPrevented}Lt.event=function(e){return er&&(e=er(e)),e.persist=tr,e.isPropagationStopped=nr,e.isDefaultPrevented=rr,e.nativeEvent=e};var ir={configurable:!0,get:function(){return this.class}},or=Lt.vnode;Lt.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var o in r={},n){var s=n[o];Xn&&"children"===o&&"noscript"===t||"value"===o&&"defaultValue"in n&&null==s||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===s?s="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!Kn(n.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(o)?o=o.toLowerCase():i&&$n.test(o)?o=o.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===s&&(s=void 0),/^oninput$/i.test(o)&&(o=o.toLowerCase(),r[o]&&(o="oninputCapture")),r[o]=s)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=un(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=un(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(ir.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",ir))}e.$$typeof=Jn,or&&or(e)};var sr=Lt.__r;function ar(e){e();let t=Lt.debounceRendering,n=[];for(Lt.debounceRendering=function(e){n.push(e)},En(Xt(lr,{}),document.createElement("div"));n.length;)n.shift()();Lt.debounceRendering=t}Lt.__r=function(e){sr&&sr(e),e.__c};class lr extends nn{render(){return Xt("div",{})}componentDidMount(){this.setState({})}}function cr(e){let t=function(e,t){var n={__c:t="__cC"+Gt++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(sn)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){let e=!this.getChildContext,t=n.apply(this,arguments);if(e){let e=[];this.shouldComponentUpdate=t=>{this.props.value!==t.value&&e.forEach(e=>{e.context=t.value,e.forceUpdate()})},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}var ur={__proto__:null,flushSync:ar,createContext:cr,createPortal:qn,Component:nn,Fragment:tn,cloneElement:function(e,t,n){var r,i,o,s=Jt({},e.props);for(o in t)"key"==o?r=t[o]:"ref"==o?i=t[o]:s[o]=t[o];return arguments.length>2&&(s.children=arguments.length>3?zt.call(arguments,2):n),Kt(e.type,s,r||e.key,i||e.ref,null)},createElement:Xt,createRef:en,h:Xt,hydrate:function e(t,n){En(t,n,e)},get isValidElement(){return Vt},get options(){return Lt},render:En,toChildArray:un};class dr{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const fr=cr({});function hr(e,t,n,r,i,o,s,a,l,c,u,d,f){return{dateEnv:i,options:n,pluginHooks:s,emitter:c,dispatch:a,getCurrentData:l,calendarApi:u,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:o,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new dr(e,c,k(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:d,unregisterInteractiveComponent:f}}class pr extends nn{shouldComponentUpdate(e,t){return this.debug&&console.log(L(e,this.props),L(t,this.state)),!F(this.props,e,this.propEquality)||!F(this.state,t,this.stateEquality)}safeSetState(e){F(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}pr.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},pr.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},pr.contextType=fr,pr.prototype.propEquality={},pr.prototype.stateEquality={};class gr extends pr{}function mr(e,t){"function"==typeof e?e(t):e&&(e.current=t)}gr.contextType=fr;class vr extends gr{constructor(){super(...arguments),this.uid=v()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!n(e,".fc-event-mirror")}isValidDateDownEl(e){return!(n(e,".fc-event:not(.fc-bg-event)")||n(e,".fc-more-link")||n(e,"a[data-navlink]")||n(e,".fc-popover"))}}function Ar(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}class br{constructor(e){this.props=e,this.nowDate=Ar(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,o,s,a,l,{props:c}=this;var u,d;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(u=e,e=null!=(d=r).start&&u<d.start?d.start:null!=d.end&&u>=d.end?new Date(d.end.valueOf()-1):u),i=this.buildCurrentRangeInfo(e,t),o=/^(year|month|week|day)$/.test(i.unit),s=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,o),s=this.trimHiddenDays(s),a=s,c.showNonCurrentDates||(a=vt(a,i.range)),a=this.adjustActiveRange(a),a=vt(a,r),l=bt(i.range,r),{validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:o,activeRange:a,renderRange:s,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,o=null,s=null;return r.duration?(i=r.duration,o=r.durationUnit,s=this.buildRangeFromDuration(e,t,i,o)):(n=this.props.dayCount)?(o="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?o=r.dateEnv.greatestWholeUnit(s.start,s.end).unit:(i=this.getFallbackDuration(),o=I(i).unit,s=this.buildRangeFromDuration(e,t,i,o)),{duration:i,unit:o,range:s}}getFallbackDuration(){return k({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:o,end:s}=e;return n&&(x(r)<0&&(o=X(o),o=t.add(o,r)),x(i)>1&&(s=X(s),s=G(s,-1),s=t.add(s,i))),{start:o,end:s}}buildRangeFromDuration(e,t,n,r){let i,o,s,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&O(e)<O(n)?I(e).unit:r}function c(){i=a.startOf(e,l),o=a.add(i,n),s={start:i,end:o}}return x(n)<=1&&this.isHiddenDay(i)&&(i=this.skipHiddenDays(i,t),i=X(i)),c(),this.trimHiddenDays(s)||(e=this.skipHiddenDays(e,t),c()),s}buildRangeFromDayCount(e,t,n){let r,{dateEnv:i,dateAlignment:o}=this.props,s=0,a=e;o&&(a=i.startOf(a,o)),a=X(a),a=this.skipHiddenDays(a,t),r=a;do{r=G(r,1),this.isHiddenDay(r)||(s+=1)}while(s<n);return{start:a,end:r}}buildCustomVisibleRange(e){let{props:t}=this,n=t.visibleRangeInput,r="function"==typeof n?n.call(t.calendarApi,t.dateEnv.toDate(e)):n,i=this.refineRange(r);return!i||null!=i.start&&null!=i.end?i:null}buildRenderRange(e,t,n){return e}buildDateIncrement(e){let t,{dateIncrement:n}=this.props;return n||((t=this.props.dateAlignment)?k(1,t):e||k({days:1}))}refineRange(e){if(e){let t=function(e,t){let n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}(e,this.props.dateEnv);return t&&(t=lt(t)),t}return null}initHiddenDays(){let e,t=this.props.hiddenDays||[],n=[],r=0;for(!1===this.props.weekends&&t.push(0,6),e=0;e<7;e+=1)(n[e]=-1!==t.indexOf(e))||(r+=1);if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n}trimHiddenDays(e){let{start:t,end:n}=e;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null}isHiddenDay(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]}skipHiddenDays(e,t=1,n=!1){for(;this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=G(e,t);return e}}function yr(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},_r(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function _r(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},Qr(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function Er(e,t,n){let{dateEnv:r,options:i}=n,o=t;return e?(o=X(o),o=r.add(o,i.defaultAllDayEventDuration)):o=r.add(o,i.defaultTimedEventDuration),o}function Dr(e,t,n,r){let i=Mr(e.defs,t),o={defs:{},instances:{}};for(let t in e.defs){let s=e.defs[t];o.defs[t]=Cr(s,i[t],n,r)}for(let t in e.instances){let s=e.instances[t],a=o.defs[s.defId];o.instances[t]=wr(s,a,i[s.defId],n,r)}return o}function Cr(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let o=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(o.extendedProps=Object.assign(Object.assign({},o.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(o,n,r);return!o.hasEnd&&r.options.forceEventDuration&&(o.hasEnd=!0),o}function wr(e,t,n,r,i){let{dateEnv:o}=i,s=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return s&&(l.range=at(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:o.add(l.range.start,r.datesDelta),end:o.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:o.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:o.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:Er(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:X(l.range.start),end:X(l.range.end)}),l.range.end<l.range.start&&(l.range.end=Er(t.allDay,l.range.start,i)),l}class Sr{constructor(e,t){this.context=e,this.internalEventSource=t}remove(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})}refetch(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})}get id(){return this.internalEventSource.publicId}get url(){return this.internalEventSource.meta.url}get format(){return this.internalEventSource.meta.format}}class Tr{constructor(e,t,n){this._context=e,this._def=t,this._instance=n||null}setProp(e,t){if(e in Ke)console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");else if("id"===e)t=Xe[e](t),this.mutate({standardProps:{publicId:t}});else if(e in Xe)t=Xe[e](t),this.mutate({standardProps:{[e]:t}});else if(e in Ze){let n=Ze[e](t);n="color"===e?{backgroundColor:t,borderColor:t}:"editable"===e?{startEditable:t,durationEditable:t}:{[e]:t},this.mutate({standardProps:{ui:n}})}else console.warn(`Could not set prop '${e}'. Use setExtendedProp instead.`)}setExtendedProp(e,t){this.mutate({extendedProps:{[e]:t}})}setStart(e,t={}){let{dateEnv:n}=this._context,r=n.createMarker(e);if(r&&this._instance){let e=ct(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:e}):this.mutate({startDelta:e})}}setEnd(e,t={}){let n,{dateEnv:r}=this._context;if((null==e||(n=r.createMarker(e),n))&&this._instance)if(n){let e=ct(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:e})}else this.mutate({standardProps:{hasEnd:!1}})}setDates(e,t,n={}){let r,{dateEnv:i}=this._context,o={allDay:n.allDay},s=i.createMarker(e);var a,l;if(s&&((null==t||(r=i.createMarker(t),r))&&this._instance)){let e=this._instance.range;!0===n.allDay&&(e=at(e));let t=ct(e.start,s,i,n.granularity);if(r){let s=ct(e.end,r,i,n.granularity);l=s,(a=t).years===l.years&&a.months===l.months&&a.days===l.days&&a.milliseconds===l.milliseconds?this.mutate({datesDelta:t,standardProps:o}):this.mutate({startDelta:t,endDelta:s,standardProps:o})}else o.hasEnd=!1,this.mutate({datesDelta:t,standardProps:o})}}moveStart(e){let t=k(e);t&&this.mutate({startDelta:t})}moveEnd(e){let t=k(e);t&&this.mutate({endDelta:t})}moveDates(e){let t=k(e);t&&this.mutate({datesDelta:t})}setAllDay(e,t={}){let n={allDay:e},{maintainDuration:r}=t;null==r&&(r=this._context.options.allDayMaintainDuration),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})}formatRange(e){let{dateEnv:t}=this._context,n=this._instance,r=Se(e);return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})}mutate(e){let t=this._instance;if(t){let n=this._def,r=this._context,{eventStore:i}=r.getCurrentData(),o=Fe(i,t.instanceId);o=Dr(o,{"":{display:"",startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}},e,r);let s=new Tr(r,n,t);this._def=o.defs[n.defId],this._instance=o.instances[t.instanceId],r.dispatch({type:"MERGE_EVENTS",eventStore:o}),r.emitter.trigger("eventChange",{oldEvent:s,event:this,relatedEvents:Rr(o,r,t),revert(){r.dispatch({type:"RESET_EVENTS",eventStore:i})}})}}remove(){let e=this._context,t=kr(this);e.dispatch({type:"REMOVE_EVENTS",eventStore:t}),e.emitter.trigger("eventRemove",{event:this,relatedEvents:[],revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:t})}})}get source(){let{sourceId:e}=this._def;return e?new Sr(this._context,this._context.getCurrentData().eventSources[e]):null}get start(){return this._instance?this._context.dateEnv.toDate(this._instance.range.start):null}get end(){return this._instance&&this._def.hasEnd?this._context.dateEnv.toDate(this._instance.range.end):null}get startStr(){let e=this._instance;return e?this._context.dateEnv.formatIso(e.range.start,{omitTime:this._def.allDay,forcedTzo:e.forcedStartTzo}):""}get endStr(){let e=this._instance;return e&&this._def.hasEnd?this._context.dateEnv.formatIso(e.range.end,{omitTime:this._def.allDay,forcedTzo:e.forcedEndTzo}):""}get id(){return this._def.publicId}get groupId(){return this._def.groupId}get allDay(){return this._def.allDay}get title(){return this._def.title}get url(){return this._def.url}get display(){return this._def.ui.display||"auto"}get startEditable(){return this._def.ui.startEditable}get durationEditable(){return this._def.ui.durationEditable}get constraint(){return this._def.ui.constraints[0]||null}get overlap(){return this._def.ui.overlap}get allow(){return this._def.ui.allows[0]||null}get backgroundColor(){return this._def.ui.backgroundColor}get borderColor(){return this._def.ui.borderColor}get textColor(){return this._def.ui.textColor}get classNames(){return this._def.ui.classNames}get extendedProps(){return this._def.extendedProps}toPlainObject(e={}){let t=this._def,{ui:n}=t,{startStr:r,endStr:i}=this,o={};return t.title&&(o.title=t.title),r&&(o.start=r),i&&(o.end=i),t.publicId&&(o.id=t.publicId),t.groupId&&(o.groupId=t.groupId),t.url&&(o.url=t.url),n.display&&"auto"!==n.display&&(o.display=n.display),e.collapseColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?o.color=n.backgroundColor:(n.backgroundColor&&(o.backgroundColor=n.backgroundColor),n.borderColor&&(o.borderColor=n.borderColor)),n.textColor&&(o.textColor=n.textColor),n.classNames.length&&(o.classNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?Object.assign(o,t.extendedProps):o.extendedProps=t.extendedProps),o}toJSON(){return this.toPlainObject()}}function kr(e){let t=e._def,n=e._instance;return{defs:{[t.defId]:t},instances:n?{[n.instanceId]:n}:{}}}function Rr(e,t,n){let{defs:r,instances:i}=e,o=[],s=n?n.instanceId:"";for(let e in i){let n=i[e],a=r[n.defId];n.instanceId!==s&&o.push(new Tr(t,a,n))}return o}function xr(e,t,n,r){let i={},o={},s={},a=[],l=[],c=Mr(e.defs,t);for(let t in e.defs){let n=e.defs[t];"inverse-background"===c[n.defId].display&&(n.groupId?(i[n.groupId]=[],s[n.groupId]||(s[n.groupId]=n)):o[t]=[])}for(let t in e.instances){let s=e.instances[t],u=e.defs[s.defId],d=c[u.defId],f=s.range,h=!u.allDay&&r?lt(f,r):f,p=vt(h,n);p&&("inverse-background"===d.display?u.groupId?i[u.groupId].push(p):o[s.defId].push(p):"none"!==d.display&&("background"===d.display?a:l).push({def:u,ui:d,instance:s,range:p,isStart:h.start&&h.start.valueOf()===p.start.valueOf(),isEnd:h.end&&h.end.valueOf()===p.end.valueOf()}))}for(let e in i){let t=gt(i[e],n);for(let n of t){let t=s[e],r=c[t.defId];a.push({def:t,ui:r,instance:null,range:n,isStart:!1,isEnd:!1})}}for(let t in o){let r=gt(o[t],n);for(let n of r)a.push({def:e.defs[t],ui:c[t],instance:null,range:n,isStart:!1,isEnd:!1})}return{bg:a,fg:l}}function Or(e,t){e.fcSeg=t}function Ir(e){return e.fcSeg||e.parentNode.fcSeg||null}function Mr(e,t){return H(e,e=>Nr(e,t))}function Nr(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Je(n)}function Br(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,o=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:o,duration:o-i,allDay:Number(n.allDay),_seg:e})}function Hr(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:o}=e.eventRange,s=o.startEditable;for(let e of r)s=e(s,i,o,t);return s}function Pr(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function Ur(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function jr(e,t,n,r,i,o,s){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:u}=l,d=e.eventRange.def,f=e.eventRange.instance;null==c&&(c=!1!==r),null==u&&(u=!1!==i);let h=f.range.start,p=f.range.end,g=o||e.start||e.eventRange.range.start,m=s||e.end||e.eventRange.range.end,v=X(h).valueOf()===X(g).valueOf(),A=X(Z(p,-1)).valueOf()===X(Z(m,-1)).valueOf();return c&&!d.allDay&&(v||A)?(g=v?h:g,m=A?p:m,u&&d.hasEnd?a.formatRange(g,m,t,{forcedStartTzo:o?null:f.forcedStartTzo,forcedEndTzo:s?null:f.forcedEndTzo}):a.format(g,t,{forcedTzo:o?null:f.forcedStartTzo})):""}function zr(e){let t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function Lr(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:o,options:s}=t,{eventInteractive:a}=s;return null==a&&(a=n.interactive,null==a&&(a=Boolean(o.hasHandlers("eventClick")))),a?g(e=>{o.trigger("eventClick",{el:e.target,event:new Tr(t,n,r),jsEvent:e,view:t.viewApi})}):{}}const Fr={start:He,end:He,allDay:Boolean};function Vr(e,t,n){let r=function(e,t){let{refined:n,extra:r}=Be(e,Fr),i=n.start?t.createMarkerMeta(n.start):null,o=n.end?t.createMarkerMeta(n.end):null,{allDay:s}=n;null==s&&(s=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified));return Object.assign({range:{start:i?i.marker:null,end:o?o.marker:null},allDay:s},r)}(e,t),{range:i}=r;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function Wr(e,t,n){return Object.assign(Object.assign({},Qr(e,t,n)),{timeZone:t.timeZone})}function Qr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}let Gr={};var Zr,Yr;Zr="gregory",Yr=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return ie(e)}markerToArray(e){return re(e)}},Gr[Zr]=Yr;const qr=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Jr(e){let t=qr.exec(e);if(t){let e=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(oe(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}class $r{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Gr[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):ie(te(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=ie(e)),null!==t&&oe(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Jr(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return se(e)===se(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return se(e)===se(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=J(e,t),null!==n?{unit:"week",value:n}:(n=$(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),C(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),C(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),C(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(x(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/function(e){return x(e)/30}(n):n.days&&(r=$(e,t),null!==r)?r/x(n):(t.valueOf()-e.valueOf())/O(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?X(e):"hour"===t?function(e){return ie([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return ie([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return ie([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=K(e,r,t,n);if(i<1)return K(e,r-1,t,n);let o=K(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=Z(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),ae(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?ie(te(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ie(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-ne(re(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(re(e)):null}toDate(e,t){return"local"===this.timeZone?ne(re(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(re(e))*60):new Date(e.valueOf()-(t||0))}}function Xr(e){return e.span.end}function Kr(e){return e.index+":"+e.span.start}function ei(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return n<r?{start:n,end:r}:null}function ti(e,t,n){e.splice(t,0,n)}function ni(e,t,n){let r=0,i=e.length;if(!i||t<n(e[r]))return[0,0];if(t>n(e[i-1]))return[i,0];for(;r<i;){let o=Math.floor(r+(i-r)/2),s=n(e[o]);if(t<s)i=o;else{if(!(t>s))return[o,1];r=o+1}}return[r,0]}class ri{constructor(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}destroy(){}}const ii={};const oi={startTime:k,duration:k,create:Boolean,sourceId:String};class si extends gr{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,o=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return ft()||o.push("fc-liquid-hack"),e.children(o,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}}function ai(e,t){return Se(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const li="fc-col-header-cell";function ci(e){return e.text}class ui extends gr{constructor(){super(...arguments),this.id=v(),this.currentDomNodes=[],this.queuedDomNodes=[],this.handleEl=e=>{this.props.elRef&&mr(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{generator:r,renderProps:i}=e,o=fi(e);let s,a=[];if(di(e.generatorName,n))n.customRenderingReplacesEl&&delete o.elRef;else{const e="function"==typeof r?r(i,Xt):r;"string"==typeof e||Vt(e)||Array.isArray(e)?s=e:"object"==typeof e&&("html"in e?o.dangerouslySetInnerHTML={__html:e.html}:"domNodes"in e&&(a=Array.prototype.slice.call(e.domNodes)))}return this.queuedDomNodes=a,Xt(e.elTag,o,s)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){const{props:t,context:n}=this,{handleCustomRendering:r,customRenderingMetaMap:i}=n.options;if(r){const n=null==i?void 0:i[t.generatorName];n&&r(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:n},t))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:n}=this,r=this.base;if(!ue(e,n)){n.forEach(t);for(let t of e)r.appendChild(t);this.currentDomNodes=e}}}function di(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function fi(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}ui.addPropsEquality({elClasses:ue,elStyle:j,elAttrs:function(e,t){const n=L(e,t);for(let e of n)if(!z.test(e))return!1;return!0},renderProps:j});const hi=cr(0);class pi extends nn{constructor(){super(...arguments),this.InnerContent=gi.bind(void 0,this)}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=fi(e,t),r=e.children(this.InnerContent,e.renderProps,n);return e.elTag?Xt(e.elTag,n,r):r}return Xt(ui,Object.assign(Object.assign({},e),{elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.base}))}}function gi(e,t){const n=e.props;return Xt(ui,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,generator:n.generator,renderId:e.context},t))}pi.contextType=hi;class mi extends gr{render(){let{dateEnv:e,options:t,theme:n,viewApi:r}=this.context,{props:i}=this,{date:o,dateProfile:s}=i,a=Et(o,i.todayRange,null,s),l=[li].concat(Dt(a,n)),c=e.format(o,i.dayHeaderFormat),u=!a.isDisabled&&i.colCnt>1?St(this.context,o):{},d=Object.assign(Object.assign(Object.assign({date:e.toDate(o),view:r},i.extraRenderProps),{text:c}),a);return Xt(pi,{elTag:"th",elClasses:l,elAttrs:Object.assign({role:"columnheader",colSpan:i.colSpan,"data-date":a.isDisabled?void 0:le(o)},i.extraDataAttrs),renderProps:d,generatorName:"dayHeaderContent",generator:t.dayHeaderContent||ci,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},e=>Xt("div",{className:"fc-scrollgrid-sync-inner"},!a.isDisabled&&Xt(e,{elTag:"a",elAttrs:u,elClasses:["fc-col-header-cell-cushion",i.isSticky&&"fc-sticky"]})))}}const vi=Se({weekday:"long"});class Ai extends gr{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:r,options:i}=this.context,o=G(new Date(2592e5),e.dow),s={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},a=t.format(o,e.dayHeaderFormat),l=Object.assign(Object.assign(Object.assign(Object.assign({date:o},s),{view:r}),e.extraRenderProps),{text:a});return Xt(pi,{elTag:"th",elClasses:[li,...Dt(s,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:l,generatorName:"dayHeaderContent",generator:i.dayHeaderContent||ci,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},n=>Xt("div",{className:"fc-scrollgrid-sync-inner"},Xt(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(o,vi)}})))}}class bi extends nn{constructor(e,t){super(e,t),this.initialNowDate=Ar(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=Z(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,k(1,e.unit)),o=i.valueOf()-n.valueOf();return o=Math.min(864e5,o),{currentState:{nowDate:r,todayRange:yi(r)},nextState:{nowDate:i,todayRange:yi(i)},waitMs:o}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout(()=>{this.setState(e,()=>{this.setTimeout()})},t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function yi(e){let t=X(e);return{start:t,end:G(t,1)}}bi.contextType=fr;function _i(e,t,n){return e||ai(t,n)}function Ei(e,t){let n=e.activeRange;return t?n:{start:Z(n.start,e.slotMinTime.milliseconds),end:Z(n.end,e.slotMaxTime.milliseconds-864e5)}}function Di(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,o){if(t&&n===t.latestFetchId){let n=ze(function(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;i&&(e=Ci(e,i));r&&(e=Ci(e,r));return e}(i,t,o),t,o);return r&&(n=Ue(n,r,o)),We(wi(e,t.sourceId),n)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Ue(t,n,r));return We(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return We(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?Ue(e,r.activeRange,i):e;case"REMOVE_EVENTS":return function(e,t){let{defs:n,instances:r}=e,i={},o={};for(let e in n)t.defs[e]||(i[e]=n[e]);for(let e in r)!t.instances[e]&&i[r[e].defId]&&(o[e]=r[e]);return{defs:i,instances:o}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return wi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return Qe(e,e=>!e.sourceId);case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function Ci(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function wi(e,t){return Qe(e,e=>e.sourceId!==t)}function Si(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||Ti)(r,t)}function Ti(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),o=e.eventDrag,s=o.mutatedEvents,a=s.defs,l=s.instances,c=Mr(a,o.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=H(c,r));let u=(p=e.eventStore,g=o.affectedEvents.instances,{defs:p.defs,instances:B(p.instances,e=>!g[e.instanceId])}),d=u.defs,f=u.instances,h=Mr(d,e.eventUiBases);var p,g;for(let r in l){let s=l[r],p=s.range,g=c[s.defId],m=a[s.defId];if(!ki(g.constraints,p,u,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,A="function"==typeof v?v:null;for(let e in f){let n=f[e];if(bt(p,n.range)){if(!1===h[n.defId].overlap&&o.isEvent)return!1;if(!1===g.overlap)return!1;if(A&&!A(new Tr(t,d[n.defId],n),new Tr(t,m,s)))return!1}}let b=i.eventStore;for(let e of g.allows){let i,o=Object.assign(Object.assign({},n),{range:s.range,allDay:m.allDay}),a=b.defs[m.defId],l=b.instances[r];if(i=a?new Tr(t,a,l):new Tr(t,m),!e(_r(o,t),i))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,o=i.defs,s=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();r&&(c=r(c));if(!ki(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:u}=t.options,d="function"==typeof u?u:null;for(let e in s){let n=s[e];if(bt(l,n.range)){if(!1===c.overlap)return!1;if(d&&!d(new Tr(t,o[n.defId],n),null))return!1}}for(let e of c.allows){let r=Object.assign(Object.assign({},n),a);if(!e(_r(r,t),null))return!1}return!0}(e,t,n,r))}function ki(e,t,n,r,i){for(let o of e)if(!Oi(Ri(o,t,n,r,i),t))return!1;return!0}function Ri(e,t,n,r,i){return"businessHours"===e?xi(Ue(r,t,i)):"string"==typeof e?xi(Qe(n,t=>t.groupId===e)):"object"==typeof e&&e?xi(Ue(e,t,i)):[]}function xi(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function Oi(e,t){for(let n of e)if(yt(n,t))return!0;return!1}class Ii extends Error{constructor(e,t){super(e),this.response=t}}function Mi(e,t,n){const r={method:e=e.toUpperCase()};return"GET"===e?t+=(-1===t.indexOf("?")?"?":"&")+new URLSearchParams(n):(r.body=new URLSearchParams(n),r.headers={"Content-Type":"application/x-www-form-urlencoded"}),fetch(t,r).then(e=>{if(e.ok)return e.json().then(t=>[t,e],()=>{throw new Ii("Failure parsing JSON",e)});throw new Ii("Request failed",e)})}class Ni{constructor(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}request(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))}pause(e=""){let{pauseDepths:t}=this;t[e]=(t[e]||0)+1,this.clearTimeout()}resume(e="",t){let{pauseDepths:n}=this;if(e in n){if(t)delete n[e];else{n[e]-=1,n[e]<=0&&delete n[e]}this.tryDrain()}}isPaused(){return Object.keys(this.pauseDepths).length}tryDrain(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}}clear(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}}clearTimeout(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)}drained(){this.drainedOption&&this.drainedOption()}}const Bi=/^(visible|hidden)$/;class Hi extends gr{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,mr(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,r=t&&n,i=["fc-scroller"];return t&&(n?i.push("fc-scroller-liquid-absolute"):i.push("fc-scroller-liquid")),Xt("div",{ref:this.handleEl,className:i.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(Bi.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;e<n.length;e+=1){if(n[e].getBoundingClientRect().width>t)return!0}return!1}needsYScrolling(){if(Bi.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;e<n.length;e+=1){if(n[e].getBoundingClientRect().height>t)return!0}return!1}getXScrollbarWidth(){return Bi.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return Bi.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class Pi{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,o=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,o=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),o&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return W(this.currentMap,e,t,n)}getAll(){return U(this.currentMap)}}function Ui(e){let t=i(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,w(e));return Math.ceil(n)}function ji(e,t){return e.liquid&&t.liquid}function zi(e,t){return null!=t.maxHeight||ji(e,t)}function Li(e,t,n,r){let{expandRows:i}=n;return"function"==typeof t.content?t.content(n):Xt("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:i?n.clientHeight:""}},n.tableColGroupNode,Xt(r?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function Fi(e,t){return ue(e,t,j)}function Vi(e,t){let n=[];for(let r of e){let e=r.span||1;for(let i=0;i<e;i+=1)n.push(Xt("col",{style:{width:"shrink"===r.width?Wi(t):r.width||"",minWidth:r.minWidth||""}}))}return Xt("colgroup",{},...n)}function Wi(e){return null==e?4:e}function Qi(e){for(let t of e)if("shrink"===t.width)return!0;return!1}function Gi(e,t){let n=["fc-scrollgrid",t.theme.getClass("table")];return e&&n.push("fc-scrollgrid-liquid"),n}function Zi(e,t){let n=["fc-scrollgrid-section","fc-scrollgrid-section-"+e.type,e.className];return t&&e.liquid&&null==e.maxHeight&&n.push("fc-scrollgrid-section-liquid"),e.isSticky&&n.push("fc-scrollgrid-section-sticky"),n}class Yi extends gr{constructor(){super(...arguments),this.processCols=de(e=>e,Fi),this.renderMicroColGroup=de(Vi),this.scrollerRefs=new Pi,this.scrollerElRefs=new Pi(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,r=e.sections||[],i=this.processCols(e.cols),o=this.renderMicroColGroup(i,t.shrinkWidth),s=Gi(e.liquid,n);e.collapsibleWidth&&s.push("fc-scrollgrid-collapsible");let a,l=r.length,c=0,u=[],d=[],f=[];for(;c<l&&"header"===(a=r[c]).type;)u.push(this.renderSection(a,o,!0)),c+=1;for(;c<l&&"body"===(a=r[c]).type;)d.push(this.renderSection(a,o,!1)),c+=1;for(;c<l&&"footer"===(a=r[c]).type;)f.push(this.renderSection(a,o,!0)),c+=1;let h=!ft();const p={role:"rowgroup"};return Xt("table",{role:"grid",className:s.join(" "),style:{height:e.height}},Boolean(!h&&u.length)&&Xt("thead",p,...u),Boolean(!h&&d.length)&&Xt("tbody",p,...d),Boolean(!h&&f.length)&&Xt("tfoot",p,...f),h&&Xt("tbody",p,...u,...d,...f))}renderSection(e,t,n){return"outerContent"in e?Xt(tn,{key:e.key},e.outerContent):Xt("tr",{key:e.key,role:"presentation",className:Zi(e,this.props.liquid).join(" ")},this.renderChunkTd(e,t,e.chunk,n))}renderChunkTd(e,t,n,r){if("outerContent"in n)return n.outerContent;let{props:i}=this,{forceYScrollbars:o,scrollerClientWidths:s,scrollerClientHeights:a}=this.state,l=zi(i,e),c=ji(i,e),u=i.liquid?o?"scroll":l?"auto":"hidden":"visible",d=e.key,f=Li(e,n,{tableColGroupNode:t,tableMinWidth:"",clientWidth:i.collapsibleWidth||void 0===s[d]?null:s[d],clientHeight:void 0!==a[d]?a[d]:null,expandRows:e.expandRows,syncRowHeights:!1,rowSyncHeights:[],reportRowHeightChange:()=>{}},r);return Xt(r?"th":"td",{ref:n.elRef,role:"presentation"},Xt("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},Xt(Hi,{ref:this.scrollerRefs.createRef(d),elRef:this.scrollerElRefs.createRef(d),overflowY:u,overflowX:i.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},f)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&mr(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return Qi(this.props.cols)?Ui(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=xt(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},o={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let s=t.key,a=n.currentMap[s];if(a){let t=a.parentNode;i[s]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),o[s]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:o}}}Yi.addStateEquality({scrollerClientWidths:j,scrollerClientHeights:j});class qi extends gr{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&Or(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{eventRange:i}=r,{ui:o}=i,s={event:new Tr(t,i.def,i.instance),view:t.viewApi,timeText:e.timeText,textColor:o.textColor,backgroundColor:o.backgroundColor,borderColor:o.borderColor,isDraggable:!e.disableDragging&&Hr(r,t),isStartResizable:!e.disableResizing&&Pr(r,t),isEndResizable:!e.disableResizing&&Ur(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return Xt(pi,Object.assign({},e,{elRef:this.handleEl,elClasses:[...zr(s),...r.eventRange.ui.classNames,...e.elClasses||[]],renderProps:s,generatorName:"eventContent",generator:n.eventContent||e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&Or(this.el,this.props.seg)}}function Ji(e){return Xt("div",{className:"fc-event-main-frame"},e.timeText&&Xt("div",{className:"fc-event-time"},e.timeText),Xt("div",{className:"fc-event-title-container"},Xt("div",{className:"fc-event-title fc-sticky"},e.event.title||Xt(tn,null," "))))}const $i=Se({day:"numeric"});class Xi extends gr{constructor(){super(...arguments),this.refineRenderProps=fe(eo)}render(){let{props:e,context:t}=this,{options:n}=t,r=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv});return Xt(pi,Object.assign({},e,{elClasses:[...Dt(r,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),r.isDisabled?{}:{"data-date":le(e.date)}),renderProps:r,generatorName:"dayCellContent",generator:n.dayCellContent||e.defaultGenerator,classNameGenerator:r.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function Ki(e){return Boolean(e.dayCellContent||di("dayCellContent",e))}function eo(e){let{date:t,dateEnv:n}=e,r=Et(t,e.todayRange,null,e.dateProfile);return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},r),{dayNumberText:e.showDayNumber?n.format(t,$i):""}),e.extraRenderProps)}function to(e){let{title:t}=e.event;return t&&Xt("div",{className:"fc-event-title"},e.event.title)}function no(e){return e.text}class ro extends gr{constructor(){super(...arguments),this.state={titleId:u()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&mr(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=l(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:r}=this,i=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return qn(Xt("div",Object.assign({},n.extraAttrs,{id:n.id,className:i.join(" "),"aria-labelledby":r.titleId,ref:this.handleRootEl}),Xt("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},Xt("span",{className:"fc-popover-title",id:r.titleId},n.title),Xt("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),Xt("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:r}=this.props,{rootEl:i}=this,o=function(e){let t=Nt(e),n=e.getBoundingClientRect();for(let e of t){let t=ut(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(o){let a=i.getBoundingClientRect(),l=r?n(t,".fc-scrollgrid").getBoundingClientRect().top:o.top,c=e?o.right-a.width:o.left;l=Math.max(l,10),c=Math.min(c,document.documentElement.clientWidth-10-a.width),c=Math.max(c,10);let u=i.offsetParent.getBoundingClientRect();s(i,{top:l-u.top,left:c-u.left})}}}class io extends vr{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:r,todayRange:i,dateProfile:o}=n,s=t.format(r,e.dayPopoverFormat);return Xt(Xi,{elRef:this.handleRootEl,date:r,dateProfile:o,todayRange:i},(t,r,i)=>Xt(ro,{elRef:i.ref,id:n.id,title:s,extraClassNames:["fc-more-popover"].concat(i.className||[]),extraAttrs:i,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},Ki(e)&&Xt(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children))}queryHit(e,t,n,r){let{rootEl:i,props:o}=this;return e>=0&&e<n&&t>=0&&t<r?{dateProfile:o.dateProfile,dateSpan:Object.assign({allDay:!0,range:{start:o.startDate,end:o.endDate}},o.extraDateSpan),dayEl:i,rect:{left:0,top:0,right:n,bottom:r},layer:1}:null}}function oo(e){return e.text}function so(e){if(e.allDayDate)return{start:e.allDayDate,end:G(e.allDayDate,1)};let{hiddenSegs:t}=e;return{start:ao(t),end:(n=t,n.reduce(co).eventRange.range.end)};var n}function ao(e){return e.reduce(lo).eventRange.range.start}function lo(e,t){return e.eventRange.range.start<t.eventRange.range.start?e:t}function co(e,t){return e.eventRange.range.end>t.eventRange.range.end?e:t}function uo(e){return[`fc-${e.type}-view`,"fc-view"]}function fo(e){if(!e||"undefined"==typeof document)return;const t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}const ho={id:String,defaultAllDay:Boolean,url:String,format:String,events:He,eventDataTransform:He,success:He,failure:He};function po(e,t,n=go(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:o}=Be(r,n),s=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:v(),sourceDefId:s.sourceDefId,meta:s.meta,ui:qe(i,t),extendedProps:o}}return null}function go(e){return Object.assign(Object.assign(Object.assign({},Ze),ho),e.pluginHooks.eventSourceRefiners)}class mo{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering(()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})})}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),o=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)o.push(e);for(t=0;t<o.length;t+=1)if(n=r[o[t]],n&&n.singleUnit===e)return n;return null}prev(){this.unselect(),this.dispatch({type:"PREV"})}next(){this.unselect(),this.dispatch({type:"NEXT"})}prevYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,-1)})}nextYear(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,1)})}today(){let e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:Ar(e.calendarOptions.now,e.dateEnv)})}gotoDate(e){let t=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.createMarker(e)})}incrementDate(e){let t=this.getCurrentData(),n=k(e);n&&(this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.add(t.currentDate,n)}))}getDate(){let e=this.getCurrentData();return e.dateEnv.toDate(e.currentDate)}formatDate(e,t){let{dateEnv:n}=this.getCurrentData();return n.format(n.createMarker(e),Se(t))}formatRange(e,t,n){let{dateEnv:r}=this.getCurrentData();return r.formatRange(r.createMarker(e),r.createMarker(t),Se(n),n)}formatIso(e,t){let{dateEnv:n}=this.getCurrentData();return n.formatIso(n.createMarker(e),{omitTime:t})}select(e,t){let n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};let r=this.getCurrentData(),i=Vr(n,r.dateEnv,k({days:1}));i&&(this.dispatch({type:"SELECT_DATES",selection:i}),yr(i,null,r))}unselect(e){let t=this.getCurrentData();t.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),function(e,t){t.emitter.trigger("unselect",{jsEvent:e?e.origEvent:null,view:t.viewApi||t.calendarApi.view})}(e,t))}addEvent(e,t){if(e instanceof Tr){let t=e._def,n=e._instance;return this.getCurrentData().eventStore.defs[t.defId]||(this.dispatch({type:"ADD_EVENTS",eventStore:Le({def:t,instance:n})}),this.triggerEventAdd(e)),e}let n,r=this.getCurrentData();if(t instanceof Sr)n=t.internalEventSource;else if("boolean"==typeof t)t&&([n]=U(r.eventSources));else if(null!=t){let e=this.getEventSourceById(t);if(!e)return console.warn(`Could not find an event source with ID "${t}"`),null;n=e.internalEventSource}let i=tt(e,n,r,!1);if(i){let e=new Tr(r,i.def,i.def.recurringDef?null:i.instance);return this.dispatch({type:"ADD_EVENTS",eventStore:Le(i)}),this.triggerEventAdd(e),e}return null}triggerEventAdd(e){let{emitter:t}=this.getCurrentData();t.trigger("eventAdd",{event:e,relatedEvents:[],revert:()=>{this.dispatch({type:"REMOVE_EVENTS",eventStore:kr(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let o=n[i];if(o.publicId===e){if(o.recurringDef)return new Tr(t,o,null);for(let e in r){let n=r[e];if(n.defId===o.defId)return new Tr(t,o,n)}}}return null}getEvents(){let e=this.getCurrentData();return Rr(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new Sr(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new Sr(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof Sr)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=po(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new Sr(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=k(e);t&&this.trigger("_scrollRequest",{time:t})}}var vo={__proto__:null,BASE_OPTION_DEFAULTS:ke,identity:He,refineProps:Be,createEventInstance:Pe,parseEventDef:it,refineEventDef:nt,parseBusinessHours:st,padStart:E,isInt:C,parseFieldSpecs:A,compareByFieldSpecs:b,flexibleCompare:_,preventSelection:function(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",d)},allowSelection:function(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",d)},preventContextMenu:function(e){e.addEventListener("contextmenu",d)},allowContextMenu:function(e){e.removeEventListener("contextmenu",d)},compareNumbers:function(e,t){return e-t},enableCursor:function(){document.body.classList.remove("fc-not-allowed")},disableCursor:function(){document.body.classList.add("fc-not-allowed")},guid:v,computeVisibleDayRange:lt,isMultiDayRange:function(e){let t=lt(e);return Y(t.start,t.end)>1},diffDates:ct,removeExact:function(e,t){let n=0,r=0;for(;r<e.length;)e[r]===t?(e.splice(r,1),n+=1):r+=1;return n},isArraysEqual:ue,memoize:de,memoizeObjArg:fe,memoizeArraylike:function(e,t,n){let r=[],i=[];return o=>{let s=r.length,a=o.length,l=0;for(;l<s;l+=1)if(o[l]){if(!ue(r[l],o[l])){n&&n(i[l]);let r=e.apply(this,o[l]);t&&t(r,i[l])||(i[l]=r)}}else n&&n(i[l]);for(;l<a;l+=1)i[l]=e.apply(this,o[l]);return r=o,i.splice(a),i}},memoizeHashlike:function(e,t,n){let r={},i={};return o=>{let s={};for(let a in o)if(i[a])if(ue(r[a],o[a]))s[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,o[a]);s[a]=t&&t(r,i[a])?i[a]:r}else s[a]=e.apply(this,o[a]);return r=o,i=s,s}},intersectRects:ut,pointInsideRect:function(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom},constrainPoint:function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},getRectCenter:function(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}},diffPoints:function(e,t){return{left:e.left-t.left,top:e.top-t.top}},translateRect:function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},mapHash:H,filterHash:B,isPropsEqual:j,compareObjs:F,collectFromHash:W,findElements:i,findDirectChildren:function(e,t){let n=e instanceof HTMLElement?[e]:e,i=[];for(let e=0;e<n.length;e+=1){let o=n[e].children;for(let e=0;e<o.length;e+=1){let n=o[e];t&&!r(n,t)||i.push(n)}}return i},removeElement:t,applyStyle:s,elementMatches:r,elementClosest:n,getElRoot:function(e){return e.getRootNode?e.getRootNode():document},getEventTargetViaRoot:l,getUniqueDomId:u,parseClassNames:Ge,getCanVGrowWithinCell:ft,createEmptyEventStore:Ve,mergeEventStores:We,getRelevantEvents:Fe,eventTupleToStore:Le,combineEventUis:Je,createEventUi:qe,Splitter:class{constructor(){this.getKeysForEventDefs=de(this._getKeysForEventDefs),this.splitDateSelection=de(this._splitDateSpan),this.splitEventStore=de(this._splitEventStore),this.splitIndividualUi=de(this._splitIndividualUi),this.splitEventDrag=de(this._splitInteraction),this.splitEventResize=de(this._splitInteraction),this.eventUiBuilders={}}splitProps(e){let t=this.getKeyInfo(e),n=this.getKeysForEventDefs(e.eventStore),r=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,n),o=this.splitEventStore(e.eventStore,n),s=this.splitEventDrag(e.eventDrag),a=this.splitEventResize(e.eventResize),l={};this.eventUiBuilders=H(t,(e,t)=>this.eventUiBuilders[t]||de(pt));for(let n in t){let c=t[n],u=o[n]||ht,d=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:u,eventUiBases:d(e.eventUiBases[""],c.ui,i[n]),eventSelection:u.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return H(e.defs,e=>this.getKeysForEventDef(e))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=r=>{t[r]||(t[r]={affectedEvents:n[r]||ht,mutatedEvents:i[r]||ht,isEvent:e.isEvent})};for(let e in n)o(e);for(let e in i)o(e)}return t}},getDayClassNames:Dt,getDateMeta:Et,getSlotClassNames:function(e,t){let n=["fc-slot","fc-slot-"+Q[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},buildNavLinkAttrs:St,preventDefault:d,whenTransitionDone:function(e,t){let n=r=>{t(r),h.forEach(t=>{e.removeEventListener(t,n)})};h.forEach(t=>{e.addEventListener(t,n)})},computeInnerRect:function(e,t=!1,n){let r=n?e.getBoundingClientRect():Mt(e),i=It(e,t),o={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(o.left+=i.paddingLeft,o.right-=i.paddingRight,o.top+=i.paddingTop,o.bottom-=i.paddingBottom),o},computeEdges:It,getClippingParents:Nt,computeRect:Mt,unpromisify:Bt,Emitter:Ht,rangeContainsMarker:_t,intersectRanges:vt,rangesEqual:At,rangesIntersect:bt,rangeContainsRange:yt,PositionCache:class{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}topToIndex(e){let t,{tops:n,bottoms:r}=this,i=n.length;for(t=0;t<i;t+=1)if(e>=n[t]&&e<r[t])return t}getWidth(e){return this.rights[e]-this.lefts[e]}getHeight(e){return this.bottoms[e]-this.tops[e]}similarTo(e){return Pt(this.tops||[],e.tops||[])&&Pt(this.bottoms||[],e.bottoms||[])&&Pt(this.lefts||[],e.lefts||[])&&Pt(this.rights||[],e.rights||[])}},ScrollController:Ut,ElementScrollController:class extends Ut{constructor(e){super(),this.el=e}getScrollTop(){return this.el.scrollTop}getScrollLeft(){return this.el.scrollLeft}setScrollTop(e){this.el.scrollTop=e}setScrollLeft(e){this.el.scrollLeft=e}getScrollWidth(){return this.el.scrollWidth}getScrollHeight(){return this.el.scrollHeight}getClientHeight(){return this.el.clientHeight}getClientWidth(){return this.el.clientWidth}},WindowScrollController:class extends Ut{getScrollTop(){return window.pageYOffset}getScrollLeft(){return window.pageXOffset}setScrollTop(e){window.scroll(window.pageXOffset,e)}setScrollLeft(e){window.scroll(e,window.pageYOffset)}getScrollWidth(){return document.documentElement.scrollWidth}getScrollHeight(){return document.documentElement.scrollHeight}getClientHeight(){return document.documentElement.clientHeight}getClientWidth(){return document.documentElement.clientWidth}},Theme:jt,ViewContextType:fr,DateComponent:vr,DateProfileGenerator:br,isDateSpansEqual:function(e,t){return At(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)},addDays:G,startOfDay:X,addMs:Z,addWeeks:function(e,t){let n=re(e);return n[2]+=7*t,ie(n)},diffWeeks:function(e,t){return Y(e,t)/7},diffWholeWeeks:J,diffWholeDays:$,diffDayAndTime:q,diffDays:Y,isValidDate:oe,createDuration:k,asCleanDays:function(e){return e.years||e.months||e.milliseconds?0:e.days},multiplyDuration:function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},addDurations:function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},asRoughMinutes:function(e){return O(e)/6e4},asRoughSeconds:function(e){return O(e)/1e3},asRoughMs:O,wholeDivideDurations:function(e,t){let n=null;for(let r=0;r<S.length;r+=1){let i=S[r];if(t[i]){let r=e[i]/t[i];if(!C(r)||null!==n&&n!==r)return null;n=r}else if(e[i])return null}return n},greatestDurationDenominator:I,DateEnv:$r,createFormatter:Se,formatIsoTimeString:function(e){return E(e.getUTCHours(),2)+":"+E(e.getUTCMinutes(),2)+":"+E(e.getUTCSeconds(),2)},formatDayString:le,buildIsoString:ae,NamedTimeZoneImpl:class{constructor(e){this.timeZoneName=e}},parseMarker:Jr,SegHierarchy:class{constructor(){this.strictOrder=!1,this.allowReslicing=!1,this.maxCoord=-1,this.maxStackCnt=-1,this.levelCoords=[],this.entriesByLevel=[],this.stackCnts={}}addSegs(e){let t=[];for(let n of e)this.insertEntry(n,t);return t}insertEntry(e,t){let n=this.findInsertion(e);return this.isInsertionValid(n,e)?(this.insertEntryAt(e,n),1):this.handleInvalidInsertion(n,e,t)}isInsertionValid(e,t){return(-1===this.maxCoord||e.levelCoord+t.thickness<=this.maxCoord)&&(-1===this.maxStackCnt||e.stackCnt<this.maxStackCnt)}handleInvalidInsertion(e,t,n){return this.allowReslicing&&e.touchingEntry?this.splitEntry(t,e.touchingEntry,n):(n.push(t),0)}splitEntry(e,t,n){let r=0,i=[],o=e.span,s=t.span;return o.start<s.start&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:o.start,end:s.start}},i)),o.end>s.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:o.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:ei(s,o)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(ti(r,t.level,t.levelCoord),ti(n,t.level,[e])):ti(n[t.level],t.lateral,e),this.stackCnts[Kr(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,o=t.length,s=0,a=-1,l=-1,c=null,u=0;for(let d=0;d<o;d+=1){let o=t[d];if(!r&&o>=s+e.thickness)break;let f,h=n[d],p=ni(h,e.span.start,Xr),g=p[0]+p[1];for(;(f=h[g])&&f.span.start<e.span.end;){let e=o+f.thickness;e>s&&(s=e,c=f,a=d,l=g),e===s&&(u=Math.max(u,i[Kr(f)]+1)),g+=1}}let d=0;if(c)for(d=a+1;d<o&&t[d]<s;)d+=1;let f=-1;return d<o&&t[d]===s&&(f=ni(n[d],e.span.end,Xr)[0]),{touchingLevel:a,touchingLateral:l,touchingEntry:c,stackCnt:u,levelCoord:s,level:d,lateral:f}}toRects(){let{entriesByLevel:e,levelCoords:t}=this,n=e.length,r=[];for(let i=0;i<n;i+=1){let n=e[i],o=t[i];for(let e of n)r.push(Object.assign(Object.assign({},e),{levelCoord:o}))}return r}},buildEntryKey:Kr,getEntrySpanEnd:Xr,binarySearch:ni,groupIntersectingEntries:function(e){let t=[];for(let i of e){let e=[],o={span:i.span,entries:[i]};for(let i of t)ei(i.span,o.span)?o={entries:i.entries.concat(o.entries),span:(n=i.span,r=o.span,{start:Math.min(n.start,r.start),end:Math.max(n.end,r.end)})}:e.push(i);e.push(o),t=e}var n,r;return t},intersectSpans:ei,Interaction:ri,interactionSettingsToStore:function(e){return{[e.component.uid]:e}},interactionSettingsStore:ii,ElementDragging:class{constructor(e,t){this.emitter=new Ht}destroy(){}setMirrorIsVisible(e){}setMirrorNeedsRevert(e){}setAutoScrollEnabled(e){}},config:{},parseDragMeta:function(e){let{refined:t,extra:n}=Be(e,oi);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}},CalendarRoot:si,DayHeader:class extends gr{constructor(){super(...arguments),this.createDayHeaderFormatter=de(_i)}render(){let{context:e}=this,{dates:t,dateProfile:n,datesRepDistinctDays:r,renderIntro:i}=this.props,o=this.createDayHeaderFormatter(e.options.dayHeaderFormat,r,t.length);return Xt(bi,{unit:"day"},(e,s)=>Xt("tr",{role:"row"},i&&i("day"),t.map(e=>r?Xt(mi,{key:e.toISOString(),date:e,dateProfile:n,todayRange:s,colCnt:t.length,dayHeaderFormat:o}):Xt(Ai,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:o}))))}},computeFallbackHeaderFormat:ai,TableDateCell:mi,TableDowCell:Ai,DaySeriesModel:class{constructor(e,t){let n=e.start,{end:r}=e,i=[],o=[],s=-1;for(;n<r;)t.isHiddenDay(n)?i.push(s+.5):(s+=1,i.push(s),o.push(n)),n=G(n,1);this.dates=o,this.indices=i,this.cnt=o.length}sliceRange(e){let t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(G(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return r=Math.ceil(r),i=Math.floor(i),r<=i?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null}getDateDayIndex(e){let{indices:t}=this,n=Math.floor(Y(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]}},sliceEventStore:xr,hasBgRendering:function(e){return"background"===e.ui.display||"inverse-background"===e.ui.display},getElSeg:Ir,buildSegTimeText:jr,sortEventSegs:function(e,t){let n=e.map(Br);return n.sort((e,n)=>b(e,n,t)),n.map(e=>e._seg)},getSegMeta:function(e,t,n){let r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&_t(t,r.start)}},buildEventRangeKey:function(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`},getSegAnchorAttrs:Lr,DayTableModel:class{constructor(e,t){let n,r,i,{dates:o}=e;if(t){for(r=o[0].getUTCDay(),n=1;n<o.length&&o[n].getUTCDay()!==r;n+=1);i=Math.ceil(o.length/n)}else i=1,n=o.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}buildCells(){let e=[];for(let t=0;t<this.rowCnt;t+=1){let n=[];for(let e=0;e<this.colCnt;e+=1)n.push(this.buildCell(t,e));e.push(n)}return e}buildCell(e,t){let n=this.daySeries.dates[e*this.colCnt+t];return{key:n.toISOString(),date:n}}buildHeaderDates(){let e=[];for(let t=0;t<this.colCnt;t+=1)e.push(this.cells[0][t].date);return e}sliceRange(e){let{colCnt:t}=this,n=this.daySeries.sliceRange(e),r=[];if(n){let{firstIndex:e,lastIndex:i}=n,o=e;for(;o<=i;){let s=Math.floor(o/t),a=Math.min((s+1)*t,i+1);r.push({row:s,firstCol:o%t,lastCol:(a-1)%t,isStart:n.isStart&&o===e,isEnd:n.isEnd&&a-1===i}),o=a}}return r}},Slicer:class{constructor(){this.sliceBusinessHours=de(this._sliceBusinessHours),this.sliceDateSelection=de(this._sliceDateSpan),this.sliceEventStore=de(this._sliceEventStore),this.sliceEventDrag=de(this._sliceInteraction),this.sliceEventResize=de(this._sliceInteraction),this.forceDayIfListItem=!1}sliceProps(e,t,n,r,...i){let{eventUiBases:o}=e,s=this.sliceEventStore(e.eventStore,o,t,n,...i);return{dateSelectionSegs:this.sliceDateSelection(e.dateSelection,o,r,...i),businessHourSegs:this.sliceBusinessHours(e.businessHours,t,n,r,...i),fgEventSegs:s.fg,bgEventSegs:s.bg,eventDrag:this.sliceEventDrag(e.eventDrag,o,t,n,...i),eventResize:this.sliceEventResize(e.eventResize,o,t,n,...i),eventSelection:e.eventSelection}}sliceNowDate(e,t,...n){return this._sliceDateSpan({range:{start:e,end:Z(e,1)},allDay:!1},{},t,...n)}_sliceBusinessHours(e,t,n,r,...i){return e?this._sliceEventStore(Ue(e,Ei(t,Boolean(n)),r),{},t,n,...i).bg:[]}_sliceEventStore(e,t,n,r,...i){if(e){let o=xr(e,t,Ei(n,Boolean(r)),r);return{bg:this.sliceEventRanges(o.bg,i),fg:this.sliceEventRanges(o.fg,i)}}return{bg:[],fg:[]}}_sliceInteraction(e,t,n,r,...i){if(!e)return null;let o=xr(e.mutatedEvents,t,Ei(n,Boolean(r)),r);return{segs:this.sliceEventRanges(o.fg,i),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent}}_sliceDateSpan(e,t,n,...r){if(!e)return[];let i=function(e,t,n){let r=nt({editable:!1},n),i=it(r.refined,r.extra,"",e.allDay,!0,n);return{def:i,ui:Nr(i,t),instance:Pe(i.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}(e,t,n),o=this.sliceRange(e.range,...r);for(let e of o)e.eventRange=i;return o}sliceEventRanges(e,t){let n=[];for(let r of e)n.push(...this.sliceEventRange(r,t));return n}sliceEventRange(e,t){let n=e.range;this.forceDayIfListItem&&"list-item"===e.ui.display&&(n={start:n.start,end:G(n.start,1)});let r=this.sliceRange(n,...t);for(let t of r)t.eventRange=e,t.isStart=e.isStart&&t.isStart,t.isEnd=e.isEnd&&t.isEnd;return r}},applyMutationToEventStore:Dr,isPropsValid:Ti,isInteractionValid:function(e,t,n){let{instances:r}=e.mutatedEvents;for(let e in r)if(!yt(t.validRange,r[e].range))return!1;return Si({eventDrag:e},n)},isDateSelectionValid:function(e,t,n){return!!yt(t.validRange,e.range)&&Si({dateSelection:e},n)},requestJson:Mi,BaseComponent:gr,setRef:mr,DelayedRunner:Ni,SimpleScrollGrid:Yi,hasShrinkWidth:Qi,renderMicroColGroup:Vi,getScrollGridClassNames:Gi,getSectionClassNames:Zi,getSectionHasLiquidHeight:ji,getAllowYScrolling:zi,renderChunkContent:Li,computeShrinkWidth:Ui,sanitizeShrinkWidth:Wi,isColPropsEqual:Fi,renderScrollShim:function(e){return Xt("div",{className:"fc-scrollgrid-sticky-shim",style:{width:e.clientWidth,minWidth:e.tableMinWidth}})},getStickyFooterScrollbar:function(e){let{stickyFooterScrollbar:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},getStickyHeaderDates:function(e){let{stickyHeaderDates:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},Scroller:Hi,getScrollbarWidths:xt,RefMap:Pi,getIsRtlScrollbarOnLeft:Rt,NowTimer:bi,ScrollResponder:dr,StandardEvent:class extends gr{render(){let{props:e,context:t}=this,{options:n}=t,{seg:r}=e,{ui:i}=r.eventRange,o=jr(r,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return Xt(qi,Object.assign({},e,{elTag:"a",elStyle:{borderColor:i.borderColor,backgroundColor:i.backgroundColor},elAttrs:Lr(r,t),defaultGenerator:Ji,timeText:o}),(e,t)=>Xt(tn,null,Xt(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&Xt("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&Xt("div",{className:"fc-event-resizer fc-event-resizer-end"})))}},NowIndicatorContainer:e=>Xt(fr.Consumer,null,t=>{let{options:n}=t,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return Xt(pi,Object.assign({},e,{elTag:e.elTag||"div",renderProps:r,generatorName:"nowIndicatorContent",generator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))}),DayCellContainer:Xi,hasCustomDayCellContent:Ki,EventContainer:qi,renderFill:function(e){return Xt("div",{className:"fc-"+e})},BgEvent:class extends gr{render(){let{props:e}=this,{seg:t}=e;return Xt(qi,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:to,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}},WeekNumberContainer:e=>Xt(fr.Consumer,null,t=>{let{dateEnv:n,options:r}=t,{date:i}=e,o=r.weekNumberFormat||e.defaultFormat,s={num:n.computeWeekNumber(i),text:n.format(i,o),date:i};return Xt(pi,Object.assign({},e,{renderProps:s,generatorName:"weekNumberContent",generator:r.weekNumberContent||no,classNameGenerator:r.weekNumberClassNames,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount}))}),MoreLinkContainer:class extends gr{constructor(){super(...arguments),this.state={isPopoverOpen:!1,popoverId:u()},this.handleLinkEl=e=>{this.linkEl=e,this.props.elRef&&mr(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=so(t).start;function o(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new Tr(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(o),hiddenSegs:t.hiddenSegs.map(o),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return Xt(fr.Consumer,null,n=>{let{viewApi:r,options:i,calendarApi:o}=n,{moreLinkText:s}=i,{moreCnt:a}=e,l=so(e),c="function"==typeof s?s.call(o,a):`+${a} ${s}`,u=D(i.moreLinkHint,[a],c),d={num:a,shortText:"+"+a,text:c,view:r};return Xt(tn,null,Boolean(e.moreCnt)&&Xt(pi,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),p(this.handleClick)),{title:u,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:d,generatorName:"moreLinkContent",generator:i.moreLinkContent||e.defaultGenerator||oo,classNameGenerator:i.moreLinkClassNames,didMount:i.moreLinkDidMount,willUnmount:i.moreLinkWillUnmount},e.children),t.isPopoverOpen&&Xt(io,{id:t.popoverId,startDate:l.start,endDate:l.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,onClose:this.handlePopoverClose},e.popoverContent()))})}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=n(this.linkEl,".fc-view-harness"))}},computeEarliestSegStart:ao,ViewContainer:class extends gr{render(){let{props:e,context:t}=this,{options:n}=t,r={view:t.viewApi};return Xt(pi,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...uo(e.viewSpec),...e.elClasses||[]],renderProps:r,classNameGenerator:n.viewClassNames,generatorName:void 0,generator:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),()=>e.children)}},triggerDateSelect:yr,getDefaultEventEnd:Er,injectStyles:fo,CalendarImpl:mo,EventImpl:Tr,buildEventApis:Rr,buildElAttrs:fi,ContentContainer:pi,CustomRenderingStore:class extends class{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}}};fo(':root{--fc-small-font-size:.85em;--fc-page-bg-color:#fff;--fc-neutral-bg-color:hsla(0,0%,82%,.3);--fc-neutral-text-color:grey;--fc-border-color:#ddd;--fc-button-text-color:#fff;--fc-button-bg-color:#2c3e50;--fc-button-border-color:#2c3e50;--fc-button-hover-bg-color:#1e2b37;--fc-button-hover-border-color:#1a252f;--fc-button-active-bg-color:#1a252f;--fc-button-active-border-color:#151e27;--fc-event-bg-color:#3788d8;--fc-event-border-color:#3788d8;--fc-event-text-color:#fff;--fc-event-selected-overlay-color:rgba(0,0,0,.25);--fc-more-link-bg-color:#d0d0d0;--fc-more-link-text-color:inherit;--fc-event-resizer-thickness:8px;--fc-event-resizer-dot-total-width:8px;--fc-event-resizer-dot-border-width:1px;--fc-non-business-color:hsla(0,0%,84%,.3);--fc-bg-event-color:#8fdf82;--fc-bg-event-opacity:0.3;--fc-highlight-color:rgba(188,232,241,.3);--fc-today-bg-color:rgba(255,220,40,.15);--fc-now-indicator-color:red}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{padding:0;vertical-align:top}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid var(--fc-border-color)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;font-style:normal;font-weight:400;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype")}.fc-icon{speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;font-family:fcicons!important;font-style:normal;font-variant:normal;font-weight:400;height:1em;line-height:1;text-align:center;text-transform:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1em}.fc-icon-chevron-left:before{content:"\\e900"}.fc-icon-chevron-right:before{content:"\\e901"}.fc-icon-chevrons-left:before{content:"\\e902"}.fc-icon-chevrons-right:before{content:"\\e903"}.fc-icon-minus-square:before{content:"\\e904"}.fc-icon-plus-square:before{content:"\\e905"}.fc-icon-x:before{content:"\\e906"}.fc .fc-button{border-radius:0;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible;text-transform:none}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{border-style:none;padding:0}.fc .fc-button{background-color:transparent;border:1px solid transparent;border-radius:.25em;display:inline-block;font-size:1em;font-weight:400;line-height:1.5;padding:.4em .65em;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{box-shadow:0 0 0 .2rem rgba(44,62,80,.25);outline:0}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:hover{background-color:var(--fc-button-hover-bg-color);border-color:var(--fc-button-hover-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:disabled{background-color:var(--fc-button-bg-color);border-color:var(--fc-button-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{background-color:var(--fc-button-active-bg-color);border-color:var(--fc-button-active-border-color);color:var(--fc-button-text-color)}.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{font-size:1.5em;vertical-align:middle}.fc .fc-button-group{display:inline-flex;position:relative;vertical-align:middle}.fc .fc-button-group>.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const Ao=[],bo={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},yo=Object.assign(Object.assign({},bo),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":"This "+e},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function _o(e){let t=e.length>0?e[0].code:"en",n=Ao.concat(e),r={en:yo};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function Eo(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n<e.length;n+=1){let r=e[n].toLocaleLowerCase().split("-");for(let e=r.length;e>0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||yo;return Do(e,n,r)}(e,t):Do(e.code,[e.code],e)}function Do(e,t,n){let r=N([bo,n],["buttonText"]);delete r.code;let{week:i}=r;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function Co(e){return{id:v(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function wo(){let e,t=[],n=[];return(r,i)=>(e&&ue(r,t)&&ue(i,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let s of e){const e=s.name,a=n[e];void 0===a?(n[e]=s.id,i(s.deps),o=s,r={premiumReleaseDate:So((t=r).premiumReleaseDate,o.premiumReleaseDate),reducers:t.reducers.concat(o.reducers),isLoadingFuncs:t.isLoadingFuncs.concat(o.isLoadingFuncs),contextInit:t.contextInit.concat(o.contextInit),eventRefiners:Object.assign(Object.assign({},t.eventRefiners),o.eventRefiners),eventDefMemberAdders:t.eventDefMemberAdders.concat(o.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},t.eventSourceRefiners),o.eventSourceRefiners),isDraggableTransformers:t.isDraggableTransformers.concat(o.isDraggableTransformers),eventDragMutationMassagers:t.eventDragMutationMassagers.concat(o.eventDragMutationMassagers),eventDefMutationAppliers:t.eventDefMutationAppliers.concat(o.eventDefMutationAppliers),dateSelectionTransformers:t.dateSelectionTransformers.concat(o.dateSelectionTransformers),datePointTransforms:t.datePointTransforms.concat(o.datePointTransforms),dateSpanTransforms:t.dateSpanTransforms.concat(o.dateSpanTransforms),views:Object.assign(Object.assign({},t.views),o.views),viewPropsTransformers:t.viewPropsTransformers.concat(o.viewPropsTransformers),isPropsValid:o.isPropsValid||t.isPropsValid,externalDefTransforms:t.externalDefTransforms.concat(o.externalDefTransforms),viewContainerAppends:t.viewContainerAppends.concat(o.viewContainerAppends),eventDropTransformers:t.eventDropTransformers.concat(o.eventDropTransformers),calendarInteractions:t.calendarInteractions.concat(o.calendarInteractions),componentInteractions:t.componentInteractions.concat(o.componentInteractions),themeClasses:Object.assign(Object.assign({},t.themeClasses),o.themeClasses),eventSourceDefs:t.eventSourceDefs.concat(o.eventSourceDefs),cmdFormatter:o.cmdFormatter||t.cmdFormatter,recurringTypes:t.recurringTypes.concat(o.recurringTypes),namedTimeZonedImpl:o.namedTimeZonedImpl||t.namedTimeZonedImpl,initialView:t.initialView||o.initialView,elementDraggingImpl:t.elementDraggingImpl||o.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},t.optionChangeHandlers),o.optionChangeHandlers),scrollGridImpl:o.scrollGridImpl||t.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},t.listenerRefiners),o.listenerRefiners),optionRefiners:Object.assign(Object.assign({},t.optionRefiners),o.optionRefiners),propSetHandlers:Object.assign(Object.assign({},t.propSetHandlers),o.propSetHandlers)}):a!==s.id&&console.warn(`Duplicate plugin '${e}'`)}var t,o}return e&&i(e),i(t),r}(r,i)),t=r,n=i,e)}function So(e,t){return void 0===e?t:void 0===t?e:new Date(Math.max(e.valueOf(),t.valueOf()))}class To extends jt{}function ko(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],o=r[e],s=e=>i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null,a=s("component"),l=s("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=ko(l,t,n,r)}!a&&c&&(a=c.component);if(!a)return null;return{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),o?o.rawOptions:{})}}(e,t,n,r);return i&&(t[e]=i),i}function Ro(e){return H(e,xo)}function xo(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;var r;return t.content&&(r=t,n=e=>Xt(fr.Consumer,null,t=>Xt(pi,{elTag:"div",elClasses:uo(t.viewSpec),renderProps:Object.assign(Object.assign({},e),{nextDayThreshold:t.options.nextDayThreshold}),generatorName:void 0,generator:r.content,classNameGenerator:r.classNames,didMount:r.didMount,willUnmount:r.willUnmount}))),{superType:t.type,component:n,rawOptions:t}}function Oo(e,t,n,r){let i=Ro(e),o=Ro(t.views);return H(function(e,t){let n,r={};for(n in e)ko(n,r,e,t);for(n in t)ko(n,r,e,t);return r}(i,o),e=>function(e,t,n,r,i){let o=e.overrides.duration||e.defaults.duration||r.duration||n.duration,s=null,a="",l="",c={};if(o&&(s=function(e){let t=JSON.stringify(e),n=Io[t];void 0===n&&(n=k(e),Io[t]=n);return n}(o),s)){let e=I(s);a=e.unit,1===e.value&&(l=a,c=t[a]?t[a].rawOptions:{})}let u=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null},d=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[l]?n[l]:null};return{type:e.type,component:e.component,duration:s,durationUnit:a,singleUnit:l,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},c),e.overrides),buttonTextOverride:u(r)||u(n)||e.overrides.buttonText,buttonTextDefault:u(i)||e.defaults.buttonText||u(ke)||e.type,buttonTitleOverride:d(r)||d(n)||e.overrides.buttonHint,buttonTitleDefault:d(i)||e.defaults.buttonHint||d(ke)}}(e,o,t,n,r))}To.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},To.prototype.baseIconClass="fc-icon",To.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},To.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},To.prototype.iconOverrideOption="buttonIcons",To.prototype.iconOverrideCustomButtonOption="icon",To.prototype.iconOverridePrefix="fc-icon-";let Io={};function Mo(e,t,n){let r=t?t.activeRange:null;return Ho({},function(e,t){let n=go(t),r=[].concat(e.eventSources||[]),i=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(let e of r){let r=po(e,t,n);r&&i.push(r)}return i}(e,n),r,n)}function No(e,t,n,r){let i=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return Ho(e,t.sources,i,r);case"REMOVE_EVENT_SOURCE":return o=e,s=t.sourceId,B(o,e=>e.sourceId!==s);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?Po(e,i,r):e;case"FETCH_EVENT_SOURCES":return Uo(e,t.sourceIds?P(t.sourceIds):zo(e,r),i,t.isRefetch||!1,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];if(i&&n===i.latestFetchId)return Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})});return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var o,s}function Bo(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function Ho(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=Po(i,n,r)),Object.assign(Object.assign({},e),i)}function Po(e,t,n){return Uo(e,B(e,e=>function(e,t,n){if(!Lo(e,n))return!e.latestFetchId;return!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end}(e,t,n)),t,!1,n)}function Uo(e,t,n,r,i){let o={};for(let s in e){let a=e[s];t[s]?o[s]=jo(a,n,r,i):o[s]=a}return o}function jo(e,t,n,r){let{options:i,calendarApi:o}=r,s=r.pluginHooks.eventSourceDefs[e.sourceDefId],a=v();return s.fetch({eventSource:e,range:t,isRefetch:n,context:r},n=>{let{rawEvents:s}=n;i.eventSourceSuccess&&(s=i.eventSourceSuccess.call(o,s,n.response)||s),e.success&&(s=e.success.call(o,s,n.response)||s),r.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:a,fetchRange:t,rawEvents:s})},n=>{let s=!1;i.eventSourceFailure&&(i.eventSourceFailure.call(o,n),s=!0),e.failure&&(e.failure(n),s=!0),s||console.warn(n.message,n),r.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:a,fetchRange:t,error:n})}),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:a})}function zo(e,t){return B(e,e=>Lo(e,t))}function Lo(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Fo(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function Vo(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function Wo(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Qo(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Go(e,t,n,r,i){return{header:e.headerToolbar?Zo(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?Zo(e.footerToolbar,e,t,n,r,i):null}}function Zo(e,t,n,r,i,o){let s={},a=[],l=!1;for(let c in e){let u=Yo(e[c],t,n,r,i,o);s[c]=u.widgets,a.push(...u.viewsWithButtons),l=l||u.hasTitle}return{sectionWidgets:s,viewsWithButtons:a,hasTitle:l}}function Yo(e,t,n,r,i,o){let s="rtl"===t.direction,a=t.customButtons||{},l=n.buttonText||{},c=t.buttonText||{},u=n.buttonHints||{},d=t.buttonHints||{},f=e?e.split(" "):[],h=[],p=!1;return{widgets:f.map(e=>e.split(",").map(e=>{if("title"===e)return p=!0,{buttonName:e};let n,f,g,m,v,A;if(n=a[e])g=e=>{n.click&&n.click.call(e.target,e,e.target)},(m=r.getCustomButtonIconClass(n))||(m=r.getIconClass(e,s))||(v=n.text),A=n.hint||n.text;else if(f=i[e]){h.push(e),g=()=>{o.changeView(e)},(v=f.buttonTextOverride)||(m=r.getIconClass(e,s))||(v=f.buttonTextDefault);let n=f.buttonTextOverride||f.buttonTextDefault;A=D(f.buttonTitleOverride||f.buttonTitleDefault||t.viewHint,[n,e],n)}else if(o[e])if(g=()=>{o[e]()},(v=l[e])||(m=r.getIconClass(e,s))||(v=c[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";A=D(u[t]||d[t],[c.year||"year","year"],c[e])}else A=t=>D(u[e]||d[e],[c[t]||t,t],c[e]);return{buttonName:e,buttonClick:g,buttonIcon:m,buttonText:v,buttonHint:A}})),viewsWithButtons:h,hasTitle:p}}class qo{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function Jo(e,t){let n=U(t.getCurrentData().eventSources),r=[];for(let t of e){let e=!1;for(let r=0;r<n.length;r+=1)if(n[r]._raw===t){n.splice(r,1),e=!0;break}e||r.push(t)}for(let e of n)t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:e.sourceId});for(let e of r)t.calendarApi.addEventSource(e)}const $o=[Co({name:"array-event-source",eventSourceDefs:[{ignoreRange:!0,parseMeta:e=>Array.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),Co({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:r}=e.context;Bt(e.eventSource.meta.bind(null,Wr(e.range,r)),e=>t({rawEvents:e}),n)}}]}),Co({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:He,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:r}=e.eventSource,i=function(e,t,n){let r,i,o,s,{dateEnv:a,options:l}=n,c={};r=e.startParam,null==r&&(r=l.startParam);i=e.endParam,null==i&&(i=l.endParam);o=e.timeZoneParam,null==o&&(o=l.timeZoneParam);s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Object.assign(c,s),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[o]=a.timeZone);return c}(r,e.range,e.context);Mi(r.method,r.url,i).then(([e,n])=>{t({rawEvents:e,response:n})},n)}}]}),Co({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let i,o={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(i=e.duration),!i&&e.startTime&&e.endTime&&(n=e.endTime,r=e.startTime,i={years:n.years-r.years,months:n.months-r.months,days:n.days-r.days,milliseconds:n.milliseconds-r.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:i,typeData:o}}var n,r;return null},expand(e,t,n){let r=vt(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){let i=e?P(e):null,o=X(n.start),s=n.end,a=[];for(;o<s;){let e;i&&!i[o.getUTCDay()]||(e=t?r.add(o,t):o,a.push(e)),o=G(o,1)}return a}(e.daysOfWeek,e.startTime,r,n):[]}}],eventRefiners:{daysOfWeek:He,startTime:k,endTime:k,duration:k,startRecur:He,endRecur:He}}),Co({name:"change-handler",optionChangeHandlers:{events(e,t){Jo([e],t)},eventSources:Jo}}),Co({name:"misc",isLoadingFuncs:[e=>Bo(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},Wr(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",Rr(e,t))}}})];class Xo{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new Ni(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function Ko(e,t,n){let r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,Se(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=$(e.currentRange.start,e.currentRange.end);if(null!==n&&n>1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class es{constructor(e){this.computeOptionsData=de(this._computeOptionsData),this.computeCurrentViewData=de(this._computeCurrentViewData),this.organizeRawLocales=de(_o),this.buildLocale=de(Eo),this.buildPluginHooks=wo(),this.buildDateEnv=de(ts),this.buildTheme=de(ns),this.parseToolbars=de(Go),this.buildViewSpecs=de(Oo),this.buildDateProfileGenerator=fe(rs),this.buildViewApi=de(is),this.buildViewUiProps=fe(as),this.buildEventUiBySource=de(os,j),this.buildEventUiBases=de(ss),this.parseContextBusinessHours=fe(cs),this.buildTitle=de(Ko),this.emitter=new Ht,this.actionRunner=new Xo(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),r=n.calendarOptions.initialView||n.pluginHooks.initialView,i=this.computeCurrentViewData(r,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(i.options);let o=function(e,t){let n=e.initialDate;return null!=n?t.createMarker(n):Ar(e.now,t)}(n.calendarOptions,n.dateEnv),s=i.dateProfileGenerator.build(o);_t(s.activeRange,o)||(o=s.currentRange.start);let a={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(a);let l=Mo(n.calendarOptions,s,a),c={dynamicOptionOverrides:t,currentViewType:r,currentDate:o,dateProfile:s,businessHours:this.parseContextBusinessHours(a),eventSources:l,eventUiBases:{},eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(a).selectionConfig},u=Object.assign(Object.assign({},a),c);for(let e of n.pluginHooks.reducers)Object.assign(c,e(null,null,u));ls(c,a)&&this.emitter.trigger("loading",!0),this.state=c,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;n.optionOverrides=t?Object.assign(Object.assign({},n.optionOverrides),e):e,this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:r}=this,i=function(e,t){switch(t.type){case"SET_OPTION":return Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue});default:return e}}(n.dynamicOptionOverrides,e),o=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),s=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":e=t.viewType}return e}(n.currentViewType,e),a=this.computeCurrentViewData(s,o,t.optionOverrides,i);t.calendarApi.currentDataManager=this,r.setThisContext(t.calendarApi),r.setOptions(a.options);let l={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:r,getCurrentData:this.getCurrentData},{currentDate:c,dateProfile:u}=n;this.data&&this.data.dateProfileGenerator!==a.dateProfileGenerator&&(u=a.dateProfileGenerator.build(c)),c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),u=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(u,e,c,a.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&_t(u.currentRange,c)||(c=u.currentRange.start);let d=No(n.eventSources,e,u,l),f=Di(n.eventStore,e,d,u,l),h=Bo(d)&&!a.options.progressiveEventRendering&&n.renderableEventStore||f,{eventUiSingleBase:p,selectionConfig:g}=this.buildViewUiProps(l),m=this.buildEventUiBySource(d),v={dynamicOptionOverrides:i,currentViewType:s,currentDate:c,dateProfile:u,eventSources:d,eventStore:f,renderableEventStore:h,selectionConfig:g,eventUiBases:this.buildEventUiBases(h.defs,p,m),businessHours:this.parseContextBusinessHours(l),dateSelection:Fo(n.dateSelection,e),eventSelection:Vo(n.eventSelection,e),eventDrag:Wo(n.eventDrag,e),eventResize:Qo(n.eventResize,e)},A=Object.assign(Object.assign({},l),v);for(let t of o.pluginHooks.reducers)Object.assign(v,t(n,e,A));let b=ls(n,l),y=ls(v,l);!b&&y?r.trigger("loading",!0):b&&!y&&r.trigger("loading",!1),this.state=v,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,r=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),i=this.computeCurrentViewData(t.currentViewType,r,e.optionOverrides,t.dynamicOptionOverrides),o=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,i.options,r.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},r),i),t),s=r.pluginHooks.optionChangeHandlers,a=n&&n.calendarOptions,l=r.calendarOptions;if(a&&a!==l){a.timeZone!==l.timeZone&&(t.eventSources=o.eventSources=function(e,t,n){let r=t?t.activeRange:null;return Uo(e,zo(e,n),r,!0,n)}(o.eventSources,t.dateProfile,o),t.eventStore=o.eventStore=function(e,t,n){let{defs:r}=e,i=H(e.instances,e=>{let i=r[e.defId];return i.allDay||i.recurringDef?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}(o.eventStore,n.dateEnv,o.dateEnv));for(let e in s)a[e]!==l[e]&&s[e](l[e],o)}e.onData&&e.onData(o)}_computeOptionsData(e,t,n){let{refinedOptions:r,pluginHooks:i,localeDefaults:o,availableLocaleData:s,extra:a}=this.processRawCalendarOptions(e,t);us(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,s,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,e,t,o),u=this.buildTheme(r,i);return{calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:u,toolbarConfig:this.parseToolbars(r,e,u,c,n),localeDefaults:o,availableRawLocales:s.map}}processRawCalendarOptions(e,t){let{locales:n,locale:r}=Ne([ke,e,t]),i=this.organizeRawLocales(n),o=i.map,s=this.buildLocale(r||i.defaultCode,o).options,a=this.buildPluginHooks(e.plugins||[],$o),l=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Te),Re),xe),a.listenerRefiners),a.optionRefiners),c={},u=Ne([ke,s,e,t]),d={},f=this.currentCalendarOptionsInput,h=this.currentCalendarOptionsRefined,p=!1;for(let e in u)"plugins"!==e&&(u[e]===f[e]||Oe[e]&&e in f&&Oe[e](f[e],u[e])?d[e]=h[e]:l[e]?(d[e]=l[e](u[e]),p=!0):c[e]=f[e]);return p&&(this.currentCalendarOptionsInput=u,this.currentCalendarOptionsRefined=d),{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:a,availableLocaleData:i,localeDefaults:s,extra:c}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:o,extra:s}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return us(s),{viewSpec:i,options:o,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:o.slotMinTime,slotMaxTime:o.slotMaxTime,showNonCurrentDates:o.showNonCurrentDates,dayCount:o.dayCount,dateAlignment:o.dateAlignment,dateIncrement:o.dateIncrement,hiddenDays:o.hiddenDays,weekends:o.weekends,nowInput:o.now,validRangeInput:o.validRange,visibleRangeInput:o.visibleRange,monthMode:o.monthMode,fixedWeekCount:o.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,r,i){let o=Ne([ke,e.optionDefaults,n,r,e.optionOverrides,i]),s=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},Te),Re),xe),Me),t.listenerRefiners),t.optionRefiners),a={},l=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,u=!1,d={};for(let e in o)o[e]===l[e]||Oe[e]&&Oe[e](o[e],l[e])?a[e]=c[e]:(o[e]===this.currentCalendarOptionsInput[e]||Oe[e]&&Oe[e](o[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(a[e]=this.currentCalendarOptionsRefined[e]):s[e]?a[e]=s[e](o[e]):d[e]=o[e],u=!0);return u&&(this.currentViewOptionsInput=o,this.currentViewOptionsRefined=a),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:d}}}function ts(e,t,n,r,i,o,s,a){let l=Eo(t||s.defaultCode,s.map);return new $r({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:o.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:i,cmdFormatter:o.cmdFormatter,defaultSeparator:a})}function ns(e,t){return new(t.themeClasses[e.themeSystem]||To)(e)}function rs(e){return new(e.dateProfileGeneratorClass||br)(e)}function is(e,t,n){return new qo(e,t,n)}function os(e){return H(e,e=>e.ui)}function ss(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function as(e){let{options:t}=e;return{eventUiSingleBase:qe({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:qe({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function ls(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function cs(e){return st(e.options.businessHours,e)}function us(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class ds extends gr{render(){return Xt("div",{className:"fc-toolbar-chunk"},...this.props.widgetGroups.map(e=>this.renderWidgetGroup(e)))}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],i=!0;for(let o of e){let{buttonName:e,buttonClick:s,buttonText:a,buttonIcon:l,buttonHint:c}=o;if("title"===e)i=!1,r.push(Xt("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let i=e===t.activeButton,o=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,u=[`fc-${e}-button`,n.getClass("button")];i&&u.push(n.getClass("buttonActive")),r.push(Xt("button",{type:"button",title:"function"==typeof c?c(t.navUnit):c,disabled:o,"aria-pressed":i,className:u.join(" "),onClick:s},a||(l?Xt("span",{className:l}):"")))}}if(r.length>1){return Xt("div",{className:i&&n.getClass("buttonGroup")||""},...r)}return r[0]}}class fs extends gr{render(){let e,t,{model:n,extraClassName:r}=this.props,i=!1,o=n.sectionWidgets,s=o.center;return o.left?(i=!0,e=o.left):e=o.start,o.right?(i=!0,t=o.right):t=o.end,Xt("div",{className:[r||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return Xt(ds,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})}}class hs extends gr{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,mr(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],i="",o="";return n?null!==t.availableWidth?i=t.availableWidth/n:o=1/n*100+"%":i=e.height||"",Xt("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:i,paddingBottom:o}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class ps extends ri{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:r}=this,{context:i}=r,o=Ir(t);if(o&&r.isValidSegDownEl(e.target)){let s=n(e.target,".fc-event-forced-url"),a=s?s.querySelector("a[href]").href:"";i.emitter.trigger("eventClick",{el:t,event:new Tr(r.context,o.eventRange.def,o.eventRange.instance),jsEvent:e,view:i.viewApi}),a&&!e.defaultPrevented&&(window.location.href=a)}},this.destroy=f(e.el,"click",".fc-event",this.handleSegClick)}}class gs extends ri{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{Ir(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=function(e,t,n,r){let i;return f(e,"mouseover",t,(e,t)=>{if(t!==i){i=t,n(e,t);let o=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",o)};t.addEventListener("mouseleave",o)}})}(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:r}=this,{context:i}=r,o=Ir(n);t&&!r.isValidSegDownEl(t.target)||i.emitter.trigger(e,{el:n,event:new Tr(i,o.eventRange.def,o.eventRange.instance),jsEvent:t,view:i.viewApi})}}class ms extends pr{constructor(){super(...arguments),this.buildViewContext=de(hr),this.buildViewPropTransformers=de(As),this.buildToolbarProps=de(vs),this.headerRef={current:null},this.footerRef={current:null},this.interactionsStore={},this.state={viewLabelId:u()},this.registerInteractiveComponent=(e,t)=>{let n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}(e,t),r=[ps,gs].concat(this.props.pluginHooks.componentInteractions).map(e=>new e(n));this.interactionsStore[e.uid]=r,ii[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete ii[e.uid]},this.resizeRunner=new Ni(()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})}),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:r}=t,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,Ar(t.options.now,t.dateEnv),t.viewTitle),o=!1,s="";t.isHeightAuto||t.forPrint?s="":null!=r.height?o=!0:null!=r.contentHeight?s=r.contentHeight:e=Math.max(r.aspectRatio,.5);let a=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),l=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return Xt(fr.Provider,{value:a},n.header&&Xt(fs,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:l},i)),Xt(hs,{liquid:o,height:s,aspectRatio:e,labeledById:l},this.renderView(t),this.buildAppendContent()),n.footer&&Xt(fs,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},i)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map(t=>new t(e)),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this;return Xt(tn,{},...e.pluginHooks.viewContainerAppends.map(t=>t(e)))}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of i)Object.assign(r,t.transform(r,e));return Xt(n.component,Object.assign({},r))}}function vs(e,t,n,r,i,o){let s=n.build(i,void 0,!1),a=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:o,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:s.isValid&&!_t(t.currentRange,i),isPrevEnabled:a.isValid,isNextEnabled:l.isValid}}function As(e){return e.map(e=>new e)}function bs(e){let t=Eo(e.locale||"en",_o([]).map);return new $r(Object.assign(Object.assign({timeZone:ke.timeZone,calendarSystem:"gregory"},e),{locale:t}))}return e.Calendar=class extends mo{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;ar(()=>{En(Xt(si,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(t,n,r,i)=>(this.setClassNames(t),this.setHeight(n),Xt(hi.Provider,{value:this.customContentRenderId},Xt(ms,Object.assign({isHeightAuto:r,forPrint:i},e))))),this.el)})}else this.isRendered&&(this.isRendered=!1,En(null,this.el),this.setClassNames([]),this.setHeight(""))},this.el=e,this.renderRunner=new Ni(this.handleRenderRequest),new es({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){ar(()=>{super.updateSize()})}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!ue(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){a(this.el,"height",e)}},e.Internal=vo,e.JsonRequestError=Ii,e.Preact=ur,e.createPlugin=Co,e.formatDate=function(e,t={}){let n=bs(t),r=Se(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatRange=function(e,t,n){let r=bs("object"==typeof n&&n?n:{}),i=Se(n),o=r.createMarkerMeta(e),s=r.createMarkerMeta(t);return o&&s?r.formatRange(o.marker,s.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:s.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:ke.defaultRangeSeparator}):""},e.globalLocales=Ao,e.globalPlugins=$o,e.sliceEvents=function(e,t){return xr(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.version="6.0.3",Object.defineProperty(e,"__esModule",{value:!0}),e}({}); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales-all.global.js b/library/fullcalendar/packages/core/locales-all.global.js
new file mode 100644
index 000000000..5333ce07d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales-all.global.js
@@ -0,0 +1,1794 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var l0 = {
+ code: 'af',
+ week: {
+ dow: 1,
+ doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ },
+ buttonText: {
+ prev: 'Vorige',
+ next: 'Volgende',
+ today: 'Vandag',
+ year: 'Jaar',
+ month: 'Maand',
+ week: 'Week',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ allDayText: 'Heeldag',
+ moreLinkText: 'Addisionele',
+ noEventsText: 'Daar is geen gebeurtenisse nie',
+ };
+
+ var l1 = {
+ code: 'ar-dz',
+ week: {
+ dow: 0,
+ doy: 4, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l2 = {
+ code: 'ar-kw',
+ week: {
+ dow: 0,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l3 = {
+ code: 'ar-ly',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l4 = {
+ code: 'ar-ma',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l5 = {
+ code: 'ar-sa',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l6 = {
+ code: 'ar-tn',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l7 = {
+ code: 'ar',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ var l8 = {
+ code: 'az',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Əvvəl',
+ next: 'Sonra',
+ today: 'Bu Gün',
+ month: 'Ay',
+ week: 'Həftə',
+ day: 'Gün',
+ list: 'Gündəm',
+ },
+ weekText: 'Həftə',
+ allDayText: 'Bütün Gün',
+ moreLinkText(n) {
+ return '+ daha çox ' + n;
+ },
+ noEventsText: 'Göstərmək üçün hadisə yoxdur',
+ };
+
+ var l9 = {
+ code: 'bg',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'назад',
+ next: 'напред',
+ today: 'днес',
+ month: 'Месец',
+ week: 'Седмица',
+ day: 'Ден',
+ list: 'График',
+ },
+ allDayText: 'Цял ден',
+ moreLinkText(n) {
+ return '+още ' + n;
+ },
+ noEventsText: 'Няма събития за показване',
+ };
+
+ var l10 = {
+ code: 'bn',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'পেছনে',
+ next: 'সামনে',
+ today: 'আজ',
+ month: 'মাস',
+ week: 'সপ্তাহ',
+ day: 'দিন',
+ list: 'তালিকা',
+ },
+ weekText: 'সপ্তাহ',
+ allDayText: 'সারাদিন',
+ moreLinkText(n) {
+ return '+অন্যান্য ' + n;
+ },
+ noEventsText: 'কোনো ইভেন্ট নেই',
+ };
+
+ var l11 = {
+ code: 'bs',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prošli',
+ next: 'Sljedeći',
+ today: 'Danas',
+ month: 'Mjesec',
+ week: 'Sedmica',
+ day: 'Dan',
+ list: 'Raspored',
+ },
+ weekText: 'Sed',
+ allDayText: 'Cijeli dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nema događaja za prikazivanje',
+ };
+
+ var l12 = {
+ code: 'ca',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Següent',
+ today: 'Avui',
+ month: 'Mes',
+ week: 'Setmana',
+ day: 'Dia',
+ list: 'Agenda',
+ },
+ weekText: 'Set',
+ allDayText: 'Tot el dia',
+ moreLinkText: 'més',
+ noEventsText: 'No hi ha esdeveniments per mostrar',
+ };
+
+ var l13 = {
+ code: 'cs',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Dříve',
+ next: 'Později',
+ today: 'Nyní',
+ month: 'Měsíc',
+ week: 'Týden',
+ day: 'Den',
+ list: 'Agenda',
+ },
+ weekText: 'Týd',
+ allDayText: 'Celý den',
+ moreLinkText(n) {
+ return '+další: ' + n;
+ },
+ noEventsText: 'Žádné akce k zobrazení',
+ };
+
+ var l14 = {
+ code: 'cy',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Blaenorol',
+ next: 'Nesaf',
+ today: 'Heddiw',
+ year: 'Blwyddyn',
+ month: 'Mis',
+ week: 'Wythnos',
+ day: 'Dydd',
+ list: 'Rhestr',
+ },
+ weekText: 'Wythnos',
+ allDayText: 'Trwy\'r dydd',
+ moreLinkText: 'Mwy',
+ noEventsText: 'Dim digwyddiadau',
+ };
+
+ var l15 = {
+ code: 'da',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Forrige',
+ next: 'Næste',
+ today: 'I dag',
+ month: 'Måned',
+ week: 'Uge',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Uge',
+ allDayText: 'Hele dagen',
+ moreLinkText: 'flere',
+ noEventsText: 'Ingen arrangementer at vise',
+ };
+
+ function affix$1(buttonText) {
+ return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
+ buttonText === 'Jahr' ? 's' : '';
+ }
+ var l16 = {
+ code: 'de-at',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zurück',
+ next: 'Vor',
+ today: 'Heute',
+ year: 'Jahr',
+ month: 'Monat',
+ week: 'Woche',
+ day: 'Tag',
+ list: 'Terminübersicht',
+ },
+ weekText: 'KW',
+ weekTextLong: 'Woche',
+ allDayText: 'Ganztägig',
+ moreLinkText(n) {
+ return '+ weitere ' + n;
+ },
+ noEventsText: 'Keine Ereignisse anzuzeigen',
+ buttonHints: {
+ prev(buttonText) {
+ return `Vorherige${affix$1(buttonText)} ${buttonText}`;
+ },
+ next(buttonText) {
+ return `Nächste${affix$1(buttonText)} ${buttonText}`;
+ },
+ today(buttonText) {
+ // → Heute, Diese Woche, Dieser Monat, Dieses Jahr
+ if (buttonText === 'Tag') {
+ return 'Heute';
+ }
+ return `Diese${affix$1(buttonText)} ${buttonText}`;
+ },
+ },
+ viewHint(buttonText) {
+ // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
+ const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
+ return buttonText + glue + 'ansicht';
+ },
+ navLinkHint: 'Gehe zu $0',
+ moreLinkHint(eventCnt) {
+ return 'Zeige ' + (eventCnt === 1 ?
+ 'ein weiteres Ereignis' :
+ eventCnt + ' weitere Ereignisse');
+ },
+ closeHint: 'Schließen',
+ timeHint: 'Uhrzeit',
+ eventHint: 'Ereignis',
+ };
+
+ function affix(buttonText) {
+ return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
+ buttonText === 'Jahr' ? 's' : '';
+ }
+ var l17 = {
+ code: 'de',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zurück',
+ next: 'Vor',
+ today: 'Heute',
+ year: 'Jahr',
+ month: 'Monat',
+ week: 'Woche',
+ day: 'Tag',
+ list: 'Terminübersicht',
+ },
+ weekText: 'KW',
+ weekTextLong: 'Woche',
+ allDayText: 'Ganztägig',
+ moreLinkText(n) {
+ return '+ weitere ' + n;
+ },
+ noEventsText: 'Keine Ereignisse anzuzeigen',
+ buttonHints: {
+ prev(buttonText) {
+ return `Vorherige${affix(buttonText)} ${buttonText}`;
+ },
+ next(buttonText) {
+ return `Nächste${affix(buttonText)} ${buttonText}`;
+ },
+ today(buttonText) {
+ // → Heute, Diese Woche, Dieser Monat, Dieses Jahr
+ if (buttonText === 'Tag') {
+ return 'Heute';
+ }
+ return `Diese${affix(buttonText)} ${buttonText}`;
+ },
+ },
+ viewHint(buttonText) {
+ // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
+ const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
+ return buttonText + glue + 'ansicht';
+ },
+ navLinkHint: 'Gehe zu $0',
+ moreLinkHint(eventCnt) {
+ return 'Zeige ' + (eventCnt === 1 ?
+ 'ein weiteres Ereignis' :
+ eventCnt + ' weitere Ereignisse');
+ },
+ closeHint: 'Schließen',
+ timeHint: 'Uhrzeit',
+ eventHint: 'Ereignis',
+ };
+
+ var l18 = {
+ code: 'el',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Προηγούμενος',
+ next: 'Επόμενος',
+ today: 'Σήμερα',
+ month: 'Μήνας',
+ week: 'Εβδομάδα',
+ day: 'Ημέρα',
+ list: 'Ατζέντα',
+ },
+ weekText: 'Εβδ',
+ allDayText: 'Ολοήμερο',
+ moreLinkText: 'περισσότερα',
+ noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
+ };
+
+ var l19 = {
+ code: 'en-au',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ var l20 = {
+ code: 'en-gb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ var l21 = {
+ code: 'en-nz',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ var l22 = {
+ code: 'eo',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Antaŭa',
+ next: 'Sekva',
+ today: 'Hodiaŭ',
+ month: 'Monato',
+ week: 'Semajno',
+ day: 'Tago',
+ list: 'Tagordo',
+ },
+ weekText: 'Sm',
+ allDayText: 'Tuta tago',
+ moreLinkText: 'pli',
+ noEventsText: 'Neniuj eventoj por montri',
+ };
+
+ var l23 = {
+ code: 'es',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Sig',
+ today: 'Hoy',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Agenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Todo el día',
+ moreLinkText: 'más',
+ noEventsText: 'No hay eventos para mostrar',
+ };
+
+ var l24 = {
+ code: 'es',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Sig',
+ today: 'Hoy',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Agenda',
+ },
+ buttonHints: {
+ prev: '$0 antes',
+ next: '$0 siguiente',
+ today(buttonText) {
+ return (buttonText === 'Día') ? 'Hoy' :
+ ((buttonText === 'Semana') ? 'Esta' : 'Este') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ },
+ viewHint(buttonText) {
+ return 'Vista ' + (buttonText === 'Semana' ? 'de la' : 'del') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ weekText: 'Sm',
+ weekTextLong: 'Semana',
+ allDayText: 'Todo el día',
+ moreLinkText: 'más',
+ moreLinkHint(eventCnt) {
+ return `Mostrar ${eventCnt} eventos más`;
+ },
+ noEventsText: 'No hay eventos para mostrar',
+ navLinkHint: 'Ir al $0',
+ closeHint: 'Cerrar',
+ timeHint: 'La hora',
+ eventHint: 'Evento',
+ };
+
+ var l25 = {
+ code: 'et',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Eelnev',
+ next: 'Järgnev',
+ today: 'Täna',
+ month: 'Kuu',
+ week: 'Nädal',
+ day: 'Päev',
+ list: 'Päevakord',
+ },
+ weekText: 'näd',
+ allDayText: 'Kogu päev',
+ moreLinkText(n) {
+ return '+ veel ' + n;
+ },
+ noEventsText: 'Kuvamiseks puuduvad sündmused',
+ };
+
+ var l26 = {
+ code: 'eu',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Aur',
+ next: 'Hur',
+ today: 'Gaur',
+ month: 'Hilabetea',
+ week: 'Astea',
+ day: 'Eguna',
+ list: 'Agenda',
+ },
+ weekText: 'As',
+ allDayText: 'Egun osoa',
+ moreLinkText: 'gehiago',
+ noEventsText: 'Ez dago ekitaldirik erakusteko',
+ };
+
+ var l27 = {
+ code: 'fa',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'قبلی',
+ next: 'بعدی',
+ today: 'امروز',
+ month: 'ماه',
+ week: 'هفته',
+ day: 'روز',
+ list: 'برنامه',
+ },
+ weekText: 'هف',
+ allDayText: 'تمام روز',
+ moreLinkText(n) {
+ return 'بیش از ' + n;
+ },
+ noEventsText: 'هیچ رویدادی به نمایش',
+ };
+
+ var l28 = {
+ code: 'fi',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Edellinen',
+ next: 'Seuraava',
+ today: 'Tänään',
+ month: 'Kuukausi',
+ week: 'Viikko',
+ day: 'Päivä',
+ list: 'Tapahtumat',
+ },
+ weekText: 'Vk',
+ allDayText: 'Koko päivä',
+ moreLinkText: 'lisää',
+ noEventsText: 'Ei näytettäviä tapahtumia',
+ };
+
+ var l29 = {
+ code: 'fr',
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Aujourd\'hui',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Mon planning',
+ },
+ weekText: 'Sem.',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ var l30 = {
+ code: 'fr-ch',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Courant',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Mon planning',
+ },
+ weekText: 'Sm',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ var l31 = {
+ code: 'fr',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Aujourd\'hui',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Planning',
+ },
+ weekText: 'Sem.',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ var l32 = {
+ code: 'gl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Seg',
+ today: 'Hoxe',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Axenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Todo o día',
+ moreLinkText: 'máis',
+ noEventsText: 'Non hai eventos para amosar',
+ };
+
+ var l33 = {
+ code: 'he',
+ direction: 'rtl',
+ buttonText: {
+ prev: 'הקודם',
+ next: 'הבא',
+ today: 'היום',
+ month: 'חודש',
+ week: 'שבוע',
+ day: 'יום',
+ list: 'סדר יום',
+ },
+ allDayText: 'כל היום',
+ moreLinkText: 'אחר',
+ noEventsText: 'אין אירועים להצגה',
+ weekText: 'שבוע',
+ };
+
+ var l34 = {
+ code: 'hi',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'पिछला',
+ next: 'अगला',
+ today: 'आज',
+ month: 'महीना',
+ week: 'सप्ताह',
+ day: 'दिन',
+ list: 'कार्यसूची',
+ },
+ weekText: 'हफ्ता',
+ allDayText: 'सभी दिन',
+ moreLinkText(n) {
+ return '+अधिक ' + n;
+ },
+ noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए',
+ };
+
+ var l35 = {
+ code: 'hr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prijašnji',
+ next: 'Sljedeći',
+ today: 'Danas',
+ month: 'Mjesec',
+ week: 'Tjedan',
+ day: 'Dan',
+ list: 'Raspored',
+ },
+ weekText: 'Tje',
+ allDayText: 'Cijeli dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nema događaja za prikaz',
+ };
+
+ var l36 = {
+ code: 'hu',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'vissza',
+ next: 'előre',
+ today: 'ma',
+ month: 'Hónap',
+ week: 'Hét',
+ day: 'Nap',
+ list: 'Lista',
+ },
+ weekText: 'Hét',
+ allDayText: 'Egész nap',
+ moreLinkText: 'további',
+ noEventsText: 'Nincs megjeleníthető esemény',
+ };
+
+ var l37 = {
+ code: 'hy-am',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Նախորդ',
+ next: 'Հաջորդ',
+ today: 'Այսօր',
+ month: 'Ամիս',
+ week: 'Շաբաթ',
+ day: 'Օր',
+ list: 'Օրվա ցուցակ',
+ },
+ weekText: 'Շաբ',
+ allDayText: 'Ամբողջ օր',
+ moreLinkText(n) {
+ return '+ ևս ' + n;
+ },
+ noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու',
+ };
+
+ var l38 = {
+ code: 'id',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'mundur',
+ next: 'maju',
+ today: 'hari ini',
+ month: 'Bulan',
+ week: 'Minggu',
+ day: 'Hari',
+ list: 'Agenda',
+ },
+ weekText: 'Mg',
+ allDayText: 'Sehari penuh',
+ moreLinkText: 'lebih',
+ noEventsText: 'Tidak ada acara untuk ditampilkan',
+ };
+
+ var l39 = {
+ code: 'is',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Fyrri',
+ next: 'Næsti',
+ today: 'Í dag',
+ month: 'Mánuður',
+ week: 'Vika',
+ day: 'Dagur',
+ list: 'Dagskrá',
+ },
+ weekText: 'Vika',
+ allDayText: 'Allan daginn',
+ moreLinkText: 'meira',
+ noEventsText: 'Engir viðburðir til að sýna',
+ };
+
+ var l40 = {
+ code: 'it',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prec',
+ next: 'Succ',
+ today: 'Oggi',
+ month: 'Mese',
+ week: 'Settimana',
+ day: 'Giorno',
+ list: 'Agenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Tutto il giorno',
+ moreLinkText(n) {
+ return '+altri ' + n;
+ },
+ noEventsText: 'Non ci sono eventi da visualizzare',
+ };
+
+ var l41 = {
+ code: 'ja',
+ buttonText: {
+ prev: '前',
+ next: '次',
+ today: '今日',
+ month: '月',
+ week: '週',
+ day: '日',
+ list: '予定リスト',
+ },
+ weekText: '週',
+ allDayText: '終日',
+ moreLinkText(n) {
+ return '他 ' + n + ' 件';
+ },
+ noEventsText: '表示する予定はありません',
+ };
+
+ var l42 = {
+ code: 'ka',
+ week: {
+ dow: 1,
+ doy: 7,
+ },
+ buttonText: {
+ prev: 'წინა',
+ next: 'შემდეგი',
+ today: 'დღეს',
+ month: 'თვე',
+ week: 'კვირა',
+ day: 'დღე',
+ list: 'დღის წესრიგი',
+ },
+ weekText: 'კვ',
+ allDayText: 'მთელი დღე',
+ moreLinkText(n) {
+ return '+ კიდევ ' + n;
+ },
+ noEventsText: 'ღონისძიებები არ არის',
+ };
+
+ var l43 = {
+ code: 'kk',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Алдыңғы',
+ next: 'Келесі',
+ today: 'Бүгін',
+ month: 'Ай',
+ week: 'Апта',
+ day: 'Күн',
+ list: 'Күн тәртібі',
+ },
+ weekText: 'Не',
+ allDayText: 'Күні бойы',
+ moreLinkText(n) {
+ return '+ тағы ' + n;
+ },
+ noEventsText: 'Көрсету үшін оқиғалар жоқ',
+ };
+
+ var l44 = {
+ code: 'km',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'មុន',
+ next: 'បន្ទាប់',
+ today: 'ថ្ងៃនេះ',
+ year: 'ឆ្នាំ',
+ month: 'ខែ',
+ week: 'សប្តាហ៍',
+ day: 'ថ្ងៃ',
+ list: 'បញ្ជី',
+ },
+ weekText: 'សប្តាហ៍',
+ allDayText: 'ពេញមួយថ្ងៃ',
+ moreLinkText: 'ច្រើនទៀត',
+ noEventsText: 'គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ',
+ };
+
+ var l45 = {
+ code: 'ko',
+ buttonText: {
+ prev: '이전달',
+ next: '다음달',
+ today: '오늘',
+ month: '월',
+ week: '주',
+ day: '일',
+ list: '일정목록',
+ },
+ weekText: '주',
+ allDayText: '종일',
+ moreLinkText: '개',
+ noEventsText: '일정이 없습니다',
+ };
+
+ var l46 = {
+ code: 'ku',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'پێشتر',
+ next: 'دواتر',
+ today: 'ئەمڕو',
+ month: 'مانگ',
+ week: 'هەفتە',
+ day: 'ڕۆژ',
+ list: 'بەرنامە',
+ },
+ weekText: 'هەفتە',
+ allDayText: 'هەموو ڕۆژەکە',
+ moreLinkText: 'زیاتر',
+ noEventsText: 'هیچ ڕووداوێك نیە',
+ };
+
+ var l47 = {
+ code: 'lb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zréck',
+ next: 'Weider',
+ today: 'Haut',
+ month: 'Mount',
+ week: 'Woch',
+ day: 'Dag',
+ list: 'Terminiwwersiicht',
+ },
+ weekText: 'W',
+ allDayText: 'Ganzen Dag',
+ moreLinkText: 'méi',
+ noEventsText: 'Nee Evenementer ze affichéieren',
+ };
+
+ var l48 = {
+ code: 'lt',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Atgal',
+ next: 'Pirmyn',
+ today: 'Šiandien',
+ month: 'Mėnuo',
+ week: 'Savaitė',
+ day: 'Diena',
+ list: 'Darbotvarkė',
+ },
+ weekText: 'SAV',
+ allDayText: 'Visą dieną',
+ moreLinkText: 'daugiau',
+ noEventsText: 'Nėra įvykių rodyti',
+ };
+
+ var l49 = {
+ code: 'lv',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Iepr.',
+ next: 'Nāk.',
+ today: 'Šodien',
+ month: 'Mēnesis',
+ week: 'Nedēļa',
+ day: 'Diena',
+ list: 'Dienas kārtība',
+ },
+ weekText: 'Ned.',
+ allDayText: 'Visu dienu',
+ moreLinkText(n) {
+ return '+vēl ' + n;
+ },
+ noEventsText: 'Nav notikumu',
+ };
+
+ var l50 = {
+ code: 'mk',
+ buttonText: {
+ prev: 'претходно',
+ next: 'следно',
+ today: 'Денес',
+ month: 'Месец',
+ week: 'Недела',
+ day: 'Ден',
+ list: 'График',
+ },
+ weekText: 'Сед',
+ allDayText: 'Цел ден',
+ moreLinkText(n) {
+ return '+повеќе ' + n;
+ },
+ noEventsText: 'Нема настани за прикажување',
+ };
+
+ var l51 = {
+ code: 'ms',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Sebelum',
+ next: 'Selepas',
+ today: 'hari ini',
+ month: 'Bulan',
+ week: 'Minggu',
+ day: 'Hari',
+ list: 'Agenda',
+ },
+ weekText: 'Mg',
+ allDayText: 'Sepanjang hari',
+ moreLinkText(n) {
+ return 'masih ada ' + n + ' acara';
+ },
+ noEventsText: 'Tiada peristiwa untuk dipaparkan',
+ };
+
+ var l52 = {
+ code: 'nb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Forrige',
+ next: 'Neste',
+ today: 'I dag',
+ month: 'Måned',
+ week: 'Uke',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Uke',
+ weekTextLong: 'Uke',
+ allDayText: 'Hele dagen',
+ moreLinkText: 'til',
+ noEventsText: 'Ingen hendelser å vise',
+ buttonHints: {
+ prev: 'Forrige $0',
+ next: 'Neste $0',
+ today: 'Nåværende $0',
+ },
+ viewHint: '$0 visning',
+ navLinkHint: 'Gå til $0',
+ moreLinkHint(eventCnt) {
+ return `Vis ${eventCnt} flere hendelse${eventCnt === 1 ? '' : 'r'}`;
+ },
+ };
+
+ var l53 = {
+ code: 'ne',
+ week: {
+ dow: 7,
+ doy: 1, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'अघिल्लो',
+ next: 'अर्को',
+ today: 'आज',
+ month: 'महिना',
+ week: 'हप्ता',
+ day: 'दिन',
+ list: 'सूची',
+ },
+ weekText: 'हप्ता',
+ allDayText: 'दिनभरि',
+ moreLinkText: 'थप लिंक',
+ noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्',
+ };
+
+ var l54 = {
+ code: 'nl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Vorige',
+ next: 'Volgende',
+ today: 'Vandaag',
+ year: 'Jaar',
+ month: 'Maand',
+ week: 'Week',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ allDayText: 'Hele dag',
+ moreLinkText: 'extra',
+ noEventsText: 'Geen evenementen om te laten zien',
+ };
+
+ var l55 = {
+ code: 'nn',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Førre',
+ next: 'Neste',
+ today: 'I dag',
+ month: 'Månad',
+ week: 'Veke',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Veke',
+ allDayText: 'Heile dagen',
+ moreLinkText: 'til',
+ noEventsText: 'Ingen hendelser å vise',
+ };
+
+ var l56 = {
+ code: 'pl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Poprzedni',
+ next: 'Następny',
+ today: 'Dziś',
+ month: 'Miesiąc',
+ week: 'Tydzień',
+ day: 'Dzień',
+ list: 'Plan dnia',
+ },
+ weekText: 'Tydz',
+ allDayText: 'Cały dzień',
+ moreLinkText: 'więcej',
+ noEventsText: 'Brak wydarzeń do wyświetlenia',
+ };
+
+ var l57 = {
+ code: 'pt-br',
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Próximo',
+ today: 'Hoje',
+ month: 'Mês',
+ week: 'Semana',
+ day: 'Dia',
+ list: 'Lista',
+ },
+ weekText: 'Sm',
+ allDayText: 'dia inteiro',
+ moreLinkText(n) {
+ return 'mais +' + n;
+ },
+ noEventsText: 'Não há eventos para mostrar',
+ };
+
+ var l58 = {
+ code: 'pt',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Seguinte',
+ today: 'Hoje',
+ month: 'Mês',
+ week: 'Semana',
+ day: 'Dia',
+ list: 'Agenda',
+ },
+ weekText: 'Sem',
+ allDayText: 'Todo o dia',
+ moreLinkText: 'mais',
+ noEventsText: 'Não há eventos para mostrar',
+ };
+
+ var l59 = {
+ code: 'ro',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'precedentă',
+ next: 'următoare',
+ today: 'Azi',
+ month: 'Lună',
+ week: 'Săptămână',
+ day: 'Zi',
+ list: 'Agendă',
+ },
+ weekText: 'Săpt',
+ allDayText: 'Toată ziua',
+ moreLinkText(n) {
+ return '+alte ' + n;
+ },
+ noEventsText: 'Nu există evenimente de afișat',
+ };
+
+ var l60 = {
+ code: 'ru',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Пред',
+ next: 'След',
+ today: 'Сегодня',
+ month: 'Месяц',
+ week: 'Неделя',
+ day: 'День',
+ list: 'Повестка дня',
+ },
+ weekText: 'Нед',
+ allDayText: 'Весь день',
+ moreLinkText(n) {
+ return '+ ещё ' + n;
+ },
+ noEventsText: 'Нет событий для отображения',
+ };
+
+ var l61 = {
+ code: 'si-lk',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'පෙර',
+ next: 'පසු',
+ today: 'අද',
+ month: 'මාසය',
+ week: 'සතිය',
+ day: 'දවස',
+ list: 'ලැයිස්තුව',
+ },
+ weekText: 'සති',
+ allDayText: 'සියලු',
+ moreLinkText: 'තවත්',
+ noEventsText: 'මුකුත් නැත',
+ };
+
+ var l62 = {
+ code: 'sk',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Predchádzajúci',
+ next: 'Nasledujúci',
+ today: 'Dnes',
+ month: 'Mesiac',
+ week: 'Týždeň',
+ day: 'Deň',
+ list: 'Rozvrh',
+ },
+ weekText: 'Ty',
+ allDayText: 'Celý deň',
+ moreLinkText(n) {
+ return '+ďalšie: ' + n;
+ },
+ noEventsText: 'Žiadne akcie na zobrazenie',
+ };
+
+ var l63 = {
+ code: 'sl',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prejšnji',
+ next: 'Naslednji',
+ today: 'Trenutni',
+ month: 'Mesec',
+ week: 'Teden',
+ day: 'Dan',
+ list: 'Dnevni red',
+ },
+ weekText: 'Teden',
+ allDayText: 'Ves dan',
+ moreLinkText: 'več',
+ noEventsText: 'Ni dogodkov za prikaz',
+ };
+
+ var l64 = {
+ code: 'sm',
+ buttonText: {
+ prev: 'Talu ai',
+ next: 'Mulimuli atu',
+ today: 'Aso nei',
+ month: 'Masina',
+ week: 'Vaiaso',
+ day: 'Aso',
+ list: 'Faasologa',
+ },
+ weekText: 'Vaiaso',
+ allDayText: 'Aso atoa',
+ moreLinkText: 'sili atu',
+ noEventsText: 'Leai ni mea na tutupu',
+ };
+
+ var l65 = {
+ code: 'sq',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'mbrapa',
+ next: 'Përpara',
+ today: 'sot',
+ month: 'Muaj',
+ week: 'Javë',
+ day: 'Ditë',
+ list: 'Listë',
+ },
+ weekText: 'Ja',
+ allDayText: 'Gjithë ditën',
+ moreLinkText(n) {
+ return '+më tepër ' + n;
+ },
+ noEventsText: 'Nuk ka evente për të shfaqur',
+ };
+
+ var l66 = {
+ code: 'sr-cyrl',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Претходна',
+ next: 'следећи',
+ today: 'Данас',
+ month: 'Месец',
+ week: 'Недеља',
+ day: 'Дан',
+ list: 'Планер',
+ },
+ weekText: 'Сед',
+ allDayText: 'Цео дан',
+ moreLinkText(n) {
+ return '+ још ' + n;
+ },
+ noEventsText: 'Нема догађаја за приказ',
+ };
+
+ var l67 = {
+ code: 'sr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prethodna',
+ next: 'Sledeći',
+ today: 'Danas',
+ month: 'Mеsеc',
+ week: 'Nеdеlja',
+ day: 'Dan',
+ list: 'Planеr',
+ },
+ weekText: 'Sed',
+ allDayText: 'Cеo dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nеma događaja za prikaz',
+ };
+
+ var l68 = {
+ code: 'sv',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Förra',
+ next: 'Nästa',
+ today: 'Idag',
+ month: 'Månad',
+ week: 'Vecka',
+ day: 'Dag',
+ list: 'Program',
+ },
+ buttonHints: {
+ prev(buttonText) {
+ return `Föregående ${buttonText.toLocaleLowerCase()}`;
+ },
+ next(buttonText) {
+ return `Nästa ${buttonText.toLocaleLowerCase()}`;
+ },
+ today(buttonText) {
+ return (buttonText === 'Program' ? 'Detta' : 'Denna') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ },
+ viewHint: '$0 vy',
+ navLinkHint: 'Gå till $0',
+ moreLinkHint(eventCnt) {
+ return `Visa ytterligare ${eventCnt} händelse${eventCnt === 1 ? '' : 'r'}`;
+ },
+ weekText: 'v.',
+ weekTextLong: 'Vecka',
+ allDayText: 'Heldag',
+ moreLinkText: 'till',
+ noEventsText: 'Inga händelser att visa',
+ closeHint: 'Stäng',
+ timeHint: 'Klockan',
+ eventHint: 'Händelse',
+ };
+
+ var l69 = {
+ code: 'ta-in',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'முந்தைய',
+ next: 'அடுத்தது',
+ today: 'இன்று',
+ month: 'மாதம்',
+ week: 'வாரம்',
+ day: 'நாள்',
+ list: 'தினசரி அட்டவணை',
+ },
+ weekText: 'வாரம்',
+ allDayText: 'நாள் முழுவதும்',
+ moreLinkText(n) {
+ return '+ மேலும் ' + n;
+ },
+ noEventsText: 'காண்பிக்க நிகழ்வுகள் இல்லை',
+ };
+
+ var l70 = {
+ code: 'th',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'ก่อนหน้า',
+ next: 'ถัดไป',
+ prevYear: 'ปีก่อนหน้า',
+ nextYear: 'ปีถัดไป',
+ year: 'ปี',
+ today: 'วันนี้',
+ month: 'เดือน',
+ week: 'สัปดาห์',
+ day: 'วัน',
+ list: 'กำหนดการ',
+ },
+ weekText: 'สัปดาห์',
+ allDayText: 'ตลอดวัน',
+ moreLinkText: 'เพิ่มเติม',
+ noEventsText: 'ไม่มีกิจกรรมที่จะแสดง',
+ };
+
+ var l71 = {
+ code: 'tr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'geri',
+ next: 'ileri',
+ today: 'bugün',
+ month: 'Ay',
+ week: 'Hafta',
+ day: 'Gün',
+ list: 'Ajanda',
+ },
+ weekText: 'Hf',
+ allDayText: 'Tüm gün',
+ moreLinkText: 'daha fazla',
+ noEventsText: 'Gösterilecek etkinlik yok',
+ };
+
+ var l72 = {
+ code: 'ug',
+ buttonText: {
+ month: 'ئاي',
+ week: 'ھەپتە',
+ day: 'كۈن',
+ list: 'كۈنتەرتىپ',
+ },
+ allDayText: 'پۈتۈن كۈن',
+ };
+
+ var l73 = {
+ code: 'uk',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Попередній',
+ next: 'далі',
+ today: 'Сьогодні',
+ month: 'Місяць',
+ week: 'Тиждень',
+ day: 'День',
+ list: 'Порядок денний',
+ },
+ weekText: 'Тиж',
+ allDayText: 'Увесь день',
+ moreLinkText(n) {
+ return '+ще ' + n + '...';
+ },
+ noEventsText: 'Немає подій для відображення',
+ };
+
+ var l74 = {
+ code: 'uz',
+ buttonText: {
+ month: 'Oy',
+ week: 'Xafta',
+ day: 'Kun',
+ list: 'Kun tartibi',
+ },
+ allDayText: 'Kun bo\'yi',
+ moreLinkText(n) {
+ return '+ yana ' + n;
+ },
+ noEventsText: 'Ko\'rsatish uchun voqealar yo\'q',
+ };
+
+ var l75 = {
+ code: 'vi',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Trước',
+ next: 'Tiếp',
+ today: 'Hôm nay',
+ month: 'Tháng',
+ week: 'Tuần',
+ day: 'Ngày',
+ list: 'Lịch biểu',
+ },
+ weekText: 'Tu',
+ allDayText: 'Cả ngày',
+ moreLinkText(n) {
+ return '+ thêm ' + n;
+ },
+ noEventsText: 'Không có sự kiện để hiển thị',
+ };
+
+ var l76 = {
+ code: 'zh-cn',
+ week: {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: '上月',
+ next: '下月',
+ today: '今天',
+ month: '月',
+ week: '周',
+ day: '日',
+ list: '日程',
+ },
+ weekText: '周',
+ allDayText: '全天',
+ moreLinkText(n) {
+ return '另外 ' + n + ' 个';
+ },
+ noEventsText: '没有事件显示',
+ };
+
+ var l77 = {
+ code: 'zh-tw',
+ buttonText: {
+ prev: '上月',
+ next: '下月',
+ today: '今天',
+ month: '月',
+ week: '週',
+ day: '天',
+ list: '活動列表',
+ },
+ weekText: '周',
+ allDayText: '整天',
+ moreLinkText: '顯示更多',
+ noEventsText: '没有任何活動',
+ };
+
+ var localesAll = [
+ l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, l73, l74, l75, l76, l77,
+ ];
+
+ index_js.globalLocales.push(...localesAll);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales-all.global.min.js b/library/fullcalendar/packages/core/locales-all.global.min.js
new file mode 100644
index 000000000..c195374bd
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales-all.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}function n(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var o=[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:e=>"+ daha çox "+e,noEventsText:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:e=>"+още "+e,noEventsText:"Няма събития за показване"},{code:"bn",week:{dow:0,doy:6},buttonText:{prev:"পেছনে",next:"সামনে",today:"আজ",month:"মাস",week:"সপ্তাহ",day:"দিন",list:"তালিকা"},weekText:"সপ্তাহ",allDayText:"সারাদিন",moreLinkText:e=>"+অন্যান্য "+e,noEventsText:"কোনো ইভেন্ট নেই"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:e=>"+další: "+e,noEventsText:"Žádné akce k zobrazení"},{code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"},{code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${n(e)} ${e}`,next:e=>`Nächste${n(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${n(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`},{code:"eo",week:{dow:1,doy:4},buttonText:{prev:"Antaŭa",next:"Sekva",today:"Hodiaŭ",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},buttonHints:{prev:"$0 antes",next:"$0 siguiente",today:e=>"Día"===e?"Hoy":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"de la":"del")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo el día",moreLinkText:"más",moreLinkHint:e=>`Mostrar ${e} eventos más`,noEventsText:"No hay eventos para mostrar",navLinkHint:"Ir al $0",closeHint:"Cerrar",timeHint:"La hora",eventHint:"Evento"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:e=>"+ veel "+e,noEventsText:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:e=>"بیش از "+e,noEventsText:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"},{code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:e=>"+अधिक "+e,noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"},{code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"Նախորդ",next:"Հաջորդ",today:"Այսօր",month:"Ամիս",week:"Շաբաթ",day:"Օր",list:"Օրվա ցուցակ"},weekText:"Շաբ",allDayText:"Ամբողջ օր",moreLinkText:e=>"+ ևս "+e,noEventsText:"Բացակայում է իրադարձությունը ցուցադրելու"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:e=>"+altri "+e,noEventsText:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:e=>"他 "+e+" 件",noEventsText:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:e=>"+ კიდევ "+e,noEventsText:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:e=>"+ тағы "+e,noEventsText:"Көрсету үшін оқиғалар жоқ"},{code:"km",week:{dow:1,doy:4},buttonText:{prev:"មុន",next:"បន្ទាប់",today:"ថ្ងៃនេះ",year:"ឆ្នាំ",month:"ខែ",week:"សប្តាហ៍",day:"ថ្ងៃ",list:"បញ្ជី"},weekText:"សប្តាហ៍",allDayText:"ពេញមួយថ្ងៃ",moreLinkText:"ច្រើនទៀត",noEventsText:"គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"},{code:"ku",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"پێشتر",next:"دواتر",today:"ئەمڕو",month:"مانگ",week:"هەفتە",day:"ڕۆژ",list:"بەرنامە"},weekText:"هەفتە",allDayText:"هەموو ڕۆژەکە",moreLinkText:"زیاتر",noEventsText:"هیچ ڕووداوێك نیە"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:e=>"+vēl "+e,noEventsText:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:e=>"+повеќе "+e,noEventsText:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:e=>"masih ada "+e+" acara",noEventsText:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",weekTextLong:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise",buttonHints:{prev:"Forrige $0",next:"Neste $0",today:"Nåværende $0"},viewHint:"$0 visning",navLinkHint:"Gå til $0",moreLinkHint:e=>`Vis ${e} flere hendelse${1===e?"":"r"}`},{code:"ne",week:{dow:7,doy:1},buttonText:{prev:"अघिल्लो",next:"अर्को",today:"आज",month:"महिना",week:"हप्ता",day:"दिन",list:"सूची"},weekText:"हप्ता",allDayText:"दिनभरि",moreLinkText:"थप लिंक",noEventsText:"देखाउनको लागि कुनै घटनाहरू छैनन्"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:e=>"mais +"+e,noEventsText:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:e=>"+alte "+e,noEventsText:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:e=>"+ ещё "+e,noEventsText:"Нет событий для отображения"},{code:"si-lk",week:{dow:1,doy:4},buttonText:{prev:"පෙර",next:"පසු",today:"අද",month:"මාසය",week:"සතිය",day:"දවස",list:"ලැයිස්තුව"},weekText:"සති",allDayText:"සියලු",moreLinkText:"තවත්",noEventsText:"මුකුත් නැත"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:e=>"+ďalšie: "+e,noEventsText:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"},{code:"sm",buttonText:{prev:"Talu ai",next:"Mulimuli atu",today:"Aso nei",month:"Masina",week:"Vaiaso",day:"Aso",list:"Faasologa"},weekText:"Vaiaso",allDayText:"Aso atoa",moreLinkText:"sili atu",noEventsText:"Leai ni mea na tutupu"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:e=>"+më tepër "+e,noEventsText:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:e=>"+ још "+e,noEventsText:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},buttonHints:{prev:e=>"Föregående "+e.toLocaleLowerCase(),next:e=>"Nästa "+e.toLocaleLowerCase(),today:e=>("Program"===e?"Detta":"Denna")+" "+e.toLocaleLowerCase()},viewHint:"$0 vy",navLinkHint:"Gå till $0",moreLinkHint:e=>`Visa ytterligare ${e} händelse${1===e?"":"r"}`,weekText:"v.",weekTextLong:"Vecka",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa",closeHint:"Stäng",timeHint:"Klockan",eventHint:"Händelse"},{code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"முந்தைய",next:"அடுத்தது",today:"இன்று",month:"மாதம்",week:"வாரம்",day:"நாள்",list:"தினசரி அட்டவணை"},weekText:"வாரம்",allDayText:"நாள் முழுவதும்",moreLinkText:e=>"+ மேலும் "+e,noEventsText:"காண்பிக்க நிகழ்வுகள் இல்லை"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:e=>"+ще "+e+"...",noEventsText:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:e=>"+ yana "+e,noEventsText:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:e=>"+ thêm "+e,noEventsText:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:e=>"另外 "+e+" 个",noEventsText:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"}];FullCalendar.globalLocales.push(...o)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales-all.js b/library/fullcalendar/packages/core/locales-all.js
deleted file mode 100644
index e6c77df2c..000000000
--- a/library/fullcalendar/packages/core/locales-all.js
+++ /dev/null
@@ -1,1405 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, global.FullCalendarLocalesAll = factory());
-}(this, function () { 'use strict';
-
- var _m0 = {
- code: "af",
- week: {
- dow: 1,
- doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
- },
- buttonText: {
- prev: "Vorige",
- next: "Volgende",
- today: "Vandag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayHtml: "Heeldag",
- eventLimitText: "Addisionele",
- noEventsMessage: "Daar is geen gebeurtenisse nie"
- };
-
- var _m1 = {
- code: "ar-dz",
- week: {
- dow: 0,
- doy: 4 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m2 = {
- code: "ar-kw",
- week: {
- dow: 0,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m3 = {
- code: "ar-ly",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m4 = {
- code: "ar-ma",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m5 = {
- code: "ar-sa",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m6 = {
- code: "ar-tn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m7 = {
- code: "ar",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- var _m8 = {
- code: "az",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Əvvəl",
- next: "Sonra",
- today: "Bu Gün",
- month: "Ay",
- week: "Həftə",
- day: "Gün",
- list: "Gündəm"
- },
- weekLabel: "Həftə",
- allDayText: "Bütün Gün",
- eventLimitText: function (n) {
- return "+ daha çox " + n;
- },
- noEventsMessage: "Göstərmək üçün hadisə yoxdur"
- };
-
- var _m9 = {
- code: "bg",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "назад",
- next: "напред",
- today: "днес",
- month: "Месец",
- week: "Седмица",
- day: "Ден",
- list: "График"
- },
- allDayText: "Цял ден",
- eventLimitText: function (n) {
- return "+още " + n;
- },
- noEventsMessage: "Няма събития за показване"
- };
-
- var _m10 = {
- code: "bs",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prošli",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Sedmica",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Sed",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikazivanje"
- };
-
- var _m11 = {
- code: "ca",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Següent",
- today: "Avui",
- month: "Mes",
- week: "Setmana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Set",
- allDayText: "Tot el dia",
- eventLimitText: "més",
- noEventsMessage: "No hi ha esdeveniments per mostrar"
- };
-
- var _m12 = {
- code: "cs",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Dříve",
- next: "Později",
- today: "Nyní",
- month: "Měsíc",
- week: "Týden",
- day: "Den",
- list: "Agenda"
- },
- weekLabel: "Týd",
- allDayText: "Celý den",
- eventLimitText: function (n) {
- return "+další: " + n;
- },
- noEventsMessage: "Žádné akce k zobrazení"
- };
-
- var _m13 = {
- code: "da",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Næste",
- today: "I dag",
- month: "Måned",
- week: "Uge",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uge",
- allDayText: "Hele dagen",
- eventLimitText: "flere",
- noEventsMessage: "Ingen arrangementer at vise"
- };
-
- var _m14 = {
- code: "de",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zurück",
- next: "Vor",
- today: "Heute",
- year: "Jahr",
- month: "Monat",
- week: "Woche",
- day: "Tag",
- list: "Terminübersicht"
- },
- weekLabel: "KW",
- allDayText: "Ganztägig",
- eventLimitText: function (n) {
- return "+ weitere " + n;
- },
- noEventsMessage: "Keine Ereignisse anzuzeigen"
- };
-
- var _m15 = {
- code: "el",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4st is the first week of the year.
- },
- buttonText: {
- prev: "Προηγούμενος",
- next: "Επόμενος",
- today: "Σήμερα",
- month: "Μήνας",
- week: "Εβδομάδα",
- day: "Ημέρα",
- list: "Ατζέντα"
- },
- weekLabel: "Εβδ",
- allDayText: "Ολοήμερο",
- eventLimitText: "περισσότερα",
- noEventsMessage: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
- };
-
- var _m16 = {
- code: "en-au",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m17 = {
- code: "en-gb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m18 = {
- code: "en-nz",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- var _m19 = {
- code: "es",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- var _m20 = {
- code: "es",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- var _m21 = {
- code: "et",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Eelnev",
- next: "Järgnev",
- today: "Täna",
- month: "Kuu",
- week: "Nädal",
- day: "Päev",
- list: "Päevakord"
- },
- weekLabel: "näd",
- allDayText: "Kogu päev",
- eventLimitText: function (n) {
- return "+ veel " + n;
- },
- noEventsMessage: "Kuvamiseks puuduvad sündmused"
- };
-
- var _m22 = {
- code: "eu",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Aur",
- next: "Hur",
- today: "Gaur",
- month: "Hilabetea",
- week: "Astea",
- day: "Eguna",
- list: "Agenda"
- },
- weekLabel: "As",
- allDayHtml: "Egun<br/>osoa",
- eventLimitText: "gehiago",
- noEventsMessage: "Ez dago ekitaldirik erakusteko"
- };
-
- var _m23 = {
- code: "fa",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "قبلی",
- next: "بعدی",
- today: "امروز",
- month: "ماه",
- week: "هفته",
- day: "روز",
- list: "برنامه"
- },
- weekLabel: "هف",
- allDayText: "تمام روز",
- eventLimitText: function (n) {
- return "بیش از " + n;
- },
- noEventsMessage: "هیچ رویدادی به نمایش"
- };
-
- var _m24 = {
- code: "fi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Edellinen",
- next: "Seuraava",
- today: "Tänään",
- month: "Kuukausi",
- week: "Viikko",
- day: "Päivä",
- list: "Tapahtumat"
- },
- weekLabel: "Vk",
- allDayText: "Koko päivä",
- eventLimitText: "lisää",
- noEventsMessage: "Ei näytettäviä tapahtumia"
- };
-
- var _m25 = {
- code: "fr",
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m26 = {
- code: "fr-ch",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Courant",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sm",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m27 = {
- code: "fr",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- var _m28 = {
- code: "gl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Seg",
- today: "Hoxe",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Axenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>o día",
- eventLimitText: "máis",
- noEventsMessage: "Non hai eventos para amosar"
- };
-
- var _m29 = {
- code: "he",
- dir: 'rtl',
- buttonText: {
- prev: "הקודם",
- next: "הבא",
- today: "היום",
- month: "חודש",
- week: "שבוע",
- day: "יום",
- list: "סדר יום"
- },
- allDayText: "כל היום",
- eventLimitText: "אחר",
- noEventsMessage: "אין אירועים להצגה",
- weekLabel: "שבוע"
- };
-
- var _m30 = {
- code: "hi",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "पिछला",
- next: "अगला",
- today: "आज",
- month: "महीना",
- week: "सप्ताह",
- day: "दिन",
- list: "कार्यसूची"
- },
- weekLabel: "हफ्ता",
- allDayText: "सभी दिन",
- eventLimitText: function (n) {
- return "+अधिक " + n;
- },
- noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
- };
-
- var _m31 = {
- code: "hr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prijašnji",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Tjedan",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Tje",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikaz"
- };
-
- var _m32 = {
- code: "hu",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "vissza",
- next: "előre",
- today: "ma",
- month: "Hónap",
- week: "Hét",
- day: "Nap",
- list: "Napló"
- },
- weekLabel: "Hét",
- allDayText: "Egész nap",
- eventLimitText: "további",
- noEventsMessage: "Nincs megjeleníthető esemény"
- };
-
- var _m33 = {
- code: "id",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "mundur",
- next: "maju",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayHtml: "Sehari<br/>penuh",
- eventLimitText: "lebih",
- noEventsMessage: "Tidak ada acara untuk ditampilkan"
- };
-
- var _m34 = {
- code: "is",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Fyrri",
- next: "Næsti",
- today: "Í dag",
- month: "Mánuður",
- week: "Vika",
- day: "Dagur",
- list: "Dagskrá"
- },
- weekLabel: "Vika",
- allDayHtml: "Allan<br/>daginn",
- eventLimitText: "meira",
- noEventsMessage: "Engir viðburðir til að sýna"
- };
-
- var _m35 = {
- code: "it",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Prec",
- next: "Succ",
- today: "Oggi",
- month: "Mese",
- week: "Settimana",
- day: "Giorno",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Tutto il<br/>giorno",
- eventLimitText: function (n) {
- return "+altri " + n;
- },
- noEventsMessage: "Non ci sono eventi da visualizzare"
- };
-
- var _m36 = {
- code: "ja",
- buttonText: {
- prev: "前",
- next: "次",
- today: "今日",
- month: "月",
- week: "週",
- day: "日",
- list: "予定リスト"
- },
- weekLabel: "週",
- allDayText: "終日",
- eventLimitText: function (n) {
- return "他 " + n + " 件";
- },
- noEventsMessage: "表示する予定はありません"
- };
-
- var _m37 = {
- code: "ka",
- week: {
- dow: 1,
- doy: 7
- },
- buttonText: {
- prev: "წინა",
- next: "შემდეგი",
- today: "დღეს",
- month: "თვე",
- week: "კვირა",
- day: "დღე",
- list: "დღის წესრიგი"
- },
- weekLabel: "კვ",
- allDayText: "მთელი დღე",
- eventLimitText: function (n) {
- return "+ კიდევ " + n;
- },
- noEventsMessage: "ღონისძიებები არ არის"
- };
-
- var _m38 = {
- code: "kk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Алдыңғы",
- next: "Келесі",
- today: "Бүгін",
- month: "Ай",
- week: "Апта",
- day: "Күн",
- list: "Күн тәртібі"
- },
- weekLabel: "Не",
- allDayText: "Күні бойы",
- eventLimitText: function (n) {
- return "+ тағы " + n;
- },
- noEventsMessage: "Көрсету үшін оқиғалар жоқ"
- };
-
- var _m39 = {
- code: "ko",
- buttonText: {
- prev: "이전달",
- next: "다음달",
- today: "오늘",
- month: "월",
- week: "주",
- day: "일",
- list: "일정목록"
- },
- weekLabel: "주",
- allDayText: "종일",
- eventLimitText: "개",
- noEventsMessage: "일정이 없습니다"
- };
-
- var _m40 = {
- code: "lb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zréck",
- next: "Weider",
- today: "Haut",
- month: "Mount",
- week: "Woch",
- day: "Dag",
- list: "Terminiwwersiicht"
- },
- weekLabel: "W",
- allDayText: "Ganzen Dag",
- eventLimitText: "méi",
- noEventsMessage: "Nee Evenementer ze affichéieren"
- };
-
- var _m41 = {
- code: "lt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Atgal",
- next: "Pirmyn",
- today: "Šiandien",
- month: "Mėnuo",
- week: "Savaitė",
- day: "Diena",
- list: "Darbotvarkė"
- },
- weekLabel: "SAV",
- allDayText: "Visą dieną",
- eventLimitText: "daugiau",
- noEventsMessage: "Nėra įvykių rodyti"
- };
-
- var _m42 = {
- code: "lv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Iepr.",
- next: "Nāk.",
- today: "Šodien",
- month: "Mēnesis",
- week: "Nedēļa",
- day: "Diena",
- list: "Dienas kārtība"
- },
- weekLabel: "Ned.",
- allDayText: "Visu dienu",
- eventLimitText: function (n) {
- return "+vēl " + n;
- },
- noEventsMessage: "Nav notikumu"
- };
-
- var _m43 = {
- code: "mk",
- buttonText: {
- prev: "претходно",
- next: "следно",
- today: "Денес",
- month: "Месец",
- week: "Недела",
- day: "Ден",
- list: "График"
- },
- weekLabel: "Сед",
- allDayText: "Цел ден",
- eventLimitText: function (n) {
- return "+повеќе " + n;
- },
- noEventsMessage: "Нема настани за прикажување"
- };
-
- var _m44 = {
- code: "ms",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Sebelum",
- next: "Selepas",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayText: "Sepanjang hari",
- eventLimitText: function (n) {
- return "masih ada " + n + " acara";
- },
- noEventsMessage: "Tiada peristiwa untuk dipaparkan"
- };
-
- var _m45 = {
- code: "nb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Neste",
- today: "I dag",
- month: "Måned",
- week: "Uke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uke",
- allDayText: "Hele dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- var _m46 = {
- code: "nl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Voorgaand",
- next: "Volgende",
- today: "Vandaag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayText: "Hele dag",
- eventLimitText: "extra",
- noEventsMessage: "Geen evenementen om te laten zien"
- };
-
- var _m47 = {
- code: "nn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Førre",
- next: "Neste",
- today: "I dag",
- month: "Månad",
- week: "Veke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Veke",
- allDayText: "Heile dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- var _m48 = {
- code: "pl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Poprzedni",
- next: "Następny",
- today: "Dziś",
- month: "Miesiąc",
- week: "Tydzień",
- day: "Dzień",
- list: "Plan dnia"
- },
- weekLabel: "Tydz",
- allDayText: "Cały dzień",
- eventLimitText: "więcej",
- noEventsMessage: "Brak wydarzeń do wyświetlenia"
- };
-
- var _m49 = {
- code: "pt-br",
- buttonText: {
- prev: "Anterior",
- next: "Próximo",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Lista"
- },
- weekLabel: "Sm",
- allDayText: "dia inteiro",
- eventLimitText: function (n) {
- return "mais +" + n;
- },
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- var _m50 = {
- code: "pt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Seguinte",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Sem",
- allDayText: "Todo o dia",
- eventLimitText: "mais",
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- var _m51 = {
- code: "ro",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "precedentă",
- next: "următoare",
- today: "Azi",
- month: "Lună",
- week: "Săptămână",
- day: "Zi",
- list: "Agendă"
- },
- weekLabel: "Săpt",
- allDayText: "Toată ziua",
- eventLimitText: function (n) {
- return "+alte " + n;
- },
- noEventsMessage: "Nu există evenimente de afișat"
- };
-
- var _m52 = {
- code: "ru",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Пред",
- next: "След",
- today: "Сегодня",
- month: "Месяц",
- week: "Неделя",
- day: "День",
- list: "Повестка дня"
- },
- weekLabel: "Нед",
- allDayText: "Весь день",
- eventLimitText: function (n) {
- return "+ ещё " + n;
- },
- noEventsMessage: "Нет событий для отображения"
- };
-
- var _m53 = {
- code: "sk",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Predchádzajúci",
- next: "Nasledujúci",
- today: "Dnes",
- month: "Mesiac",
- week: "Týždeň",
- day: "Deň",
- list: "Rozvrh"
- },
- weekLabel: "Ty",
- allDayText: "Celý deň",
- eventLimitText: function (n) {
- return "+ďalšie: " + n;
- },
- noEventsMessage: "Žiadne akcie na zobrazenie"
- };
-
- var _m54 = {
- code: "sl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prejšnji",
- next: "Naslednji",
- today: "Trenutni",
- month: "Mesec",
- week: "Teden",
- day: "Dan",
- list: "Dnevni red"
- },
- weekLabel: "Teden",
- allDayText: "Ves dan",
- eventLimitText: "več",
- noEventsMessage: "Ni dogodkov za prikaz"
- };
-
- var _m55 = {
- code: "sq",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "mbrapa",
- next: "Përpara",
- today: "sot",
- month: "Muaj",
- week: "Javë",
- day: "Ditë",
- list: "Listë"
- },
- weekLabel: "Ja",
- allDayHtml: "Gjithë<br/>ditën",
- eventLimitText: function (n) {
- return "+më tepër " + n;
- },
- noEventsMessage: "Nuk ka evente për të shfaqur"
- };
-
- var _m56 = {
- code: "sr-cyrl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Претходна",
- next: "следећи",
- today: "Данас",
- month: "Месец",
- week: "Недеља",
- day: "Дан",
- list: "Планер"
- },
- weekLabel: "Сед",
- allDayText: "Цео дан",
- eventLimitText: function (n) {
- return "+ још " + n;
- },
- noEventsMessage: "Нема догађаја за приказ"
- };
-
- var _m57 = {
- code: "sr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prethodna",
- next: "Sledeći",
- today: "Danas",
- month: "Mеsеc",
- week: "Nеdеlja",
- day: "Dan",
- list: "Planеr"
- },
- weekLabel: "Sed",
- allDayText: "Cеo dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nеma događaja za prikaz"
- };
-
- var _m58 = {
- code: "sv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Förra",
- next: "Nästa",
- today: "Idag",
- month: "Månad",
- week: "Vecka",
- day: "Dag",
- list: "Program"
- },
- weekLabel: "v.",
- allDayText: "Heldag",
- eventLimitText: "till",
- noEventsMessage: "Inga händelser att visa"
- };
-
- var _m59 = {
- code: "th",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "ก่อนหน้า",
- next: "ถัดไป",
- prevYear: 'ปีก่อนหน้า',
- nextYear: 'ปีถัดไป',
- year: 'ปี',
- today: "วันนี้",
- month: "เดือน",
- week: "สัปดาห์",
- day: "วัน",
- list: "กำหนดการ"
- },
- weekLabel: "สัปดาห์",
- allDayText: "ตลอดวัน",
- eventLimitText: "เพิ่มเติม",
- noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
- };
-
- var _m60 = {
- code: "tr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "geri",
- next: "ileri",
- today: "bugün",
- month: "Ay",
- week: "Hafta",
- day: "Gün",
- list: "Ajanda"
- },
- weekLabel: "Hf",
- allDayText: "Tüm gün",
- eventLimitText: "daha fazla",
- noEventsMessage: "Gösterilecek etkinlik yok"
- };
-
- var _m61 = {
- code: "ug",
- buttonText: {
- month: "ئاي",
- week: "ھەپتە",
- day: "كۈن",
- list: "كۈنتەرتىپ"
- },
- allDayText: "پۈتۈن كۈن"
- };
-
- var _m62 = {
- code: "uk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Попередній",
- next: "далі",
- today: "Сьогодні",
- month: "Місяць",
- week: "Тиждень",
- day: "День",
- list: "Порядок денний"
- },
- weekLabel: "Тиж",
- allDayText: "Увесь день",
- eventLimitText: function (n) {
- return "+ще " + n + "...";
- },
- noEventsMessage: "Немає подій для відображення"
- };
-
- var _m63 = {
- code: "uz",
- buttonText: {
- month: "Oy",
- week: "Xafta",
- day: "Kun",
- list: "Kun tartibi"
- },
- allDayText: "Kun bo'yi",
- eventLimitText: function (n) {
- return "+ yana " + n;
- },
- noEventsMessage: "Ko'rsatish uchun voqealar yo'q"
- };
-
- var _m64 = {
- code: "vi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Trước",
- next: "Tiếp",
- today: "Hôm nay",
- month: "Tháng",
- week: "Tuần",
- day: "Ngày",
- list: "Lịch biểu"
- },
- weekLabel: "Tu",
- allDayText: "Cả ngày",
- eventLimitText: function (n) {
- return "+ thêm " + n;
- },
- noEventsMessage: "Không có sự kiện để hiển thị"
- };
-
- var _m65 = {
- code: "zh-cn",
- week: {
- // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "周",
- day: "日",
- list: "日程"
- },
- weekLabel: "周",
- allDayText: "全天",
- eventLimitText: function (n) {
- return "另外 " + n + " 个";
- },
- noEventsMessage: "没有事件显示"
- };
-
- var _m66 = {
- code: "zh-tw",
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "週",
- day: "天",
- list: "活動列表"
- },
- weekLabel: "周",
- allDayText: "整天",
- eventLimitText: '顯示更多',
- noEventsMessage: "没有任何活動"
- };
-
- var _rollupPluginMultiEntry_entryPoint = [
- _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63, _m64, _m65, _m66
- ];
-
- return _rollupPluginMultiEntry_entryPoint;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales-all.min.js b/library/fullcalendar/packages/core/locales-all.min.js
deleted file mode 100644
index e553f6653..000000000
--- a/library/fullcalendar/packages/core/locales-all.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FullCalendarLocalesAll=t()}(this,(function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekLabel:"Həftə",allDayText:"Bütün Gün",eventLimitText:function(e){return"+ daha çox "+e},noEventsMessage:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë<br/>ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekLabel:"สัปดาห์",allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",eventLimitText:function(e){return"+ yana "+e},noEventsMessage:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/af.global.js b/library/fullcalendar/packages/core/locales/af.global.js
new file mode 100644
index 000000000..c5bed4dd4
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/af.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'af',
+ week: {
+ dow: 1,
+ doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+ },
+ buttonText: {
+ prev: 'Vorige',
+ next: 'Volgende',
+ today: 'Vandag',
+ year: 'Jaar',
+ month: 'Maand',
+ week: 'Week',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ allDayText: 'Heeldag',
+ moreLinkText: 'Addisionele',
+ noEventsText: 'Daar is geen gebeurtenisse nie',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/af.global.min.js b/library/fullcalendar/packages/core/locales/af.global.min.js
new file mode 100644
index 000000000..7e3b2af8f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/af.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/af.js b/library/fullcalendar/packages/core/locales/af.js
deleted file mode 100644
index ee9f9f747..000000000
--- a/library/fullcalendar/packages/core/locales/af.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory()));
-}(this, function () { 'use strict';
-
- var af = {
- code: "af",
- week: {
- dow: 1,
- doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
- },
- buttonText: {
- prev: "Vorige",
- next: "Volgende",
- today: "Vandag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayHtml: "Heeldag",
- eventLimitText: "Addisionele",
- noEventsMessage: "Daar is geen gebeurtenisse nie"
- };
-
- return af;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-dz.global.js b/library/fullcalendar/packages/core/locales/ar-dz.global.js
new file mode 100644
index 000000000..b72beb79c
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-dz.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-dz',
+ week: {
+ dow: 0,
+ doy: 4, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-dz.global.min.js b/library/fullcalendar/packages/core/locales/ar-dz.global.min.js
new file mode 100644
index 000000000..1fde2ea1a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-dz.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-dz.js b/library/fullcalendar/packages/core/locales/ar-dz.js
deleted file mode 100644
index 201eb171a..000000000
--- a/library/fullcalendar/packages/core/locales/ar-dz.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory()));
-}(this, function () { 'use strict';
-
- var arDz = {
- code: "ar-dz",
- week: {
- dow: 0,
- doy: 4 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arDz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-kw.global.js b/library/fullcalendar/packages/core/locales/ar-kw.global.js
new file mode 100644
index 000000000..41a3c10d5
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-kw.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-kw',
+ week: {
+ dow: 0,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-kw.global.min.js b/library/fullcalendar/packages/core/locales/ar-kw.global.min.js
new file mode 100644
index 000000000..4be50b9df
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-kw.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-kw.js b/library/fullcalendar/packages/core/locales/ar-kw.js
deleted file mode 100644
index 94c690014..000000000
--- a/library/fullcalendar/packages/core/locales/ar-kw.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory()));
-}(this, function () { 'use strict';
-
- var arKw = {
- code: "ar-kw",
- week: {
- dow: 0,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arKw;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-ly.global.js b/library/fullcalendar/packages/core/locales/ar-ly.global.js
new file mode 100644
index 000000000..4d60121df
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-ly.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-ly',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-ly.global.min.js b/library/fullcalendar/packages/core/locales/ar-ly.global.min.js
new file mode 100644
index 000000000..5f8257659
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-ly.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-ly.js b/library/fullcalendar/packages/core/locales/ar-ly.js
deleted file mode 100644
index e1c8aeb07..000000000
--- a/library/fullcalendar/packages/core/locales/ar-ly.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory()));
-}(this, function () { 'use strict';
-
- var arLy = {
- code: "ar-ly",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arLy;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-ma.global.js b/library/fullcalendar/packages/core/locales/ar-ma.global.js
new file mode 100644
index 000000000..a38250dfb
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-ma.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-ma',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-ma.global.min.js b/library/fullcalendar/packages/core/locales/ar-ma.global.min.js
new file mode 100644
index 000000000..87f3c5cc0
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-ma.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-ma.js b/library/fullcalendar/packages/core/locales/ar-ma.js
deleted file mode 100644
index 00cc7c679..000000000
--- a/library/fullcalendar/packages/core/locales/ar-ma.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory()));
-}(this, function () { 'use strict';
-
- var arMa = {
- code: "ar-ma",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arMa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-sa.global.js b/library/fullcalendar/packages/core/locales/ar-sa.global.js
new file mode 100644
index 000000000..aca72e1dc
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-sa.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-sa',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-sa.global.min.js b/library/fullcalendar/packages/core/locales/ar-sa.global.min.js
new file mode 100644
index 000000000..e0e0753b0
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-sa.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-sa.js b/library/fullcalendar/packages/core/locales/ar-sa.js
deleted file mode 100644
index 0361f6d87..000000000
--- a/library/fullcalendar/packages/core/locales/ar-sa.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory()));
-}(this, function () { 'use strict';
-
- var arSa = {
- code: "ar-sa",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arSa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar-tn.global.js b/library/fullcalendar/packages/core/locales/ar-tn.global.js
new file mode 100644
index 000000000..20fbe7962
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-tn.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar-tn',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar-tn.global.min.js b/library/fullcalendar/packages/core/locales/ar-tn.global.min.js
new file mode 100644
index 000000000..d5a256ee0
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar-tn.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar-tn.js b/library/fullcalendar/packages/core/locales/ar-tn.js
deleted file mode 100644
index 57a07f8f5..000000000
--- a/library/fullcalendar/packages/core/locales/ar-tn.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory()));
-}(this, function () { 'use strict';
-
- var arTn = {
- code: "ar-tn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return arTn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ar.global.js b/library/fullcalendar/packages/core/locales/ar.global.js
new file mode 100644
index 000000000..8124d0280
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ar',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'السابق',
+ next: 'التالي',
+ today: 'اليوم',
+ month: 'شهر',
+ week: 'أسبوع',
+ day: 'يوم',
+ list: 'أجندة',
+ },
+ weekText: 'أسبوع',
+ allDayText: 'اليوم كله',
+ moreLinkText: 'أخرى',
+ noEventsText: 'أي أحداث لعرض',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ar.global.min.js b/library/fullcalendar/packages/core/locales/ar.global.min.js
new file mode 100644
index 000000000..92abaf1c6
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ar.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ar.js b/library/fullcalendar/packages/core/locales/ar.js
deleted file mode 100644
index f789afd15..000000000
--- a/library/fullcalendar/packages/core/locales/ar.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory()));
-}(this, function () { 'use strict';
-
- var ar = {
- code: "ar",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "السابق",
- next: "التالي",
- today: "اليوم",
- month: "شهر",
- week: "أسبوع",
- day: "يوم",
- list: "أجندة"
- },
- weekLabel: "أسبوع",
- allDayText: "اليوم كله",
- eventLimitText: "أخرى",
- noEventsMessage: "أي أحداث لعرض"
- };
-
- return ar;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/az.global.js b/library/fullcalendar/packages/core/locales/az.global.js
new file mode 100644
index 000000000..5239e1b4b
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/az.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'az',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Əvvəl',
+ next: 'Sonra',
+ today: 'Bu Gün',
+ month: 'Ay',
+ week: 'Həftə',
+ day: 'Gün',
+ list: 'Gündəm',
+ },
+ weekText: 'Həftə',
+ allDayText: 'Bütün Gün',
+ moreLinkText(n) {
+ return '+ daha çox ' + n;
+ },
+ noEventsText: 'Göstərmək üçün hadisə yoxdur',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/az.global.min.js b/library/fullcalendar/packages/core/locales/az.global.min.js
new file mode 100644
index 000000000..9d52bec21
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/az.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:e=>"+ daha çox "+e,noEventsText:"Göstərmək üçün hadisə yoxdur"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/az.js b/library/fullcalendar/packages/core/locales/az.js
deleted file mode 100644
index fbd2dc35c..000000000
--- a/library/fullcalendar/packages/core/locales/az.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.az = factory()));
-}(this, function () { 'use strict';
-
- var az = {
- code: "az",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Əvvəl",
- next: "Sonra",
- today: "Bu Gün",
- month: "Ay",
- week: "Həftə",
- day: "Gün",
- list: "Gündəm"
- },
- weekLabel: "Həftə",
- allDayText: "Bütün Gün",
- eventLimitText: function (n) {
- return "+ daha çox " + n;
- },
- noEventsMessage: "Göstərmək üçün hadisə yoxdur"
- };
-
- return az;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/bg.global.js b/library/fullcalendar/packages/core/locales/bg.global.js
new file mode 100644
index 000000000..aeb494975
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bg.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'bg',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'назад',
+ next: 'напред',
+ today: 'днес',
+ month: 'Месец',
+ week: 'Седмица',
+ day: 'Ден',
+ list: 'График',
+ },
+ allDayText: 'Цял ден',
+ moreLinkText(n) {
+ return '+още ' + n;
+ },
+ noEventsText: 'Няма събития за показване',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/bg.global.min.js b/library/fullcalendar/packages/core/locales/bg.global.min.js
new file mode 100644
index 000000000..d919c704f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bg.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:e=>"+още "+e,noEventsText:"Няма събития за показване"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/bg.js b/library/fullcalendar/packages/core/locales/bg.js
deleted file mode 100644
index e7343a6c5..000000000
--- a/library/fullcalendar/packages/core/locales/bg.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory()));
-}(this, function () { 'use strict';
-
- var bg = {
- code: "bg",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "назад",
- next: "напред",
- today: "днес",
- month: "Месец",
- week: "Седмица",
- day: "Ден",
- list: "График"
- },
- allDayText: "Цял ден",
- eventLimitText: function (n) {
- return "+още " + n;
- },
- noEventsMessage: "Няма събития за показване"
- };
-
- return bg;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/bn.global.js b/library/fullcalendar/packages/core/locales/bn.global.js
new file mode 100644
index 000000000..f6d2ca483
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bn.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'bn',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'পেছনে',
+ next: 'সামনে',
+ today: 'আজ',
+ month: 'মাস',
+ week: 'সপ্তাহ',
+ day: 'দিন',
+ list: 'তালিকা',
+ },
+ weekText: 'সপ্তাহ',
+ allDayText: 'সারাদিন',
+ moreLinkText(n) {
+ return '+অন্যান্য ' + n;
+ },
+ noEventsText: 'কোনো ইভেন্ট নেই',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/bn.global.min.js b/library/fullcalendar/packages/core/locales/bn.global.min.js
new file mode 100644
index 000000000..d41880bb3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bn.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"bn",week:{dow:0,doy:6},buttonText:{prev:"পেছনে",next:"সামনে",today:"আজ",month:"মাস",week:"সপ্তাহ",day:"দিন",list:"তালিকা"},weekText:"সপ্তাহ",allDayText:"সারাদিন",moreLinkText:e=>"+অন্যান্য "+e,noEventsText:"কোনো ইভেন্ট নেই"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/bs.global.js b/library/fullcalendar/packages/core/locales/bs.global.js
new file mode 100644
index 000000000..d7de947c2
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bs.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'bs',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prošli',
+ next: 'Sljedeći',
+ today: 'Danas',
+ month: 'Mjesec',
+ week: 'Sedmica',
+ day: 'Dan',
+ list: 'Raspored',
+ },
+ weekText: 'Sed',
+ allDayText: 'Cijeli dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nema događaja za prikazivanje',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/bs.global.min.js b/library/fullcalendar/packages/core/locales/bs.global.min.js
new file mode 100644
index 000000000..8815724cd
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/bs.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var a={code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikazivanje"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/bs.js b/library/fullcalendar/packages/core/locales/bs.js
deleted file mode 100644
index d96b8adb3..000000000
--- a/library/fullcalendar/packages/core/locales/bs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory()));
-}(this, function () { 'use strict';
-
- var bs = {
- code: "bs",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prošli",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Sedmica",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Sed",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikazivanje"
- };
-
- return bs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ca.global.js b/library/fullcalendar/packages/core/locales/ca.global.js
new file mode 100644
index 000000000..b65d6630f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ca.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ca',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Següent',
+ today: 'Avui',
+ month: 'Mes',
+ week: 'Setmana',
+ day: 'Dia',
+ list: 'Agenda',
+ },
+ weekText: 'Set',
+ allDayText: 'Tot el dia',
+ moreLinkText: 'més',
+ noEventsText: 'No hi ha esdeveniments per mostrar',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ca.global.min.js b/library/fullcalendar/packages/core/locales/ca.global.min.js
new file mode 100644
index 000000000..92b9047aa
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ca.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ca.js b/library/fullcalendar/packages/core/locales/ca.js
deleted file mode 100644
index d2d3e2aa7..000000000
--- a/library/fullcalendar/packages/core/locales/ca.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory()));
-}(this, function () { 'use strict';
-
- var ca = {
- code: "ca",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Següent",
- today: "Avui",
- month: "Mes",
- week: "Setmana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Set",
- allDayText: "Tot el dia",
- eventLimitText: "més",
- noEventsMessage: "No hi ha esdeveniments per mostrar"
- };
-
- return ca;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/cs.global.js b/library/fullcalendar/packages/core/locales/cs.global.js
new file mode 100644
index 000000000..bd105ca3b
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/cs.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'cs',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Dříve',
+ next: 'Později',
+ today: 'Nyní',
+ month: 'Měsíc',
+ week: 'Týden',
+ day: 'Den',
+ list: 'Agenda',
+ },
+ weekText: 'Týd',
+ allDayText: 'Celý den',
+ moreLinkText(n) {
+ return '+další: ' + n;
+ },
+ noEventsText: 'Žádné akce k zobrazení',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/cs.global.min.js b/library/fullcalendar/packages/core/locales/cs.global.min.js
new file mode 100644
index 000000000..eaf37f366
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/cs.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var n={code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:e=>"+další: "+e,noEventsText:"Žádné akce k zobrazení"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/cs.js b/library/fullcalendar/packages/core/locales/cs.js
deleted file mode 100644
index 2624e3607..000000000
--- a/library/fullcalendar/packages/core/locales/cs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory()));
-}(this, function () { 'use strict';
-
- var cs = {
- code: "cs",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Dříve",
- next: "Později",
- today: "Nyní",
- month: "Měsíc",
- week: "Týden",
- day: "Den",
- list: "Agenda"
- },
- weekLabel: "Týd",
- allDayText: "Celý den",
- eventLimitText: function (n) {
- return "+další: " + n;
- },
- noEventsMessage: "Žádné akce k zobrazení"
- };
-
- return cs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/cy.global.js b/library/fullcalendar/packages/core/locales/cy.global.js
new file mode 100644
index 000000000..ac1e612ed
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/cy.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'cy',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Blaenorol',
+ next: 'Nesaf',
+ today: 'Heddiw',
+ year: 'Blwyddyn',
+ month: 'Mis',
+ week: 'Wythnos',
+ day: 'Dydd',
+ list: 'Rhestr',
+ },
+ weekText: 'Wythnos',
+ allDayText: 'Trwy\'r dydd',
+ moreLinkText: 'Mwy',
+ noEventsText: 'Dim digwyddiadau',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/cy.global.min.js b/library/fullcalendar/packages/core/locales/cy.global.min.js
new file mode 100644
index 000000000..2599b40dd
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/cy.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"cy",week:{dow:1,doy:4},buttonText:{prev:"Blaenorol",next:"Nesaf",today:"Heddiw",year:"Blwyddyn",month:"Mis",week:"Wythnos",day:"Dydd",list:"Rhestr"},weekText:"Wythnos",allDayText:"Trwy'r dydd",moreLinkText:"Mwy",noEventsText:"Dim digwyddiadau"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/da.global.js b/library/fullcalendar/packages/core/locales/da.global.js
new file mode 100644
index 000000000..b5e1e4095
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/da.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'da',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Forrige',
+ next: 'Næste',
+ today: 'I dag',
+ month: 'Måned',
+ week: 'Uge',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Uge',
+ allDayText: 'Hele dagen',
+ moreLinkText: 'flere',
+ noEventsText: 'Ingen arrangementer at vise',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/da.global.min.js b/library/fullcalendar/packages/core/locales/da.global.min.js
new file mode 100644
index 000000000..907d0f989
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/da.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/da.js b/library/fullcalendar/packages/core/locales/da.js
deleted file mode 100644
index 73d155929..000000000
--- a/library/fullcalendar/packages/core/locales/da.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory()));
-}(this, function () { 'use strict';
-
- var da = {
- code: "da",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Næste",
- today: "I dag",
- month: "Måned",
- week: "Uge",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uge",
- allDayText: "Hele dagen",
- eventLimitText: "flere",
- noEventsMessage: "Ingen arrangementer at vise"
- };
-
- return da;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/de-at.global.js b/library/fullcalendar/packages/core/locales/de-at.global.js
new file mode 100644
index 000000000..1e449591d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/de-at.global.js
@@ -0,0 +1,69 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ function affix(buttonText) {
+ return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
+ buttonText === 'Jahr' ? 's' : '';
+ }
+ var locale = {
+ code: 'de-at',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zurück',
+ next: 'Vor',
+ today: 'Heute',
+ year: 'Jahr',
+ month: 'Monat',
+ week: 'Woche',
+ day: 'Tag',
+ list: 'Terminübersicht',
+ },
+ weekText: 'KW',
+ weekTextLong: 'Woche',
+ allDayText: 'Ganztägig',
+ moreLinkText(n) {
+ return '+ weitere ' + n;
+ },
+ noEventsText: 'Keine Ereignisse anzuzeigen',
+ buttonHints: {
+ prev(buttonText) {
+ return `Vorherige${affix(buttonText)} ${buttonText}`;
+ },
+ next(buttonText) {
+ return `Nächste${affix(buttonText)} ${buttonText}`;
+ },
+ today(buttonText) {
+ // → Heute, Diese Woche, Dieser Monat, Dieses Jahr
+ if (buttonText === 'Tag') {
+ return 'Heute';
+ }
+ return `Diese${affix(buttonText)} ${buttonText}`;
+ },
+ },
+ viewHint(buttonText) {
+ // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
+ const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
+ return buttonText + glue + 'ansicht';
+ },
+ navLinkHint: 'Gehe zu $0',
+ moreLinkHint(eventCnt) {
+ return 'Zeige ' + (eventCnt === 1 ?
+ 'ein weiteres Ereignis' :
+ eventCnt + ' weitere Ereignisse');
+ },
+ closeHint: 'Schließen',
+ timeHint: 'Uhrzeit',
+ eventHint: 'Ereignis',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/de-at.global.min.js b/library/fullcalendar/packages/core/locales/de-at.global.min.js
new file mode 100644
index 000000000..c9eff3f67
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/de-at.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var n={code:"de-at",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/de.global.js b/library/fullcalendar/packages/core/locales/de.global.js
new file mode 100644
index 000000000..09d1b3074
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/de.global.js
@@ -0,0 +1,69 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ function affix(buttonText) {
+ return (buttonText === 'Tag' || buttonText === 'Monat') ? 'r' :
+ buttonText === 'Jahr' ? 's' : '';
+ }
+ var locale = {
+ code: 'de',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zurück',
+ next: 'Vor',
+ today: 'Heute',
+ year: 'Jahr',
+ month: 'Monat',
+ week: 'Woche',
+ day: 'Tag',
+ list: 'Terminübersicht',
+ },
+ weekText: 'KW',
+ weekTextLong: 'Woche',
+ allDayText: 'Ganztägig',
+ moreLinkText(n) {
+ return '+ weitere ' + n;
+ },
+ noEventsText: 'Keine Ereignisse anzuzeigen',
+ buttonHints: {
+ prev(buttonText) {
+ return `Vorherige${affix(buttonText)} ${buttonText}`;
+ },
+ next(buttonText) {
+ return `Nächste${affix(buttonText)} ${buttonText}`;
+ },
+ today(buttonText) {
+ // → Heute, Diese Woche, Dieser Monat, Dieses Jahr
+ if (buttonText === 'Tag') {
+ return 'Heute';
+ }
+ return `Diese${affix(buttonText)} ${buttonText}`;
+ },
+ },
+ viewHint(buttonText) {
+ // → Tagesansicht, Wochenansicht, Monatsansicht, Jahresansicht
+ const glue = buttonText === 'Woche' ? 'n' : buttonText === 'Monat' ? 's' : 'es';
+ return buttonText + glue + 'ansicht';
+ },
+ navLinkHint: 'Gehe zu $0',
+ moreLinkHint(eventCnt) {
+ return 'Zeige ' + (eventCnt === 1 ?
+ 'ein weiteres Ereignis' :
+ eventCnt + ' weitere Ereignisse');
+ },
+ closeHint: 'Schließen',
+ timeHint: 'Uhrzeit',
+ eventHint: 'Ereignis',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/de.global.min.js b/library/fullcalendar/packages/core/locales/de.global.min.js
new file mode 100644
index 000000000..907861094
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/de.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";function t(e){return"Tag"===e||"Monat"===e?"r":"Jahr"===e?"s":""}var n={code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",weekTextLong:"Woche",allDayText:"Ganztägig",moreLinkText:e=>"+ weitere "+e,noEventsText:"Keine Ereignisse anzuzeigen",buttonHints:{prev:e=>`Vorherige${t(e)} ${e}`,next:e=>`Nächste${t(e)} ${e}`,today:e=>"Tag"===e?"Heute":`Diese${t(e)} ${e}`},viewHint:e=>e+("Woche"===e?"n":"Monat"===e?"s":"es")+"ansicht",navLinkHint:"Gehe zu $0",moreLinkHint:e=>"Zeige "+(1===e?"ein weiteres Ereignis":e+" weitere Ereignisse"),closeHint:"Schließen",timeHint:"Uhrzeit",eventHint:"Ereignis"};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/de.js b/library/fullcalendar/packages/core/locales/de.js
deleted file mode 100644
index ab5a815a0..000000000
--- a/library/fullcalendar/packages/core/locales/de.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory()));
-}(this, function () { 'use strict';
-
- var de = {
- code: "de",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zurück",
- next: "Vor",
- today: "Heute",
- year: "Jahr",
- month: "Monat",
- week: "Woche",
- day: "Tag",
- list: "Terminübersicht"
- },
- weekLabel: "KW",
- allDayText: "Ganztägig",
- eventLimitText: function (n) {
- return "+ weitere " + n;
- },
- noEventsMessage: "Keine Ereignisse anzuzeigen"
- };
-
- return de;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/el.global.js b/library/fullcalendar/packages/core/locales/el.global.js
new file mode 100644
index 000000000..8b6a656c7
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/el.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'el',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Προηγούμενος',
+ next: 'Επόμενος',
+ today: 'Σήμερα',
+ month: 'Μήνας',
+ week: 'Εβδομάδα',
+ day: 'Ημέρα',
+ list: 'Ατζέντα',
+ },
+ weekText: 'Εβδ',
+ allDayText: 'Ολοήμερο',
+ moreLinkText: 'περισσότερα',
+ noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/el.global.min.js b/library/fullcalendar/packages/core/locales/el.global.min.js
new file mode 100644
index 000000000..f976bd2fd
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/el.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/el.js b/library/fullcalendar/packages/core/locales/el.js
deleted file mode 100644
index cdc10a66e..000000000
--- a/library/fullcalendar/packages/core/locales/el.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory()));
-}(this, function () { 'use strict';
-
- var el = {
- code: "el",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4st is the first week of the year.
- },
- buttonText: {
- prev: "Προηγούμενος",
- next: "Επόμενος",
- today: "Σήμερα",
- month: "Μήνας",
- week: "Εβδομάδα",
- day: "Ημέρα",
- list: "Ατζέντα"
- },
- weekLabel: "Εβδ",
- allDayText: "Ολοήμερο",
- eventLimitText: "περισσότερα",
- noEventsMessage: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
- };
-
- return el;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-au.global.js b/library/fullcalendar/packages/core/locales/en-au.global.js
new file mode 100644
index 000000000..74464ebe9
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-au.global.js
@@ -0,0 +1,29 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'en-au',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/en-au.global.min.js b/library/fullcalendar/packages/core/locales/en-au.global.min.js
new file mode 100644
index 000000000..4a192f9cf
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-au.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var n={code:"en-au",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/en-au.js b/library/fullcalendar/packages/core/locales/en-au.js
deleted file mode 100644
index be10bfb66..000000000
--- a/library/fullcalendar/packages/core/locales/en-au.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory()));
-}(this, function () { 'use strict';
-
- var enAu = {
- code: "en-au",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enAu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-gb.global.js b/library/fullcalendar/packages/core/locales/en-gb.global.js
new file mode 100644
index 000000000..dd325f55d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-gb.global.js
@@ -0,0 +1,29 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'en-gb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/en-gb.global.min.js b/library/fullcalendar/packages/core/locales/en-gb.global.min.js
new file mode 100644
index 000000000..1157e7b6c
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-gb.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var n={code:"en-gb",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/en-gb.js b/library/fullcalendar/packages/core/locales/en-gb.js
deleted file mode 100644
index 8a4a84e6b..000000000
--- a/library/fullcalendar/packages/core/locales/en-gb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory()));
-}(this, function () { 'use strict';
-
- var enGb = {
- code: "en-gb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enGb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/en-nz.global.js b/library/fullcalendar/packages/core/locales/en-nz.global.js
new file mode 100644
index 000000000..78b180a2a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-nz.global.js
@@ -0,0 +1,29 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'en-nz',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonHints: {
+ prev: 'Previous $0',
+ next: 'Next $0',
+ today: 'This $0',
+ },
+ viewHint: '$0 view',
+ navLinkHint: 'Go to $0',
+ moreLinkHint(eventCnt) {
+ return `Show ${eventCnt} more event${eventCnt === 1 ? '' : 's'}`;
+ },
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/en-nz.global.min.js b/library/fullcalendar/packages/core/locales/en-nz.global.min.js
new file mode 100644
index 000000000..03bf9b01a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/en-nz.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var n={code:"en-nz",week:{dow:1,doy:4},buttonHints:{prev:"Previous $0",next:"Next $0",today:"This $0"},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/en-nz.js b/library/fullcalendar/packages/core/locales/en-nz.js
deleted file mode 100644
index df56c1455..000000000
--- a/library/fullcalendar/packages/core/locales/en-nz.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory()));
-}(this, function () { 'use strict';
-
- var enNz = {
- code: "en-nz",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- }
- };
-
- return enNz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/eo.global.js b/library/fullcalendar/packages/core/locales/eo.global.js
new file mode 100644
index 000000000..92ac916bd
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/eo.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'eo',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Antaŭa',
+ next: 'Sekva',
+ today: 'Hodiaŭ',
+ month: 'Monato',
+ week: 'Semajno',
+ day: 'Tago',
+ list: 'Tagordo',
+ },
+ weekText: 'Sm',
+ allDayText: 'Tuta tago',
+ moreLinkText: 'pli',
+ noEventsText: 'Neniuj eventoj por montri',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/eo.global.min.js b/library/fullcalendar/packages/core/locales/eo.global.min.js
new file mode 100644
index 000000000..fc77391ee
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/eo.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"eo",week:{dow:1,doy:4},buttonText:{prev:"Antaŭa",next:"Sekva",today:"Hodiaŭ",month:"Monato",week:"Semajno",day:"Tago",list:"Tagordo"},weekText:"Sm",allDayText:"Tuta tago",moreLinkText:"pli",noEventsText:"Neniuj eventoj por montri"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/es-us.global.js b/library/fullcalendar/packages/core/locales/es-us.global.js
new file mode 100644
index 000000000..e6dfe9612
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/es-us.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'es',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Sig',
+ today: 'Hoy',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Agenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Todo el día',
+ moreLinkText: 'más',
+ noEventsText: 'No hay eventos para mostrar',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/es-us.global.min.js b/library/fullcalendar/packages/core/locales/es-us.global.min.js
new file mode 100644
index 000000000..e66c8273b
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/es-us.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/es-us.js b/library/fullcalendar/packages/core/locales/es-us.js
deleted file mode 100644
index 1efa89a4d..000000000
--- a/library/fullcalendar/packages/core/locales/es-us.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory()));
-}(this, function () { 'use strict';
-
- var esUs = {
- code: "es",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- return esUs;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/es.global.js b/library/fullcalendar/packages/core/locales/es.global.js
new file mode 100644
index 000000000..ab2740f5f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/es.global.js
@@ -0,0 +1,51 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'es',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Sig',
+ today: 'Hoy',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Agenda',
+ },
+ buttonHints: {
+ prev: '$0 antes',
+ next: '$0 siguiente',
+ today(buttonText) {
+ return (buttonText === 'Día') ? 'Hoy' :
+ ((buttonText === 'Semana') ? 'Esta' : 'Este') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ },
+ viewHint(buttonText) {
+ return 'Vista ' + (buttonText === 'Semana' ? 'de la' : 'del') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ weekText: 'Sm',
+ weekTextLong: 'Semana',
+ allDayText: 'Todo el día',
+ moreLinkText: 'más',
+ moreLinkHint(eventCnt) {
+ return `Mostrar ${eventCnt} eventos más`;
+ },
+ noEventsText: 'No hay eventos para mostrar',
+ navLinkHint: 'Ir al $0',
+ closeHint: 'Cerrar',
+ timeHint: 'La hora',
+ eventHint: 'Evento',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/es.global.min.js b/library/fullcalendar/packages/core/locales/es.global.min.js
new file mode 100644
index 000000000..b474665b3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/es.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},buttonHints:{prev:"$0 antes",next:"$0 siguiente",today:e=>"Día"===e?"Hoy":("Semana"===e?"Esta":"Este")+" "+e.toLocaleLowerCase()},viewHint:e=>"Vista "+("Semana"===e?"de la":"del")+" "+e.toLocaleLowerCase(),weekText:"Sm",weekTextLong:"Semana",allDayText:"Todo el día",moreLinkText:"más",moreLinkHint:e=>`Mostrar ${e} eventos más`,noEventsText:"No hay eventos para mostrar",navLinkHint:"Ir al $0",closeHint:"Cerrar",timeHint:"La hora",eventHint:"Evento"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/es.js b/library/fullcalendar/packages/core/locales/es.js
deleted file mode 100644
index bfd9af4c6..000000000
--- a/library/fullcalendar/packages/core/locales/es.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory()));
-}(this, function () { 'use strict';
-
- var es = {
- code: "es",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Sig",
- today: "Hoy",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>el día",
- eventLimitText: "más",
- noEventsMessage: "No hay eventos para mostrar"
- };
-
- return es;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/et.global.js b/library/fullcalendar/packages/core/locales/et.global.js
new file mode 100644
index 000000000..7c6afd619
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/et.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'et',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Eelnev',
+ next: 'Järgnev',
+ today: 'Täna',
+ month: 'Kuu',
+ week: 'Nädal',
+ day: 'Päev',
+ list: 'Päevakord',
+ },
+ weekText: 'näd',
+ allDayText: 'Kogu päev',
+ moreLinkText(n) {
+ return '+ veel ' + n;
+ },
+ noEventsText: 'Kuvamiseks puuduvad sündmused',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/et.global.min.js b/library/fullcalendar/packages/core/locales/et.global.min.js
new file mode 100644
index 000000000..5da61b489
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/et.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:e=>"+ veel "+e,noEventsText:"Kuvamiseks puuduvad sündmused"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/et.js b/library/fullcalendar/packages/core/locales/et.js
deleted file mode 100644
index c44fcaec9..000000000
--- a/library/fullcalendar/packages/core/locales/et.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory()));
-}(this, function () { 'use strict';
-
- var et = {
- code: "et",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Eelnev",
- next: "Järgnev",
- today: "Täna",
- month: "Kuu",
- week: "Nädal",
- day: "Päev",
- list: "Päevakord"
- },
- weekLabel: "näd",
- allDayText: "Kogu päev",
- eventLimitText: function (n) {
- return "+ veel " + n;
- },
- noEventsMessage: "Kuvamiseks puuduvad sündmused"
- };
-
- return et;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/eu.global.js b/library/fullcalendar/packages/core/locales/eu.global.js
new file mode 100644
index 000000000..f5621bcea
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/eu.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'eu',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Aur',
+ next: 'Hur',
+ today: 'Gaur',
+ month: 'Hilabetea',
+ week: 'Astea',
+ day: 'Eguna',
+ list: 'Agenda',
+ },
+ weekText: 'As',
+ allDayText: 'Egun osoa',
+ moreLinkText: 'gehiago',
+ noEventsText: 'Ez dago ekitaldirik erakusteko',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/eu.global.min.js b/library/fullcalendar/packages/core/locales/eu.global.min.js
new file mode 100644
index 000000000..30e38e562
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/eu.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/eu.js b/library/fullcalendar/packages/core/locales/eu.js
deleted file mode 100644
index 91903aaaf..000000000
--- a/library/fullcalendar/packages/core/locales/eu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory()));
-}(this, function () { 'use strict';
-
- var eu = {
- code: "eu",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Aur",
- next: "Hur",
- today: "Gaur",
- month: "Hilabetea",
- week: "Astea",
- day: "Eguna",
- list: "Agenda"
- },
- weekLabel: "As",
- allDayHtml: "Egun<br/>osoa",
- eventLimitText: "gehiago",
- noEventsMessage: "Ez dago ekitaldirik erakusteko"
- };
-
- return eu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fa.global.js b/library/fullcalendar/packages/core/locales/fa.global.js
new file mode 100644
index 000000000..3416dee17
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fa.global.js
@@ -0,0 +1,35 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'fa',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'قبلی',
+ next: 'بعدی',
+ today: 'امروز',
+ month: 'ماه',
+ week: 'هفته',
+ day: 'روز',
+ list: 'برنامه',
+ },
+ weekText: 'هف',
+ allDayText: 'تمام روز',
+ moreLinkText(n) {
+ return 'بیش از ' + n;
+ },
+ noEventsText: 'هیچ رویدادی به نمایش',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/fa.global.min.js b/library/fullcalendar/packages/core/locales/fa.global.min.js
new file mode 100644
index 000000000..ad3504b72
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fa.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:e=>"بیش از "+e,noEventsText:"هیچ رویدادی به نمایش"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/fa.js b/library/fullcalendar/packages/core/locales/fa.js
deleted file mode 100644
index 031fc7b30..000000000
--- a/library/fullcalendar/packages/core/locales/fa.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory()));
-}(this, function () { 'use strict';
-
- var fa = {
- code: "fa",
- week: {
- dow: 6,
- doy: 12 // The week that contains Jan 1st is the first week of the year.
- },
- dir: 'rtl',
- buttonText: {
- prev: "قبلی",
- next: "بعدی",
- today: "امروز",
- month: "ماه",
- week: "هفته",
- day: "روز",
- list: "برنامه"
- },
- weekLabel: "هف",
- allDayText: "تمام روز",
- eventLimitText: function (n) {
- return "بیش از " + n;
- },
- noEventsMessage: "هیچ رویدادی به نمایش"
- };
-
- return fa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fi.global.js b/library/fullcalendar/packages/core/locales/fi.global.js
new file mode 100644
index 000000000..9fa2cfa92
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fi.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'fi',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Edellinen',
+ next: 'Seuraava',
+ today: 'Tänään',
+ month: 'Kuukausi',
+ week: 'Viikko',
+ day: 'Päivä',
+ list: 'Tapahtumat',
+ },
+ weekText: 'Vk',
+ allDayText: 'Koko päivä',
+ moreLinkText: 'lisää',
+ noEventsText: 'Ei näytettäviä tapahtumia',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/fi.global.min.js b/library/fullcalendar/packages/core/locales/fi.global.min.js
new file mode 100644
index 000000000..43fe9ec5d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fi.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/fi.js b/library/fullcalendar/packages/core/locales/fi.js
deleted file mode 100644
index 3912845cf..000000000
--- a/library/fullcalendar/packages/core/locales/fi.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory()));
-}(this, function () { 'use strict';
-
- var fi = {
- code: "fi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Edellinen",
- next: "Seuraava",
- today: "Tänään",
- month: "Kuukausi",
- week: "Viikko",
- day: "Päivä",
- list: "Tapahtumat"
- },
- weekLabel: "Vk",
- allDayText: "Koko päivä",
- eventLimitText: "lisää",
- noEventsMessage: "Ei näytettäviä tapahtumia"
- };
-
- return fi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr-ca.global.js b/library/fullcalendar/packages/core/locales/fr-ca.global.js
new file mode 100644
index 000000000..86d9b06ba
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr-ca.global.js
@@ -0,0 +1,29 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'fr',
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Aujourd\'hui',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Mon planning',
+ },
+ weekText: 'Sem.',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/fr-ca.global.min.js b/library/fullcalendar/packages/core/locales/fr-ca.global.min.js
new file mode 100644
index 000000000..c859af816
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr-ca.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/fr-ca.js b/library/fullcalendar/packages/core/locales/fr-ca.js
deleted file mode 100644
index d554c1408..000000000
--- a/library/fullcalendar/packages/core/locales/fr-ca.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory()));
-}(this, function () { 'use strict';
-
- var frCa = {
- code: "fr",
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return frCa;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr-ch.global.js b/library/fullcalendar/packages/core/locales/fr-ch.global.js
new file mode 100644
index 000000000..7291bc156
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr-ch.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'fr-ch',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Courant',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Mon planning',
+ },
+ weekText: 'Sm',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/fr-ch.global.min.js b/library/fullcalendar/packages/core/locales/fr-ch.global.min.js
new file mode 100644
index 000000000..154dd9340
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr-ch.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/fr-ch.js b/library/fullcalendar/packages/core/locales/fr-ch.js
deleted file mode 100644
index 358b8bf31..000000000
--- a/library/fullcalendar/packages/core/locales/fr-ch.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory()));
-}(this, function () { 'use strict';
-
- var frCh = {
- code: "fr-ch",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Courant",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Mon planning"
- },
- weekLabel: "Sm",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return frCh;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/fr.global.js b/library/fullcalendar/packages/core/locales/fr.global.js
new file mode 100644
index 000000000..d63b2e5dc
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'fr',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Précédent',
+ next: 'Suivant',
+ today: 'Aujourd\'hui',
+ year: 'Année',
+ month: 'Mois',
+ week: 'Semaine',
+ day: 'Jour',
+ list: 'Planning',
+ },
+ weekText: 'Sem.',
+ allDayText: 'Toute la journée',
+ moreLinkText: 'en plus',
+ noEventsText: 'Aucun événement à afficher',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/fr.global.min.js b/library/fullcalendar/packages/core/locales/fr.global.min.js
new file mode 100644
index 000000000..68968a1eb
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/fr.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/fr.js b/library/fullcalendar/packages/core/locales/fr.js
deleted file mode 100644
index 4760a71a9..000000000
--- a/library/fullcalendar/packages/core/locales/fr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory()));
-}(this, function () { 'use strict';
-
- var fr = {
- code: "fr",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Précédent",
- next: "Suivant",
- today: "Aujourd'hui",
- year: "Année",
- month: "Mois",
- week: "Semaine",
- day: "Jour",
- list: "Planning"
- },
- weekLabel: "Sem.",
- allDayHtml: "Toute la<br/>journée",
- eventLimitText: "en plus",
- noEventsMessage: "Aucun événement à afficher"
- };
-
- return fr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/gl.global.js b/library/fullcalendar/packages/core/locales/gl.global.js
new file mode 100644
index 000000000..de8ed6996
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/gl.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'gl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Ant',
+ next: 'Seg',
+ today: 'Hoxe',
+ month: 'Mes',
+ week: 'Semana',
+ day: 'Día',
+ list: 'Axenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Todo o día',
+ moreLinkText: 'máis',
+ noEventsText: 'Non hai eventos para amosar',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/gl.global.min.js b/library/fullcalendar/packages/core/locales/gl.global.min.js
new file mode 100644
index 000000000..1bae51a3b
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/gl.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/gl.js b/library/fullcalendar/packages/core/locales/gl.js
deleted file mode 100644
index 721a6a89b..000000000
--- a/library/fullcalendar/packages/core/locales/gl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory()));
-}(this, function () { 'use strict';
-
- var gl = {
- code: "gl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Ant",
- next: "Seg",
- today: "Hoxe",
- month: "Mes",
- week: "Semana",
- day: "Día",
- list: "Axenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Todo<br/>o día",
- eventLimitText: "máis",
- noEventsMessage: "Non hai eventos para amosar"
- };
-
- return gl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/he.global.js b/library/fullcalendar/packages/core/locales/he.global.js
new file mode 100644
index 000000000..1b6dd6acf
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/he.global.js
@@ -0,0 +1,29 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'he',
+ direction: 'rtl',
+ buttonText: {
+ prev: 'הקודם',
+ next: 'הבא',
+ today: 'היום',
+ month: 'חודש',
+ week: 'שבוע',
+ day: 'יום',
+ list: 'סדר יום',
+ },
+ allDayText: 'כל היום',
+ moreLinkText: 'אחר',
+ noEventsText: 'אין אירועים להצגה',
+ weekText: 'שבוע',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/he.global.min.js b/library/fullcalendar/packages/core/locales/he.global.min.js
new file mode 100644
index 000000000..8f8f4bd78
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/he.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/he.js b/library/fullcalendar/packages/core/locales/he.js
deleted file mode 100644
index 3521d9e33..000000000
--- a/library/fullcalendar/packages/core/locales/he.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory()));
-}(this, function () { 'use strict';
-
- var he = {
- code: "he",
- dir: 'rtl',
- buttonText: {
- prev: "הקודם",
- next: "הבא",
- today: "היום",
- month: "חודש",
- week: "שבוע",
- day: "יום",
- list: "סדר יום"
- },
- allDayText: "כל היום",
- eventLimitText: "אחר",
- noEventsMessage: "אין אירועים להצגה",
- weekLabel: "שבוע"
- };
-
- return he;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hi.global.js b/library/fullcalendar/packages/core/locales/hi.global.js
new file mode 100644
index 000000000..a63d5d790
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hi.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'hi',
+ week: {
+ dow: 0,
+ doy: 6, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'पिछला',
+ next: 'अगला',
+ today: 'आज',
+ month: 'महीना',
+ week: 'सप्ताह',
+ day: 'दिन',
+ list: 'कार्यसूची',
+ },
+ weekText: 'हफ्ता',
+ allDayText: 'सभी दिन',
+ moreLinkText(n) {
+ return '+अधिक ' + n;
+ },
+ noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/hi.global.min.js b/library/fullcalendar/packages/core/locales/hi.global.min.js
new file mode 100644
index 000000000..ef318e488
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hi.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:e=>"+अधिक "+e,noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/hi.js b/library/fullcalendar/packages/core/locales/hi.js
deleted file mode 100644
index 15348e697..000000000
--- a/library/fullcalendar/packages/core/locales/hi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory()));
-}(this, function () { 'use strict';
-
- var hi = {
- code: "hi",
- week: {
- dow: 0,
- doy: 6 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "पिछला",
- next: "अगला",
- today: "आज",
- month: "महीना",
- week: "सप्ताह",
- day: "दिन",
- list: "कार्यसूची"
- },
- weekLabel: "हफ्ता",
- allDayText: "सभी दिन",
- eventLimitText: function (n) {
- return "+अधिक " + n;
- },
- noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
- };
-
- return hi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hr.global.js b/library/fullcalendar/packages/core/locales/hr.global.js
new file mode 100644
index 000000000..7a1e5c12b
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hr.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'hr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prijašnji',
+ next: 'Sljedeći',
+ today: 'Danas',
+ month: 'Mjesec',
+ week: 'Tjedan',
+ day: 'Dan',
+ list: 'Raspored',
+ },
+ weekText: 'Tje',
+ allDayText: 'Cijeli dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nema događaja za prikaz',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/hr.global.min.js b/library/fullcalendar/packages/core/locales/hr.global.min.js
new file mode 100644
index 000000000..e28d75b96
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hr.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var a={code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nema događaja za prikaz"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/hr.js b/library/fullcalendar/packages/core/locales/hr.js
deleted file mode 100644
index 295b48566..000000000
--- a/library/fullcalendar/packages/core/locales/hr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory()));
-}(this, function () { 'use strict';
-
- var hr = {
- code: "hr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prijašnji",
- next: "Sljedeći",
- today: "Danas",
- month: "Mjesec",
- week: "Tjedan",
- day: "Dan",
- list: "Raspored"
- },
- weekLabel: "Tje",
- allDayText: "Cijeli dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nema događaja za prikaz"
- };
-
- return hr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hu.global.js b/library/fullcalendar/packages/core/locales/hu.global.js
new file mode 100644
index 000000000..d4f5a3f2d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hu.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'hu',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'vissza',
+ next: 'előre',
+ today: 'ma',
+ month: 'Hónap',
+ week: 'Hét',
+ day: 'Nap',
+ list: 'Lista',
+ },
+ weekText: 'Hét',
+ allDayText: 'Egész nap',
+ moreLinkText: 'további',
+ noEventsText: 'Nincs megjeleníthető esemény',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/hu.global.min.js b/library/fullcalendar/packages/core/locales/hu.global.min.js
new file mode 100644
index 000000000..e235a1a9f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hu.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Lista"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/hu.js b/library/fullcalendar/packages/core/locales/hu.js
deleted file mode 100644
index 2f0fe8acb..000000000
--- a/library/fullcalendar/packages/core/locales/hu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory()));
-}(this, function () { 'use strict';
-
- var hu = {
- code: "hu",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "vissza",
- next: "előre",
- today: "ma",
- month: "Hónap",
- week: "Hét",
- day: "Nap",
- list: "Napló"
- },
- weekLabel: "Hét",
- allDayText: "Egész nap",
- eventLimitText: "további",
- noEventsMessage: "Nincs megjeleníthető esemény"
- };
-
- return hu;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/hy-am.global.js b/library/fullcalendar/packages/core/locales/hy-am.global.js
new file mode 100644
index 000000000..d1d950cc8
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hy-am.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'hy-am',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Նախորդ',
+ next: 'Հաջորդ',
+ today: 'Այսօր',
+ month: 'Ամիս',
+ week: 'Շաբաթ',
+ day: 'Օր',
+ list: 'Օրվա ցուցակ',
+ },
+ weekText: 'Շաբ',
+ allDayText: 'Ամբողջ օր',
+ moreLinkText(n) {
+ return '+ ևս ' + n;
+ },
+ noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/hy-am.global.min.js b/library/fullcalendar/packages/core/locales/hy-am.global.min.js
new file mode 100644
index 000000000..59a9a5386
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/hy-am.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"hy-am",week:{dow:1,doy:4},buttonText:{prev:"Նախորդ",next:"Հաջորդ",today:"Այսօր",month:"Ամիս",week:"Շաբաթ",day:"Օր",list:"Օրվա ցուցակ"},weekText:"Շաբ",allDayText:"Ամբողջ օր",moreLinkText:e=>"+ ևս "+e,noEventsText:"Բացակայում է իրադարձությունը ցուցադրելու"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/id.global.js b/library/fullcalendar/packages/core/locales/id.global.js
new file mode 100644
index 000000000..9547051f2
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/id.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'id',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'mundur',
+ next: 'maju',
+ today: 'hari ini',
+ month: 'Bulan',
+ week: 'Minggu',
+ day: 'Hari',
+ list: 'Agenda',
+ },
+ weekText: 'Mg',
+ allDayText: 'Sehari penuh',
+ moreLinkText: 'lebih',
+ noEventsText: 'Tidak ada acara untuk ditampilkan',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/id.global.min.js b/library/fullcalendar/packages/core/locales/id.global.min.js
new file mode 100644
index 000000000..e2992c296
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/id.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/id.js b/library/fullcalendar/packages/core/locales/id.js
deleted file mode 100644
index b742e80dd..000000000
--- a/library/fullcalendar/packages/core/locales/id.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory()));
-}(this, function () { 'use strict';
-
- var id = {
- code: "id",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "mundur",
- next: "maju",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayHtml: "Sehari<br/>penuh",
- eventLimitText: "lebih",
- noEventsMessage: "Tidak ada acara untuk ditampilkan"
- };
-
- return id;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/is.global.js b/library/fullcalendar/packages/core/locales/is.global.js
new file mode 100644
index 000000000..834978af6
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/is.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'is',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Fyrri',
+ next: 'Næsti',
+ today: 'Í dag',
+ month: 'Mánuður',
+ week: 'Vika',
+ day: 'Dagur',
+ list: 'Dagskrá',
+ },
+ weekText: 'Vika',
+ allDayText: 'Allan daginn',
+ moreLinkText: 'meira',
+ noEventsText: 'Engir viðburðir til að sýna',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/is.global.min.js b/library/fullcalendar/packages/core/locales/is.global.min.js
new file mode 100644
index 000000000..4af1f65a3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/is.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/is.js b/library/fullcalendar/packages/core/locales/is.js
deleted file mode 100644
index dd569bce7..000000000
--- a/library/fullcalendar/packages/core/locales/is.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory()));
-}(this, function () { 'use strict';
-
- var is = {
- code: "is",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Fyrri",
- next: "Næsti",
- today: "Í dag",
- month: "Mánuður",
- week: "Vika",
- day: "Dagur",
- list: "Dagskrá"
- },
- weekLabel: "Vika",
- allDayHtml: "Allan<br/>daginn",
- eventLimitText: "meira",
- noEventsMessage: "Engir viðburðir til að sýna"
- };
-
- return is;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/it.global.js b/library/fullcalendar/packages/core/locales/it.global.js
new file mode 100644
index 000000000..987e8570a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/it.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'it',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prec',
+ next: 'Succ',
+ today: 'Oggi',
+ month: 'Mese',
+ week: 'Settimana',
+ day: 'Giorno',
+ list: 'Agenda',
+ },
+ weekText: 'Sm',
+ allDayText: 'Tutto il giorno',
+ moreLinkText(n) {
+ return '+altri ' + n;
+ },
+ noEventsText: 'Non ci sono eventi da visualizzare',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/it.global.min.js b/library/fullcalendar/packages/core/locales/it.global.min.js
new file mode 100644
index 000000000..61ea08b70
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/it.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:e=>"+altri "+e,noEventsText:"Non ci sono eventi da visualizzare"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/it.js b/library/fullcalendar/packages/core/locales/it.js
deleted file mode 100644
index 39a2829e5..000000000
--- a/library/fullcalendar/packages/core/locales/it.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory()));
-}(this, function () { 'use strict';
-
- var it = {
- code: "it",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Prec",
- next: "Succ",
- today: "Oggi",
- month: "Mese",
- week: "Settimana",
- day: "Giorno",
- list: "Agenda"
- },
- weekLabel: "Sm",
- allDayHtml: "Tutto il<br/>giorno",
- eventLimitText: function (n) {
- return "+altri " + n;
- },
- noEventsMessage: "Non ci sono eventi da visualizzare"
- };
-
- return it;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ja.global.js b/library/fullcalendar/packages/core/locales/ja.global.js
new file mode 100644
index 000000000..d6d8a3cea
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ja.global.js
@@ -0,0 +1,30 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ja',
+ buttonText: {
+ prev: '前',
+ next: '次',
+ today: '今日',
+ month: '月',
+ week: '週',
+ day: '日',
+ list: '予定リスト',
+ },
+ weekText: '週',
+ allDayText: '終日',
+ moreLinkText(n) {
+ return '他 ' + n + ' 件';
+ },
+ noEventsText: '表示する予定はありません',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ja.global.min.js b/library/fullcalendar/packages/core/locales/ja.global.min.js
new file mode 100644
index 000000000..472f96141
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ja.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:e=>"他 "+e+" 件",noEventsText:"表示する予定はありません"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ja.js b/library/fullcalendar/packages/core/locales/ja.js
deleted file mode 100644
index eb4245b2a..000000000
--- a/library/fullcalendar/packages/core/locales/ja.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory()));
-}(this, function () { 'use strict';
-
- var ja = {
- code: "ja",
- buttonText: {
- prev: "前",
- next: "次",
- today: "今日",
- month: "月",
- week: "週",
- day: "日",
- list: "予定リスト"
- },
- weekLabel: "週",
- allDayText: "終日",
- eventLimitText: function (n) {
- return "他 " + n + " 件";
- },
- noEventsMessage: "表示する予定はありません"
- };
-
- return ja;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ka.global.js b/library/fullcalendar/packages/core/locales/ka.global.js
new file mode 100644
index 000000000..4c94baf2f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ka.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ka',
+ week: {
+ dow: 1,
+ doy: 7,
+ },
+ buttonText: {
+ prev: 'წინა',
+ next: 'შემდეგი',
+ today: 'დღეს',
+ month: 'თვე',
+ week: 'კვირა',
+ day: 'დღე',
+ list: 'დღის წესრიგი',
+ },
+ weekText: 'კვ',
+ allDayText: 'მთელი დღე',
+ moreLinkText(n) {
+ return '+ კიდევ ' + n;
+ },
+ noEventsText: 'ღონისძიებები არ არის',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ka.global.min.js b/library/fullcalendar/packages/core/locales/ka.global.min.js
new file mode 100644
index 000000000..d097866de
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ka.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:e=>"+ კიდევ "+e,noEventsText:"ღონისძიებები არ არის"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ka.js b/library/fullcalendar/packages/core/locales/ka.js
deleted file mode 100644
index b971c033f..000000000
--- a/library/fullcalendar/packages/core/locales/ka.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory()));
-}(this, function () { 'use strict';
-
- var ka = {
- code: "ka",
- week: {
- dow: 1,
- doy: 7
- },
- buttonText: {
- prev: "წინა",
- next: "შემდეგი",
- today: "დღეს",
- month: "თვე",
- week: "კვირა",
- day: "დღე",
- list: "დღის წესრიგი"
- },
- weekLabel: "კვ",
- allDayText: "მთელი დღე",
- eventLimitText: function (n) {
- return "+ კიდევ " + n;
- },
- noEventsMessage: "ღონისძიებები არ არის"
- };
-
- return ka;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/kk.global.js b/library/fullcalendar/packages/core/locales/kk.global.js
new file mode 100644
index 000000000..156f3fd96
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/kk.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'kk',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Алдыңғы',
+ next: 'Келесі',
+ today: 'Бүгін',
+ month: 'Ай',
+ week: 'Апта',
+ day: 'Күн',
+ list: 'Күн тәртібі',
+ },
+ weekText: 'Не',
+ allDayText: 'Күні бойы',
+ moreLinkText(n) {
+ return '+ тағы ' + n;
+ },
+ noEventsText: 'Көрсету үшін оқиғалар жоқ',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/kk.global.min.js b/library/fullcalendar/packages/core/locales/kk.global.min.js
new file mode 100644
index 000000000..c08d73b20
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/kk.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:e=>"+ тағы "+e,noEventsText:"Көрсету үшін оқиғалар жоқ"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/kk.js b/library/fullcalendar/packages/core/locales/kk.js
deleted file mode 100644
index 5b19b99d5..000000000
--- a/library/fullcalendar/packages/core/locales/kk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory()));
-}(this, function () { 'use strict';
-
- var kk = {
- code: "kk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Алдыңғы",
- next: "Келесі",
- today: "Бүгін",
- month: "Ай",
- week: "Апта",
- day: "Күн",
- list: "Күн тәртібі"
- },
- weekLabel: "Не",
- allDayText: "Күні бойы",
- eventLimitText: function (n) {
- return "+ тағы " + n;
- },
- noEventsMessage: "Көрсету үшін оқиғалар жоқ"
- };
-
- return kk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/km.global.js b/library/fullcalendar/packages/core/locales/km.global.js
new file mode 100644
index 000000000..fd4dc3baa
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/km.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'km',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'មុន',
+ next: 'បន្ទាប់',
+ today: 'ថ្ងៃនេះ',
+ year: 'ឆ្នាំ',
+ month: 'ខែ',
+ week: 'សប្តាហ៍',
+ day: 'ថ្ងៃ',
+ list: 'បញ្ជី',
+ },
+ weekText: 'សប្តាហ៍',
+ allDayText: 'ពេញមួយថ្ងៃ',
+ moreLinkText: 'ច្រើនទៀត',
+ noEventsText: 'គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/km.global.min.js b/library/fullcalendar/packages/core/locales/km.global.min.js
new file mode 100644
index 000000000..73523f8e3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/km.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"km",week:{dow:1,doy:4},buttonText:{prev:"មុន",next:"បន្ទាប់",today:"ថ្ងៃនេះ",year:"ឆ្នាំ",month:"ខែ",week:"សប្តាហ៍",day:"ថ្ងៃ",list:"បញ្ជី"},weekText:"សប្តាហ៍",allDayText:"ពេញមួយថ្ងៃ",moreLinkText:"ច្រើនទៀត",noEventsText:"គ្មានព្រឹត្តិការណ៍ត្រូវបង្ហាញ"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ko.global.js b/library/fullcalendar/packages/core/locales/ko.global.js
new file mode 100644
index 000000000..58b71797a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ko.global.js
@@ -0,0 +1,28 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ko',
+ buttonText: {
+ prev: '이전달',
+ next: '다음달',
+ today: '오늘',
+ month: '월',
+ week: '주',
+ day: '일',
+ list: '일정목록',
+ },
+ weekText: '주',
+ allDayText: '종일',
+ moreLinkText: '개',
+ noEventsText: '일정이 없습니다',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ko.global.min.js b/library/fullcalendar/packages/core/locales/ko.global.min.js
new file mode 100644
index 000000000..0930818b8
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ko.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ko.js b/library/fullcalendar/packages/core/locales/ko.js
deleted file mode 100644
index ffe985d6c..000000000
--- a/library/fullcalendar/packages/core/locales/ko.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory()));
-}(this, function () { 'use strict';
-
- var ko = {
- code: "ko",
- buttonText: {
- prev: "이전달",
- next: "다음달",
- today: "오늘",
- month: "월",
- week: "주",
- day: "일",
- list: "일정목록"
- },
- weekLabel: "주",
- allDayText: "종일",
- eventLimitText: "개",
- noEventsMessage: "일정이 없습니다"
- };
-
- return ko;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ku.global.js b/library/fullcalendar/packages/core/locales/ku.global.js
new file mode 100644
index 000000000..279d0aa4d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ku.global.js
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ku',
+ week: {
+ dow: 6,
+ doy: 12, // The week that contains Jan 1st is the first week of the year.
+ },
+ direction: 'rtl',
+ buttonText: {
+ prev: 'پێشتر',
+ next: 'دواتر',
+ today: 'ئەمڕو',
+ month: 'مانگ',
+ week: 'هەفتە',
+ day: 'ڕۆژ',
+ list: 'بەرنامە',
+ },
+ weekText: 'هەفتە',
+ allDayText: 'هەموو ڕۆژەکە',
+ moreLinkText: 'زیاتر',
+ noEventsText: 'هیچ ڕووداوێك نیە',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ku.global.min.js b/library/fullcalendar/packages/core/locales/ku.global.min.js
new file mode 100644
index 000000000..fff5b8414
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ku.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ku",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"پێشتر",next:"دواتر",today:"ئەمڕو",month:"مانگ",week:"هەفتە",day:"ڕۆژ",list:"بەرنامە"},weekText:"هەفتە",allDayText:"هەموو ڕۆژەکە",moreLinkText:"زیاتر",noEventsText:"هیچ ڕووداوێك نیە"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/lb.global.js b/library/fullcalendar/packages/core/locales/lb.global.js
new file mode 100644
index 000000000..21e280093
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lb.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'lb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Zréck',
+ next: 'Weider',
+ today: 'Haut',
+ month: 'Mount',
+ week: 'Woch',
+ day: 'Dag',
+ list: 'Terminiwwersiicht',
+ },
+ weekText: 'W',
+ allDayText: 'Ganzen Dag',
+ moreLinkText: 'méi',
+ noEventsText: 'Nee Evenementer ze affichéieren',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/lb.global.min.js b/library/fullcalendar/packages/core/locales/lb.global.min.js
new file mode 100644
index 000000000..80b2a77cc
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lb.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/lb.js b/library/fullcalendar/packages/core/locales/lb.js
deleted file mode 100644
index b9b17e3ec..000000000
--- a/library/fullcalendar/packages/core/locales/lb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory()));
-}(this, function () { 'use strict';
-
- var lb = {
- code: "lb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Zréck",
- next: "Weider",
- today: "Haut",
- month: "Mount",
- week: "Woch",
- day: "Dag",
- list: "Terminiwwersiicht"
- },
- weekLabel: "W",
- allDayText: "Ganzen Dag",
- eventLimitText: "méi",
- noEventsMessage: "Nee Evenementer ze affichéieren"
- };
-
- return lb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/lt.global.js b/library/fullcalendar/packages/core/locales/lt.global.js
new file mode 100644
index 000000000..826d70d23
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lt.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'lt',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Atgal',
+ next: 'Pirmyn',
+ today: 'Šiandien',
+ month: 'Mėnuo',
+ week: 'Savaitė',
+ day: 'Diena',
+ list: 'Darbotvarkė',
+ },
+ weekText: 'SAV',
+ allDayText: 'Visą dieną',
+ moreLinkText: 'daugiau',
+ noEventsText: 'Nėra įvykių rodyti',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/lt.global.min.js b/library/fullcalendar/packages/core/locales/lt.global.min.js
new file mode 100644
index 000000000..09a7cae46
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lt.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/lt.js b/library/fullcalendar/packages/core/locales/lt.js
deleted file mode 100644
index ec641b750..000000000
--- a/library/fullcalendar/packages/core/locales/lt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory()));
-}(this, function () { 'use strict';
-
- var lt = {
- code: "lt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Atgal",
- next: "Pirmyn",
- today: "Šiandien",
- month: "Mėnuo",
- week: "Savaitė",
- day: "Diena",
- list: "Darbotvarkė"
- },
- weekLabel: "SAV",
- allDayText: "Visą dieną",
- eventLimitText: "daugiau",
- noEventsMessage: "Nėra įvykių rodyti"
- };
-
- return lt;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/lv.global.js b/library/fullcalendar/packages/core/locales/lv.global.js
new file mode 100644
index 000000000..14b808c53
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lv.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'lv',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Iepr.',
+ next: 'Nāk.',
+ today: 'Šodien',
+ month: 'Mēnesis',
+ week: 'Nedēļa',
+ day: 'Diena',
+ list: 'Dienas kārtība',
+ },
+ weekText: 'Ned.',
+ allDayText: 'Visu dienu',
+ moreLinkText(n) {
+ return '+vēl ' + n;
+ },
+ noEventsText: 'Nav notikumu',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/lv.global.min.js b/library/fullcalendar/packages/core/locales/lv.global.min.js
new file mode 100644
index 000000000..599d84c82
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/lv.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:e=>"+vēl "+e,noEventsText:"Nav notikumu"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/lv.js b/library/fullcalendar/packages/core/locales/lv.js
deleted file mode 100644
index 5453630df..000000000
--- a/library/fullcalendar/packages/core/locales/lv.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory()));
-}(this, function () { 'use strict';
-
- var lv = {
- code: "lv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Iepr.",
- next: "Nāk.",
- today: "Šodien",
- month: "Mēnesis",
- week: "Nedēļa",
- day: "Diena",
- list: "Dienas kārtība"
- },
- weekLabel: "Ned.",
- allDayText: "Visu dienu",
- eventLimitText: function (n) {
- return "+vēl " + n;
- },
- noEventsMessage: "Nav notikumu"
- };
-
- return lv;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/mk.global.js b/library/fullcalendar/packages/core/locales/mk.global.js
new file mode 100644
index 000000000..5f15d7f09
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/mk.global.js
@@ -0,0 +1,30 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'mk',
+ buttonText: {
+ prev: 'претходно',
+ next: 'следно',
+ today: 'Денес',
+ month: 'Месец',
+ week: 'Недела',
+ day: 'Ден',
+ list: 'График',
+ },
+ weekText: 'Сед',
+ allDayText: 'Цел ден',
+ moreLinkText(n) {
+ return '+повеќе ' + n;
+ },
+ noEventsText: 'Нема настани за прикажување',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/mk.global.min.js b/library/fullcalendar/packages/core/locales/mk.global.min.js
new file mode 100644
index 000000000..f32043a9d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/mk.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:e=>"+повеќе "+e,noEventsText:"Нема настани за прикажување"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/mk.js b/library/fullcalendar/packages/core/locales/mk.js
deleted file mode 100644
index 6729fa63d..000000000
--- a/library/fullcalendar/packages/core/locales/mk.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory()));
-}(this, function () { 'use strict';
-
- var mk = {
- code: "mk",
- buttonText: {
- prev: "претходно",
- next: "следно",
- today: "Денес",
- month: "Месец",
- week: "Недела",
- day: "Ден",
- list: "График"
- },
- weekLabel: "Сед",
- allDayText: "Цел ден",
- eventLimitText: function (n) {
- return "+повеќе " + n;
- },
- noEventsMessage: "Нема настани за прикажување"
- };
-
- return mk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ms.global.js b/library/fullcalendar/packages/core/locales/ms.global.js
new file mode 100644
index 000000000..46e3bc78a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ms.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ms',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Sebelum',
+ next: 'Selepas',
+ today: 'hari ini',
+ month: 'Bulan',
+ week: 'Minggu',
+ day: 'Hari',
+ list: 'Agenda',
+ },
+ weekText: 'Mg',
+ allDayText: 'Sepanjang hari',
+ moreLinkText(n) {
+ return 'masih ada ' + n + ' acara';
+ },
+ noEventsText: 'Tiada peristiwa untuk dipaparkan',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ms.global.min.js b/library/fullcalendar/packages/core/locales/ms.global.min.js
new file mode 100644
index 000000000..3626ca8b5
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ms.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(a){"use strict";var e={code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:a=>"masih ada "+a+" acara",noEventsText:"Tiada peristiwa untuk dipaparkan"};FullCalendar.globalLocales.push(e)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ms.js b/library/fullcalendar/packages/core/locales/ms.js
deleted file mode 100644
index 7205ecc72..000000000
--- a/library/fullcalendar/packages/core/locales/ms.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory()));
-}(this, function () { 'use strict';
-
- var ms = {
- code: "ms",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Sebelum",
- next: "Selepas",
- today: "hari ini",
- month: "Bulan",
- week: "Minggu",
- day: "Hari",
- list: "Agenda"
- },
- weekLabel: "Mg",
- allDayText: "Sepanjang hari",
- eventLimitText: function (n) {
- return "masih ada " + n + " acara";
- },
- noEventsMessage: "Tiada peristiwa untuk dipaparkan"
- };
-
- return ms;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/nb.global.js b/library/fullcalendar/packages/core/locales/nb.global.js
new file mode 100644
index 000000000..28e0e4375
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nb.global.js
@@ -0,0 +1,43 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'nb',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Forrige',
+ next: 'Neste',
+ today: 'I dag',
+ month: 'Måned',
+ week: 'Uke',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Uke',
+ weekTextLong: 'Uke',
+ allDayText: 'Hele dagen',
+ moreLinkText: 'til',
+ noEventsText: 'Ingen hendelser å vise',
+ buttonHints: {
+ prev: 'Forrige $0',
+ next: 'Neste $0',
+ today: 'Nåværende $0',
+ },
+ viewHint: '$0 visning',
+ navLinkHint: 'Gå til $0',
+ moreLinkHint(eventCnt) {
+ return `Vis ${eventCnt} flere hendelse${eventCnt === 1 ? '' : 'r'}`;
+ },
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/nb.global.min.js b/library/fullcalendar/packages/core/locales/nb.global.min.js
new file mode 100644
index 000000000..103bcee1f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nb.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var n={code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",weekTextLong:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise",buttonHints:{prev:"Forrige $0",next:"Neste $0",today:"Nåværende $0"},viewHint:"$0 visning",navLinkHint:"Gå til $0",moreLinkHint:e=>`Vis ${e} flere hendelse${1===e?"":"r"}`};FullCalendar.globalLocales.push(n)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/nb.js b/library/fullcalendar/packages/core/locales/nb.js
deleted file mode 100644
index 6464461c6..000000000
--- a/library/fullcalendar/packages/core/locales/nb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory()));
-}(this, function () { 'use strict';
-
- var nb = {
- code: "nb",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Forrige",
- next: "Neste",
- today: "I dag",
- month: "Måned",
- week: "Uke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Uke",
- allDayText: "Hele dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- return nb;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ne.global.js b/library/fullcalendar/packages/core/locales/ne.global.js
new file mode 100644
index 000000000..22f073997
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ne.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ne',
+ week: {
+ dow: 7,
+ doy: 1, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'अघिल्लो',
+ next: 'अर्को',
+ today: 'आज',
+ month: 'महिना',
+ week: 'हप्ता',
+ day: 'दिन',
+ list: 'सूची',
+ },
+ weekText: 'हप्ता',
+ allDayText: 'दिनभरि',
+ moreLinkText: 'थप लिंक',
+ noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ne.global.min.js b/library/fullcalendar/packages/core/locales/ne.global.min.js
new file mode 100644
index 000000000..4e51355d8
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ne.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"ne",week:{dow:7,doy:1},buttonText:{prev:"अघिल्लो",next:"अर्को",today:"आज",month:"महिना",week:"हप्ता",day:"दिन",list:"सूची"},weekText:"हप्ता",allDayText:"दिनभरि",moreLinkText:"थप लिंक",noEventsText:"देखाउनको लागि कुनै घटनाहरू छैनन्"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/nl.global.js b/library/fullcalendar/packages/core/locales/nl.global.js
new file mode 100644
index 000000000..9e9c87640
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nl.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'nl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Vorige',
+ next: 'Volgende',
+ today: 'Vandaag',
+ year: 'Jaar',
+ month: 'Maand',
+ week: 'Week',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ allDayText: 'Hele dag',
+ moreLinkText: 'extra',
+ noEventsText: 'Geen evenementen om te laten zien',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/nl.global.min.js b/library/fullcalendar/packages/core/locales/nl.global.min.js
new file mode 100644
index 000000000..ba5d10e32
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nl.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/nl.js b/library/fullcalendar/packages/core/locales/nl.js
deleted file mode 100644
index c91b5e55f..000000000
--- a/library/fullcalendar/packages/core/locales/nl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory()));
-}(this, function () { 'use strict';
-
- var nl = {
- code: "nl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Voorgaand",
- next: "Volgende",
- today: "Vandaag",
- year: "Jaar",
- month: "Maand",
- week: "Week",
- day: "Dag",
- list: "Agenda"
- },
- allDayText: "Hele dag",
- eventLimitText: "extra",
- noEventsMessage: "Geen evenementen om te laten zien"
- };
-
- return nl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/nn.global.js b/library/fullcalendar/packages/core/locales/nn.global.js
new file mode 100644
index 000000000..e50e0c7fb
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nn.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'nn',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Førre',
+ next: 'Neste',
+ today: 'I dag',
+ month: 'Månad',
+ week: 'Veke',
+ day: 'Dag',
+ list: 'Agenda',
+ },
+ weekText: 'Veke',
+ allDayText: 'Heile dagen',
+ moreLinkText: 'til',
+ noEventsText: 'Ingen hendelser å vise',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/nn.global.min.js b/library/fullcalendar/packages/core/locales/nn.global.min.js
new file mode 100644
index 000000000..d40c209e6
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/nn.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/nn.js b/library/fullcalendar/packages/core/locales/nn.js
deleted file mode 100644
index a5cdd1626..000000000
--- a/library/fullcalendar/packages/core/locales/nn.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory()));
-}(this, function () { 'use strict';
-
- var nn = {
- code: "nn",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Førre",
- next: "Neste",
- today: "I dag",
- month: "Månad",
- week: "Veke",
- day: "Dag",
- list: "Agenda"
- },
- weekLabel: "Veke",
- allDayText: "Heile dagen",
- eventLimitText: "til",
- noEventsMessage: "Ingen hendelser å vise"
- };
-
- return nn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pl.global.js b/library/fullcalendar/packages/core/locales/pl.global.js
new file mode 100644
index 000000000..c07270a0c
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pl.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'pl',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Poprzedni',
+ next: 'Następny',
+ today: 'Dziś',
+ month: 'Miesiąc',
+ week: 'Tydzień',
+ day: 'Dzień',
+ list: 'Plan dnia',
+ },
+ weekText: 'Tydz',
+ allDayText: 'Cały dzień',
+ moreLinkText: 'więcej',
+ noEventsText: 'Brak wydarzeń do wyświetlenia',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/pl.global.min.js b/library/fullcalendar/packages/core/locales/pl.global.min.js
new file mode 100644
index 000000000..3e2e1fc3f
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pl.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/pl.js b/library/fullcalendar/packages/core/locales/pl.js
deleted file mode 100644
index 0a22e69c4..000000000
--- a/library/fullcalendar/packages/core/locales/pl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory()));
-}(this, function () { 'use strict';
-
- var pl = {
- code: "pl",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Poprzedni",
- next: "Następny",
- today: "Dziś",
- month: "Miesiąc",
- week: "Tydzień",
- day: "Dzień",
- list: "Plan dnia"
- },
- weekLabel: "Tydz",
- allDayText: "Cały dzień",
- eventLimitText: "więcej",
- noEventsMessage: "Brak wydarzeń do wyświetlenia"
- };
-
- return pl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pt-br.global.js b/library/fullcalendar/packages/core/locales/pt-br.global.js
new file mode 100644
index 000000000..7ec6f79f3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pt-br.global.js
@@ -0,0 +1,30 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'pt-br',
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Próximo',
+ today: 'Hoje',
+ month: 'Mês',
+ week: 'Semana',
+ day: 'Dia',
+ list: 'Lista',
+ },
+ weekText: 'Sm',
+ allDayText: 'dia inteiro',
+ moreLinkText(n) {
+ return 'mais +' + n;
+ },
+ noEventsText: 'Não há eventos para mostrar',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/pt-br.global.min.js b/library/fullcalendar/packages/core/locales/pt-br.global.min.js
new file mode 100644
index 000000000..32315bcaf
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pt-br.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:e=>"mais +"+e,noEventsText:"Não há eventos para mostrar"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/pt-br.js b/library/fullcalendar/packages/core/locales/pt-br.js
deleted file mode 100644
index bfa023dd6..000000000
--- a/library/fullcalendar/packages/core/locales/pt-br.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory()));
-}(this, function () { 'use strict';
-
- var ptBr = {
- code: "pt-br",
- buttonText: {
- prev: "Anterior",
- next: "Próximo",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Lista"
- },
- weekLabel: "Sm",
- allDayText: "dia inteiro",
- eventLimitText: function (n) {
- return "mais +" + n;
- },
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- return ptBr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/pt.global.js b/library/fullcalendar/packages/core/locales/pt.global.js
new file mode 100644
index 000000000..15aafa853
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pt.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'pt',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Anterior',
+ next: 'Seguinte',
+ today: 'Hoje',
+ month: 'Mês',
+ week: 'Semana',
+ day: 'Dia',
+ list: 'Agenda',
+ },
+ weekText: 'Sem',
+ allDayText: 'Todo o dia',
+ moreLinkText: 'mais',
+ noEventsText: 'Não há eventos para mostrar',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/pt.global.min.js b/library/fullcalendar/packages/core/locales/pt.global.min.js
new file mode 100644
index 000000000..c4d0e1f45
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/pt.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/pt.js b/library/fullcalendar/packages/core/locales/pt.js
deleted file mode 100644
index 5c54d8d40..000000000
--- a/library/fullcalendar/packages/core/locales/pt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory()));
-}(this, function () { 'use strict';
-
- var pt = {
- code: "pt",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Anterior",
- next: "Seguinte",
- today: "Hoje",
- month: "Mês",
- week: "Semana",
- day: "Dia",
- list: "Agenda"
- },
- weekLabel: "Sem",
- allDayText: "Todo o dia",
- eventLimitText: "mais",
- noEventsMessage: "Não há eventos para mostrar"
- };
-
- return pt;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ro.global.js b/library/fullcalendar/packages/core/locales/ro.global.js
new file mode 100644
index 000000000..701641cb0
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ro.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ro',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'precedentă',
+ next: 'următoare',
+ today: 'Azi',
+ month: 'Lună',
+ week: 'Săptămână',
+ day: 'Zi',
+ list: 'Agendă',
+ },
+ weekText: 'Săpt',
+ allDayText: 'Toată ziua',
+ moreLinkText(n) {
+ return '+alte ' + n;
+ },
+ noEventsText: 'Nu există evenimente de afișat',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ro.global.min.js b/library/fullcalendar/packages/core/locales/ro.global.min.js
new file mode 100644
index 000000000..cdba34e09
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ro.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:e=>"+alte "+e,noEventsText:"Nu există evenimente de afișat"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ro.js b/library/fullcalendar/packages/core/locales/ro.js
deleted file mode 100644
index e8992f276..000000000
--- a/library/fullcalendar/packages/core/locales/ro.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory()));
-}(this, function () { 'use strict';
-
- var ro = {
- code: "ro",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "precedentă",
- next: "următoare",
- today: "Azi",
- month: "Lună",
- week: "Săptămână",
- day: "Zi",
- list: "Agendă"
- },
- weekLabel: "Săpt",
- allDayText: "Toată ziua",
- eventLimitText: function (n) {
- return "+alte " + n;
- },
- noEventsMessage: "Nu există evenimente de afișat"
- };
-
- return ro;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ru.global.js b/library/fullcalendar/packages/core/locales/ru.global.js
new file mode 100644
index 000000000..8c42c2e92
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ru.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ru',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Пред',
+ next: 'След',
+ today: 'Сегодня',
+ month: 'Месяц',
+ week: 'Неделя',
+ day: 'День',
+ list: 'Повестка дня',
+ },
+ weekText: 'Нед',
+ allDayText: 'Весь день',
+ moreLinkText(n) {
+ return '+ ещё ' + n;
+ },
+ noEventsText: 'Нет событий для отображения',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ru.global.min.js b/library/fullcalendar/packages/core/locales/ru.global.min.js
new file mode 100644
index 000000000..0131510aa
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ru.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:e=>"+ ещё "+e,noEventsText:"Нет событий для отображения"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ru.js b/library/fullcalendar/packages/core/locales/ru.js
deleted file mode 100644
index 77e0308e2..000000000
--- a/library/fullcalendar/packages/core/locales/ru.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory()));
-}(this, function () { 'use strict';
-
- var ru = {
- code: "ru",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Пред",
- next: "След",
- today: "Сегодня",
- month: "Месяц",
- week: "Неделя",
- day: "День",
- list: "Повестка дня"
- },
- weekLabel: "Нед",
- allDayText: "Весь день",
- eventLimitText: function (n) {
- return "+ ещё " + n;
- },
- noEventsMessage: "Нет событий для отображения"
- };
-
- return ru;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/si-lk.global.js b/library/fullcalendar/packages/core/locales/si-lk.global.js
new file mode 100644
index 000000000..d33ea52e5
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/si-lk.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'si-lk',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'පෙර',
+ next: 'පසු',
+ today: 'අද',
+ month: 'මාසය',
+ week: 'සතිය',
+ day: 'දවස',
+ list: 'ලැයිස්තුව',
+ },
+ weekText: 'සති',
+ allDayText: 'සියලු',
+ moreLinkText: 'තවත්',
+ noEventsText: 'මුකුත් නැත',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/si-lk.global.min.js b/library/fullcalendar/packages/core/locales/si-lk.global.min.js
new file mode 100644
index 000000000..17c40a277
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/si-lk.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"si-lk",week:{dow:1,doy:4},buttonText:{prev:"පෙර",next:"පසු",today:"අද",month:"මාසය",week:"සතිය",day:"දවස",list:"ලැයිස්තුව"},weekText:"සති",allDayText:"සියලු",moreLinkText:"තවත්",noEventsText:"මුකුත් නැත"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sk.global.js b/library/fullcalendar/packages/core/locales/sk.global.js
new file mode 100644
index 000000000..c49662f71
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sk.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sk',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Predchádzajúci',
+ next: 'Nasledujúci',
+ today: 'Dnes',
+ month: 'Mesiac',
+ week: 'Týždeň',
+ day: 'Deň',
+ list: 'Rozvrh',
+ },
+ weekText: 'Ty',
+ allDayText: 'Celý deň',
+ moreLinkText(n) {
+ return '+ďalšie: ' + n;
+ },
+ noEventsText: 'Žiadne akcie na zobrazenie',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sk.global.min.js b/library/fullcalendar/packages/core/locales/sk.global.min.js
new file mode 100644
index 000000000..58b969106
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sk.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var a={code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:e=>"+ďalšie: "+e,noEventsText:"Žiadne akcie na zobrazenie"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sk.js b/library/fullcalendar/packages/core/locales/sk.js
deleted file mode 100644
index 3513a64ad..000000000
--- a/library/fullcalendar/packages/core/locales/sk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory()));
-}(this, function () { 'use strict';
-
- var sk = {
- code: "sk",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Predchádzajúci",
- next: "Nasledujúci",
- today: "Dnes",
- month: "Mesiac",
- week: "Týždeň",
- day: "Deň",
- list: "Rozvrh"
- },
- weekLabel: "Ty",
- allDayText: "Celý deň",
- eventLimitText: function (n) {
- return "+ďalšie: " + n;
- },
- noEventsMessage: "Žiadne akcie na zobrazenie"
- };
-
- return sk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sl.global.js b/library/fullcalendar/packages/core/locales/sl.global.js
new file mode 100644
index 000000000..f4a372e02
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sl.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sl',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prejšnji',
+ next: 'Naslednji',
+ today: 'Trenutni',
+ month: 'Mesec',
+ week: 'Teden',
+ day: 'Dan',
+ list: 'Dnevni red',
+ },
+ weekText: 'Teden',
+ allDayText: 'Ves dan',
+ moreLinkText: 'več',
+ noEventsText: 'Ni dogodkov za prikaz',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sl.global.min.js b/library/fullcalendar/packages/core/locales/sl.global.min.js
new file mode 100644
index 000000000..0f3045a26
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sl.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sl.js b/library/fullcalendar/packages/core/locales/sl.js
deleted file mode 100644
index 323355359..000000000
--- a/library/fullcalendar/packages/core/locales/sl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory()));
-}(this, function () { 'use strict';
-
- var sl = {
- code: "sl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prejšnji",
- next: "Naslednji",
- today: "Trenutni",
- month: "Mesec",
- week: "Teden",
- day: "Dan",
- list: "Dnevni red"
- },
- weekLabel: "Teden",
- allDayText: "Ves dan",
- eventLimitText: "več",
- noEventsMessage: "Ni dogodkov za prikaz"
- };
-
- return sl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sm.global.js b/library/fullcalendar/packages/core/locales/sm.global.js
new file mode 100644
index 000000000..3eb5c176a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sm.global.js
@@ -0,0 +1,28 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sm',
+ buttonText: {
+ prev: 'Talu ai',
+ next: 'Mulimuli atu',
+ today: 'Aso nei',
+ month: 'Masina',
+ week: 'Vaiaso',
+ day: 'Aso',
+ list: 'Faasologa',
+ },
+ weekText: 'Vaiaso',
+ allDayText: 'Aso atoa',
+ moreLinkText: 'sili atu',
+ noEventsText: 'Leai ni mea na tutupu',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sm.global.min.js b/library/fullcalendar/packages/core/locales/sm.global.min.js
new file mode 100644
index 000000000..48baeb25d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sm.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(a){"use strict";FullCalendar.globalLocales.push({code:"sm",buttonText:{prev:"Talu ai",next:"Mulimuli atu",today:"Aso nei",month:"Masina",week:"Vaiaso",day:"Aso",list:"Faasologa"},weekText:"Vaiaso",allDayText:"Aso atoa",moreLinkText:"sili atu",noEventsText:"Leai ni mea na tutupu"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sq.global.js b/library/fullcalendar/packages/core/locales/sq.global.js
new file mode 100644
index 000000000..08338fec3
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sq.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sq',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'mbrapa',
+ next: 'Përpara',
+ today: 'sot',
+ month: 'Muaj',
+ week: 'Javë',
+ day: 'Ditë',
+ list: 'Listë',
+ },
+ weekText: 'Ja',
+ allDayText: 'Gjithë ditën',
+ moreLinkText(n) {
+ return '+më tepër ' + n;
+ },
+ noEventsText: 'Nuk ka evente për të shfaqur',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sq.global.min.js b/library/fullcalendar/packages/core/locales/sq.global.min.js
new file mode 100644
index 000000000..11abe5474
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sq.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:e=>"+më tepër "+e,noEventsText:"Nuk ka evente për të shfaqur"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sq.js b/library/fullcalendar/packages/core/locales/sq.js
deleted file mode 100644
index 0d43a5220..000000000
--- a/library/fullcalendar/packages/core/locales/sq.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory()));
-}(this, function () { 'use strict';
-
- var sq = {
- code: "sq",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "mbrapa",
- next: "Përpara",
- today: "sot",
- month: "Muaj",
- week: "Javë",
- day: "Ditë",
- list: "Listë"
- },
- weekLabel: "Ja",
- allDayHtml: "Gjithë<br/>ditën",
- eventLimitText: function (n) {
- return "+më tepër " + n;
- },
- noEventsMessage: "Nuk ka evente për të shfaqur"
- };
-
- return sq;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sr-cyrl.global.js b/library/fullcalendar/packages/core/locales/sr-cyrl.global.js
new file mode 100644
index 000000000..957ed5399
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sr-cyrl.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sr-cyrl',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Претходна',
+ next: 'следећи',
+ today: 'Данас',
+ month: 'Месец',
+ week: 'Недеља',
+ day: 'Дан',
+ list: 'Планер',
+ },
+ weekText: 'Сед',
+ allDayText: 'Цео дан',
+ moreLinkText(n) {
+ return '+ још ' + n;
+ },
+ noEventsText: 'Нема догађаја за приказ',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sr-cyrl.global.min.js b/library/fullcalendar/packages/core/locales/sr-cyrl.global.min.js
new file mode 100644
index 000000000..6a5d2ef9c
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sr-cyrl.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:e=>"+ још "+e,noEventsText:"Нема догађаја за приказ"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sr-cyrl.js b/library/fullcalendar/packages/core/locales/sr-cyrl.js
deleted file mode 100644
index ba0d0dfa3..000000000
--- a/library/fullcalendar/packages/core/locales/sr-cyrl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory()));
-}(this, function () { 'use strict';
-
- var srCyrl = {
- code: "sr-cyrl",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Претходна",
- next: "следећи",
- today: "Данас",
- month: "Месец",
- week: "Недеља",
- day: "Дан",
- list: "Планер"
- },
- weekLabel: "Сед",
- allDayText: "Цео дан",
- eventLimitText: function (n) {
- return "+ још " + n;
- },
- noEventsMessage: "Нема догађаја за приказ"
- };
-
- return srCyrl;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sr.global.js b/library/fullcalendar/packages/core/locales/sr.global.js
new file mode 100644
index 000000000..6dfc7f730
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sr.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Prethodna',
+ next: 'Sledeći',
+ today: 'Danas',
+ month: 'Mеsеc',
+ week: 'Nеdеlja',
+ day: 'Dan',
+ list: 'Planеr',
+ },
+ weekText: 'Sed',
+ allDayText: 'Cеo dan',
+ moreLinkText(n) {
+ return '+ još ' + n;
+ },
+ noEventsText: 'Nеma događaja za prikaz',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sr.global.min.js b/library/fullcalendar/packages/core/locales/sr.global.min.js
new file mode 100644
index 000000000..425f4210e
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sr.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var a={code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:e=>"+ još "+e,noEventsText:"Nеma događaja za prikaz"};FullCalendar.globalLocales.push(a)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sr.js b/library/fullcalendar/packages/core/locales/sr.js
deleted file mode 100644
index 23e5c9b23..000000000
--- a/library/fullcalendar/packages/core/locales/sr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory()));
-}(this, function () { 'use strict';
-
- var sr = {
- code: "sr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Prethodna",
- next: "Sledeći",
- today: "Danas",
- month: "Mеsеc",
- week: "Nеdеlja",
- day: "Dan",
- list: "Planеr"
- },
- weekLabel: "Sed",
- allDayText: "Cеo dan",
- eventLimitText: function (n) {
- return "+ još " + n;
- },
- noEventsMessage: "Nеma događaja za prikaz"
- };
-
- return sr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/sv.global.js b/library/fullcalendar/packages/core/locales/sv.global.js
new file mode 100644
index 000000000..3439a7d7d
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sv.global.js
@@ -0,0 +1,52 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'sv',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Förra',
+ next: 'Nästa',
+ today: 'Idag',
+ month: 'Månad',
+ week: 'Vecka',
+ day: 'Dag',
+ list: 'Program',
+ },
+ buttonHints: {
+ prev(buttonText) {
+ return `Föregående ${buttonText.toLocaleLowerCase()}`;
+ },
+ next(buttonText) {
+ return `Nästa ${buttonText.toLocaleLowerCase()}`;
+ },
+ today(buttonText) {
+ return (buttonText === 'Program' ? 'Detta' : 'Denna') + ' ' + buttonText.toLocaleLowerCase();
+ },
+ },
+ viewHint: '$0 vy',
+ navLinkHint: 'Gå till $0',
+ moreLinkHint(eventCnt) {
+ return `Visa ytterligare ${eventCnt} händelse${eventCnt === 1 ? '' : 'r'}`;
+ },
+ weekText: 'v.',
+ weekTextLong: 'Vecka',
+ allDayText: 'Heldag',
+ moreLinkText: 'till',
+ noEventsText: 'Inga händelser att visa',
+ closeHint: 'Stäng',
+ timeHint: 'Klockan',
+ eventHint: 'Händelse',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/sv.global.min.js b/library/fullcalendar/packages/core/locales/sv.global.min.js
new file mode 100644
index 000000000..91b597728
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/sv.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},buttonHints:{prev:e=>"Föregående "+e.toLocaleLowerCase(),next:e=>"Nästa "+e.toLocaleLowerCase(),today:e=>("Program"===e?"Detta":"Denna")+" "+e.toLocaleLowerCase()},viewHint:"$0 vy",navLinkHint:"Gå till $0",moreLinkHint:e=>`Visa ytterligare ${e} händelse${1===e?"":"r"}`,weekText:"v.",weekTextLong:"Vecka",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa",closeHint:"Stäng",timeHint:"Klockan",eventHint:"Händelse"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/sv.js b/library/fullcalendar/packages/core/locales/sv.js
deleted file mode 100644
index a887060ba..000000000
--- a/library/fullcalendar/packages/core/locales/sv.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory()));
-}(this, function () { 'use strict';
-
- var sv = {
- code: "sv",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Förra",
- next: "Nästa",
- today: "Idag",
- month: "Månad",
- week: "Vecka",
- day: "Dag",
- list: "Program"
- },
- weekLabel: "v.",
- allDayText: "Heldag",
- eventLimitText: "till",
- noEventsMessage: "Inga händelser att visa"
- };
-
- return sv;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ta-in.global.js b/library/fullcalendar/packages/core/locales/ta-in.global.js
new file mode 100644
index 000000000..e565db852
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ta-in.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ta-in',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'முந்தைய',
+ next: 'அடுத்தது',
+ today: 'இன்று',
+ month: 'மாதம்',
+ week: 'வாரம்',
+ day: 'நாள்',
+ list: 'தினசரி அட்டவணை',
+ },
+ weekText: 'வாரம்',
+ allDayText: 'நாள் முழுவதும்',
+ moreLinkText(n) {
+ return '+ மேலும் ' + n;
+ },
+ noEventsText: 'காண்பிக்க நிகழ்வுகள் இல்லை',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ta-in.global.min.js b/library/fullcalendar/packages/core/locales/ta-in.global.min.js
new file mode 100644
index 000000000..fd1879031
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ta-in.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"ta-in",week:{dow:1,doy:4},buttonText:{prev:"முந்தைய",next:"அடுத்தது",today:"இன்று",month:"மாதம்",week:"வாரம்",day:"நாள்",list:"தினசரி அட்டவணை"},weekText:"வாரம்",allDayText:"நாள் முழுவதும்",moreLinkText:e=>"+ மேலும் "+e,noEventsText:"காண்பிக்க நிகழ்வுகள் இல்லை"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/th.global.js b/library/fullcalendar/packages/core/locales/th.global.js
new file mode 100644
index 000000000..e2d4a5bf2
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/th.global.js
@@ -0,0 +1,35 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'th',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'ก่อนหน้า',
+ next: 'ถัดไป',
+ prevYear: 'ปีก่อนหน้า',
+ nextYear: 'ปีถัดไป',
+ year: 'ปี',
+ today: 'วันนี้',
+ month: 'เดือน',
+ week: 'สัปดาห์',
+ day: 'วัน',
+ list: 'กำหนดการ',
+ },
+ weekText: 'สัปดาห์',
+ allDayText: 'ตลอดวัน',
+ moreLinkText: 'เพิ่มเติม',
+ noEventsText: 'ไม่มีกิจกรรมที่จะแสดง',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/th.global.min.js b/library/fullcalendar/packages/core/locales/th.global.min.js
new file mode 100644
index 000000000..ef7e6dbd2
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/th.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/th.js b/library/fullcalendar/packages/core/locales/th.js
deleted file mode 100644
index faeaee214..000000000
--- a/library/fullcalendar/packages/core/locales/th.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory()));
-}(this, function () { 'use strict';
-
- var th = {
- code: "th",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "ก่อนหน้า",
- next: "ถัดไป",
- prevYear: 'ปีก่อนหน้า',
- nextYear: 'ปีถัดไป',
- year: 'ปี',
- today: "วันนี้",
- month: "เดือน",
- week: "สัปดาห์",
- day: "วัน",
- list: "กำหนดการ"
- },
- weekLabel: "สัปดาห์",
- allDayText: "ตลอดวัน",
- eventLimitText: "เพิ่มเติม",
- noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
- };
-
- return th;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/tr.global.js b/library/fullcalendar/packages/core/locales/tr.global.js
new file mode 100644
index 000000000..95b158954
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/tr.global.js
@@ -0,0 +1,32 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'tr',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'geri',
+ next: 'ileri',
+ today: 'bugün',
+ month: 'Ay',
+ week: 'Hafta',
+ day: 'Gün',
+ list: 'Ajanda',
+ },
+ weekText: 'Hf',
+ allDayText: 'Tüm gün',
+ moreLinkText: 'daha fazla',
+ noEventsText: 'Gösterilecek etkinlik yok',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/tr.global.min.js b/library/fullcalendar/packages/core/locales/tr.global.min.js
new file mode 100644
index 000000000..06811503a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/tr.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/tr.js b/library/fullcalendar/packages/core/locales/tr.js
deleted file mode 100644
index 48458982f..000000000
--- a/library/fullcalendar/packages/core/locales/tr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory()));
-}(this, function () { 'use strict';
-
- var tr = {
- code: "tr",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "geri",
- next: "ileri",
- today: "bugün",
- month: "Ay",
- week: "Hafta",
- day: "Gün",
- list: "Ajanda"
- },
- weekLabel: "Hf",
- allDayText: "Tüm gün",
- eventLimitText: "daha fazla",
- noEventsMessage: "Gösterilecek etkinlik yok"
- };
-
- return tr;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/ug.global.js b/library/fullcalendar/packages/core/locales/ug.global.js
new file mode 100644
index 000000000..4930d1302
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ug.global.js
@@ -0,0 +1,22 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'ug',
+ buttonText: {
+ month: 'ئاي',
+ week: 'ھەپتە',
+ day: 'كۈن',
+ list: 'كۈنتەرتىپ',
+ },
+ allDayText: 'پۈتۈن كۈن',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/ug.global.min.js b/library/fullcalendar/packages/core/locales/ug.global.min.js
new file mode 100644
index 000000000..308e2d782
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/ug.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(l){"use strict";FullCalendar.globalLocales.push({code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/ug.js b/library/fullcalendar/packages/core/locales/ug.js
deleted file mode 100644
index f13a5c286..000000000
--- a/library/fullcalendar/packages/core/locales/ug.js
+++ /dev/null
@@ -1,20 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ug = factory()));
-}(this, function () { 'use strict';
-
- var ug = {
- code: "ug",
- buttonText: {
- month: "ئاي",
- week: "ھەپتە",
- day: "كۈن",
- list: "كۈنتەرتىپ"
- },
- allDayText: "پۈتۈن كۈن"
- };
-
- return ug;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/uk.global.js b/library/fullcalendar/packages/core/locales/uk.global.js
new file mode 100644
index 000000000..36fd3b02a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/uk.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'uk',
+ week: {
+ dow: 1,
+ doy: 7, // The week that contains Jan 1st is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Попередній',
+ next: 'далі',
+ today: 'Сьогодні',
+ month: 'Місяць',
+ week: 'Тиждень',
+ day: 'День',
+ list: 'Порядок денний',
+ },
+ weekText: 'Тиж',
+ allDayText: 'Увесь день',
+ moreLinkText(n) {
+ return '+ще ' + n + '...';
+ },
+ noEventsText: 'Немає подій для відображення',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/uk.global.min.js b/library/fullcalendar/packages/core/locales/uk.global.min.js
new file mode 100644
index 000000000..1b0511592
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/uk.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:e=>"+ще "+e+"...",noEventsText:"Немає подій для відображення"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/uk.js b/library/fullcalendar/packages/core/locales/uk.js
deleted file mode 100644
index de33f250c..000000000
--- a/library/fullcalendar/packages/core/locales/uk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory()));
-}(this, function () { 'use strict';
-
- var uk = {
- code: "uk",
- week: {
- dow: 1,
- doy: 7 // The week that contains Jan 1st is the first week of the year.
- },
- buttonText: {
- prev: "Попередній",
- next: "далі",
- today: "Сьогодні",
- month: "Місяць",
- week: "Тиждень",
- day: "День",
- list: "Порядок денний"
- },
- weekLabel: "Тиж",
- allDayText: "Увесь день",
- eventLimitText: function (n) {
- return "+ще " + n + "...";
- },
- noEventsMessage: "Немає подій для відображення"
- };
-
- return uk;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/uz.global.js b/library/fullcalendar/packages/core/locales/uz.global.js
new file mode 100644
index 000000000..7e49abb68
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/uz.global.js
@@ -0,0 +1,26 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'uz',
+ buttonText: {
+ month: 'Oy',
+ week: 'Xafta',
+ day: 'Kun',
+ list: 'Kun tartibi',
+ },
+ allDayText: 'Kun bo\'yi',
+ moreLinkText(n) {
+ return '+ yana ' + n;
+ },
+ noEventsText: 'Ko\'rsatish uchun voqealar yo\'q',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/uz.global.min.js b/library/fullcalendar/packages/core/locales/uz.global.min.js
new file mode 100644
index 000000000..e840a6014
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/uz.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(a){"use strict";var t={code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:a=>"+ yana "+a,noEventsText:"Ko'rsatish uchun voqealar yo'q"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/uz.js b/library/fullcalendar/packages/core/locales/uz.js
deleted file mode 100644
index 24089756d..000000000
--- a/library/fullcalendar/packages/core/locales/uz.js
+++ /dev/null
@@ -1,24 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uz = factory()));
-}(this, function () { 'use strict';
-
- var uz = {
- code: "uz",
- buttonText: {
- month: "Oy",
- week: "Xafta",
- day: "Kun",
- list: "Kun tartibi"
- },
- allDayText: "Kun bo'yi",
- eventLimitText: function (n) {
- return "+ yana " + n;
- },
- noEventsMessage: "Ko'rsatish uchun voqealar yo'q"
- };
-
- return uz;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/vi.global.js b/library/fullcalendar/packages/core/locales/vi.global.js
new file mode 100644
index 000000000..48e572df7
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/vi.global.js
@@ -0,0 +1,34 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'vi',
+ week: {
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: 'Trước',
+ next: 'Tiếp',
+ today: 'Hôm nay',
+ month: 'Tháng',
+ week: 'Tuần',
+ day: 'Ngày',
+ list: 'Lịch biểu',
+ },
+ weekText: 'Tu',
+ allDayText: 'Cả ngày',
+ moreLinkText(n) {
+ return '+ thêm ' + n;
+ },
+ noEventsText: 'Không có sự kiện để hiển thị',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/vi.global.min.js b/library/fullcalendar/packages/core/locales/vi.global.min.js
new file mode 100644
index 000000000..1ea5848d5
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/vi.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:e=>"+ thêm "+e,noEventsText:"Không có sự kiện để hiển thị"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/vi.js b/library/fullcalendar/packages/core/locales/vi.js
deleted file mode 100644
index 167ce11d7..000000000
--- a/library/fullcalendar/packages/core/locales/vi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory()));
-}(this, function () { 'use strict';
-
- var vi = {
- code: "vi",
- week: {
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "Trước",
- next: "Tiếp",
- today: "Hôm nay",
- month: "Tháng",
- week: "Tuần",
- day: "Ngày",
- list: "Lịch biểu"
- },
- weekLabel: "Tu",
- allDayText: "Cả ngày",
- eventLimitText: function (n) {
- return "+ thêm " + n;
- },
- noEventsMessage: "Không có sự kiện để hiển thị"
- };
-
- return vi;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/zh-cn.global.js b/library/fullcalendar/packages/core/locales/zh-cn.global.js
new file mode 100644
index 000000000..347dc6c3a
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/zh-cn.global.js
@@ -0,0 +1,35 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'zh-cn',
+ week: {
+ // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+ dow: 1,
+ doy: 4, // The week that contains Jan 4th is the first week of the year.
+ },
+ buttonText: {
+ prev: '上月',
+ next: '下月',
+ today: '今天',
+ month: '月',
+ week: '周',
+ day: '日',
+ list: '日程',
+ },
+ weekText: '周',
+ allDayText: '全天',
+ moreLinkText(n) {
+ return '另外 ' + n + ' 个';
+ },
+ noEventsText: '没有事件显示',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/zh-cn.global.min.js b/library/fullcalendar/packages/core/locales/zh-cn.global.min.js
new file mode 100644
index 000000000..8e8b859c5
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/zh-cn.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";var t={code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:e=>"另外 "+e+" 个",noEventsText:"没有事件显示"};FullCalendar.globalLocales.push(t)}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/zh-cn.js b/library/fullcalendar/packages/core/locales/zh-cn.js
deleted file mode 100644
index 4debbb9e6..000000000
--- a/library/fullcalendar/packages/core/locales/zh-cn.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory()));
-}(this, function () { 'use strict';
-
- var zhCn = {
- code: "zh-cn",
- week: {
- // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
- dow: 1,
- doy: 4 // The week that contains Jan 4th is the first week of the year.
- },
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "周",
- day: "日",
- list: "日程"
- },
- weekLabel: "周",
- allDayText: "全天",
- eventLimitText: function (n) {
- return "另外 " + n + " 个";
- },
- noEventsMessage: "没有事件显示"
- };
-
- return zhCn;
-
-}));
diff --git a/library/fullcalendar/packages/core/locales/zh-tw.global.js b/library/fullcalendar/packages/core/locales/zh-tw.global.js
new file mode 100644
index 000000000..dcedbc7f2
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/zh-tw.global.js
@@ -0,0 +1,28 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (index_js) {
+ 'use strict';
+
+ var locale = {
+ code: 'zh-tw',
+ buttonText: {
+ prev: '上月',
+ next: '下月',
+ today: '今天',
+ month: '月',
+ week: '週',
+ day: '天',
+ list: '活動列表',
+ },
+ weekText: '周',
+ allDayText: '整天',
+ moreLinkText: '顯示更多',
+ noEventsText: '没有任何活動',
+ };
+
+ index_js.globalLocales.push(locale);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/core/locales/zh-tw.global.min.js b/library/fullcalendar/packages/core/locales/zh-tw.global.min.js
new file mode 100644
index 000000000..44ee5a70c
--- /dev/null
+++ b/library/fullcalendar/packages/core/locales/zh-tw.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(e){"use strict";FullCalendar.globalLocales.push({code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"})}(); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/locales/zh-tw.js b/library/fullcalendar/packages/core/locales/zh-tw.js
deleted file mode 100644
index bc14dcd4b..000000000
--- a/library/fullcalendar/packages/core/locales/zh-tw.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory()));
-}(this, function () { 'use strict';
-
- var zhTw = {
- code: "zh-tw",
- buttonText: {
- prev: "上月",
- next: "下月",
- today: "今天",
- month: "月",
- week: "週",
- day: "天",
- list: "活動列表"
- },
- weekLabel: "周",
- allDayText: "整天",
- eventLimitText: '顯示更多',
- noEventsMessage: "没有任何活動"
- };
-
- return zhTw;
-
-}));
diff --git a/library/fullcalendar/packages/core/main.css b/library/fullcalendar/packages/core/main.css
deleted file mode 100644
index 4412a1858..000000000
--- a/library/fullcalendar/packages/core/main.css
+++ /dev/null
@@ -1,1052 +0,0 @@
-@charset "UTF-8";
-.fc {
- direction: ltr;
- text-align: left;
-}
-
-.fc-rtl {
- text-align: right;
-}
-
-body .fc {
- /* extra precedence to overcome jqui */
- font-size: 1em;
-}
-
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-highlight {
- /* when user is selecting cells */
- background: #bce8f1;
- opacity: 0.3;
-}
-
-.fc-bgevent {
- /* default look for background events */
- background: #8fdf82;
- opacity: 0.3;
-}
-
-.fc-nonbusiness {
- /* default look for non-business-hours areas */
- /* will inherit .fc-bgevent's styles */
- background: #d7d7d7;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-popover {
- position: absolute;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
-}
-
-.fc-popover .fc-header {
- /* TODO: be more consistent with fc-head/fc-body */
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- align-items: center;
- padding: 2px 4px;
-}
-
-.fc-rtl .fc-popover .fc-header {
- flex-direction: row-reverse;
-}
-
-.fc-popover .fc-header .fc-title {
- margin: 0 2px;
-}
-
-.fc-popover .fc-header .fc-close {
- cursor: pointer;
- opacity: 0.65;
- font-size: 1.1em;
-}
-
-/* Misc Reusable Components
---------------------------------------------------------------------------------------------------*/
-.fc-divider {
- border-style: solid;
- border-width: 1px;
-}
-
-hr.fc-divider {
- height: 0;
- margin: 0;
- padding: 0 0 2px;
- /* height is unreliable across browsers, so use padding */
- border-width: 1px 0;
-}
-
-.fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton {
- /* these element should always cling to top-left/right corners */
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
-}
-
-.fc-bg {
- bottom: 0;
- /* strech bg to bottom edge */
-}
-
-.fc-bg table {
- height: 100%;
- /* strech bg to bottom edge */
-}
-
-/* Tables
---------------------------------------------------------------------------------------------------*/
-.fc table {
- width: 100%;
- box-sizing: border-box;
- /* fix scrollbar issue in firefox */
- table-layout: fixed;
- border-collapse: collapse;
- border-spacing: 0;
- font-size: 1em;
- /* normalize cross-browser */
-}
-
-.fc th {
- text-align: center;
-}
-
-.fc th,
-.fc td {
- border-style: solid;
- border-width: 1px;
- padding: 0;
- vertical-align: top;
-}
-
-.fc td.fc-today {
- border-style: double;
- /* overcome neighboring borders */
-}
-
-/* Internal Nav Links
---------------------------------------------------------------------------------------------------*/
-a[data-goto] {
- cursor: pointer;
-}
-
-a[data-goto]:hover {
- text-decoration: underline;
-}
-
-/* Fake Table Rows
---------------------------------------------------------------------------------------------------*/
-.fc .fc-row {
- /* extra precedence to overcome themes forcing a 1px border */
- /* no visible border by default. but make available if need be (scrollbar width compensation) */
- border-style: solid;
- border-width: 0;
-}
-
-.fc-row table {
- /* don't put left/right border on anything within a fake row.
- the outer tbody will worry about this */
- border-left: 0 hidden transparent;
- border-right: 0 hidden transparent;
- /* no bottom borders on rows */
- border-bottom: 0 hidden transparent;
-}
-
-.fc-row:first-child table {
- border-top: 0 hidden transparent;
- /* no top border on first row */
-}
-
-/* Day Row (used within the header and the DayGrid)
---------------------------------------------------------------------------------------------------*/
-.fc-row {
- position: relative;
-}
-
-.fc-row .fc-bg {
- z-index: 1;
-}
-
-/* highlighting cells & background event skeleton */
-.fc-row .fc-bgevent-skeleton,
-.fc-row .fc-highlight-skeleton {
- bottom: 0;
- /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-bgevent-skeleton table,
-.fc-row .fc-highlight-skeleton table {
- height: 100%;
- /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-highlight-skeleton td,
-.fc-row .fc-bgevent-skeleton td {
- border-color: transparent;
-}
-
-.fc-row .fc-bgevent-skeleton {
- z-index: 2;
-}
-
-.fc-row .fc-highlight-skeleton {
- z-index: 3;
-}
-
-/*
-row content (which contains day/week numbers and events) as well as "mirror" (which contains
-temporary rendered events).
-*/
-.fc-row .fc-content-skeleton {
- position: relative;
- z-index: 4;
- padding-bottom: 2px;
- /* matches the space above the events */
-}
-
-.fc-row .fc-mirror-skeleton {
- z-index: 5;
-}
-
-.fc .fc-row .fc-content-skeleton table,
-.fc .fc-row .fc-content-skeleton td,
-.fc .fc-row .fc-mirror-skeleton td {
- /* see-through to the background below */
- /* extra precedence to prevent theme-provided backgrounds */
- background: none;
- /* in case <td>s are globally styled */
- border-color: transparent;
-}
-
-.fc-row .fc-content-skeleton td,
-.fc-row .fc-mirror-skeleton td {
- /* don't put a border between events and/or the day number */
- border-bottom: 0;
-}
-
-.fc-row .fc-content-skeleton tbody td,
-.fc-row .fc-mirror-skeleton tbody td {
- /* don't put a border between event cells */
- border-top: 0;
-}
-
-/* Scrolling Container
---------------------------------------------------------------------------------------------------*/
-.fc-scroller {
- -webkit-overflow-scrolling: touch;
-}
-
-/* TODO: move to timegrid/daygrid */
-.fc-scroller > .fc-day-grid,
-.fc-scroller > .fc-time-grid {
- position: relative;
- /* re-scope all positions */
- width: 100%;
- /* hack to force re-sizing this inner element when scrollbars appear/disappear */
-}
-
-/* Global Event Styles
---------------------------------------------------------------------------------------------------*/
-.fc-event {
- position: relative;
- /* for resize handle and other inner positioning */
- display: block;
- /* make the <a> tag block */
- font-size: 0.85em;
- line-height: 1.4;
- border-radius: 3px;
- border: 1px solid #3788d8;
-}
-
-.fc-event,
-.fc-event-dot {
- background-color: #3788d8;
- /* default BACKGROUND color */
-}
-
-.fc-event,
-.fc-event:hover {
- color: #fff;
- /* default TEXT color */
- text-decoration: none;
- /* if <a> has an href */
-}
-
-.fc-event[href],
-.fc-event.fc-draggable {
- cursor: pointer;
- /* give events with links and draggable events a hand mouse pointer */
-}
-
-.fc-not-allowed,
-.fc-not-allowed .fc-event {
- /* to override an event's custom cursor */
- cursor: not-allowed;
-}
-
-.fc-event .fc-content {
- position: relative;
- z-index: 2;
-}
-
-/* resizer (cursor AND touch devices) */
-.fc-event .fc-resizer {
- position: absolute;
- z-index: 4;
-}
-
-/* resizer (touch devices) */
-.fc-event .fc-resizer {
- display: none;
-}
-
-.fc-event.fc-allow-mouse-resize .fc-resizer,
-.fc-event.fc-selected .fc-resizer {
- /* only show when hovering or selected (with touch) */
- display: block;
-}
-
-/* hit area */
-.fc-event.fc-selected .fc-resizer:before {
- /* 40x40 touch area */
- content: "";
- position: absolute;
- z-index: 9999;
- /* user of this util can scope within a lower z-index */
- top: 50%;
- left: 50%;
- width: 40px;
- height: 40px;
- margin-left: -20px;
- margin-top: -20px;
-}
-
-/* Event Selection (only for touch devices)
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-selected {
- z-index: 9999 !important;
- /* overcomes inline z-index */
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
-}
-
-.fc-event.fc-selected:after {
- content: "";
- position: absolute;
- z-index: 1;
- /* same z-index as fc-bg, behind text */
- /* overcome the borders */
- top: -1px;
- right: -1px;
- bottom: -1px;
- left: -1px;
- /* darkening effect */
- background: #000;
- opacity: 0.25;
-}
-
-/* Event Dragging
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-dragging.fc-selected {
- box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);
-}
-
-.fc-event.fc-dragging:not(.fc-selected) {
- opacity: 0.75;
-}
-
-/* Horizontal Events
---------------------------------------------------------------------------------------------------*/
-/* bigger touch area when selected */
-.fc-h-event.fc-selected:before {
- content: "";
- position: absolute;
- z-index: 3;
- /* below resizers */
- top: -10px;
- bottom: -10px;
- left: 0;
- right: 0;
-}
-
-/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
-.fc-ltr .fc-h-event.fc-not-start,
-.fc-rtl .fc-h-event.fc-not-end {
- margin-left: 0;
- border-left-width: 0;
- padding-left: 1px;
- /* replace the border with padding */
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-.fc-ltr .fc-h-event.fc-not-end,
-.fc-rtl .fc-h-event.fc-not-start {
- margin-right: 0;
- border-right-width: 0;
- padding-right: 1px;
- /* replace the border with padding */
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-/* resizer (cursor AND touch devices) */
-/* left resizer */
-.fc-ltr .fc-h-event .fc-start-resizer,
-.fc-rtl .fc-h-event .fc-end-resizer {
- cursor: w-resize;
- left: -1px;
- /* overcome border */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event .fc-end-resizer,
-.fc-rtl .fc-h-event .fc-start-resizer {
- cursor: e-resize;
- right: -1px;
- /* overcome border */
-}
-
-/* resizer (mouse devices) */
-.fc-h-event.fc-allow-mouse-resize .fc-resizer {
- width: 7px;
- top: -1px;
- /* overcome top border */
- bottom: -1px;
- /* overcome bottom border */
-}
-
-/* resizer (touch devices) */
-.fc-h-event.fc-selected .fc-resizer {
- /* 8x8 little dot */
- border-radius: 4px;
- border-width: 1px;
- width: 6px;
- height: 6px;
- border-style: solid;
- border-color: inherit;
- background: #fff;
- /* vertically center */
- top: 50%;
- margin-top: -4px;
-}
-
-/* left resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
- margin-left: -4px;
- /* centers the 8x8 dot on the left edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
- margin-right: -4px;
- /* centers the 8x8 dot on the right edge */
-}
-
-/* DayGrid events
-----------------------------------------------------------------------------------------------------
-We use the full "fc-day-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-day-grid-event {
- margin: 1px 2px 0;
- /* spacing between events and edges */
- padding: 0 1px;
-}
-
-tr:first-child > td > .fc-day-grid-event {
- margin-top: 2px;
- /* a little bit more space before the first event */
-}
-
-.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event {
- margin-top: 0;
- /* except for mirror skeleton */
-}
-
-.fc-day-grid-event .fc-content {
- /* force events to be one-line tall */
- white-space: nowrap;
- overflow: hidden;
-}
-
-.fc-day-grid-event .fc-time {
- font-weight: bold;
-}
-
-/* resizer (cursor devices) */
-/* left resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
- margin-left: -2px;
- /* to the day cell's edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
- margin-right: -2px;
- /* to the day cell's edge */
-}
-
-/* Event Limiting
---------------------------------------------------------------------------------------------------*/
-/* "more" link that represents hidden events */
-a.fc-more {
- margin: 1px 3px;
- font-size: 0.85em;
- cursor: pointer;
- text-decoration: none;
-}
-
-a.fc-more:hover {
- text-decoration: underline;
-}
-
-.fc-limited {
- /* rows and cells that are hidden because of a "more" link */
- display: none;
-}
-
-/* popover that appears when "more" link is clicked */
-.fc-day-grid .fc-row {
- z-index: 1;
- /* make the "more" popover one higher than this */
-}
-
-.fc-more-popover {
- z-index: 2;
- width: 220px;
-}
-
-.fc-more-popover .fc-event-container {
- padding: 10px;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-now-indicator {
- position: absolute;
- border: 0 solid red;
-}
-
-/* Utilities
---------------------------------------------------------------------------------------------------*/
-.fc-unselectable {
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-touch-callout: none;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-/*
-TODO: more distinction between this file and common.css
-*/
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed th,
-.fc-unthemed td,
-.fc-unthemed thead,
-.fc-unthemed tbody,
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-row,
-.fc-unthemed .fc-content,
-.fc-unthemed .fc-popover,
-.fc-unthemed .fc-list-view,
-.fc-unthemed .fc-list-heading td {
- border-color: #ddd;
-}
-
-.fc-unthemed .fc-popover {
- background-color: #fff;
-}
-
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-popover .fc-header,
-.fc-unthemed .fc-list-heading td {
- background: #eee;
-}
-
-.fc-unthemed td.fc-today {
- background: #fcf8e3;
-}
-
-.fc-unthemed .fc-disabled-day {
- background: #d7d7d7;
- opacity: 0.3;
-}
-
-/* Icons
---------------------------------------------------------------------------------------------------
-from https://feathericons.com/ and built with IcoMoon
-*/
-@font-face {
- font-family: "fcicons";
- src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");
- font-weight: normal;
- font-style: normal;
-}
-.fc-icon {
- /* use !important to prevent issues with browser extensions that change fonts */
- font-family: "fcicons" !important;
- speak: none;
- font-style: normal;
- font-weight: normal;
- font-variant: normal;
- text-transform: none;
- line-height: 1;
- /* Better Font Rendering =========== */
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-.fc-icon-chevron-left:before {
- content: "";
-}
-
-.fc-icon-chevron-right:before {
- content: "";
-}
-
-.fc-icon-chevrons-left:before {
- content: "";
-}
-
-.fc-icon-chevrons-right:before {
- content: "";
-}
-
-.fc-icon-minus-square:before {
- content: "";
-}
-
-.fc-icon-plus-square:before {
- content: "";
-}
-
-.fc-icon-x:before {
- content: "";
-}
-
-.fc-icon {
- display: inline-block;
- width: 1em;
- height: 1em;
- text-align: center;
-}
-
-/* Buttons
---------------------------------------------------------------------------------------------------
-Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
-*/
-/* reset */
-.fc-button {
- border-radius: 0;
- overflow: visible;
- text-transform: none;
- margin: 0;
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-
-.fc-button:focus {
- outline: 1px dotted;
- outline: 5px auto -webkit-focus-ring-color;
-}
-
-.fc-button {
- -webkit-appearance: button;
-}
-
-.fc-button:not(:disabled) {
- cursor: pointer;
-}
-
-.fc-button::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-/* theme */
-.fc-button {
- display: inline-block;
- font-weight: 400;
- color: #212529;
- text-align: center;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.4em 0.65em;
- font-size: 1em;
- line-height: 1.5;
- border-radius: 0.25em;
-}
-
-.fc-button:hover {
- color: #212529;
- text-decoration: none;
-}
-
-.fc-button:focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
-}
-
-.fc-button:disabled {
- opacity: 0.65;
-}
-
-/* "primary" coloring */
-.fc-button-primary {
- color: #fff;
- background-color: #2C3E50;
- border-color: #2C3E50;
-}
-
-.fc-button-primary:hover {
- color: #fff;
- background-color: #1e2b37;
- border-color: #1a252f;
-}
-
-.fc-button-primary:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-.fc-button-primary:disabled {
- color: #fff;
- background-color: #2C3E50;
- border-color: #2C3E50;
-}
-
-.fc-button-primary:not(:disabled):active,
-.fc-button-primary:not(:disabled).fc-button-active {
- color: #fff;
- background-color: #1a252f;
- border-color: #151e27;
-}
-
-.fc-button-primary:not(:disabled):active:focus,
-.fc-button-primary:not(:disabled).fc-button-active:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-/* icons within buttons */
-.fc-button .fc-icon {
- vertical-align: middle;
- font-size: 1.5em;
-}
-
-/* Buttons Groups
---------------------------------------------------------------------------------------------------*/
-.fc-button-group {
- position: relative;
- display: -webkit-inline-box;
- display: -ms-inline-flexbox;
- display: inline-flex;
- vertical-align: middle;
-}
-
-.fc-button-group > .fc-button {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
-}
-
-.fc-button-group > .fc-button:hover {
- z-index: 1;
-}
-
-.fc-button-group > .fc-button:focus,
-.fc-button-group > .fc-button:active,
-.fc-button-group > .fc-button.fc-button-active {
- z-index: 1;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
- margin-left: -1px;
-}
-
-.fc-button-group > .fc-button:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-popover {
- border-width: 1px;
- border-style: solid;
-}
-
-/* List View
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-list-item:hover td {
- background-color: #f5f5f5;
-}
-
-/* Toolbar
---------------------------------------------------------------------------------------------------*/
-.fc-toolbar {
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.fc-toolbar.fc-header-toolbar {
- margin-bottom: 1.5em;
-}
-
-.fc-toolbar.fc-footer-toolbar {
- margin-top: 1.5em;
-}
-
-/* inner content */
-.fc-toolbar > * > :not(:first-child) {
- margin-left: 0.75em;
-}
-
-.fc-toolbar h2 {
- font-size: 1.75em;
- margin: 0;
-}
-
-/* View Structure
---------------------------------------------------------------------------------------------------*/
-.fc-view-container {
- position: relative;
-}
-
-/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
-/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
-.fc-view-container *,
-.fc-view-container *:before,
-.fc-view-container *:after {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-.fc-view,
-.fc-view > table {
- /* so dragged elements can be above the view's main element */
- position: relative;
- z-index: 1;
-}
-
-@media print {
- .fc {
- max-width: 100% !important;
- }
-
- /* Global Event Restyling
- --------------------------------------------------------------------------------------------------*/
- .fc-event {
- background: #fff !important;
- color: #000 !important;
- page-break-inside: avoid;
- }
-
- .fc-event .fc-resizer {
- display: none;
- }
-
- /* Table & Day-Row Restyling
- --------------------------------------------------------------------------------------------------*/
- .fc th,
-.fc td,
-.fc hr,
-.fc thead,
-.fc tbody,
-.fc-row {
- border-color: #ccc !important;
- background: #fff !important;
- }
-
- /* kill the overlaid, absolutely-positioned components */
- /* common... */
- .fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton,
-.fc-bgevent-container,
-.fc-business-container,
-.fc-highlight-container,
-.fc-mirror-container {
- display: none;
- }
-
- /* don't force a min-height on rows (for DayGrid) */
- .fc tbody .fc-row {
- height: auto !important;
- /* undo height that JS set in distributeHeight */
- min-height: 0 !important;
- /* undo the min-height from each view's specific stylesheet */
- }
-
- .fc tbody .fc-row .fc-content-skeleton {
- position: static;
- /* undo .fc-rigid */
- padding-bottom: 0 !important;
- /* use a more border-friendly method for this... */
- }
-
- .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td {
- /* only works in newer browsers */
- padding-bottom: 1em;
- /* ...gives space within the skeleton. also ensures min height in a way */
- }
-
- .fc tbody .fc-row .fc-content-skeleton table {
- /* provides a min-height for the row, but only effective for IE, which exaggerates this value,
- making it look more like 3em. for other browers, it will already be this tall */
- height: 1em;
- }
-
- /* Undo month-view event limiting. Display all events and hide the "more" links
- --------------------------------------------------------------------------------------------------*/
- .fc-more-cell,
-.fc-more {
- display: none !important;
- }
-
- .fc tr.fc-limited {
- display: table-row !important;
- }
-
- .fc td.fc-limited {
- display: table-cell !important;
- }
-
- .fc-popover {
- display: none;
- /* never display the "more.." popover in print mode */
- }
-
- /* TimeGrid Restyling
- --------------------------------------------------------------------------------------------------*/
- /* undo the min-height 100% trick used to fill the container's height */
- .fc-time-grid {
- min-height: 0 !important;
- }
-
- /* don't display the side axis at all ("all-day" and time cells) */
- .fc-timeGrid-view .fc-axis {
- display: none;
- }
-
- /* don't display the horizontal lines */
- .fc-slats,
-.fc-time-grid hr {
- /* this hr is used when height is underused and needs to be filled */
- display: none !important;
- /* important overrides inline declaration */
- }
-
- /* let the container that holds the events be naturally positioned and create real height */
- .fc-time-grid .fc-content-skeleton {
- position: static;
- }
-
- /* in case there are no events, we still want some height */
- .fc-time-grid .fc-content-skeleton table {
- height: 4em;
- }
-
- /* kill the horizontal spacing made by the event container. event margins will be done below */
- .fc-time-grid .fc-event-container {
- margin: 0 !important;
- }
-
- /* TimeGrid *Event* Restyling
- --------------------------------------------------------------------------------------------------*/
- /* naturally position events, vertically stacking them */
- .fc-time-grid .fc-event {
- position: static !important;
- margin: 3px 2px !important;
- }
-
- /* for events that continue to a future day, give the bottom border back */
- .fc-time-grid .fc-event.fc-not-end {
- border-bottom-width: 1px !important;
- }
-
- /* indicate the event continues via "..." text */
- .fc-time-grid .fc-event.fc-not-end:after {
- content: "...";
- }
-
- /* for events that are continuations from previous days, give the top border back */
- .fc-time-grid .fc-event.fc-not-start {
- border-top-width: 1px !important;
- }
-
- /* indicate the event is a continuation via "..." text */
- .fc-time-grid .fc-event.fc-not-start:before {
- content: "...";
- }
-
- /* time */
- /* undo a previous declaration and let the time text span to a second line */
- .fc-time-grid .fc-event .fc-time {
- white-space: normal !important;
- }
-
- /* hide the the time that is normally displayed... */
- .fc-time-grid .fc-event .fc-time span {
- display: none;
- }
-
- /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
- .fc-time-grid .fc-event .fc-time:after {
- content: attr(data-full);
- }
-
- /* Vertical Scroller & Containers
- --------------------------------------------------------------------------------------------------*/
- /* kill the scrollbars and allow natural height */
- .fc-scroller,
-.fc-day-grid-container,
-.fc-time-grid-container {
- /* */
- overflow: visible !important;
- height: auto !important;
- }
-
- /* kill the horizontal border/padding used to compensate for scrollbars */
- .fc-row {
- border: 0 !important;
- margin: 0 !important;
- }
-
- /* Button Controls
- --------------------------------------------------------------------------------------------------*/
- .fc-button-group,
-.fc button {
- display: none;
- /* don't display any button-related controls */
- }
-}
diff --git a/library/fullcalendar/packages/core/main.d.ts b/library/fullcalendar/packages/core/main.d.ts
deleted file mode 100644
index b6459021c..000000000
--- a/library/fullcalendar/packages/core/main.d.ts
+++ /dev/null
@@ -1,2736 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/core' {
- export const version = "<%= version %>";
- export { OptionsInput } from '@fullcalendar/core/types/input-types';
- export { EventInput, EventDef, EventDefHash, EventInstance, EventInstanceHash, parseEventDef, createEventInstance, EventTuple } from '@fullcalendar/core/structs/event';
- export { BusinessHoursInput, parseBusinessHours } from '@fullcalendar/core/structs/business-hours';
- export { applyAll, debounce, padStart, isInt, capitaliseFirstLetter, parseFieldSpecs, compareByFieldSpecs, compareByFieldSpec, flexibleCompare, computeVisibleDayRange, refineProps, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, isMultiDayRange, distributeHeight, undistributeHeight, preventSelection, allowSelection, preventContextMenu, allowContextMenu, compareNumbers, enableCursor, disableCursor, diffDates } from '@fullcalendar/core/util/misc';
- export { htmlEscape, cssToStr } from '@fullcalendar/core/util/html';
- export { removeExact, isArraysEqual } from '@fullcalendar/core/util/array';
- export { memoize, memoizeOutput } from '@fullcalendar/core/util/memoize';
- export { memoizeRendering, MemoizedRendering } from '@fullcalendar/core/component/memoized-rendering';
- export { intersectRects, Rect, pointInsideRect, constrainPoint, getRectCenter, diffPoints, Point, translateRect } from '@fullcalendar/core/util/geom';
- export { mapHash, filterHash, isPropsEqual } from '@fullcalendar/core/util/object';
- export { findElements, findChildren, htmlToElement, createElement, insertAfterElement, prependToElement, removeElement, appendToElement, applyStyle, applyStyleProp, elementMatches, elementClosest, forceClassName } from '@fullcalendar/core/util/dom-manip';
- export { EventStore, filterEventStoreDefs, createEmptyEventStore, mergeEventStores, getRelevantEvents, eventTupleToStore } from '@fullcalendar/core/structs/event-store';
- export { EventUiHash, EventUi, processScopedUiProps, combineEventUis } from '@fullcalendar/core/component/event-ui';
- export { default as Splitter, SplittableProps } from '@fullcalendar/core/component/event-splitting';
- export { buildGotoAnchorHtml, getAllDayHtml, getDayClasses } from '@fullcalendar/core/component/date-rendering';
- export { preventDefault, listenBySelector, whenTransitionDone } from '@fullcalendar/core/util/dom-event';
- export { computeInnerRect, computeEdges, computeHeightAndMargins, getClippingParents, computeClippingRect, computeRect } from '@fullcalendar/core/util/dom-geom';
- export { unpromisify } from '@fullcalendar/core/util/promise';
- export { default as EmitterMixin, EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- export { DateRange, rangeContainsMarker, intersectRanges, rangesEqual, rangesIntersect, rangeContainsRange } from '@fullcalendar/core/datelib/date-range';
- export { default as Mixin } from '@fullcalendar/core/common/Mixin';
- export { default as PositionCache } from '@fullcalendar/core/common/PositionCache';
- export { default as ScrollComponent, ScrollbarWidths } from '@fullcalendar/core/common/ScrollComponent';
- export { ScrollController, ElementScrollController, WindowScrollController } from '@fullcalendar/core/common/scroll-controller';
- export { default as Theme } from '@fullcalendar/core/theme/Theme';
- export { default as Component, ComponentContext } from '@fullcalendar/core/component/Component';
- export { default as DateComponent, Seg, EventSegUiInteractionState } from '@fullcalendar/core/component/DateComponent';
- export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from '@fullcalendar/core/Calendar';
- export { default as View, ViewProps } from '@fullcalendar/core/View';
- export { default as FgEventRenderer, buildSegCompareObj } from '@fullcalendar/core/component/renderers/FgEventRenderer';
- export { default as FillRenderer } from '@fullcalendar/core/component/renderers/FillRenderer';
- export { default as DateProfileGenerator, DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- export { ViewDef } from '@fullcalendar/core/structs/view-def';
- export { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- export { DateSpan, DateSpanApi, DatePointApi, isDateSpansEqual } from '@fullcalendar/core/structs/date-span';
- export { DateMarker, addDays, startOfDay, addMs, addWeeks, diffWeeks, diffWholeWeeks, diffWholeDays, diffDayAndTime, diffDays, isValidDate } from '@fullcalendar/core/datelib/marker';
- export { Duration, createDuration, isSingleDay, multiplyDuration, addDurations, asRoughMinutes, asRoughSeconds, asRoughMs, wholeDivideDurations, greatestDurationDenominator } from '@fullcalendar/core/datelib/duration';
- export { DateEnv, DateMarkerMeta } from '@fullcalendar/core/datelib/env';
- export { DateFormatter, createFormatter, VerboseFormattingArg, formatIsoTimeString } from '@fullcalendar/core/datelib/formatting';
- export { NamedTimeZoneImpl } from '@fullcalendar/core/datelib/timezone';
- export { parse as parseMarker } from '@fullcalendar/core/datelib/parsing';
- export { EventSourceDef, EventSource, EventSourceHash } from '@fullcalendar/core/structs/event-source';
- export { Interaction, InteractionSettings, interactionSettingsToStore, interactionSettingsStore, InteractionSettingsStore } from '@fullcalendar/core/interactions/interaction';
- export { PointerDragEvent } from '@fullcalendar/core/interactions/pointer';
- export { Hit } from '@fullcalendar/core/interactions/hit';
- export { dateSelectionJoinTransformer } from '@fullcalendar/core/interactions/date-selecting';
- export { eventDragMutationMassager, EventDropTransformers } from '@fullcalendar/core/interactions/event-dragging';
- export { EventResizeJoinTransforms } from '@fullcalendar/core/interactions/event-resizing';
- export { default as ElementDragging } from '@fullcalendar/core/interactions/ElementDragging';
- export { formatDate, formatRange } from '@fullcalendar/core/formatting-api';
- export { globalDefaults, config } from '@fullcalendar/core/options';
- export { RecurringType, ParsedRecurring } from '@fullcalendar/core/structs/recurring-event';
- export { DragMetaInput, DragMeta, parseDragMeta } from '@fullcalendar/core/structs/drag-meta';
- export { createPlugin, PluginDef, PluginDefInput, ViewPropsTransformer, ViewContainerModifier } from '@fullcalendar/core/plugin-system';
- export { reducerFunc, Action, CalendarState } from '@fullcalendar/core/reducers/types';
- export { CalendarComponentProps } from '@fullcalendar/core/CalendarComponent';
- export { default as DayHeader } from '@fullcalendar/core/common/DayHeader';
- export { computeFallbackHeaderFormat, renderDateCell } from '@fullcalendar/core/common/table-utils';
- export { default as DaySeries } from '@fullcalendar/core/common/DaySeries';
- export { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- export { EventRenderRange, sliceEventStore, hasBgRendering, getElSeg, computeEventDraggable, computeEventStartResizable, computeEventEndResizable } from '@fullcalendar/core/component/event-rendering';
- export { default as DayTable, DayTableSeg, DayTableCell } from '@fullcalendar/core/common/DayTable';
- export { default as Slicer, SlicedProps } from '@fullcalendar/core/common/slicing-utils';
- export { EventMutation, applyMutationToEventStore } from '@fullcalendar/core/structs/event-mutation';
- export { Constraint, ConstraintInput, AllowFunc, isPropsValid, isInteractionValid } from '@fullcalendar/core/validation';
- export { default as EventApi } from '@fullcalendar/core/api/EventApi';
- export { default as requestJson } from '@fullcalendar/core/util/requestJson';
-}
-
-declare module '@fullcalendar/core/types/input-types' {
- import View from '@fullcalendar/core/View';
- import { EventSourceInput, EventInputTransformer } from '@fullcalendar/core/structs/event-source';
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import { FormatterInput } from '@fullcalendar/core/datelib/formatting';
- import { DateRangeInput } from '@fullcalendar/core/datelib/date-range';
- import { BusinessHoursInput } from '@fullcalendar/core/structs/business-hours';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { AllowFunc, ConstraintInput, OverlapFunc } from '@fullcalendar/core/validation';
- import { PluginDef } from '@fullcalendar/core/plugin-system';
- import { LocaleSingularArg, RawLocale } from '@fullcalendar/core/datelib/locale';
- export interface ToolbarInput {
- left?: string;
- center?: string;
- right?: string;
- }
- export interface CustomButtonInput {
- text: string;
- icon?: string;
- themeIcon?: string;
- bootstrapFontAwesome?: string;
- click(element: HTMLElement): void;
- }
- export interface ButtonIconsInput {
- prev?: string;
- next?: string;
- prevYear?: string;
- nextYear?: string;
- }
- export interface ButtonTextCompoundInput {
- prev?: string;
- next?: string;
- prevYear?: string;
- nextYear?: string;
- today?: string;
- month?: string;
- week?: string;
- day?: string;
- [viewId: string]: string | undefined;
- }
- export interface EventSegment {
- event: EventApi;
- start: Date;
- end: Date;
- isStart: boolean;
- isEnd: boolean;
- }
- export interface CellInfo {
- date: Date;
- dayEl: HTMLElement;
- moreEl: HTMLElement;
- segs: EventSegment[];
- hiddenSegs: EventSegment[];
- }
- export interface DropInfo {
- start: Date;
- end: Date;
- }
- export type EventHandlerName = '_init' | 'selectAllow' | 'eventAllow' | 'eventDataTransform' | 'datesRender' | 'datesDestroy' | 'dayRender' | 'windowResize' | 'dateClick' | 'eventClick' | 'eventMouseEnter' | 'eventMouseLeave' | 'select' | 'unselect' | 'loading' | 'eventRender' | 'eventPositioned' | '_eventsPositioned' | 'eventDestroy' | 'eventDragStart' | 'eventDragStop' | 'eventDrop' | '_destroyed' | 'drop' | 'eventResizeStart' | 'eventResizeStop' | 'eventResize' | 'eventReceive' | 'eventLeave' | 'viewSkeletonRender' | 'viewSkeletonDestroy' | '_noEventDrop' | '_noEventResize' | 'eventLimitClick' | 'resourceRender';
- export type EventHandlerArgs<T extends EventHandlerName> = Parameters<Extract<OptionsInput[T], (...args: any[]) => any>>;
- export type EventHandlerArg<T extends EventHandlerName> = EventHandlerArgs<T>[0];
- export interface OptionsInputBase {
- header?: boolean | ToolbarInput;
- footer?: boolean | ToolbarInput;
- customButtons?: {
- [name: string]: CustomButtonInput;
- };
- buttonIcons?: boolean | ButtonIconsInput;
- themeSystem?: 'standard' | string;
- bootstrapFontAwesome?: boolean | ButtonIconsInput;
- firstDay?: number;
- dir?: 'ltr' | 'rtl' | 'auto';
- weekends?: boolean;
- hiddenDays?: number[];
- fixedWeekCount?: boolean;
- weekNumbers?: boolean;
- weekNumbersWithinDays?: boolean;
- weekNumberCalculation?: 'local' | 'ISO' | ((m: Date) => number);
- businessHours?: BusinessHoursInput;
- showNonCurrentDates?: boolean;
- height?: number | 'auto' | 'parent' | (() => number);
- contentHeight?: number | 'auto' | (() => number);
- aspectRatio?: number;
- handleWindowResize?: boolean;
- windowResizeDelay?: number;
- eventLimit?: boolean | number;
- eventLimitClick?: 'popover' | 'week' | 'day' | 'timeGridWeek' | 'timeGridDay' | string | ((arg: {
- date: Date;
- allDay: boolean;
- dayEl: HTMLElement;
- moreEl: HTMLElement;
- segs: any[];
- hiddenSegs: any[];
- jsEvent: MouseEvent;
- view: View;
- }) => void);
- timeZone?: string | boolean;
- now?: DateInput | (() => DateInput);
- defaultView?: string;
- allDaySlot?: boolean;
- allDayText?: string;
- slotDuration?: DurationInput;
- slotLabelFormat?: FormatterInput;
- slotLabelInterval?: DurationInput;
- snapDuration?: DurationInput;
- scrollTime?: DurationInput;
- minTime?: DurationInput;
- maxTime?: DurationInput;
- slotEventOverlap?: boolean;
- listDayFormat?: FormatterInput | boolean;
- listDayAltFormat?: FormatterInput | boolean;
- noEventsMessage?: string;
- defaultDate?: DateInput;
- nowIndicator?: boolean;
- visibleRange?: ((currentDate: Date) => DateRangeInput) | DateRangeInput;
- validRange?: DateRangeInput;
- dateIncrement?: DurationInput;
- dateAlignment?: string;
- duration?: DurationInput;
- dayCount?: number;
- locales?: RawLocale[];
- locale?: LocaleSingularArg;
- eventTimeFormat?: FormatterInput;
- columnHeader?: boolean;
- columnHeaderFormat?: FormatterInput;
- columnHeaderText?: string | ((date: DateInput) => string);
- columnHeaderHtml?: string | ((date: DateInput) => string);
- titleFormat?: FormatterInput;
- weekLabel?: string;
- displayEventTime?: boolean;
- displayEventEnd?: boolean;
- eventLimitText?: string | ((eventCnt: number) => string);
- dayPopoverFormat?: FormatterInput;
- navLinks?: boolean;
- navLinkDayClick?: string | ((date: Date, jsEvent: Event) => void);
- navLinkWeekClick?: string | ((weekStart: any, jsEvent: Event) => void);
- selectable?: boolean;
- selectMirror?: boolean;
- unselectAuto?: boolean;
- unselectCancel?: string;
- defaultAllDayEventDuration?: DurationInput;
- defaultTimedEventDuration?: DurationInput;
- cmdFormatter?: string;
- defaultRangeSeparator?: string;
- selectConstraint?: ConstraintInput;
- selectOverlap?: boolean | OverlapFunc;
- selectAllow?: AllowFunc;
- editable?: boolean;
- eventStartEditable?: boolean;
- eventDurationEditable?: boolean;
- eventConstraint?: ConstraintInput;
- eventOverlap?: boolean | OverlapFunc;
- eventAllow?: AllowFunc;
- eventClassName?: string[] | string;
- eventClassNames?: string[] | string;
- eventBackgroundColor?: string;
- eventBorderColor?: string;
- eventTextColor?: string;
- eventColor?: string;
- events?: EventSourceInput;
- eventSources?: EventSourceInput[];
- allDayDefault?: boolean;
- startParam?: string;
- endParam?: string;
- lazyFetching?: boolean;
- nextDayThreshold?: DurationInput;
- eventOrder?: string | Array<((a: EventApi, b: EventApi) => number) | (string | ((a: EventApi, b: EventApi) => number))>;
- rerenderDelay?: number | null;
- dragRevertDuration?: number;
- dragScroll?: boolean;
- longPressDelay?: number;
- eventLongPressDelay?: number;
- droppable?: boolean;
- dropAccept?: string | ((draggable: any) => boolean);
- eventDataTransform?: EventInputTransformer;
- allDayMaintainDuration?: boolean;
- eventResizableFromStart?: boolean;
- timeGridEventMinHeight?: number;
- allDayHtml?: string;
- eventDragMinDistance?: number;
- eventSourceFailure?: any;
- eventSourceSuccess?: any;
- forceEventDuration?: boolean;
- progressiveEventRendering?: boolean;
- selectLongPressDelay?: number;
- selectMinDistance?: number;
- timeZoneParam?: string;
- titleRangeSeparator?: string;
- datesRender?(arg: {
- view: View;
- el: HTMLElement;
- }): void;
- datesDestroy?(arg: {
- view: View;
- el: HTMLElement;
- }): void;
- dayRender?(arg: {
- view: View;
- date: Date;
- allDay?: boolean;
- el: HTMLElement;
- }): void;
- windowResize?(view: View): void;
- dateClick?(arg: {
- date: Date;
- dateStr: string;
- allDay: boolean;
- resource?: any;
- dayEl: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventClick?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): boolean | void;
- eventMouseEnter?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventMouseLeave?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- select?(arg: {
- start: Date;
- end: Date;
- startStr: string;
- endStr: string;
- allDay: boolean;
- resource?: any;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- unselect?(arg: {
- view: View;
- jsEvent: Event;
- }): void;
- loading?(isLoading: boolean): void;
- eventRender?(arg: {
- isMirror: boolean;
- isStart: boolean;
- isEnd: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- eventPositioned?(arg: {
- isMirror: boolean;
- isStart: boolean;
- isEnd: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- _eventsPositioned?(arg: {
- view: View;
- }): void;
- eventDestroy?(arg: {
- isMirror: boolean;
- event: EventApi;
- el: HTMLElement;
- view: View;
- }): void;
- eventDragStart?(arg: {
- event: EventApi;
- el: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventDragStop?(arg: {
- event: EventApi;
- el: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventDrop?(arg: {
- el: HTMLElement;
- event: EventApi;
- oldEvent: EventApi;
- delta: Duration;
- revert: () => void;
- jsEvent: Event;
- view: View;
- }): void;
- eventResizeStart?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventResizeStop?(arg: {
- el: HTMLElement;
- event: EventApi;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventResize?(arg: {
- el: HTMLElement;
- startDelta: Duration;
- endDelta: Duration;
- prevEvent: EventApi;
- event: EventApi;
- revert: () => void;
- jsEvent: Event;
- view: View;
- }): void;
- drop?(arg: {
- date: Date;
- dateStr: string;
- allDay: boolean;
- draggedEl: HTMLElement;
- jsEvent: MouseEvent;
- view: View;
- }): void;
- eventReceive?(arg: {
- event: EventApi;
- draggedEl: HTMLElement;
- view: View;
- }): void;
- eventLeave?(arg: {
- draggedEl: HTMLElement;
- event: EventApi;
- view: View;
- }): void;
- viewSkeletonRender?(arg: {
- el: HTMLElement;
- view: View;
- }): void;
- viewSkeletonDestroy?(arg: {
- el: HTMLElement;
- view: View;
- }): void;
- _destroyed?(): void;
- _init?(): void;
- _noEventDrop?(): void;
- _noEventResize?(): void;
- resourceRender?(arg: {
- resource: any;
- el: HTMLElement;
- view: View;
- }): void;
- }
- export interface ViewOptionsInput extends OptionsInputBase {
- type?: string;
- buttonText?: string;
- }
- export interface OptionsInput extends OptionsInputBase {
- buttonText?: ButtonTextCompoundInput;
- views?: {
- [viewId: string]: ViewOptionsInput;
- };
- plugins?: (PluginDef | string)[];
- }
-}
-
-declare module '@fullcalendar/core/structs/event' {
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { UnscopedEventUiInput, EventUi } from '@fullcalendar/core/component/event-ui';
- export type EventRenderingChoice = '' | 'background' | 'inverse-background' | 'none';
- export interface EventNonDateInput extends UnscopedEventUiInput {
- id?: string | number;
- groupId?: string | number;
- title?: string;
- url?: string;
- rendering?: EventRenderingChoice;
- extendedProps?: object;
- [extendedProp: string]: any;
- }
- export interface EventDateInput {
- start?: DateInput;
- end?: DateInput;
- date?: DateInput;
- allDay?: boolean;
- }
- export type EventInput = EventNonDateInput & EventDateInput;
- export interface EventDef {
- defId: string;
- sourceId: string;
- publicId: string;
- groupId: string;
- allDay: boolean;
- hasEnd: boolean;
- recurringDef: {
- typeId: number;
- typeData: any;
- duration: Duration | null;
- } | null;
- title: string;
- url: string;
- rendering: EventRenderingChoice;
- ui: EventUi;
- extendedProps: any;
- }
- export interface EventInstance {
- instanceId: string;
- defId: string;
- range: DateRange;
- forcedStartTzo: number | null;
- forcedEndTzo: number | null;
- }
- export interface EventTuple {
- def: EventDef;
- instance: EventInstance | null;
- }
- export type EventInstanceHash = {
- [instanceId: string]: EventInstance;
- };
- export type EventDefHash = {
- [defId: string]: EventDef;
- };
- export const NON_DATE_PROPS: {
- id: StringConstructor;
- groupId: StringConstructor;
- title: StringConstructor;
- url: StringConstructor;
- rendering: StringConstructor;
- extendedProps: any;
- };
- export const DATE_PROPS: {
- start: any;
- date: any;
- end: any;
- allDay: any;
- };
- export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventTuple | null;
- export function parseEventDef(raw: EventNonDateInput, sourceId: string, allDay: boolean, hasEnd: boolean, calendar: Calendar): EventDef;
- export type eventDefParserFunc = (def: EventDef, props: any, leftovers: any) => void;
- export function createEventInstance(defId: string, range: DateRange, forcedStartTzo?: number, forcedEndTzo?: number): EventInstance;
-}
-
-declare module '@fullcalendar/core/structs/business-hours' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- export type BusinessHoursInput = boolean | EventInput | EventInput[];
- export function parseBusinessHours(input: BusinessHoursInput, calendar: Calendar): EventStore;
-}
-
-declare module '@fullcalendar/core/util/misc' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- export function compensateScroll(rowEl: HTMLElement, scrollbarWidths: any): void;
- export function uncompensateScroll(rowEl: HTMLElement): void;
- export function disableCursor(): void;
- export function enableCursor(): void;
- export function distributeHeight(els: HTMLElement[], availableHeight: any, shouldRedistribute: any): void;
- export function undistributeHeight(els: HTMLElement[]): void;
- export function matchCellWidths(els: HTMLElement[]): number;
- export function subtractInnerElHeight(outerEl: HTMLElement, innerEl: HTMLElement): number;
- export function preventSelection(el: HTMLElement): void;
- export function allowSelection(el: HTMLElement): void;
- export function preventContextMenu(el: HTMLElement): void;
- export function allowContextMenu(el: HTMLElement): void;
- export function parseFieldSpecs(input: any): any[];
- export function compareByFieldSpecs(obj0: any, obj1: any, fieldSpecs: any): any;
- export function compareByFieldSpec(obj0: any, obj1: any, fieldSpec: any): any;
- export function flexibleCompare(a: any, b: any): number;
- export function capitaliseFirstLetter(str: any): any;
- export function padStart(val: any, len: any): string;
- export function compareNumbers(a: any, b: any): number;
- export function isInt(n: any): boolean;
- export function applyAll(functions: any, thisObj: any, args: any): any;
- export function firstDefined(...args: any[]): any;
- export function debounce(func: any, wait: any): () => any;
- export type GenericHash = {
- [key: string]: any;
- };
- export function refineProps(rawProps: GenericHash, processors: GenericHash, defaults?: GenericHash, leftoverProps?: GenericHash): GenericHash;
- export function computeAlignedDayRange(timedRange: DateRange): DateRange;
- export function computeVisibleDayRange(timedRange: OpenDateRange, nextDayThreshold?: Duration): OpenDateRange;
- export function isMultiDayRange(range: DateRange): boolean;
- export function diffDates(date0: DateMarker, date1: DateMarker, dateEnv: DateEnv, largeUnit?: string): Duration;
-}
-
-declare module '@fullcalendar/core/util/html' {
- export function htmlEscape(s: any): string;
- export function cssToStr(cssProps: any): string;
- export function attrsToStr(attrs: any): string;
- export type ClassNameInput = string | string[];
- export function parseClassName(raw: ClassNameInput): string[];
-}
-
-declare module '@fullcalendar/core/util/array' {
- export function removeMatching(array: any, testFunc: any): number;
- export function removeExact(array: any, exactVal: any): number;
- export function isArraysEqual(a0: any, a1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/memoize' {
- export function memoize<T>(workerFunc: T): T;
- export function memoizeOutput<T>(workerFunc: T, equalityFunc: (output0: any, output1: any) => boolean): T;
-}
-
-declare module '@fullcalendar/core/component/memoized-rendering' {
- export interface MemoizedRendering<ArgsType extends any[]> {
- (...args: ArgsType): void;
- unrender: () => void;
- dependents: MemoizedRendering<any>[];
- }
- export function memoizeRendering<ArgsType extends any[]>(renderFunc: (...args: ArgsType) => void, unrenderFunc?: (...args: ArgsType) => void, dependencies?: MemoizedRendering<any>[]): MemoizedRendering<ArgsType>;
-}
-
-declare module '@fullcalendar/core/util/geom' {
- export interface Point {
- left: number;
- top: number;
- }
- export interface Rect {
- left: number;
- right: number;
- top: number;
- bottom: number;
- }
- export function pointInsideRect(point: Point, rect: Rect): boolean;
- export function intersectRects(rect1: Rect, rect2: Rect): Rect | false;
- export function translateRect(rect: Rect, deltaX: number, deltaY: number): Rect;
- export function constrainPoint(point: Point, rect: Rect): Point;
- export function getRectCenter(rect: Rect): Point;
- export function diffPoints(point1: Point, point2: Point): Point;
-}
-
-declare module '@fullcalendar/core/util/object' {
- export function mergeProps(propObjs: any, complexProps?: any): any;
- export function filterHash(hash: any, func: any): {};
- export function mapHash<InputItem, OutputItem>(hash: {
- [key: string]: InputItem;
- }, func: (input: InputItem, key: string) => OutputItem): {
- [key: string]: OutputItem;
- };
- export function arrayToHash(a: any): {
- [key: string]: true;
- };
- export function hashValuesToArray(obj: any): any[];
- export function isPropsEqual(obj0: any, obj1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/dom-manip' {
- export function createElement(tagName: string, attrs: object | null, content?: ElementContent): HTMLElement;
- export function htmlToElement(html: string): HTMLElement;
- export function htmlToElements(html: string): HTMLElement[];
- export type ElementContent = string | Node | Node[] | NodeList;
- export function appendToElement(el: HTMLElement, content: ElementContent): void;
- export function prependToElement(parent: HTMLElement, content: ElementContent): void;
- export function insertAfterElement(refEl: HTMLElement, content: ElementContent): void;
- export function removeElement(el: HTMLElement): void;
- export function elementClosest(el: HTMLElement, selector: string): HTMLElement;
- export function elementMatches(el: HTMLElement, selector: string): HTMLElement;
- export function findElements(container: HTMLElement[] | HTMLElement | NodeListOf<HTMLElement>, selector: string): HTMLElement[];
- export function findChildren(parent: HTMLElement[] | HTMLElement, selector?: string): HTMLElement[];
- export function forceClassName(el: HTMLElement, className: string, bool: any): void;
- export function applyStyle(el: HTMLElement, props: object): void;
- export function applyStyleProp(el: HTMLElement, name: string, val: any): void;
-}
-
-declare module '@fullcalendar/core/structs/event-store' {
- import { EventInput, EventDef, EventDefHash, EventInstanceHash, EventTuple } from '@fullcalendar/core/structs/event';
- import { EventSource } from '@fullcalendar/core/structs/event-source';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- export interface EventStore {
- defs: EventDefHash;
- instances: EventInstanceHash;
- }
- export function parseEvents(rawEvents: EventInput[], sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventStore;
- export function eventTupleToStore(tuple: EventTuple, eventStore?: EventStore): EventStore;
- export function expandRecurring(eventStore: EventStore, framingRange: DateRange, calendar: Calendar): EventStore;
- export function getRelevantEvents(eventStore: EventStore, instanceId: string): EventStore;
- export function transformRawEvents(rawEvents: any, eventSource: EventSource, calendar: Calendar): any;
- export function createEmptyEventStore(): EventStore;
- export function mergeEventStores(store0: EventStore, store1: EventStore): EventStore;
- export function filterEventStoreDefs(eventStore: EventStore, filterFunc: (eventDef: EventDef) => boolean): EventStore;
-}
-
-declare module '@fullcalendar/core/component/event-ui' {
- import { Constraint, AllowFunc, ConstraintInput } from '@fullcalendar/core/validation';
- import { parseClassName } from '@fullcalendar/core/util/html';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface UnscopedEventUiInput {
- editable?: boolean;
- startEditable?: boolean;
- durationEditable?: boolean;
- constraint?: ConstraintInput;
- overlap?: boolean;
- allow?: AllowFunc;
- className?: string[] | string;
- classNames?: string[] | string;
- backgroundColor?: string;
- borderColor?: string;
- textColor?: string;
- color?: string;
- }
- export interface EventUi {
- startEditable: boolean | null;
- durationEditable: boolean | null;
- constraints: Constraint[];
- overlap: boolean | null;
- allows: AllowFunc[];
- backgroundColor: string;
- borderColor: string;
- textColor: string;
- classNames: string[];
- }
- export type EventUiHash = {
- [defId: string]: EventUi;
- };
- export const UNSCOPED_EVENT_UI_PROPS: {
- editable: BooleanConstructor;
- startEditable: BooleanConstructor;
- durationEditable: BooleanConstructor;
- constraint: any;
- overlap: any;
- allow: any;
- className: typeof parseClassName;
- classNames: typeof parseClassName;
- color: StringConstructor;
- backgroundColor: StringConstructor;
- borderColor: StringConstructor;
- textColor: StringConstructor;
- };
- export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar: Calendar, leftovers?: any): EventUi;
- export function processScopedUiProps(prefix: string, rawScoped: any, calendar: Calendar, leftovers?: any): EventUi;
- export function combineEventUis(uis: EventUi[]): EventUi;
-}
-
-declare module '@fullcalendar/core/component/event-splitting' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { EventUiHash, EventUi } from '@fullcalendar/core/component/event-ui';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- export interface SplittableProps {
- businessHours: EventStore | null;
- dateSelection: DateSpan | null;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export { Splitter as default, Splitter };
- abstract class Splitter<PropsType extends SplittableProps = SplittableProps> {
- abstract getKeyInfo(props: PropsType): {
- [key: string]: {
- ui?: EventUi;
- businessHours?: EventStore;
- };
- };
- abstract getKeysForDateSpan(dateSpan: DateSpan): string[];
- abstract getKeysForEventDef(eventDef: EventDef): string[];
- splitProps(props: PropsType): {
- [key: string]: SplittableProps;
- };
- }
-}
-
-declare module '@fullcalendar/core/component/date-rendering' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- export function buildGotoAnchorHtml(allOptions: any, dateEnv: DateEnv, gotoOptions: any, attrs: any, innerHtml?: any): string;
- export function getAllDayHtml(allOptions: any): any;
- export function getDayClasses(date: DateMarker, dateProfile: DateProfile, context: ComponentContext, noThemeHighlight?: any): any[];
-}
-
-declare module '@fullcalendar/core/util/dom-event' {
- export function preventDefault(ev: any): void;
- export function listenBySelector(container: HTMLElement, eventType: string, selector: string, handler: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
- export function listenToHoverBySelector(container: HTMLElement, selector: string, onMouseEnter: (ev: Event, matchedTarget: HTMLElement) => void, onMouseLeave: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
- export function whenTransitionDone(el: HTMLElement, callback: (ev: Event) => void): void;
-}
-
-declare module '@fullcalendar/core/util/dom-geom' {
- import { Rect } from '@fullcalendar/core/util/geom';
- export interface EdgeInfo {
- borderLeft: number;
- borderRight: number;
- borderTop: number;
- borderBottom: number;
- scrollbarLeft: number;
- scrollbarRight: number;
- scrollbarBottom: number;
- paddingLeft?: number;
- paddingRight?: number;
- paddingTop?: number;
- paddingBottom?: number;
- }
- export function computeEdges(el: any, getPadding?: boolean): EdgeInfo;
- export function computeInnerRect(el: any, goWithinPadding?: boolean): {
- left: number;
- right: number;
- top: number;
- bottom: number;
- };
- export function computeRect(el: any): Rect;
- export function computeHeightAndMargins(el: HTMLElement): number;
- export function computeVMargins(el: HTMLElement): number;
- export function getClippingParents(el: HTMLElement): HTMLElement[];
- export function computeClippingRect(el: HTMLElement): Rect;
-}
-
-declare module '@fullcalendar/core/util/promise' {
- export function unpromisify(func: any, success: any, failure?: any): void;
-}
-
-declare module '@fullcalendar/core/common/EmitterMixin' {
- import Mixin from '@fullcalendar/core/common/Mixin';
- export interface EmitterInterface {
- on(types: any, handler: any): any;
- one(types: any, handler: any): any;
- off(types: any, handler: any): any;
- trigger(type: any, ...args: any[]): any;
- triggerWith(type: any, context: any, args: any): any;
- hasHandlers(type: any): any;
- }
- export { EmitterMixin as default, EmitterMixin };
- class EmitterMixin extends Mixin implements EmitterInterface {
- _handlers: any;
- _oneHandlers: any;
- on(type: any, handler: any): this;
- one(type: any, handler: any): this;
- off(type: any, handler?: any): this;
- trigger(type: any, ...args: any[]): this;
- triggerWith(type: any, context: any, args: any): this;
- hasHandlers(type: any): any;
- }
-}
-
-declare module '@fullcalendar/core/datelib/date-range' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateEnv, DateInput } from '@fullcalendar/core/datelib/env';
- export interface DateRangeInput {
- start?: DateInput;
- end?: DateInput;
- }
- export interface OpenDateRange {
- start: DateMarker | null;
- end: DateMarker | null;
- }
- export interface DateRange {
- start: DateMarker;
- end: DateMarker;
- }
- export function parseRange(input: DateRangeInput, dateEnv: DateEnv): OpenDateRange;
- export function invertRanges(ranges: DateRange[], constraintRange: DateRange): DateRange[];
- export function intersectRanges(range0: OpenDateRange, range1: OpenDateRange): OpenDateRange;
- export function rangesEqual(range0: OpenDateRange, range1: OpenDateRange): boolean;
- export function rangesIntersect(range0: OpenDateRange, range1: OpenDateRange): boolean;
- export function rangeContainsRange(outerRange: OpenDateRange, innerRange: OpenDateRange): boolean;
- export function rangeContainsMarker(range: OpenDateRange, date: DateMarker | number): boolean;
- export function constrainMarkerToRange(date: DateMarker, range: DateRange): DateMarker;
-}
-
-declare module '@fullcalendar/core/common/Mixin' {
- export { Mixin as default, Mixin };
- class Mixin {
- static mixInto(destClass: any): void;
- static mixIntoObj(destObj: any): void;
- static mixOver(destClass: any): void;
- }
-}
-
-declare module '@fullcalendar/core/common/PositionCache' {
- export { PositionCache as default, PositionCache };
- class PositionCache {
- originClientRect: ClientRect;
- els: HTMLElement[];
- originEl: HTMLElement;
- isHorizontal: boolean;
- isVertical: boolean;
- lefts: any;
- rights: any;
- tops: any;
- bottoms: any;
- constructor(originEl: HTMLElement, els: HTMLElement[], isHorizontal: boolean, isVertical: boolean);
- build(): void;
- buildElHorizontals(originClientLeft: number): void;
- buildElVerticals(originClientTop: number): void;
- leftToIndex(leftPosition: number): any;
- topToIndex(topPosition: number): any;
- getWidth(leftIndex: number): number;
- getHeight(topIndex: number): number;
- }
-}
-
-declare module '@fullcalendar/core/common/ScrollComponent' {
- import { ElementScrollController } from '@fullcalendar/core/common/scroll-controller';
- export interface ScrollbarWidths {
- left: number;
- right: number;
- bottom: number;
- }
- export { ScrollComponent as default, ScrollComponent };
- class ScrollComponent extends ElementScrollController {
- overflowX: string;
- overflowY: string;
- constructor(overflowX: string, overflowY: string);
- clear(): void;
- destroy(): void;
- applyOverflow(): void;
- lockOverflow(scrollbarWidths: ScrollbarWidths): void;
- setHeight(height: number | string): void;
- getScrollbarWidths(): ScrollbarWidths;
- }
-}
-
-declare module '@fullcalendar/core/common/scroll-controller' {
- export abstract class ScrollController {
- abstract getScrollTop(): number;
- abstract getScrollLeft(): number;
- abstract setScrollTop(top: number): void;
- abstract setScrollLeft(left: number): void;
- abstract getClientWidth(): number;
- abstract getClientHeight(): number;
- abstract getScrollWidth(): number;
- abstract getScrollHeight(): number;
- getMaxScrollTop(): number;
- getMaxScrollLeft(): number;
- canScrollVertically(): boolean;
- canScrollHorizontally(): boolean;
- canScrollUp(): boolean;
- canScrollDown(): boolean;
- canScrollLeft(): boolean;
- canScrollRight(): boolean;
- }
- export class ElementScrollController extends ScrollController {
- el: HTMLElement;
- constructor(el: HTMLElement);
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(top: number): void;
- setScrollLeft(left: number): void;
- getScrollWidth(): number;
- getScrollHeight(): number;
- getClientHeight(): number;
- getClientWidth(): number;
- }
- export class WindowScrollController extends ScrollController {
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(n: number): void;
- setScrollLeft(n: number): void;
- getScrollWidth(): number;
- getScrollHeight(): number;
- getClientHeight(): number;
- getClientWidth(): number;
- }
-}
-
-declare module '@fullcalendar/core/theme/Theme' {
- export { Theme as default, Theme };
- class Theme {
- calendarOptions: any;
- classes: any;
- iconClasses: any;
- baseIconClass: string;
- iconOverrideOption: any;
- iconOverrideCustomButtonOption: any;
- iconOverridePrefix: string;
- constructor(calendarOptions: any);
- processIconOverride(): void;
- setIconOverride(iconOverrideHash: any): void;
- applyIconOverridePrefix(className: any): any;
- getClass(key: any): any;
- getIconClass(buttonName: any): string;
- getCustomButtonIconClass(customButtonProps: any): string;
- }
- export type ThemeClass = {
- new (calendarOptions: any): Theme;
- };
-}
-
-declare module '@fullcalendar/core/component/Component' {
- import Calendar from '@fullcalendar/core/Calendar';
- import View from '@fullcalendar/core/View';
- import Theme from '@fullcalendar/core/theme/Theme';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- export class ComponentContext {
- calendar: Calendar;
- theme: Theme;
- dateEnv: DateEnv;
- options: any;
- view?: View;
- isRtl: boolean;
- eventOrderSpecs: any;
- nextDayThreshold: Duration;
- constructor(calendar: Calendar, theme: Theme, dateEnv: DateEnv, options: any, view?: View);
- extend(options?: any, view?: View): ComponentContext;
- }
- export type EqualityFuncHash = {
- [propName: string]: (obj0: any, obj1: any) => boolean;
- };
- export { Component as default, Component };
- class Component<PropsType> {
- equalityFuncs: EqualityFuncHash;
- uid: string;
- props: PropsType | null;
- everRendered: boolean;
- context: ComponentContext;
- constructor();
- static addEqualityFuncs(newFuncs: EqualityFuncHash): void;
- receiveProps(props: PropsType, context: ComponentContext): void;
- receiveContext(context: ComponentContext): void;
- protected render(props: PropsType, context: ComponentContext): void;
- firstContext(context: ComponentContext): void;
- beforeUpdate(): void;
- afterUpdate(): void;
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/core/component/DateComponent' {
- import Component from '@fullcalendar/core/component/Component';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInstanceHash } from '@fullcalendar/core/structs/event';
- import { Hit } from '@fullcalendar/core/interactions/hit';
- import FgEventRenderer from '@fullcalendar/core/component/renderers/FgEventRenderer';
- import FillRenderer from '@fullcalendar/core/component/renderers/FillRenderer';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- export type DateComponentHash = {
- [uid: string]: DateComponent<any>;
- };
- export interface Seg {
- component?: DateComponent<any>;
- isStart: boolean;
- isEnd: boolean;
- eventRange?: EventRenderRange;
- el?: HTMLElement;
- [otherProp: string]: any;
- }
- export interface EventSegUiInteractionState {
- affectedInstances: EventInstanceHash;
- segs: Seg[];
- isEvent: boolean;
- sourceSeg: any;
- }
- export { DateComponent as default, DateComponent };
- class DateComponent<PropsType> extends Component<PropsType> {
- fgSegSelector: string;
- bgSegSelector: string;
- largeUnit: any;
- eventRenderer: FgEventRenderer;
- mirrorRenderer: FgEventRenderer;
- fillRenderer: FillRenderer;
- el: HTMLElement;
- constructor(el: HTMLElement);
- destroy(): void;
- buildPositionCaches(): void;
- queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
- isInteractionValid(interaction: EventInteractionState): boolean;
- isDateSelectionValid(selection: DateSpan): boolean;
- isValidSegDownEl(el: HTMLElement): boolean;
- isValidDateDownEl(el: HTMLElement): boolean;
- isPopover(): boolean;
- isInPopover(el: HTMLElement): boolean;
- }
-}
-
-declare module '@fullcalendar/core/Calendar' {
- import { EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- import OptionsManager from '@fullcalendar/core/OptionsManager';
- import View from '@fullcalendar/core/View';
- import Theme from '@fullcalendar/core/theme/Theme';
- import { OptionsInput, EventHandlerName, EventHandlerArgs } from '@fullcalendar/core/types/input-types';
- import { RawLocaleMap } from '@fullcalendar/core/datelib/locale';
- import { DateEnv, DateInput } from '@fullcalendar/core/datelib/env';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { DateSpan, DateSpanApi, DatePointApi } from '@fullcalendar/core/structs/date-span';
- import { DateRangeInput } from '@fullcalendar/core/datelib/date-range';
- import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
- import { EventSourceInput } from '@fullcalendar/core/structs/event-source';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { CalendarState, Action } from '@fullcalendar/core/reducers/types';
- import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash, EventUi } from '@fullcalendar/core/component/event-ui';
- import { ViewSpecHash, ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { PluginSystem } from '@fullcalendar/core/plugin-system';
- import CalendarComponent from '@fullcalendar/core/CalendarComponent';
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { PointerDragEvent } from '@fullcalendar/core/interactions/pointer';
- import { InteractionSettingsInput, Interaction } from '@fullcalendar/core/interactions/interaction';
- export interface DateClickApi extends DatePointApi {
- dayEl: HTMLElement;
- jsEvent: UIEvent;
- view: View;
- }
- export interface DateSelectionApi extends DateSpanApi {
- jsEvent: UIEvent;
- view: View;
- }
- export type DatePointTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
- export type DateSpanTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
- export type CalendarInteraction = {
- destroy(): any;
- };
- export type CalendarInteractionClass = {
- new (calendar: Calendar): CalendarInteraction;
- };
- export type OptionChangeHandler = (propValue: any, calendar: Calendar, deepEqual: any) => void;
- export type OptionChangeHandlerMap = {
- [propName: string]: OptionChangeHandler;
- };
- export { Calendar as default, Calendar };
- class Calendar {
- static on: EmitterInterface['on'];
- static off: EmitterInterface['off'];
- static trigger: EmitterInterface['trigger'];
- on: EmitterInterface['on'];
- one: EmitterInterface['one'];
- off: EmitterInterface['off'];
- trigger: EmitterInterface['trigger'];
- triggerWith: EmitterInterface['triggerWith'];
- hasHandlers: EmitterInterface['hasHandlers'];
- eventUiBases: EventUiHash;
- selectionConfig: EventUi;
- optionsManager: OptionsManager;
- viewSpecs: ViewSpecHash;
- dateProfileGenerators: {
- [viewName: string]: DateProfileGenerator;
- };
- theme: Theme;
- dateEnv: DateEnv;
- availableRawLocales: RawLocaleMap;
- pluginSystem: PluginSystem;
- defaultAllDayEventDuration: Duration;
- defaultTimedEventDuration: Duration;
- calendarInteractions: CalendarInteraction[];
- interactionsStore: {
- [componentUid: string]: Interaction[];
- };
- removeNavLinkListener: any;
- windowResizeProxy: any;
- isHandlingWindowResize: boolean;
- state: CalendarState;
- actionQueue: any[];
- isReducing: boolean;
- needsRerender: boolean;
- isRendering: boolean;
- renderingPauseDepth: number;
- renderableEventStore: EventStore;
- buildDelayedRerender: typeof buildDelayedRerender;
- delayedRerender: any;
- afterSizingTriggers: any;
- isViewUpdated: boolean;
- isDatesUpdated: boolean;
- isEventsUpdated: boolean;
- el: HTMLElement;
- component: CalendarComponent;
- constructor(el: HTMLElement, overrides?: OptionsInput);
- addPluginInputs(pluginInputs: any): void;
- readonly view: View;
- render(): void;
- destroy(): void;
- bindHandlers(): void;
- unbindHandlers(): void;
- hydrate(): void;
- buildInitialState(): CalendarState;
- reduce(state: CalendarState, action: Action, calendar: Calendar): CalendarState;
- requestRerender(): void;
- tryRerender(): void;
- batchRendering(func: any): void;
- executeRender(): void;
- renderComponent(): void;
- setOption(name: string, val: any): void;
- getOption(name: string): any;
- opt(name: string): any;
- viewOpt(name: string): any;
- viewOpts(): any;
- mutateOptions(updates: any, removals: string[], isDynamic?: boolean, deepEqual?: any): void;
- handleOptions(options: any): void;
- getAvailableLocaleCodes(): string[];
- _buildSelectionConfig(rawOpts: any): EventUi;
- _buildEventUiSingleBase(rawOpts: any): EventUi;
- hasPublicHandlers<T extends EventHandlerName>(name: T): boolean;
- publiclyTrigger<T extends EventHandlerName>(name: T, args?: EventHandlerArgs<T>): any;
- publiclyTriggerAfterSizing<T extends EventHandlerName>(name: T, args: EventHandlerArgs<T>): void;
- releaseAfterSizingTriggers(): void;
- isValidViewType(viewType: string): boolean;
- changeView(viewType: string, dateOrRange?: DateRangeInput | DateInput): void;
- zoomTo(dateMarker: DateMarker, viewType?: string): void;
- getUnitViewSpec(unit: string): ViewSpec | null;
- getInitialDate(): Date;
- prev(): void;
- next(): void;
- prevYear(): void;
- nextYear(): void;
- today(): void;
- gotoDate(zonedDateInput: any): void;
- incrementDate(deltaInput: any): void;
- getDate(): Date;
- formatDate(d: DateInput, formatter: any): string;
- formatRange(d0: DateInput, d1: DateInput, settings: any): any;
- formatIso(d: DateInput, omitTime?: boolean): string;
- windowResize(ev: Event): void;
- updateSize(): void;
- registerInteractiveComponent(component: DateComponent<any>, settingsInput: InteractionSettingsInput): void;
- unregisterInteractiveComponent(component: DateComponent<any>): void;
- select(dateOrObj: DateInput | any, endDate?: DateInput): void;
- unselect(pev?: PointerDragEvent): void;
- triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent): void;
- triggerDateUnselect(pev?: PointerDragEvent): void;
- triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent): void;
- buildDatePointApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DatePointApi;
- buildDateSpanApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DateSpanApi;
- getNow(): DateMarker;
- getDefaultEventEnd(allDay: boolean, marker: DateMarker): DateMarker;
- addEvent(eventInput: EventInput, sourceInput?: EventSourceApi | string | number): EventApi | null;
- getEventById(id: string): EventApi | null;
- getEvents(): EventApi[];
- removeAllEvents(): void;
- rerenderEvents(): void;
- getEventSources(): EventSourceApi[];
- getEventSourceById(id: string | number): EventSourceApi | null;
- addEventSource(sourceInput: EventSourceInput): EventSourceApi;
- removeAllEventSources(): void;
- refetchEvents(): void;
- scrollToTime(timeInput: DurationInput): void;
- }
- function buildDelayedRerender(this: Calendar, wait: any): any;
- export {};
-}
-
-declare module '@fullcalendar/core/View' {
- import DateProfileGenerator, { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export interface ViewProps {
- dateProfileGenerator: DateProfileGenerator;
- dateProfile: DateProfile;
- businessHours: EventStore;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export { View as default, View };
- abstract class View extends DateComponent<ViewProps> {
- usesMinMaxTime: boolean;
- dateProfileGeneratorClass: any;
- on: EmitterInterface['on'];
- one: EmitterInterface['one'];
- off: EmitterInterface['off'];
- trigger: EmitterInterface['trigger'];
- triggerWith: EmitterInterface['triggerWith'];
- hasHandlers: EmitterInterface['hasHandlers'];
- viewSpec: ViewSpec;
- type: string;
- title: string;
- queuedScroll: any;
- isNowIndicatorRendered: boolean;
- initialNowDate: DateMarker;
- initialNowQueriedMs: number;
- nowIndicatorTimeoutID: any;
- nowIndicatorIntervalID: any;
- constructor(viewSpec: ViewSpec, parentEl: HTMLElement);
- initialize(): void;
- readonly activeStart: Date;
- readonly activeEnd: Date;
- readonly currentStart: Date;
- readonly currentEnd: Date;
- render(props: ViewProps, context: ComponentContext): void;
- beforeUpdate(): void;
- destroy(): void;
- updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- renderDatesWrap(dateProfile: DateProfile): void;
- unrenderDatesWrap(): void;
- renderDates(dateProfile: DateProfile): void;
- unrenderDates(): void;
- renderBusinessHours(businessHours: EventStore): void;
- unrenderBusinessHours(): void;
- renderDateSelectionWrap(selection: DateSpan): void;
- unrenderDateSelectionWrap(selection: DateSpan): void;
- renderDateSelection(selection: DateSpan): void;
- unrenderDateSelection(selection: DateSpan): void;
- renderEvents(eventStore: EventStore): void;
- unrenderEvents(): void;
- sliceEvents(eventStore: EventStore, allDay: boolean): EventRenderRange[];
- renderEventSelectionWrap(instanceId: string): void;
- unrenderEventSelectionWrap(instanceId: string): void;
- renderEventSelection(instanceId: string): void;
- unrenderEventSelection(instanceId: string): void;
- renderEventDragWrap(state: EventInteractionState): void;
- unrenderEventDragWrap(state: EventInteractionState): void;
- renderEventDrag(state: EventInteractionState): void;
- unrenderEventDrag(state: EventInteractionState): void;
- renderEventResizeWrap(state: EventInteractionState): void;
- unrenderEventResizeWrap(state: EventInteractionState): void;
- renderEventResize(state: EventInteractionState): void;
- unrenderEventResize(state: EventInteractionState): void;
- startNowIndicator(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): void;
- updateNowIndicator(): void;
- stopNowIndicator(): void;
- getNowIndicatorUnit(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): void;
- renderNowIndicator(date: any): void;
- unrenderNowIndicator(): void;
- addScroll(scroll: any, isForced?: boolean): void;
- popScroll(isResize: boolean): void;
- applyQueuedScroll(isResize: boolean): void;
- queryScroll(): any;
- applyScroll(scroll: any, isResize: boolean): void;
- computeDateScroll(duration: Duration): {};
- queryDateScroll(): {};
- applyDateScroll(scroll: any): void;
- scrollToDuration(duration: Duration): void;
- }
-}
-
-declare module '@fullcalendar/core/component/renderers/FgEventRenderer' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateFormatter } from '@fullcalendar/core/datelib/formatting';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export { FgEventRenderer as default, FgEventRenderer };
- abstract class FgEventRenderer {
- context: ComponentContext;
- eventTimeFormat: DateFormatter;
- displayEventTime: boolean;
- displayEventEnd: boolean;
- segs: Seg[];
- isSizeDirty: boolean;
- renderSegs(context: ComponentContext, segs: Seg[], mirrorInfo?: any): void;
- unrender(context: ComponentContext, _segs: Seg[], mirrorInfo?: any): void;
- abstract renderSegHtml(seg: Seg, mirrorInfo: any): string;
- abstract attachSegs(segs: Seg[], mirrorInfo: any): any;
- abstract detachSegs(segs: Seg[]): any;
- rangeUpdated(): void;
- renderSegEls(segs: Seg[], mirrorInfo: any): Seg[];
- getSegClasses(seg: Seg, isDraggable: any, isResizable: any, mirrorInfo: any): string[];
- getTimeText(eventRange: EventRenderRange, formatter?: any, displayEnd?: any): any;
- _getTimeText(start: DateMarker, end: DateMarker, allDay: any, formatter?: any, displayEnd?: any, forcedStartTzo?: number, forcedEndTzo?: number): any;
- computeEventTimeFormat(): any;
- computeDisplayEventTime(): boolean;
- computeDisplayEventEnd(): boolean;
- getSkinCss(ui: EventUi): {
- 'background-color': string;
- 'border-color': string;
- color: string;
- };
- sortEventSegs(segs: any): Seg[];
- computeSizes(force: boolean): void;
- assignSizes(force: boolean): void;
- computeSegSizes(segs: Seg[]): void;
- assignSegSizes(segs: Seg[]): void;
- hideByHash(hash: any): void;
- showByHash(hash: any): void;
- selectByInstanceId(instanceId: string): void;
- unselectByInstanceId(instanceId: string): void;
- }
- export function buildSegCompareObj(seg: Seg): any;
-}
-
-declare module '@fullcalendar/core/component/renderers/FillRenderer' {
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export { FillRenderer as default, FillRenderer };
- abstract class FillRenderer {
- context: ComponentContext;
- fillSegTag: string;
- containerElsByType: any;
- segsByType: any;
- dirtySizeFlags: any;
- constructor();
- getSegsByType(type: string): any;
- renderSegs(type: string, context: ComponentContext, segs: Seg[]): void;
- unrender(type: string, context: ComponentContext): void;
- renderSegEls(type: any, segs: Seg[]): Seg[];
- renderSegHtml(type: any, seg: Seg): string;
- abstract attachSegs(type: any, segs: Seg[]): HTMLElement[] | void;
- detachSegs(type: any, segs: Seg[]): void;
- computeSizes(force: boolean): void;
- assignSizes(force: boolean): void;
- computeSegSizes(segs: Seg[]): void;
- assignSegSizes(segs: Seg[]): void;
- }
-}
-
-declare module '@fullcalendar/core/DateProfileGenerator' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface DateProfile {
- currentRange: DateRange;
- currentRangeUnit: string;
- isRangeAllDay: boolean;
- validRange: OpenDateRange;
- activeRange: DateRange;
- renderRange: DateRange;
- minTime: Duration;
- maxTime: Duration;
- isValid: boolean;
- dateIncrement: Duration;
- }
- export { DateProfileGenerator as default, DateProfileGenerator };
- class DateProfileGenerator {
- viewSpec: ViewSpec;
- options: any;
- dateEnv: DateEnv;
- calendar: Calendar;
- isHiddenDayHash: boolean[];
- constructor(viewSpec: ViewSpec, calendar: Calendar);
- buildPrev(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
- buildNext(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
- build(currentDate: DateMarker, direction?: any, forceToValid?: boolean): DateProfile;
- buildValidRange(): OpenDateRange;
- buildCurrentRangeInfo(date: DateMarker, direction: any): {
- duration: any;
- unit: any;
- range: any;
- };
- getFallbackDuration(): Duration;
- adjustActiveRange(range: DateRange, minTime: Duration, maxTime: Duration): {
- start: Date;
- end: Date;
- };
- buildRangeFromDuration(date: DateMarker, direction: any, duration: Duration, unit: any): any;
- buildRangeFromDayCount(date: DateMarker, direction: any, dayCount: any): {
- start: Date;
- end: Date;
- };
- buildCustomVisibleRange(date: DateMarker): OpenDateRange;
- buildRenderRange(currentRange: DateRange, currentRangeUnit: any, isRangeAllDay: any): DateRange;
- buildDateIncrement(fallback: any): Duration;
- getRangeOption(name: any, ...otherArgs: any[]): OpenDateRange;
- initHiddenDays(): void;
- trimHiddenDays(range: DateRange): DateRange | null;
- isHiddenDay(day: any): boolean;
- skipHiddenDays(date: DateMarker, inc?: number, isExclusive?: boolean): Date;
- }
- export function isDateProfilesEqual(p0: DateProfile, p1: DateProfile): boolean;
-}
-
-declare module '@fullcalendar/core/structs/view-def' {
- import { ViewClass, ViewConfigHash } from '@fullcalendar/core/structs/view-config';
- export interface ViewDef {
- type: string;
- class: ViewClass;
- overrides: any;
- defaults: any;
- }
- export type ViewDefHash = {
- [viewType: string]: ViewDef;
- };
- export function compileViewDefs(defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDefHash;
-}
-
-declare module '@fullcalendar/core/structs/view-spec' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import OptionsManager from '@fullcalendar/core/OptionsManager';
- import { ViewConfigInputHash, ViewClass } from '@fullcalendar/core/structs/view-config';
- export interface ViewSpec {
- type: string;
- class: ViewClass;
- duration: Duration;
- durationUnit: string;
- singleUnit: string;
- options: any;
- buttonTextOverride: string;
- buttonTextDefault: string;
- }
- export type ViewSpecHash = {
- [viewType: string]: ViewSpec;
- };
- export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionsManager: OptionsManager): ViewSpecHash;
-}
-
-declare module '@fullcalendar/core/structs/date-span' {
- import { DateRange, OpenDateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateInput, DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EventRenderRange } from '@fullcalendar/core/component/event-rendering';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface OpenDateSpanInput {
- start?: DateInput;
- end?: DateInput;
- allDay?: boolean;
- [otherProp: string]: any;
- }
- export interface DateSpanInput extends OpenDateSpanInput {
- start: DateInput;
- end: DateInput;
- }
- export interface OpenDateSpan {
- range: OpenDateRange;
- allDay: boolean;
- [otherProp: string]: any;
- }
- export interface DateSpan extends OpenDateSpan {
- range: DateRange;
- }
- export interface DateSpanApi {
- start: Date;
- end: Date;
- startStr: string;
- endStr: string;
- allDay: boolean;
- }
- export interface DatePointApi {
- date: Date;
- dateStr: string;
- allDay: boolean;
- }
- export function parseDateSpan(raw: DateSpanInput, dateEnv: DateEnv, defaultDuration?: Duration): DateSpan | null;
- export function parseOpenDateSpan(raw: OpenDateSpanInput, dateEnv: DateEnv): OpenDateSpan | null;
- export function isDateSpansEqual(span0: DateSpan, span1: DateSpan): boolean;
- export function buildDateSpanApi(span: DateSpan, dateEnv: DateEnv): DateSpanApi;
- export function buildDatePointApi(span: DateSpan, dateEnv: DateEnv): DatePointApi;
- export function fabricateEventRange(dateSpan: DateSpan, eventUiBases: EventUiHash, calendar: Calendar): EventRenderRange;
-}
-
-declare module '@fullcalendar/core/datelib/marker' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- export type DateMarker = Date;
- export const DAY_IDS: string[];
- export function addWeeks(m: DateMarker, n: number): Date;
- export function addDays(m: DateMarker, n: number): Date;
- export function addMs(m: DateMarker, n: number): Date;
- export function diffWeeks(m0: any, m1: any): number;
- export function diffDays(m0: any, m1: any): number;
- export function diffHours(m0: any, m1: any): number;
- export function diffMinutes(m0: any, m1: any): number;
- export function diffSeconds(m0: any, m1: any): number;
- export function diffDayAndTime(m0: DateMarker, m1: DateMarker): Duration;
- export function diffWholeWeeks(m0: DateMarker, m1: DateMarker): number;
- export function diffWholeDays(m0: DateMarker, m1: DateMarker): number;
- export function startOfDay(m: DateMarker): DateMarker;
- export function startOfHour(m: DateMarker): Date;
- export function startOfMinute(m: DateMarker): Date;
- export function startOfSecond(m: DateMarker): Date;
- export function weekOfYear(marker: any, dow: any, doy: any): number;
- export function dateToLocalArray(date: any): any[];
- export function arrayToLocalDate(a: any): Date;
- export function dateToUtcArray(date: any): any[];
- export function arrayToUtcDate(a: any): Date;
- export function isValidDate(m: DateMarker): boolean;
- export function timeAsMs(m: DateMarker): number;
-}
-
-declare module '@fullcalendar/core/datelib/duration' {
- export type DurationInput = DurationObjectInput | string | number;
- export interface DurationObjectInput {
- years?: number;
- year?: number;
- months?: number;
- month?: number;
- weeks?: number;
- week?: number;
- days?: number;
- day?: number;
- hours?: number;
- hour?: number;
- minutes?: number;
- minute?: number;
- seconds?: number;
- second?: number;
- milliseconds?: number;
- millisecond?: number;
- ms?: number;
- }
- export interface Duration {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- }
- export function createDuration(input: DurationInput, unit?: string): Duration | null;
- export function getWeeksFromInput(obj: DurationObjectInput): number;
- export function durationsEqual(d0: Duration, d1: Duration): boolean;
- export function isSingleDay(dur: Duration): boolean;
- export function addDurations(d0: Duration, d1: Duration): {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- };
- export function subtractDurations(d1: Duration, d0: Duration): Duration;
- export function multiplyDuration(d: Duration, n: number): {
- years: number;
- months: number;
- days: number;
- milliseconds: number;
- };
- export function asRoughYears(dur: Duration): number;
- export function asRoughMonths(dur: Duration): number;
- export function asRoughDays(dur: Duration): number;
- export function asRoughHours(dur: Duration): number;
- export function asRoughMinutes(dur: Duration): number;
- export function asRoughSeconds(dur: Duration): number;
- export function asRoughMs(dur: Duration): number;
- export function wholeDivideDurations(numerator: Duration, denominator: Duration): number;
- export function greatestDurationDenominator(dur: Duration, dontReturnWeeks?: boolean): {
- unit: string;
- value: number;
- };
-}
-
-declare module '@fullcalendar/core/datelib/env' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarSystem } from '@fullcalendar/core/datelib/calendar-system';
- import { Locale } from '@fullcalendar/core/datelib/locale';
- import { NamedTimeZoneImpl, NamedTimeZoneImplClass } from '@fullcalendar/core/datelib/timezone';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateFormatter } from '@fullcalendar/core/datelib/formatting';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- export interface DateEnvSettings {
- timeZone: string;
- namedTimeZoneImpl?: NamedTimeZoneImplClass;
- calendarSystem: string;
- locale: Locale;
- weekNumberCalculation?: any;
- firstDay?: any;
- weekLabel?: string;
- cmdFormatter?: CmdFormatterFunc;
- }
- export type DateInput = Date | string | number | number[];
- export interface DateMarkerMeta {
- marker: DateMarker;
- isTimeUnspecified: boolean;
- forcedTzo: number | null;
- }
- export class DateEnv {
- timeZone: string;
- namedTimeZoneImpl: NamedTimeZoneImpl;
- canComputeOffset: boolean;
- calendarSystem: CalendarSystem;
- locale: Locale;
- weekDow: number;
- weekDoy: number;
- weekNumberFunc: any;
- weekLabel: string;
- cmdFormatter?: CmdFormatterFunc;
- constructor(settings: DateEnvSettings);
- createMarker(input: DateInput): DateMarker;
- createNowMarker(): DateMarker;
- createMarkerMeta(input: DateInput): DateMarkerMeta;
- parse(s: string): {
- marker: Date;
- isTimeUnspecified: boolean;
- forcedTzo: any;
- };
- getYear(marker: DateMarker): number;
- getMonth(marker: DateMarker): number;
- add(marker: DateMarker, dur: Duration): DateMarker;
- subtract(marker: DateMarker, dur: Duration): DateMarker;
- addYears(marker: DateMarker, n: number): Date;
- addMonths(marker: DateMarker, n: number): Date;
- diffWholeYears(m0: DateMarker, m1: DateMarker): number;
- diffWholeMonths(m0: DateMarker, m1: DateMarker): number;
- greatestWholeUnit(m0: DateMarker, m1: DateMarker): {
- unit: string;
- value: number;
- };
- countDurationsBetween(m0: DateMarker, m1: DateMarker, d: Duration): number;
- startOf(m: DateMarker, unit: string): Date;
- startOfYear(m: DateMarker): DateMarker;
- startOfMonth(m: DateMarker): DateMarker;
- startOfWeek(m: DateMarker): DateMarker;
- computeWeekNumber(marker: DateMarker): number;
- format(marker: DateMarker, formatter: DateFormatter, dateOptions?: {
- forcedTzo?: number;
- }): any;
- formatRange(start: DateMarker, end: DateMarker, formatter: DateFormatter, dateOptions?: {
- forcedStartTzo?: number;
- forcedEndTzo?: number;
- isEndExclusive?: boolean;
- }): any;
- formatIso(marker: DateMarker, extraOptions?: any): string;
- timestampToMarker(ms: number): Date;
- offsetForMarker(m: DateMarker): number;
- toDate(m: DateMarker, forcedTzo?: number): Date;
- }
-}
-
-declare module '@fullcalendar/core/datelib/formatting' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarSystem } from '@fullcalendar/core/datelib/calendar-system';
- import { Locale } from '@fullcalendar/core/datelib/locale';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- import { FuncFormatterFunc } from '@fullcalendar/core/datelib/formatting-func';
- export interface ZonedMarker {
- marker: DateMarker;
- timeZoneOffset: number;
- }
- export interface ExpandedZonedMarker extends ZonedMarker {
- array: number[];
- year: number;
- month: number;
- day: number;
- hour: number;
- minute: number;
- second: number;
- millisecond: number;
- }
- export interface VerboseFormattingArg {
- date: ExpandedZonedMarker;
- start: ExpandedZonedMarker;
- end?: ExpandedZonedMarker;
- timeZone: string;
- localeCodes: string[];
- separator: string;
- }
- export interface DateFormattingContext {
- timeZone: string;
- locale: Locale;
- calendarSystem: CalendarSystem;
- computeWeekNumber: (d: DateMarker) => number;
- weekLabel: string;
- cmdFormatter?: CmdFormatterFunc;
- }
- export interface DateFormatter {
- format(date: ZonedMarker, context: DateFormattingContext): any;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): any;
- }
- export type FormatterInput = object | string | FuncFormatterFunc;
- export function createFormatter(input: FormatterInput, defaultSeparator?: string): DateFormatter;
- export function buildIsoString(marker: DateMarker, timeZoneOffset?: number, stripZeroTime?: boolean): string;
- export function formatIsoTimeString(marker: DateMarker): string;
- export function formatTimeZoneOffset(minutes: number, doIso?: boolean): string;
- export function createVerboseFormattingArg(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext, separator?: string): VerboseFormattingArg;
-}
-
-declare module '@fullcalendar/core/datelib/timezone' {
- export abstract class NamedTimeZoneImpl {
- timeZoneName: string;
- constructor(timeZoneName: string);
- abstract offsetForArray(a: number[]): number;
- abstract timestampToArray(ms: number): number[];
- }
- export type NamedTimeZoneImplClass = {
- new (timeZoneName: string): NamedTimeZoneImpl;
- };
-}
-
-declare module '@fullcalendar/core/datelib/parsing' {
- export function parse(str: any): {
- marker: Date;
- isTimeUnspecified: boolean;
- timeZoneOffset: any;
- };
-}
-
-declare module '@fullcalendar/core/structs/event-source' {
- import { EventInput } from '@fullcalendar/core/structs/event';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventSourceFunc } from '@fullcalendar/core/event-sources/func-event-source';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { ConstraintInput, AllowFunc } from '@fullcalendar/core/validation';
- export type EventSourceError = {
- message: string;
- response?: any;
- [otherProp: string]: any;
- };
- export type EventInputTransformer = (eventInput: EventInput) => EventInput | null;
- export type EventSourceSuccessResponseHandler = (rawData: any, response: any) => EventInput[] | void;
- export type EventSourceErrorResponseHandler = (error: EventSourceError) => void;
- export interface ExtendedEventSourceInput {
- id?: string | number;
- allDayDefault?: boolean;
- eventDataTransform?: EventInputTransformer;
- events?: EventInput[] | EventSourceFunc;
- url?: string;
- method?: string;
- extraParams?: object | (() => object);
- startParam?: string;
- endParam?: string;
- timeZoneParam?: string;
- success?: EventSourceSuccessResponseHandler;
- failure?: EventSourceErrorResponseHandler;
- editable?: boolean;
- startEditable?: boolean;
- durationEditable?: boolean;
- constraint?: ConstraintInput;
- overlap?: boolean;
- allow?: AllowFunc;
- className?: string[] | string;
- classNames?: string[] | string;
- backgroundColor?: string;
- borderColor?: string;
- textColor?: string;
- color?: string;
- [otherProp: string]: any;
- }
- export type EventSourceInput = ExtendedEventSourceInput | // object in extended form
- EventSourceFunc | // just a function
- string;
- export interface EventSource {
- _raw: any;
- sourceId: string;
- sourceDefId: number;
- meta: any;
- publicId: string;
- isFetching: boolean;
- latestFetchId: string;
- fetchRange: DateRange | null;
- allDayDefault: boolean | null;
- eventDataTransform: EventInputTransformer;
- ui: EventUi;
- success: EventSourceSuccessResponseHandler | null;
- failure: EventSourceErrorResponseHandler | null;
- extendedProps: any;
- }
- export type EventSourceHash = {
- [sourceId: string]: EventSource;
- };
- export type EventSourceFetcher = (arg: {
- eventSource: EventSource;
- calendar: Calendar;
- range: DateRange;
- }, success: (res: {
- rawEvents: EventInput[];
- xhr?: XMLHttpRequest;
- }) => void, failure: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
- export interface EventSourceDef {
- ignoreRange?: boolean;
- parseMeta: (raw: EventSourceInput) => object | null;
- fetch: EventSourceFetcher;
- }
- export function doesSourceNeedRange(eventSource: EventSource, calendar: Calendar): boolean;
- export function parseEventSource(raw: EventSourceInput, calendar: Calendar): EventSource | null;
-}
-
-declare module '@fullcalendar/core/interactions/interaction' {
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- export abstract class Interaction {
- component: DateComponent<any>;
- constructor(settings: InteractionSettings);
- destroy(): void;
- }
- export type InteractionClass = {
- new (settings: InteractionSettings): Interaction;
- };
- export interface InteractionSettingsInput {
- el: HTMLElement;
- useEventCenter?: boolean;
- }
- export interface InteractionSettings {
- component: DateComponent<any>;
- el: HTMLElement;
- useEventCenter: boolean;
- }
- export type InteractionSettingsStore = {
- [componenUid: string]: InteractionSettings;
- };
- export function parseInteractionSettings(component: DateComponent<any>, input: InteractionSettingsInput): InteractionSettings;
- export function interactionSettingsToStore(settings: InteractionSettings): {
- [x: string]: InteractionSettings;
- };
- export let interactionSettingsStore: InteractionSettingsStore;
-}
-
-declare module '@fullcalendar/core/interactions/pointer' {
- export interface PointerDragEvent {
- origEvent: UIEvent;
- isTouch: boolean;
- subjectEl: EventTarget;
- pageX: number;
- pageY: number;
- deltaX: number;
- deltaY: number;
- }
-}
-
-declare module '@fullcalendar/core/interactions/hit' {
- import DateComponent from '@fullcalendar/core/component/DateComponent';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { Rect } from '@fullcalendar/core/util/geom';
- export interface Hit {
- component: DateComponent<any>;
- dateSpan: DateSpan;
- dayEl: HTMLElement;
- rect: Rect;
- layer: number;
- }
-}
-
-declare module '@fullcalendar/core/interactions/date-selecting' {
- import { Hit } from '@fullcalendar/core/interactions/hit';
- export type dateSelectionJoinTransformer = (hit0: Hit, hit1: Hit) => any;
-}
-
-declare module '@fullcalendar/core/interactions/event-dragging' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { Hit } from '@fullcalendar/core/interactions/hit';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import { EventUi } from '@fullcalendar/core/component/event-ui';
- import { View } from '@fullcalendar/core';
- export type eventDragMutationMassager = (mutation: EventMutation, hit0: Hit, hit1: Hit) => void;
- export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => any;
- export type eventIsDraggableTransformer = (val: boolean, eventDef: EventDef, eventUi: EventUi, view: View) => boolean;
-}
-
-declare module '@fullcalendar/core/interactions/event-resizing' {
- import { Hit } from '@fullcalendar/core/interactions/hit';
- export type EventResizeJoinTransforms = (hit0: Hit, hit1: Hit) => false | object;
-}
-
-declare module '@fullcalendar/core/interactions/ElementDragging' {
- import EmitterMixin from '@fullcalendar/core/common/EmitterMixin';
- export { ElementDragging as default, ElementDragging };
- abstract class ElementDragging {
- emitter: EmitterMixin;
- constructor(el: HTMLElement);
- destroy(): void;
- abstract setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- setMirrorNeedsRevert(bool: boolean): void;
- setAutoScrollEnabled(bool: boolean): void;
- }
- export type ElementDraggingClass = {
- new (el: HTMLElement): ElementDragging;
- };
-}
-
-declare module '@fullcalendar/core/formatting-api' {
- import { DateInput } from '@fullcalendar/core/datelib/env';
- export function formatDate(dateInput: DateInput, settings?: {}): any;
- export function formatRange(startInput: DateInput, endInput: DateInput, settings: any): any;
-}
-
-declare module '@fullcalendar/core/options' {
- import { PluginDef } from '@fullcalendar/core/plugin-system';
- export const config: any;
- export const globalDefaults: {
- defaultRangeSeparator: string;
- titleRangeSeparator: string;
- defaultTimedEventDuration: string;
- defaultAllDayEventDuration: {
- day: number;
- };
- forceEventDuration: boolean;
- nextDayThreshold: string;
- columnHeader: boolean;
- defaultView: string;
- aspectRatio: number;
- header: {
- left: string;
- center: string;
- right: string;
- };
- weekends: boolean;
- weekNumbers: boolean;
- weekNumberCalculation: string;
- editable: boolean;
- scrollTime: string;
- minTime: string;
- maxTime: string;
- showNonCurrentDates: boolean;
- lazyFetching: boolean;
- startParam: string;
- endParam: string;
- timeZoneParam: string;
- timeZone: string;
- locales: any[];
- locale: string;
- timeGridEventMinHeight: number;
- themeSystem: string;
- dragRevertDuration: number;
- dragScroll: boolean;
- allDayMaintainDuration: boolean;
- unselectAuto: boolean;
- dropAccept: string;
- eventOrder: string;
- eventLimit: boolean;
- eventLimitClick: string;
- dayPopoverFormat: {
- month: string;
- day: string;
- year: string;
- };
- handleWindowResize: boolean;
- windowResizeDelay: number;
- longPressDelay: number;
- eventDragMinDistance: number;
- };
- export const rtlDefaults: {
- header: {
- left: string;
- center: string;
- right: string;
- };
- buttonIcons: {
- prev: string;
- next: string;
- prevYear: string;
- nextYear: string;
- };
- };
- export function mergeOptions(optionObjs: any): any;
- export function refinePluginDefs(pluginInputs: any[]): PluginDef[];
-}
-
-declare module '@fullcalendar/core/structs/recurring-event' {
- import { EventInput, EventDef } from '@fullcalendar/core/structs/event';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface ParsedRecurring {
- typeData: any;
- allDayGuess: boolean | null;
- duration: Duration | null;
- }
- export interface RecurringType {
- parse: (rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null;
- expand: (typeData: any, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[];
- }
- export function parseRecurring(eventInput: EventInput, allDayDefault: boolean | null, dateEnv: DateEnv, recurringTypes: RecurringType[], leftovers: any): {
- allDay: any;
- duration: Duration;
- typeData: any;
- typeId: number;
- };
- export function expandRecurringRanges(eventDef: EventDef, duration: Duration, framingRange: DateRange, dateEnv: DateEnv, recurringTypes: RecurringType[]): DateMarker[];
-}
-
-declare module '@fullcalendar/core/structs/drag-meta' {
- import { Duration, DurationInput } from '@fullcalendar/core/datelib/duration';
- import { EventNonDateInput } from '@fullcalendar/core/structs/event';
- export interface DragMetaInput extends EventNonDateInput {
- startTime?: DurationInput;
- duration?: DurationInput;
- create?: boolean;
- sourceId?: string;
- }
- export interface DragMeta {
- startTime: Duration | null;
- duration: Duration | null;
- create: boolean;
- sourceId: string;
- leftoverProps: object;
- }
- export function parseDragMeta(raw: DragMetaInput): DragMeta;
-}
-
-declare module '@fullcalendar/core/plugin-system' {
- import { reducerFunc } from '@fullcalendar/core/reducers/types';
- import { eventDefParserFunc } from '@fullcalendar/core/structs/event';
- import { eventDefMutationApplier } from '@fullcalendar/core/structs/event-mutation';
- import Calendar, { DatePointTransform, DateSpanTransform, CalendarInteractionClass, OptionChangeHandlerMap } from '@fullcalendar/core/Calendar';
- import { ViewConfigInputHash } from '@fullcalendar/core/structs/view-config';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import { ViewProps } from '@fullcalendar/core/View';
- import { CalendarComponentProps } from '@fullcalendar/core/CalendarComponent';
- import { isPropsValidTester } from '@fullcalendar/core/validation';
- import { eventDragMutationMassager, eventIsDraggableTransformer, EventDropTransformers } from '@fullcalendar/core/interactions/event-dragging';
- import { dateSelectionJoinTransformer } from '@fullcalendar/core/interactions/date-selecting';
- import { EventResizeJoinTransforms } from '@fullcalendar/core/interactions/event-resizing';
- import { ExternalDefTransform } from '@fullcalendar/core/interactions/external-element-dragging';
- import { InteractionClass } from '@fullcalendar/core/interactions/interaction';
- import { ThemeClass } from '@fullcalendar/core/theme/Theme';
- import { EventSourceDef } from '@fullcalendar/core/structs/event-source';
- import { CmdFormatterFunc } from '@fullcalendar/core/datelib/formatting-cmd';
- import { RecurringType } from '@fullcalendar/core/structs/recurring-event';
- import { NamedTimeZoneImplClass } from '@fullcalendar/core/datelib/timezone';
- import { ElementDraggingClass } from '@fullcalendar/core/interactions/ElementDragging';
- export interface PluginDefInput {
- deps?: PluginDef[];
- reducers?: reducerFunc[];
- eventDefParsers?: eventDefParserFunc[];
- isDraggableTransformers?: eventIsDraggableTransformer[];
- eventDragMutationMassagers?: eventDragMutationMassager[];
- eventDefMutationAppliers?: eventDefMutationApplier[];
- dateSelectionTransformers?: dateSelectionJoinTransformer[];
- datePointTransforms?: DatePointTransform[];
- dateSpanTransforms?: DateSpanTransform[];
- views?: ViewConfigInputHash;
- viewPropsTransformers?: ViewPropsTransformerClass[];
- isPropsValid?: isPropsValidTester;
- externalDefTransforms?: ExternalDefTransform[];
- eventResizeJoinTransforms?: EventResizeJoinTransforms[];
- viewContainerModifiers?: ViewContainerModifier[];
- eventDropTransformers?: EventDropTransformers[];
- componentInteractions?: InteractionClass[];
- calendarInteractions?: CalendarInteractionClass[];
- themeClasses?: {
- [themeSystemName: string]: ThemeClass;
- };
- eventSourceDefs?: EventSourceDef[];
- cmdFormatter?: CmdFormatterFunc;
- recurringTypes?: RecurringType[];
- namedTimeZonedImpl?: NamedTimeZoneImplClass;
- defaultView?: string;
- elementDraggingImpl?: ElementDraggingClass;
- optionChangeHandlers?: OptionChangeHandlerMap;
- }
- export interface PluginHooks {
- reducers: reducerFunc[];
- eventDefParsers: eventDefParserFunc[];
- isDraggableTransformers: eventIsDraggableTransformer[];
- eventDragMutationMassagers: eventDragMutationMassager[];
- eventDefMutationAppliers: eventDefMutationApplier[];
- dateSelectionTransformers: dateSelectionJoinTransformer[];
- datePointTransforms: DatePointTransform[];
- dateSpanTransforms: DateSpanTransform[];
- views: ViewConfigInputHash;
- viewPropsTransformers: ViewPropsTransformerClass[];
- isPropsValid: isPropsValidTester | null;
- externalDefTransforms: ExternalDefTransform[];
- eventResizeJoinTransforms: EventResizeJoinTransforms[];
- viewContainerModifiers: ViewContainerModifier[];
- eventDropTransformers: EventDropTransformers[];
- componentInteractions: InteractionClass[];
- calendarInteractions: CalendarInteractionClass[];
- themeClasses: {
- [themeSystemName: string]: ThemeClass;
- };
- eventSourceDefs: EventSourceDef[];
- cmdFormatter?: CmdFormatterFunc;
- recurringTypes: RecurringType[];
- namedTimeZonedImpl?: NamedTimeZoneImplClass;
- defaultView: string;
- elementDraggingImpl?: ElementDraggingClass;
- optionChangeHandlers: OptionChangeHandlerMap;
- }
- export interface PluginDef extends PluginHooks {
- id: string;
- deps: PluginDef[];
- }
- export type ViewPropsTransformerClass = new () => ViewPropsTransformer;
- export interface ViewPropsTransformer {
- transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, allOptions: any): any;
- }
- export type ViewContainerModifier = (contentEl: HTMLElement, calendar: Calendar) => void;
- export function createPlugin(input: PluginDefInput): PluginDef;
- export class PluginSystem {
- hooks: PluginHooks;
- addedHash: {
- [pluginId: string]: true;
- };
- constructor();
- add(plugin: PluginDef): void;
- }
-}
-
-declare module '@fullcalendar/core/reducers/types' {
- import { EventInput, EventInstanceHash } from '@fullcalendar/core/structs/event';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { EventSource, EventSourceHash, EventSourceError } from '@fullcalendar/core/structs/event-source';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { DateEnv } from '@fullcalendar/core/datelib/env';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface CalendarState {
- eventSources: EventSourceHash;
- eventSourceLoadingLevel: number;
- loadingLevel: number;
- viewType: string;
- currentDate: DateMarker;
- dateProfile: DateProfile | null;
- eventStore: EventStore;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export type reducerFunc = (state: CalendarState, action: Action, calendar: Calendar) => CalendarState;
- export type Action = {
- type: 'INIT';
- } | // wont it create another rerender?
- {
- type: 'PREV';
- } | {
- type: 'NEXT';
- } | {
- type: 'SET_DATE';
- dateMarker: DateMarker;
- } | {
- type: 'SET_VIEW_TYPE';
- viewType: string;
- dateMarker?: DateMarker;
- } | {
- type: 'SELECT_DATES';
- selection: DateSpan;
- } | {
- type: 'UNSELECT_DATES';
- } | {
- type: 'SELECT_EVENT';
- eventInstanceId: string;
- } | {
- type: 'UNSELECT_EVENT';
- } | {
- type: 'SET_EVENT_DRAG';
- state: EventInteractionState;
- } | {
- type: 'UNSET_EVENT_DRAG';
- } | {
- type: 'SET_EVENT_RESIZE';
- state: EventInteractionState;
- } | {
- type: 'UNSET_EVENT_RESIZE';
- } | {
- type: 'ADD_EVENT_SOURCES';
- sources: EventSource[];
- } | {
- type: 'REMOVE_EVENT_SOURCE';
- sourceId: string;
- } | {
- type: 'REMOVE_ALL_EVENT_SOURCES';
- } | {
- type: 'FETCH_EVENT_SOURCES';
- sourceIds?: string[];
- } | // if no sourceIds, fetch all
- {
- type: 'CHANGE_TIMEZONE';
- oldDateEnv: DateEnv;
- } | {
- type: 'RECEIVE_EVENTS';
- sourceId: string;
- fetchId: string;
- fetchRange: DateRange | null;
- rawEvents: EventInput[];
- } | {
- type: 'RECEIVE_EVENT_ERROR';
- sourceId: string;
- fetchId: string;
- fetchRange: DateRange | null;
- error: EventSourceError;
- } | // need all these?
- {
- type: 'ADD_EVENTS';
- eventStore: EventStore;
- } | {
- type: 'MERGE_EVENTS';
- eventStore: EventStore;
- } | {
- type: 'MUTATE_EVENTS';
- instanceId: string;
- mutation: EventMutation;
- fromApi?: boolean;
- } | {
- type: 'REMOVE_EVENT_DEF';
- defId: string;
- } | {
- type: 'REMOVE_EVENT_INSTANCES';
- instances: EventInstanceHash;
- } | {
- type: 'REMOVE_ALL_EVENTS';
- } | {
- type: 'RESET_EVENTS';
- };
-}
-
-declare module '@fullcalendar/core/CalendarComponent' {
- import Component, { ComponentContext } from '@fullcalendar/core/component/Component';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- import View from '@fullcalendar/core/View';
- import Toolbar from '@fullcalendar/core/Toolbar';
- import DateProfileGenerator, { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { BusinessHoursInput } from '@fullcalendar/core/structs/business-hours';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { CalendarState } from '@fullcalendar/core/reducers/types';
- export interface CalendarComponentProps extends CalendarState {
- viewSpec: ViewSpec;
- dateProfileGenerator: DateProfileGenerator;
- eventUiBases: EventUiHash;
- }
- export { CalendarComponent as default, CalendarComponent };
- class CalendarComponent extends Component<CalendarComponentProps> {
- view: View;
- header: Toolbar;
- footer: Toolbar;
- computeTitle: (dateProfile: any, viewOptions: any) => string;
- parseBusinessHours: (input: BusinessHoursInput) => EventStore;
- el: HTMLElement;
- contentEl: HTMLElement;
- elClassNames: string[];
- savedScroll: any;
- isHeightAuto: boolean;
- viewHeight: number;
- constructor(el: HTMLElement);
- render(props: CalendarComponentProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- removeElClassNames(): void;
- updateElClassNames(context: ComponentContext): void;
- _renderToolbars(viewSpec: ViewSpec, dateProfile: DateProfile, currentDate: DateMarker, title: string): void;
- _unrenderToolbars(): void;
- renderView(props: CalendarComponentProps, title: string): void;
- updateSize(isResize?: boolean): void;
- computeHeightVars(): void;
- queryToolbarsHeight(): number;
- freezeHeight(): void;
- thawHeight(): void;
- }
-}
-
-declare module '@fullcalendar/core/common/DayHeader' {
- import Component, { ComponentContext } from '@fullcalendar/core/component/Component';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- export interface DayTableHeaderProps {
- dates: DateMarker[];
- dateProfile: DateProfile;
- datesRepDistinctDays: boolean;
- renderIntroHtml?: () => string;
- }
- export { DayHeader as default, DayHeader };
- class DayHeader extends Component<DayTableHeaderProps> {
- parentEl: HTMLElement;
- el: HTMLElement;
- thead: HTMLElement;
- constructor(parentEl: HTMLElement);
- render(props: DayTableHeaderProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- }
-}
-
-declare module '@fullcalendar/core/common/table-utils' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export function computeFallbackHeaderFormat(datesRepDistinctDays: boolean, dayCnt: number): {
- weekday: string;
- month?: undefined;
- day?: undefined;
- omitCommas?: undefined;
- } | {
- weekday: string;
- month: string;
- day: string;
- omitCommas: boolean;
- };
- export function renderDateCell(dateMarker: DateMarker, dateProfile: DateProfile, datesRepDistinctDays: any, colCnt: any, colHeadFormat: any, context: ComponentContext, colspan?: any, otherAttrs?: any): string;
-}
-
-declare module '@fullcalendar/core/common/DaySeries' {
- import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- export interface DaySeriesSeg {
- firstIndex: number;
- lastIndex: number;
- isStart: boolean;
- isEnd: boolean;
- }
- export { DaySeries as default, DaySeries };
- class DaySeries {
- cnt: number;
- dates: DateMarker[];
- indices: number[];
- constructor(range: DateRange, dateProfileGenerator: DateProfileGenerator);
- sliceRange(range: DateRange): DaySeriesSeg | null;
- }
-}
-
-declare module '@fullcalendar/core/interactions/event-interaction-state' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- export interface EventInteractionState {
- affectedEvents: EventStore;
- mutatedEvents: EventStore;
- isEvent: boolean;
- origSeg: Seg | null;
- }
-}
-
-declare module '@fullcalendar/core/component/event-rendering' {
- import { EventDef, EventTuple, EventDefHash } from '@fullcalendar/core/structs/event';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- import { EventUi, EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { ComponentContext } from '@fullcalendar/core/component/Component';
- export interface EventRenderRange extends EventTuple {
- ui: EventUi;
- range: DateRange;
- isStart: boolean;
- isEnd: boolean;
- }
- export function sliceEventStore(eventStore: EventStore, eventUiBases: EventUiHash, framingRange: DateRange, nextDayThreshold?: Duration): {
- bg: EventRenderRange[];
- fg: EventRenderRange[];
- };
- export function hasBgRendering(def: EventDef): boolean;
- export function filterSegsViaEls(context: ComponentContext, segs: Seg[], isMirror: boolean): Seg[];
- export function getElSeg(el: HTMLElement): Seg | null;
- export function compileEventUis(eventDefs: EventDefHash, eventUiBases: EventUiHash): {
- [key: string]: EventUi;
- };
- export function compileEventUi(eventDef: EventDef, eventUiBases: EventUiHash): EventUi;
- export function triggerRenderedSegs(context: ComponentContext, segs: Seg[], isMirrors: boolean): void;
- export function triggerWillRemoveSegs(context: ComponentContext, segs: Seg[], isMirrors: boolean): void;
- export function computeEventDraggable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): boolean;
- export function computeEventStartResizable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): any;
- export function computeEventEndResizable(context: ComponentContext, eventDef: EventDef, eventUi: EventUi): boolean;
-}
-
-declare module '@fullcalendar/core/common/DayTable' {
- import DaySeries from '@fullcalendar/core/common/DaySeries';
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import { Seg } from '@fullcalendar/core/component/DateComponent';
- export interface DayTableSeg extends Seg {
- row: number;
- firstCol: number;
- lastCol: number;
- }
- export interface DayTableCell {
- date: DateMarker;
- htmlAttrs?: string;
- }
- export { DayTable as default, DayTable };
- class DayTable {
- rowCnt: number;
- colCnt: number;
- cells: DayTableCell[][];
- headerDates: DateMarker[];
- constructor(daySeries: DaySeries, breakOnWeeks: boolean);
- sliceRange(range: DateRange): DayTableSeg[];
- }
-}
-
-declare module '@fullcalendar/core/common/slicing-utils' {
- import { DateRange } from '@fullcalendar/core/datelib/date-range';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- import { DateProfile } from '@fullcalendar/core/DateProfileGenerator';
- import DateComponent, { Seg, EventSegUiInteractionState } from '@fullcalendar/core/component/DateComponent';
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- import Calendar from '@fullcalendar/core/Calendar';
- export interface SliceableProps {
- dateSelection: DateSpan;
- businessHours: EventStore;
- eventStore: EventStore;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- eventSelection: string;
- eventUiBases: EventUiHash;
- }
- export interface SlicedProps<SegType extends Seg> {
- dateSelectionSegs: SegType[];
- businessHourSegs: SegType[];
- fgEventSegs: SegType[];
- bgEventSegs: SegType[];
- eventDrag: EventSegUiInteractionState | null;
- eventResize: EventSegUiInteractionState | null;
- eventSelection: string;
- }
- export { Slicer as default, Slicer };
- abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []> {
- abstract sliceRange(dateRange: DateRange, ...extraArgs: ExtraArgs): SegType[];
- sliceProps(props: SliceableProps, dateProfile: DateProfile, nextDayThreshold: Duration | null, calendar: Calendar, component: DateComponent<any>, // TODO: kill
- ...extraArgs: ExtraArgs): SlicedProps<SegType>;
- sliceNowDate(// does not memoize
- date: DateMarker, component: DateComponent<any>, // TODO: kill
- ...extraArgs: ExtraArgs): SegType[];
- }
-}
-
-declare module '@fullcalendar/core/structs/event-mutation' {
- import { Duration } from '@fullcalendar/core/datelib/duration';
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import { EventDef } from '@fullcalendar/core/structs/event';
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventUiHash } from '@fullcalendar/core/component/event-ui';
- export interface EventMutation {
- datesDelta?: Duration;
- startDelta?: Duration;
- endDelta?: Duration;
- standardProps?: any;
- extendedProps?: any;
- }
- export function applyMutationToEventStore(eventStore: EventStore, eventConfigBase: EventUiHash, mutation: EventMutation, calendar: Calendar): EventStore;
- export type eventDefMutationApplier = (eventDef: EventDef, mutation: EventMutation, calendar: Calendar) => void;
-}
-
-declare module '@fullcalendar/core/validation' {
- import { EventStore } from '@fullcalendar/core/structs/event-store';
- import Calendar from '@fullcalendar/core/Calendar';
- import { DateSpan, DateSpanApi } from '@fullcalendar/core/structs/date-span';
- import EventApi from '@fullcalendar/core/api/EventApi';
- import { EventInput } from '@fullcalendar/core/structs/event';
- import { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
- import { SplittableProps } from '@fullcalendar/core/component/event-splitting';
- export type ConstraintInput = 'businessHours' | string | EventInput | EventInput[];
- export type Constraint = 'businessHours' | string | EventStore | false;
- export type OverlapFunc = ((stillEvent: EventApi, movingEvent: EventApi | null) => boolean);
- export type AllowFunc = (span: DateSpanApi, movingEvent: EventApi | null) => boolean;
- export type isPropsValidTester = (props: SplittableProps, calendar: Calendar) => boolean;
- export function isInteractionValid(interaction: EventInteractionState, calendar: Calendar): boolean;
- export function isDateSelectionValid(dateSelection: DateSpan, calendar: Calendar): boolean;
- export function isPropsValid(state: SplittableProps, calendar: Calendar, dateSpanMeta?: {}, filterConfig?: any): boolean;
- export function normalizeConstraint(input: ConstraintInput, calendar: Calendar): Constraint | null;
-}
-
-declare module '@fullcalendar/core/api/EventApi' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventDef, EventInstance } from '@fullcalendar/core/structs/event';
- import { EventMutation } from '@fullcalendar/core/structs/event-mutation';
- import { DateInput } from '@fullcalendar/core/datelib/env';
- import { DurationInput } from '@fullcalendar/core/datelib/duration';
- import { FormatterInput } from '@fullcalendar/core/datelib/formatting';
- import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
- export { EventApi as default, EventApi };
- class EventApi {
- _calendar: Calendar;
- _def: EventDef;
- _instance: EventInstance | null;
- constructor(calendar: Calendar, def: EventDef, instance?: EventInstance);
- setProp(name: string, val: string): void;
- setExtendedProp(name: string, val: any): void;
- setStart(startInput: DateInput, options?: {
- granularity?: string;
- maintainDuration?: boolean;
- }): void;
- setEnd(endInput: DateInput | null, options?: {
- granularity?: string;
- }): void;
- setDates(startInput: DateInput, endInput: DateInput | null, options?: {
- allDay?: boolean;
- granularity?: string;
- }): void;
- moveStart(deltaInput: DurationInput): void;
- moveEnd(deltaInput: DurationInput): void;
- moveDates(deltaInput: DurationInput): void;
- setAllDay(allDay: boolean, options?: {
- maintainDuration?: boolean;
- }): void;
- formatRange(formatInput: FormatterInput): any;
- mutate(mutation: EventMutation): void;
- remove(): void;
- readonly source: EventSourceApi | null;
- readonly start: Date | null;
- readonly end: Date | null;
- readonly id: string;
- readonly groupId: string;
- readonly allDay: boolean;
- readonly title: string;
- readonly url: string;
- readonly rendering: string;
- readonly startEditable: boolean;
- readonly durationEditable: boolean;
- readonly constraint: any;
- readonly overlap: any;
- readonly allow: any;
- readonly backgroundColor: string;
- readonly borderColor: string;
- readonly textColor: string;
- readonly classNames: string[];
- readonly extendedProps: any;
- }
-}
-
-declare module '@fullcalendar/core/util/requestJson' {
- export default function requestJson(method: string, url: string, params: object, successCallback: any, failureCallback: any): void;
-}
-
-declare module '@fullcalendar/core/datelib/locale' {
- export type LocaleCodeArg = string | string[];
- export type LocaleSingularArg = LocaleCodeArg | RawLocale;
- export interface Locale {
- codeArg: LocaleCodeArg;
- codes: string[];
- week: {
- dow: number;
- doy: number;
- };
- simpleNumberFormat: Intl.NumberFormat;
- options: any;
- }
- export interface RawLocale {
- code: string;
- [otherProp: string]: any;
- }
- export type RawLocaleMap = {
- [code: string]: RawLocale;
- };
- export interface RawLocaleInfo {
- map: RawLocaleMap;
- defaultCode: string;
- }
- export function parseRawLocales(explicitRawLocales: RawLocale[]): RawLocaleInfo;
- export function buildLocale(inputSingular: LocaleSingularArg, available: RawLocaleMap): Locale;
-}
-
-declare module '@fullcalendar/core/OptionsManager' {
- export { OptionsManager as default, OptionsManager };
- class OptionsManager {
- dirDefaults: any;
- localeDefaults: any;
- overrides: any;
- dynamicOverrides: any;
- computed: any;
- constructor(overrides: any);
- mutate(updates: any, removals: string[], isDynamic?: boolean): void;
- compute(): void;
- }
-}
-
-declare module '@fullcalendar/core/api/EventSourceApi' {
- import Calendar from '@fullcalendar/core/Calendar';
- import { EventSource } from '@fullcalendar/core/structs/event-source';
- export { EventSourceApi as default, EventSourceApi };
- class EventSourceApi {
- calendar: Calendar;
- internalEventSource: EventSource;
- constructor(calendar: Calendar, internalEventSource: EventSource);
- remove(): void;
- refetch(): void;
- readonly id: string;
- readonly url: string;
- }
-}
-
-declare module '@fullcalendar/core/structs/view-config' {
- import View from '@fullcalendar/core/View';
- import { ViewSpec } from '@fullcalendar/core/structs/view-spec';
- export type ViewClass = new (viewSpec: ViewSpec, parentEl: HTMLElement) => View;
- export interface ViewConfigObjectInput {
- type?: string;
- class?: ViewClass;
- [optionName: string]: any;
- }
- export type ViewConfigInput = ViewClass | ViewConfigObjectInput;
- export type ViewConfigInputHash = {
- [viewType: string]: ViewConfigInput;
- };
- export interface ViewConfig {
- superType: string;
- class: ViewClass | null;
- options: any;
- }
- export type ViewConfigHash = {
- [viewType: string]: ViewConfig;
- };
- export function parseViewConfigs(inputs: ViewConfigInputHash): ViewConfigHash;
-}
-
-declare module '@fullcalendar/core/datelib/calendar-system' {
- import { DateMarker } from '@fullcalendar/core/datelib/marker';
- export interface CalendarSystem {
- getMarkerYear(d: DateMarker): number;
- getMarkerMonth(d: DateMarker): number;
- getMarkerDay(d: DateMarker): number;
- arrayToMarker(arr: number[]): DateMarker;
- markerToArray(d: DateMarker): number[];
- }
- export function registerCalendarSystem(name: any, theClass: any): void;
- export function createCalendarSystem(name: any): any;
-}
-
-declare module '@fullcalendar/core/datelib/formatting-cmd' {
- import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from '@fullcalendar/core/datelib/formatting';
- export type CmdFormatterFunc = (cmd: string, arg: VerboseFormattingArg) => string;
- export class CmdFormatter implements DateFormatter {
- cmdStr: string;
- separator: string;
- constructor(cmdStr: string, separator?: string);
- format(date: ZonedMarker, context: DateFormattingContext): string;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
- }
-}
-
-declare module '@fullcalendar/core/datelib/formatting-func' {
- import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from '@fullcalendar/core/datelib/formatting';
- export type FuncFormatterFunc = (arg: VerboseFormattingArg) => string;
- export class FuncFormatter implements DateFormatter {
- func: FuncFormatterFunc;
- constructor(func: FuncFormatterFunc);
- format(date: ZonedMarker, context: DateFormattingContext): string;
- formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
- }
-}
-
-declare module '@fullcalendar/core/event-sources/func-event-source' {
- import { EventSourceError } from '@fullcalendar/core/structs/event-source';
- import { EventInput } from '@fullcalendar/core/structs/event';
- export type EventSourceFunc = (arg: {
- start: Date;
- end: Date;
- timeZone: string;
- }, successCallback: (events: EventInput[]) => void, failureCallback: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
- const _default: import("@fullcalendar/core/plugin-system").PluginDef;
- export default _default;
-}
-
-declare module '@fullcalendar/core/interactions/external-element-dragging' {
- import { DateSpan } from '@fullcalendar/core/structs/date-span';
- import { DragMeta } from '@fullcalendar/core/structs/drag-meta';
- export type ExternalDefTransform = (dateSpan: DateSpan, dragMeta: DragMeta) => any;
-}
-
-declare module '@fullcalendar/core/Toolbar' {
- import Component from '@fullcalendar/core/component/Component';
- export interface ToolbarRenderProps {
- layout: any;
- title: string;
- activeButton: string;
- isTodayEnabled: boolean;
- isPrevEnabled: boolean;
- isNextEnabled: boolean;
- }
- export { Toolbar as default, Toolbar };
- class Toolbar extends Component<ToolbarRenderProps> {
- el: HTMLElement;
- viewsWithButtons: any;
- constructor(extraClassName: any);
- destroy(): void;
- render(props: ToolbarRenderProps): void;
- renderLayout(layout: any): void;
- unrenderLayout(): void;
- renderSection(position: any, buttonStr: any): HTMLElement;
- updateToday(isTodayEnabled: any): void;
- updatePrev(isPrevEnabled: any): void;
- updateNext(isNextEnabled: any): void;
- updateTitle(text: any): void;
- updateActiveButton(buttonName?: any): void;
- toggleButtonEnabled(buttonName: any, bool: any): void;
- }
-}
-
diff --git a/library/fullcalendar/packages/core/main.esm.js b/library/fullcalendar/packages/core/main.esm.js
deleted file mode 100644
index a9cb1b462..000000000
--- a/library/fullcalendar/packages/core/main.esm.js
+++ /dev/null
@@ -1,8582 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-// Creating
-// ----------------------------------------------------------------------------------------------------------------
-var elementPropHash = {
- className: true,
- colSpan: true,
- rowSpan: true
-};
-var containerTagHash = {
- '<tr': 'tbody',
- '<td': 'tr'
-};
-function createElement(tagName, attrs, content) {
- var el = document.createElement(tagName);
- if (attrs) {
- for (var attrName in attrs) {
- if (attrName === 'style') {
- applyStyle(el, attrs[attrName]);
- }
- else if (elementPropHash[attrName]) {
- el[attrName] = attrs[attrName];
- }
- else {
- el.setAttribute(attrName, attrs[attrName]);
- }
- }
- }
- if (typeof content === 'string') {
- el.innerHTML = content; // shortcut. no need to process HTML in any way
- }
- else if (content != null) {
- appendToElement(el, content);
- }
- return el;
-}
-function htmlToElement(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.firstChild;
-}
-function htmlToElements(html) {
- return Array.prototype.slice.call(htmlToNodeList(html));
-}
-function htmlToNodeList(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.childNodes;
-}
-// assumes html already trimmed and tag names are lowercase
-function computeContainerTag(html) {
- return containerTagHash[html.substr(0, 3) // faster than using regex
- ] || 'div';
-}
-function appendToElement(el, content) {
- var childNodes = normalizeContent(content);
- for (var i = 0; i < childNodes.length; i++) {
- el.appendChild(childNodes[i]);
- }
-}
-function prependToElement(parent, content) {
- var newEls = normalizeContent(content);
- var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
- for (var i = 0; i < newEls.length; i++) {
- parent.insertBefore(newEls[i], afterEl);
- }
-}
-function insertAfterElement(refEl, content) {
- var newEls = normalizeContent(content);
- var afterEl = refEl.nextSibling || null;
- for (var i = 0; i < newEls.length; i++) {
- refEl.parentNode.insertBefore(newEls[i], afterEl);
- }
-}
-function normalizeContent(content) {
- var els;
- if (typeof content === 'string') {
- els = htmlToElements(content);
- }
- else if (content instanceof Node) {
- els = [content];
- }
- else { // Node[] or NodeList
- els = Array.prototype.slice.call(content);
- }
- return els;
-}
-function removeElement(el) {
- if (el.parentNode) {
- el.parentNode.removeChild(el);
- }
-}
-// Querying
-// ----------------------------------------------------------------------------------------------------------------
-// from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
-var matchesMethod = Element.prototype.matches ||
- Element.prototype.matchesSelector ||
- Element.prototype.msMatchesSelector;
-var closestMethod = Element.prototype.closest || function (selector) {
- // polyfill
- var el = this;
- if (!document.documentElement.contains(el)) {
- return null;
- }
- do {
- if (elementMatches(el, selector)) {
- return el;
- }
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
-};
-function elementClosest(el, selector) {
- return closestMethod.call(el, selector);
-}
-function elementMatches(el, selector) {
- return matchesMethod.call(el, selector);
-}
-// accepts multiple subject els
-// returns a real array. good for methods like forEach
-function findElements(container, selector) {
- var containers = container instanceof HTMLElement ? [container] : container;
- var allMatches = [];
- for (var i = 0; i < containers.length; i++) {
- var matches = containers[i].querySelectorAll(selector);
- for (var j = 0; j < matches.length; j++) {
- allMatches.push(matches[j]);
- }
- }
- return allMatches;
-}
-// accepts multiple subject els
-// only queries direct child elements
-function findChildren(parent, selector) {
- var parents = parent instanceof HTMLElement ? [parent] : parent;
- var allMatches = [];
- for (var i = 0; i < parents.length; i++) {
- var childNodes = parents[i].children; // only ever elements
- for (var j = 0; j < childNodes.length; j++) {
- var childNode = childNodes[j];
- if (!selector || elementMatches(childNode, selector)) {
- allMatches.push(childNode);
- }
- }
- }
- return allMatches;
-}
-// Attributes
-// ----------------------------------------------------------------------------------------------------------------
-function forceClassName(el, className, bool) {
- if (bool) {
- el.classList.add(className);
- }
- else {
- el.classList.remove(className);
- }
-}
-// Style
-// ----------------------------------------------------------------------------------------------------------------
-var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
-function applyStyle(el, props) {
- for (var propName in props) {
- applyStyleProp(el, propName, props[propName]);
- }
-}
-function applyStyleProp(el, name, val) {
- if (val == null) {
- el.style[name] = '';
- }
- else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
- el.style[name] = val + 'px';
- }
- else {
- el.style[name] = val;
- }
-}
-
-function pointInsideRect(point, rect) {
- return point.left >= rect.left &&
- point.left < rect.right &&
- point.top >= rect.top &&
- point.top < rect.bottom;
-}
-// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
-function intersectRects(rect1, rect2) {
- var res = {
- left: Math.max(rect1.left, rect2.left),
- right: Math.min(rect1.right, rect2.right),
- top: Math.max(rect1.top, rect2.top),
- bottom: Math.min(rect1.bottom, rect2.bottom)
- };
- if (res.left < res.right && res.top < res.bottom) {
- return res;
- }
- return false;
-}
-function translateRect(rect, deltaX, deltaY) {
- return {
- left: rect.left + deltaX,
- right: rect.right + deltaX,
- top: rect.top + deltaY,
- bottom: rect.bottom + deltaY
- };
-}
-// Returns a new point that will have been moved to reside within the given rectangle
-function constrainPoint(point, rect) {
- return {
- left: Math.min(Math.max(point.left, rect.left), rect.right),
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
- };
-}
-// Returns a point that is the center of the given rectangle
-function getRectCenter(rect) {
- return {
- left: (rect.left + rect.right) / 2,
- top: (rect.top + rect.bottom) / 2
- };
-}
-// Subtracts point2's coordinates from point1's coordinates, returning a delta
-function diffPoints(point1, point2) {
- return {
- left: point1.left - point2.left,
- top: point1.top - point2.top
- };
-}
-
-// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
-var isRtlScrollbarOnLeft = null;
-function getIsRtlScrollbarOnLeft() {
- if (isRtlScrollbarOnLeft === null) {
- isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
- }
- return isRtlScrollbarOnLeft;
-}
-function computeIsRtlScrollbarOnLeft() {
- var outerEl = createElement('div', {
- style: {
- position: 'absolute',
- top: -1000,
- left: 0,
- border: 0,
- padding: 0,
- overflow: 'scroll',
- direction: 'rtl'
- }
- }, '<div></div>');
- document.body.appendChild(outerEl);
- var innerEl = outerEl.firstChild;
- var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
- removeElement(outerEl);
- return res;
-}
-// The scrollbar width computations in computeEdges are sometimes flawed when it comes to
-// retina displays, rounding, and IE11. Massage them into a usable value.
-function sanitizeScrollbarWidth(width) {
- width = Math.max(0, width); // no negatives
- width = Math.round(width);
- return width;
-}
-
-function computeEdges(el, getPadding) {
- if (getPadding === void 0) { getPadding = false; }
- var computedStyle = window.getComputedStyle(el);
- var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
- var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
- var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
- var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
- // must use offset(Width|Height) because compatible with client(Width|Height)
- var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
- var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
- var res = {
- borderLeft: borderLeft,
- borderRight: borderRight,
- borderTop: borderTop,
- borderBottom: borderBottom,
- scrollbarBottom: scrollbarBottom,
- scrollbarLeft: 0,
- scrollbarRight: 0
- };
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
- res.scrollbarLeft = scrollbarLeftRight;
- }
- else {
- res.scrollbarRight = scrollbarLeftRight;
- }
- if (getPadding) {
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
- }
- return res;
-}
-function computeInnerRect(el, goWithinPadding) {
- if (goWithinPadding === void 0) { goWithinPadding = false; }
- var outerRect = computeRect(el);
- var edges = computeEdges(el, goWithinPadding);
- var res = {
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
- top: outerRect.top + edges.borderTop,
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
- };
- if (goWithinPadding) {
- res.left += edges.paddingLeft;
- res.right -= edges.paddingRight;
- res.top += edges.paddingTop;
- res.bottom -= edges.paddingBottom;
- }
- return res;
-}
-function computeRect(el) {
- var rect = el.getBoundingClientRect();
- return {
- left: rect.left + window.pageXOffset,
- top: rect.top + window.pageYOffset,
- right: rect.right + window.pageXOffset,
- bottom: rect.bottom + window.pageYOffset
- };
-}
-function computeViewportRect() {
- return {
- left: window.pageXOffset,
- right: window.pageXOffset + document.documentElement.clientWidth,
- top: window.pageYOffset,
- bottom: window.pageYOffset + document.documentElement.clientHeight
- };
-}
-function computeHeightAndMargins(el) {
- return el.getBoundingClientRect().height + computeVMargins(el);
-}
-function computeVMargins(el) {
- var computed = window.getComputedStyle(el);
- return parseInt(computed.marginTop, 10) +
- parseInt(computed.marginBottom, 10);
-}
-// does not return window
-function getClippingParents(el) {
- var parents = [];
- while (el instanceof HTMLElement) { // will stop when gets to document or null
- var computedStyle = window.getComputedStyle(el);
- if (computedStyle.position === 'fixed') {
- break;
- }
- if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
- parents.push(el);
- }
- el = el.parentNode;
- }
- return parents;
-}
-function computeClippingRect(el) {
- return getClippingParents(el)
- .map(function (el) {
- return computeInnerRect(el);
- })
- .concat(computeViewportRect())
- .reduce(function (rect0, rect1) {
- return intersectRects(rect0, rect1) || rect1; // should always intersect
- });
-}
-
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
- ev.preventDefault();
-}
-// Event Delegation
-// ----------------------------------------------------------------------------------------------------------------
-function listenBySelector(container, eventType, selector, handler) {
- function realHandler(ev) {
- var matchedChild = elementClosest(ev.target, selector);
- if (matchedChild) {
- handler.call(matchedChild, ev, matchedChild);
- }
- }
- container.addEventListener(eventType, realHandler);
- return function () {
- container.removeEventListener(eventType, realHandler);
- };
-}
-function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
- var currentMatchedChild;
- return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
- if (matchedChild !== currentMatchedChild) {
- currentMatchedChild = matchedChild;
- onMouseEnter(ev, matchedChild);
- var realOnMouseLeave_1 = function (ev) {
- currentMatchedChild = null;
- onMouseLeave(ev, matchedChild);
- matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
- };
- // listen to the next mouseleave, and then unattach
- matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
- }
- });
-}
-// Animation
-// ----------------------------------------------------------------------------------------------------------------
-var transitionEventNames = [
- 'webkitTransitionEnd',
- 'otransitionend',
- 'oTransitionEnd',
- 'msTransitionEnd',
- 'transitionend'
-];
-// triggered only when the next single subsequent transition finishes
-function whenTransitionDone(el, callback) {
- var realCallback = function (ev) {
- callback(ev);
- transitionEventNames.forEach(function (eventName) {
- el.removeEventListener(eventName, realCallback);
- });
- };
- transitionEventNames.forEach(function (eventName) {
- el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
- });
-}
-
-var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-// Adding
-function addWeeks(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n * 7;
- return arrayToUtcDate(a);
-}
-function addDays(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n;
- return arrayToUtcDate(a);
-}
-function addMs(m, n) {
- var a = dateToUtcArray(m);
- a[6] += n;
- return arrayToUtcDate(a);
-}
-// Diffing (all return floats)
-function diffWeeks(m0, m1) {
- return diffDays(m0, m1) / 7;
-}
-function diffDays(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
-}
-function diffHours(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
-}
-function diffMinutes(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
-}
-function diffSeconds(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / 1000;
-}
-function diffDayAndTime(m0, m1) {
- var m0day = startOfDay(m0);
- var m1day = startOfDay(m1);
- return {
- years: 0,
- months: 0,
- days: Math.round(diffDays(m0day, m1day)),
- milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
- };
-}
-// Diffing Whole Units
-function diffWholeWeeks(m0, m1) {
- var d = diffWholeDays(m0, m1);
- if (d !== null && d % 7 === 0) {
- return d / 7;
- }
- return null;
-}
-function diffWholeDays(m0, m1) {
- if (timeAsMs(m0) === timeAsMs(m1)) {
- return Math.round(diffDays(m0, m1));
- }
- return null;
-}
-// Start-Of
-function startOfDay(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate()
- ]);
-}
-function startOfHour(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours()
- ]);
-}
-function startOfMinute(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes()
- ]);
-}
-function startOfSecond(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes(),
- m.getUTCSeconds()
- ]);
-}
-// Week Computation
-function weekOfYear(marker, dow, doy) {
- var y = marker.getUTCFullYear();
- var w = weekOfGivenYear(marker, y, dow, doy);
- if (w < 1) {
- return weekOfGivenYear(marker, y - 1, dow, doy);
- }
- var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
- if (nextW >= 1) {
- return Math.min(w, nextW);
- }
- return w;
-}
-function weekOfGivenYear(marker, year, dow, doy) {
- var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
- var dayStart = startOfDay(marker);
- var days = Math.round(diffDays(firstWeekStart, dayStart));
- return Math.floor(days / 7) + 1; // zero-indexed
-}
-// start-of-first-week - start-of-year
-function firstWeekOffset(year, dow, doy) {
- // first-week day -- which january is always in the first week (4 for iso, 1 for other)
- var fwd = 7 + dow - doy;
- // first-week day local weekday -- which local weekday is fwd
- var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
-}
-// Array Conversion
-function dateToLocalArray(date) {
- return [
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- date.getHours(),
- date.getMinutes(),
- date.getSeconds(),
- date.getMilliseconds()
- ];
-}
-function arrayToLocalDate(a) {
- return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
- a[3] || 0, a[4] || 0, a[5] || 0);
-}
-function dateToUtcArray(date) {
- return [
- date.getUTCFullYear(),
- date.getUTCMonth(),
- date.getUTCDate(),
- date.getUTCHours(),
- date.getUTCMinutes(),
- date.getUTCSeconds(),
- date.getUTCMilliseconds()
- ];
-}
-function arrayToUtcDate(a) {
- // according to web standards (and Safari), a month index is required.
- // massage if only given a year.
- if (a.length === 1) {
- a = a.concat([0]);
- }
- return new Date(Date.UTC.apply(Date, a));
-}
-// Other Utils
-function isValidDate(m) {
- return !isNaN(m.valueOf());
-}
-function timeAsMs(m) {
- return m.getUTCHours() * 1000 * 60 * 60 +
- m.getUTCMinutes() * 1000 * 60 +
- m.getUTCSeconds() * 1000 +
- m.getUTCMilliseconds();
-}
-
-var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
-var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
-// Parsing and Creation
-function createDuration(input, unit) {
- var _a;
- if (typeof input === 'string') {
- return parseString(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- return normalizeObject(input);
- }
- else if (typeof input === 'number') {
- return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
- }
- else {
- return null;
- }
-}
-function parseString(s) {
- var m = PARSE_RE.exec(s);
- if (m) {
- var sign = m[1] ? -1 : 1;
- return {
- years: 0,
- months: 0,
- days: sign * (m[2] ? parseInt(m[2], 10) : 0),
- milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
- (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
- (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
- (m[6] ? parseInt(m[6], 10) : 0) // ms
- )
- };
- }
- return null;
-}
-function normalizeObject(obj) {
- return {
- years: obj.years || obj.year || 0,
- months: obj.months || obj.month || 0,
- days: (obj.days || obj.day || 0) +
- getWeeksFromInput(obj) * 7,
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
- (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
- (obj.seconds || obj.second || 0) * 1000 + // seconds
- (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
- };
-}
-function getWeeksFromInput(obj) {
- return obj.weeks || obj.week || 0;
-}
-// Equality
-function durationsEqual(d0, d1) {
- return d0.years === d1.years &&
- d0.months === d1.months &&
- d0.days === d1.days &&
- d0.milliseconds === d1.milliseconds;
-}
-function isSingleDay(dur) {
- return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
-}
-// Simple Math
-function addDurations(d0, d1) {
- return {
- years: d0.years + d1.years,
- months: d0.months + d1.months,
- days: d0.days + d1.days,
- milliseconds: d0.milliseconds + d1.milliseconds
- };
-}
-function subtractDurations(d1, d0) {
- return {
- years: d1.years - d0.years,
- months: d1.months - d0.months,
- days: d1.days - d0.days,
- milliseconds: d1.milliseconds - d0.milliseconds
- };
-}
-function multiplyDuration(d, n) {
- return {
- years: d.years * n,
- months: d.months * n,
- days: d.days * n,
- milliseconds: d.milliseconds * n
- };
-}
-// Conversions
-// "Rough" because they are based on average-case Gregorian months/years
-function asRoughYears(dur) {
- return asRoughDays(dur) / 365;
-}
-function asRoughMonths(dur) {
- return asRoughDays(dur) / 30;
-}
-function asRoughDays(dur) {
- return asRoughMs(dur) / 864e5;
-}
-function asRoughMinutes(dur) {
- return asRoughMs(dur) / (1000 * 60);
-}
-function asRoughSeconds(dur) {
- return asRoughMs(dur) / 1000;
-}
-function asRoughMs(dur) {
- return dur.years * (365 * 864e5) +
- dur.months * (30 * 864e5) +
- dur.days * 864e5 +
- dur.milliseconds;
-}
-// Advanced Math
-function wholeDivideDurations(numerator, denominator) {
- var res = null;
- for (var i = 0; i < INTERNAL_UNITS.length; i++) {
- var unit = INTERNAL_UNITS[i];
- if (denominator[unit]) {
- var localRes = numerator[unit] / denominator[unit];
- if (!isInt(localRes) || (res !== null && res !== localRes)) {
- return null;
- }
- res = localRes;
- }
- else if (numerator[unit]) {
- // needs to divide by something but can't!
- return null;
- }
- }
- return res;
-}
-function greatestDurationDenominator(dur, dontReturnWeeks) {
- var ms = dur.milliseconds;
- if (ms) {
- if (ms % 1000 !== 0) {
- return { unit: 'millisecond', value: ms };
- }
- if (ms % (1000 * 60) !== 0) {
- return { unit: 'second', value: ms / 1000 };
- }
- if (ms % (1000 * 60 * 60) !== 0) {
- return { unit: 'minute', value: ms / (1000 * 60) };
- }
- if (ms) {
- return { unit: 'hour', value: ms / (1000 * 60 * 60) };
- }
- }
- if (dur.days) {
- if (!dontReturnWeeks && dur.days % 7 === 0) {
- return { unit: 'week', value: dur.days / 7 };
- }
- return { unit: 'day', value: dur.days };
- }
- if (dur.months) {
- return { unit: 'month', value: dur.months };
- }
- if (dur.years) {
- return { unit: 'year', value: dur.years };
- }
- return { unit: 'millisecond', value: 0 };
-}
-
-/* FullCalendar-specific DOM Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
-// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
-function compensateScroll(rowEl, scrollbarWidths) {
- if (scrollbarWidths.left) {
- applyStyle(rowEl, {
- borderLeftWidth: 1,
- marginLeft: scrollbarWidths.left - 1
- });
- }
- if (scrollbarWidths.right) {
- applyStyle(rowEl, {
- borderRightWidth: 1,
- marginRight: scrollbarWidths.right - 1
- });
- }
-}
-// Undoes compensateScroll and restores all borders/margins
-function uncompensateScroll(rowEl) {
- applyStyle(rowEl, {
- marginLeft: '',
- marginRight: '',
- borderLeftWidth: '',
- borderRightWidth: ''
- });
-}
-// Make the mouse cursor express that an event is not allowed in the current area
-function disableCursor() {
- document.body.classList.add('fc-not-allowed');
-}
-// Returns the mouse cursor to its original look
-function enableCursor() {
- document.body.classList.remove('fc-not-allowed');
-}
-// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
-// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
-// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
-// reduces the available height.
-function distributeHeight(els, availableHeight, shouldRedistribute) {
- // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
- // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
- var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
- var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
- var flexEls = []; // elements that are allowed to expand. array of DOM nodes
- var flexOffsets = []; // amount of vertical space it takes up
- var flexHeights = []; // actual css height
- var usedHeight = 0;
- undistributeHeight(els); // give all elements their natural height
- // find elements that are below the recommended height (expandable).
- // important to query for heights in a single first pass (to avoid reflow oscillation).
- els.forEach(function (el, i) {
- var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
- var naturalHeight = el.getBoundingClientRect().height;
- var naturalOffset = naturalHeight + computeVMargins(el);
- if (naturalOffset < minOffset) {
- flexEls.push(el);
- flexOffsets.push(naturalOffset);
- flexHeights.push(naturalHeight);
- }
- else {
- // this element stretches past recommended height (non-expandable). mark the space as occupied.
- usedHeight += naturalOffset;
- }
- });
- // readjust the recommended height to only consider the height available to non-maxed-out rows.
- if (shouldRedistribute) {
- availableHeight -= usedHeight;
- minOffset1 = Math.floor(availableHeight / flexEls.length);
- minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
- }
- // assign heights to all expandable elements
- flexEls.forEach(function (el, i) {
- var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
- var naturalOffset = flexOffsets[i];
- var naturalHeight = flexHeights[i];
- var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
- if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
- el.style.height = newHeight + 'px';
- }
- });
-}
-// Undoes distrubuteHeight, restoring all els to their natural height
-function undistributeHeight(els) {
- els.forEach(function (el) {
- el.style.height = '';
- });
-}
-// Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
-// cells to be that width.
-// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
-function matchCellWidths(els) {
- var maxInnerWidth = 0;
- els.forEach(function (el) {
- var innerEl = el.firstChild; // hopefully an element
- if (innerEl instanceof HTMLElement) {
- var innerWidth_1 = innerEl.getBoundingClientRect().width;
- if (innerWidth_1 > maxInnerWidth) {
- maxInnerWidth = innerWidth_1;
- }
- }
- });
- maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
- els.forEach(function (el) {
- el.style.width = maxInnerWidth + 'px';
- });
- return maxInnerWidth;
-}
-// Given one element that resides inside another,
-// Subtracts the height of the inner element from the outer element.
-function subtractInnerElHeight(outerEl, innerEl) {
- // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
- var reflowStyleProps = {
- position: 'relative',
- left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
- };
- applyStyle(outerEl, reflowStyleProps);
- applyStyle(innerEl, reflowStyleProps);
- var diff = // grab the dimensions
- outerEl.getBoundingClientRect().height -
- innerEl.getBoundingClientRect().height;
- // undo hack
- var resetStyleProps = { position: '', left: '' };
- applyStyle(outerEl, resetStyleProps);
- applyStyle(innerEl, resetStyleProps);
- return diff;
-}
-/* Selection
-----------------------------------------------------------------------------------------------------------------------*/
-function preventSelection(el) {
- el.classList.add('fc-unselectable');
- el.addEventListener('selectstart', preventDefault);
-}
-function allowSelection(el) {
- el.classList.remove('fc-unselectable');
- el.removeEventListener('selectstart', preventDefault);
-}
-/* Context Menu
-----------------------------------------------------------------------------------------------------------------------*/
-function preventContextMenu(el) {
- el.addEventListener('contextmenu', preventDefault);
-}
-function allowContextMenu(el) {
- el.removeEventListener('contextmenu', preventDefault);
-}
-/* Object Ordering by Field
-----------------------------------------------------------------------------------------------------------------------*/
-function parseFieldSpecs(input) {
- var specs = [];
- var tokens = [];
- var i;
- var token;
- if (typeof input === 'string') {
- tokens = input.split(/\s*,\s*/);
- }
- else if (typeof input === 'function') {
- tokens = [input];
- }
- else if (Array.isArray(input)) {
- tokens = input;
- }
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- if (typeof token === 'string') {
- specs.push(token.charAt(0) === '-' ?
- { field: token.substring(1), order: -1 } :
- { field: token, order: 1 });
- }
- else if (typeof token === 'function') {
- specs.push({ func: token });
- }
- }
- return specs;
-}
-function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
- var i;
- var cmp;
- for (i = 0; i < fieldSpecs.length; i++) {
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
- if (cmp) {
- return cmp;
- }
- }
- return 0;
-}
-function compareByFieldSpec(obj0, obj1, fieldSpec) {
- if (fieldSpec.func) {
- return fieldSpec.func(obj0, obj1);
- }
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
- * (fieldSpec.order || 1);
-}
-function flexibleCompare(a, b) {
- if (!a && !b) {
- return 0;
- }
- if (b == null) {
- return -1;
- }
- if (a == null) {
- return 1;
- }
- if (typeof a === 'string' || typeof b === 'string') {
- return String(a).localeCompare(String(b));
- }
- return a - b;
-}
-/* String Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function capitaliseFirstLetter(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
-}
-function padStart(val, len) {
- var s = String(val);
- return '000'.substr(0, len - s.length) + s;
-}
-/* Number Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function compareNumbers(a, b) {
- return a - b;
-}
-function isInt(n) {
- return n % 1 === 0;
-}
-/* Weird Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function applyAll(functions, thisObj, args) {
- if (typeof functions === 'function') { // supplied a single function
- functions = [functions];
- }
- if (functions) {
- var i = void 0;
- var ret = void 0;
- for (i = 0; i < functions.length; i++) {
- ret = functions[i].apply(thisObj, args) || ret;
- }
- return ret;
- }
-}
-function firstDefined() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- for (var i = 0; i < args.length; i++) {
- if (args[i] !== undefined) {
- return args[i];
- }
- }
-}
-// Returns a function, that, as long as it continues to be invoked, will not
-// be triggered. The function will be called after it stops being called for
-// N milliseconds. If `immediate` is passed, trigger the function on the
-// leading edge, instead of the trailing.
-// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
-function debounce(func, wait) {
- var timeout;
- var args;
- var context;
- var timestamp;
- var result;
- var later = function () {
- var last = new Date().valueOf() - timestamp;
- if (last < wait) {
- timeout = setTimeout(later, wait - last);
- }
- else {
- timeout = null;
- result = func.apply(context, args);
- context = args = null;
- }
- };
- return function () {
- context = this;
- args = arguments;
- timestamp = new Date().valueOf();
- if (!timeout) {
- timeout = setTimeout(later, wait);
- }
- return result;
- };
-}
-// Number and Boolean are only types that defaults or not computed for
-// TODO: write more comments
-function refineProps(rawProps, processors, defaults, leftoverProps) {
- if (defaults === void 0) { defaults = {}; }
- var refined = {};
- for (var key in processors) {
- var processor = processors[key];
- if (rawProps[key] !== undefined) {
- // found
- if (processor === Function) {
- refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
- }
- else if (processor) { // a refining function?
- refined[key] = processor(rawProps[key]);
- }
- else {
- refined[key] = rawProps[key];
- }
- }
- else if (defaults[key] !== undefined) {
- // there's an explicit default
- refined[key] = defaults[key];
- }
- else {
- // must compute a default
- if (processor === String) {
- refined[key] = ''; // empty string is default for String
- }
- else if (!processor || processor === Number || processor === Boolean || processor === Function) {
- refined[key] = null; // assign null for other non-custom processor funcs
- }
- else {
- refined[key] = processor(null); // run the custom processor func
- }
- }
- }
- if (leftoverProps) {
- for (var key in rawProps) {
- if (processors[key] === undefined) {
- leftoverProps[key] = rawProps[key];
- }
- }
- }
- return refined;
-}
-/* Date stuff that doesn't belong in datelib core
-----------------------------------------------------------------------------------------------------------------------*/
-// given a timed range, computes an all-day range that has the same exact duration,
-// but whose start time is aligned with the start of the day.
-function computeAlignedDayRange(timedRange) {
- var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
- var start = startOfDay(timedRange.start);
- var end = addDays(start, dayCnt);
- return { start: start, end: end };
-}
-// given a timed range, computes an all-day range based on how for the end date bleeds into the next day
-// TODO: give nextDayThreshold a default arg
-function computeVisibleDayRange(timedRange, nextDayThreshold) {
- if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
- var startDay = null;
- var endDay = null;
- if (timedRange.end) {
- endDay = startOfDay(timedRange.end);
- var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
- // If the end time is actually inclusively part of the next day and is equal to or
- // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
- // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
- endDay = addDays(endDay, 1);
- }
- }
- if (timedRange.start) {
- startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
- // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
- if (endDay && endDay <= startDay) {
- endDay = addDays(startDay, 1);
- }
- }
- return { start: startDay, end: endDay };
-}
-// spans from one day into another?
-function isMultiDayRange(range) {
- var visibleRange = computeVisibleDayRange(range);
- return diffDays(visibleRange.start, visibleRange.end) > 1;
-}
-function diffDates(date0, date1, dateEnv, largeUnit) {
- if (largeUnit === 'year') {
- return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
- }
- else if (largeUnit === 'month') {
- return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
- }
- else {
- return diffDayAndTime(date0, date1); // returns a duration
- }
-}
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
- for (var i = 0; i < recurringTypes.length; i++) {
- var localLeftovers = {};
- var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
- if (parsed) {
- var allDay = localLeftovers.allDay;
- delete localLeftovers.allDay; // remove from leftovers
- if (allDay == null) {
- allDay = allDayDefault;
- if (allDay == null) {
- allDay = parsed.allDayGuess;
- if (allDay == null) {
- allDay = false;
- }
- }
- }
- __assign(leftovers, localLeftovers);
- return {
- allDay: allDay,
- duration: parsed.duration,
- typeData: parsed.typeData,
- typeId: i
- };
- }
- }
- return null;
-}
-/*
-Event MUST have a recurringDef
-*/
-function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
- var typeDef = recurringTypes[eventDef.recurringDef.typeId];
- var markers = typeDef.expand(eventDef.recurringDef.typeData, {
- start: dateEnv.subtract(framingRange.start, duration),
- end: framingRange.end
- }, dateEnv);
- // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
- if (eventDef.allDay) {
- markers = markers.map(startOfDay);
- }
- return markers;
-}
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-// Merges an array of objects into a single object.
-// The second argument allows for an array of property names who's object values will be merged together.
-function mergeProps(propObjs, complexProps) {
- var dest = {};
- var i;
- var name;
- var complexObjs;
- var j;
- var val;
- var props;
- if (complexProps) {
- for (i = 0; i < complexProps.length; i++) {
- name = complexProps[i];
- complexObjs = [];
- // collect the trailing object values, stopping when a non-object is discovered
- for (j = propObjs.length - 1; j >= 0; j--) {
- val = propObjs[j][name];
- if (typeof val === 'object' && val) { // non-null object
- complexObjs.unshift(val);
- }
- else if (val !== undefined) {
- dest[name] = val; // if there were no objects, this value will be used
- break;
- }
- }
- // if the trailing values were objects, use the merged value
- if (complexObjs.length) {
- dest[name] = mergeProps(complexObjs);
- }
- }
- }
- // copy values into the destination, going from last to first
- for (i = propObjs.length - 1; i >= 0; i--) {
- props = propObjs[i];
- for (name in props) {
- if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
- dest[name] = props[name];
- }
- }
- }
- return dest;
-}
-function filterHash(hash, func) {
- var filtered = {};
- for (var key in hash) {
- if (func(hash[key], key)) {
- filtered[key] = hash[key];
- }
- }
- return filtered;
-}
-function mapHash(hash, func) {
- var newHash = {};
- for (var key in hash) {
- newHash[key] = func(hash[key], key);
- }
- return newHash;
-}
-function arrayToHash(a) {
- var hash = {};
- for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
- var item = a_1[_i];
- hash[item] = true;
- }
- return hash;
-}
-function hashValuesToArray(obj) {
- var a = [];
- for (var key in obj) {
- a.push(obj[key]);
- }
- return a;
-}
-function isPropsEqual(obj0, obj1) {
- for (var key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- return false;
- }
- }
- }
- for (var key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- return false;
- }
- }
- }
- return true;
-}
-
-function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
- var eventStore = createEmptyEventStore();
- for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
- var rawEvent = rawEvents_1[_i];
- var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
- if (tuple) {
- eventTupleToStore(tuple, eventStore);
- }
- }
- return eventStore;
-}
-function eventTupleToStore(tuple, eventStore) {
- if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
- eventStore.defs[tuple.def.defId] = tuple.def;
- if (tuple.instance) {
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
- }
- return eventStore;
-}
-function expandRecurring(eventStore, framingRange, calendar) {
- var dateEnv = calendar.dateEnv;
- var defs = eventStore.defs, instances = eventStore.instances;
- // remove existing recurring instances
- instances = filterHash(instances, function (instance) {
- return !defs[instance.defId].recurringDef;
- });
- for (var defId in defs) {
- var def = defs[defId];
- if (def.recurringDef) {
- var duration = def.recurringDef.duration;
- if (!duration) {
- duration = def.allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration;
- }
- var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
- for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
- var start = starts_1[_i];
- var instance = createEventInstance(defId, {
- start: start,
- end: dateEnv.add(start, duration)
- });
- instances[instance.instanceId] = instance;
- }
- }
- }
- return { defs: defs, instances: instances };
-}
-// retrieves events that have the same groupId as the instance specified by `instanceId`
-// or they are the same as the instance.
-// why might instanceId not be in the store? an event from another calendar?
-function getRelevantEvents(eventStore, instanceId) {
- var instance = eventStore.instances[instanceId];
- if (instance) {
- var def_1 = eventStore.defs[instance.defId];
- // get events/instances with same group
- var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
- return isEventDefsGrouped(def_1, lookDef);
- });
- // add the original
- // TODO: wish we could use eventTupleToStore or something like it
- newStore.defs[def_1.defId] = def_1;
- newStore.instances[instance.instanceId] = instance;
- return newStore;
- }
- return createEmptyEventStore();
-}
-function isEventDefsGrouped(def0, def1) {
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
-}
-function transformRawEvents(rawEvents, eventSource, calendar) {
- var calEachTransform = calendar.opt('eventDataTransform');
- var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
- if (sourceEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
- }
- if (calEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
- }
- return rawEvents;
-}
-function transformEachRawEvent(rawEvents, func) {
- var refinedEvents;
- if (!func) {
- refinedEvents = rawEvents;
- }
- else {
- refinedEvents = [];
- for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
- var rawEvent = rawEvents_2[_i];
- var refinedEvent = func(rawEvent);
- if (refinedEvent) {
- refinedEvents.push(refinedEvent);
- }
- else if (refinedEvent == null) {
- refinedEvents.push(rawEvent);
- } // if a different falsy value, do nothing
- }
- }
- return refinedEvents;
-}
-function createEmptyEventStore() {
- return { defs: {}, instances: {} };
-}
-function mergeEventStores(store0, store1) {
- return {
- defs: __assign({}, store0.defs, store1.defs),
- instances: __assign({}, store0.instances, store1.instances)
- };
-}
-function filterEventStoreDefs(eventStore, filterFunc) {
- var defs = filterHash(eventStore.defs, filterFunc);
- var instances = filterHash(eventStore.instances, function (instance) {
- return defs[instance.defId]; // still exists?
- });
- return { defs: defs, instances: instances };
-}
-
-function parseRange(input, dateEnv) {
- var start = null;
- var end = null;
- if (input.start) {
- start = dateEnv.createMarker(input.start);
- }
- if (input.end) {
- end = dateEnv.createMarker(input.end);
- }
- if (!start && !end) {
- return null;
- }
- if (start && end && end < start) {
- return null;
- }
- return { start: start, end: end };
-}
-// SIDE-EFFECT: will mutate ranges.
-// Will return a new array result.
-function invertRanges(ranges, constraintRange) {
- var invertedRanges = [];
- var start = constraintRange.start; // the end of the previous range. the start of the new range
- var i;
- var dateRange;
- // ranges need to be in order. required for our date-walking algorithm
- ranges.sort(compareRanges);
- for (i = 0; i < ranges.length; i++) {
- dateRange = ranges[i];
- // add the span of time before the event (if there is any)
- if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: dateRange.start });
- }
- if (dateRange.end > start) {
- start = dateRange.end;
- }
- }
- // add the span of time after the last event (if there is any)
- if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: constraintRange.end });
- }
- return invertedRanges;
-}
-function compareRanges(range0, range1) {
- return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
-}
-function intersectRanges(range0, range1) {
- var start = range0.start;
- var end = range0.end;
- var newRange = null;
- if (range1.start !== null) {
- if (start === null) {
- start = range1.start;
- }
- else {
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
- }
- }
- if (range1.end != null) {
- if (end === null) {
- end = range1.end;
- }
- else {
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
- }
- }
- if (start === null || end === null || start < end) {
- newRange = { start: start, end: end };
- }
- return newRange;
-}
-function rangesEqual(range0, range1) {
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
- (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
-}
-function rangesIntersect(range0, range1) {
- return (range0.end === null || range1.start === null || range0.end > range1.start) &&
- (range0.start === null || range1.end === null || range0.start < range1.end);
-}
-function rangeContainsRange(outerRange, innerRange) {
- return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
- (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
-}
-function rangeContainsMarker(range, date) {
- return (range.start === null || date >= range.start) &&
- (range.end === null || date < range.end);
-}
-// If the given date is not within the given range, move it inside.
-// (If it's past the end, make it one millisecond before the end).
-function constrainMarkerToRange(date, range) {
- if (range.start != null && date < range.start) {
- return range.start;
- }
- if (range.end != null && date >= range.end) {
- return new Date(range.end.valueOf() - 1);
- }
- return date;
-}
-
-function removeExact(array, exactVal) {
- var removeCnt = 0;
- var i = 0;
- while (i < array.length) {
- if (array[i] === exactVal) {
- array.splice(i, 1);
- removeCnt++;
- }
- else {
- i++;
- }
- }
- return removeCnt;
-}
-function isArraysEqual(a0, a1) {
- var len = a0.length;
- var i;
- if (len !== a1.length) { // not array? or not same length?
- return false;
- }
- for (i = 0; i < len; i++) {
- if (a0[i] !== a1[i]) {
- return false;
- }
- }
- return true;
-}
-
-function memoize(workerFunc) {
- var args;
- var res;
- return function () {
- if (!args || !isArraysEqual(args, arguments)) {
- args = arguments;
- res = workerFunc.apply(this, arguments);
- }
- return res;
- };
-}
-/*
-always executes the workerFunc, but if the result is equal to the previous result,
-return the previous result instead.
-*/
-function memoizeOutput(workerFunc, equalityFunc) {
- var cachedRes = null;
- return function () {
- var newRes = workerFunc.apply(this, arguments);
- if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
- cachedRes = newRes;
- }
- return cachedRes;
- };
-}
-
-var EXTENDED_SETTINGS_AND_SEVERITIES = {
- week: 3,
- separator: 0,
- omitZeroMinute: 0,
- meridiem: 0,
- omitCommas: 0
-};
-var STANDARD_DATE_PROP_SEVERITIES = {
- timeZoneName: 7,
- era: 6,
- year: 5,
- month: 4,
- day: 2,
- weekday: 2,
- hour: 1,
- minute: 1,
- second: 1
-};
-var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
-var COMMA_RE = /,/g; // we need re for globalness
-var MULTI_SPACE_RE = /\s+/g;
-var LTR_RE = /\u200e/g; // control character
-var UTC_RE = /UTC|GMT/;
-var NativeFormatter = /** @class */ (function () {
- function NativeFormatter(formatSettings) {
- var standardDateProps = {};
- var extendedSettings = {};
- var severity = 0;
- for (var name_1 in formatSettings) {
- if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
- extendedSettings[name_1] = formatSettings[name_1];
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
- }
- else {
- standardDateProps[name_1] = formatSettings[name_1];
- if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
- }
- }
- }
- this.standardDateProps = standardDateProps;
- this.extendedSettings = extendedSettings;
- this.severity = severity;
- this.buildFormattingFunc = memoize(buildFormattingFunc);
- }
- NativeFormatter.prototype.format = function (date, context) {
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
- };
- NativeFormatter.prototype.formatRange = function (start, end, context) {
- var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
- var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
- if (!diffSeverity) {
- return this.format(start, context);
- }
- var biggestUnitForPartial = diffSeverity;
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
- (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
- (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
- (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
- biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
- }
- var full0 = this.format(start, context);
- var full1 = this.format(end, context);
- if (full0 === full1) {
- return full0;
- }
- var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
- var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
- var partial0 = partialFormattingFunc(start);
- var partial1 = partialFormattingFunc(end);
- var insertion = findCommonInsertion(full0, partial0, full1, partial1);
- var separator = extendedSettings.separator || '';
- if (insertion) {
- return insertion.before + partial0 + separator + partial1 + insertion.after;
- }
- return full0 + separator + full1;
- };
- NativeFormatter.prototype.getLargestUnit = function () {
- switch (this.severity) {
- case 7:
- case 6:
- case 5:
- return 'year';
- case 4:
- return 'month';
- case 3:
- return 'week';
- default:
- return 'day';
- }
- };
- return NativeFormatter;
-}());
-function buildFormattingFunc(standardDateProps, extendedSettings, context) {
- var standardDatePropCnt = Object.keys(standardDateProps).length;
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
- return function (date) {
- return formatTimeZoneOffset(date.timeZoneOffset);
- };
- }
- if (standardDatePropCnt === 0 && extendedSettings.week) {
- return function (date) {
- return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
- };
- }
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
-}
-function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
- standardDateProps = __assign({}, standardDateProps); // copy
- extendedSettings = __assign({}, extendedSettings); // copy
- sanitizeSettings(standardDateProps, extendedSettings);
- standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
- var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
- var zeroFormat; // needed?
- if (extendedSettings.omitZeroMinute) {
- var zeroProps = __assign({}, standardDateProps);
- delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
- }
- return function (date) {
- var marker = date.marker;
- var format;
- if (zeroFormat && !marker.getUTCMinutes()) {
- format = zeroFormat;
- }
- else {
- format = normalFormat;
- }
- var s = format.format(marker);
- return postProcess(s, date, standardDateProps, extendedSettings, context);
- };
-}
-function sanitizeSettings(standardDateProps, extendedSettings) {
- // deal with a browser inconsistency where formatting the timezone
- // requires that the hour/minute be present.
- if (standardDateProps.timeZoneName) {
- if (!standardDateProps.hour) {
- standardDateProps.hour = '2-digit';
- }
- if (!standardDateProps.minute) {
- standardDateProps.minute = '2-digit';
- }
- }
- // only support short timezone names
- if (standardDateProps.timeZoneName === 'long') {
- standardDateProps.timeZoneName = 'short';
- }
- // if requesting to display seconds, MUST display minutes
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
- delete extendedSettings.omitZeroMinute;
- }
-}
-function postProcess(s, date, standardDateProps, extendedSettings, context) {
- s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
- if (standardDateProps.timeZoneName === 'short') {
- s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
- 'UTC' : // important to normalize for IE, which does "GMT"
- formatTimeZoneOffset(date.timeZoneOffset));
- }
- if (extendedSettings.omitCommas) {
- s = s.replace(COMMA_RE, '').trim();
- }
- if (extendedSettings.omitZeroMinute) {
- s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
- }
- // ^ do anything that might create adjacent spaces before this point,
- // because MERIDIEM_RE likes to eat up loading spaces
- if (extendedSettings.meridiem === false) {
- s = s.replace(MERIDIEM_RE, '').trim();
- }
- else if (extendedSettings.meridiem === 'narrow') { // a/p
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase();
- });
- }
- else if (extendedSettings.meridiem === 'short') { // am/pm
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase() + 'm';
- });
- }
- else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
- s = s.replace(MERIDIEM_RE, function (m0) {
- return m0.toLocaleLowerCase();
- });
- }
- s = s.replace(MULTI_SPACE_RE, ' ');
- s = s.trim();
- return s;
-}
-function injectTzoStr(s, tzoStr) {
- var replaced = false;
- s = s.replace(UTC_RE, function () {
- replaced = true;
- return tzoStr;
- });
- // IE11 doesn't include UTC/GMT in the original string, so append to end
- if (!replaced) {
- s += ' ' + tzoStr;
- }
- return s;
-}
-function formatWeekNumber(num, weekLabel, locale, display) {
- var parts = [];
- if (display === 'narrow') {
- parts.push(weekLabel);
- }
- else if (display === 'short') {
- parts.push(weekLabel, ' ');
- }
- // otherwise, considered 'numeric'
- parts.push(locale.simpleNumberFormat.format(num));
- if (locale.options.isRtl) { // TODO: use control characters instead?
- parts.reverse();
- }
- return parts.join('');
-}
-// Range Formatting Utils
-// 0 = exactly the same
-// 1 = different by time
-// and bigger
-function computeMarkerDiffSeverity(d0, d1, ca) {
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
- return 5;
- }
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
- return 4;
- }
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
- return 2;
- }
- if (timeAsMs(d0) !== timeAsMs(d1)) {
- return 1;
- }
- return 0;
-}
-function computePartialFormattingOptions(options, biggestUnit) {
- var partialOptions = {};
- for (var name_2 in options) {
- if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
- STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
- partialOptions[name_2] = options[name_2];
- }
- }
- return partialOptions;
-}
-function findCommonInsertion(full0, partial0, full1, partial1) {
- var i0 = 0;
- while (i0 < full0.length) {
- var found0 = full0.indexOf(partial0, i0);
- if (found0 === -1) {
- break;
- }
- var before0 = full0.substr(0, found0);
- i0 = found0 + partial0.length;
- var after0 = full0.substr(i0);
- var i1 = 0;
- while (i1 < full1.length) {
- var found1 = full1.indexOf(partial1, i1);
- if (found1 === -1) {
- break;
- }
- var before1 = full1.substr(0, found1);
- i1 = found1 + partial1.length;
- var after1 = full1.substr(i1);
- if (before0 === before1 && after0 === after1) {
- return {
- before: before0,
- after: after0
- };
- }
- }
- }
- return null;
-}
-
-/*
-TODO: fix the terminology of "formatter" vs "formatting func"
-*/
-/*
-At the time of instantiation, this object does not know which cmd-formatting system it will use.
-It receives this at the time of formatting, as a setting.
-*/
-var CmdFormatter = /** @class */ (function () {
- function CmdFormatter(cmdStr, separator) {
- this.cmdStr = cmdStr;
- this.separator = separator;
- }
- CmdFormatter.prototype.format = function (date, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
- };
- CmdFormatter.prototype.formatRange = function (start, end, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
- };
- return CmdFormatter;
-}());
-
-var FuncFormatter = /** @class */ (function () {
- function FuncFormatter(func) {
- this.func = func;
- }
- FuncFormatter.prototype.format = function (date, context) {
- return this.func(createVerboseFormattingArg(date, null, context));
- };
- FuncFormatter.prototype.formatRange = function (start, end, context) {
- return this.func(createVerboseFormattingArg(start, end, context));
- };
- return FuncFormatter;
-}());
-
-// Formatter Object Creation
-function createFormatter(input, defaultSeparator) {
- if (typeof input === 'object' && input) { // non-null object
- if (typeof defaultSeparator === 'string') {
- input = __assign({ separator: defaultSeparator }, input);
- }
- return new NativeFormatter(input);
- }
- else if (typeof input === 'string') {
- return new CmdFormatter(input, defaultSeparator);
- }
- else if (typeof input === 'function') {
- return new FuncFormatter(input);
- }
-}
-// String Utils
-// timeZoneOffset is in minutes
-function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
- if (stripZeroTime === void 0) { stripZeroTime = false; }
- var s = marker.toISOString();
- s = s.replace('.000', '');
- if (stripZeroTime) {
- s = s.replace('T00:00:00Z', '');
- }
- if (s.length > 10) { // time part wasn't stripped, can add timezone info
- if (timeZoneOffset == null) {
- s = s.replace('Z', '');
- }
- else if (timeZoneOffset !== 0) {
- s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
- }
- // otherwise, its UTC-0 and we want to keep the Z
- }
- return s;
-}
-function formatIsoTimeString(marker) {
- return padStart(marker.getUTCHours(), 2) + ':' +
- padStart(marker.getUTCMinutes(), 2) + ':' +
- padStart(marker.getUTCSeconds(), 2);
-}
-function formatTimeZoneOffset(minutes, doIso) {
- if (doIso === void 0) { doIso = false; }
- var sign = minutes < 0 ? '-' : '+';
- var abs = Math.abs(minutes);
- var hours = Math.floor(abs / 60);
- var mins = Math.round(abs % 60);
- if (doIso) {
- return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
- }
- else {
- return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
- }
-}
-// Arg Utils
-function createVerboseFormattingArg(start, end, context, separator) {
- var startInfo = expandZonedMarker(start, context.calendarSystem);
- var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
- return {
- date: startInfo,
- start: startInfo,
- end: endInfo,
- timeZone: context.timeZone,
- localeCodes: context.locale.codes,
- separator: separator
- };
-}
-function expandZonedMarker(dateInfo, calendarSystem) {
- var a = calendarSystem.markerToArray(dateInfo.marker);
- return {
- marker: dateInfo.marker,
- timeZoneOffset: dateInfo.timeZoneOffset,
- array: a,
- year: a[0],
- month: a[1],
- day: a[2],
- hour: a[3],
- minute: a[4],
- second: a[5],
- millisecond: a[6]
- };
-}
-
-var EventSourceApi = /** @class */ (function () {
- function EventSourceApi(calendar, internalEventSource) {
- this.calendar = calendar;
- this.internalEventSource = internalEventSource;
- }
- EventSourceApi.prototype.remove = function () {
- this.calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: this.internalEventSource.sourceId
- });
- };
- EventSourceApi.prototype.refetch = function () {
- this.calendar.dispatch({
- type: 'FETCH_EVENT_SOURCES',
- sourceIds: [this.internalEventSource.sourceId]
- });
- };
- Object.defineProperty(EventSourceApi.prototype, "id", {
- get: function () {
- return this.internalEventSource.publicId;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventSourceApi.prototype, "url", {
- // only relevant to json-feed event sources
- get: function () {
- return this.internalEventSource.meta.url;
- },
- enumerable: true,
- configurable: true
- });
- return EventSourceApi;
-}());
-
-var EventApi = /** @class */ (function () {
- function EventApi(calendar, def, instance) {
- this._calendar = calendar;
- this._def = def;
- this._instance = instance || null;
- }
- /*
- TODO: make event struct more responsible for this
- */
- EventApi.prototype.setProp = function (name, val) {
- var _a, _b;
- if (name in DATE_PROPS) ;
- else if (name in NON_DATE_PROPS) {
- if (typeof NON_DATE_PROPS[name] === 'function') {
- val = NON_DATE_PROPS[name](val);
- }
- this.mutate({
- standardProps: (_a = {}, _a[name] = val, _a)
- });
- }
- else if (name in UNSCOPED_EVENT_UI_PROPS) {
- var ui = void 0;
- if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
- val = UNSCOPED_EVENT_UI_PROPS[name](val);
- }
- if (name === 'color') {
- ui = { backgroundColor: val, borderColor: val };
- }
- else if (name === 'editable') {
- ui = { startEditable: val, durationEditable: val };
- }
- else {
- ui = (_b = {}, _b[name] = val, _b);
- }
- this.mutate({
- standardProps: { ui: ui }
- });
- }
- };
- EventApi.prototype.setExtendedProp = function (name, val) {
- var _a;
- this.mutate({
- extendedProps: (_a = {}, _a[name] = val, _a)
- });
- };
- EventApi.prototype.setStart = function (startInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var start = dateEnv.createMarker(startInput);
- if (start && this._instance) { // TODO: warning if parsed bad
- var instanceRange = this._instance.range;
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
- if (options.maintainDuration) {
- this.mutate({ datesDelta: startDelta });
- }
- else {
- this.mutate({ startDelta: startDelta });
- }
- }
- };
- EventApi.prototype.setEnd = function (endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var end;
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return; // TODO: warning if parsed bad
- }
- }
- if (this._instance) {
- if (end) {
- var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
- this.mutate({ endDelta: endDelta });
- }
- else {
- this.mutate({ standardProps: { hasEnd: false } });
- }
- }
- };
- EventApi.prototype.setDates = function (startInput, endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var standardProps = { allDay: options.allDay };
- var start = dateEnv.createMarker(startInput);
- var end;
- if (!start) {
- return; // TODO: warning if parsed bad
- }
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) { // TODO: warning if parsed bad
- return;
- }
- }
- if (this._instance) {
- var instanceRange = this._instance.range;
- // when computing the diff for an event being converted to all-day,
- // compute diff off of the all-day values the way event-mutation does.
- if (options.allDay === true) {
- instanceRange = computeAlignedDayRange(instanceRange);
- }
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (end) {
- var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
- if (durationsEqual(startDelta, endDelta)) {
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- else {
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
- }
- }
- else { // means "clear the end"
- standardProps.hasEnd = false;
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- }
- };
- EventApi.prototype.moveStart = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ startDelta: delta });
- }
- };
- EventApi.prototype.moveEnd = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ endDelta: delta });
- }
- };
- EventApi.prototype.moveDates = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ datesDelta: delta });
- }
- };
- EventApi.prototype.setAllDay = function (allDay, options) {
- if (options === void 0) { options = {}; }
- var standardProps = { allDay: allDay };
- var maintainDuration = options.maintainDuration;
- if (maintainDuration == null) {
- maintainDuration = this._calendar.opt('allDayMaintainDuration');
- }
- if (this._def.allDay !== allDay) {
- standardProps.hasEnd = maintainDuration;
- }
- this.mutate({ standardProps: standardProps });
- };
- EventApi.prototype.formatRange = function (formatInput) {
- var dateEnv = this._calendar.dateEnv;
- var instance = this._instance;
- var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
- if (this._def.hasEnd) {
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
- forcedStartTzo: instance.forcedStartTzo,
- forcedEndTzo: instance.forcedEndTzo
- });
- }
- else {
- return dateEnv.format(instance.range.start, formatter, {
- forcedTzo: instance.forcedStartTzo
- });
- }
- };
- EventApi.prototype.mutate = function (mutation) {
- var def = this._def;
- var instance = this._instance;
- if (instance) {
- this._calendar.dispatch({
- type: 'MUTATE_EVENTS',
- instanceId: instance.instanceId,
- mutation: mutation,
- fromApi: true
- });
- var eventStore = this._calendar.state.eventStore;
- this._def = eventStore.defs[def.defId];
- this._instance = eventStore.instances[instance.instanceId];
- }
- };
- EventApi.prototype.remove = function () {
- this._calendar.dispatch({
- type: 'REMOVE_EVENT_DEF',
- defId: this._def.defId
- });
- };
- Object.defineProperty(EventApi.prototype, "source", {
- get: function () {
- var sourceId = this._def.sourceId;
- if (sourceId) {
- return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
- }
- return null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "start", {
- get: function () {
- return this._instance ?
- this._calendar.dateEnv.toDate(this._instance.range.start) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "end", {
- get: function () {
- return (this._instance && this._def.hasEnd) ?
- this._calendar.dateEnv.toDate(this._instance.range.end) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "id", {
- // computable props that all access the def
- // TODO: find a TypeScript-compatible way to do this at scale
- get: function () { return this._def.publicId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "groupId", {
- get: function () { return this._def.groupId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allDay", {
- get: function () { return this._def.allDay; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "title", {
- get: function () { return this._def.title; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "url", {
- get: function () { return this._def.url; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "rendering", {
- get: function () { return this._def.rendering; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "startEditable", {
- get: function () { return this._def.ui.startEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "durationEditable", {
- get: function () { return this._def.ui.durationEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "constraint", {
- get: function () { return this._def.ui.constraints[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "overlap", {
- get: function () { return this._def.ui.overlap; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allow", {
- get: function () { return this._def.ui.allows[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "backgroundColor", {
- get: function () { return this._def.ui.backgroundColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "borderColor", {
- get: function () { return this._def.ui.borderColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "textColor", {
- get: function () { return this._def.ui.textColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "classNames", {
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
- get: function () { return this._def.ui.classNames; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "extendedProps", {
- get: function () { return this._def.extendedProps; },
- enumerable: true,
- configurable: true
- });
- return EventApi;
-}());
-
-/*
-Specifying nextDayThreshold signals that all-day ranges should be sliced.
-*/
-function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
- var inverseBgByGroupId = {};
- var inverseBgByDefId = {};
- var defByGroupId = {};
- var bgRanges = [];
- var fgRanges = [];
- var eventUis = compileEventUis(eventStore.defs, eventUiBases);
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId] = [];
- if (!defByGroupId[def.groupId]) {
- defByGroupId[def.groupId] = def;
- }
- }
- else {
- inverseBgByDefId[defId] = [];
- }
- }
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = eventStore.defs[instance.defId];
- var ui = eventUis[def.defId];
- var origRange = instance.range;
- var normalRange = (!def.allDay && nextDayThreshold) ?
- computeVisibleDayRange(origRange, nextDayThreshold) :
- origRange;
- var slicedRange = intersectRanges(normalRange, framingRange);
- if (slicedRange) {
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId].push(slicedRange);
- }
- else {
- inverseBgByDefId[instance.defId].push(slicedRange);
- }
- }
- else {
- (def.rendering === 'background' ? bgRanges : fgRanges).push({
- def: def,
- ui: ui,
- instance: instance,
- range: slicedRange,
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
- });
- }
- }
- }
- for (var groupId in inverseBgByGroupId) { // BY GROUP
- var ranges = inverseBgByGroupId[groupId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
- var invertedRange = invertedRanges_1[_i];
- var def = defByGroupId[groupId];
- var ui = eventUis[def.defId];
- bgRanges.push({
- def: def,
- ui: ui,
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- for (var defId in inverseBgByDefId) {
- var ranges = inverseBgByDefId[defId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
- var invertedRange = invertedRanges_2[_a];
- bgRanges.push({
- def: eventStore.defs[defId],
- ui: eventUis[defId],
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- return { bg: bgRanges, fg: fgRanges };
-}
-function hasBgRendering(def) {
- return def.rendering === 'background' || def.rendering === 'inverse-background';
-}
-function filterSegsViaEls(context, segs, isMirror) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventRender')) {
- segs = segs.filter(function (seg) {
- var custom = calendar.publiclyTrigger('eventRender', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirror,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- // TODO: include seg.range once all components consistently generate it
- el: seg.el,
- view: view
- }
- ]);
- if (custom === false) { // means don't render at all
- return false;
- }
- else if (custom && custom !== true) {
- seg.el = custom;
- }
- return true;
- });
- }
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- setElSeg(seg.el, seg);
- }
- return segs;
-}
-function setElSeg(el, seg) {
- el.fcSeg = seg;
-}
-function getElSeg(el) {
- return el.fcSeg || null;
-}
-// event ui computation
-function compileEventUis(eventDefs, eventUiBases) {
- return mapHash(eventDefs, function (eventDef) {
- return compileEventUi(eventDef, eventUiBases);
- });
-}
-function compileEventUi(eventDef, eventUiBases) {
- var uis = [];
- if (eventUiBases['']) {
- uis.push(eventUiBases['']);
- }
- if (eventUiBases[eventDef.defId]) {
- uis.push(eventUiBases[eventDef.defId]);
- }
- uis.push(eventDef.ui);
- return combineEventUis(uis);
-}
-// triggers
-function triggerRenderedSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventPositioned')) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- calendar.publiclyTriggerAfterSizing('eventPositioned', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- if (!calendar.state.eventSourceLoadingLevel) { // avoid initial empty state while pending
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
- }
-}
-function triggerWillRemoveSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
- var seg = segs_3[_i];
- calendar.trigger('eventElRemove', seg.el);
- }
- if (calendar.hasPublicHandlers('eventDestroy')) {
- for (var _a = 0, segs_4 = segs; _a < segs_4.length; _a++) {
- var seg = segs_4[_a];
- calendar.publiclyTrigger('eventDestroy', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
-}
-// is-interactable
-function computeEventDraggable(context, eventDef, eventUi) {
- var calendar = context.calendar, view = context.view;
- var transformers = calendar.pluginSystem.hooks.isDraggableTransformers;
- var val = eventUi.startEditable;
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- val = transformer(val, eventDef, eventUi, view);
- }
- return val;
-}
-function computeEventStartResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable && context.options.eventResizableFromStart;
-}
-function computeEventEndResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable;
-}
-
-// applies the mutation to ALL defs/instances within the event store
-function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
- var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
- var dest = createEmptyEventStore();
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = dest.defs[instance.defId]; // important to grab the newly modified def
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
- }
- return dest;
-}
-function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
- var standardProps = mutation.standardProps || {};
- // if hasEnd has not been specified, guess a good value based on deltas.
- // if duration will change, there's no way the default duration will persist,
- // and thus, we need to mark the event as having a real end
- if (standardProps.hasEnd == null &&
- eventConfig.durationEditable &&
- (mutation.startDelta || mutation.endDelta)) {
- standardProps.hasEnd = true; // TODO: is this mutation okay?
- }
- var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
- if (mutation.extendedProps) {
- copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
- }
- for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
- var applier = appliers_1[_i];
- applier(copy, mutation, calendar);
- }
- if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
- copy.hasEnd = true;
- }
- return copy;
-}
-function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
-eventConfig, mutation, calendar) {
- var dateEnv = calendar.dateEnv;
- var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
- var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
- var copy = __assign({}, eventInstance);
- if (forceAllDay) {
- copy.range = computeAlignedDayRange(copy.range);
- }
- if (mutation.datesDelta && eventConfig.startEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
- };
- }
- if (mutation.startDelta && eventConfig.durationEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.startDelta),
- end: copy.range.end
- };
- }
- if (mutation.endDelta && eventConfig.durationEditable) {
- copy.range = {
- start: copy.range.start,
- end: dateEnv.add(copy.range.end, mutation.endDelta)
- };
- }
- if (clearEnd) {
- copy.range = {
- start: copy.range.start,
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
- };
- }
- // in case event was all-day but the supplied deltas were not
- // better util for this?
- if (eventDef.allDay) {
- copy.range = {
- start: startOfDay(copy.range.start),
- end: startOfDay(copy.range.end)
- };
- }
- // handle invalid durations
- if (copy.range.end < copy.range.start) {
- copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
- }
- return copy;
-}
-
-function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
- switch (action.type) {
- case 'RECEIVE_EVENTS': // raw
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
- case 'ADD_EVENTS': // already parsed, but not expanded
- return addEvent(eventStore, action.eventStore, // new ones
- dateProfile ? dateProfile.activeRange : null, calendar);
- case 'MERGE_EVENTS': // already parsed and expanded
- return mergeEventStores(eventStore, action.eventStore);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return expandRecurring(eventStore, dateProfile.activeRange, calendar);
- }
- else {
- return eventStore;
- }
- case 'CHANGE_TIMEZONE':
- return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
- case 'MUTATE_EVENTS':
- return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
- case 'REMOVE_EVENT_INSTANCES':
- return excludeInstances(eventStore, action.instances);
- case 'REMOVE_EVENT_DEF':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.defId !== action.defId;
- });
- case 'REMOVE_EVENT_SOURCE':
- return excludeEventsBySourceId(eventStore, action.sourceId);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return !eventDef.sourceId; // only keep events with no source id
- });
- case 'REMOVE_ALL_EVENTS':
- return createEmptyEventStore();
- case 'RESET_EVENTS':
- return {
- defs: eventStore.defs,
- instances: eventStore.instances
- };
- default:
- return eventStore;
- }
-}
-function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
- ) {
- var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
- if (fetchRange) {
- subset = expandRecurring(subset, fetchRange, calendar);
- }
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
- }
- return eventStore;
-}
-function addEvent(eventStore, subset, expandRange, calendar) {
- if (expandRange) {
- subset = expandRecurring(subset, expandRange, calendar);
- }
- return mergeEventStores(eventStore, subset);
-}
-function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
- var defs = eventStore.defs;
- var instances = mapHash(eventStore.instances, function (instance) {
- var def = defs[instance.defId];
- if (def.allDay || def.recurringDef) {
- return instance; // isn't dependent on timezone
- }
- else {
- return __assign({}, instance, { range: {
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
- }
- });
- return { defs: defs, instances: instances };
-}
-function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
- var relevant = getRelevantEvents(eventStore, instanceId);
- var eventConfigBase = fromApi ?
- { '': {
- startEditable: true,
- durationEditable: true,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- } } :
- calendar.eventUiBases;
- relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
- return mergeEventStores(eventStore, relevant);
-}
-function excludeEventsBySourceId(eventStore, sourceId) {
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.sourceId !== sourceId;
- });
-}
-// QUESTION: why not just return instances? do a general object-property-exclusion util
-function excludeInstances(eventStore, removals) {
- return {
- defs: eventStore.defs,
- instances: filterHash(eventStore.instances, function (instance) {
- return !removals[instance.instanceId];
- })
- };
-}
-
-// high-level segmenting-aware tester functions
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionValid(interaction, calendar) {
- return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
-}
-function isDateSelectionValid(dateSelection, calendar) {
- return isNewPropsValid({ dateSelection: dateSelection }, calendar);
-}
-function isNewPropsValid(newProps, calendar) {
- var view = calendar.view;
- var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
- return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
-}
-function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
- if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- return true;
-}
-// Moving Event Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
- var subjectEventStore = interaction.mutatedEvents;
- var subjectDefs = subjectEventStore.defs;
- var subjectInstances = subjectEventStore.instances;
- var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
- state.eventUiBases :
- { '': calendar.selectionConfig } // if not a real event, validate as a selection
- );
- if (filterConfig) {
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
- }
- var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
- var otherDefs = otherEventStore.defs;
- var otherInstances = otherEventStore.instances;
- var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
- for (var subjectInstanceId in subjectInstances) {
- var subjectInstance = subjectInstances[subjectInstanceId];
- var subjectRange = subjectInstance.range;
- var subjectConfig = subjectConfigs[subjectInstance.defId];
- var subjectDef = subjectDefs[subjectInstance.defId];
- // constraint
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('eventOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var otherInstanceId in otherInstances) {
- var otherInstance = otherInstances[otherInstanceId];
- // intersect! evaluate
- if (rangesIntersect(subjectRange, otherInstance.range)) {
- var otherOverlap = otherConfigs[otherInstance.defId].overlap;
- // consider the other event's overlap. only do this if the subject event is a "real" event
- if (otherOverlap === false && interaction.isEvent) {
- return false;
- }
- if (subjectConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
- new EventApi(calendar, subjectDef, subjectInstance) // moving event
- )) {
- return false;
- }
- }
- }
- // allow (a function)
- var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
- for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
- var subjectAllow = _a[_i];
- var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
- var origDef = calendarEventStore.defs[subjectDef.defId];
- var origInstance = calendarEventStore.instances[subjectInstanceId];
- var eventApi = void 0;
- if (origDef) { // was previously in the calendar
- eventApi = new EventApi(calendar, origDef, origInstance);
- }
- else { // was an external event
- eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
- }
- if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
- return false;
- }
- }
- }
- return true;
-}
-// Date Selection Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var relevantEventStore = state.eventStore;
- var relevantDefs = relevantEventStore.defs;
- var relevantInstances = relevantEventStore.instances;
- var selection = state.dateSelection;
- var selectionRange = selection.range;
- var selectionConfig = calendar.selectionConfig;
- if (filterConfig) {
- selectionConfig = filterConfig(selectionConfig);
- }
- // constraint
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('selectOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var relevantInstanceId in relevantInstances) {
- var relevantInstance = relevantInstances[relevantInstanceId];
- // intersect! evaluate
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
- if (selectionConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
- return false;
- }
- }
- }
- // allow (a function)
- for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
- var selectionAllow = _a[_i];
- var fullDateSpan = __assign({}, dateSpanMeta, selection);
- if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
- return false;
- }
- }
- return true;
-}
-// Constraint Utils
-// ------------------------------------------------------------------------------------------------------------------------
-function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
- for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
- var constraint = constraints_1[_i];
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
- return false;
- }
- }
- return true;
-}
-function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
-otherEventStore, // for if constraint is an even group ID
-businessHoursUnexpanded, // for if constraint is 'businessHours'
-calendar // for expanding businesshours
-) {
- if (constraint === 'businessHours') {
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
- }
- else if (typeof constraint === 'string') { // an group ID
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
- return eventDef.groupId === constraint;
- }));
- }
- else if (typeof constraint === 'object' && constraint) { // non-null object
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
- }
- return []; // if it's false
-}
-// TODO: move to event-store file?
-function eventStoreToRanges(eventStore) {
- var instances = eventStore.instances;
- var ranges = [];
- for (var instanceId in instances) {
- ranges.push(instances[instanceId].range);
- }
- return ranges;
-}
-// TODO: move to geom file?
-function anyRangesContainRange(outerRanges, innerRange) {
- for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
- var outerRange = outerRanges_1[_i];
- if (rangeContainsRange(outerRange, innerRange)) {
- return true;
- }
- }
- return false;
-}
-// Parsing
-// ------------------------------------------------------------------------------------------------------------------------
-function normalizeConstraint(input, calendar) {
- if (Array.isArray(input)) {
- return parseEvents(input, '', calendar, true); // allowOpenRange=true
- }
- else if (typeof input === 'object' && input) { // non-null object
- return parseEvents([input], '', calendar, true); // allowOpenRange=true
- }
- else if (input != null) {
- return String(input);
- }
- else {
- return null;
- }
-}
-
-function htmlEscape(s) {
- return (s + '').replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/'/g, '&#039;')
- .replace(/"/g, '&quot;')
- .replace(/\n/g, '<br />');
-}
-// Given a hash of CSS properties, returns a string of CSS.
-// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
-function cssToStr(cssProps) {
- var statements = [];
- for (var name_1 in cssProps) {
- var val = cssProps[name_1];
- if (val != null && val !== '') {
- statements.push(name_1 + ':' + val);
- }
- }
- return statements.join(';');
-}
-// Given an object hash of HTML attribute names to values,
-// generates a string that can be injected between < > in HTML
-function attrsToStr(attrs) {
- var parts = [];
- for (var name_2 in attrs) {
- var val = attrs[name_2];
- if (val != null) {
- parts.push(name_2 + '="' + htmlEscape(val) + '"');
- }
- }
- return parts.join(' ');
-}
-function parseClassName(raw) {
- if (Array.isArray(raw)) {
- return raw;
- }
- else if (typeof raw === 'string') {
- return raw.split(/\s+/);
- }
- else {
- return [];
- }
-}
-
-var UNSCOPED_EVENT_UI_PROPS = {
- editable: Boolean,
- startEditable: Boolean,
- durationEditable: Boolean,
- constraint: null,
- overlap: null,
- allow: null,
- className: parseClassName,
- classNames: parseClassName,
- color: String,
- backgroundColor: String,
- borderColor: String,
- textColor: String
-};
-function processUnscopedUiProps(rawProps, calendar, leftovers) {
- var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
- var constraint = normalizeConstraint(props.constraint, calendar);
- return {
- startEditable: props.startEditable != null ? props.startEditable : props.editable,
- durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
- constraints: constraint != null ? [constraint] : [],
- overlap: props.overlap,
- allows: props.allow != null ? [props.allow] : [],
- backgroundColor: props.backgroundColor || props.color,
- borderColor: props.borderColor || props.color,
- textColor: props.textColor,
- classNames: props.classNames.concat(props.className)
- };
-}
-function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
- var rawUnscoped = {};
- var wasFound = {};
- for (var key in UNSCOPED_EVENT_UI_PROPS) {
- var scopedKey = prefix + capitaliseFirstLetter(key);
- rawUnscoped[key] = rawScoped[scopedKey];
- wasFound[scopedKey] = true;
- }
- if (prefix === 'event') {
- rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
- }
- if (leftovers) {
- for (var key in rawScoped) {
- if (!wasFound[key]) {
- leftovers[key] = rawScoped[key];
- }
- }
- }
- return processUnscopedUiProps(rawUnscoped, calendar);
-}
-var EMPTY_EVENT_UI = {
- startEditable: null,
- durationEditable: null,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
-};
-// prevent against problems with <2 args!
-function combineEventUis(uis) {
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
-}
-function combineTwoEventUis(item0, item1) {
- return {
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
- constraints: item0.constraints.concat(item1.constraints),
- overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
- allows: item0.allows.concat(item1.allows),
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
- borderColor: item1.borderColor || item0.borderColor,
- textColor: item1.textColor || item0.textColor,
- classNames: item0.classNames.concat(item1.classNames)
- };
-}
-
-var NON_DATE_PROPS = {
- id: String,
- groupId: String,
- title: String,
- url: String,
- rendering: String,
- extendedProps: null
-};
-var DATE_PROPS = {
- start: null,
- date: null,
- end: null,
- allDay: null
-};
-var uid = 0;
-function parseEvent(raw, sourceId, calendar, allowOpenRange) {
- var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
- var leftovers0 = {};
- var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
- allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
- );
- if (recurringRes) {
- var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
- def.recurringDef = {
- typeId: recurringRes.typeId,
- typeData: recurringRes.typeData,
- duration: recurringRes.duration
- };
- return { def: def, instance: null };
- }
- else {
- var leftovers1 = {};
- var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
- if (singleRes) {
- var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
- var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
- return { def: def, instance: instance };
- }
- }
- return null;
-}
-/*
-Will NOT populate extendedProps with the leftover properties.
-Will NOT populate date-related props.
-The EventNonDateInput has been normalized (id => publicId, etc).
-*/
-function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
- var leftovers = {};
- var def = pluckNonDateProps(raw, calendar, leftovers);
- def.defId = String(uid++);
- def.sourceId = sourceId;
- def.allDay = allDay;
- def.hasEnd = hasEnd;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
- var eventDefParser = _a[_i];
- var newLeftovers = {};
- eventDefParser(def, leftovers, newLeftovers);
- leftovers = newLeftovers;
- }
- def.extendedProps = __assign(leftovers, def.extendedProps || {});
- // help out EventApi from having user modify props
- Object.freeze(def.ui.classNames);
- Object.freeze(def.extendedProps);
- return def;
-}
-function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
- return {
- instanceId: String(uid++),
- defId: defId,
- range: range,
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
- };
-}
-function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
- var props = pluckDateProps(raw, leftovers);
- var allDay = props.allDay;
- var startMeta;
- var startMarker = null;
- var hasEnd = false;
- var endMeta;
- var endMarker = null;
- startMeta = calendar.dateEnv.createMarkerMeta(props.start);
- if (startMeta) {
- startMarker = startMeta.marker;
- }
- else if (!allowOpenRange) {
- return null;
- }
- if (props.end != null) {
- endMeta = calendar.dateEnv.createMarkerMeta(props.end);
- }
- if (allDay == null) {
- if (allDayDefault != null) {
- allDay = allDayDefault;
- }
- else {
- // fall back to the date props LAST
- allDay = (!startMeta || startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- }
- if (allDay && startMarker) {
- startMarker = startOfDay(startMarker);
- }
- if (endMeta) {
- endMarker = endMeta.marker;
- if (allDay) {
- endMarker = startOfDay(endMarker);
- }
- if (startMarker && endMarker <= startMarker) {
- endMarker = null;
- }
- }
- if (endMarker) {
- hasEnd = true;
- }
- else if (!allowOpenRange) {
- hasEnd = calendar.opt('forceEventDuration') || false;
- endMarker = calendar.dateEnv.add(startMarker, allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration);
- }
- return {
- allDay: allDay,
- hasEnd: hasEnd,
- range: { start: startMarker, end: endMarker },
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
- };
-}
-function pluckDateProps(raw, leftovers) {
- var props = refineProps(raw, DATE_PROPS, {}, leftovers);
- props.start = (props.start !== null) ? props.start : props.date;
- delete props.date;
- return props;
-}
-function pluckNonDateProps(raw, calendar, leftovers) {
- var preLeftovers = {};
- var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
- var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
- props.publicId = props.id;
- delete props.id;
- props.ui = ui;
- return props;
-}
-function computeIsAllDayDefault(sourceId, calendar) {
- var res = null;
- if (sourceId) {
- var source = calendar.state.eventSources[sourceId];
- res = source.allDayDefault;
- }
- if (res == null) {
- res = calendar.opt('allDayDefault');
- }
- return res;
-}
-
-var DEF_DEFAULTS = {
- startTime: '09:00',
- endTime: '17:00',
- daysOfWeek: [1, 2, 3, 4, 5],
- rendering: 'inverse-background',
- classNames: 'fc-nonbusiness',
- groupId: '_businessHours' // so multiple defs get grouped
-};
-/*
-TODO: pass around as EventDefHash!!!
-*/
-function parseBusinessHours(input, calendar) {
- return parseEvents(refineInputs(input), '', calendar);
-}
-function refineInputs(input) {
- var rawDefs;
- if (input === true) {
- rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
- }
- else if (Array.isArray(input)) {
- // if specifying an array, every sub-definition NEEDS a day-of-week
- rawDefs = input.filter(function (rawDef) {
- return rawDef.daysOfWeek;
- });
- }
- else if (typeof input === 'object' && input) { // non-null object
- rawDefs = [input];
- }
- else { // is probably false
- rawDefs = [];
- }
- rawDefs = rawDefs.map(function (rawDef) {
- return __assign({}, DEF_DEFAULTS, rawDef);
- });
- return rawDefs;
-}
-
-function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
- if (dependencies === void 0) { dependencies = []; }
- var dependents = [];
- var thisContext;
- var prevArgs;
- function unrender() {
- if (prevArgs) {
- for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
- var dependent = dependents_1[_i];
- dependent.unrender();
- }
- if (unrenderFunc) {
- unrenderFunc.apply(thisContext, prevArgs);
- }
- prevArgs = null;
- }
- }
- function res() {
- if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
- unrender();
- thisContext = this;
- prevArgs = arguments;
- renderFunc.apply(this, arguments);
- }
- }
- res.dependents = dependents;
- res.unrender = unrender;
- for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
- var dependency = dependencies_1[_i];
- dependency.dependents.push(res);
- }
- return res;
-}
-
-var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
-var Splitter = /** @class */ (function () {
- function Splitter() {
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
- this.splitDateSelection = memoize(this._splitDateSpan);
- this.splitEventStore = memoize(this._splitEventStore);
- this.splitIndividualUi = memoize(this._splitIndividualUi);
- this.splitEventDrag = memoize(this._splitInteraction);
- this.splitEventResize = memoize(this._splitInteraction);
- this.eventUiBuilders = {}; // TODO: typescript protection
- }
- Splitter.prototype.splitProps = function (props) {
- var _this = this;
- var keyInfos = this.getKeyInfo(props);
- var defKeys = this.getKeysForEventDefs(props.eventStore);
- var dateSelections = this.splitDateSelection(props.dateSelection);
- var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
- var eventStores = this.splitEventStore(props.eventStore, defKeys);
- var eventDrags = this.splitEventDrag(props.eventDrag);
- var eventResizes = this.splitEventResize(props.eventResize);
- var splitProps = {};
- this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
- return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
- });
- for (var key in keyInfos) {
- var keyInfo = keyInfos[key];
- var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
- var buildEventUi = this.eventUiBuilders[key];
- splitProps[key] = {
- businessHours: keyInfo.businessHours || props.businessHours,
- dateSelection: dateSelections[key] || null,
- eventStore: eventStore,
- eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
- eventDrag: eventDrags[key] || null,
- eventResize: eventResizes[key] || null
- };
- }
- return splitProps;
- };
- Splitter.prototype._splitDateSpan = function (dateSpan) {
- var dateSpans = {};
- if (dateSpan) {
- var keys = this.getKeysForDateSpan(dateSpan);
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
- var key = keys_1[_i];
- dateSpans[key] = dateSpan;
- }
- }
- return dateSpans;
- };
- Splitter.prototype._getKeysForEventDefs = function (eventStore) {
- var _this = this;
- return mapHash(eventStore.defs, function (eventDef) {
- return _this.getKeysForEventDef(eventDef);
- });
- };
- Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
- var defs = eventStore.defs, instances = eventStore.instances;
- var splitStores = {};
- for (var defId in defs) {
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitStores[key]) {
- splitStores[key] = createEmptyEventStore();
- }
- splitStores[key].defs[defId] = defs[defId];
- }
- }
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
- var key = _c[_b];
- if (splitStores[key]) { // must have already been created
- splitStores[key].instances[instanceId] = instance;
- }
- }
- }
- return splitStores;
- };
- Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
- var splitHashes = {};
- for (var defId in eventUiBases) {
- if (defId) { // not the '' key
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitHashes[key]) {
- splitHashes[key] = {};
- }
- splitHashes[key][defId] = eventUiBases[defId];
- }
- }
- }
- return splitHashes;
- };
- Splitter.prototype._splitInteraction = function (interaction) {
- var splitStates = {};
- if (interaction) {
- var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
- );
- // can't rely on defKeys because event data is mutated
- var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
- var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
- var populate = function (key) {
- if (!splitStates[key]) {
- splitStates[key] = {
- affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
- mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
- isEvent: interaction.isEvent,
- origSeg: interaction.origSeg
- };
- }
- };
- for (var key in affectedStores_1) {
- populate(key);
- }
- for (var key in mutatedStores_1) {
- populate(key);
- }
- }
- return splitStates;
- };
- return Splitter;
-}());
-function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
- var baseParts = [];
- if (allUi) {
- baseParts.push(allUi);
- }
- if (eventUiForKey) {
- baseParts.push(eventUiForKey);
- }
- var stuff = {
- '': combineEventUis(baseParts)
- };
- if (individualUi) {
- __assign(stuff, individualUi);
- }
- return stuff;
-}
-
-// Generates HTML for an anchor to another view into the calendar.
-// Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
-// `gotoOptions` can either be a DateMarker, or an object with the form:
-// { date, type, forceOff }
-// `type` is a view-type like "day" or "week". default value is "day".
-// `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
-function buildGotoAnchorHtml(allOptions, dateEnv, gotoOptions, attrs, innerHtml) {
- var date;
- var type;
- var forceOff;
- var finalOptions;
- if (gotoOptions instanceof Date) {
- date = gotoOptions; // a single date-like input
- }
- else {
- date = gotoOptions.date;
- type = gotoOptions.type;
- forceOff = gotoOptions.forceOff;
- }
- finalOptions = {
- date: dateEnv.formatIso(date, { omitTime: true }),
- type: type || 'day'
- };
- if (typeof attrs === 'string') {
- innerHtml = attrs;
- attrs = null;
- }
- attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
- innerHtml = innerHtml || '';
- if (!forceOff && allOptions.navLinks) {
- return '<a' + attrs +
- ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
- innerHtml +
- '</a>';
- }
- else {
- return '<span' + attrs + '>' +
- innerHtml +
- '</span>';
- }
-}
-function getAllDayHtml(allOptions) {
- return allOptions.allDayHtml || htmlEscape(allOptions.allDayText);
-}
-// Computes HTML classNames for a single-day element
-function getDayClasses(date, dateProfile, context, noThemeHighlight) {
- var calendar = context.calendar, options = context.options, theme = context.theme, dateEnv = context.dateEnv;
- var classes = [];
- var todayStart;
- var todayEnd;
- if (!rangeContainsMarker(dateProfile.activeRange, date)) {
- classes.push('fc-disabled-day');
- }
- else {
- classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
- if (options.monthMode &&
- dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
- classes.push('fc-other-month');
- }
- todayStart = startOfDay(calendar.getNow());
- todayEnd = addDays(todayStart, 1);
- if (date < todayStart) {
- classes.push('fc-past');
- }
- else if (date >= todayEnd) {
- classes.push('fc-future');
- }
- else {
- classes.push('fc-today');
- if (noThemeHighlight !== true) {
- classes.push(theme.getClass('today'));
- }
- }
- }
- return classes;
-}
-
-// given a function that resolves a result asynchronously.
-// the function can either call passed-in success and failure callbacks,
-// or it can return a promise.
-// if you need to pass additional params to func, bind them first.
-function unpromisify(func, success, failure) {
- // guard against success/failure callbacks being called more than once
- // and guard against a promise AND callback being used together.
- var isResolved = false;
- var wrappedSuccess = function () {
- if (!isResolved) {
- isResolved = true;
- success.apply(this, arguments);
- }
- };
- var wrappedFailure = function () {
- if (!isResolved) {
- isResolved = true;
- if (failure) {
- failure.apply(this, arguments);
- }
- }
- };
- var res = func(wrappedSuccess, wrappedFailure);
- if (res && typeof res.then === 'function') {
- res.then(wrappedSuccess, wrappedFailure);
- }
-}
-
-var Mixin = /** @class */ (function () {
- function Mixin() {
- }
- // mix into a CLASS
- Mixin.mixInto = function (destClass) {
- this.mixIntoObj(destClass.prototype);
- };
- // mix into ANY object
- Mixin.mixIntoObj = function (destObj) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- if (!destObj[name]) { // if destination doesn't already define it
- destObj[name] = _this.prototype[name];
- }
- });
- };
- /*
- will override existing methods
- TODO: remove! not used anymore
- */
- Mixin.mixOver = function (destClass) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- destClass.prototype[name] = _this.prototype[name];
- });
- };
- return Mixin;
-}());
-
-/*
-USAGE:
- import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
-in class:
- on: EmitterInterface['on']
- one: EmitterInterface['one']
- off: EmitterInterface['off']
- trigger: EmitterInterface['trigger']
- triggerWith: EmitterInterface['triggerWith']
- hasHandlers: EmitterInterface['hasHandlers']
-after class:
- EmitterMixin.mixInto(TheClass)
-*/
-var EmitterMixin = /** @class */ (function (_super) {
- __extends(EmitterMixin, _super);
- function EmitterMixin() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EmitterMixin.prototype.on = function (type, handler) {
- addToHash(this._handlers || (this._handlers = {}), type, handler);
- return this; // for chaining
- };
- // todo: add comments
- EmitterMixin.prototype.one = function (type, handler) {
- addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
- return this; // for chaining
- };
- EmitterMixin.prototype.off = function (type, handler) {
- if (this._handlers) {
- removeFromHash(this._handlers, type, handler);
- }
- if (this._oneHandlers) {
- removeFromHash(this._oneHandlers, type, handler);
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.trigger = function (type) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- this.triggerWith(type, this, args);
- return this; // for chaining
- };
- EmitterMixin.prototype.triggerWith = function (type, context, args) {
- if (this._handlers) {
- applyAll(this._handlers[type], context, args);
- }
- if (this._oneHandlers) {
- applyAll(this._oneHandlers[type], context, args);
- delete this._oneHandlers[type]; // will never fire again
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.hasHandlers = function (type) {
- return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
- (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
- };
- return EmitterMixin;
-}(Mixin));
-function addToHash(hash, type, handler) {
- (hash[type] || (hash[type] = []))
- .push(handler);
-}
-function removeFromHash(hash, type, handler) {
- if (handler) {
- if (hash[type]) {
- hash[type] = hash[type].filter(function (func) {
- return func !== handler;
- });
- }
- }
- else {
- delete hash[type]; // remove all handler funcs for this type
- }
-}
-
-/*
-Records offset information for a set of elements, relative to an origin element.
-Can record the left/right OR the top/bottom OR both.
-Provides methods for querying the cache by position.
-*/
-var PositionCache = /** @class */ (function () {
- function PositionCache(originEl, els, isHorizontal, isVertical) {
- this.originEl = originEl;
- this.els = els;
- this.isHorizontal = isHorizontal;
- this.isVertical = isVertical;
- }
- // Queries the els for coordinates and stores them.
- // Call this method before using and of the get* methods below.
- PositionCache.prototype.build = function () {
- var originEl = this.originEl;
- var originClientRect = this.originClientRect =
- originEl.getBoundingClientRect(); // relative to viewport top-left
- if (this.isHorizontal) {
- this.buildElHorizontals(originClientRect.left);
- }
- if (this.isVertical) {
- this.buildElVerticals(originClientRect.top);
- }
- };
- // Populates the left/right internal coordinate arrays
- PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
- var lefts = [];
- var rights = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- lefts.push(rect.left - originClientLeft);
- rights.push(rect.right - originClientLeft);
- }
- this.lefts = lefts;
- this.rights = rights;
- };
- // Populates the top/bottom internal coordinate arrays
- PositionCache.prototype.buildElVerticals = function (originClientTop) {
- var tops = [];
- var bottoms = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- tops.push(rect.top - originClientTop);
- bottoms.push(rect.bottom - originClientTop);
- }
- this.tops = tops;
- this.bottoms = bottoms;
- };
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.leftToIndex = function (leftPosition) {
- var lefts = this.lefts;
- var rights = this.rights;
- var len = lefts.length;
- var i;
- for (i = 0; i < len; i++) {
- if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
- return i;
- }
- }
- };
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.topToIndex = function (topPosition) {
- var tops = this.tops;
- var bottoms = this.bottoms;
- var len = tops.length;
- var i;
- for (i = 0; i < len; i++) {
- if (topPosition >= tops[i] && topPosition < bottoms[i]) {
- return i;
- }
- }
- };
- // Gets the width of the element at the given index
- PositionCache.prototype.getWidth = function (leftIndex) {
- return this.rights[leftIndex] - this.lefts[leftIndex];
- };
- // Gets the height of the element at the given index
- PositionCache.prototype.getHeight = function (topIndex) {
- return this.bottoms[topIndex] - this.tops[topIndex];
- };
- return PositionCache;
-}());
-
-/*
-An object for getting/setting scroll-related information for an element.
-Internally, this is done very differently for window versus DOM element,
-so this object serves as a common interface.
-*/
-var ScrollController = /** @class */ (function () {
- function ScrollController() {
- }
- ScrollController.prototype.getMaxScrollTop = function () {
- return this.getScrollHeight() - this.getClientHeight();
- };
- ScrollController.prototype.getMaxScrollLeft = function () {
- return this.getScrollWidth() - this.getClientWidth();
- };
- ScrollController.prototype.canScrollVertically = function () {
- return this.getMaxScrollTop() > 0;
- };
- ScrollController.prototype.canScrollHorizontally = function () {
- return this.getMaxScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollUp = function () {
- return this.getScrollTop() > 0;
- };
- ScrollController.prototype.canScrollDown = function () {
- return this.getScrollTop() < this.getMaxScrollTop();
- };
- ScrollController.prototype.canScrollLeft = function () {
- return this.getScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollRight = function () {
- return this.getScrollLeft() < this.getMaxScrollLeft();
- };
- return ScrollController;
-}());
-var ElementScrollController = /** @class */ (function (_super) {
- __extends(ElementScrollController, _super);
- function ElementScrollController(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- ElementScrollController.prototype.getScrollTop = function () {
- return this.el.scrollTop;
- };
- ElementScrollController.prototype.getScrollLeft = function () {
- return this.el.scrollLeft;
- };
- ElementScrollController.prototype.setScrollTop = function (top) {
- this.el.scrollTop = top;
- };
- ElementScrollController.prototype.setScrollLeft = function (left) {
- this.el.scrollLeft = left;
- };
- ElementScrollController.prototype.getScrollWidth = function () {
- return this.el.scrollWidth;
- };
- ElementScrollController.prototype.getScrollHeight = function () {
- return this.el.scrollHeight;
- };
- ElementScrollController.prototype.getClientHeight = function () {
- return this.el.clientHeight;
- };
- ElementScrollController.prototype.getClientWidth = function () {
- return this.el.clientWidth;
- };
- return ElementScrollController;
-}(ScrollController));
-var WindowScrollController = /** @class */ (function (_super) {
- __extends(WindowScrollController, _super);
- function WindowScrollController() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- WindowScrollController.prototype.getScrollTop = function () {
- return window.pageYOffset;
- };
- WindowScrollController.prototype.getScrollLeft = function () {
- return window.pageXOffset;
- };
- WindowScrollController.prototype.setScrollTop = function (n) {
- window.scroll(window.pageXOffset, n);
- };
- WindowScrollController.prototype.setScrollLeft = function (n) {
- window.scroll(n, window.pageYOffset);
- };
- WindowScrollController.prototype.getScrollWidth = function () {
- return document.documentElement.scrollWidth;
- };
- WindowScrollController.prototype.getScrollHeight = function () {
- return document.documentElement.scrollHeight;
- };
- WindowScrollController.prototype.getClientHeight = function () {
- return document.documentElement.clientHeight;
- };
- WindowScrollController.prototype.getClientWidth = function () {
- return document.documentElement.clientWidth;
- };
- return WindowScrollController;
-}(ScrollController));
-
-/*
-Embodies a div that has potential scrollbars
-*/
-var ScrollComponent = /** @class */ (function (_super) {
- __extends(ScrollComponent, _super);
- function ScrollComponent(overflowX, overflowY) {
- var _this = _super.call(this, createElement('div', {
- className: 'fc-scroller'
- })) || this;
- _this.overflowX = overflowX;
- _this.overflowY = overflowY;
- _this.applyOverflow();
- return _this;
- }
- // sets to natural height, unlocks overflow
- ScrollComponent.prototype.clear = function () {
- this.setHeight('auto');
- this.applyOverflow();
- };
- ScrollComponent.prototype.destroy = function () {
- removeElement(this.el);
- };
- // Overflow
- // -----------------------------------------------------------------------------------------------------------------
- ScrollComponent.prototype.applyOverflow = function () {
- applyStyle(this.el, {
- overflowX: this.overflowX,
- overflowY: this.overflowY
- });
- };
- // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
- // Useful for preserving scrollbar widths regardless of future resizes.
- // Can pass in scrollbarWidths for optimization.
- ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
- var overflowX = this.overflowX;
- var overflowY = this.overflowY;
- scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
- if (overflowX === 'auto') {
- overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
- this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- if (overflowY === 'auto') {
- overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
- this.canScrollVertically() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
- };
- ScrollComponent.prototype.setHeight = function (height) {
- applyStyleProp(this.el, 'height', height);
- };
- ScrollComponent.prototype.getScrollbarWidths = function () {
- var edges = computeEdges(this.el);
- return {
- left: edges.scrollbarLeft,
- right: edges.scrollbarRight,
- bottom: edges.scrollbarBottom
- };
- };
- return ScrollComponent;
-}(ElementScrollController));
-
-var Theme = /** @class */ (function () {
- function Theme(calendarOptions) {
- this.calendarOptions = calendarOptions;
- this.processIconOverride();
- }
- Theme.prototype.processIconOverride = function () {
- if (this.iconOverrideOption) {
- this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
- }
- };
- Theme.prototype.setIconOverride = function (iconOverrideHash) {
- var iconClassesCopy;
- var buttonName;
- if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
- iconClassesCopy = __assign({}, this.iconClasses);
- for (buttonName in iconOverrideHash) {
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
- }
- this.iconClasses = iconClassesCopy;
- }
- else if (iconOverrideHash === false) {
- this.iconClasses = {};
- }
- };
- Theme.prototype.applyIconOverridePrefix = function (className) {
- var prefix = this.iconOverridePrefix;
- if (prefix && className.indexOf(prefix) !== 0) { // if not already present
- className = prefix + className;
- }
- return className;
- };
- Theme.prototype.getClass = function (key) {
- return this.classes[key] || '';
- };
- Theme.prototype.getIconClass = function (buttonName) {
- var className = this.iconClasses[buttonName];
- if (className) {
- return this.baseIconClass + ' ' + className;
- }
- return '';
- };
- Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
- var className;
- if (this.iconOverrideCustomButtonOption) {
- className = customButtonProps[this.iconOverrideCustomButtonOption];
- if (className) {
- return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
- }
- }
- return '';
- };
- return Theme;
-}());
-Theme.prototype.classes = {};
-Theme.prototype.iconClasses = {};
-Theme.prototype.baseIconClass = '';
-Theme.prototype.iconOverridePrefix = '';
-
-var guid = 0;
-var ComponentContext = /** @class */ (function () {
- function ComponentContext(calendar, theme, dateEnv, options, view) {
- this.calendar = calendar;
- this.theme = theme;
- this.dateEnv = dateEnv;
- this.options = options;
- this.view = view;
- this.isRtl = options.dir === 'rtl';
- this.eventOrderSpecs = parseFieldSpecs(options.eventOrder);
- this.nextDayThreshold = createDuration(options.nextDayThreshold);
- }
- ComponentContext.prototype.extend = function (options, view) {
- return new ComponentContext(this.calendar, this.theme, this.dateEnv, options || this.options, view || this.view);
- };
- return ComponentContext;
-}());
-var Component = /** @class */ (function () {
- function Component() {
- this.everRendered = false;
- this.uid = String(guid++);
- }
- Component.addEqualityFuncs = function (newFuncs) {
- this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
- };
- Component.prototype.receiveProps = function (props, context) {
- this.receiveContext(context);
- var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
- this.props = comboProps;
- if (anyChanges) {
- if (this.everRendered) {
- this.beforeUpdate();
- }
- this.render(comboProps, context);
- if (this.everRendered) {
- this.afterUpdate();
- }
- }
- this.everRendered = true;
- };
- Component.prototype.receiveContext = function (context) {
- var oldContext = this.context;
- this.context = context;
- if (!oldContext) {
- this.firstContext(context);
- }
- };
- Component.prototype.render = function (props, context) {
- };
- Component.prototype.firstContext = function (context) {
- };
- Component.prototype.beforeUpdate = function () {
- };
- Component.prototype.afterUpdate = function () {
- };
- // after destroy is called, this component won't ever be used again
- Component.prototype.destroy = function () {
- };
- return Component;
-}());
-Component.prototype.equalityFuncs = {};
-/*
-Reuses old values when equal. If anything is unequal, returns newProps as-is.
-Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
-*/
-function recycleProps(oldProps, newProps, equalityFuncs) {
- var comboProps = {}; // some old, some new
- var anyChanges = false;
- for (var key in newProps) {
- if (key in oldProps && (oldProps[key] === newProps[key] ||
- (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
- // equal to old? use old prop
- comboProps[key] = oldProps[key];
- }
- else {
- comboProps[key] = newProps[key];
- anyChanges = true;
- }
- }
- for (var key in oldProps) {
- if (!(key in newProps)) {
- anyChanges = true;
- break;
- }
- }
- return { anyChanges: anyChanges, comboProps: comboProps };
-}
-
-/*
-PURPOSES:
-- hook up to fg, fill, and mirror renderers
-- interface for dragging and hits
-*/
-var DateComponent = /** @class */ (function (_super) {
- __extends(DateComponent, _super);
- function DateComponent(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- DateComponent.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- removeElement(this.el);
- };
- // Hit System
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.buildPositionCaches = function () {
- };
- DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- return null; // this should be abstract
- };
- // Validation
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isInteractionValid = function (interaction) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- var instances = interaction.mutatedEvents.instances;
- if (dateProfile) { // HACK for DayTile
- for (var instanceId in instances) {
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
- return false;
- }
- }
- }
- return isInteractionValid(interaction, calendar);
- };
- DateComponent.prototype.isDateSelectionValid = function (selection) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- if (dateProfile && // HACK for DayTile
- !rangeContainsRange(dateProfile.validRange, selection.range)) {
- return false;
- }
- return isDateSelectionValid(selection, calendar);
- };
- // Pointer Interaction Utils
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isValidSegDownEl = function (el) {
- return !this.props.eventDrag && // HACK
- !this.props.eventResize && // HACK
- !elementClosest(el, '.fc-mirror') &&
- (this.isPopover() || !this.isInPopover(el));
- // ^above line ensures we don't detect a seg interaction within a nested component.
- // it's a HACK because it only supports a popover as the nested component.
- };
- DateComponent.prototype.isValidDateDownEl = function (el) {
- var segEl = elementClosest(el, this.fgSegSelector);
- return (!segEl || segEl.classList.contains('fc-mirror')) &&
- !elementClosest(el, '.fc-more') && // a "more.." link
- !elementClosest(el, 'a[data-goto]') && // a clickable nav link
- !this.isInPopover(el);
- };
- DateComponent.prototype.isPopover = function () {
- return this.el.classList.contains('fc-popover');
- };
- DateComponent.prototype.isInPopover = function (el) {
- return Boolean(elementClosest(el, '.fc-popover'));
- };
- return DateComponent;
-}(Component));
-DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
-DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
-var uid$1 = 0;
-function createPlugin(input) {
- return {
- id: String(uid$1++),
- deps: input.deps || [],
- reducers: input.reducers || [],
- eventDefParsers: input.eventDefParsers || [],
- isDraggableTransformers: input.isDraggableTransformers || [],
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
- dateSelectionTransformers: input.dateSelectionTransformers || [],
- datePointTransforms: input.datePointTransforms || [],
- dateSpanTransforms: input.dateSpanTransforms || [],
- views: input.views || {},
- viewPropsTransformers: input.viewPropsTransformers || [],
- isPropsValid: input.isPropsValid || null,
- externalDefTransforms: input.externalDefTransforms || [],
- eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
- viewContainerModifiers: input.viewContainerModifiers || [],
- eventDropTransformers: input.eventDropTransformers || [],
- componentInteractions: input.componentInteractions || [],
- calendarInteractions: input.calendarInteractions || [],
- themeClasses: input.themeClasses || {},
- eventSourceDefs: input.eventSourceDefs || [],
- cmdFormatter: input.cmdFormatter,
- recurringTypes: input.recurringTypes || [],
- namedTimeZonedImpl: input.namedTimeZonedImpl,
- defaultView: input.defaultView || '',
- elementDraggingImpl: input.elementDraggingImpl,
- optionChangeHandlers: input.optionChangeHandlers || {}
- };
-}
-var PluginSystem = /** @class */ (function () {
- function PluginSystem() {
- this.hooks = {
- reducers: [],
- eventDefParsers: [],
- isDraggableTransformers: [],
- eventDragMutationMassagers: [],
- eventDefMutationAppliers: [],
- dateSelectionTransformers: [],
- datePointTransforms: [],
- dateSpanTransforms: [],
- views: {},
- viewPropsTransformers: [],
- isPropsValid: null,
- externalDefTransforms: [],
- eventResizeJoinTransforms: [],
- viewContainerModifiers: [],
- eventDropTransformers: [],
- componentInteractions: [],
- calendarInteractions: [],
- themeClasses: {},
- eventSourceDefs: [],
- cmdFormatter: null,
- recurringTypes: [],
- namedTimeZonedImpl: null,
- defaultView: '',
- elementDraggingImpl: null,
- optionChangeHandlers: {}
- };
- this.addedHash = {};
- }
- PluginSystem.prototype.add = function (plugin) {
- if (!this.addedHash[plugin.id]) {
- this.addedHash[plugin.id] = true;
- for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
- var dep = _a[_i];
- this.add(dep);
- }
- this.hooks = combineHooks(this.hooks, plugin);
- }
- };
- return PluginSystem;
-}());
-function combineHooks(hooks0, hooks1) {
- return {
- reducers: hooks0.reducers.concat(hooks1.reducers),
- eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
- views: __assign({}, hooks0.views, hooks1.views),
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
- eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
- viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
- themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
- defaultView: hooks0.defaultView || hooks1.defaultView,
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
- optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
- };
-}
-
-var eventSourceDef = {
- ignoreRange: true,
- parseMeta: function (raw) {
- if (Array.isArray(raw)) { // short form
- return raw;
- }
- else if (Array.isArray(raw.events)) {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success) {
- success({
- rawEvents: arg.eventSource.meta
- });
- }
-};
-var ArrayEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef]
-});
-
-var eventSourceDef$1 = {
- parseMeta: function (raw) {
- if (typeof raw === 'function') { // short form
- return raw;
- }
- else if (typeof raw.events === 'function') {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success, failure) {
- var dateEnv = arg.calendar.dateEnv;
- var func = arg.eventSource.meta;
- unpromisify(func.bind(null, {
- start: dateEnv.toDate(arg.range.start),
- end: dateEnv.toDate(arg.range.end),
- startStr: dateEnv.formatIso(arg.range.start),
- endStr: dateEnv.formatIso(arg.range.end),
- timeZone: dateEnv.timeZone
- }), function (rawEvents) {
- success({ rawEvents: rawEvents }); // needs an object response
- }, failure // send errorObj directly to failure callback
- );
- }
-};
-var FuncEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$1]
-});
-
-function requestJson(method, url, params, successCallback, failureCallback) {
- method = method.toUpperCase();
- var body = null;
- if (method === 'GET') {
- url = injectQueryStringParams(url, params);
- }
- else {
- body = encodeParams(params);
- }
- var xhr = new XMLHttpRequest();
- xhr.open(method, url, true);
- if (method !== 'GET') {
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- }
- xhr.onload = function () {
- if (xhr.status >= 200 && xhr.status < 400) {
- try {
- var res = JSON.parse(xhr.responseText);
- successCallback(res, xhr);
- }
- catch (err) {
- failureCallback('Failure parsing JSON', xhr);
- }
- }
- else {
- failureCallback('Request failed', xhr);
- }
- };
- xhr.onerror = function () {
- failureCallback('Request failed', xhr);
- };
- xhr.send(body);
-}
-function injectQueryStringParams(url, params) {
- return url +
- (url.indexOf('?') === -1 ? '?' : '&') +
- encodeParams(params);
-}
-function encodeParams(params) {
- var parts = [];
- for (var key in params) {
- parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
- }
- return parts.join('&');
-}
-
-var eventSourceDef$2 = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') { // short form
- raw = { url: raw };
- }
- else if (!raw || typeof raw !== 'object' || !raw.url) {
- return null;
- }
- return {
- url: raw.url,
- method: (raw.method || 'GET').toUpperCase(),
- extraParams: raw.extraParams,
- startParam: raw.startParam,
- endParam: raw.endParam,
- timeZoneParam: raw.timeZoneParam
- };
- },
- fetch: function (arg, success, failure) {
- var meta = arg.eventSource.meta;
- var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
- requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
- success({ rawEvents: rawEvents, xhr: xhr });
- }, function (errorMessage, xhr) {
- failure({ message: errorMessage, xhr: xhr });
- });
- }
-};
-var JsonFeedEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$2]
-});
-function buildRequestParams(meta, range, calendar) {
- var dateEnv = calendar.dateEnv;
- var startParam;
- var endParam;
- var timeZoneParam;
- var customRequestParams;
- var params = {};
- startParam = meta.startParam;
- if (startParam == null) {
- startParam = calendar.opt('startParam');
- }
- endParam = meta.endParam;
- if (endParam == null) {
- endParam = calendar.opt('endParam');
- }
- timeZoneParam = meta.timeZoneParam;
- if (timeZoneParam == null) {
- timeZoneParam = calendar.opt('timeZoneParam');
- }
- // retrieve any outbound GET/POST data from the options
- if (typeof meta.extraParams === 'function') {
- // supplied as a function that returns a key/value object
- customRequestParams = meta.extraParams();
- }
- else {
- // probably supplied as a straight key/value object
- customRequestParams = meta.extraParams || {};
- }
- __assign(params, customRequestParams);
- params[startParam] = dateEnv.formatIso(range.start);
- params[endParam] = dateEnv.formatIso(range.end);
- if (dateEnv.timeZone !== 'local') {
- params[timeZoneParam] = dateEnv.timeZone;
- }
- return params;
-}
-
-var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- var createMarker = dateEnv.createMarker.bind(dateEnv);
- var processors = {
- daysOfWeek: null,
- startTime: createDuration,
- endTime: createDuration,
- startRecur: createMarker,
- endRecur: createMarker
- };
- var props = refineProps(rawEvent, processors, {}, leftoverProps);
- var anyValid = false;
- for (var propName in props) {
- if (props[propName] != null) {
- anyValid = true;
- break;
- }
- }
- if (anyValid) {
- var duration = null;
- if ('duration' in leftoverProps) {
- duration = createDuration(leftoverProps.duration);
- delete leftoverProps.duration;
- }
- if (!duration && props.startTime && props.endTime) {
- duration = subtractDurations(props.endTime, props.startTime);
- }
- return {
- allDayGuess: Boolean(!props.startTime && !props.endTime),
- duration: duration,
- typeData: props // doesn't need endTime anymore but oh well
- };
- }
- return null;
- },
- expand: function (typeData, framingRange, dateEnv) {
- var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
- if (clippedFramingRange) {
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
- }
- else {
- return [];
- }
- }
-};
-var SimpleRecurrencePlugin = createPlugin({
- recurringTypes: [recurring]
-});
-function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
- var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
- var dayMarker = startOfDay(framingRange.start);
- var endMarker = framingRange.end;
- var instanceStarts = [];
- while (dayMarker < endMarker) {
- var instanceStart
- // if everyday, or this particular day-of-week
- = void 0;
- // if everyday, or this particular day-of-week
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
- if (startTime) {
- instanceStart = dateEnv.add(dayMarker, startTime);
- }
- else {
- instanceStart = dayMarker;
- }
- instanceStarts.push(instanceStart);
- }
- dayMarker = addDays(dayMarker, 1);
- }
- return instanceStarts;
-}
-
-var DefaultOptionChangeHandlers = createPlugin({
- optionChangeHandlers: {
- events: function (events, calendar, deepEqual) {
- handleEventSources([events], calendar, deepEqual);
- },
- eventSources: handleEventSources,
- plugins: handlePlugins
- }
-});
-function handleEventSources(inputs, calendar, deepEqual) {
- var unfoundSources = hashValuesToArray(calendar.state.eventSources);
- var newInputs = [];
- for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
- var input = inputs_1[_i];
- var inputFound = false;
- for (var i = 0; i < unfoundSources.length; i++) {
- if (deepEqual(unfoundSources[i]._raw, input)) {
- unfoundSources.splice(i, 1); // delete
- inputFound = true;
- break;
- }
- }
- if (!inputFound) {
- newInputs.push(input);
- }
- }
- for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
- var unfoundSource = unfoundSources_1[_a];
- calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: unfoundSource.sourceId
- });
- }
- for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
- var newInput = newInputs_1[_b];
- calendar.addEventSource(newInput);
- }
-}
-// shortcoming: won't remove plugins
-function handlePlugins(inputs, calendar) {
- calendar.addPluginInputs(inputs); // will gracefully handle duplicates
-}
-
-var config = {}; // TODO: make these options
-var globalDefaults = {
- defaultRangeSeparator: ' - ',
- titleRangeSeparator: ' \u2013 ',
- defaultTimedEventDuration: '01:00:00',
- defaultAllDayEventDuration: { day: 1 },
- forceEventDuration: false,
- nextDayThreshold: '00:00:00',
- // display
- columnHeader: true,
- defaultView: '',
- aspectRatio: 1.35,
- header: {
- left: 'title',
- center: '',
- right: 'today prev,next'
- },
- weekends: true,
- weekNumbers: false,
- weekNumberCalculation: 'local',
- editable: false,
- // nowIndicator: false,
- scrollTime: '06:00:00',
- minTime: '00:00:00',
- maxTime: '24:00:00',
- showNonCurrentDates: true,
- // event ajax
- lazyFetching: true,
- startParam: 'start',
- endParam: 'end',
- timeZoneParam: 'timeZone',
- timeZone: 'local',
- // allDayDefault: undefined,
- // locale
- locales: [],
- locale: '',
- // dir: will get this from the default locale
- // buttonIcons: null,
- // allows setting a min-height to the event segment to prevent short events overlapping each other
- timeGridEventMinHeight: 0,
- themeSystem: 'standard',
- // eventResizableFromStart: false,
- dragRevertDuration: 500,
- dragScroll: true,
- allDayMaintainDuration: false,
- // selectable: false,
- unselectAuto: true,
- // selectMinDistance: 0,
- dropAccept: '*',
- eventOrder: 'start,-duration,allDay,title',
- // ^ if start tie, longer events go before shorter. final tie-breaker is title text
- // rerenderDelay: null,
- eventLimit: false,
- eventLimitClick: 'popover',
- dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
- handleWindowResize: true,
- windowResizeDelay: 100,
- longPressDelay: 1000,
- eventDragMinDistance: 5 // only applies to mouse
-};
-var rtlDefaults = {
- header: {
- left: 'next,prev today',
- center: '',
- right: 'title'
- },
- buttonIcons: {
- // TODO: make RTL support the responibility of the theme
- prev: 'fc-icon-chevron-right',
- next: 'fc-icon-chevron-left',
- prevYear: 'fc-icon-chevrons-right',
- nextYear: 'fc-icon-chevrons-left'
- }
-};
-var complexOptions = [
- 'header',
- 'footer',
- 'buttonText',
- 'buttonIcons'
-];
-// Merges an array of option objects into a single object
-function mergeOptions(optionObjs) {
- return mergeProps(optionObjs, complexOptions);
-}
-// TODO: move this stuff to a "plugin"-related file...
-var INTERNAL_PLUGINS = [
- ArrayEventSourcePlugin,
- FuncEventSourcePlugin,
- JsonFeedEventSourcePlugin,
- SimpleRecurrencePlugin,
- DefaultOptionChangeHandlers
-];
-function refinePluginDefs(pluginInputs) {
- var plugins = [];
- for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
- var pluginInput = pluginInputs_1[_i];
- if (typeof pluginInput === 'string') {
- var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
- if (!window[globalName]) {
- console.warn('Plugin file not loaded for ' + pluginInput);
- }
- else {
- plugins.push(window[globalName].default); // is an ES6 module
- }
- }
- else {
- plugins.push(pluginInput);
- }
- }
- return INTERNAL_PLUGINS.concat(plugins);
-}
-
-var RAW_EN_LOCALE = {
- code: 'en',
- week: {
- dow: 0,
- doy: 4 // 4 days need to be within the year to be considered the first week
- },
- dir: 'ltr',
- buttonText: {
- prev: 'prev',
- next: 'next',
- prevYear: 'prev year',
- nextYear: 'next year',
- year: 'year',
- today: 'today',
- month: 'month',
- week: 'week',
- day: 'day',
- list: 'list'
- },
- weekLabel: 'W',
- allDayText: 'all-day',
- eventLimitText: 'more',
- noEventsMessage: 'No events to display'
-};
-function parseRawLocales(explicitRawLocales) {
- var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
- var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
- var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
- var allRawLocales = globalArray.concat(// globalArray is low prio
- hashValuesToArray(globalObject), // medium prio
- explicitRawLocales // highest prio
- );
- var rawLocaleMap = {
- en: RAW_EN_LOCALE // necessary?
- };
- for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
- var rawLocale = allRawLocales_1[_i];
- rawLocaleMap[rawLocale.code] = rawLocale;
- }
- return {
- map: rawLocaleMap,
- defaultCode: defaultCode
- };
-}
-function buildLocale(inputSingular, available) {
- if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
- }
- else {
- return queryLocale(inputSingular, available);
- }
-}
-function queryLocale(codeArg, available) {
- var codes = [].concat(codeArg || []); // will convert to array
- var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
- return parseLocale(codeArg, codes, raw);
-}
-function queryRawLocale(codes, available) {
- for (var i = 0; i < codes.length; i++) {
- var parts = codes[i].toLocaleLowerCase().split('-');
- for (var j = parts.length; j > 0; j--) {
- var simpleId = parts.slice(0, j).join('-');
- if (available[simpleId]) {
- return available[simpleId];
- }
- }
- }
- return null;
-}
-function parseLocale(codeArg, codes, raw) {
- var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
- delete merged.code; // don't want this part of the options
- var week = merged.week;
- delete merged.week;
- return {
- codeArg: codeArg,
- codes: codes,
- week: week,
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
- options: merged
- };
-}
-
-var OptionsManager = /** @class */ (function () {
- function OptionsManager(overrides) {
- this.overrides = __assign({}, overrides); // make a copy
- this.dynamicOverrides = {};
- this.compute();
- }
- OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
- if (!Object.keys(updates).length && !removals.length) {
- return;
- }
- var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
- __assign(overrideHash, updates);
- for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
- var propName = removals_1[_i];
- delete overrideHash[propName];
- }
- this.compute();
- };
- // Computes the flattened options hash for the calendar and assigns to `this.options`.
- // Assumes this.overrides and this.dynamicOverrides have already been initialized.
- OptionsManager.prototype.compute = function () {
- // TODO: not a very efficient system
- var locales = firstDefined(// explicit locale option given?
- this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
- var locale = firstDefined(// explicit locales option given?
- this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
- var available = parseRawLocales(locales);
- var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
- var dir = firstDefined(// based on options computed so far, is direction RTL?
- this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
- var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
- this.dirDefaults = dirDefaults;
- this.localeDefaults = localeDefaults;
- this.computed = mergeOptions([
- globalDefaults,
- dirDefaults,
- localeDefaults,
- this.overrides,
- this.dynamicOverrides
- ]);
- };
- return OptionsManager;
-}());
-
-var calendarSystemClassMap = {};
-function registerCalendarSystem(name, theClass) {
- calendarSystemClassMap[name] = theClass;
-}
-function createCalendarSystem(name) {
- return new calendarSystemClassMap[name]();
-}
-var GregorianCalendarSystem = /** @class */ (function () {
- function GregorianCalendarSystem() {
- }
- GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
- return d.getUTCFullYear();
- };
- GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
- return d.getUTCMonth();
- };
- GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
- return d.getUTCDate();
- };
- GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
- return arrayToUtcDate(arr);
- };
- GregorianCalendarSystem.prototype.markerToArray = function (marker) {
- return dateToUtcArray(marker);
- };
- return GregorianCalendarSystem;
-}());
-registerCalendarSystem('gregory', GregorianCalendarSystem);
-
-var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
-function parse(str) {
- var m = ISO_RE.exec(str);
- if (m) {
- var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
- if (isValidDate(marker)) {
- var timeZoneOffset = null;
- if (m[13]) {
- timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
- Number(m[18] || 0));
- }
- return {
- marker: marker,
- isTimeUnspecified: !m[6],
- timeZoneOffset: timeZoneOffset
- };
- }
- }
- return null;
-}
-
-var DateEnv = /** @class */ (function () {
- function DateEnv(settings) {
- var timeZone = this.timeZone = settings.timeZone;
- var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
- }
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
- this.locale = settings.locale;
- this.weekDow = settings.locale.week.dow;
- this.weekDoy = settings.locale.week.doy;
- if (settings.weekNumberCalculation === 'ISO') {
- this.weekDow = 1;
- this.weekDoy = 4;
- }
- if (typeof settings.firstDay === 'number') {
- this.weekDow = settings.firstDay;
- }
- if (typeof settings.weekNumberCalculation === 'function') {
- this.weekNumberFunc = settings.weekNumberCalculation;
- }
- this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
- this.cmdFormatter = settings.cmdFormatter;
- }
- // Creating / Parsing
- DateEnv.prototype.createMarker = function (input) {
- var meta = this.createMarkerMeta(input);
- if (meta === null) {
- return null;
- }
- return meta.marker;
- };
- DateEnv.prototype.createNowMarker = function () {
- if (this.canComputeOffset) {
- return this.timestampToMarker(new Date().valueOf());
- }
- else {
- // if we can't compute the current date val for a timezone,
- // better to give the current local date vals than UTC
- return arrayToUtcDate(dateToLocalArray(new Date()));
- }
- };
- DateEnv.prototype.createMarkerMeta = function (input) {
- if (typeof input === 'string') {
- return this.parse(input);
- }
- var marker = null;
- if (typeof input === 'number') {
- marker = this.timestampToMarker(input);
- }
- else if (input instanceof Date) {
- input = input.valueOf();
- if (!isNaN(input)) {
- marker = this.timestampToMarker(input);
- }
- }
- else if (Array.isArray(input)) {
- marker = arrayToUtcDate(input);
- }
- if (marker === null || !isValidDate(marker)) {
- return null;
- }
- return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
- };
- DateEnv.prototype.parse = function (s) {
- var parts = parse(s);
- if (parts === null) {
- return null;
- }
- var marker = parts.marker;
- var forcedTzo = null;
- if (parts.timeZoneOffset !== null) {
- if (this.canComputeOffset) {
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
- }
- else {
- forcedTzo = parts.timeZoneOffset;
- }
- }
- return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
- };
- // Accessors
- DateEnv.prototype.getYear = function (marker) {
- return this.calendarSystem.getMarkerYear(marker);
- };
- DateEnv.prototype.getMonth = function (marker) {
- return this.calendarSystem.getMarkerMonth(marker);
- };
- // Adding / Subtracting
- DateEnv.prototype.add = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += dur.years;
- a[1] += dur.months;
- a[2] += dur.days;
- a[6] += dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.subtract = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] -= dur.years;
- a[1] -= dur.months;
- a[2] -= dur.days;
- a[6] -= dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addYears = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addMonths = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[1] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- // Diffing Whole Units
- DateEnv.prototype.diffWholeYears = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
- calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
- }
- return null;
- };
- DateEnv.prototype.diffWholeMonths = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
- return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
- (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
- }
- return null;
- };
- // Range / Duration
- DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
- var n = this.diffWholeYears(m0, m1);
- if (n !== null) {
- return { unit: 'year', value: n };
- }
- n = this.diffWholeMonths(m0, m1);
- if (n !== null) {
- return { unit: 'month', value: n };
- }
- n = diffWholeWeeks(m0, m1);
- if (n !== null) {
- return { unit: 'week', value: n };
- }
- n = diffWholeDays(m0, m1);
- if (n !== null) {
- return { unit: 'day', value: n };
- }
- n = diffHours(m0, m1);
- if (isInt(n)) {
- return { unit: 'hour', value: n };
- }
- n = diffMinutes(m0, m1);
- if (isInt(n)) {
- return { unit: 'minute', value: n };
- }
- n = diffSeconds(m0, m1);
- if (isInt(n)) {
- return { unit: 'second', value: n };
- }
- return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
- };
- DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
- // TODO: can use greatestWholeUnit
- var diff;
- if (d.years) {
- diff = this.diffWholeYears(m0, m1);
- if (diff !== null) {
- return diff / asRoughYears(d);
- }
- }
- if (d.months) {
- diff = this.diffWholeMonths(m0, m1);
- if (diff !== null) {
- return diff / asRoughMonths(d);
- }
- }
- if (d.days) {
- diff = diffWholeDays(m0, m1);
- if (diff !== null) {
- return diff / asRoughDays(d);
- }
- }
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
- };
- // Start-Of
- DateEnv.prototype.startOf = function (m, unit) {
- if (unit === 'year') {
- return this.startOfYear(m);
- }
- else if (unit === 'month') {
- return this.startOfMonth(m);
- }
- else if (unit === 'week') {
- return this.startOfWeek(m);
- }
- else if (unit === 'day') {
- return startOfDay(m);
- }
- else if (unit === 'hour') {
- return startOfHour(m);
- }
- else if (unit === 'minute') {
- return startOfMinute(m);
- }
- else if (unit === 'second') {
- return startOfSecond(m);
- }
- };
- DateEnv.prototype.startOfYear = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m)
- ]);
- };
- DateEnv.prototype.startOfMonth = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m)
- ]);
- };
- DateEnv.prototype.startOfWeek = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m),
- m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
- ]);
- };
- // Week Number
- DateEnv.prototype.computeWeekNumber = function (marker) {
- if (this.weekNumberFunc) {
- return this.weekNumberFunc(this.toDate(marker));
- }
- else {
- return weekOfYear(marker, this.weekDow, this.weekDoy);
- }
- };
- // TODO: choke on timeZoneName: long
- DateEnv.prototype.format = function (marker, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- return formatter.format({
- marker: marker,
- timeZoneOffset: dateOptions.forcedTzo != null ?
- dateOptions.forcedTzo :
- this.offsetForMarker(marker)
- }, this);
- };
- DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- if (dateOptions.isEndExclusive) {
- end = addMs(end, -1);
- }
- return formatter.formatRange({
- marker: start,
- timeZoneOffset: dateOptions.forcedStartTzo != null ?
- dateOptions.forcedStartTzo :
- this.offsetForMarker(start)
- }, {
- marker: end,
- timeZoneOffset: dateOptions.forcedEndTzo != null ?
- dateOptions.forcedEndTzo :
- this.offsetForMarker(end)
- }, this);
- };
- DateEnv.prototype.formatIso = function (marker, extraOptions) {
- if (extraOptions === void 0) { extraOptions = {}; }
- var timeZoneOffset = null;
- if (!extraOptions.omitTimeZoneOffset) {
- if (extraOptions.forcedTzo != null) {
- timeZoneOffset = extraOptions.forcedTzo;
- }
- else {
- timeZoneOffset = this.offsetForMarker(marker);
- }
- }
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
- };
- // TimeZone
- DateEnv.prototype.timestampToMarker = function (ms) {
- if (this.timeZone === 'local') {
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
- }
- else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
- return new Date(ms);
- }
- else {
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
- }
- };
- DateEnv.prototype.offsetForMarker = function (m) {
- if (this.timeZone === 'local') {
- return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
- }
- else if (this.timeZone === 'UTC') {
- return 0;
- }
- else if (this.namedTimeZoneImpl) {
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
- }
- return null;
- };
- // Conversion
- DateEnv.prototype.toDate = function (m, forcedTzo) {
- if (this.timeZone === 'local') {
- return arrayToLocalDate(dateToUtcArray(m));
- }
- else if (this.timeZone === 'UTC') {
- return new Date(m.valueOf()); // make sure it's a copy
- }
- else if (!this.namedTimeZoneImpl) {
- return new Date(m.valueOf() - (forcedTzo || 0));
- }
- else {
- return new Date(m.valueOf() -
- this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
- );
- }
- };
- return DateEnv;
-}());
-
-var SIMPLE_SOURCE_PROPS = {
- id: String,
- allDayDefault: Boolean,
- eventDataTransform: Function,
- success: Function,
- failure: Function
-};
-var uid$2 = 0;
-function doesSourceNeedRange(eventSource, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- return !defs[eventSource.sourceDefId].ignoreRange;
-}
-function parseEventSource(raw, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
- var def = defs[i];
- var meta = def.parseMeta(raw);
- if (meta) {
- var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
- res._raw = raw;
- return res;
- }
- }
- return null;
-}
-function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
- var leftovers0 = {};
- var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
- var leftovers1 = {};
- var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
- props.isFetching = false;
- props.latestFetchId = '';
- props.fetchRange = null;
- props.publicId = String(raw.id || '');
- props.sourceId = String(uid$2++);
- props.sourceDefId = sourceDefId;
- props.meta = meta;
- props.ui = ui;
- props.extendedProps = leftovers1;
- return props;
-}
-
-function reduceEventSources (eventSources, action, dateProfile, calendar) {
- switch (action.type) {
- case 'ADD_EVENT_SOURCES': // already parsed
- return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
- case 'REMOVE_EVENT_SOURCE':
- return removeSource(eventSources, action.sourceId);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
- }
- else {
- return eventSources;
- }
- case 'FETCH_EVENT_SOURCES':
- case 'CHANGE_TIMEZONE':
- return fetchSourcesByIds(eventSources, action.sourceIds ?
- arrayToHash(action.sourceIds) :
- excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
- case 'RECEIVE_EVENTS':
- case 'RECEIVE_EVENT_ERROR':
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return {};
- default:
- return eventSources;
- }
-}
-var uid$3 = 0;
-function addSources(eventSourceHash, sources, fetchRange, calendar) {
- var hash = {};
- for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
- var source = sources_1[_i];
- hash[source.sourceId] = source;
- }
- if (fetchRange) {
- hash = fetchDirtySources(hash, fetchRange, calendar);
- }
- return __assign({}, eventSourceHash, hash);
-}
-function removeSource(eventSourceHash, sourceId) {
- return filterHash(eventSourceHash, function (eventSource) {
- return eventSource.sourceId !== sourceId;
- });
-}
-function fetchDirtySources(sourceHash, fetchRange, calendar) {
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
- return isSourceDirty(eventSource, fetchRange, calendar);
- }), fetchRange, calendar);
-}
-function isSourceDirty(eventSource, fetchRange, calendar) {
- if (!doesSourceNeedRange(eventSource, calendar)) {
- return !eventSource.latestFetchId;
- }
- else {
- return !calendar.opt('lazyFetching') ||
- !eventSource.fetchRange ||
- eventSource.isFetching || // always cancel outdated in-progress fetches
- fetchRange.start < eventSource.fetchRange.start ||
- fetchRange.end > eventSource.fetchRange.end;
- }
-}
-function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
- var nextSources = {};
- for (var sourceId in prevSources) {
- var source = prevSources[sourceId];
- if (sourceIdHash[sourceId]) {
- nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
- }
- else {
- nextSources[sourceId] = source;
- }
- }
- return nextSources;
-}
-function fetchSource(eventSource, fetchRange, calendar) {
- var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
- var fetchId = String(uid$3++);
- sourceDef.fetch({
- eventSource: eventSource,
- calendar: calendar,
- range: fetchRange
- }, function (res) {
- var rawEvents = res.rawEvents;
- var calSuccess = calendar.opt('eventSourceSuccess');
- var calSuccessRes;
- var sourceSuccessRes;
- if (eventSource.success) {
- sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
- }
- if (calSuccess) {
- calSuccessRes = calSuccess(rawEvents, res.xhr);
- }
- rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
- calendar.dispatch({
- type: 'RECEIVE_EVENTS',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- rawEvents: rawEvents
- });
- }, function (error) {
- var callFailure = calendar.opt('eventSourceFailure');
- console.warn(error.message, error);
- if (eventSource.failure) {
- eventSource.failure(error);
- }
- if (callFailure) {
- callFailure(error);
- }
- calendar.dispatch({
- type: 'RECEIVE_EVENT_ERROR',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- error: error
- });
- });
- return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
-}
-function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
- var _a;
- var eventSource = sourceHash[sourceId];
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
- }), _a));
- }
- return sourceHash;
-}
-function excludeStaticSources(eventSources, calendar) {
- return filterHash(eventSources, function (eventSource) {
- return doesSourceNeedRange(eventSource, calendar);
- });
-}
-
-var DateProfileGenerator = /** @class */ (function () {
- function DateProfileGenerator(viewSpec, calendar) {
- this.viewSpec = viewSpec;
- this.options = viewSpec.options;
- this.dateEnv = calendar.dateEnv;
- this.calendar = calendar;
- this.initHiddenDays();
- }
- /* Date Range Computation
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
- DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(prevDate, -1);
- };
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
- DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(nextDate, 1);
- };
- // Builds a structure holding dates/ranges for rendering around the given date.
- // Optional direction param indicates whether the date is being incremented/decremented
- // from its previous value. decremented = -1, incremented = 1 (default).
- DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
- if (forceToValid === void 0) { forceToValid = false; }
- var validRange;
- var minTime = null;
- var maxTime = null;
- var currentInfo;
- var isRangeAllDay;
- var renderRange;
- var activeRange;
- var isValid;
- validRange = this.buildValidRange();
- validRange = this.trimHiddenDays(validRange);
- if (forceToValid) {
- currentDate = constrainMarkerToRange(currentDate, validRange);
- }
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
- renderRange = this.trimHiddenDays(renderRange);
- activeRange = renderRange;
- if (!this.options.showNonCurrentDates) {
- activeRange = intersectRanges(activeRange, currentInfo.range);
- }
- minTime = createDuration(this.options.minTime);
- maxTime = createDuration(this.options.maxTime);
- activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
- activeRange = intersectRanges(activeRange, validRange); // might return null
- // it's invalid if the originally requested date is not contained,
- // or if the range is completely outside of the valid range.
- isValid = rangesIntersect(currentInfo.range, validRange);
- return {
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
- // an object with optional start and end properties.
- validRange: validRange,
- // range the view is formally responsible for.
- // for example, a month view might have 1st-31st, excluding padded dates
- currentRange: currentInfo.range,
- // name of largest unit being displayed, like "month" or "week"
- currentRangeUnit: currentInfo.unit,
- isRangeAllDay: isRangeAllDay,
- // dates that display events and accept drag-n-drop
- // will be `null` if no dates accept events
- activeRange: activeRange,
- // date range with a rendered skeleton
- // includes not-active days that need some sort of DOM
- renderRange: renderRange,
- // Duration object that denotes the first visible time of any given day
- minTime: minTime,
- // Duration object that denotes the exclusive visible end time of any given day
- maxTime: maxTime,
- isValid: isValid,
- // how far the current date will move for a prev/next operation
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
- // pass a fallback (might be null) ^
- };
- };
- // Builds an object with optional start/end properties.
- // Indicates the minimum/maximum dates to display.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildValidRange = function () {
- return this.getRangeOption('validRange', this.calendar.getNow()) ||
- { start: null, end: null }; // completely open-ended
- };
- // Builds a structure with info about the "current" range, the range that is
- // highlighted as being the current month for example.
- // See build() for a description of `direction`.
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
- DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
- var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
- var duration = null;
- var unit = null;
- var range = null;
- var dayCount;
- if (viewSpec.duration) {
- duration = viewSpec.duration;
- unit = viewSpec.durationUnit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- else if ((dayCount = this.options.dayCount)) {
- unit = 'day';
- range = this.buildRangeFromDayCount(date, direction, dayCount);
- }
- else if ((range = this.buildCustomVisibleRange(date))) {
- unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
- }
- else {
- duration = this.getFallbackDuration();
- unit = greatestDurationDenominator(duration).unit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- return { duration: duration, unit: unit, range: range };
- };
- DateProfileGenerator.prototype.getFallbackDuration = function () {
- return createDuration({ day: 1 });
- };
- // Returns a new activeRange to have time values (un-ambiguate)
- // minTime or maxTime causes the range to expand.
- DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
- var dateEnv = this.dateEnv;
- var start = range.start;
- var end = range.end;
- if (this.viewSpec.class.prototype.usesMinMaxTime) {
- // expand active range if minTime is negative (why not when positive?)
- if (asRoughDays(minTime) < 0) {
- start = startOfDay(start); // necessary?
- start = dateEnv.add(start, minTime);
- }
- // expand active range if maxTime is beyond one day (why not when positive?)
- if (asRoughDays(maxTime) > 1) {
- end = startOfDay(end); // necessary?
- end = addDays(end, -1);
- end = dateEnv.add(end, maxTime);
- }
- }
- return { start: start, end: end };
- };
- // Builds the "current" range when it is specified as an explicit duration.
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
- DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
- var dateEnv = this.dateEnv;
- var alignment = this.options.dateAlignment;
- var dateIncrementInput;
- var dateIncrementDuration;
- var start;
- var end;
- var res;
- // compute what the alignment should be
- if (!alignment) {
- dateIncrementInput = this.options.dateIncrement;
- if (dateIncrementInput) {
- dateIncrementDuration = createDuration(dateIncrementInput);
- // use the smaller of the two units
- if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
- alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
- }
- else {
- alignment = unit;
- }
- }
- else {
- alignment = unit;
- }
- }
- // if the view displays a single day or smaller
- if (asRoughDays(duration) <= 1) {
- if (this.isHiddenDay(start)) {
- start = this.skipHiddenDays(start, direction);
- start = startOfDay(start);
- }
- }
- function computeRes() {
- start = dateEnv.startOf(date, alignment);
- end = dateEnv.add(start, duration);
- res = { start: start, end: end };
- }
- computeRes();
- // if range is completely enveloped by hidden days, go past the hidden days
- if (!this.trimHiddenDays(res)) {
- date = this.skipHiddenDays(date, direction);
- computeRes();
- }
- return res;
- };
- // Builds the "current" range when a dayCount is specified.
- DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
- var dateEnv = this.dateEnv;
- var customAlignment = this.options.dateAlignment;
- var runningCount = 0;
- var start = date;
- var end;
- if (customAlignment) {
- start = dateEnv.startOf(start, customAlignment);
- }
- start = startOfDay(start);
- start = this.skipHiddenDays(start, direction);
- end = start;
- do {
- end = addDays(end, 1);
- if (!this.isHiddenDay(end)) {
- runningCount++;
- }
- } while (runningCount < dayCount);
- return { start: start, end: end };
- };
- // Builds a normalized range object for the "visible" range,
- // which is a way to define the currentRange and activeRange at the same time.
- DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
- var dateEnv = this.dateEnv;
- var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
- if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
- return null;
- }
- return visibleRange;
- };
- // Computes the range that will represent the element/cells for *rendering*,
- // but which may have voided days/times.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- return currentRange;
- };
- // Compute the duration value that should be added/substracted to the current date
- // when a prev/next operation happens.
- DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
- var dateIncrementInput = this.options.dateIncrement;
- var customAlignment;
- if (dateIncrementInput) {
- return createDuration(dateIncrementInput);
- }
- else if ((customAlignment = this.options.dateAlignment)) {
- return createDuration(1, customAlignment);
- }
- else if (fallback) {
- return fallback;
- }
- else {
- return createDuration({ days: 1 });
- }
- };
- // Arguments after name will be forwarded to a hypothetical function value
- // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
- // Always clone your objects if you fear mutation.
- DateProfileGenerator.prototype.getRangeOption = function (name) {
- var otherArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- otherArgs[_i - 1] = arguments[_i];
- }
- var val = this.options[name];
- if (typeof val === 'function') {
- val = val.apply(null, otherArgs);
- }
- if (val) {
- val = parseRange(val, this.dateEnv);
- }
- if (val) {
- val = computeVisibleDayRange(val);
- }
- return val;
- };
- /* Hidden Days
- ------------------------------------------------------------------------------------------------------------------*/
- // Initializes internal variables related to calculating hidden days-of-week
- DateProfileGenerator.prototype.initHiddenDays = function () {
- var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
- var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
- var dayCnt = 0;
- var i;
- if (this.options.weekends === false) {
- hiddenDays.push(0, 6); // 0=sunday, 6=saturday
- }
- for (i = 0; i < 7; i++) {
- if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
- dayCnt++;
- }
- }
- if (!dayCnt) {
- throw new Error('invalid hiddenDays'); // all days were hidden? bad.
- }
- this.isHiddenDayHash = isHiddenDayHash;
- };
- // Remove days from the beginning and end of the range that are computed as hidden.
- // If the whole range is trimmed off, returns null
- DateProfileGenerator.prototype.trimHiddenDays = function (range) {
- var start = range.start;
- var end = range.end;
- if (start) {
- start = this.skipHiddenDays(start);
- }
- if (end) {
- end = this.skipHiddenDays(end, -1, true);
- }
- if (start == null || end == null || start < end) {
- return { start: start, end: end };
- }
- return null;
- };
- // Is the current day hidden?
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
- DateProfileGenerator.prototype.isHiddenDay = function (day) {
- if (day instanceof Date) {
- day = day.getUTCDay();
- }
- return this.isHiddenDayHash[day];
- };
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
- // DOES NOT CONSIDER validRange!
- // If the initial value of `date` is not a hidden day, don't do anything.
- // Pass `isExclusive` as `true` if you are dealing with an end date.
- // `inc` defaults to `1` (increment one day forward each time)
- DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
- if (inc === void 0) { inc = 1; }
- if (isExclusive === void 0) { isExclusive = false; }
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
- date = addDays(date, inc);
- }
- return date;
- };
- return DateProfileGenerator;
-}());
-// TODO: find a way to avoid comparing DateProfiles. it's tedious
-function isDateProfilesEqual(p0, p1) {
- return rangesEqual(p0.validRange, p1.validRange) &&
- rangesEqual(p0.activeRange, p1.activeRange) &&
- rangesEqual(p0.renderRange, p1.renderRange) &&
- durationsEqual(p0.minTime, p1.minTime) &&
- durationsEqual(p0.maxTime, p1.maxTime);
- /*
- TODO: compare more?
- currentRange: DateRange
- currentRangeUnit: string
- isRangeAllDay: boolean
- isValid: boolean
- dateIncrement: Duration
- */
-}
-
-function reduce (state, action, calendar) {
- var viewType = reduceViewType(state.viewType, action);
- var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
- var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
- var nextState = __assign({}, state, { viewType: viewType,
- dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
- for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
- var reducerFunc = _a[_i];
- nextState = reducerFunc(nextState, action, calendar);
- }
- // console.log(action.type, nextState)
- return nextState;
-}
-function reduceViewType(currentViewType, action) {
- switch (action.type) {
- case 'SET_VIEW_TYPE':
- return action.viewType;
- default:
- return currentViewType;
- }
-}
-function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
- var newDateProfile;
- switch (action.type) {
- case 'PREV':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
- break;
- case 'NEXT':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
- break;
- case 'SET_DATE':
- if (!currentDateProfile.activeRange ||
- !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
- newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
- );
- }
- break;
- case 'SET_VIEW_TYPE':
- var generator = calendar.dateProfileGenerators[viewType];
- if (!generator) {
- throw new Error(viewType ?
- 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
- 'No available FullCalendar view plugins.');
- }
- newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
- );
- break;
- }
- if (newDateProfile &&
- newDateProfile.isValid &&
- !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
- return newDateProfile;
- }
- else {
- return currentDateProfile;
- }
-}
-function reduceCurrentDate(currentDate, action, dateProfile) {
- switch (action.type) {
- case 'PREV':
- case 'NEXT':
- if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return currentDate;
- }
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- var newDate = action.dateMarker || currentDate;
- if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return newDate;
- }
- default:
- return currentDate;
- }
-}
-function reduceDateSelection(currentSelection, action, calendar) {
- switch (action.type) {
- case 'SELECT_DATES':
- return action.selection;
- case 'UNSELECT_DATES':
- return null;
- default:
- return currentSelection;
- }
-}
-function reduceSelectedEvent(currentInstanceId, action) {
- switch (action.type) {
- case 'SELECT_EVENT':
- return action.eventInstanceId;
- case 'UNSELECT_EVENT':
- return '';
- default:
- return currentInstanceId;
- }
-}
-function reduceEventDrag(currentDrag, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_DRAG':
- var newDrag = action.state;
- return {
- affectedEvents: newDrag.affectedEvents,
- mutatedEvents: newDrag.mutatedEvents,
- isEvent: newDrag.isEvent,
- origSeg: newDrag.origSeg
- };
- case 'UNSET_EVENT_DRAG':
- return null;
- default:
- return currentDrag;
- }
-}
-function reduceEventResize(currentResize, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_RESIZE':
- var newResize = action.state;
- return {
- affectedEvents: newResize.affectedEvents,
- mutatedEvents: newResize.mutatedEvents,
- isEvent: newResize.isEvent,
- origSeg: newResize.origSeg
- };
- case 'UNSET_EVENT_RESIZE':
- return null;
- default:
- return currentResize;
- }
-}
-function computeLoadingLevel(eventSources) {
- var cnt = 0;
- for (var sourceId in eventSources) {
- if (eventSources[sourceId].isFetching) {
- cnt++;
- }
- }
- return cnt;
-}
-
-var STANDARD_PROPS = {
- start: null,
- end: null,
- allDay: Boolean
-};
-function parseDateSpan(raw, dateEnv, defaultDuration) {
- var span = parseOpenDateSpan(raw, dateEnv);
- var range = span.range;
- if (!range.start) {
- return null;
- }
- if (!range.end) {
- if (defaultDuration == null) {
- return null;
- }
- else {
- range.end = dateEnv.add(range.start, defaultDuration);
- }
- }
- return span;
-}
-/*
-TODO: somehow combine with parseRange?
-Will return null if the start/end props were present but parsed invalidly.
-*/
-function parseOpenDateSpan(raw, dateEnv) {
- var leftovers = {};
- var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
- var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
- var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
- var allDay = standardProps.allDay;
- if (allDay == null) {
- allDay = (startMeta && startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- // use this leftover object as the selection object
- leftovers.range = {
- start: startMeta ? startMeta.marker : null,
- end: endMeta ? endMeta.marker : null
- };
- leftovers.allDay = allDay;
- return leftovers;
-}
-function isDateSpansEqual(span0, span1) {
- return rangesEqual(span0.range, span1.range) &&
- span0.allDay === span1.allDay &&
- isSpanPropsEqual(span0, span1);
-}
-// the NON-DATE-RELATED props
-function isSpanPropsEqual(span0, span1) {
- for (var propName in span1) {
- if (propName !== 'range' && propName !== 'allDay') {
- if (span0[propName] !== span1[propName]) {
- return false;
- }
- }
- }
- // are there any props that span0 has that span1 DOESN'T have?
- // both have range/allDay, so no need to special-case.
- for (var propName in span0) {
- if (!(propName in span1)) {
- return false;
- }
- }
- return true;
-}
-function buildDateSpanApi(span, dateEnv) {
- return {
- start: dateEnv.toDate(span.range.start),
- end: dateEnv.toDate(span.range.end),
- startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
- allDay: span.allDay
- };
-}
-function buildDatePointApi(span, dateEnv) {
- return {
- date: dateEnv.toDate(span.range.start),
- dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- allDay: span.allDay
- };
-}
-function fabricateEventRange(dateSpan, eventUiBases, calendar) {
- var def = parseEventDef({ editable: false }, '', // sourceId
- dateSpan.allDay, true, // hasEnd
- calendar);
- return {
- def: def,
- ui: compileEventUi(def, eventUiBases),
- instance: createEventInstance(def.defId, dateSpan.range),
- range: dateSpan.range,
- isStart: true,
- isEnd: true
- };
-}
-
-function compileViewDefs(defaultConfigs, overrideConfigs) {
- var hash = {};
- var viewType;
- for (viewType in defaultConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- for (viewType in overrideConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- return hash;
-}
-function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- if (hash[viewType]) {
- return hash[viewType];
- }
- var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- if (viewDef) {
- hash[viewType] = viewDef;
- }
- return viewDef;
-}
-function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- var defaultConfig = defaultConfigs[viewType];
- var overrideConfig = overrideConfigs[viewType];
- var queryProp = function (name) {
- return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
- };
- var theClass = queryProp('class');
- var superType = queryProp('superType');
- if (!superType && theClass) {
- superType =
- findViewNameBySubclass(theClass, overrideConfigs) ||
- findViewNameBySubclass(theClass, defaultConfigs);
- }
- var superDef = null;
- if (superType) {
- if (superType === viewType) {
- throw new Error('Can\'t have a custom view type that references itself');
- }
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
- }
- if (!theClass && superDef) {
- theClass = superDef.class;
- }
- if (!theClass) {
- return null; // don't throw a warning, might be settings for a single-unit view
- }
- return {
- type: viewType,
- class: theClass,
- defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
- overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
- };
-}
-function findViewNameBySubclass(viewSubclass, configs) {
- var superProto = Object.getPrototypeOf(viewSubclass.prototype);
- for (var viewType in configs) {
- var parsed = configs[viewType];
- // need DIRECT subclass, so instanceof won't do it
- if (parsed.class && parsed.class.prototype === superProto) {
- return viewType;
- }
- }
- return '';
-}
-
-function parseViewConfigs(inputs) {
- return mapHash(inputs, parseViewConfig);
-}
-var VIEW_DEF_PROPS = {
- type: String,
- class: null
-};
-function parseViewConfig(input) {
- if (typeof input === 'function') {
- input = { class: input };
- }
- var options = {};
- var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
- return {
- superType: props.type,
- class: props.class,
- options: options
- };
-}
-
-function buildViewSpecs(defaultInputs, optionsManager) {
- var defaultConfigs = parseViewConfigs(defaultInputs);
- var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
- var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
- return mapHash(viewDefs, function (viewDef) {
- return buildViewSpec(viewDef, overrideConfigs, optionsManager);
- });
-}
-function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
- var durationInput = viewDef.overrides.duration ||
- viewDef.defaults.duration ||
- optionsManager.dynamicOverrides.duration ||
- optionsManager.overrides.duration;
- var duration = null;
- var durationUnit = '';
- var singleUnit = '';
- var singleUnitOverrides = {};
- if (durationInput) {
- duration = createDuration(durationInput);
- if (duration) { // valid?
- var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
- durationUnit = denom.unit;
- if (denom.value === 1) {
- singleUnit = durationUnit;
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
- }
- }
- }
- var queryButtonText = function (options) {
- var buttonTextMap = options.buttonText || {};
- var buttonTextKey = viewDef.defaults.buttonTextKey;
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
- return buttonTextMap[buttonTextKey];
- }
- if (buttonTextMap[viewDef.type] != null) {
- return buttonTextMap[viewDef.type];
- }
- if (buttonTextMap[singleUnit] != null) {
- return buttonTextMap[singleUnit];
- }
- };
- return {
- type: viewDef.type,
- class: viewDef.class,
- duration: duration,
- durationUnit: durationUnit,
- singleUnit: singleUnit,
- options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
- buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
- queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
- viewDef.overrides.buttonText,
- buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
- queryButtonText(optionsManager.dirDefaults) ||
- viewDef.defaults.buttonText ||
- queryButtonText(globalDefaults) ||
- viewDef.type // fall back to given view name
- };
-}
-
-var Toolbar = /** @class */ (function (_super) {
- __extends(Toolbar, _super);
- function Toolbar(extraClassName) {
- var _this = _super.call(this) || this;
- _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
- _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
- _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
- _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
- _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
- _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
- _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
- return _this;
- }
- Toolbar.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this._renderLayout.unrender(); // should unrender everything else
- removeElement(this.el);
- };
- Toolbar.prototype.render = function (props) {
- this._renderLayout(props.layout);
- this._updateTitle(props.title);
- this._updateActiveButton(props.activeButton);
- this._updateToday(props.isTodayEnabled);
- this._updatePrev(props.isPrevEnabled);
- this._updateNext(props.isNextEnabled);
- };
- Toolbar.prototype.renderLayout = function (layout) {
- var el = this.el;
- this.viewsWithButtons = [];
- appendToElement(el, this.renderSection('left', layout.left));
- appendToElement(el, this.renderSection('center', layout.center));
- appendToElement(el, this.renderSection('right', layout.right));
- };
- Toolbar.prototype.unrenderLayout = function () {
- this.el.innerHTML = '';
- };
- Toolbar.prototype.renderSection = function (position, buttonStr) {
- var _this = this;
- var _a = this.context, theme = _a.theme, calendar = _a.calendar;
- var optionsManager = calendar.optionsManager;
- var viewSpecs = calendar.viewSpecs;
- var sectionEl = createElement('div', { className: 'fc-' + position });
- var calendarCustomButtons = optionsManager.computed.customButtons || {};
- var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
- var calendarButtonText = optionsManager.computed.buttonText || {};
- if (buttonStr) {
- buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
- var groupChildren = [];
- var isOnlyButtons = true;
- var groupEl;
- buttonGroupStr.split(',').forEach(function (buttonName, j) {
- var customButtonProps;
- var viewSpec;
- var buttonClick;
- var buttonIcon; // only one of these will be set
- var buttonText; // "
- var buttonInnerHtml;
- var buttonClasses;
- var buttonEl;
- var buttonAriaAttr;
- if (buttonName === 'title') {
- groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
- isOnlyButtons = false;
- }
- else {
- if ((customButtonProps = calendarCustomButtons[buttonName])) {
- buttonClick = function (ev) {
- if (customButtonProps.click) {
- customButtonProps.click.call(buttonEl, ev);
- }
- };
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = customButtonProps.text);
- }
- else if ((viewSpec = viewSpecs[buttonName])) {
- _this.viewsWithButtons.push(buttonName);
- buttonClick = function () {
- calendar.changeView(buttonName);
- };
- (buttonText = viewSpec.buttonTextOverride) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = viewSpec.buttonTextDefault);
- }
- else if (calendar[buttonName]) { // a calendar method
- buttonClick = function () {
- calendar[buttonName]();
- };
- (buttonText = calendarButtonTextOverrides[buttonName]) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = calendarButtonText[buttonName]);
- // ^ everything else is considered default
- }
- if (buttonClick) {
- buttonClasses = [
- 'fc-' + buttonName + '-button',
- theme.getClass('button')
- ];
- if (buttonText) {
- buttonInnerHtml = htmlEscape(buttonText);
- buttonAriaAttr = '';
- }
- else if (buttonIcon) {
- buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
- buttonAriaAttr = ' aria-label="' + buttonName + '"';
- }
- buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
- '<button type="button" class="' + buttonClasses.join(' ') + '"' +
- buttonAriaAttr +
- '>' + buttonInnerHtml + '</button>');
- buttonEl.addEventListener('click', buttonClick);
- groupChildren.push(buttonEl);
- }
- }
- });
- if (groupChildren.length > 1) {
- groupEl = document.createElement('div');
- var buttonGroupClassName = theme.getClass('buttonGroup');
- if (isOnlyButtons && buttonGroupClassName) {
- groupEl.classList.add(buttonGroupClassName);
- }
- appendToElement(groupEl, groupChildren);
- sectionEl.appendChild(groupEl);
- }
- else {
- appendToElement(sectionEl, groupChildren); // 1 or 0 children
- }
- });
- }
- return sectionEl;
- };
- Toolbar.prototype.updateToday = function (isTodayEnabled) {
- this.toggleButtonEnabled('today', isTodayEnabled);
- };
- Toolbar.prototype.updatePrev = function (isPrevEnabled) {
- this.toggleButtonEnabled('prev', isPrevEnabled);
- };
- Toolbar.prototype.updateNext = function (isNextEnabled) {
- this.toggleButtonEnabled('next', isNextEnabled);
- };
- Toolbar.prototype.updateTitle = function (text) {
- findElements(this.el, 'h2').forEach(function (titleEl) {
- titleEl.innerText = text;
- });
- };
- Toolbar.prototype.updateActiveButton = function (buttonName) {
- var theme = this.context.theme;
- var className = theme.getClass('buttonActive');
- findElements(this.el, 'button').forEach(function (buttonEl) {
- if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
- buttonEl.classList.add(className);
- }
- else {
- buttonEl.classList.remove(className);
- }
- });
- };
- Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
- findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
- buttonEl.disabled = !bool;
- });
- };
- return Toolbar;
-}(Component));
-
-var CalendarComponent = /** @class */ (function (_super) {
- __extends(CalendarComponent, _super);
- function CalendarComponent(el) {
- var _this = _super.call(this) || this;
- _this.elClassNames = [];
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.renderToolbars = memoizeRendering(_this._renderToolbars, _this._unrenderToolbars, [_this.renderSkeleton]);
- _this.buildComponentContext = memoize(buildComponentContext);
- _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
- _this.el = el;
- _this.computeTitle = memoize(computeTitle);
- _this.parseBusinessHours = memoize(function (input) {
- return parseBusinessHours(input, _this.context.calendar);
- });
- return _this;
- }
- CalendarComponent.prototype.render = function (props, context) {
- this.freezeHeight();
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
- this.renderSkeleton(context);
- this.renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, title);
- this.renderView(props, title);
- this.updateSize();
- this.thawHeight();
- };
- CalendarComponent.prototype.destroy = function () {
- if (this.header) {
- this.header.destroy();
- }
- if (this.footer) {
- this.footer.destroy();
- }
- this.renderSkeleton.unrender(); // will call destroyView
- _super.prototype.destroy.call(this);
- };
- CalendarComponent.prototype._renderSkeleton = function (context) {
- this.updateElClassNames(context);
- prependToElement(this.el, this.contentEl = createElement('div', { className: 'fc-view-container' }));
- var calendar = context.calendar;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
- var modifyViewContainer = _a[_i];
- modifyViewContainer(this.contentEl, calendar);
- }
- };
- CalendarComponent.prototype._unrenderSkeleton = function () {
- // weird to have this here
- if (this.view) {
- this.savedScroll = this.view.queryScroll();
- this.view.destroy();
- this.view = null;
- }
- removeElement(this.contentEl);
- this.removeElClassNames();
- };
- CalendarComponent.prototype.removeElClassNames = function () {
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.remove(className);
- }
- this.elClassNames = [];
- };
- CalendarComponent.prototype.updateElClassNames = function (context) {
- this.removeElClassNames();
- var theme = context.theme, options = context.options;
- this.elClassNames = [
- 'fc',
- 'fc-' + options.dir,
- theme.getClass('widget')
- ];
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.add(className);
- }
- };
- CalendarComponent.prototype._renderToolbars = function (viewSpec, dateProfile, currentDate, title) {
- var _a = this, context = _a.context, header = _a.header, footer = _a.footer;
- var options = context.options, calendar = context.calendar;
- var headerLayout = options.header;
- var footerLayout = options.footer;
- var dateProfileGenerator = this.props.dateProfileGenerator;
- var now = calendar.getNow();
- var todayInfo = dateProfileGenerator.build(now);
- var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
- var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
- var toolbarProps = {
- title: title,
- activeButton: viewSpec.type,
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
- isPrevEnabled: prevInfo.isValid,
- isNextEnabled: nextInfo.isValid
- };
- if (headerLayout) {
- if (!header) {
- header = this.header = new Toolbar('fc-header-toolbar');
- prependToElement(this.el, header.el);
- }
- header.receiveProps(__assign({ layout: headerLayout }, toolbarProps), context);
- }
- else if (header) {
- header.destroy();
- header = this.header = null;
- }
- if (footerLayout) {
- if (!footer) {
- footer = this.footer = new Toolbar('fc-footer-toolbar');
- appendToElement(this.el, footer.el);
- }
- footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps), context);
- }
- else if (footer) {
- footer.destroy();
- footer = this.footer = null;
- }
- };
- CalendarComponent.prototype._unrenderToolbars = function () {
- if (this.header) {
- this.header.destroy();
- this.header = null;
- }
- if (this.footer) {
- this.footer.destroy();
- this.footer = null;
- }
- };
- CalendarComponent.prototype.renderView = function (props, title) {
- var view = this.view;
- var _a = this.context, calendar = _a.calendar, options = _a.options;
- var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
- if (!view || view.viewSpec !== viewSpec) {
- if (view) {
- view.destroy();
- }
- view = this.view = new viewSpec['class'](viewSpec, this.contentEl);
- if (this.savedScroll) {
- view.addScroll(this.savedScroll, true);
- this.savedScroll = null;
- }
- }
- view.title = title; // for the API
- var viewProps = {
- dateProfileGenerator: dateProfileGenerator,
- dateProfile: props.dateProfile,
- businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- dateSelection: props.dateSelection,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize
- };
- var transformers = this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, options));
- }
- view.receiveProps(viewProps, this.buildComponentContext(this.context, viewSpec, view));
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.updateSize = function (isResize) {
- if (isResize === void 0) { isResize = false; }
- var view = this.view;
- if (!view) {
- return; // why?
- }
- if (isResize || this.isHeightAuto == null) {
- this.computeHeightVars();
- }
- view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
- view.updateNowIndicator(); // we need to guarantee this will run after updateSize
- view.popScroll(isResize);
- };
- CalendarComponent.prototype.computeHeightVars = function () {
- var calendar = this.context.calendar; // yuck. need to handle dynamic options
- var heightInput = calendar.opt('height');
- var contentHeightInput = calendar.opt('contentHeight');
- this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
- if (typeof contentHeightInput === 'number') { // exists and not 'auto'
- this.viewHeight = contentHeightInput;
- }
- else if (typeof contentHeightInput === 'function') { // exists and is a function
- this.viewHeight = contentHeightInput();
- }
- else if (typeof heightInput === 'number') { // exists and not 'auto'
- this.viewHeight = heightInput - this.queryToolbarsHeight();
- }
- else if (typeof heightInput === 'function') { // exists and is a function
- this.viewHeight = heightInput() - this.queryToolbarsHeight();
- }
- else if (heightInput === 'parent') { // set to height of parent element
- var parentEl = this.el.parentNode;
- this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
- }
- else {
- this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
- Math.max(calendar.opt('aspectRatio'), .5));
- }
- };
- CalendarComponent.prototype.queryToolbarsHeight = function () {
- var height = 0;
- if (this.header) {
- height += computeHeightAndMargins(this.header.el);
- }
- if (this.footer) {
- height += computeHeightAndMargins(this.footer.el);
- }
- return height;
- };
- // Height "Freezing"
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.freezeHeight = function () {
- applyStyle(this.el, {
- height: this.el.getBoundingClientRect().height,
- overflow: 'hidden'
- });
- };
- CalendarComponent.prototype.thawHeight = function () {
- applyStyle(this.el, {
- height: '',
- overflow: ''
- });
- };
- return CalendarComponent;
-}(Component));
-// Title and Date Formatting
-// -----------------------------------------------------------------------------------------------------------------
-// Computes what the title at the top of the calendar should be for this view
-function computeTitle(dateProfile, viewOptions) {
- var range;
- // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
- range = dateProfile.currentRange;
- }
- else { // for day units or smaller, use the actual day range
- range = dateProfile.activeRange;
- }
- return this.context.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
-}
-// Generates the format string that should be used to generate the title for the current date range.
-// Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
-function computeTitleFormat(dateProfile) {
- var currentRangeUnit = dateProfile.currentRangeUnit;
- if (currentRangeUnit === 'year') {
- return { year: 'numeric' };
- }
- else if (currentRangeUnit === 'month') {
- return { year: 'numeric', month: 'long' }; // like "September 2014"
- }
- else {
- var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
- if (days !== null && days > 1) {
- // multi-day range. shorter, like "Sep 9 - 10 2014"
- return { year: 'numeric', month: 'short', day: 'numeric' };
- }
- else {
- // one day. longer, like "September 9 2014"
- return { year: 'numeric', month: 'long', day: 'numeric' };
- }
- }
-}
-// build a context scoped to the view
-function buildComponentContext(context, viewSpec, view) {
- return context.extend(viewSpec.options, view);
-}
-// Plugin
-// -----------------------------------------------------------------------------------------------------------------
-function buildViewPropTransformers(theClasses) {
- return theClasses.map(function (theClass) {
- return new theClass();
- });
-}
-
-var Interaction = /** @class */ (function () {
- function Interaction(settings) {
- this.component = settings.component;
- }
- Interaction.prototype.destroy = function () {
- };
- return Interaction;
-}());
-function parseInteractionSettings(component, input) {
- return {
- component: component,
- el: input.el,
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
- };
-}
-function interactionSettingsToStore(settings) {
- var _a;
- return _a = {},
- _a[settings.component.uid] = settings,
- _a;
-}
-// global state
-var interactionSettingsStore = {};
-
-/*
-Detects when the user clicks on an event within a DateComponent
-*/
-var EventClicking = /** @class */ (function (_super) {
- __extends(EventClicking, _super);
- function EventClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handleSegClick = function (ev, segEl) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (seg && // might be the <div> surrounding the more link
- component.isValidSegDownEl(ev.target)) {
- // our way to simulate a link click for elements that can't be <a> tags
- // grab before trigger fired in case trigger trashes DOM thru rerendering
- var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
- var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
- calendar.publiclyTrigger('eventClick', [
- {
- el: segEl,
- event: new EventApi(component.context.calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- if (url && !ev.defaultPrevented) {
- window.location.href = url;
- }
- }
- };
- var component = settings.component;
- _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
- return _this;
- }
- return EventClicking;
-}(Interaction));
-
-/*
-Triggers events and adds/removes core classNames when the user's pointer
-enters/leaves event-elements of a component.
-*/
-var EventHovering = /** @class */ (function (_super) {
- __extends(EventHovering, _super);
- function EventHovering(settings) {
- var _this = _super.call(this, settings) || this;
- // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
- _this.handleEventElRemove = function (el) {
- if (el === _this.currentSegEl) {
- _this.handleSegLeave(null, _this.currentSegEl);
- }
- };
- _this.handleSegEnter = function (ev, segEl) {
- if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
- segEl.classList.add('fc-allow-mouse-resize');
- _this.currentSegEl = segEl;
- _this.triggerEvent('eventMouseEnter', ev, segEl);
- }
- };
- _this.handleSegLeave = function (ev, segEl) {
- if (_this.currentSegEl) {
- segEl.classList.remove('fc-allow-mouse-resize');
- _this.currentSegEl = null;
- _this.triggerEvent('eventMouseLeave', ev, segEl);
- }
- };
- var component = settings.component;
- _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
- // how to make sure component already has context?
- component.context.calendar.on('eventElRemove', _this.handleEventElRemove);
- return _this;
- }
- EventHovering.prototype.destroy = function () {
- this.removeHoverListeners();
- this.component.context.calendar.off('eventElRemove', this.handleEventElRemove);
- };
- EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
- var component = this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (!ev || component.isValidSegDownEl(ev.target)) {
- calendar.publiclyTrigger(publicEvName, [
- {
- el: segEl,
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- }
- };
- return EventHovering;
-}(Interaction));
-
-var StandardTheme = /** @class */ (function (_super) {
- __extends(StandardTheme, _super);
- function StandardTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return StandardTheme;
-}(Theme));
-StandardTheme.prototype.classes = {
- widget: 'fc-unthemed',
- widgetHeader: 'fc-widget-header',
- widgetContent: 'fc-widget-content',
- buttonGroup: 'fc-button-group',
- button: 'fc-button fc-button-primary',
- buttonActive: 'fc-button-active',
- popoverHeader: 'fc-widget-header',
- popoverContent: 'fc-widget-content',
- // day grid
- headerRow: 'fc-widget-header',
- dayRow: 'fc-widget-content',
- // list view
- listView: 'fc-widget-content'
-};
-StandardTheme.prototype.baseIconClass = 'fc-icon';
-StandardTheme.prototype.iconClasses = {
- close: 'fc-icon-x',
- prev: 'fc-icon-chevron-left',
- next: 'fc-icon-chevron-right',
- prevYear: 'fc-icon-chevrons-left',
- nextYear: 'fc-icon-chevrons-right'
-};
-StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
-StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
-StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
-var Calendar = /** @class */ (function () {
- function Calendar(el, overrides) {
- var _this = this;
- this.buildComponentContext = memoize(buildComponentContext$1);
- this.parseRawLocales = memoize(parseRawLocales);
- this.buildLocale = memoize(buildLocale);
- this.buildDateEnv = memoize(buildDateEnv);
- this.buildTheme = memoize(buildTheme);
- this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
- this.buildSelectionConfig = memoize(this._buildSelectionConfig);
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
- this.buildEventUiBases = memoize(buildEventUiBases);
- this.interactionsStore = {};
- this.actionQueue = [];
- this.isReducing = false;
- // isDisplaying: boolean = false // installed in DOM? accepting renders?
- this.needsRerender = false; // needs a render?
- this.isRendering = false; // currently in the executeRender function?
- this.renderingPauseDepth = 0;
- this.buildDelayedRerender = memoize(buildDelayedRerender);
- this.afterSizingTriggers = {};
- this.isViewUpdated = false;
- this.isDatesUpdated = false;
- this.isEventsUpdated = false;
- this.el = el;
- this.optionsManager = new OptionsManager(overrides || {});
- this.pluginSystem = new PluginSystem();
- // only do once. don't do in handleOptions. because can't remove plugins
- this.addPluginInputs(this.optionsManager.computed.plugins || []);
- this.handleOptions(this.optionsManager.computed);
- this.publiclyTrigger('_init'); // for tests
- this.hydrate();
- this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
- .map(function (calendarInteractionClass) {
- return new calendarInteractionClass(_this);
- });
- }
- Calendar.prototype.addPluginInputs = function (pluginInputs) {
- var pluginDefs = refinePluginDefs(pluginInputs);
- for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
- var pluginDef = pluginDefs_1[_i];
- this.pluginSystem.add(pluginDef);
- }
- };
- Object.defineProperty(Calendar.prototype, "view", {
- // public API
- get: function () {
- return this.component ? this.component.view : null;
- },
- enumerable: true,
- configurable: true
- });
- // Public API for rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.render = function () {
- if (!this.component) {
- this.component = new CalendarComponent(this.el);
- this.renderableEventStore = createEmptyEventStore();
- this.bindHandlers();
- this.executeRender();
- }
- else {
- this.requestRerender();
- }
- };
- Calendar.prototype.destroy = function () {
- if (this.component) {
- this.unbindHandlers();
- this.component.destroy(); // don't null-out. in case API needs access
- this.component = null; // umm ???
- for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
- var interaction = _a[_i];
- interaction.destroy();
- }
- this.publiclyTrigger('_destroyed');
- }
- };
- // Handlers
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.bindHandlers = function () {
- var _this = this;
- // event delegation for nav links
- this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
- var gotoOptions = anchorEl.getAttribute('data-goto');
- gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
- var dateEnv = _this.dateEnv;
- var dateMarker = dateEnv.createMarker(gotoOptions.date);
- var viewType = gotoOptions.type;
- // property like "navLinkDayClick". might be a string or a function
- var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
- if (typeof customAction === 'function') {
- customAction(dateEnv.toDate(dateMarker), ev);
- }
- else {
- if (typeof customAction === 'string') {
- viewType = customAction;
- }
- _this.zoomTo(dateMarker, viewType);
- }
- });
- if (this.opt('handleWindowResize')) {
- window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
- this.windowResize.bind(this), this.opt('windowResizeDelay')));
- }
- };
- Calendar.prototype.unbindHandlers = function () {
- this.removeNavLinkListener();
- if (this.windowResizeProxy) {
- window.removeEventListener('resize', this.windowResizeProxy);
- this.windowResizeProxy = null;
- }
- };
- // Dispatcher
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hydrate = function () {
- var _this = this;
- this.state = this.buildInitialState();
- var rawSources = this.opt('eventSources') || [];
- var singleRawSource = this.opt('events');
- var sources = []; // parsed
- if (singleRawSource) {
- rawSources.unshift(singleRawSource);
- }
- for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
- var rawSource = rawSources_1[_i];
- var source = parseEventSource(rawSource, this);
- if (source) {
- sources.push(source);
- }
- }
- this.batchRendering(function () {
- _this.dispatch({ type: 'INIT' }); // pass in sources here?
- _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
- });
- });
- };
- Calendar.prototype.buildInitialState = function () {
- return {
- viewType: null,
- loadingLevel: 0,
- eventSourceLoadingLevel: 0,
- currentDate: this.getInitialDate(),
- dateProfile: null,
- eventSources: {},
- eventStore: createEmptyEventStore(),
- dateSelection: null,
- eventSelection: '',
- eventDrag: null,
- eventResize: null
- };
- };
- Calendar.prototype.dispatch = function (action) {
- this.actionQueue.push(action);
- if (!this.isReducing) {
- this.isReducing = true;
- var oldState = this.state;
- while (this.actionQueue.length) {
- this.state = this.reduce(this.state, this.actionQueue.shift(), this);
- }
- var newState = this.state;
- this.isReducing = false;
- if (!oldState.loadingLevel && newState.loadingLevel) {
- this.publiclyTrigger('loading', [true]);
- }
- else if (oldState.loadingLevel && !newState.loadingLevel) {
- this.publiclyTrigger('loading', [false]);
- }
- var view = this.component && this.component.view;
- if (oldState.eventStore !== newState.eventStore) {
- if (oldState.eventStore) {
- this.isEventsUpdated = true;
- }
- }
- if (oldState.dateProfile !== newState.dateProfile) {
- if (oldState.dateProfile && view) { // why would view be null!?
- this.publiclyTrigger('datesDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isDatesUpdated = true;
- }
- if (oldState.viewType !== newState.viewType) {
- if (oldState.viewType && view) { // why would view be null!?
- this.publiclyTrigger('viewSkeletonDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isViewUpdated = true;
- }
- this.requestRerender();
- }
- };
- Calendar.prototype.reduce = function (state, action, calendar) {
- return reduce(state, action, calendar);
- };
- // Render Queue
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.requestRerender = function () {
- this.needsRerender = true;
- this.delayedRerender(); // will call a debounced-version of tryRerender
- };
- Calendar.prototype.tryRerender = function () {
- if (this.component && // must be accepting renders
- this.needsRerender && // indicates that a rerender was requested
- !this.renderingPauseDepth && // not paused
- !this.isRendering // not currently in the render loop
- ) {
- this.executeRender();
- }
- };
- Calendar.prototype.batchRendering = function (func) {
- this.renderingPauseDepth++;
- func();
- this.renderingPauseDepth--;
- if (this.needsRerender) {
- this.requestRerender();
- }
- };
- // Rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.executeRender = function () {
- // clear these BEFORE the render so that new values will accumulate during render
- this.needsRerender = false;
- this.isRendering = true;
- this.renderComponent();
- this.isRendering = false;
- // received a rerender request while rendering
- if (this.needsRerender) {
- this.delayedRerender();
- }
- };
- /*
- don't call this directly. use executeRender instead
- */
- Calendar.prototype.renderComponent = function () {
- var _a = this, state = _a.state, component = _a.component;
- var viewType = state.viewType;
- var viewSpec = this.viewSpecs[viewType];
- if (!viewSpec) {
- throw new Error("View type \"" + viewType + "\" is not valid");
- }
- // if event sources are still loading and progressive rendering hasn't been enabled,
- // keep rendering the last fully loaded set of events
- var renderableEventStore = this.renderableEventStore =
- (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
- this.renderableEventStore :
- state.eventStore;
- var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
- var eventUiBySource = this.buildEventUiBySource(state.eventSources);
- var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfileGenerator: this.dateProfileGenerators[viewType], dateProfile: state.dateProfile, eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }), this.buildComponentContext(this.theme, this.dateEnv, this.optionsManager.computed));
- if (this.isViewUpdated) {
- this.isViewUpdated = false;
- this.publiclyTrigger('viewSkeletonRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isDatesUpdated) {
- this.isDatesUpdated = false;
- this.publiclyTrigger('datesRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isEventsUpdated) {
- this.isEventsUpdated = false;
- }
- this.releaseAfterSizingTriggers();
- };
- // Options
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.setOption = function (name, val) {
- var _a;
- this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
- };
- Calendar.prototype.getOption = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.opt = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.viewOpt = function (name) {
- return this.viewOpts()[name];
- };
- Calendar.prototype.viewOpts = function () {
- return this.viewSpecs[this.state.viewType].options;
- };
- /*
- handles option changes (like a diff)
- */
- Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
- var _this = this;
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
- var normalUpdates = {};
- var specialUpdates = {};
- var oldDateEnv = this.dateEnv; // do this before handleOptions
- var isTimeZoneDirty = false;
- var isSizeDirty = false;
- var anyDifficultOptions = Boolean(removals.length);
- for (var name_1 in updates) {
- if (changeHandlers[name_1]) {
- specialUpdates[name_1] = updates[name_1];
- }
- else {
- normalUpdates[name_1] = updates[name_1];
- }
- }
- for (var name_2 in normalUpdates) {
- if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
- isSizeDirty = true;
- }
- else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
- else {
- anyDifficultOptions = true;
- if (name_2 === 'timeZone') {
- isTimeZoneDirty = true;
- }
- }
- }
- this.optionsManager.mutate(normalUpdates, removals, isDynamic);
- if (anyDifficultOptions) {
- this.handleOptions(this.optionsManager.computed);
- }
- this.batchRendering(function () {
- if (anyDifficultOptions) {
- if (isTimeZoneDirty) {
- _this.dispatch({
- type: 'CHANGE_TIMEZONE',
- oldDateEnv: oldDateEnv
- });
- }
- /* HACK
- has the same effect as calling this.requestRerender()
- but recomputes the state's dateProfile
- */
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.state.viewType
- });
- }
- else if (isSizeDirty) {
- _this.updateSize();
- }
- // special updates
- if (deepEqual) {
- for (var name_3 in specialUpdates) {
- changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
- }
- }
- });
- };
- /*
- rebuilds things based off of a complete set of refined options
- */
- Calendar.prototype.handleOptions = function (options) {
- var _this = this;
- var pluginHooks = this.pluginSystem.hooks;
- this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
- this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
- this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
- this.theme = this.buildTheme(options);
- var available = this.parseRawLocales(options.locales);
- this.availableRawLocales = available.map;
- var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
- this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
- this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
- // ineffecient to do every time?
- this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
- // ineffecient to do every time?
- this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
- return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
- });
- };
- Calendar.prototype.getAvailableLocaleCodes = function () {
- return Object.keys(this.availableRawLocales);
- };
- Calendar.prototype._buildSelectionConfig = function (rawOpts) {
- return processScopedUiProps('select', rawOpts, this);
- };
- Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
- if (rawOpts.editable) { // so 'editable' affected events
- rawOpts = __assign({}, rawOpts, { eventEditable: true });
- }
- return processScopedUiProps('event', rawOpts, this);
- };
- // Trigger
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hasPublicHandlers = function (name) {
- return this.hasHandlers(name) ||
- this.opt(name); // handler specified in options
- };
- Calendar.prototype.publiclyTrigger = function (name, args) {
- var optHandler = this.opt(name);
- this.triggerWith(name, this, args);
- if (optHandler) {
- return optHandler.apply(this, args);
- }
- };
- Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
- var afterSizingTriggers = this.afterSizingTriggers;
- (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
- };
- Calendar.prototype.releaseAfterSizingTriggers = function () {
- var afterSizingTriggers = this.afterSizingTriggers;
- for (var name_4 in afterSizingTriggers) {
- for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
- var args = _a[_i];
- this.publiclyTrigger(name_4, args);
- }
- }
- this.afterSizingTriggers = {};
- };
- // View
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a boolean about whether the view is okay to instantiate at some point
- Calendar.prototype.isValidViewType = function (viewType) {
- return Boolean(this.viewSpecs[viewType]);
- };
- Calendar.prototype.changeView = function (viewType, dateOrRange) {
- var dateMarker = null;
- if (dateOrRange) {
- if (dateOrRange.start && dateOrRange.end) { // a range
- this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
- this.handleOptions(this.optionsManager.computed); // ...but yuck
- }
- else { // a date
- dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
- }
- }
- this.unselect();
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: viewType,
- dateMarker: dateMarker
- });
- };
- // Forces navigation to a view for the given date.
- // `viewType` can be a specific view name or a generic one like "week" or "day".
- // needs to change
- Calendar.prototype.zoomTo = function (dateMarker, viewType) {
- var spec;
- viewType = viewType || 'day'; // day is default zoom
- spec = this.viewSpecs[viewType] ||
- this.getUnitViewSpec(viewType);
- this.unselect();
- if (spec) {
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: spec.type,
- dateMarker: dateMarker
- });
- }
- else {
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: dateMarker
- });
- }
- };
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
- // Preference is given to views that have corresponding buttons.
- Calendar.prototype.getUnitViewSpec = function (unit) {
- var component = this.component;
- var viewTypes = [];
- var i;
- var spec;
- // put views that have buttons first. there will be duplicates, but oh
- if (component.header) {
- viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
- }
- if (component.footer) {
- viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
- }
- for (var viewType in this.viewSpecs) {
- viewTypes.push(viewType);
- }
- for (i = 0; i < viewTypes.length; i++) {
- spec = this.viewSpecs[viewTypes[i]];
- if (spec) {
- if (spec.singleUnit === unit) {
- return spec;
- }
- }
- }
- };
- // Current Date
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getInitialDate = function () {
- var defaultDateInput = this.opt('defaultDate');
- // compute the initial ambig-timezone date
- if (defaultDateInput != null) {
- return this.dateEnv.createMarker(defaultDateInput);
- }
- else {
- return this.getNow(); // getNow already returns unzoned
- }
- };
- Calendar.prototype.prev = function () {
- this.unselect();
- this.dispatch({ type: 'PREV' });
- };
- Calendar.prototype.next = function () {
- this.unselect();
- this.dispatch({ type: 'NEXT' });
- };
- Calendar.prototype.prevYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
- });
- };
- Calendar.prototype.nextYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
- });
- };
- Calendar.prototype.today = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.getNow()
- });
- };
- Calendar.prototype.gotoDate = function (zonedDateInput) {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.createMarker(zonedDateInput)
- });
- };
- Calendar.prototype.incrementDate = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // else, warn about invalid input?
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.add(this.state.currentDate, delta)
- });
- }
- };
- // for external API
- Calendar.prototype.getDate = function () {
- return this.dateEnv.toDate(this.state.currentDate);
- };
- // Date Formatting Utils
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.formatDate = function (d, formatter) {
- var dateEnv = this.dateEnv;
- return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
- };
- // `settings` is for formatter AND isEndExclusive
- Calendar.prototype.formatRange = function (d0, d1, settings) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
- };
- Calendar.prototype.formatIso = function (d, omitTime) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.windowResize = function (ev) {
- if (!this.isHandlingWindowResize &&
- this.component && // why?
- ev.target === window // not a jqui resize event
- ) {
- this.isHandlingWindowResize = true;
- this.updateSize();
- this.publiclyTrigger('windowResize', [this.view]);
- this.isHandlingWindowResize = false;
- }
- };
- Calendar.prototype.updateSize = function () {
- if (this.component) { // when?
- this.component.updateSize(true);
- }
- };
- // Component Registration
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
- var settings = parseInteractionSettings(component, settingsInput);
- var DEFAULT_INTERACTIONS = [
- EventClicking,
- EventHovering
- ];
- var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
- var interactions = interactionClasses.map(function (interactionClass) {
- return new interactionClass(settings);
- });
- this.interactionsStore[component.uid] = interactions;
- interactionSettingsStore[component.uid] = settings;
- };
- Calendar.prototype.unregisterInteractiveComponent = function (component) {
- for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
- var listener = _a[_i];
- listener.destroy();
- }
- delete this.interactionsStore[component.uid];
- delete interactionSettingsStore[component.uid];
- };
- // Date Selection / Event Selection / DayClick
- // -----------------------------------------------------------------------------------------------------------------
- // this public method receives start/end dates in any format, with any timezone
- // NOTE: args were changed from v3
- Calendar.prototype.select = function (dateOrObj, endDate) {
- var selectionInput;
- if (endDate == null) {
- if (dateOrObj.start != null) {
- selectionInput = dateOrObj;
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: null
- };
- }
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: endDate
- };
- }
- var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
- );
- if (selection) { // throw parse error otherwise?
- this.dispatch({ type: 'SELECT_DATES', selection: selection });
- this.triggerDateSelect(selection);
- }
- };
- // public method
- Calendar.prototype.unselect = function (pev) {
- if (this.state.dateSelection) {
- this.dispatch({ type: 'UNSELECT_DATES' });
- this.triggerDateUnselect(pev);
- }
- };
- Calendar.prototype.triggerDateSelect = function (selection, pev) {
- var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
- this.publiclyTrigger('select', [arg]);
- };
- Calendar.prototype.triggerDateUnselect = function (pev) {
- this.publiclyTrigger('unselect', [
- {
- jsEvent: pev ? pev.origEvent : null,
- view: this.view
- }
- ]);
- };
- // TODO: receive pev?
- Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
- var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
- view: view });
- this.publiclyTrigger('dateClick', [arg]);
- };
- Calendar.prototype.buildDatePointApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
- return props;
- };
- Calendar.prototype.buildDateSpanApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
- return props;
- };
- // Date Utils
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
- Calendar.prototype.getNow = function () {
- var now = this.opt('now');
- if (typeof now === 'function') {
- now = now();
- }
- if (now == null) {
- return this.dateEnv.createNowMarker();
- }
- return this.dateEnv.createMarker(now);
- };
- // Event-Date Utilities
- // -----------------------------------------------------------------------------------------------------------------
- // Given an event's allDay status and start date, return what its fallback end date should be.
- // TODO: rename to computeDefaultEventEnd
- Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
- var end = marker;
- if (allDay) {
- end = startOfDay(end);
- end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
- }
- else {
- end = this.dateEnv.add(end, this.defaultTimedEventDuration);
- }
- return end;
- };
- // Public Events API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.addEvent = function (eventInput, sourceInput) {
- if (eventInput instanceof EventApi) {
- var def = eventInput._def;
- var instance = eventInput._instance;
- // not already present? don't want to add an old snapshot
- if (!this.state.eventStore.defs[def.defId]) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
- });
- }
- return eventInput;
- }
- var sourceId;
- if (sourceInput instanceof EventSourceApi) {
- sourceId = sourceInput.internalEventSource.sourceId;
- }
- else if (sourceInput != null) {
- var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
- if (!sourceApi) {
- console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
- return null;
- }
- else {
- sourceId = sourceApi.internalEventSource.sourceId;
- }
- }
- var tuple = parseEvent(eventInput, sourceId, this);
- if (tuple) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore(tuple)
- });
- return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
- }
- return null;
- };
- // TODO: optimize
- Calendar.prototype.getEventById = function (id) {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- id = String(id);
- for (var defId in defs) {
- var def = defs[defId];
- if (def.publicId === id) {
- if (def.recurringDef) {
- return new EventApi(this, def, null);
- }
- else {
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- if (instance.defId === def.defId) {
- return new EventApi(this, def, instance);
- }
- }
- }
- }
- }
- return null;
- };
- Calendar.prototype.getEvents = function () {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- var eventApis = [];
- for (var id in instances) {
- var instance = instances[id];
- var def = defs[instance.defId];
- eventApis.push(new EventApi(this, def, instance));
- }
- return eventApis;
- };
- Calendar.prototype.removeAllEvents = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
- };
- Calendar.prototype.rerenderEvents = function () {
- this.dispatch({ type: 'RESET_EVENTS' });
- };
- // Public Event Sources API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getEventSources = function () {
- var sourceHash = this.state.eventSources;
- var sourceApis = [];
- for (var internalId in sourceHash) {
- sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
- }
- return sourceApis;
- };
- Calendar.prototype.getEventSourceById = function (id) {
- var sourceHash = this.state.eventSources;
- id = String(id);
- for (var sourceId in sourceHash) {
- if (sourceHash[sourceId].publicId === id) {
- return new EventSourceApi(this, sourceHash[sourceId]);
- }
- }
- return null;
- };
- Calendar.prototype.addEventSource = function (sourceInput) {
- if (sourceInput instanceof EventSourceApi) {
- // not already present? don't want to add an old snapshot
- if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
- this.dispatch({
- type: 'ADD_EVENT_SOURCES',
- sources: [sourceInput.internalEventSource]
- });
- }
- return sourceInput;
- }
- var eventSource = parseEventSource(sourceInput, this);
- if (eventSource) { // TODO: error otherwise?
- this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
- return new EventSourceApi(this, eventSource);
- }
- return null;
- };
- Calendar.prototype.removeAllEventSources = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
- };
- Calendar.prototype.refetchEvents = function () {
- this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
- };
- // Scroll
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.scrollToTime = function (timeInput) {
- var duration = createDuration(timeInput);
- if (duration) {
- this.component.view.scrollToDuration(duration);
- }
- };
- return Calendar;
-}());
-EmitterMixin.mixInto(Calendar);
-// for memoizers
-// -----------------------------------------------------------------------------------------------------------------
-function buildComponentContext$1(theme, dateEnv, options) {
- return new ComponentContext(this, theme, dateEnv, options, null);
-}
-function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
- return new DateEnv({
- calendarSystem: 'gregory',
- timeZone: timeZone,
- namedTimeZoneImpl: namedTimeZoneImpl,
- locale: locale,
- weekNumberCalculation: weekNumberCalculation,
- firstDay: firstDay,
- weekLabel: weekLabel,
- cmdFormatter: cmdFormatter
- });
-}
-function buildTheme(calendarOptions) {
- var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
- return new themeClass(calendarOptions);
-}
-function buildDelayedRerender(wait) {
- var func = this.tryRerender.bind(this);
- if (wait != null) {
- func = debounce(func, wait);
- }
- return func;
-}
-function buildEventUiBySource(eventSources) {
- return mapHash(eventSources, function (eventSource) {
- return eventSource.ui;
- });
-}
-function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
- var eventUiBases = { '': eventUiSingleBase };
- for (var defId in eventDefs) {
- var def = eventDefs[defId];
- if (def.sourceId && eventUiBySource[def.sourceId]) {
- eventUiBases[defId] = eventUiBySource[def.sourceId];
- }
- }
- return eventUiBases;
-}
-
-var View = /** @class */ (function (_super) {
- __extends(View, _super);
- function View(viewSpec, parentEl) {
- var _this = _super.call(this, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' })) || this;
- _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
- _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
- _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
- _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
- _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
- _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
- _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
- _this.viewSpec = viewSpec;
- _this.type = viewSpec.type;
- parentEl.appendChild(_this.el);
- _this.initialize();
- return _this;
- }
- View.prototype.initialize = function () {
- };
- Object.defineProperty(View.prototype, "activeStart", {
- // Date Setting/Unsetting
- // -----------------------------------------------------------------------------------------------------------------
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "activeEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentStart", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);
- },
- enumerable: true,
- configurable: true
- });
- // General Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.render = function (props, context) {
- this.renderDatesMem(props.dateProfile);
- this.renderBusinessHoursMem(props.businessHours);
- this.renderDateSelectionMem(props.dateSelection);
- this.renderEventsMem(props.eventStore);
- this.renderEventSelectionMem(props.eventSelection);
- this.renderEventDragMem(props.eventDrag);
- this.renderEventResizeMem(props.eventResize);
- };
- View.prototype.beforeUpdate = function () {
- this.addScroll(this.queryScroll());
- };
- View.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderDatesMem.unrender(); // should unrender everything else
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- var calendar = this.context.calendar;
- if (isResize) {
- this.addScroll(this.queryScroll()); // NOTE: same code as in beforeUpdate
- }
- if (isResize || // HACKS...
- calendar.isViewUpdated ||
- calendar.isDatesUpdated ||
- calendar.isEventsUpdated) {
- // sort of the catch-all sizing
- // anything that might cause dimension changes
- this.updateBaseSize(isResize, viewHeight, isAuto);
- }
- // NOTE: popScroll is called by CalendarComponent
- };
- View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- };
- // Date Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDatesWrap = function (dateProfile) {
- this.renderDates(dateProfile);
- this.addScroll({
- duration: createDuration(this.context.options.scrollTime)
- });
- };
- View.prototype.unrenderDatesWrap = function () {
- this.stopNowIndicator();
- this.unrenderDates();
- };
- View.prototype.renderDates = function (dateProfile) { };
- View.prototype.unrenderDates = function () { };
- // Business Hours
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderBusinessHours = function (businessHours) { };
- View.prototype.unrenderBusinessHours = function () { };
- // Date Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDateSelectionWrap = function (selection) {
- if (selection) {
- this.renderDateSelection(selection);
- }
- };
- View.prototype.unrenderDateSelectionWrap = function (selection) {
- if (selection) {
- this.unrenderDateSelection(selection);
- }
- };
- View.prototype.renderDateSelection = function (selection) { };
- View.prototype.unrenderDateSelection = function (selection) { };
- // Event Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEvents = function (eventStore) { };
- View.prototype.unrenderEvents = function () { };
- // util for subclasses
- View.prototype.sliceEvents = function (eventStore, allDay) {
- var props = this.props;
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.context.nextDayThreshold : null).fg;
- };
- // Event Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.renderEventSelection(instanceId);
- }
- };
- View.prototype.unrenderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.unrenderEventSelection(instanceId);
- }
- };
- View.prototype.renderEventSelection = function (instanceId) { };
- View.prototype.unrenderEventSelection = function (instanceId) { };
- // Event Drag
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventDragWrap = function (state) {
- if (state) {
- this.renderEventDrag(state);
- }
- };
- View.prototype.unrenderEventDragWrap = function (state) {
- if (state) {
- this.unrenderEventDrag(state);
- }
- };
- View.prototype.renderEventDrag = function (state) { };
- View.prototype.unrenderEventDrag = function (state) { };
- // Event Resize
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventResizeWrap = function (state) {
- if (state) {
- this.renderEventResize(state);
- }
- };
- View.prototype.unrenderEventResizeWrap = function (state) {
- if (state) {
- this.unrenderEventResize(state);
- }
- };
- View.prototype.renderEventResize = function (state) { };
- View.prototype.unrenderEventResize = function (state) { };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- // Immediately render the current time indicator and begins re-rendering it at an interval,
- // which is defined by this.getNowIndicatorUnit().
- // TODO: somehow do this for the current whole day's background too
- // USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator tho
- View.prototype.startNowIndicator = function (dateProfile, dateProfileGenerator) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, dateEnv = _a.dateEnv, options = _a.options;
- var unit;
- var update;
- var delay; // ms wait value
- if (options.nowIndicator && !this.initialNowDate) {
- unit = this.getNowIndicatorUnit(dateProfile, dateProfileGenerator);
- if (unit) {
- update = this.updateNowIndicator.bind(this);
- this.initialNowDate = calendar.getNow();
- this.initialNowQueriedMs = new Date().valueOf();
- // wait until the beginning of the next interval
- delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
- // TODO: maybe always use setTimeout, waiting until start of next unit
- this.nowIndicatorTimeoutID = setTimeout(function () {
- _this.nowIndicatorTimeoutID = null;
- update();
- if (unit === 'second') {
- delay = 1000; // every second
- }
- else {
- delay = 1000 * 60; // otherwise, every minute
- }
- _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
- }, delay);
- }
- // rendering will be initiated in updateSize
- }
- };
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
- // since the initial getNow call.
- View.prototype.updateNowIndicator = function () {
- if (this.props.dateProfile && // a way to determine if dates were rendered yet
- this.initialNowDate // activated before?
- ) {
- this.unrenderNowIndicator(); // won't unrender if unnecessary
- this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
- this.isNowIndicatorRendered = true;
- }
- };
- // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
- // Won't cause side effects if indicator isn't rendered.
- View.prototype.stopNowIndicator = function () {
- if (this.nowIndicatorTimeoutID) {
- clearTimeout(this.nowIndicatorTimeoutID);
- this.nowIndicatorTimeoutID = null;
- }
- if (this.nowIndicatorIntervalID) {
- clearInterval(this.nowIndicatorIntervalID);
- this.nowIndicatorIntervalID = null;
- }
- if (this.isNowIndicatorRendered) {
- this.unrenderNowIndicator();
- this.isNowIndicatorRendered = false;
- }
- };
- View.prototype.getNowIndicatorUnit = function (dateProfile, dateProfileGenerator) {
- // subclasses should implement
- };
- // Renders a current time indicator at the given datetime
- View.prototype.renderNowIndicator = function (date) {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- // Undoes the rendering actions from renderNowIndicator
- View.prototype.unrenderNowIndicator = function () {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- /* Scroller
- ------------------------------------------------------------------------------------------------------------------*/
- View.prototype.addScroll = function (scroll, isForced) {
- if (isForced) {
- scroll.isForced = isForced;
- }
- __assign(this.queuedScroll || (this.queuedScroll = {}), scroll);
- };
- View.prototype.popScroll = function (isResize) {
- this.applyQueuedScroll(isResize);
- this.queuedScroll = null;
- };
- View.prototype.applyQueuedScroll = function (isResize) {
- if (this.queuedScroll) {
- this.applyScroll(this.queuedScroll, isResize);
- }
- };
- View.prototype.queryScroll = function () {
- var scroll = {};
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.queryDateScroll());
- }
- return scroll;
- };
- View.prototype.applyScroll = function (scroll, isResize) {
- var duration = scroll.duration, isForced = scroll.isForced;
- if (duration != null && !isForced) {
- delete scroll.duration;
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.computeDateScroll(duration));
- }
- }
- if (this.props.dateProfile) { // dates rendered yet?
- this.applyDateScroll(scroll);
- }
- };
- View.prototype.computeDateScroll = function (duration) {
- return {}; // subclasses must implement
- };
- View.prototype.queryDateScroll = function () {
- return {}; // subclasses must implement
- };
- View.prototype.applyDateScroll = function (scroll) {
- // subclasses must implement
- };
- // for API
- View.prototype.scrollToDuration = function (duration) {
- this.applyScroll({ duration: duration }, false);
- };
- return View;
-}(DateComponent));
-EmitterMixin.mixInto(View);
-View.prototype.usesMinMaxTime = false;
-View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
-var FgEventRenderer = /** @class */ (function () {
- function FgEventRenderer() {
- this.segs = [];
- this.isSizeDirty = false;
- }
- FgEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- this.context = context;
- this.rangeUpdated(); // called too frequently :(
- // render an `.el` on each seg
- // returns a subset of the segs. segs that were actually rendered
- segs = this.renderSegEls(segs, mirrorInfo);
- this.segs = segs;
- this.attachSegs(segs, mirrorInfo);
- this.isSizeDirty = true;
- triggerRenderedSegs(this.context, this.segs, Boolean(mirrorInfo));
- };
- FgEventRenderer.prototype.unrender = function (context, _segs, mirrorInfo) {
- triggerWillRemoveSegs(this.context, this.segs, Boolean(mirrorInfo));
- this.detachSegs(this.segs);
- this.segs = [];
- };
- // Updates values that rely on options and also relate to range
- FgEventRenderer.prototype.rangeUpdated = function () {
- var options = this.context.options;
- var displayEventTime;
- var displayEventEnd;
- this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
- displayEventTime = options.displayEventTime;
- if (displayEventTime == null) {
- displayEventTime = this.computeDisplayEventTime(); // might be based off of range
- }
- displayEventEnd = options.displayEventEnd;
- if (displayEventEnd == null) {
- displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
- }
- this.displayEventTime = displayEventTime;
- this.displayEventEnd = displayEventEnd;
- };
- // Renders and assigns an `el` property for each foreground event segment.
- // Only returns segments that successfully rendered.
- FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
- var html = '';
- var i;
- if (segs.length) { // don't build an empty html string
- // build a large concatenation of event segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(segs[i], mirrorInfo);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- segs = filterSegsViaEls(this.context, segs, Boolean(mirrorInfo));
- }
- return segs;
- };
- // Generic utility for generating the HTML classNames for an event segment's element
- FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
- var classes = [
- 'fc-event',
- seg.isStart ? 'fc-start' : 'fc-not-start',
- seg.isEnd ? 'fc-end' : 'fc-not-end'
- ].concat(seg.eventRange.ui.classNames);
- if (isDraggable) {
- classes.push('fc-draggable');
- }
- if (isResizable) {
- classes.push('fc-resizable');
- }
- if (mirrorInfo) {
- classes.push('fc-mirror');
- if (mirrorInfo.isDragging) {
- classes.push('fc-dragging');
- }
- if (mirrorInfo.isResizing) {
- classes.push('fc-resizing');
- }
- }
- return classes;
- };
- // Compute the text that should be displayed on an event's element.
- // `range` can be the Event object itself, or something range-like, with at least a `start`.
- // If event times are disabled, or the event has no time, will return a blank string.
- // If not specified, formatter will default to the eventTimeFormat setting,
- // and displayEnd will default to the displayEventEnd setting.
- FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
- var def = eventRange.def, instance = eventRange.instance;
- return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
- };
- FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
- var dateEnv = this.context.dateEnv;
- if (formatter == null) {
- formatter = this.eventTimeFormat;
- }
- if (displayEnd == null) {
- displayEnd = this.displayEventEnd;
- }
- if (this.displayEventTime && !allDay) {
- if (displayEnd && end) {
- return dateEnv.formatRange(start, end, formatter, {
- forcedStartTzo: forcedStartTzo,
- forcedEndTzo: forcedEndTzo
- });
- }
- else {
- return dateEnv.format(start, formatter, {
- forcedTzo: forcedStartTzo
- });
- }
- }
- return '';
- };
- FgEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true
- };
- };
- FgEventRenderer.prototype.computeDisplayEventTime = function () {
- return true;
- };
- FgEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Utility for generating event skin-related CSS properties
- FgEventRenderer.prototype.getSkinCss = function (ui) {
- return {
- 'background-color': ui.backgroundColor,
- 'border-color': ui.borderColor,
- color: ui.textColor
- };
- };
- FgEventRenderer.prototype.sortEventSegs = function (segs) {
- var specs = this.context.eventOrderSpecs;
- var objs = segs.map(buildSegCompareObj);
- objs.sort(function (obj0, obj1) {
- return compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- FgEventRenderer.prototype.computeSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.computeSegSizes(this.segs);
- }
- };
- FgEventRenderer.prototype.assignSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.assignSegSizes(this.segs);
- this.isSizeDirty = false;
- }
- };
- FgEventRenderer.prototype.computeSegSizes = function (segs) {
- };
- FgEventRenderer.prototype.assignSegSizes = function (segs) {
- };
- // Manipulation on rendered segs
- FgEventRenderer.prototype.hideByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = 'hidden';
- }
- }
- }
- };
- FgEventRenderer.prototype.showByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = '';
- }
- }
- }
- };
- FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- var eventInstance = seg.eventRange.instance;
- if (eventInstance && eventInstance.instanceId === instanceId &&
- seg.el // necessary?
- ) {
- seg.el.classList.add('fc-selected');
- }
- }
- }
- };
- FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (seg.el) { // necessary?
- seg.el.classList.remove('fc-selected');
- }
- }
- }
- };
- return FgEventRenderer;
-}());
-// returns a object with all primitive props that can be compared
-function buildSegCompareObj(seg) {
- var eventDef = seg.eventRange.def;
- var range = seg.eventRange.instance.range;
- var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
- var end = range.end ? range.end.valueOf() : 0; // "
- return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
- end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
- });
-}
-
-/*
-TODO: when refactoring this class, make a new FillRenderer instance for each `type`
-*/
-var FillRenderer = /** @class */ (function () {
- function FillRenderer() {
- this.fillSegTag = 'div';
- this.dirtySizeFlags = {};
- this.containerElsByType = {};
- this.segsByType = {};
- }
- FillRenderer.prototype.getSegsByType = function (type) {
- return this.segsByType[type] || [];
- };
- FillRenderer.prototype.renderSegs = function (type, context, segs) {
- var _a;
- this.context = context;
- var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
- var containerEls = this.attachSegs(type, renderedSegs);
- if (containerEls) {
- (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
- }
- this.segsByType[type] = renderedSegs;
- if (type === 'bgEvent') {
- triggerRenderedSegs(context, renderedSegs, false); // isMirror=false
- }
- this.dirtySizeFlags[type] = true;
- };
- // Unrenders a specific type of fill that is currently rendered on the grid
- FillRenderer.prototype.unrender = function (type, context) {
- var segs = this.segsByType[type];
- if (segs) {
- if (type === 'bgEvent') {
- triggerWillRemoveSegs(context, segs, false); // isMirror=false
- }
- this.detachSegs(type, segs);
- }
- };
- // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
- // Only returns segments that successfully rendered.
- FillRenderer.prototype.renderSegEls = function (type, segs) {
- var _this = this;
- var html = '';
- var i;
- if (segs.length) {
- // build a large concatenation of segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(type, segs[i]);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- if (type === 'bgEvent') {
- segs = filterSegsViaEls(this.context, segs, false // isMirror. background events can never be mirror elements
- );
- }
- // correct element type? (would be bad if a non-TD were inserted into a table for example)
- segs = segs.filter(function (seg) {
- return elementMatches(seg.el, _this.fillSegTag);
- });
- }
- return segs;
- };
- // Builds the HTML needed for one fill segment. Generic enough to work with different types.
- FillRenderer.prototype.renderSegHtml = function (type, seg) {
- var css = null;
- var classNames = [];
- if (type !== 'highlight' && type !== 'businessHours') {
- css = {
- 'background-color': seg.eventRange.ui.backgroundColor
- };
- }
- if (type !== 'highlight') {
- classNames = classNames.concat(seg.eventRange.ui.classNames);
- }
- if (type === 'businessHours') {
- classNames.push('fc-bgevent');
- }
- else {
- classNames.push('fc-' + type.toLowerCase());
- }
- return '<' + this.fillSegTag +
- (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
- (css ? ' style="' + cssToStr(css) + '"' : '') +
- '></' + this.fillSegTag + '>';
- };
- FillRenderer.prototype.detachSegs = function (type, segs) {
- var containerEls = this.containerElsByType[type];
- if (containerEls) {
- containerEls.forEach(removeElement);
- delete this.containerElsByType[type];
- }
- };
- FillRenderer.prototype.computeSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.computeSegSizes(this.segsByType[type]);
- }
- }
- };
- FillRenderer.prototype.assignSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.assignSegSizes(this.segsByType[type]);
- }
- }
- this.dirtySizeFlags = {};
- };
- FillRenderer.prototype.computeSegSizes = function (segs) {
- };
- FillRenderer.prototype.assignSegSizes = function (segs) {
- };
- return FillRenderer;
-}());
-
-var NamedTimeZoneImpl = /** @class */ (function () {
- function NamedTimeZoneImpl(timeZoneName) {
- this.timeZoneName = timeZoneName;
- }
- return NamedTimeZoneImpl;
-}());
-
-/*
-An abstraction for a dragging interaction originating on an event.
-Does higher-level things than PointerDragger, such as possibly:
-- a "mirror" that moves with the pointer
-- a minimum number of pixels or other criteria for a true drag to begin
-
-subclasses must emit:
-- pointerdown
-- dragstart
-- dragmove
-- pointerup
-- dragend
-*/
-var ElementDragging = /** @class */ (function () {
- function ElementDragging(el) {
- this.emitter = new EmitterMixin();
- }
- ElementDragging.prototype.destroy = function () {
- };
- ElementDragging.prototype.setMirrorIsVisible = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- // optional
- };
- return ElementDragging;
-}());
-
-function formatDate(dateInput, settings) {
- if (settings === void 0) { settings = {}; }
- var dateEnv = buildDateEnv$1(settings);
- var formatter = createFormatter(settings);
- var dateMeta = dateEnv.createMarkerMeta(dateInput);
- if (!dateMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.format(dateMeta.marker, formatter, {
- forcedTzo: dateMeta.forcedTzo
- });
-}
-function formatRange(startInput, endInput, settings // mixture of env and formatter settings
-) {
- var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
- var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
- var startMeta = dateEnv.createMarkerMeta(startInput);
- var endMeta = dateEnv.createMarkerMeta(endInput);
- if (!startMeta || !endMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
- forcedStartTzo: startMeta.forcedTzo,
- forcedEndTzo: endMeta.forcedTzo,
- isEndExclusive: settings.isEndExclusive
- });
-}
-// TODO: more DRY and optimized
-function buildDateEnv$1(settings) {
- var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
- // ensure required settings
- settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
- return new DateEnv(settings);
-}
-
-var DRAG_META_PROPS = {
- startTime: createDuration,
- duration: createDuration,
- create: Boolean,
- sourceId: String
-};
-var DRAG_META_DEFAULTS = {
- create: true
-};
-function parseDragMeta(raw) {
- var leftoverProps = {};
- var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
- refined.leftoverProps = leftoverProps;
- return refined;
-}
-
-// Computes a default column header formatting string if `colFormat` is not explicitly defined
-function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
- // if more than one week row, or if there are a lot of columns with not much space,
- // put just the day numbers will be in each cell
- if (!datesRepDistinctDays || dayCnt > 10) {
- return { weekday: 'short' }; // "Sat"
- }
- else if (dayCnt > 1) {
- return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
- }
- else {
- return { weekday: 'long' }; // "Saturday"
- }
-}
-function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme, options = context.options;
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
- var classNames = [
- 'fc-day-header',
- theme.getClass('widgetHeader')
- ];
- var innerHtml;
- if (typeof options.columnHeaderHtml === 'function') {
- innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
- }
- else if (typeof options.columnHeaderText === 'function') {
- innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
- }
- else {
- innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
- }
- // if only one row of days, the classNames on the header can represent the specific days beneath
- if (datesRepDistinctDays) {
- classNames = classNames.concat(
- // includes the day-of-week class
- // noThemeHighlight=true (don't highlight the header)
- getDayClasses(dateMarker, dateProfile, context, true));
- }
- else {
- classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
- }
- return '' +
- '<th class="' + classNames.join(' ') + '"' +
- ((isDateValid && datesRepDistinctDays) ?
- ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
- '') +
- (colspan > 1 ?
- ' colspan="' + colspan + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '>' +
- (isDateValid ?
- // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
- buildGotoAnchorHtml(options, dateEnv, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
- // if not valid, display text, but no link
- innerHtml) +
- '</th>';
-}
-
-var DayHeader = /** @class */ (function (_super) {
- __extends(DayHeader, _super);
- function DayHeader(parentEl) {
- var _this = _super.call(this) || this;
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.parentEl = parentEl;
- return _this;
- }
- DayHeader.prototype.render = function (props, context) {
- var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
- var parts = [];
- this.renderSkeleton(context);
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- var colHeadFormat = createFormatter(context.options.columnHeaderFormat ||
- computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
- for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
- var date = dates_1[_i];
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, context));
- }
- if (context.isRtl) {
- parts.reverse();
- }
- this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
- };
- DayHeader.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- DayHeader.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- var parentEl = this.parentEl;
- parentEl.innerHTML = ''; // because might be nbsp
- parentEl.appendChild(this.el = htmlToElement('<div class="fc-row ' + theme.getClass('headerRow') + '">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- '<thead></thead>' +
- '</table>' +
- '</div>'));
- this.thead = this.el.querySelector('thead');
- };
- DayHeader.prototype._unrenderSkeleton = function () {
- removeElement(this.el);
- };
- return DayHeader;
-}(Component));
-
-var DaySeries = /** @class */ (function () {
- function DaySeries(range, dateProfileGenerator) {
- var date = range.start;
- var end = range.end;
- var indices = [];
- var dates = [];
- var dayIndex = -1;
- while (date < end) { // loop each day from start to end
- if (dateProfileGenerator.isHiddenDay(date)) {
- indices.push(dayIndex + 0.5); // mark that it's between indices
- }
- else {
- dayIndex++;
- indices.push(dayIndex);
- dates.push(date);
- }
- date = addDays(date, 1);
- }
- this.dates = dates;
- this.indices = indices;
- this.cnt = dates.length;
- }
- DaySeries.prototype.sliceRange = function (range) {
- var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
- var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
- var clippedFirstIndex = Math.max(0, firstIndex);
- var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
- // deal with in-between indices
- clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
- clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
- if (clippedFirstIndex <= clippedLastIndex) {
- return {
- firstIndex: clippedFirstIndex,
- lastIndex: clippedLastIndex,
- isStart: firstIndex === clippedFirstIndex,
- isEnd: lastIndex === clippedLastIndex
- };
- }
- else {
- return null;
- }
- };
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
- // If before the first offset, returns a negative number.
- // If after the last offset, returns an offset past the last cell offset.
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
- DaySeries.prototype.getDateDayIndex = function (date) {
- var indices = this.indices;
- var dayOffset = Math.floor(diffDays(this.dates[0], date));
- if (dayOffset < 0) {
- return indices[0] - 1;
- }
- else if (dayOffset >= indices.length) {
- return indices[indices.length - 1] + 1;
- }
- else {
- return indices[dayOffset];
- }
- };
- return DaySeries;
-}());
-
-var DayTable = /** @class */ (function () {
- function DayTable(daySeries, breakOnWeeks) {
- var dates = daySeries.dates;
- var daysPerRow;
- var firstDay;
- var rowCnt;
- if (breakOnWeeks) {
- // count columns until the day-of-week repeats
- firstDay = dates[0].getUTCDay();
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
- if (dates[daysPerRow].getUTCDay() === firstDay) {
- break;
- }
- }
- rowCnt = Math.ceil(dates.length / daysPerRow);
- }
- else {
- rowCnt = 1;
- daysPerRow = dates.length;
- }
- this.rowCnt = rowCnt;
- this.colCnt = daysPerRow;
- this.daySeries = daySeries;
- this.cells = this.buildCells();
- this.headerDates = this.buildHeaderDates();
- }
- DayTable.prototype.buildCells = function () {
- var rows = [];
- for (var row = 0; row < this.rowCnt; row++) {
- var cells = [];
- for (var col = 0; col < this.colCnt; col++) {
- cells.push(this.buildCell(row, col));
- }
- rows.push(cells);
- }
- return rows;
- };
- DayTable.prototype.buildCell = function (row, col) {
- return {
- date: this.daySeries.dates[row * this.colCnt + col]
- };
- };
- DayTable.prototype.buildHeaderDates = function () {
- var dates = [];
- for (var col = 0; col < this.colCnt; col++) {
- dates.push(this.cells[0][col].date);
- }
- return dates;
- };
- DayTable.prototype.sliceRange = function (range) {
- var colCnt = this.colCnt;
- var seriesSeg = this.daySeries.sliceRange(range);
- var segs = [];
- if (seriesSeg) {
- var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
- var index = firstIndex;
- while (index <= lastIndex) {
- var row = Math.floor(index / colCnt);
- var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
- segs.push({
- row: row,
- firstCol: index % colCnt,
- lastCol: (nextIndex - 1) % colCnt,
- isStart: seriesSeg.isStart && index === firstIndex,
- isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
- });
- index = nextIndex;
- }
- }
- return segs;
- };
- return DayTable;
-}());
-
-var Slicer = /** @class */ (function () {
- function Slicer() {
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
- this.sliceDateSelection = memoize(this._sliceDateSpan);
- this.sliceEventStore = memoize(this._sliceEventStore);
- this.sliceEventDrag = memoize(this._sliceInteraction);
- this.sliceEventResize = memoize(this._sliceInteraction);
- }
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- var eventUiBases = props.eventUiBases;
- var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
- return {
- dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, calendar, component].concat(extraArgs)),
- fgEventSegs: eventSegs.fg,
- bgEventSegs: eventSegs.bg,
- eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventSelection: props.eventSelection
- }; // TODO: give interactionSegs?
- };
- Slicer.prototype.sliceNowDate = function (// does not memoize
- date, component) {
- var extraArgs = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- extraArgs[_i - 2] = arguments[_i];
- }
- return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
- {},
- component].concat(extraArgs));
- };
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!businessHours) {
- return [];
- }
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), calendar),
- {},
- dateProfile,
- nextDayThreshold,
- component].concat(extraArgs)).bg;
- };
- Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (eventStore) {
- var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
- fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
- };
- }
- else {
- return { bg: [], fg: [] };
- }
- };
- Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!interaction) {
- return null;
- }
- var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
- affectedInstances: interaction.affectedEvents.instances,
- isEvent: interaction.isEvent,
- sourceSeg: interaction.origSeg
- };
- };
- Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
- var extraArgs = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- extraArgs[_i - 3] = arguments[_i];
- }
- if (!dateSpan) {
- return [];
- }
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.context.calendar);
- var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
- for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
- var seg = segs_1[_a];
- seg.component = component;
- seg.eventRange = eventRange;
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
- extraArgs) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
- extraArgs) {
- var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- seg.component = component;
- seg.eventRange = eventRange;
- seg.isStart = eventRange.isStart && seg.isStart;
- seg.isEnd = eventRange.isEnd && seg.isEnd;
- }
- return segs;
- };
- return Slicer;
-}());
-/*
-for incorporating minTime/maxTime if appropriate
-TODO: should be part of DateProfile!
-TimelineDateProfile already does this btw
-*/
-function computeActiveRange(dateProfile, isComponentAllDay) {
- var range = dateProfile.activeRange;
- if (isComponentAllDay) {
- return range;
- }
- return {
- start: addMs(range.start, dateProfile.minTime.milliseconds),
- end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
- };
-}
-
-// exports
-// --------------------------------------------------------------------------------------------------
-var version = '4.4.2';
-
-export { Calendar, Component, ComponentContext, DateComponent, DateEnv, DateProfileGenerator, DayHeader, DaySeries, DayTable, ElementDragging, ElementScrollController, EmitterMixin, EventApi, FgEventRenderer, FillRenderer, Interaction, Mixin, NamedTimeZoneImpl, PositionCache, ScrollComponent, ScrollController, Slicer, Splitter, Theme, View, WindowScrollController, addDays, addDurations, addMs, addWeeks, allowContextMenu, allowSelection, appendToElement, applyAll, applyMutationToEventStore, applyStyle, applyStyleProp, asRoughMinutes, asRoughMs, asRoughSeconds, buildGotoAnchorHtml, buildSegCompareObj, capitaliseFirstLetter, combineEventUis, compareByFieldSpec, compareByFieldSpecs, compareNumbers, compensateScroll, computeClippingRect, computeEdges, computeEventDraggable, computeEventEndResizable, computeEventStartResizable, computeFallbackHeaderFormat, computeHeightAndMargins, computeInnerRect, computeRect, computeVisibleDayRange, config, constrainPoint, createDuration, createElement, createEmptyEventStore, createEventInstance, createFormatter, createPlugin, cssToStr, debounce, diffDates, diffDayAndTime, diffDays, diffPoints, diffWeeks, diffWholeDays, diffWholeWeeks, disableCursor, distributeHeight, elementClosest, elementMatches, enableCursor, eventTupleToStore, filterEventStoreDefs, filterHash, findChildren, findElements, flexibleCompare, forceClassName, formatDate, formatIsoTimeString, formatRange, getAllDayHtml, getClippingParents, getDayClasses, getElSeg, getRectCenter, getRelevantEvents, globalDefaults, greatestDurationDenominator, hasBgRendering, htmlEscape, htmlToElement, insertAfterElement, interactionSettingsStore, interactionSettingsToStore, intersectRanges, intersectRects, isArraysEqual, isDateSpansEqual, isInt, isInteractionValid, isMultiDayRange, isPropsEqual, isPropsValid, isSingleDay, isValidDate, listenBySelector, mapHash, matchCellWidths, memoize, memoizeOutput, memoizeRendering, mergeEventStores, multiplyDuration, padStart, parseBusinessHours, parseDragMeta, parseEventDef, parseFieldSpecs, parse as parseMarker, pointInsideRect, prependToElement, preventContextMenu, preventDefault, preventSelection, processScopedUiProps, rangeContainsMarker, rangeContainsRange, rangesEqual, rangesIntersect, refineProps, removeElement, removeExact, renderDateCell, requestJson, sliceEventStore, startOfDay, subtractInnerElHeight, translateRect, uncompensateScroll, undistributeHeight, unpromisify, version, whenTransitionDone, wholeDivideDurations };
diff --git a/library/fullcalendar/packages/core/main.js b/library/fullcalendar/packages/core/main.js
deleted file mode 100644
index 2cb657a60..000000000
--- a/library/fullcalendar/packages/core/main.js
+++ /dev/null
@@ -1,8745 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = global || self, factory(global.FullCalendar = {}));
-}(this, function (exports) { 'use strict';
-
- // Creating
- // ----------------------------------------------------------------------------------------------------------------
- var elementPropHash = {
- className: true,
- colSpan: true,
- rowSpan: true
- };
- var containerTagHash = {
- '<tr': 'tbody',
- '<td': 'tr'
- };
- function createElement(tagName, attrs, content) {
- var el = document.createElement(tagName);
- if (attrs) {
- for (var attrName in attrs) {
- if (attrName === 'style') {
- applyStyle(el, attrs[attrName]);
- }
- else if (elementPropHash[attrName]) {
- el[attrName] = attrs[attrName];
- }
- else {
- el.setAttribute(attrName, attrs[attrName]);
- }
- }
- }
- if (typeof content === 'string') {
- el.innerHTML = content; // shortcut. no need to process HTML in any way
- }
- else if (content != null) {
- appendToElement(el, content);
- }
- return el;
- }
- function htmlToElement(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.firstChild;
- }
- function htmlToElements(html) {
- return Array.prototype.slice.call(htmlToNodeList(html));
- }
- function htmlToNodeList(html) {
- html = html.trim();
- var container = document.createElement(computeContainerTag(html));
- container.innerHTML = html;
- return container.childNodes;
- }
- // assumes html already trimmed and tag names are lowercase
- function computeContainerTag(html) {
- return containerTagHash[html.substr(0, 3) // faster than using regex
- ] || 'div';
- }
- function appendToElement(el, content) {
- var childNodes = normalizeContent(content);
- for (var i = 0; i < childNodes.length; i++) {
- el.appendChild(childNodes[i]);
- }
- }
- function prependToElement(parent, content) {
- var newEls = normalizeContent(content);
- var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
- for (var i = 0; i < newEls.length; i++) {
- parent.insertBefore(newEls[i], afterEl);
- }
- }
- function insertAfterElement(refEl, content) {
- var newEls = normalizeContent(content);
- var afterEl = refEl.nextSibling || null;
- for (var i = 0; i < newEls.length; i++) {
- refEl.parentNode.insertBefore(newEls[i], afterEl);
- }
- }
- function normalizeContent(content) {
- var els;
- if (typeof content === 'string') {
- els = htmlToElements(content);
- }
- else if (content instanceof Node) {
- els = [content];
- }
- else { // Node[] or NodeList
- els = Array.prototype.slice.call(content);
- }
- return els;
- }
- function removeElement(el) {
- if (el.parentNode) {
- el.parentNode.removeChild(el);
- }
- }
- // Querying
- // ----------------------------------------------------------------------------------------------------------------
- // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
- var matchesMethod = Element.prototype.matches ||
- Element.prototype.matchesSelector ||
- Element.prototype.msMatchesSelector;
- var closestMethod = Element.prototype.closest || function (selector) {
- // polyfill
- var el = this;
- if (!document.documentElement.contains(el)) {
- return null;
- }
- do {
- if (elementMatches(el, selector)) {
- return el;
- }
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- };
- function elementClosest(el, selector) {
- return closestMethod.call(el, selector);
- }
- function elementMatches(el, selector) {
- return matchesMethod.call(el, selector);
- }
- // accepts multiple subject els
- // returns a real array. good for methods like forEach
- function findElements(container, selector) {
- var containers = container instanceof HTMLElement ? [container] : container;
- var allMatches = [];
- for (var i = 0; i < containers.length; i++) {
- var matches = containers[i].querySelectorAll(selector);
- for (var j = 0; j < matches.length; j++) {
- allMatches.push(matches[j]);
- }
- }
- return allMatches;
- }
- // accepts multiple subject els
- // only queries direct child elements
- function findChildren(parent, selector) {
- var parents = parent instanceof HTMLElement ? [parent] : parent;
- var allMatches = [];
- for (var i = 0; i < parents.length; i++) {
- var childNodes = parents[i].children; // only ever elements
- for (var j = 0; j < childNodes.length; j++) {
- var childNode = childNodes[j];
- if (!selector || elementMatches(childNode, selector)) {
- allMatches.push(childNode);
- }
- }
- }
- return allMatches;
- }
- // Attributes
- // ----------------------------------------------------------------------------------------------------------------
- function forceClassName(el, className, bool) {
- if (bool) {
- el.classList.add(className);
- }
- else {
- el.classList.remove(className);
- }
- }
- // Style
- // ----------------------------------------------------------------------------------------------------------------
- var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
- function applyStyle(el, props) {
- for (var propName in props) {
- applyStyleProp(el, propName, props[propName]);
- }
- }
- function applyStyleProp(el, name, val) {
- if (val == null) {
- el.style[name] = '';
- }
- else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
- el.style[name] = val + 'px';
- }
- else {
- el.style[name] = val;
- }
- }
-
- function pointInsideRect(point, rect) {
- return point.left >= rect.left &&
- point.left < rect.right &&
- point.top >= rect.top &&
- point.top < rect.bottom;
- }
- // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
- function intersectRects(rect1, rect2) {
- var res = {
- left: Math.max(rect1.left, rect2.left),
- right: Math.min(rect1.right, rect2.right),
- top: Math.max(rect1.top, rect2.top),
- bottom: Math.min(rect1.bottom, rect2.bottom)
- };
- if (res.left < res.right && res.top < res.bottom) {
- return res;
- }
- return false;
- }
- function translateRect(rect, deltaX, deltaY) {
- return {
- left: rect.left + deltaX,
- right: rect.right + deltaX,
- top: rect.top + deltaY,
- bottom: rect.bottom + deltaY
- };
- }
- // Returns a new point that will have been moved to reside within the given rectangle
- function constrainPoint(point, rect) {
- return {
- left: Math.min(Math.max(point.left, rect.left), rect.right),
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
- };
- }
- // Returns a point that is the center of the given rectangle
- function getRectCenter(rect) {
- return {
- left: (rect.left + rect.right) / 2,
- top: (rect.top + rect.bottom) / 2
- };
- }
- // Subtracts point2's coordinates from point1's coordinates, returning a delta
- function diffPoints(point1, point2) {
- return {
- left: point1.left - point2.left,
- top: point1.top - point2.top
- };
- }
-
- // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
- var isRtlScrollbarOnLeft = null;
- function getIsRtlScrollbarOnLeft() {
- if (isRtlScrollbarOnLeft === null) {
- isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
- }
- return isRtlScrollbarOnLeft;
- }
- function computeIsRtlScrollbarOnLeft() {
- var outerEl = createElement('div', {
- style: {
- position: 'absolute',
- top: -1000,
- left: 0,
- border: 0,
- padding: 0,
- overflow: 'scroll',
- direction: 'rtl'
- }
- }, '<div></div>');
- document.body.appendChild(outerEl);
- var innerEl = outerEl.firstChild;
- var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
- removeElement(outerEl);
- return res;
- }
- // The scrollbar width computations in computeEdges are sometimes flawed when it comes to
- // retina displays, rounding, and IE11. Massage them into a usable value.
- function sanitizeScrollbarWidth(width) {
- width = Math.max(0, width); // no negatives
- width = Math.round(width);
- return width;
- }
-
- function computeEdges(el, getPadding) {
- if (getPadding === void 0) { getPadding = false; }
- var computedStyle = window.getComputedStyle(el);
- var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
- var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
- var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
- var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
- // must use offset(Width|Height) because compatible with client(Width|Height)
- var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
- var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
- var res = {
- borderLeft: borderLeft,
- borderRight: borderRight,
- borderTop: borderTop,
- borderBottom: borderBottom,
- scrollbarBottom: scrollbarBottom,
- scrollbarLeft: 0,
- scrollbarRight: 0
- };
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
- res.scrollbarLeft = scrollbarLeftRight;
- }
- else {
- res.scrollbarRight = scrollbarLeftRight;
- }
- if (getPadding) {
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
- }
- return res;
- }
- function computeInnerRect(el, goWithinPadding) {
- if (goWithinPadding === void 0) { goWithinPadding = false; }
- var outerRect = computeRect(el);
- var edges = computeEdges(el, goWithinPadding);
- var res = {
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
- top: outerRect.top + edges.borderTop,
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
- };
- if (goWithinPadding) {
- res.left += edges.paddingLeft;
- res.right -= edges.paddingRight;
- res.top += edges.paddingTop;
- res.bottom -= edges.paddingBottom;
- }
- return res;
- }
- function computeRect(el) {
- var rect = el.getBoundingClientRect();
- return {
- left: rect.left + window.pageXOffset,
- top: rect.top + window.pageYOffset,
- right: rect.right + window.pageXOffset,
- bottom: rect.bottom + window.pageYOffset
- };
- }
- function computeViewportRect() {
- return {
- left: window.pageXOffset,
- right: window.pageXOffset + document.documentElement.clientWidth,
- top: window.pageYOffset,
- bottom: window.pageYOffset + document.documentElement.clientHeight
- };
- }
- function computeHeightAndMargins(el) {
- return el.getBoundingClientRect().height + computeVMargins(el);
- }
- function computeVMargins(el) {
- var computed = window.getComputedStyle(el);
- return parseInt(computed.marginTop, 10) +
- parseInt(computed.marginBottom, 10);
- }
- // does not return window
- function getClippingParents(el) {
- var parents = [];
- while (el instanceof HTMLElement) { // will stop when gets to document or null
- var computedStyle = window.getComputedStyle(el);
- if (computedStyle.position === 'fixed') {
- break;
- }
- if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
- parents.push(el);
- }
- el = el.parentNode;
- }
- return parents;
- }
- function computeClippingRect(el) {
- return getClippingParents(el)
- .map(function (el) {
- return computeInnerRect(el);
- })
- .concat(computeViewportRect())
- .reduce(function (rect0, rect1) {
- return intersectRects(rect0, rect1) || rect1; // should always intersect
- });
- }
-
- // Stops a mouse/touch event from doing it's native browser action
- function preventDefault(ev) {
- ev.preventDefault();
- }
- // Event Delegation
- // ----------------------------------------------------------------------------------------------------------------
- function listenBySelector(container, eventType, selector, handler) {
- function realHandler(ev) {
- var matchedChild = elementClosest(ev.target, selector);
- if (matchedChild) {
- handler.call(matchedChild, ev, matchedChild);
- }
- }
- container.addEventListener(eventType, realHandler);
- return function () {
- container.removeEventListener(eventType, realHandler);
- };
- }
- function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
- var currentMatchedChild;
- return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
- if (matchedChild !== currentMatchedChild) {
- currentMatchedChild = matchedChild;
- onMouseEnter(ev, matchedChild);
- var realOnMouseLeave_1 = function (ev) {
- currentMatchedChild = null;
- onMouseLeave(ev, matchedChild);
- matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
- };
- // listen to the next mouseleave, and then unattach
- matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
- }
- });
- }
- // Animation
- // ----------------------------------------------------------------------------------------------------------------
- var transitionEventNames = [
- 'webkitTransitionEnd',
- 'otransitionend',
- 'oTransitionEnd',
- 'msTransitionEnd',
- 'transitionend'
- ];
- // triggered only when the next single subsequent transition finishes
- function whenTransitionDone(el, callback) {
- var realCallback = function (ev) {
- callback(ev);
- transitionEventNames.forEach(function (eventName) {
- el.removeEventListener(eventName, realCallback);
- });
- };
- transitionEventNames.forEach(function (eventName) {
- el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
- });
- }
-
- var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
- // Adding
- function addWeeks(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n * 7;
- return arrayToUtcDate(a);
- }
- function addDays(m, n) {
- var a = dateToUtcArray(m);
- a[2] += n;
- return arrayToUtcDate(a);
- }
- function addMs(m, n) {
- var a = dateToUtcArray(m);
- a[6] += n;
- return arrayToUtcDate(a);
- }
- // Diffing (all return floats)
- function diffWeeks(m0, m1) {
- return diffDays(m0, m1) / 7;
- }
- function diffDays(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
- }
- function diffHours(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
- }
- function diffMinutes(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
- }
- function diffSeconds(m0, m1) {
- return (m1.valueOf() - m0.valueOf()) / 1000;
- }
- function diffDayAndTime(m0, m1) {
- var m0day = startOfDay(m0);
- var m1day = startOfDay(m1);
- return {
- years: 0,
- months: 0,
- days: Math.round(diffDays(m0day, m1day)),
- milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
- };
- }
- // Diffing Whole Units
- function diffWholeWeeks(m0, m1) {
- var d = diffWholeDays(m0, m1);
- if (d !== null && d % 7 === 0) {
- return d / 7;
- }
- return null;
- }
- function diffWholeDays(m0, m1) {
- if (timeAsMs(m0) === timeAsMs(m1)) {
- return Math.round(diffDays(m0, m1));
- }
- return null;
- }
- // Start-Of
- function startOfDay(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate()
- ]);
- }
- function startOfHour(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours()
- ]);
- }
- function startOfMinute(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes()
- ]);
- }
- function startOfSecond(m) {
- return arrayToUtcDate([
- m.getUTCFullYear(),
- m.getUTCMonth(),
- m.getUTCDate(),
- m.getUTCHours(),
- m.getUTCMinutes(),
- m.getUTCSeconds()
- ]);
- }
- // Week Computation
- function weekOfYear(marker, dow, doy) {
- var y = marker.getUTCFullYear();
- var w = weekOfGivenYear(marker, y, dow, doy);
- if (w < 1) {
- return weekOfGivenYear(marker, y - 1, dow, doy);
- }
- var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
- if (nextW >= 1) {
- return Math.min(w, nextW);
- }
- return w;
- }
- function weekOfGivenYear(marker, year, dow, doy) {
- var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
- var dayStart = startOfDay(marker);
- var days = Math.round(diffDays(firstWeekStart, dayStart));
- return Math.floor(days / 7) + 1; // zero-indexed
- }
- // start-of-first-week - start-of-year
- function firstWeekOffset(year, dow, doy) {
- // first-week day -- which january is always in the first week (4 for iso, 1 for other)
- var fwd = 7 + dow - doy;
- // first-week day local weekday -- which local weekday is fwd
- var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
- return -fwdlw + fwd - 1;
- }
- // Array Conversion
- function dateToLocalArray(date) {
- return [
- date.getFullYear(),
- date.getMonth(),
- date.getDate(),
- date.getHours(),
- date.getMinutes(),
- date.getSeconds(),
- date.getMilliseconds()
- ];
- }
- function arrayToLocalDate(a) {
- return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
- a[3] || 0, a[4] || 0, a[5] || 0);
- }
- function dateToUtcArray(date) {
- return [
- date.getUTCFullYear(),
- date.getUTCMonth(),
- date.getUTCDate(),
- date.getUTCHours(),
- date.getUTCMinutes(),
- date.getUTCSeconds(),
- date.getUTCMilliseconds()
- ];
- }
- function arrayToUtcDate(a) {
- // according to web standards (and Safari), a month index is required.
- // massage if only given a year.
- if (a.length === 1) {
- a = a.concat([0]);
- }
- return new Date(Date.UTC.apply(Date, a));
- }
- // Other Utils
- function isValidDate(m) {
- return !isNaN(m.valueOf());
- }
- function timeAsMs(m) {
- return m.getUTCHours() * 1000 * 60 * 60 +
- m.getUTCMinutes() * 1000 * 60 +
- m.getUTCSeconds() * 1000 +
- m.getUTCMilliseconds();
- }
-
- var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
- var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
- // Parsing and Creation
- function createDuration(input, unit) {
- var _a;
- if (typeof input === 'string') {
- return parseString(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- return normalizeObject(input);
- }
- else if (typeof input === 'number') {
- return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
- }
- else {
- return null;
- }
- }
- function parseString(s) {
- var m = PARSE_RE.exec(s);
- if (m) {
- var sign = m[1] ? -1 : 1;
- return {
- years: 0,
- months: 0,
- days: sign * (m[2] ? parseInt(m[2], 10) : 0),
- milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
- (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
- (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
- (m[6] ? parseInt(m[6], 10) : 0) // ms
- )
- };
- }
- return null;
- }
- function normalizeObject(obj) {
- return {
- years: obj.years || obj.year || 0,
- months: obj.months || obj.month || 0,
- days: (obj.days || obj.day || 0) +
- getWeeksFromInput(obj) * 7,
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
- (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
- (obj.seconds || obj.second || 0) * 1000 + // seconds
- (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
- };
- }
- function getWeeksFromInput(obj) {
- return obj.weeks || obj.week || 0;
- }
- // Equality
- function durationsEqual(d0, d1) {
- return d0.years === d1.years &&
- d0.months === d1.months &&
- d0.days === d1.days &&
- d0.milliseconds === d1.milliseconds;
- }
- function isSingleDay(dur) {
- return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
- }
- // Simple Math
- function addDurations(d0, d1) {
- return {
- years: d0.years + d1.years,
- months: d0.months + d1.months,
- days: d0.days + d1.days,
- milliseconds: d0.milliseconds + d1.milliseconds
- };
- }
- function subtractDurations(d1, d0) {
- return {
- years: d1.years - d0.years,
- months: d1.months - d0.months,
- days: d1.days - d0.days,
- milliseconds: d1.milliseconds - d0.milliseconds
- };
- }
- function multiplyDuration(d, n) {
- return {
- years: d.years * n,
- months: d.months * n,
- days: d.days * n,
- milliseconds: d.milliseconds * n
- };
- }
- // Conversions
- // "Rough" because they are based on average-case Gregorian months/years
- function asRoughYears(dur) {
- return asRoughDays(dur) / 365;
- }
- function asRoughMonths(dur) {
- return asRoughDays(dur) / 30;
- }
- function asRoughDays(dur) {
- return asRoughMs(dur) / 864e5;
- }
- function asRoughMinutes(dur) {
- return asRoughMs(dur) / (1000 * 60);
- }
- function asRoughSeconds(dur) {
- return asRoughMs(dur) / 1000;
- }
- function asRoughMs(dur) {
- return dur.years * (365 * 864e5) +
- dur.months * (30 * 864e5) +
- dur.days * 864e5 +
- dur.milliseconds;
- }
- // Advanced Math
- function wholeDivideDurations(numerator, denominator) {
- var res = null;
- for (var i = 0; i < INTERNAL_UNITS.length; i++) {
- var unit = INTERNAL_UNITS[i];
- if (denominator[unit]) {
- var localRes = numerator[unit] / denominator[unit];
- if (!isInt(localRes) || (res !== null && res !== localRes)) {
- return null;
- }
- res = localRes;
- }
- else if (numerator[unit]) {
- // needs to divide by something but can't!
- return null;
- }
- }
- return res;
- }
- function greatestDurationDenominator(dur, dontReturnWeeks) {
- var ms = dur.milliseconds;
- if (ms) {
- if (ms % 1000 !== 0) {
- return { unit: 'millisecond', value: ms };
- }
- if (ms % (1000 * 60) !== 0) {
- return { unit: 'second', value: ms / 1000 };
- }
- if (ms % (1000 * 60 * 60) !== 0) {
- return { unit: 'minute', value: ms / (1000 * 60) };
- }
- if (ms) {
- return { unit: 'hour', value: ms / (1000 * 60 * 60) };
- }
- }
- if (dur.days) {
- if (!dontReturnWeeks && dur.days % 7 === 0) {
- return { unit: 'week', value: dur.days / 7 };
- }
- return { unit: 'day', value: dur.days };
- }
- if (dur.months) {
- return { unit: 'month', value: dur.months };
- }
- if (dur.years) {
- return { unit: 'year', value: dur.years };
- }
- return { unit: 'millisecond', value: 0 };
- }
-
- /* FullCalendar-specific DOM Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
- // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
- function compensateScroll(rowEl, scrollbarWidths) {
- if (scrollbarWidths.left) {
- applyStyle(rowEl, {
- borderLeftWidth: 1,
- marginLeft: scrollbarWidths.left - 1
- });
- }
- if (scrollbarWidths.right) {
- applyStyle(rowEl, {
- borderRightWidth: 1,
- marginRight: scrollbarWidths.right - 1
- });
- }
- }
- // Undoes compensateScroll and restores all borders/margins
- function uncompensateScroll(rowEl) {
- applyStyle(rowEl, {
- marginLeft: '',
- marginRight: '',
- borderLeftWidth: '',
- borderRightWidth: ''
- });
- }
- // Make the mouse cursor express that an event is not allowed in the current area
- function disableCursor() {
- document.body.classList.add('fc-not-allowed');
- }
- // Returns the mouse cursor to its original look
- function enableCursor() {
- document.body.classList.remove('fc-not-allowed');
- }
- // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
- // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
- // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
- // reduces the available height.
- function distributeHeight(els, availableHeight, shouldRedistribute) {
- // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
- // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
- var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
- var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
- var flexEls = []; // elements that are allowed to expand. array of DOM nodes
- var flexOffsets = []; // amount of vertical space it takes up
- var flexHeights = []; // actual css height
- var usedHeight = 0;
- undistributeHeight(els); // give all elements their natural height
- // find elements that are below the recommended height (expandable).
- // important to query for heights in a single first pass (to avoid reflow oscillation).
- els.forEach(function (el, i) {
- var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
- var naturalHeight = el.getBoundingClientRect().height;
- var naturalOffset = naturalHeight + computeVMargins(el);
- if (naturalOffset < minOffset) {
- flexEls.push(el);
- flexOffsets.push(naturalOffset);
- flexHeights.push(naturalHeight);
- }
- else {
- // this element stretches past recommended height (non-expandable). mark the space as occupied.
- usedHeight += naturalOffset;
- }
- });
- // readjust the recommended height to only consider the height available to non-maxed-out rows.
- if (shouldRedistribute) {
- availableHeight -= usedHeight;
- minOffset1 = Math.floor(availableHeight / flexEls.length);
- minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
- }
- // assign heights to all expandable elements
- flexEls.forEach(function (el, i) {
- var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
- var naturalOffset = flexOffsets[i];
- var naturalHeight = flexHeights[i];
- var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
- if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
- el.style.height = newHeight + 'px';
- }
- });
- }
- // Undoes distrubuteHeight, restoring all els to their natural height
- function undistributeHeight(els) {
- els.forEach(function (el) {
- el.style.height = '';
- });
- }
- // Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
- // cells to be that width.
- // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
- function matchCellWidths(els) {
- var maxInnerWidth = 0;
- els.forEach(function (el) {
- var innerEl = el.firstChild; // hopefully an element
- if (innerEl instanceof HTMLElement) {
- var innerWidth_1 = innerEl.getBoundingClientRect().width;
- if (innerWidth_1 > maxInnerWidth) {
- maxInnerWidth = innerWidth_1;
- }
- }
- });
- maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
- els.forEach(function (el) {
- el.style.width = maxInnerWidth + 'px';
- });
- return maxInnerWidth;
- }
- // Given one element that resides inside another,
- // Subtracts the height of the inner element from the outer element.
- function subtractInnerElHeight(outerEl, innerEl) {
- // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
- var reflowStyleProps = {
- position: 'relative',
- left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
- };
- applyStyle(outerEl, reflowStyleProps);
- applyStyle(innerEl, reflowStyleProps);
- var diff = // grab the dimensions
- outerEl.getBoundingClientRect().height -
- innerEl.getBoundingClientRect().height;
- // undo hack
- var resetStyleProps = { position: '', left: '' };
- applyStyle(outerEl, resetStyleProps);
- applyStyle(innerEl, resetStyleProps);
- return diff;
- }
- /* Selection
- ----------------------------------------------------------------------------------------------------------------------*/
- function preventSelection(el) {
- el.classList.add('fc-unselectable');
- el.addEventListener('selectstart', preventDefault);
- }
- function allowSelection(el) {
- el.classList.remove('fc-unselectable');
- el.removeEventListener('selectstart', preventDefault);
- }
- /* Context Menu
- ----------------------------------------------------------------------------------------------------------------------*/
- function preventContextMenu(el) {
- el.addEventListener('contextmenu', preventDefault);
- }
- function allowContextMenu(el) {
- el.removeEventListener('contextmenu', preventDefault);
- }
- /* Object Ordering by Field
- ----------------------------------------------------------------------------------------------------------------------*/
- function parseFieldSpecs(input) {
- var specs = [];
- var tokens = [];
- var i;
- var token;
- if (typeof input === 'string') {
- tokens = input.split(/\s*,\s*/);
- }
- else if (typeof input === 'function') {
- tokens = [input];
- }
- else if (Array.isArray(input)) {
- tokens = input;
- }
- for (i = 0; i < tokens.length; i++) {
- token = tokens[i];
- if (typeof token === 'string') {
- specs.push(token.charAt(0) === '-' ?
- { field: token.substring(1), order: -1 } :
- { field: token, order: 1 });
- }
- else if (typeof token === 'function') {
- specs.push({ func: token });
- }
- }
- return specs;
- }
- function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
- var i;
- var cmp;
- for (i = 0; i < fieldSpecs.length; i++) {
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
- if (cmp) {
- return cmp;
- }
- }
- return 0;
- }
- function compareByFieldSpec(obj0, obj1, fieldSpec) {
- if (fieldSpec.func) {
- return fieldSpec.func(obj0, obj1);
- }
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
- * (fieldSpec.order || 1);
- }
- function flexibleCompare(a, b) {
- if (!a && !b) {
- return 0;
- }
- if (b == null) {
- return -1;
- }
- if (a == null) {
- return 1;
- }
- if (typeof a === 'string' || typeof b === 'string') {
- return String(a).localeCompare(String(b));
- }
- return a - b;
- }
- /* String Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function capitaliseFirstLetter(str) {
- return str.charAt(0).toUpperCase() + str.slice(1);
- }
- function padStart(val, len) {
- var s = String(val);
- return '000'.substr(0, len - s.length) + s;
- }
- /* Number Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function compareNumbers(a, b) {
- return a - b;
- }
- function isInt(n) {
- return n % 1 === 0;
- }
- /* Weird Utilities
- ----------------------------------------------------------------------------------------------------------------------*/
- function applyAll(functions, thisObj, args) {
- if (typeof functions === 'function') { // supplied a single function
- functions = [functions];
- }
- if (functions) {
- var i = void 0;
- var ret = void 0;
- for (i = 0; i < functions.length; i++) {
- ret = functions[i].apply(thisObj, args) || ret;
- }
- return ret;
- }
- }
- function firstDefined() {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- for (var i = 0; i < args.length; i++) {
- if (args[i] !== undefined) {
- return args[i];
- }
- }
- }
- // Returns a function, that, as long as it continues to be invoked, will not
- // be triggered. The function will be called after it stops being called for
- // N milliseconds. If `immediate` is passed, trigger the function on the
- // leading edge, instead of the trailing.
- // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
- function debounce(func, wait) {
- var timeout;
- var args;
- var context;
- var timestamp;
- var result;
- var later = function () {
- var last = new Date().valueOf() - timestamp;
- if (last < wait) {
- timeout = setTimeout(later, wait - last);
- }
- else {
- timeout = null;
- result = func.apply(context, args);
- context = args = null;
- }
- };
- return function () {
- context = this;
- args = arguments;
- timestamp = new Date().valueOf();
- if (!timeout) {
- timeout = setTimeout(later, wait);
- }
- return result;
- };
- }
- // Number and Boolean are only types that defaults or not computed for
- // TODO: write more comments
- function refineProps(rawProps, processors, defaults, leftoverProps) {
- if (defaults === void 0) { defaults = {}; }
- var refined = {};
- for (var key in processors) {
- var processor = processors[key];
- if (rawProps[key] !== undefined) {
- // found
- if (processor === Function) {
- refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
- }
- else if (processor) { // a refining function?
- refined[key] = processor(rawProps[key]);
- }
- else {
- refined[key] = rawProps[key];
- }
- }
- else if (defaults[key] !== undefined) {
- // there's an explicit default
- refined[key] = defaults[key];
- }
- else {
- // must compute a default
- if (processor === String) {
- refined[key] = ''; // empty string is default for String
- }
- else if (!processor || processor === Number || processor === Boolean || processor === Function) {
- refined[key] = null; // assign null for other non-custom processor funcs
- }
- else {
- refined[key] = processor(null); // run the custom processor func
- }
- }
- }
- if (leftoverProps) {
- for (var key in rawProps) {
- if (processors[key] === undefined) {
- leftoverProps[key] = rawProps[key];
- }
- }
- }
- return refined;
- }
- /* Date stuff that doesn't belong in datelib core
- ----------------------------------------------------------------------------------------------------------------------*/
- // given a timed range, computes an all-day range that has the same exact duration,
- // but whose start time is aligned with the start of the day.
- function computeAlignedDayRange(timedRange) {
- var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
- var start = startOfDay(timedRange.start);
- var end = addDays(start, dayCnt);
- return { start: start, end: end };
- }
- // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
- // TODO: give nextDayThreshold a default arg
- function computeVisibleDayRange(timedRange, nextDayThreshold) {
- if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
- var startDay = null;
- var endDay = null;
- if (timedRange.end) {
- endDay = startOfDay(timedRange.end);
- var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
- // If the end time is actually inclusively part of the next day and is equal to or
- // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
- // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
- endDay = addDays(endDay, 1);
- }
- }
- if (timedRange.start) {
- startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
- // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
- if (endDay && endDay <= startDay) {
- endDay = addDays(startDay, 1);
- }
- }
- return { start: startDay, end: endDay };
- }
- // spans from one day into another?
- function isMultiDayRange(range) {
- var visibleRange = computeVisibleDayRange(range);
- return diffDays(visibleRange.start, visibleRange.end) > 1;
- }
- function diffDates(date0, date1, dateEnv, largeUnit) {
- if (largeUnit === 'year') {
- return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
- }
- else if (largeUnit === 'month') {
- return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
- }
- else {
- return diffDayAndTime(date0, date1); // returns a duration
- }
- }
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
- for (var i = 0; i < recurringTypes.length; i++) {
- var localLeftovers = {};
- var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
- if (parsed) {
- var allDay = localLeftovers.allDay;
- delete localLeftovers.allDay; // remove from leftovers
- if (allDay == null) {
- allDay = allDayDefault;
- if (allDay == null) {
- allDay = parsed.allDayGuess;
- if (allDay == null) {
- allDay = false;
- }
- }
- }
- __assign(leftovers, localLeftovers);
- return {
- allDay: allDay,
- duration: parsed.duration,
- typeData: parsed.typeData,
- typeId: i
- };
- }
- }
- return null;
- }
- /*
- Event MUST have a recurringDef
- */
- function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
- var typeDef = recurringTypes[eventDef.recurringDef.typeId];
- var markers = typeDef.expand(eventDef.recurringDef.typeData, {
- start: dateEnv.subtract(framingRange.start, duration),
- end: framingRange.end
- }, dateEnv);
- // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
- if (eventDef.allDay) {
- markers = markers.map(startOfDay);
- }
- return markers;
- }
-
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- // Merges an array of objects into a single object.
- // The second argument allows for an array of property names who's object values will be merged together.
- function mergeProps(propObjs, complexProps) {
- var dest = {};
- var i;
- var name;
- var complexObjs;
- var j;
- var val;
- var props;
- if (complexProps) {
- for (i = 0; i < complexProps.length; i++) {
- name = complexProps[i];
- complexObjs = [];
- // collect the trailing object values, stopping when a non-object is discovered
- for (j = propObjs.length - 1; j >= 0; j--) {
- val = propObjs[j][name];
- if (typeof val === 'object' && val) { // non-null object
- complexObjs.unshift(val);
- }
- else if (val !== undefined) {
- dest[name] = val; // if there were no objects, this value will be used
- break;
- }
- }
- // if the trailing values were objects, use the merged value
- if (complexObjs.length) {
- dest[name] = mergeProps(complexObjs);
- }
- }
- }
- // copy values into the destination, going from last to first
- for (i = propObjs.length - 1; i >= 0; i--) {
- props = propObjs[i];
- for (name in props) {
- if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
- dest[name] = props[name];
- }
- }
- }
- return dest;
- }
- function filterHash(hash, func) {
- var filtered = {};
- for (var key in hash) {
- if (func(hash[key], key)) {
- filtered[key] = hash[key];
- }
- }
- return filtered;
- }
- function mapHash(hash, func) {
- var newHash = {};
- for (var key in hash) {
- newHash[key] = func(hash[key], key);
- }
- return newHash;
- }
- function arrayToHash(a) {
- var hash = {};
- for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
- var item = a_1[_i];
- hash[item] = true;
- }
- return hash;
- }
- function hashValuesToArray(obj) {
- var a = [];
- for (var key in obj) {
- a.push(obj[key]);
- }
- return a;
- }
- function isPropsEqual(obj0, obj1) {
- for (var key in obj0) {
- if (hasOwnProperty.call(obj0, key)) {
- if (!(key in obj1)) {
- return false;
- }
- }
- }
- for (var key in obj1) {
- if (hasOwnProperty.call(obj1, key)) {
- if (obj0[key] !== obj1[key]) {
- return false;
- }
- }
- }
- return true;
- }
-
- function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
- var eventStore = createEmptyEventStore();
- for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
- var rawEvent = rawEvents_1[_i];
- var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
- if (tuple) {
- eventTupleToStore(tuple, eventStore);
- }
- }
- return eventStore;
- }
- function eventTupleToStore(tuple, eventStore) {
- if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
- eventStore.defs[tuple.def.defId] = tuple.def;
- if (tuple.instance) {
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
- }
- return eventStore;
- }
- function expandRecurring(eventStore, framingRange, calendar) {
- var dateEnv = calendar.dateEnv;
- var defs = eventStore.defs, instances = eventStore.instances;
- // remove existing recurring instances
- instances = filterHash(instances, function (instance) {
- return !defs[instance.defId].recurringDef;
- });
- for (var defId in defs) {
- var def = defs[defId];
- if (def.recurringDef) {
- var duration = def.recurringDef.duration;
- if (!duration) {
- duration = def.allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration;
- }
- var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
- for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
- var start = starts_1[_i];
- var instance = createEventInstance(defId, {
- start: start,
- end: dateEnv.add(start, duration)
- });
- instances[instance.instanceId] = instance;
- }
- }
- }
- return { defs: defs, instances: instances };
- }
- // retrieves events that have the same groupId as the instance specified by `instanceId`
- // or they are the same as the instance.
- // why might instanceId not be in the store? an event from another calendar?
- function getRelevantEvents(eventStore, instanceId) {
- var instance = eventStore.instances[instanceId];
- if (instance) {
- var def_1 = eventStore.defs[instance.defId];
- // get events/instances with same group
- var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
- return isEventDefsGrouped(def_1, lookDef);
- });
- // add the original
- // TODO: wish we could use eventTupleToStore or something like it
- newStore.defs[def_1.defId] = def_1;
- newStore.instances[instance.instanceId] = instance;
- return newStore;
- }
- return createEmptyEventStore();
- }
- function isEventDefsGrouped(def0, def1) {
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
- }
- function transformRawEvents(rawEvents, eventSource, calendar) {
- var calEachTransform = calendar.opt('eventDataTransform');
- var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
- if (sourceEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
- }
- if (calEachTransform) {
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
- }
- return rawEvents;
- }
- function transformEachRawEvent(rawEvents, func) {
- var refinedEvents;
- if (!func) {
- refinedEvents = rawEvents;
- }
- else {
- refinedEvents = [];
- for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
- var rawEvent = rawEvents_2[_i];
- var refinedEvent = func(rawEvent);
- if (refinedEvent) {
- refinedEvents.push(refinedEvent);
- }
- else if (refinedEvent == null) {
- refinedEvents.push(rawEvent);
- } // if a different falsy value, do nothing
- }
- }
- return refinedEvents;
- }
- function createEmptyEventStore() {
- return { defs: {}, instances: {} };
- }
- function mergeEventStores(store0, store1) {
- return {
- defs: __assign({}, store0.defs, store1.defs),
- instances: __assign({}, store0.instances, store1.instances)
- };
- }
- function filterEventStoreDefs(eventStore, filterFunc) {
- var defs = filterHash(eventStore.defs, filterFunc);
- var instances = filterHash(eventStore.instances, function (instance) {
- return defs[instance.defId]; // still exists?
- });
- return { defs: defs, instances: instances };
- }
-
- function parseRange(input, dateEnv) {
- var start = null;
- var end = null;
- if (input.start) {
- start = dateEnv.createMarker(input.start);
- }
- if (input.end) {
- end = dateEnv.createMarker(input.end);
- }
- if (!start && !end) {
- return null;
- }
- if (start && end && end < start) {
- return null;
- }
- return { start: start, end: end };
- }
- // SIDE-EFFECT: will mutate ranges.
- // Will return a new array result.
- function invertRanges(ranges, constraintRange) {
- var invertedRanges = [];
- var start = constraintRange.start; // the end of the previous range. the start of the new range
- var i;
- var dateRange;
- // ranges need to be in order. required for our date-walking algorithm
- ranges.sort(compareRanges);
- for (i = 0; i < ranges.length; i++) {
- dateRange = ranges[i];
- // add the span of time before the event (if there is any)
- if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: dateRange.start });
- }
- if (dateRange.end > start) {
- start = dateRange.end;
- }
- }
- // add the span of time after the last event (if there is any)
- if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
- invertedRanges.push({ start: start, end: constraintRange.end });
- }
- return invertedRanges;
- }
- function compareRanges(range0, range1) {
- return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
- }
- function intersectRanges(range0, range1) {
- var start = range0.start;
- var end = range0.end;
- var newRange = null;
- if (range1.start !== null) {
- if (start === null) {
- start = range1.start;
- }
- else {
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
- }
- }
- if (range1.end != null) {
- if (end === null) {
- end = range1.end;
- }
- else {
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
- }
- }
- if (start === null || end === null || start < end) {
- newRange = { start: start, end: end };
- }
- return newRange;
- }
- function rangesEqual(range0, range1) {
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
- (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
- }
- function rangesIntersect(range0, range1) {
- return (range0.end === null || range1.start === null || range0.end > range1.start) &&
- (range0.start === null || range1.end === null || range0.start < range1.end);
- }
- function rangeContainsRange(outerRange, innerRange) {
- return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
- (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
- }
- function rangeContainsMarker(range, date) {
- return (range.start === null || date >= range.start) &&
- (range.end === null || date < range.end);
- }
- // If the given date is not within the given range, move it inside.
- // (If it's past the end, make it one millisecond before the end).
- function constrainMarkerToRange(date, range) {
- if (range.start != null && date < range.start) {
- return range.start;
- }
- if (range.end != null && date >= range.end) {
- return new Date(range.end.valueOf() - 1);
- }
- return date;
- }
-
- function removeExact(array, exactVal) {
- var removeCnt = 0;
- var i = 0;
- while (i < array.length) {
- if (array[i] === exactVal) {
- array.splice(i, 1);
- removeCnt++;
- }
- else {
- i++;
- }
- }
- return removeCnt;
- }
- function isArraysEqual(a0, a1) {
- var len = a0.length;
- var i;
- if (len !== a1.length) { // not array? or not same length?
- return false;
- }
- for (i = 0; i < len; i++) {
- if (a0[i] !== a1[i]) {
- return false;
- }
- }
- return true;
- }
-
- function memoize(workerFunc) {
- var args;
- var res;
- return function () {
- if (!args || !isArraysEqual(args, arguments)) {
- args = arguments;
- res = workerFunc.apply(this, arguments);
- }
- return res;
- };
- }
- /*
- always executes the workerFunc, but if the result is equal to the previous result,
- return the previous result instead.
- */
- function memoizeOutput(workerFunc, equalityFunc) {
- var cachedRes = null;
- return function () {
- var newRes = workerFunc.apply(this, arguments);
- if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
- cachedRes = newRes;
- }
- return cachedRes;
- };
- }
-
- var EXTENDED_SETTINGS_AND_SEVERITIES = {
- week: 3,
- separator: 0,
- omitZeroMinute: 0,
- meridiem: 0,
- omitCommas: 0
- };
- var STANDARD_DATE_PROP_SEVERITIES = {
- timeZoneName: 7,
- era: 6,
- year: 5,
- month: 4,
- day: 2,
- weekday: 2,
- hour: 1,
- minute: 1,
- second: 1
- };
- var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
- var COMMA_RE = /,/g; // we need re for globalness
- var MULTI_SPACE_RE = /\s+/g;
- var LTR_RE = /\u200e/g; // control character
- var UTC_RE = /UTC|GMT/;
- var NativeFormatter = /** @class */ (function () {
- function NativeFormatter(formatSettings) {
- var standardDateProps = {};
- var extendedSettings = {};
- var severity = 0;
- for (var name_1 in formatSettings) {
- if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
- extendedSettings[name_1] = formatSettings[name_1];
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
- }
- else {
- standardDateProps[name_1] = formatSettings[name_1];
- if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
- }
- }
- }
- this.standardDateProps = standardDateProps;
- this.extendedSettings = extendedSettings;
- this.severity = severity;
- this.buildFormattingFunc = memoize(buildFormattingFunc);
- }
- NativeFormatter.prototype.format = function (date, context) {
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
- };
- NativeFormatter.prototype.formatRange = function (start, end, context) {
- var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
- var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
- if (!diffSeverity) {
- return this.format(start, context);
- }
- var biggestUnitForPartial = diffSeverity;
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
- (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
- (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
- (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
- biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
- }
- var full0 = this.format(start, context);
- var full1 = this.format(end, context);
- if (full0 === full1) {
- return full0;
- }
- var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
- var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
- var partial0 = partialFormattingFunc(start);
- var partial1 = partialFormattingFunc(end);
- var insertion = findCommonInsertion(full0, partial0, full1, partial1);
- var separator = extendedSettings.separator || '';
- if (insertion) {
- return insertion.before + partial0 + separator + partial1 + insertion.after;
- }
- return full0 + separator + full1;
- };
- NativeFormatter.prototype.getLargestUnit = function () {
- switch (this.severity) {
- case 7:
- case 6:
- case 5:
- return 'year';
- case 4:
- return 'month';
- case 3:
- return 'week';
- default:
- return 'day';
- }
- };
- return NativeFormatter;
- }());
- function buildFormattingFunc(standardDateProps, extendedSettings, context) {
- var standardDatePropCnt = Object.keys(standardDateProps).length;
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
- return function (date) {
- return formatTimeZoneOffset(date.timeZoneOffset);
- };
- }
- if (standardDatePropCnt === 0 && extendedSettings.week) {
- return function (date) {
- return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
- };
- }
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
- }
- function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
- standardDateProps = __assign({}, standardDateProps); // copy
- extendedSettings = __assign({}, extendedSettings); // copy
- sanitizeSettings(standardDateProps, extendedSettings);
- standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
- var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
- var zeroFormat; // needed?
- if (extendedSettings.omitZeroMinute) {
- var zeroProps = __assign({}, standardDateProps);
- delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
- }
- return function (date) {
- var marker = date.marker;
- var format;
- if (zeroFormat && !marker.getUTCMinutes()) {
- format = zeroFormat;
- }
- else {
- format = normalFormat;
- }
- var s = format.format(marker);
- return postProcess(s, date, standardDateProps, extendedSettings, context);
- };
- }
- function sanitizeSettings(standardDateProps, extendedSettings) {
- // deal with a browser inconsistency where formatting the timezone
- // requires that the hour/minute be present.
- if (standardDateProps.timeZoneName) {
- if (!standardDateProps.hour) {
- standardDateProps.hour = '2-digit';
- }
- if (!standardDateProps.minute) {
- standardDateProps.minute = '2-digit';
- }
- }
- // only support short timezone names
- if (standardDateProps.timeZoneName === 'long') {
- standardDateProps.timeZoneName = 'short';
- }
- // if requesting to display seconds, MUST display minutes
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
- delete extendedSettings.omitZeroMinute;
- }
- }
- function postProcess(s, date, standardDateProps, extendedSettings, context) {
- s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
- if (standardDateProps.timeZoneName === 'short') {
- s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
- 'UTC' : // important to normalize for IE, which does "GMT"
- formatTimeZoneOffset(date.timeZoneOffset));
- }
- if (extendedSettings.omitCommas) {
- s = s.replace(COMMA_RE, '').trim();
- }
- if (extendedSettings.omitZeroMinute) {
- s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
- }
- // ^ do anything that might create adjacent spaces before this point,
- // because MERIDIEM_RE likes to eat up loading spaces
- if (extendedSettings.meridiem === false) {
- s = s.replace(MERIDIEM_RE, '').trim();
- }
- else if (extendedSettings.meridiem === 'narrow') { // a/p
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase();
- });
- }
- else if (extendedSettings.meridiem === 'short') { // am/pm
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
- return m1.toLocaleLowerCase() + 'm';
- });
- }
- else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
- s = s.replace(MERIDIEM_RE, function (m0) {
- return m0.toLocaleLowerCase();
- });
- }
- s = s.replace(MULTI_SPACE_RE, ' ');
- s = s.trim();
- return s;
- }
- function injectTzoStr(s, tzoStr) {
- var replaced = false;
- s = s.replace(UTC_RE, function () {
- replaced = true;
- return tzoStr;
- });
- // IE11 doesn't include UTC/GMT in the original string, so append to end
- if (!replaced) {
- s += ' ' + tzoStr;
- }
- return s;
- }
- function formatWeekNumber(num, weekLabel, locale, display) {
- var parts = [];
- if (display === 'narrow') {
- parts.push(weekLabel);
- }
- else if (display === 'short') {
- parts.push(weekLabel, ' ');
- }
- // otherwise, considered 'numeric'
- parts.push(locale.simpleNumberFormat.format(num));
- if (locale.options.isRtl) { // TODO: use control characters instead?
- parts.reverse();
- }
- return parts.join('');
- }
- // Range Formatting Utils
- // 0 = exactly the same
- // 1 = different by time
- // and bigger
- function computeMarkerDiffSeverity(d0, d1, ca) {
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
- return 5;
- }
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
- return 4;
- }
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
- return 2;
- }
- if (timeAsMs(d0) !== timeAsMs(d1)) {
- return 1;
- }
- return 0;
- }
- function computePartialFormattingOptions(options, biggestUnit) {
- var partialOptions = {};
- for (var name_2 in options) {
- if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
- STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
- partialOptions[name_2] = options[name_2];
- }
- }
- return partialOptions;
- }
- function findCommonInsertion(full0, partial0, full1, partial1) {
- var i0 = 0;
- while (i0 < full0.length) {
- var found0 = full0.indexOf(partial0, i0);
- if (found0 === -1) {
- break;
- }
- var before0 = full0.substr(0, found0);
- i0 = found0 + partial0.length;
- var after0 = full0.substr(i0);
- var i1 = 0;
- while (i1 < full1.length) {
- var found1 = full1.indexOf(partial1, i1);
- if (found1 === -1) {
- break;
- }
- var before1 = full1.substr(0, found1);
- i1 = found1 + partial1.length;
- var after1 = full1.substr(i1);
- if (before0 === before1 && after0 === after1) {
- return {
- before: before0,
- after: after0
- };
- }
- }
- }
- return null;
- }
-
- /*
- TODO: fix the terminology of "formatter" vs "formatting func"
- */
- /*
- At the time of instantiation, this object does not know which cmd-formatting system it will use.
- It receives this at the time of formatting, as a setting.
- */
- var CmdFormatter = /** @class */ (function () {
- function CmdFormatter(cmdStr, separator) {
- this.cmdStr = cmdStr;
- this.separator = separator;
- }
- CmdFormatter.prototype.format = function (date, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
- };
- CmdFormatter.prototype.formatRange = function (start, end, context) {
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
- };
- return CmdFormatter;
- }());
-
- var FuncFormatter = /** @class */ (function () {
- function FuncFormatter(func) {
- this.func = func;
- }
- FuncFormatter.prototype.format = function (date, context) {
- return this.func(createVerboseFormattingArg(date, null, context));
- };
- FuncFormatter.prototype.formatRange = function (start, end, context) {
- return this.func(createVerboseFormattingArg(start, end, context));
- };
- return FuncFormatter;
- }());
-
- // Formatter Object Creation
- function createFormatter(input, defaultSeparator) {
- if (typeof input === 'object' && input) { // non-null object
- if (typeof defaultSeparator === 'string') {
- input = __assign({ separator: defaultSeparator }, input);
- }
- return new NativeFormatter(input);
- }
- else if (typeof input === 'string') {
- return new CmdFormatter(input, defaultSeparator);
- }
- else if (typeof input === 'function') {
- return new FuncFormatter(input);
- }
- }
- // String Utils
- // timeZoneOffset is in minutes
- function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
- if (stripZeroTime === void 0) { stripZeroTime = false; }
- var s = marker.toISOString();
- s = s.replace('.000', '');
- if (stripZeroTime) {
- s = s.replace('T00:00:00Z', '');
- }
- if (s.length > 10) { // time part wasn't stripped, can add timezone info
- if (timeZoneOffset == null) {
- s = s.replace('Z', '');
- }
- else if (timeZoneOffset !== 0) {
- s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
- }
- // otherwise, its UTC-0 and we want to keep the Z
- }
- return s;
- }
- function formatIsoTimeString(marker) {
- return padStart(marker.getUTCHours(), 2) + ':' +
- padStart(marker.getUTCMinutes(), 2) + ':' +
- padStart(marker.getUTCSeconds(), 2);
- }
- function formatTimeZoneOffset(minutes, doIso) {
- if (doIso === void 0) { doIso = false; }
- var sign = minutes < 0 ? '-' : '+';
- var abs = Math.abs(minutes);
- var hours = Math.floor(abs / 60);
- var mins = Math.round(abs % 60);
- if (doIso) {
- return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
- }
- else {
- return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
- }
- }
- // Arg Utils
- function createVerboseFormattingArg(start, end, context, separator) {
- var startInfo = expandZonedMarker(start, context.calendarSystem);
- var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
- return {
- date: startInfo,
- start: startInfo,
- end: endInfo,
- timeZone: context.timeZone,
- localeCodes: context.locale.codes,
- separator: separator
- };
- }
- function expandZonedMarker(dateInfo, calendarSystem) {
- var a = calendarSystem.markerToArray(dateInfo.marker);
- return {
- marker: dateInfo.marker,
- timeZoneOffset: dateInfo.timeZoneOffset,
- array: a,
- year: a[0],
- month: a[1],
- day: a[2],
- hour: a[3],
- minute: a[4],
- second: a[5],
- millisecond: a[6]
- };
- }
-
- var EventSourceApi = /** @class */ (function () {
- function EventSourceApi(calendar, internalEventSource) {
- this.calendar = calendar;
- this.internalEventSource = internalEventSource;
- }
- EventSourceApi.prototype.remove = function () {
- this.calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: this.internalEventSource.sourceId
- });
- };
- EventSourceApi.prototype.refetch = function () {
- this.calendar.dispatch({
- type: 'FETCH_EVENT_SOURCES',
- sourceIds: [this.internalEventSource.sourceId]
- });
- };
- Object.defineProperty(EventSourceApi.prototype, "id", {
- get: function () {
- return this.internalEventSource.publicId;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventSourceApi.prototype, "url", {
- // only relevant to json-feed event sources
- get: function () {
- return this.internalEventSource.meta.url;
- },
- enumerable: true,
- configurable: true
- });
- return EventSourceApi;
- }());
-
- var EventApi = /** @class */ (function () {
- function EventApi(calendar, def, instance) {
- this._calendar = calendar;
- this._def = def;
- this._instance = instance || null;
- }
- /*
- TODO: make event struct more responsible for this
- */
- EventApi.prototype.setProp = function (name, val) {
- var _a, _b;
- if (name in DATE_PROPS) ;
- else if (name in NON_DATE_PROPS) {
- if (typeof NON_DATE_PROPS[name] === 'function') {
- val = NON_DATE_PROPS[name](val);
- }
- this.mutate({
- standardProps: (_a = {}, _a[name] = val, _a)
- });
- }
- else if (name in UNSCOPED_EVENT_UI_PROPS) {
- var ui = void 0;
- if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
- val = UNSCOPED_EVENT_UI_PROPS[name](val);
- }
- if (name === 'color') {
- ui = { backgroundColor: val, borderColor: val };
- }
- else if (name === 'editable') {
- ui = { startEditable: val, durationEditable: val };
- }
- else {
- ui = (_b = {}, _b[name] = val, _b);
- }
- this.mutate({
- standardProps: { ui: ui }
- });
- }
- };
- EventApi.prototype.setExtendedProp = function (name, val) {
- var _a;
- this.mutate({
- extendedProps: (_a = {}, _a[name] = val, _a)
- });
- };
- EventApi.prototype.setStart = function (startInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var start = dateEnv.createMarker(startInput);
- if (start && this._instance) { // TODO: warning if parsed bad
- var instanceRange = this._instance.range;
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
- if (options.maintainDuration) {
- this.mutate({ datesDelta: startDelta });
- }
- else {
- this.mutate({ startDelta: startDelta });
- }
- }
- };
- EventApi.prototype.setEnd = function (endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var end;
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) {
- return; // TODO: warning if parsed bad
- }
- }
- if (this._instance) {
- if (end) {
- var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
- this.mutate({ endDelta: endDelta });
- }
- else {
- this.mutate({ standardProps: { hasEnd: false } });
- }
- }
- };
- EventApi.prototype.setDates = function (startInput, endInput, options) {
- if (options === void 0) { options = {}; }
- var dateEnv = this._calendar.dateEnv;
- var standardProps = { allDay: options.allDay };
- var start = dateEnv.createMarker(startInput);
- var end;
- if (!start) {
- return; // TODO: warning if parsed bad
- }
- if (endInput != null) {
- end = dateEnv.createMarker(endInput);
- if (!end) { // TODO: warning if parsed bad
- return;
- }
- }
- if (this._instance) {
- var instanceRange = this._instance.range;
- // when computing the diff for an event being converted to all-day,
- // compute diff off of the all-day values the way event-mutation does.
- if (options.allDay === true) {
- instanceRange = computeAlignedDayRange(instanceRange);
- }
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
- if (end) {
- var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
- if (durationsEqual(startDelta, endDelta)) {
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- else {
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
- }
- }
- else { // means "clear the end"
- standardProps.hasEnd = false;
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
- }
- }
- };
- EventApi.prototype.moveStart = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ startDelta: delta });
- }
- };
- EventApi.prototype.moveEnd = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ endDelta: delta });
- }
- };
- EventApi.prototype.moveDates = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // TODO: warning if parsed bad
- this.mutate({ datesDelta: delta });
- }
- };
- EventApi.prototype.setAllDay = function (allDay, options) {
- if (options === void 0) { options = {}; }
- var standardProps = { allDay: allDay };
- var maintainDuration = options.maintainDuration;
- if (maintainDuration == null) {
- maintainDuration = this._calendar.opt('allDayMaintainDuration');
- }
- if (this._def.allDay !== allDay) {
- standardProps.hasEnd = maintainDuration;
- }
- this.mutate({ standardProps: standardProps });
- };
- EventApi.prototype.formatRange = function (formatInput) {
- var dateEnv = this._calendar.dateEnv;
- var instance = this._instance;
- var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
- if (this._def.hasEnd) {
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
- forcedStartTzo: instance.forcedStartTzo,
- forcedEndTzo: instance.forcedEndTzo
- });
- }
- else {
- return dateEnv.format(instance.range.start, formatter, {
- forcedTzo: instance.forcedStartTzo
- });
- }
- };
- EventApi.prototype.mutate = function (mutation) {
- var def = this._def;
- var instance = this._instance;
- if (instance) {
- this._calendar.dispatch({
- type: 'MUTATE_EVENTS',
- instanceId: instance.instanceId,
- mutation: mutation,
- fromApi: true
- });
- var eventStore = this._calendar.state.eventStore;
- this._def = eventStore.defs[def.defId];
- this._instance = eventStore.instances[instance.instanceId];
- }
- };
- EventApi.prototype.remove = function () {
- this._calendar.dispatch({
- type: 'REMOVE_EVENT_DEF',
- defId: this._def.defId
- });
- };
- Object.defineProperty(EventApi.prototype, "source", {
- get: function () {
- var sourceId = this._def.sourceId;
- if (sourceId) {
- return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
- }
- return null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "start", {
- get: function () {
- return this._instance ?
- this._calendar.dateEnv.toDate(this._instance.range.start) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "end", {
- get: function () {
- return (this._instance && this._def.hasEnd) ?
- this._calendar.dateEnv.toDate(this._instance.range.end) :
- null;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "id", {
- // computable props that all access the def
- // TODO: find a TypeScript-compatible way to do this at scale
- get: function () { return this._def.publicId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "groupId", {
- get: function () { return this._def.groupId; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allDay", {
- get: function () { return this._def.allDay; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "title", {
- get: function () { return this._def.title; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "url", {
- get: function () { return this._def.url; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "rendering", {
- get: function () { return this._def.rendering; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "startEditable", {
- get: function () { return this._def.ui.startEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "durationEditable", {
- get: function () { return this._def.ui.durationEditable; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "constraint", {
- get: function () { return this._def.ui.constraints[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "overlap", {
- get: function () { return this._def.ui.overlap; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "allow", {
- get: function () { return this._def.ui.allows[0] || null; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "backgroundColor", {
- get: function () { return this._def.ui.backgroundColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "borderColor", {
- get: function () { return this._def.ui.borderColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "textColor", {
- get: function () { return this._def.ui.textColor; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "classNames", {
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
- get: function () { return this._def.ui.classNames; },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(EventApi.prototype, "extendedProps", {
- get: function () { return this._def.extendedProps; },
- enumerable: true,
- configurable: true
- });
- return EventApi;
- }());
-
- /*
- Specifying nextDayThreshold signals that all-day ranges should be sliced.
- */
- function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
- var inverseBgByGroupId = {};
- var inverseBgByDefId = {};
- var defByGroupId = {};
- var bgRanges = [];
- var fgRanges = [];
- var eventUis = compileEventUis(eventStore.defs, eventUiBases);
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId] = [];
- if (!defByGroupId[def.groupId]) {
- defByGroupId[def.groupId] = def;
- }
- }
- else {
- inverseBgByDefId[defId] = [];
- }
- }
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = eventStore.defs[instance.defId];
- var ui = eventUis[def.defId];
- var origRange = instance.range;
- var normalRange = (!def.allDay && nextDayThreshold) ?
- computeVisibleDayRange(origRange, nextDayThreshold) :
- origRange;
- var slicedRange = intersectRanges(normalRange, framingRange);
- if (slicedRange) {
- if (def.rendering === 'inverse-background') {
- if (def.groupId) {
- inverseBgByGroupId[def.groupId].push(slicedRange);
- }
- else {
- inverseBgByDefId[instance.defId].push(slicedRange);
- }
- }
- else {
- (def.rendering === 'background' ? bgRanges : fgRanges).push({
- def: def,
- ui: ui,
- instance: instance,
- range: slicedRange,
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
- });
- }
- }
- }
- for (var groupId in inverseBgByGroupId) { // BY GROUP
- var ranges = inverseBgByGroupId[groupId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
- var invertedRange = invertedRanges_1[_i];
- var def = defByGroupId[groupId];
- var ui = eventUis[def.defId];
- bgRanges.push({
- def: def,
- ui: ui,
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- for (var defId in inverseBgByDefId) {
- var ranges = inverseBgByDefId[defId];
- var invertedRanges = invertRanges(ranges, framingRange);
- for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
- var invertedRange = invertedRanges_2[_a];
- bgRanges.push({
- def: eventStore.defs[defId],
- ui: eventUis[defId],
- instance: null,
- range: invertedRange,
- isStart: false,
- isEnd: false
- });
- }
- }
- return { bg: bgRanges, fg: fgRanges };
- }
- function hasBgRendering(def) {
- return def.rendering === 'background' || def.rendering === 'inverse-background';
- }
- function filterSegsViaEls(context, segs, isMirror) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventRender')) {
- segs = segs.filter(function (seg) {
- var custom = calendar.publiclyTrigger('eventRender', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirror,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- // TODO: include seg.range once all components consistently generate it
- el: seg.el,
- view: view
- }
- ]);
- if (custom === false) { // means don't render at all
- return false;
- }
- else if (custom && custom !== true) {
- seg.el = custom;
- }
- return true;
- });
- }
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- setElSeg(seg.el, seg);
- }
- return segs;
- }
- function setElSeg(el, seg) {
- el.fcSeg = seg;
- }
- function getElSeg(el) {
- return el.fcSeg || null;
- }
- // event ui computation
- function compileEventUis(eventDefs, eventUiBases) {
- return mapHash(eventDefs, function (eventDef) {
- return compileEventUi(eventDef, eventUiBases);
- });
- }
- function compileEventUi(eventDef, eventUiBases) {
- var uis = [];
- if (eventUiBases['']) {
- uis.push(eventUiBases['']);
- }
- if (eventUiBases[eventDef.defId]) {
- uis.push(eventUiBases[eventDef.defId]);
- }
- uis.push(eventDef.ui);
- return combineEventUis(uis);
- }
- // triggers
- function triggerRenderedSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- if (calendar.hasPublicHandlers('eventPositioned')) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- calendar.publiclyTriggerAfterSizing('eventPositioned', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- isStart: seg.isStart,
- isEnd: seg.isEnd,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- if (!calendar.state.eventSourceLoadingLevel) { // avoid initial empty state while pending
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
- }
- }
- function triggerWillRemoveSegs(context, segs, isMirrors) {
- var calendar = context.calendar, view = context.view;
- for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
- var seg = segs_3[_i];
- calendar.trigger('eventElRemove', seg.el);
- }
- if (calendar.hasPublicHandlers('eventDestroy')) {
- for (var _a = 0, segs_4 = segs; _a < segs_4.length; _a++) {
- var seg = segs_4[_a];
- calendar.publiclyTrigger('eventDestroy', [
- {
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- isMirror: isMirrors,
- el: seg.el,
- view: view
- }
- ]);
- }
- }
- }
- // is-interactable
- function computeEventDraggable(context, eventDef, eventUi) {
- var calendar = context.calendar, view = context.view;
- var transformers = calendar.pluginSystem.hooks.isDraggableTransformers;
- var val = eventUi.startEditable;
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- val = transformer(val, eventDef, eventUi, view);
- }
- return val;
- }
- function computeEventStartResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable && context.options.eventResizableFromStart;
- }
- function computeEventEndResizable(context, eventDef, eventUi) {
- return eventUi.durationEditable;
- }
-
- // applies the mutation to ALL defs/instances within the event store
- function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
- var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
- var dest = createEmptyEventStore();
- for (var defId in eventStore.defs) {
- var def = eventStore.defs[defId];
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
- }
- for (var instanceId in eventStore.instances) {
- var instance = eventStore.instances[instanceId];
- var def = dest.defs[instance.defId]; // important to grab the newly modified def
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
- }
- return dest;
- }
- function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
- var standardProps = mutation.standardProps || {};
- // if hasEnd has not been specified, guess a good value based on deltas.
- // if duration will change, there's no way the default duration will persist,
- // and thus, we need to mark the event as having a real end
- if (standardProps.hasEnd == null &&
- eventConfig.durationEditable &&
- (mutation.startDelta || mutation.endDelta)) {
- standardProps.hasEnd = true; // TODO: is this mutation okay?
- }
- var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
- if (mutation.extendedProps) {
- copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
- }
- for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
- var applier = appliers_1[_i];
- applier(copy, mutation, calendar);
- }
- if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
- copy.hasEnd = true;
- }
- return copy;
- }
- function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
- eventConfig, mutation, calendar) {
- var dateEnv = calendar.dateEnv;
- var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
- var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
- var copy = __assign({}, eventInstance);
- if (forceAllDay) {
- copy.range = computeAlignedDayRange(copy.range);
- }
- if (mutation.datesDelta && eventConfig.startEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
- };
- }
- if (mutation.startDelta && eventConfig.durationEditable) {
- copy.range = {
- start: dateEnv.add(copy.range.start, mutation.startDelta),
- end: copy.range.end
- };
- }
- if (mutation.endDelta && eventConfig.durationEditable) {
- copy.range = {
- start: copy.range.start,
- end: dateEnv.add(copy.range.end, mutation.endDelta)
- };
- }
- if (clearEnd) {
- copy.range = {
- start: copy.range.start,
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
- };
- }
- // in case event was all-day but the supplied deltas were not
- // better util for this?
- if (eventDef.allDay) {
- copy.range = {
- start: startOfDay(copy.range.start),
- end: startOfDay(copy.range.end)
- };
- }
- // handle invalid durations
- if (copy.range.end < copy.range.start) {
- copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
- }
- return copy;
- }
-
- function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
- switch (action.type) {
- case 'RECEIVE_EVENTS': // raw
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
- case 'ADD_EVENTS': // already parsed, but not expanded
- return addEvent(eventStore, action.eventStore, // new ones
- dateProfile ? dateProfile.activeRange : null, calendar);
- case 'MERGE_EVENTS': // already parsed and expanded
- return mergeEventStores(eventStore, action.eventStore);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return expandRecurring(eventStore, dateProfile.activeRange, calendar);
- }
- else {
- return eventStore;
- }
- case 'CHANGE_TIMEZONE':
- return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
- case 'MUTATE_EVENTS':
- return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
- case 'REMOVE_EVENT_INSTANCES':
- return excludeInstances(eventStore, action.instances);
- case 'REMOVE_EVENT_DEF':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.defId !== action.defId;
- });
- case 'REMOVE_EVENT_SOURCE':
- return excludeEventsBySourceId(eventStore, action.sourceId);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return !eventDef.sourceId; // only keep events with no source id
- });
- case 'REMOVE_ALL_EVENTS':
- return createEmptyEventStore();
- case 'RESET_EVENTS':
- return {
- defs: eventStore.defs,
- instances: eventStore.instances
- };
- default:
- return eventStore;
- }
- }
- function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
- ) {
- var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
- if (fetchRange) {
- subset = expandRecurring(subset, fetchRange, calendar);
- }
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
- }
- return eventStore;
- }
- function addEvent(eventStore, subset, expandRange, calendar) {
- if (expandRange) {
- subset = expandRecurring(subset, expandRange, calendar);
- }
- return mergeEventStores(eventStore, subset);
- }
- function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
- var defs = eventStore.defs;
- var instances = mapHash(eventStore.instances, function (instance) {
- var def = defs[instance.defId];
- if (def.allDay || def.recurringDef) {
- return instance; // isn't dependent on timezone
- }
- else {
- return __assign({}, instance, { range: {
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
- }
- });
- return { defs: defs, instances: instances };
- }
- function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
- var relevant = getRelevantEvents(eventStore, instanceId);
- var eventConfigBase = fromApi ?
- { '': {
- startEditable: true,
- durationEditable: true,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- } } :
- calendar.eventUiBases;
- relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
- return mergeEventStores(eventStore, relevant);
- }
- function excludeEventsBySourceId(eventStore, sourceId) {
- return filterEventStoreDefs(eventStore, function (eventDef) {
- return eventDef.sourceId !== sourceId;
- });
- }
- // QUESTION: why not just return instances? do a general object-property-exclusion util
- function excludeInstances(eventStore, removals) {
- return {
- defs: eventStore.defs,
- instances: filterHash(eventStore.instances, function (instance) {
- return !removals[instance.instanceId];
- })
- };
- }
-
- // high-level segmenting-aware tester functions
- // ------------------------------------------------------------------------------------------------------------------------
- function isInteractionValid(interaction, calendar) {
- return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
- }
- function isDateSelectionValid(dateSelection, calendar) {
- return isNewPropsValid({ dateSelection: dateSelection }, calendar);
- }
- function isNewPropsValid(newProps, calendar) {
- var view = calendar.view;
- var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
- return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
- }
- function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
- if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
- return false;
- }
- return true;
- }
- // Moving Event Validation
- // ------------------------------------------------------------------------------------------------------------------------
- function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
- var subjectEventStore = interaction.mutatedEvents;
- var subjectDefs = subjectEventStore.defs;
- var subjectInstances = subjectEventStore.instances;
- var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
- state.eventUiBases :
- { '': calendar.selectionConfig } // if not a real event, validate as a selection
- );
- if (filterConfig) {
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
- }
- var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
- var otherDefs = otherEventStore.defs;
- var otherInstances = otherEventStore.instances;
- var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
- for (var subjectInstanceId in subjectInstances) {
- var subjectInstance = subjectInstances[subjectInstanceId];
- var subjectRange = subjectInstance.range;
- var subjectConfig = subjectConfigs[subjectInstance.defId];
- var subjectDef = subjectDefs[subjectInstance.defId];
- // constraint
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('eventOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var otherInstanceId in otherInstances) {
- var otherInstance = otherInstances[otherInstanceId];
- // intersect! evaluate
- if (rangesIntersect(subjectRange, otherInstance.range)) {
- var otherOverlap = otherConfigs[otherInstance.defId].overlap;
- // consider the other event's overlap. only do this if the subject event is a "real" event
- if (otherOverlap === false && interaction.isEvent) {
- return false;
- }
- if (subjectConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
- new EventApi(calendar, subjectDef, subjectInstance) // moving event
- )) {
- return false;
- }
- }
- }
- // allow (a function)
- var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
- for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
- var subjectAllow = _a[_i];
- var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
- var origDef = calendarEventStore.defs[subjectDef.defId];
- var origInstance = calendarEventStore.instances[subjectInstanceId];
- var eventApi = void 0;
- if (origDef) { // was previously in the calendar
- eventApi = new EventApi(calendar, origDef, origInstance);
- }
- else { // was an external event
- eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
- }
- if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
- return false;
- }
- }
- }
- return true;
- }
- // Date Selection Validation
- // ------------------------------------------------------------------------------------------------------------------------
- function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
- var relevantEventStore = state.eventStore;
- var relevantDefs = relevantEventStore.defs;
- var relevantInstances = relevantEventStore.instances;
- var selection = state.dateSelection;
- var selectionRange = selection.range;
- var selectionConfig = calendar.selectionConfig;
- if (filterConfig) {
- selectionConfig = filterConfig(selectionConfig);
- }
- // constraint
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
- return false;
- }
- // overlap
- var overlapFunc = calendar.opt('selectOverlap');
- if (typeof overlapFunc !== 'function') {
- overlapFunc = null;
- }
- for (var relevantInstanceId in relevantInstances) {
- var relevantInstance = relevantInstances[relevantInstanceId];
- // intersect! evaluate
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
- if (selectionConfig.overlap === false) {
- return false;
- }
- if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
- return false;
- }
- }
- }
- // allow (a function)
- for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
- var selectionAllow = _a[_i];
- var fullDateSpan = __assign({}, dateSpanMeta, selection);
- if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
- return false;
- }
- }
- return true;
- }
- // Constraint Utils
- // ------------------------------------------------------------------------------------------------------------------------
- function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
- for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
- var constraint = constraints_1[_i];
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
- return false;
- }
- }
- return true;
- }
- function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
- otherEventStore, // for if constraint is an even group ID
- businessHoursUnexpanded, // for if constraint is 'businessHours'
- calendar // for expanding businesshours
- ) {
- if (constraint === 'businessHours') {
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
- }
- else if (typeof constraint === 'string') { // an group ID
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
- return eventDef.groupId === constraint;
- }));
- }
- else if (typeof constraint === 'object' && constraint) { // non-null object
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
- }
- return []; // if it's false
- }
- // TODO: move to event-store file?
- function eventStoreToRanges(eventStore) {
- var instances = eventStore.instances;
- var ranges = [];
- for (var instanceId in instances) {
- ranges.push(instances[instanceId].range);
- }
- return ranges;
- }
- // TODO: move to geom file?
- function anyRangesContainRange(outerRanges, innerRange) {
- for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
- var outerRange = outerRanges_1[_i];
- if (rangeContainsRange(outerRange, innerRange)) {
- return true;
- }
- }
- return false;
- }
- // Parsing
- // ------------------------------------------------------------------------------------------------------------------------
- function normalizeConstraint(input, calendar) {
- if (Array.isArray(input)) {
- return parseEvents(input, '', calendar, true); // allowOpenRange=true
- }
- else if (typeof input === 'object' && input) { // non-null object
- return parseEvents([input], '', calendar, true); // allowOpenRange=true
- }
- else if (input != null) {
- return String(input);
- }
- else {
- return null;
- }
- }
-
- function htmlEscape(s) {
- return (s + '').replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/'/g, '&#039;')
- .replace(/"/g, '&quot;')
- .replace(/\n/g, '<br />');
- }
- // Given a hash of CSS properties, returns a string of CSS.
- // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
- function cssToStr(cssProps) {
- var statements = [];
- for (var name_1 in cssProps) {
- var val = cssProps[name_1];
- if (val != null && val !== '') {
- statements.push(name_1 + ':' + val);
- }
- }
- return statements.join(';');
- }
- // Given an object hash of HTML attribute names to values,
- // generates a string that can be injected between < > in HTML
- function attrsToStr(attrs) {
- var parts = [];
- for (var name_2 in attrs) {
- var val = attrs[name_2];
- if (val != null) {
- parts.push(name_2 + '="' + htmlEscape(val) + '"');
- }
- }
- return parts.join(' ');
- }
- function parseClassName(raw) {
- if (Array.isArray(raw)) {
- return raw;
- }
- else if (typeof raw === 'string') {
- return raw.split(/\s+/);
- }
- else {
- return [];
- }
- }
-
- var UNSCOPED_EVENT_UI_PROPS = {
- editable: Boolean,
- startEditable: Boolean,
- durationEditable: Boolean,
- constraint: null,
- overlap: null,
- allow: null,
- className: parseClassName,
- classNames: parseClassName,
- color: String,
- backgroundColor: String,
- borderColor: String,
- textColor: String
- };
- function processUnscopedUiProps(rawProps, calendar, leftovers) {
- var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
- var constraint = normalizeConstraint(props.constraint, calendar);
- return {
- startEditable: props.startEditable != null ? props.startEditable : props.editable,
- durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
- constraints: constraint != null ? [constraint] : [],
- overlap: props.overlap,
- allows: props.allow != null ? [props.allow] : [],
- backgroundColor: props.backgroundColor || props.color,
- borderColor: props.borderColor || props.color,
- textColor: props.textColor,
- classNames: props.classNames.concat(props.className)
- };
- }
- function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
- var rawUnscoped = {};
- var wasFound = {};
- for (var key in UNSCOPED_EVENT_UI_PROPS) {
- var scopedKey = prefix + capitaliseFirstLetter(key);
- rawUnscoped[key] = rawScoped[scopedKey];
- wasFound[scopedKey] = true;
- }
- if (prefix === 'event') {
- rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
- }
- if (leftovers) {
- for (var key in rawScoped) {
- if (!wasFound[key]) {
- leftovers[key] = rawScoped[key];
- }
- }
- }
- return processUnscopedUiProps(rawUnscoped, calendar);
- }
- var EMPTY_EVENT_UI = {
- startEditable: null,
- durationEditable: null,
- constraints: [],
- overlap: null,
- allows: [],
- backgroundColor: '',
- borderColor: '',
- textColor: '',
- classNames: []
- };
- // prevent against problems with <2 args!
- function combineEventUis(uis) {
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
- }
- function combineTwoEventUis(item0, item1) {
- return {
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
- constraints: item0.constraints.concat(item1.constraints),
- overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
- allows: item0.allows.concat(item1.allows),
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
- borderColor: item1.borderColor || item0.borderColor,
- textColor: item1.textColor || item0.textColor,
- classNames: item0.classNames.concat(item1.classNames)
- };
- }
-
- var NON_DATE_PROPS = {
- id: String,
- groupId: String,
- title: String,
- url: String,
- rendering: String,
- extendedProps: null
- };
- var DATE_PROPS = {
- start: null,
- date: null,
- end: null,
- allDay: null
- };
- var uid = 0;
- function parseEvent(raw, sourceId, calendar, allowOpenRange) {
- var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
- var leftovers0 = {};
- var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
- allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
- );
- if (recurringRes) {
- var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
- def.recurringDef = {
- typeId: recurringRes.typeId,
- typeData: recurringRes.typeData,
- duration: recurringRes.duration
- };
- return { def: def, instance: null };
- }
- else {
- var leftovers1 = {};
- var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
- if (singleRes) {
- var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
- var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
- return { def: def, instance: instance };
- }
- }
- return null;
- }
- /*
- Will NOT populate extendedProps with the leftover properties.
- Will NOT populate date-related props.
- The EventNonDateInput has been normalized (id => publicId, etc).
- */
- function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
- var leftovers = {};
- var def = pluckNonDateProps(raw, calendar, leftovers);
- def.defId = String(uid++);
- def.sourceId = sourceId;
- def.allDay = allDay;
- def.hasEnd = hasEnd;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
- var eventDefParser = _a[_i];
- var newLeftovers = {};
- eventDefParser(def, leftovers, newLeftovers);
- leftovers = newLeftovers;
- }
- def.extendedProps = __assign(leftovers, def.extendedProps || {});
- // help out EventApi from having user modify props
- Object.freeze(def.ui.classNames);
- Object.freeze(def.extendedProps);
- return def;
- }
- function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
- return {
- instanceId: String(uid++),
- defId: defId,
- range: range,
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
- };
- }
- function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
- var props = pluckDateProps(raw, leftovers);
- var allDay = props.allDay;
- var startMeta;
- var startMarker = null;
- var hasEnd = false;
- var endMeta;
- var endMarker = null;
- startMeta = calendar.dateEnv.createMarkerMeta(props.start);
- if (startMeta) {
- startMarker = startMeta.marker;
- }
- else if (!allowOpenRange) {
- return null;
- }
- if (props.end != null) {
- endMeta = calendar.dateEnv.createMarkerMeta(props.end);
- }
- if (allDay == null) {
- if (allDayDefault != null) {
- allDay = allDayDefault;
- }
- else {
- // fall back to the date props LAST
- allDay = (!startMeta || startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- }
- if (allDay && startMarker) {
- startMarker = startOfDay(startMarker);
- }
- if (endMeta) {
- endMarker = endMeta.marker;
- if (allDay) {
- endMarker = startOfDay(endMarker);
- }
- if (startMarker && endMarker <= startMarker) {
- endMarker = null;
- }
- }
- if (endMarker) {
- hasEnd = true;
- }
- else if (!allowOpenRange) {
- hasEnd = calendar.opt('forceEventDuration') || false;
- endMarker = calendar.dateEnv.add(startMarker, allDay ?
- calendar.defaultAllDayEventDuration :
- calendar.defaultTimedEventDuration);
- }
- return {
- allDay: allDay,
- hasEnd: hasEnd,
- range: { start: startMarker, end: endMarker },
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
- };
- }
- function pluckDateProps(raw, leftovers) {
- var props = refineProps(raw, DATE_PROPS, {}, leftovers);
- props.start = (props.start !== null) ? props.start : props.date;
- delete props.date;
- return props;
- }
- function pluckNonDateProps(raw, calendar, leftovers) {
- var preLeftovers = {};
- var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
- var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
- props.publicId = props.id;
- delete props.id;
- props.ui = ui;
- return props;
- }
- function computeIsAllDayDefault(sourceId, calendar) {
- var res = null;
- if (sourceId) {
- var source = calendar.state.eventSources[sourceId];
- res = source.allDayDefault;
- }
- if (res == null) {
- res = calendar.opt('allDayDefault');
- }
- return res;
- }
-
- var DEF_DEFAULTS = {
- startTime: '09:00',
- endTime: '17:00',
- daysOfWeek: [1, 2, 3, 4, 5],
- rendering: 'inverse-background',
- classNames: 'fc-nonbusiness',
- groupId: '_businessHours' // so multiple defs get grouped
- };
- /*
- TODO: pass around as EventDefHash!!!
- */
- function parseBusinessHours(input, calendar) {
- return parseEvents(refineInputs(input), '', calendar);
- }
- function refineInputs(input) {
- var rawDefs;
- if (input === true) {
- rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
- }
- else if (Array.isArray(input)) {
- // if specifying an array, every sub-definition NEEDS a day-of-week
- rawDefs = input.filter(function (rawDef) {
- return rawDef.daysOfWeek;
- });
- }
- else if (typeof input === 'object' && input) { // non-null object
- rawDefs = [input];
- }
- else { // is probably false
- rawDefs = [];
- }
- rawDefs = rawDefs.map(function (rawDef) {
- return __assign({}, DEF_DEFAULTS, rawDef);
- });
- return rawDefs;
- }
-
- function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
- if (dependencies === void 0) { dependencies = []; }
- var dependents = [];
- var thisContext;
- var prevArgs;
- function unrender() {
- if (prevArgs) {
- for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
- var dependent = dependents_1[_i];
- dependent.unrender();
- }
- if (unrenderFunc) {
- unrenderFunc.apply(thisContext, prevArgs);
- }
- prevArgs = null;
- }
- }
- function res() {
- if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
- unrender();
- thisContext = this;
- prevArgs = arguments;
- renderFunc.apply(this, arguments);
- }
- }
- res.dependents = dependents;
- res.unrender = unrender;
- for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
- var dependency = dependencies_1[_i];
- dependency.dependents.push(res);
- }
- return res;
- }
-
- var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
- var Splitter = /** @class */ (function () {
- function Splitter() {
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
- this.splitDateSelection = memoize(this._splitDateSpan);
- this.splitEventStore = memoize(this._splitEventStore);
- this.splitIndividualUi = memoize(this._splitIndividualUi);
- this.splitEventDrag = memoize(this._splitInteraction);
- this.splitEventResize = memoize(this._splitInteraction);
- this.eventUiBuilders = {}; // TODO: typescript protection
- }
- Splitter.prototype.splitProps = function (props) {
- var _this = this;
- var keyInfos = this.getKeyInfo(props);
- var defKeys = this.getKeysForEventDefs(props.eventStore);
- var dateSelections = this.splitDateSelection(props.dateSelection);
- var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
- var eventStores = this.splitEventStore(props.eventStore, defKeys);
- var eventDrags = this.splitEventDrag(props.eventDrag);
- var eventResizes = this.splitEventResize(props.eventResize);
- var splitProps = {};
- this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
- return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
- });
- for (var key in keyInfos) {
- var keyInfo = keyInfos[key];
- var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
- var buildEventUi = this.eventUiBuilders[key];
- splitProps[key] = {
- businessHours: keyInfo.businessHours || props.businessHours,
- dateSelection: dateSelections[key] || null,
- eventStore: eventStore,
- eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
- eventDrag: eventDrags[key] || null,
- eventResize: eventResizes[key] || null
- };
- }
- return splitProps;
- };
- Splitter.prototype._splitDateSpan = function (dateSpan) {
- var dateSpans = {};
- if (dateSpan) {
- var keys = this.getKeysForDateSpan(dateSpan);
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
- var key = keys_1[_i];
- dateSpans[key] = dateSpan;
- }
- }
- return dateSpans;
- };
- Splitter.prototype._getKeysForEventDefs = function (eventStore) {
- var _this = this;
- return mapHash(eventStore.defs, function (eventDef) {
- return _this.getKeysForEventDef(eventDef);
- });
- };
- Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
- var defs = eventStore.defs, instances = eventStore.instances;
- var splitStores = {};
- for (var defId in defs) {
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitStores[key]) {
- splitStores[key] = createEmptyEventStore();
- }
- splitStores[key].defs[defId] = defs[defId];
- }
- }
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
- var key = _c[_b];
- if (splitStores[key]) { // must have already been created
- splitStores[key].instances[instanceId] = instance;
- }
- }
- }
- return splitStores;
- };
- Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
- var splitHashes = {};
- for (var defId in eventUiBases) {
- if (defId) { // not the '' key
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
- var key = _a[_i];
- if (!splitHashes[key]) {
- splitHashes[key] = {};
- }
- splitHashes[key][defId] = eventUiBases[defId];
- }
- }
- }
- return splitHashes;
- };
- Splitter.prototype._splitInteraction = function (interaction) {
- var splitStates = {};
- if (interaction) {
- var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
- );
- // can't rely on defKeys because event data is mutated
- var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
- var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
- var populate = function (key) {
- if (!splitStates[key]) {
- splitStates[key] = {
- affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
- mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
- isEvent: interaction.isEvent,
- origSeg: interaction.origSeg
- };
- }
- };
- for (var key in affectedStores_1) {
- populate(key);
- }
- for (var key in mutatedStores_1) {
- populate(key);
- }
- }
- return splitStates;
- };
- return Splitter;
- }());
- function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
- var baseParts = [];
- if (allUi) {
- baseParts.push(allUi);
- }
- if (eventUiForKey) {
- baseParts.push(eventUiForKey);
- }
- var stuff = {
- '': combineEventUis(baseParts)
- };
- if (individualUi) {
- __assign(stuff, individualUi);
- }
- return stuff;
- }
-
- // Generates HTML for an anchor to another view into the calendar.
- // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
- // `gotoOptions` can either be a DateMarker, or an object with the form:
- // { date, type, forceOff }
- // `type` is a view-type like "day" or "week". default value is "day".
- // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
- function buildGotoAnchorHtml(allOptions, dateEnv, gotoOptions, attrs, innerHtml) {
- var date;
- var type;
- var forceOff;
- var finalOptions;
- if (gotoOptions instanceof Date) {
- date = gotoOptions; // a single date-like input
- }
- else {
- date = gotoOptions.date;
- type = gotoOptions.type;
- forceOff = gotoOptions.forceOff;
- }
- finalOptions = {
- date: dateEnv.formatIso(date, { omitTime: true }),
- type: type || 'day'
- };
- if (typeof attrs === 'string') {
- innerHtml = attrs;
- attrs = null;
- }
- attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
- innerHtml = innerHtml || '';
- if (!forceOff && allOptions.navLinks) {
- return '<a' + attrs +
- ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
- innerHtml +
- '</a>';
- }
- else {
- return '<span' + attrs + '>' +
- innerHtml +
- '</span>';
- }
- }
- function getAllDayHtml(allOptions) {
- return allOptions.allDayHtml || htmlEscape(allOptions.allDayText);
- }
- // Computes HTML classNames for a single-day element
- function getDayClasses(date, dateProfile, context, noThemeHighlight) {
- var calendar = context.calendar, options = context.options, theme = context.theme, dateEnv = context.dateEnv;
- var classes = [];
- var todayStart;
- var todayEnd;
- if (!rangeContainsMarker(dateProfile.activeRange, date)) {
- classes.push('fc-disabled-day');
- }
- else {
- classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
- if (options.monthMode &&
- dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
- classes.push('fc-other-month');
- }
- todayStart = startOfDay(calendar.getNow());
- todayEnd = addDays(todayStart, 1);
- if (date < todayStart) {
- classes.push('fc-past');
- }
- else if (date >= todayEnd) {
- classes.push('fc-future');
- }
- else {
- classes.push('fc-today');
- if (noThemeHighlight !== true) {
- classes.push(theme.getClass('today'));
- }
- }
- }
- return classes;
- }
-
- // given a function that resolves a result asynchronously.
- // the function can either call passed-in success and failure callbacks,
- // or it can return a promise.
- // if you need to pass additional params to func, bind them first.
- function unpromisify(func, success, failure) {
- // guard against success/failure callbacks being called more than once
- // and guard against a promise AND callback being used together.
- var isResolved = false;
- var wrappedSuccess = function () {
- if (!isResolved) {
- isResolved = true;
- success.apply(this, arguments);
- }
- };
- var wrappedFailure = function () {
- if (!isResolved) {
- isResolved = true;
- if (failure) {
- failure.apply(this, arguments);
- }
- }
- };
- var res = func(wrappedSuccess, wrappedFailure);
- if (res && typeof res.then === 'function') {
- res.then(wrappedSuccess, wrappedFailure);
- }
- }
-
- var Mixin = /** @class */ (function () {
- function Mixin() {
- }
- // mix into a CLASS
- Mixin.mixInto = function (destClass) {
- this.mixIntoObj(destClass.prototype);
- };
- // mix into ANY object
- Mixin.mixIntoObj = function (destObj) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- if (!destObj[name]) { // if destination doesn't already define it
- destObj[name] = _this.prototype[name];
- }
- });
- };
- /*
- will override existing methods
- TODO: remove! not used anymore
- */
- Mixin.mixOver = function (destClass) {
- var _this = this;
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
- destClass.prototype[name] = _this.prototype[name];
- });
- };
- return Mixin;
- }());
-
- /*
- USAGE:
- import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
- in class:
- on: EmitterInterface['on']
- one: EmitterInterface['one']
- off: EmitterInterface['off']
- trigger: EmitterInterface['trigger']
- triggerWith: EmitterInterface['triggerWith']
- hasHandlers: EmitterInterface['hasHandlers']
- after class:
- EmitterMixin.mixInto(TheClass)
- */
- var EmitterMixin = /** @class */ (function (_super) {
- __extends(EmitterMixin, _super);
- function EmitterMixin() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EmitterMixin.prototype.on = function (type, handler) {
- addToHash(this._handlers || (this._handlers = {}), type, handler);
- return this; // for chaining
- };
- // todo: add comments
- EmitterMixin.prototype.one = function (type, handler) {
- addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
- return this; // for chaining
- };
- EmitterMixin.prototype.off = function (type, handler) {
- if (this._handlers) {
- removeFromHash(this._handlers, type, handler);
- }
- if (this._oneHandlers) {
- removeFromHash(this._oneHandlers, type, handler);
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.trigger = function (type) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- this.triggerWith(type, this, args);
- return this; // for chaining
- };
- EmitterMixin.prototype.triggerWith = function (type, context, args) {
- if (this._handlers) {
- applyAll(this._handlers[type], context, args);
- }
- if (this._oneHandlers) {
- applyAll(this._oneHandlers[type], context, args);
- delete this._oneHandlers[type]; // will never fire again
- }
- return this; // for chaining
- };
- EmitterMixin.prototype.hasHandlers = function (type) {
- return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
- (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
- };
- return EmitterMixin;
- }(Mixin));
- function addToHash(hash, type, handler) {
- (hash[type] || (hash[type] = []))
- .push(handler);
- }
- function removeFromHash(hash, type, handler) {
- if (handler) {
- if (hash[type]) {
- hash[type] = hash[type].filter(function (func) {
- return func !== handler;
- });
- }
- }
- else {
- delete hash[type]; // remove all handler funcs for this type
- }
- }
-
- /*
- Records offset information for a set of elements, relative to an origin element.
- Can record the left/right OR the top/bottom OR both.
- Provides methods for querying the cache by position.
- */
- var PositionCache = /** @class */ (function () {
- function PositionCache(originEl, els, isHorizontal, isVertical) {
- this.originEl = originEl;
- this.els = els;
- this.isHorizontal = isHorizontal;
- this.isVertical = isVertical;
- }
- // Queries the els for coordinates and stores them.
- // Call this method before using and of the get* methods below.
- PositionCache.prototype.build = function () {
- var originEl = this.originEl;
- var originClientRect = this.originClientRect =
- originEl.getBoundingClientRect(); // relative to viewport top-left
- if (this.isHorizontal) {
- this.buildElHorizontals(originClientRect.left);
- }
- if (this.isVertical) {
- this.buildElVerticals(originClientRect.top);
- }
- };
- // Populates the left/right internal coordinate arrays
- PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
- var lefts = [];
- var rights = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- lefts.push(rect.left - originClientLeft);
- rights.push(rect.right - originClientLeft);
- }
- this.lefts = lefts;
- this.rights = rights;
- };
- // Populates the top/bottom internal coordinate arrays
- PositionCache.prototype.buildElVerticals = function (originClientTop) {
- var tops = [];
- var bottoms = [];
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
- var el = _a[_i];
- var rect = el.getBoundingClientRect();
- tops.push(rect.top - originClientTop);
- bottoms.push(rect.bottom - originClientTop);
- }
- this.tops = tops;
- this.bottoms = bottoms;
- };
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.leftToIndex = function (leftPosition) {
- var lefts = this.lefts;
- var rights = this.rights;
- var len = lefts.length;
- var i;
- for (i = 0; i < len; i++) {
- if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
- return i;
- }
- }
- };
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
- // If no intersection is made, returns undefined.
- PositionCache.prototype.topToIndex = function (topPosition) {
- var tops = this.tops;
- var bottoms = this.bottoms;
- var len = tops.length;
- var i;
- for (i = 0; i < len; i++) {
- if (topPosition >= tops[i] && topPosition < bottoms[i]) {
- return i;
- }
- }
- };
- // Gets the width of the element at the given index
- PositionCache.prototype.getWidth = function (leftIndex) {
- return this.rights[leftIndex] - this.lefts[leftIndex];
- };
- // Gets the height of the element at the given index
- PositionCache.prototype.getHeight = function (topIndex) {
- return this.bottoms[topIndex] - this.tops[topIndex];
- };
- return PositionCache;
- }());
-
- /*
- An object for getting/setting scroll-related information for an element.
- Internally, this is done very differently for window versus DOM element,
- so this object serves as a common interface.
- */
- var ScrollController = /** @class */ (function () {
- function ScrollController() {
- }
- ScrollController.prototype.getMaxScrollTop = function () {
- return this.getScrollHeight() - this.getClientHeight();
- };
- ScrollController.prototype.getMaxScrollLeft = function () {
- return this.getScrollWidth() - this.getClientWidth();
- };
- ScrollController.prototype.canScrollVertically = function () {
- return this.getMaxScrollTop() > 0;
- };
- ScrollController.prototype.canScrollHorizontally = function () {
- return this.getMaxScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollUp = function () {
- return this.getScrollTop() > 0;
- };
- ScrollController.prototype.canScrollDown = function () {
- return this.getScrollTop() < this.getMaxScrollTop();
- };
- ScrollController.prototype.canScrollLeft = function () {
- return this.getScrollLeft() > 0;
- };
- ScrollController.prototype.canScrollRight = function () {
- return this.getScrollLeft() < this.getMaxScrollLeft();
- };
- return ScrollController;
- }());
- var ElementScrollController = /** @class */ (function (_super) {
- __extends(ElementScrollController, _super);
- function ElementScrollController(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- ElementScrollController.prototype.getScrollTop = function () {
- return this.el.scrollTop;
- };
- ElementScrollController.prototype.getScrollLeft = function () {
- return this.el.scrollLeft;
- };
- ElementScrollController.prototype.setScrollTop = function (top) {
- this.el.scrollTop = top;
- };
- ElementScrollController.prototype.setScrollLeft = function (left) {
- this.el.scrollLeft = left;
- };
- ElementScrollController.prototype.getScrollWidth = function () {
- return this.el.scrollWidth;
- };
- ElementScrollController.prototype.getScrollHeight = function () {
- return this.el.scrollHeight;
- };
- ElementScrollController.prototype.getClientHeight = function () {
- return this.el.clientHeight;
- };
- ElementScrollController.prototype.getClientWidth = function () {
- return this.el.clientWidth;
- };
- return ElementScrollController;
- }(ScrollController));
- var WindowScrollController = /** @class */ (function (_super) {
- __extends(WindowScrollController, _super);
- function WindowScrollController() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- WindowScrollController.prototype.getScrollTop = function () {
- return window.pageYOffset;
- };
- WindowScrollController.prototype.getScrollLeft = function () {
- return window.pageXOffset;
- };
- WindowScrollController.prototype.setScrollTop = function (n) {
- window.scroll(window.pageXOffset, n);
- };
- WindowScrollController.prototype.setScrollLeft = function (n) {
- window.scroll(n, window.pageYOffset);
- };
- WindowScrollController.prototype.getScrollWidth = function () {
- return document.documentElement.scrollWidth;
- };
- WindowScrollController.prototype.getScrollHeight = function () {
- return document.documentElement.scrollHeight;
- };
- WindowScrollController.prototype.getClientHeight = function () {
- return document.documentElement.clientHeight;
- };
- WindowScrollController.prototype.getClientWidth = function () {
- return document.documentElement.clientWidth;
- };
- return WindowScrollController;
- }(ScrollController));
-
- /*
- Embodies a div that has potential scrollbars
- */
- var ScrollComponent = /** @class */ (function (_super) {
- __extends(ScrollComponent, _super);
- function ScrollComponent(overflowX, overflowY) {
- var _this = _super.call(this, createElement('div', {
- className: 'fc-scroller'
- })) || this;
- _this.overflowX = overflowX;
- _this.overflowY = overflowY;
- _this.applyOverflow();
- return _this;
- }
- // sets to natural height, unlocks overflow
- ScrollComponent.prototype.clear = function () {
- this.setHeight('auto');
- this.applyOverflow();
- };
- ScrollComponent.prototype.destroy = function () {
- removeElement(this.el);
- };
- // Overflow
- // -----------------------------------------------------------------------------------------------------------------
- ScrollComponent.prototype.applyOverflow = function () {
- applyStyle(this.el, {
- overflowX: this.overflowX,
- overflowY: this.overflowY
- });
- };
- // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
- // Useful for preserving scrollbar widths regardless of future resizes.
- // Can pass in scrollbarWidths for optimization.
- ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
- var overflowX = this.overflowX;
- var overflowY = this.overflowY;
- scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
- if (overflowX === 'auto') {
- overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
- this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- if (overflowY === 'auto') {
- overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
- this.canScrollVertically() // OR scrolling pane with massless scrollbars?
- ) ? 'scroll' : 'hidden';
- }
- applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
- };
- ScrollComponent.prototype.setHeight = function (height) {
- applyStyleProp(this.el, 'height', height);
- };
- ScrollComponent.prototype.getScrollbarWidths = function () {
- var edges = computeEdges(this.el);
- return {
- left: edges.scrollbarLeft,
- right: edges.scrollbarRight,
- bottom: edges.scrollbarBottom
- };
- };
- return ScrollComponent;
- }(ElementScrollController));
-
- var Theme = /** @class */ (function () {
- function Theme(calendarOptions) {
- this.calendarOptions = calendarOptions;
- this.processIconOverride();
- }
- Theme.prototype.processIconOverride = function () {
- if (this.iconOverrideOption) {
- this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
- }
- };
- Theme.prototype.setIconOverride = function (iconOverrideHash) {
- var iconClassesCopy;
- var buttonName;
- if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
- iconClassesCopy = __assign({}, this.iconClasses);
- for (buttonName in iconOverrideHash) {
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
- }
- this.iconClasses = iconClassesCopy;
- }
- else if (iconOverrideHash === false) {
- this.iconClasses = {};
- }
- };
- Theme.prototype.applyIconOverridePrefix = function (className) {
- var prefix = this.iconOverridePrefix;
- if (prefix && className.indexOf(prefix) !== 0) { // if not already present
- className = prefix + className;
- }
- return className;
- };
- Theme.prototype.getClass = function (key) {
- return this.classes[key] || '';
- };
- Theme.prototype.getIconClass = function (buttonName) {
- var className = this.iconClasses[buttonName];
- if (className) {
- return this.baseIconClass + ' ' + className;
- }
- return '';
- };
- Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
- var className;
- if (this.iconOverrideCustomButtonOption) {
- className = customButtonProps[this.iconOverrideCustomButtonOption];
- if (className) {
- return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
- }
- }
- return '';
- };
- return Theme;
- }());
- Theme.prototype.classes = {};
- Theme.prototype.iconClasses = {};
- Theme.prototype.baseIconClass = '';
- Theme.prototype.iconOverridePrefix = '';
-
- var guid = 0;
- var ComponentContext = /** @class */ (function () {
- function ComponentContext(calendar, theme, dateEnv, options, view) {
- this.calendar = calendar;
- this.theme = theme;
- this.dateEnv = dateEnv;
- this.options = options;
- this.view = view;
- this.isRtl = options.dir === 'rtl';
- this.eventOrderSpecs = parseFieldSpecs(options.eventOrder);
- this.nextDayThreshold = createDuration(options.nextDayThreshold);
- }
- ComponentContext.prototype.extend = function (options, view) {
- return new ComponentContext(this.calendar, this.theme, this.dateEnv, options || this.options, view || this.view);
- };
- return ComponentContext;
- }());
- var Component = /** @class */ (function () {
- function Component() {
- this.everRendered = false;
- this.uid = String(guid++);
- }
- Component.addEqualityFuncs = function (newFuncs) {
- this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
- };
- Component.prototype.receiveProps = function (props, context) {
- this.receiveContext(context);
- var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
- this.props = comboProps;
- if (anyChanges) {
- if (this.everRendered) {
- this.beforeUpdate();
- }
- this.render(comboProps, context);
- if (this.everRendered) {
- this.afterUpdate();
- }
- }
- this.everRendered = true;
- };
- Component.prototype.receiveContext = function (context) {
- var oldContext = this.context;
- this.context = context;
- if (!oldContext) {
- this.firstContext(context);
- }
- };
- Component.prototype.render = function (props, context) {
- };
- Component.prototype.firstContext = function (context) {
- };
- Component.prototype.beforeUpdate = function () {
- };
- Component.prototype.afterUpdate = function () {
- };
- // after destroy is called, this component won't ever be used again
- Component.prototype.destroy = function () {
- };
- return Component;
- }());
- Component.prototype.equalityFuncs = {};
- /*
- Reuses old values when equal. If anything is unequal, returns newProps as-is.
- Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
- */
- function recycleProps(oldProps, newProps, equalityFuncs) {
- var comboProps = {}; // some old, some new
- var anyChanges = false;
- for (var key in newProps) {
- if (key in oldProps && (oldProps[key] === newProps[key] ||
- (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
- // equal to old? use old prop
- comboProps[key] = oldProps[key];
- }
- else {
- comboProps[key] = newProps[key];
- anyChanges = true;
- }
- }
- for (var key in oldProps) {
- if (!(key in newProps)) {
- anyChanges = true;
- break;
- }
- }
- return { anyChanges: anyChanges, comboProps: comboProps };
- }
-
- /*
- PURPOSES:
- - hook up to fg, fill, and mirror renderers
- - interface for dragging and hits
- */
- var DateComponent = /** @class */ (function (_super) {
- __extends(DateComponent, _super);
- function DateComponent(el) {
- var _this = _super.call(this) || this;
- _this.el = el;
- return _this;
- }
- DateComponent.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- removeElement(this.el);
- };
- // Hit System
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.buildPositionCaches = function () {
- };
- DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- return null; // this should be abstract
- };
- // Validation
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isInteractionValid = function (interaction) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- var instances = interaction.mutatedEvents.instances;
- if (dateProfile) { // HACK for DayTile
- for (var instanceId in instances) {
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
- return false;
- }
- }
- }
- return isInteractionValid(interaction, calendar);
- };
- DateComponent.prototype.isDateSelectionValid = function (selection) {
- var calendar = this.context.calendar;
- var dateProfile = this.props.dateProfile; // HACK
- if (dateProfile && // HACK for DayTile
- !rangeContainsRange(dateProfile.validRange, selection.range)) {
- return false;
- }
- return isDateSelectionValid(selection, calendar);
- };
- // Pointer Interaction Utils
- // -----------------------------------------------------------------------------------------------------------------
- DateComponent.prototype.isValidSegDownEl = function (el) {
- return !this.props.eventDrag && // HACK
- !this.props.eventResize && // HACK
- !elementClosest(el, '.fc-mirror') &&
- (this.isPopover() || !this.isInPopover(el));
- // ^above line ensures we don't detect a seg interaction within a nested component.
- // it's a HACK because it only supports a popover as the nested component.
- };
- DateComponent.prototype.isValidDateDownEl = function (el) {
- var segEl = elementClosest(el, this.fgSegSelector);
- return (!segEl || segEl.classList.contains('fc-mirror')) &&
- !elementClosest(el, '.fc-more') && // a "more.." link
- !elementClosest(el, 'a[data-goto]') && // a clickable nav link
- !this.isInPopover(el);
- };
- DateComponent.prototype.isPopover = function () {
- return this.el.classList.contains('fc-popover');
- };
- DateComponent.prototype.isInPopover = function (el) {
- return Boolean(elementClosest(el, '.fc-popover'));
- };
- return DateComponent;
- }(Component));
- DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
- DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
- var uid$1 = 0;
- function createPlugin(input) {
- return {
- id: String(uid$1++),
- deps: input.deps || [],
- reducers: input.reducers || [],
- eventDefParsers: input.eventDefParsers || [],
- isDraggableTransformers: input.isDraggableTransformers || [],
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
- dateSelectionTransformers: input.dateSelectionTransformers || [],
- datePointTransforms: input.datePointTransforms || [],
- dateSpanTransforms: input.dateSpanTransforms || [],
- views: input.views || {},
- viewPropsTransformers: input.viewPropsTransformers || [],
- isPropsValid: input.isPropsValid || null,
- externalDefTransforms: input.externalDefTransforms || [],
- eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
- viewContainerModifiers: input.viewContainerModifiers || [],
- eventDropTransformers: input.eventDropTransformers || [],
- componentInteractions: input.componentInteractions || [],
- calendarInteractions: input.calendarInteractions || [],
- themeClasses: input.themeClasses || {},
- eventSourceDefs: input.eventSourceDefs || [],
- cmdFormatter: input.cmdFormatter,
- recurringTypes: input.recurringTypes || [],
- namedTimeZonedImpl: input.namedTimeZonedImpl,
- defaultView: input.defaultView || '',
- elementDraggingImpl: input.elementDraggingImpl,
- optionChangeHandlers: input.optionChangeHandlers || {}
- };
- }
- var PluginSystem = /** @class */ (function () {
- function PluginSystem() {
- this.hooks = {
- reducers: [],
- eventDefParsers: [],
- isDraggableTransformers: [],
- eventDragMutationMassagers: [],
- eventDefMutationAppliers: [],
- dateSelectionTransformers: [],
- datePointTransforms: [],
- dateSpanTransforms: [],
- views: {},
- viewPropsTransformers: [],
- isPropsValid: null,
- externalDefTransforms: [],
- eventResizeJoinTransforms: [],
- viewContainerModifiers: [],
- eventDropTransformers: [],
- componentInteractions: [],
- calendarInteractions: [],
- themeClasses: {},
- eventSourceDefs: [],
- cmdFormatter: null,
- recurringTypes: [],
- namedTimeZonedImpl: null,
- defaultView: '',
- elementDraggingImpl: null,
- optionChangeHandlers: {}
- };
- this.addedHash = {};
- }
- PluginSystem.prototype.add = function (plugin) {
- if (!this.addedHash[plugin.id]) {
- this.addedHash[plugin.id] = true;
- for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
- var dep = _a[_i];
- this.add(dep);
- }
- this.hooks = combineHooks(this.hooks, plugin);
- }
- };
- return PluginSystem;
- }());
- function combineHooks(hooks0, hooks1) {
- return {
- reducers: hooks0.reducers.concat(hooks1.reducers),
- eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
- views: __assign({}, hooks0.views, hooks1.views),
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
- eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
- viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
- themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
- defaultView: hooks0.defaultView || hooks1.defaultView,
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
- optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
- };
- }
-
- var eventSourceDef = {
- ignoreRange: true,
- parseMeta: function (raw) {
- if (Array.isArray(raw)) { // short form
- return raw;
- }
- else if (Array.isArray(raw.events)) {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success) {
- success({
- rawEvents: arg.eventSource.meta
- });
- }
- };
- var ArrayEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef]
- });
-
- var eventSourceDef$1 = {
- parseMeta: function (raw) {
- if (typeof raw === 'function') { // short form
- return raw;
- }
- else if (typeof raw.events === 'function') {
- return raw.events;
- }
- return null;
- },
- fetch: function (arg, success, failure) {
- var dateEnv = arg.calendar.dateEnv;
- var func = arg.eventSource.meta;
- unpromisify(func.bind(null, {
- start: dateEnv.toDate(arg.range.start),
- end: dateEnv.toDate(arg.range.end),
- startStr: dateEnv.formatIso(arg.range.start),
- endStr: dateEnv.formatIso(arg.range.end),
- timeZone: dateEnv.timeZone
- }), function (rawEvents) {
- success({ rawEvents: rawEvents }); // needs an object response
- }, failure // send errorObj directly to failure callback
- );
- }
- };
- var FuncEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$1]
- });
-
- function requestJson(method, url, params, successCallback, failureCallback) {
- method = method.toUpperCase();
- var body = null;
- if (method === 'GET') {
- url = injectQueryStringParams(url, params);
- }
- else {
- body = encodeParams(params);
- }
- var xhr = new XMLHttpRequest();
- xhr.open(method, url, true);
- if (method !== 'GET') {
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- }
- xhr.onload = function () {
- if (xhr.status >= 200 && xhr.status < 400) {
- try {
- var res = JSON.parse(xhr.responseText);
- successCallback(res, xhr);
- }
- catch (err) {
- failureCallback('Failure parsing JSON', xhr);
- }
- }
- else {
- failureCallback('Request failed', xhr);
- }
- };
- xhr.onerror = function () {
- failureCallback('Request failed', xhr);
- };
- xhr.send(body);
- }
- function injectQueryStringParams(url, params) {
- return url +
- (url.indexOf('?') === -1 ? '?' : '&') +
- encodeParams(params);
- }
- function encodeParams(params) {
- var parts = [];
- for (var key in params) {
- parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
- }
- return parts.join('&');
- }
-
- var eventSourceDef$2 = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') { // short form
- raw = { url: raw };
- }
- else if (!raw || typeof raw !== 'object' || !raw.url) {
- return null;
- }
- return {
- url: raw.url,
- method: (raw.method || 'GET').toUpperCase(),
- extraParams: raw.extraParams,
- startParam: raw.startParam,
- endParam: raw.endParam,
- timeZoneParam: raw.timeZoneParam
- };
- },
- fetch: function (arg, success, failure) {
- var meta = arg.eventSource.meta;
- var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
- requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
- success({ rawEvents: rawEvents, xhr: xhr });
- }, function (errorMessage, xhr) {
- failure({ message: errorMessage, xhr: xhr });
- });
- }
- };
- var JsonFeedEventSourcePlugin = createPlugin({
- eventSourceDefs: [eventSourceDef$2]
- });
- function buildRequestParams(meta, range, calendar) {
- var dateEnv = calendar.dateEnv;
- var startParam;
- var endParam;
- var timeZoneParam;
- var customRequestParams;
- var params = {};
- startParam = meta.startParam;
- if (startParam == null) {
- startParam = calendar.opt('startParam');
- }
- endParam = meta.endParam;
- if (endParam == null) {
- endParam = calendar.opt('endParam');
- }
- timeZoneParam = meta.timeZoneParam;
- if (timeZoneParam == null) {
- timeZoneParam = calendar.opt('timeZoneParam');
- }
- // retrieve any outbound GET/POST data from the options
- if (typeof meta.extraParams === 'function') {
- // supplied as a function that returns a key/value object
- customRequestParams = meta.extraParams();
- }
- else {
- // probably supplied as a straight key/value object
- customRequestParams = meta.extraParams || {};
- }
- __assign(params, customRequestParams);
- params[startParam] = dateEnv.formatIso(range.start);
- params[endParam] = dateEnv.formatIso(range.end);
- if (dateEnv.timeZone !== 'local') {
- params[timeZoneParam] = dateEnv.timeZone;
- }
- return params;
- }
-
- var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- var createMarker = dateEnv.createMarker.bind(dateEnv);
- var processors = {
- daysOfWeek: null,
- startTime: createDuration,
- endTime: createDuration,
- startRecur: createMarker,
- endRecur: createMarker
- };
- var props = refineProps(rawEvent, processors, {}, leftoverProps);
- var anyValid = false;
- for (var propName in props) {
- if (props[propName] != null) {
- anyValid = true;
- break;
- }
- }
- if (anyValid) {
- var duration = null;
- if ('duration' in leftoverProps) {
- duration = createDuration(leftoverProps.duration);
- delete leftoverProps.duration;
- }
- if (!duration && props.startTime && props.endTime) {
- duration = subtractDurations(props.endTime, props.startTime);
- }
- return {
- allDayGuess: Boolean(!props.startTime && !props.endTime),
- duration: duration,
- typeData: props // doesn't need endTime anymore but oh well
- };
- }
- return null;
- },
- expand: function (typeData, framingRange, dateEnv) {
- var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
- if (clippedFramingRange) {
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
- }
- else {
- return [];
- }
- }
- };
- var SimpleRecurrencePlugin = createPlugin({
- recurringTypes: [recurring]
- });
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
- var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
- var dayMarker = startOfDay(framingRange.start);
- var endMarker = framingRange.end;
- var instanceStarts = [];
- while (dayMarker < endMarker) {
- var instanceStart
- // if everyday, or this particular day-of-week
- = void 0;
- // if everyday, or this particular day-of-week
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
- if (startTime) {
- instanceStart = dateEnv.add(dayMarker, startTime);
- }
- else {
- instanceStart = dayMarker;
- }
- instanceStarts.push(instanceStart);
- }
- dayMarker = addDays(dayMarker, 1);
- }
- return instanceStarts;
- }
-
- var DefaultOptionChangeHandlers = createPlugin({
- optionChangeHandlers: {
- events: function (events, calendar, deepEqual) {
- handleEventSources([events], calendar, deepEqual);
- },
- eventSources: handleEventSources,
- plugins: handlePlugins
- }
- });
- function handleEventSources(inputs, calendar, deepEqual) {
- var unfoundSources = hashValuesToArray(calendar.state.eventSources);
- var newInputs = [];
- for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
- var input = inputs_1[_i];
- var inputFound = false;
- for (var i = 0; i < unfoundSources.length; i++) {
- if (deepEqual(unfoundSources[i]._raw, input)) {
- unfoundSources.splice(i, 1); // delete
- inputFound = true;
- break;
- }
- }
- if (!inputFound) {
- newInputs.push(input);
- }
- }
- for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
- var unfoundSource = unfoundSources_1[_a];
- calendar.dispatch({
- type: 'REMOVE_EVENT_SOURCE',
- sourceId: unfoundSource.sourceId
- });
- }
- for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
- var newInput = newInputs_1[_b];
- calendar.addEventSource(newInput);
- }
- }
- // shortcoming: won't remove plugins
- function handlePlugins(inputs, calendar) {
- calendar.addPluginInputs(inputs); // will gracefully handle duplicates
- }
-
- var config = {}; // TODO: make these options
- var globalDefaults = {
- defaultRangeSeparator: ' - ',
- titleRangeSeparator: ' \u2013 ',
- defaultTimedEventDuration: '01:00:00',
- defaultAllDayEventDuration: { day: 1 },
- forceEventDuration: false,
- nextDayThreshold: '00:00:00',
- // display
- columnHeader: true,
- defaultView: '',
- aspectRatio: 1.35,
- header: {
- left: 'title',
- center: '',
- right: 'today prev,next'
- },
- weekends: true,
- weekNumbers: false,
- weekNumberCalculation: 'local',
- editable: false,
- // nowIndicator: false,
- scrollTime: '06:00:00',
- minTime: '00:00:00',
- maxTime: '24:00:00',
- showNonCurrentDates: true,
- // event ajax
- lazyFetching: true,
- startParam: 'start',
- endParam: 'end',
- timeZoneParam: 'timeZone',
- timeZone: 'local',
- // allDayDefault: undefined,
- // locale
- locales: [],
- locale: '',
- // dir: will get this from the default locale
- // buttonIcons: null,
- // allows setting a min-height to the event segment to prevent short events overlapping each other
- timeGridEventMinHeight: 0,
- themeSystem: 'standard',
- // eventResizableFromStart: false,
- dragRevertDuration: 500,
- dragScroll: true,
- allDayMaintainDuration: false,
- // selectable: false,
- unselectAuto: true,
- // selectMinDistance: 0,
- dropAccept: '*',
- eventOrder: 'start,-duration,allDay,title',
- // ^ if start tie, longer events go before shorter. final tie-breaker is title text
- // rerenderDelay: null,
- eventLimit: false,
- eventLimitClick: 'popover',
- dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
- handleWindowResize: true,
- windowResizeDelay: 100,
- longPressDelay: 1000,
- eventDragMinDistance: 5 // only applies to mouse
- };
- var rtlDefaults = {
- header: {
- left: 'next,prev today',
- center: '',
- right: 'title'
- },
- buttonIcons: {
- // TODO: make RTL support the responibility of the theme
- prev: 'fc-icon-chevron-right',
- next: 'fc-icon-chevron-left',
- prevYear: 'fc-icon-chevrons-right',
- nextYear: 'fc-icon-chevrons-left'
- }
- };
- var complexOptions = [
- 'header',
- 'footer',
- 'buttonText',
- 'buttonIcons'
- ];
- // Merges an array of option objects into a single object
- function mergeOptions(optionObjs) {
- return mergeProps(optionObjs, complexOptions);
- }
- // TODO: move this stuff to a "plugin"-related file...
- var INTERNAL_PLUGINS = [
- ArrayEventSourcePlugin,
- FuncEventSourcePlugin,
- JsonFeedEventSourcePlugin,
- SimpleRecurrencePlugin,
- DefaultOptionChangeHandlers
- ];
- function refinePluginDefs(pluginInputs) {
- var plugins = [];
- for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
- var pluginInput = pluginInputs_1[_i];
- if (typeof pluginInput === 'string') {
- var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
- if (!window[globalName]) {
- console.warn('Plugin file not loaded for ' + pluginInput);
- }
- else {
- plugins.push(window[globalName].default); // is an ES6 module
- }
- }
- else {
- plugins.push(pluginInput);
- }
- }
- return INTERNAL_PLUGINS.concat(plugins);
- }
-
- var RAW_EN_LOCALE = {
- code: 'en',
- week: {
- dow: 0,
- doy: 4 // 4 days need to be within the year to be considered the first week
- },
- dir: 'ltr',
- buttonText: {
- prev: 'prev',
- next: 'next',
- prevYear: 'prev year',
- nextYear: 'next year',
- year: 'year',
- today: 'today',
- month: 'month',
- week: 'week',
- day: 'day',
- list: 'list'
- },
- weekLabel: 'W',
- allDayText: 'all-day',
- eventLimitText: 'more',
- noEventsMessage: 'No events to display'
- };
- function parseRawLocales(explicitRawLocales) {
- var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
- var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
- var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
- var allRawLocales = globalArray.concat(// globalArray is low prio
- hashValuesToArray(globalObject), // medium prio
- explicitRawLocales // highest prio
- );
- var rawLocaleMap = {
- en: RAW_EN_LOCALE // necessary?
- };
- for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
- var rawLocale = allRawLocales_1[_i];
- rawLocaleMap[rawLocale.code] = rawLocale;
- }
- return {
- map: rawLocaleMap,
- defaultCode: defaultCode
- };
- }
- function buildLocale(inputSingular, available) {
- if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
- }
- else {
- return queryLocale(inputSingular, available);
- }
- }
- function queryLocale(codeArg, available) {
- var codes = [].concat(codeArg || []); // will convert to array
- var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
- return parseLocale(codeArg, codes, raw);
- }
- function queryRawLocale(codes, available) {
- for (var i = 0; i < codes.length; i++) {
- var parts = codes[i].toLocaleLowerCase().split('-');
- for (var j = parts.length; j > 0; j--) {
- var simpleId = parts.slice(0, j).join('-');
- if (available[simpleId]) {
- return available[simpleId];
- }
- }
- }
- return null;
- }
- function parseLocale(codeArg, codes, raw) {
- var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
- delete merged.code; // don't want this part of the options
- var week = merged.week;
- delete merged.week;
- return {
- codeArg: codeArg,
- codes: codes,
- week: week,
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
- options: merged
- };
- }
-
- var OptionsManager = /** @class */ (function () {
- function OptionsManager(overrides) {
- this.overrides = __assign({}, overrides); // make a copy
- this.dynamicOverrides = {};
- this.compute();
- }
- OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
- if (!Object.keys(updates).length && !removals.length) {
- return;
- }
- var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
- __assign(overrideHash, updates);
- for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
- var propName = removals_1[_i];
- delete overrideHash[propName];
- }
- this.compute();
- };
- // Computes the flattened options hash for the calendar and assigns to `this.options`.
- // Assumes this.overrides and this.dynamicOverrides have already been initialized.
- OptionsManager.prototype.compute = function () {
- // TODO: not a very efficient system
- var locales = firstDefined(// explicit locale option given?
- this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
- var locale = firstDefined(// explicit locales option given?
- this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
- var available = parseRawLocales(locales);
- var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
- var dir = firstDefined(// based on options computed so far, is direction RTL?
- this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
- var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
- this.dirDefaults = dirDefaults;
- this.localeDefaults = localeDefaults;
- this.computed = mergeOptions([
- globalDefaults,
- dirDefaults,
- localeDefaults,
- this.overrides,
- this.dynamicOverrides
- ]);
- };
- return OptionsManager;
- }());
-
- var calendarSystemClassMap = {};
- function registerCalendarSystem(name, theClass) {
- calendarSystemClassMap[name] = theClass;
- }
- function createCalendarSystem(name) {
- return new calendarSystemClassMap[name]();
- }
- var GregorianCalendarSystem = /** @class */ (function () {
- function GregorianCalendarSystem() {
- }
- GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
- return d.getUTCFullYear();
- };
- GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
- return d.getUTCMonth();
- };
- GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
- return d.getUTCDate();
- };
- GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
- return arrayToUtcDate(arr);
- };
- GregorianCalendarSystem.prototype.markerToArray = function (marker) {
- return dateToUtcArray(marker);
- };
- return GregorianCalendarSystem;
- }());
- registerCalendarSystem('gregory', GregorianCalendarSystem);
-
- var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
- function parse(str) {
- var m = ISO_RE.exec(str);
- if (m) {
- var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
- if (isValidDate(marker)) {
- var timeZoneOffset = null;
- if (m[13]) {
- timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
- Number(m[18] || 0));
- }
- return {
- marker: marker,
- isTimeUnspecified: !m[6],
- timeZoneOffset: timeZoneOffset
- };
- }
- }
- return null;
- }
-
- var DateEnv = /** @class */ (function () {
- function DateEnv(settings) {
- var timeZone = this.timeZone = settings.timeZone;
- var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
- }
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
- this.locale = settings.locale;
- this.weekDow = settings.locale.week.dow;
- this.weekDoy = settings.locale.week.doy;
- if (settings.weekNumberCalculation === 'ISO') {
- this.weekDow = 1;
- this.weekDoy = 4;
- }
- if (typeof settings.firstDay === 'number') {
- this.weekDow = settings.firstDay;
- }
- if (typeof settings.weekNumberCalculation === 'function') {
- this.weekNumberFunc = settings.weekNumberCalculation;
- }
- this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
- this.cmdFormatter = settings.cmdFormatter;
- }
- // Creating / Parsing
- DateEnv.prototype.createMarker = function (input) {
- var meta = this.createMarkerMeta(input);
- if (meta === null) {
- return null;
- }
- return meta.marker;
- };
- DateEnv.prototype.createNowMarker = function () {
- if (this.canComputeOffset) {
- return this.timestampToMarker(new Date().valueOf());
- }
- else {
- // if we can't compute the current date val for a timezone,
- // better to give the current local date vals than UTC
- return arrayToUtcDate(dateToLocalArray(new Date()));
- }
- };
- DateEnv.prototype.createMarkerMeta = function (input) {
- if (typeof input === 'string') {
- return this.parse(input);
- }
- var marker = null;
- if (typeof input === 'number') {
- marker = this.timestampToMarker(input);
- }
- else if (input instanceof Date) {
- input = input.valueOf();
- if (!isNaN(input)) {
- marker = this.timestampToMarker(input);
- }
- }
- else if (Array.isArray(input)) {
- marker = arrayToUtcDate(input);
- }
- if (marker === null || !isValidDate(marker)) {
- return null;
- }
- return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
- };
- DateEnv.prototype.parse = function (s) {
- var parts = parse(s);
- if (parts === null) {
- return null;
- }
- var marker = parts.marker;
- var forcedTzo = null;
- if (parts.timeZoneOffset !== null) {
- if (this.canComputeOffset) {
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
- }
- else {
- forcedTzo = parts.timeZoneOffset;
- }
- }
- return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
- };
- // Accessors
- DateEnv.prototype.getYear = function (marker) {
- return this.calendarSystem.getMarkerYear(marker);
- };
- DateEnv.prototype.getMonth = function (marker) {
- return this.calendarSystem.getMarkerMonth(marker);
- };
- // Adding / Subtracting
- DateEnv.prototype.add = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += dur.years;
- a[1] += dur.months;
- a[2] += dur.days;
- a[6] += dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.subtract = function (marker, dur) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] -= dur.years;
- a[1] -= dur.months;
- a[2] -= dur.days;
- a[6] -= dur.milliseconds;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addYears = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[0] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- DateEnv.prototype.addMonths = function (marker, n) {
- var a = this.calendarSystem.markerToArray(marker);
- a[1] += n;
- return this.calendarSystem.arrayToMarker(a);
- };
- // Diffing Whole Units
- DateEnv.prototype.diffWholeYears = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
- calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
- }
- return null;
- };
- DateEnv.prototype.diffWholeMonths = function (m0, m1) {
- var calendarSystem = this.calendarSystem;
- if (timeAsMs(m0) === timeAsMs(m1) &&
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
- return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
- (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
- }
- return null;
- };
- // Range / Duration
- DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
- var n = this.diffWholeYears(m0, m1);
- if (n !== null) {
- return { unit: 'year', value: n };
- }
- n = this.diffWholeMonths(m0, m1);
- if (n !== null) {
- return { unit: 'month', value: n };
- }
- n = diffWholeWeeks(m0, m1);
- if (n !== null) {
- return { unit: 'week', value: n };
- }
- n = diffWholeDays(m0, m1);
- if (n !== null) {
- return { unit: 'day', value: n };
- }
- n = diffHours(m0, m1);
- if (isInt(n)) {
- return { unit: 'hour', value: n };
- }
- n = diffMinutes(m0, m1);
- if (isInt(n)) {
- return { unit: 'minute', value: n };
- }
- n = diffSeconds(m0, m1);
- if (isInt(n)) {
- return { unit: 'second', value: n };
- }
- return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
- };
- DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
- // TODO: can use greatestWholeUnit
- var diff;
- if (d.years) {
- diff = this.diffWholeYears(m0, m1);
- if (diff !== null) {
- return diff / asRoughYears(d);
- }
- }
- if (d.months) {
- diff = this.diffWholeMonths(m0, m1);
- if (diff !== null) {
- return diff / asRoughMonths(d);
- }
- }
- if (d.days) {
- diff = diffWholeDays(m0, m1);
- if (diff !== null) {
- return diff / asRoughDays(d);
- }
- }
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
- };
- // Start-Of
- DateEnv.prototype.startOf = function (m, unit) {
- if (unit === 'year') {
- return this.startOfYear(m);
- }
- else if (unit === 'month') {
- return this.startOfMonth(m);
- }
- else if (unit === 'week') {
- return this.startOfWeek(m);
- }
- else if (unit === 'day') {
- return startOfDay(m);
- }
- else if (unit === 'hour') {
- return startOfHour(m);
- }
- else if (unit === 'minute') {
- return startOfMinute(m);
- }
- else if (unit === 'second') {
- return startOfSecond(m);
- }
- };
- DateEnv.prototype.startOfYear = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m)
- ]);
- };
- DateEnv.prototype.startOfMonth = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m)
- ]);
- };
- DateEnv.prototype.startOfWeek = function (m) {
- return this.calendarSystem.arrayToMarker([
- this.calendarSystem.getMarkerYear(m),
- this.calendarSystem.getMarkerMonth(m),
- m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
- ]);
- };
- // Week Number
- DateEnv.prototype.computeWeekNumber = function (marker) {
- if (this.weekNumberFunc) {
- return this.weekNumberFunc(this.toDate(marker));
- }
- else {
- return weekOfYear(marker, this.weekDow, this.weekDoy);
- }
- };
- // TODO: choke on timeZoneName: long
- DateEnv.prototype.format = function (marker, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- return formatter.format({
- marker: marker,
- timeZoneOffset: dateOptions.forcedTzo != null ?
- dateOptions.forcedTzo :
- this.offsetForMarker(marker)
- }, this);
- };
- DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
- if (dateOptions === void 0) { dateOptions = {}; }
- if (dateOptions.isEndExclusive) {
- end = addMs(end, -1);
- }
- return formatter.formatRange({
- marker: start,
- timeZoneOffset: dateOptions.forcedStartTzo != null ?
- dateOptions.forcedStartTzo :
- this.offsetForMarker(start)
- }, {
- marker: end,
- timeZoneOffset: dateOptions.forcedEndTzo != null ?
- dateOptions.forcedEndTzo :
- this.offsetForMarker(end)
- }, this);
- };
- DateEnv.prototype.formatIso = function (marker, extraOptions) {
- if (extraOptions === void 0) { extraOptions = {}; }
- var timeZoneOffset = null;
- if (!extraOptions.omitTimeZoneOffset) {
- if (extraOptions.forcedTzo != null) {
- timeZoneOffset = extraOptions.forcedTzo;
- }
- else {
- timeZoneOffset = this.offsetForMarker(marker);
- }
- }
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
- };
- // TimeZone
- DateEnv.prototype.timestampToMarker = function (ms) {
- if (this.timeZone === 'local') {
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
- }
- else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
- return new Date(ms);
- }
- else {
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
- }
- };
- DateEnv.prototype.offsetForMarker = function (m) {
- if (this.timeZone === 'local') {
- return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
- }
- else if (this.timeZone === 'UTC') {
- return 0;
- }
- else if (this.namedTimeZoneImpl) {
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
- }
- return null;
- };
- // Conversion
- DateEnv.prototype.toDate = function (m, forcedTzo) {
- if (this.timeZone === 'local') {
- return arrayToLocalDate(dateToUtcArray(m));
- }
- else if (this.timeZone === 'UTC') {
- return new Date(m.valueOf()); // make sure it's a copy
- }
- else if (!this.namedTimeZoneImpl) {
- return new Date(m.valueOf() - (forcedTzo || 0));
- }
- else {
- return new Date(m.valueOf() -
- this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
- );
- }
- };
- return DateEnv;
- }());
-
- var SIMPLE_SOURCE_PROPS = {
- id: String,
- allDayDefault: Boolean,
- eventDataTransform: Function,
- success: Function,
- failure: Function
- };
- var uid$2 = 0;
- function doesSourceNeedRange(eventSource, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- return !defs[eventSource.sourceDefId].ignoreRange;
- }
- function parseEventSource(raw, calendar) {
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
- for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
- var def = defs[i];
- var meta = def.parseMeta(raw);
- if (meta) {
- var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
- res._raw = raw;
- return res;
- }
- }
- return null;
- }
- function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
- var leftovers0 = {};
- var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
- var leftovers1 = {};
- var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
- props.isFetching = false;
- props.latestFetchId = '';
- props.fetchRange = null;
- props.publicId = String(raw.id || '');
- props.sourceId = String(uid$2++);
- props.sourceDefId = sourceDefId;
- props.meta = meta;
- props.ui = ui;
- props.extendedProps = leftovers1;
- return props;
- }
-
- function reduceEventSources (eventSources, action, dateProfile, calendar) {
- switch (action.type) {
- case 'ADD_EVENT_SOURCES': // already parsed
- return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
- case 'REMOVE_EVENT_SOURCE':
- return removeSource(eventSources, action.sourceId);
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
- case 'NEXT':
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- if (dateProfile) {
- return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
- }
- else {
- return eventSources;
- }
- case 'FETCH_EVENT_SOURCES':
- case 'CHANGE_TIMEZONE':
- return fetchSourcesByIds(eventSources, action.sourceIds ?
- arrayToHash(action.sourceIds) :
- excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
- case 'RECEIVE_EVENTS':
- case 'RECEIVE_EVENT_ERROR':
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
- case 'REMOVE_ALL_EVENT_SOURCES':
- return {};
- default:
- return eventSources;
- }
- }
- var uid$3 = 0;
- function addSources(eventSourceHash, sources, fetchRange, calendar) {
- var hash = {};
- for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
- var source = sources_1[_i];
- hash[source.sourceId] = source;
- }
- if (fetchRange) {
- hash = fetchDirtySources(hash, fetchRange, calendar);
- }
- return __assign({}, eventSourceHash, hash);
- }
- function removeSource(eventSourceHash, sourceId) {
- return filterHash(eventSourceHash, function (eventSource) {
- return eventSource.sourceId !== sourceId;
- });
- }
- function fetchDirtySources(sourceHash, fetchRange, calendar) {
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
- return isSourceDirty(eventSource, fetchRange, calendar);
- }), fetchRange, calendar);
- }
- function isSourceDirty(eventSource, fetchRange, calendar) {
- if (!doesSourceNeedRange(eventSource, calendar)) {
- return !eventSource.latestFetchId;
- }
- else {
- return !calendar.opt('lazyFetching') ||
- !eventSource.fetchRange ||
- eventSource.isFetching || // always cancel outdated in-progress fetches
- fetchRange.start < eventSource.fetchRange.start ||
- fetchRange.end > eventSource.fetchRange.end;
- }
- }
- function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
- var nextSources = {};
- for (var sourceId in prevSources) {
- var source = prevSources[sourceId];
- if (sourceIdHash[sourceId]) {
- nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
- }
- else {
- nextSources[sourceId] = source;
- }
- }
- return nextSources;
- }
- function fetchSource(eventSource, fetchRange, calendar) {
- var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
- var fetchId = String(uid$3++);
- sourceDef.fetch({
- eventSource: eventSource,
- calendar: calendar,
- range: fetchRange
- }, function (res) {
- var rawEvents = res.rawEvents;
- var calSuccess = calendar.opt('eventSourceSuccess');
- var calSuccessRes;
- var sourceSuccessRes;
- if (eventSource.success) {
- sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
- }
- if (calSuccess) {
- calSuccessRes = calSuccess(rawEvents, res.xhr);
- }
- rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
- calendar.dispatch({
- type: 'RECEIVE_EVENTS',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- rawEvents: rawEvents
- });
- }, function (error) {
- var callFailure = calendar.opt('eventSourceFailure');
- console.warn(error.message, error);
- if (eventSource.failure) {
- eventSource.failure(error);
- }
- if (callFailure) {
- callFailure(error);
- }
- calendar.dispatch({
- type: 'RECEIVE_EVENT_ERROR',
- sourceId: eventSource.sourceId,
- fetchId: fetchId,
- fetchRange: fetchRange,
- error: error
- });
- });
- return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
- }
- function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
- var _a;
- var eventSource = sourceHash[sourceId];
- if (eventSource && // not already removed
- fetchId === eventSource.latestFetchId) {
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
- }), _a));
- }
- return sourceHash;
- }
- function excludeStaticSources(eventSources, calendar) {
- return filterHash(eventSources, function (eventSource) {
- return doesSourceNeedRange(eventSource, calendar);
- });
- }
-
- var DateProfileGenerator = /** @class */ (function () {
- function DateProfileGenerator(viewSpec, calendar) {
- this.viewSpec = viewSpec;
- this.options = viewSpec.options;
- this.dateEnv = calendar.dateEnv;
- this.calendar = calendar;
- this.initHiddenDays();
- }
- /* Date Range Computation
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
- DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(prevDate, -1);
- };
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
- DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
- var dateEnv = this.dateEnv;
- var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
- currentDateProfile.dateIncrement);
- return this.build(nextDate, 1);
- };
- // Builds a structure holding dates/ranges for rendering around the given date.
- // Optional direction param indicates whether the date is being incremented/decremented
- // from its previous value. decremented = -1, incremented = 1 (default).
- DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
- if (forceToValid === void 0) { forceToValid = false; }
- var validRange;
- var minTime = null;
- var maxTime = null;
- var currentInfo;
- var isRangeAllDay;
- var renderRange;
- var activeRange;
- var isValid;
- validRange = this.buildValidRange();
- validRange = this.trimHiddenDays(validRange);
- if (forceToValid) {
- currentDate = constrainMarkerToRange(currentDate, validRange);
- }
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
- renderRange = this.trimHiddenDays(renderRange);
- activeRange = renderRange;
- if (!this.options.showNonCurrentDates) {
- activeRange = intersectRanges(activeRange, currentInfo.range);
- }
- minTime = createDuration(this.options.minTime);
- maxTime = createDuration(this.options.maxTime);
- activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
- activeRange = intersectRanges(activeRange, validRange); // might return null
- // it's invalid if the originally requested date is not contained,
- // or if the range is completely outside of the valid range.
- isValid = rangesIntersect(currentInfo.range, validRange);
- return {
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
- // an object with optional start and end properties.
- validRange: validRange,
- // range the view is formally responsible for.
- // for example, a month view might have 1st-31st, excluding padded dates
- currentRange: currentInfo.range,
- // name of largest unit being displayed, like "month" or "week"
- currentRangeUnit: currentInfo.unit,
- isRangeAllDay: isRangeAllDay,
- // dates that display events and accept drag-n-drop
- // will be `null` if no dates accept events
- activeRange: activeRange,
- // date range with a rendered skeleton
- // includes not-active days that need some sort of DOM
- renderRange: renderRange,
- // Duration object that denotes the first visible time of any given day
- minTime: minTime,
- // Duration object that denotes the exclusive visible end time of any given day
- maxTime: maxTime,
- isValid: isValid,
- // how far the current date will move for a prev/next operation
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
- // pass a fallback (might be null) ^
- };
- };
- // Builds an object with optional start/end properties.
- // Indicates the minimum/maximum dates to display.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildValidRange = function () {
- return this.getRangeOption('validRange', this.calendar.getNow()) ||
- { start: null, end: null }; // completely open-ended
- };
- // Builds a structure with info about the "current" range, the range that is
- // highlighted as being the current month for example.
- // See build() for a description of `direction`.
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
- DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
- var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
- var duration = null;
- var unit = null;
- var range = null;
- var dayCount;
- if (viewSpec.duration) {
- duration = viewSpec.duration;
- unit = viewSpec.durationUnit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- else if ((dayCount = this.options.dayCount)) {
- unit = 'day';
- range = this.buildRangeFromDayCount(date, direction, dayCount);
- }
- else if ((range = this.buildCustomVisibleRange(date))) {
- unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
- }
- else {
- duration = this.getFallbackDuration();
- unit = greatestDurationDenominator(duration).unit;
- range = this.buildRangeFromDuration(date, direction, duration, unit);
- }
- return { duration: duration, unit: unit, range: range };
- };
- DateProfileGenerator.prototype.getFallbackDuration = function () {
- return createDuration({ day: 1 });
- };
- // Returns a new activeRange to have time values (un-ambiguate)
- // minTime or maxTime causes the range to expand.
- DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
- var dateEnv = this.dateEnv;
- var start = range.start;
- var end = range.end;
- if (this.viewSpec.class.prototype.usesMinMaxTime) {
- // expand active range if minTime is negative (why not when positive?)
- if (asRoughDays(minTime) < 0) {
- start = startOfDay(start); // necessary?
- start = dateEnv.add(start, minTime);
- }
- // expand active range if maxTime is beyond one day (why not when positive?)
- if (asRoughDays(maxTime) > 1) {
- end = startOfDay(end); // necessary?
- end = addDays(end, -1);
- end = dateEnv.add(end, maxTime);
- }
- }
- return { start: start, end: end };
- };
- // Builds the "current" range when it is specified as an explicit duration.
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
- DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
- var dateEnv = this.dateEnv;
- var alignment = this.options.dateAlignment;
- var dateIncrementInput;
- var dateIncrementDuration;
- var start;
- var end;
- var res;
- // compute what the alignment should be
- if (!alignment) {
- dateIncrementInput = this.options.dateIncrement;
- if (dateIncrementInput) {
- dateIncrementDuration = createDuration(dateIncrementInput);
- // use the smaller of the two units
- if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
- alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
- }
- else {
- alignment = unit;
- }
- }
- else {
- alignment = unit;
- }
- }
- // if the view displays a single day or smaller
- if (asRoughDays(duration) <= 1) {
- if (this.isHiddenDay(start)) {
- start = this.skipHiddenDays(start, direction);
- start = startOfDay(start);
- }
- }
- function computeRes() {
- start = dateEnv.startOf(date, alignment);
- end = dateEnv.add(start, duration);
- res = { start: start, end: end };
- }
- computeRes();
- // if range is completely enveloped by hidden days, go past the hidden days
- if (!this.trimHiddenDays(res)) {
- date = this.skipHiddenDays(date, direction);
- computeRes();
- }
- return res;
- };
- // Builds the "current" range when a dayCount is specified.
- DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
- var dateEnv = this.dateEnv;
- var customAlignment = this.options.dateAlignment;
- var runningCount = 0;
- var start = date;
- var end;
- if (customAlignment) {
- start = dateEnv.startOf(start, customAlignment);
- }
- start = startOfDay(start);
- start = this.skipHiddenDays(start, direction);
- end = start;
- do {
- end = addDays(end, 1);
- if (!this.isHiddenDay(end)) {
- runningCount++;
- }
- } while (runningCount < dayCount);
- return { start: start, end: end };
- };
- // Builds a normalized range object for the "visible" range,
- // which is a way to define the currentRange and activeRange at the same time.
- DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
- var dateEnv = this.dateEnv;
- var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
- if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
- return null;
- }
- return visibleRange;
- };
- // Computes the range that will represent the element/cells for *rendering*,
- // but which may have voided days/times.
- // not responsible for trimming hidden days.
- DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- return currentRange;
- };
- // Compute the duration value that should be added/substracted to the current date
- // when a prev/next operation happens.
- DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
- var dateIncrementInput = this.options.dateIncrement;
- var customAlignment;
- if (dateIncrementInput) {
- return createDuration(dateIncrementInput);
- }
- else if ((customAlignment = this.options.dateAlignment)) {
- return createDuration(1, customAlignment);
- }
- else if (fallback) {
- return fallback;
- }
- else {
- return createDuration({ days: 1 });
- }
- };
- // Arguments after name will be forwarded to a hypothetical function value
- // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
- // Always clone your objects if you fear mutation.
- DateProfileGenerator.prototype.getRangeOption = function (name) {
- var otherArgs = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- otherArgs[_i - 1] = arguments[_i];
- }
- var val = this.options[name];
- if (typeof val === 'function') {
- val = val.apply(null, otherArgs);
- }
- if (val) {
- val = parseRange(val, this.dateEnv);
- }
- if (val) {
- val = computeVisibleDayRange(val);
- }
- return val;
- };
- /* Hidden Days
- ------------------------------------------------------------------------------------------------------------------*/
- // Initializes internal variables related to calculating hidden days-of-week
- DateProfileGenerator.prototype.initHiddenDays = function () {
- var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
- var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
- var dayCnt = 0;
- var i;
- if (this.options.weekends === false) {
- hiddenDays.push(0, 6); // 0=sunday, 6=saturday
- }
- for (i = 0; i < 7; i++) {
- if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
- dayCnt++;
- }
- }
- if (!dayCnt) {
- throw new Error('invalid hiddenDays'); // all days were hidden? bad.
- }
- this.isHiddenDayHash = isHiddenDayHash;
- };
- // Remove days from the beginning and end of the range that are computed as hidden.
- // If the whole range is trimmed off, returns null
- DateProfileGenerator.prototype.trimHiddenDays = function (range) {
- var start = range.start;
- var end = range.end;
- if (start) {
- start = this.skipHiddenDays(start);
- }
- if (end) {
- end = this.skipHiddenDays(end, -1, true);
- }
- if (start == null || end == null || start < end) {
- return { start: start, end: end };
- }
- return null;
- };
- // Is the current day hidden?
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
- DateProfileGenerator.prototype.isHiddenDay = function (day) {
- if (day instanceof Date) {
- day = day.getUTCDay();
- }
- return this.isHiddenDayHash[day];
- };
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
- // DOES NOT CONSIDER validRange!
- // If the initial value of `date` is not a hidden day, don't do anything.
- // Pass `isExclusive` as `true` if you are dealing with an end date.
- // `inc` defaults to `1` (increment one day forward each time)
- DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
- if (inc === void 0) { inc = 1; }
- if (isExclusive === void 0) { isExclusive = false; }
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
- date = addDays(date, inc);
- }
- return date;
- };
- return DateProfileGenerator;
- }());
- // TODO: find a way to avoid comparing DateProfiles. it's tedious
- function isDateProfilesEqual(p0, p1) {
- return rangesEqual(p0.validRange, p1.validRange) &&
- rangesEqual(p0.activeRange, p1.activeRange) &&
- rangesEqual(p0.renderRange, p1.renderRange) &&
- durationsEqual(p0.minTime, p1.minTime) &&
- durationsEqual(p0.maxTime, p1.maxTime);
- /*
- TODO: compare more?
- currentRange: DateRange
- currentRangeUnit: string
- isRangeAllDay: boolean
- isValid: boolean
- dateIncrement: Duration
- */
- }
-
- function reduce (state, action, calendar) {
- var viewType = reduceViewType(state.viewType, action);
- var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
- var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
- var nextState = __assign({}, state, { viewType: viewType,
- dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
- for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
- var reducerFunc = _a[_i];
- nextState = reducerFunc(nextState, action, calendar);
- }
- // console.log(action.type, nextState)
- return nextState;
- }
- function reduceViewType(currentViewType, action) {
- switch (action.type) {
- case 'SET_VIEW_TYPE':
- return action.viewType;
- default:
- return currentViewType;
- }
- }
- function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
- var newDateProfile;
- switch (action.type) {
- case 'PREV':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
- break;
- case 'NEXT':
- newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
- break;
- case 'SET_DATE':
- if (!currentDateProfile.activeRange ||
- !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
- newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
- );
- }
- break;
- case 'SET_VIEW_TYPE':
- var generator = calendar.dateProfileGenerators[viewType];
- if (!generator) {
- throw new Error(viewType ?
- 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
- 'No available FullCalendar view plugins.');
- }
- newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
- );
- break;
- }
- if (newDateProfile &&
- newDateProfile.isValid &&
- !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
- return newDateProfile;
- }
- else {
- return currentDateProfile;
- }
- }
- function reduceCurrentDate(currentDate, action, dateProfile) {
- switch (action.type) {
- case 'PREV':
- case 'NEXT':
- if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return currentDate;
- }
- case 'SET_DATE':
- case 'SET_VIEW_TYPE':
- var newDate = action.dateMarker || currentDate;
- if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
- return dateProfile.currentRange.start;
- }
- else {
- return newDate;
- }
- default:
- return currentDate;
- }
- }
- function reduceDateSelection(currentSelection, action, calendar) {
- switch (action.type) {
- case 'SELECT_DATES':
- return action.selection;
- case 'UNSELECT_DATES':
- return null;
- default:
- return currentSelection;
- }
- }
- function reduceSelectedEvent(currentInstanceId, action) {
- switch (action.type) {
- case 'SELECT_EVENT':
- return action.eventInstanceId;
- case 'UNSELECT_EVENT':
- return '';
- default:
- return currentInstanceId;
- }
- }
- function reduceEventDrag(currentDrag, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_DRAG':
- var newDrag = action.state;
- return {
- affectedEvents: newDrag.affectedEvents,
- mutatedEvents: newDrag.mutatedEvents,
- isEvent: newDrag.isEvent,
- origSeg: newDrag.origSeg
- };
- case 'UNSET_EVENT_DRAG':
- return null;
- default:
- return currentDrag;
- }
- }
- function reduceEventResize(currentResize, action, sources, calendar) {
- switch (action.type) {
- case 'SET_EVENT_RESIZE':
- var newResize = action.state;
- return {
- affectedEvents: newResize.affectedEvents,
- mutatedEvents: newResize.mutatedEvents,
- isEvent: newResize.isEvent,
- origSeg: newResize.origSeg
- };
- case 'UNSET_EVENT_RESIZE':
- return null;
- default:
- return currentResize;
- }
- }
- function computeLoadingLevel(eventSources) {
- var cnt = 0;
- for (var sourceId in eventSources) {
- if (eventSources[sourceId].isFetching) {
- cnt++;
- }
- }
- return cnt;
- }
-
- var STANDARD_PROPS = {
- start: null,
- end: null,
- allDay: Boolean
- };
- function parseDateSpan(raw, dateEnv, defaultDuration) {
- var span = parseOpenDateSpan(raw, dateEnv);
- var range = span.range;
- if (!range.start) {
- return null;
- }
- if (!range.end) {
- if (defaultDuration == null) {
- return null;
- }
- else {
- range.end = dateEnv.add(range.start, defaultDuration);
- }
- }
- return span;
- }
- /*
- TODO: somehow combine with parseRange?
- Will return null if the start/end props were present but parsed invalidly.
- */
- function parseOpenDateSpan(raw, dateEnv) {
- var leftovers = {};
- var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
- var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
- var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
- var allDay = standardProps.allDay;
- if (allDay == null) {
- allDay = (startMeta && startMeta.isTimeUnspecified) &&
- (!endMeta || endMeta.isTimeUnspecified);
- }
- // use this leftover object as the selection object
- leftovers.range = {
- start: startMeta ? startMeta.marker : null,
- end: endMeta ? endMeta.marker : null
- };
- leftovers.allDay = allDay;
- return leftovers;
- }
- function isDateSpansEqual(span0, span1) {
- return rangesEqual(span0.range, span1.range) &&
- span0.allDay === span1.allDay &&
- isSpanPropsEqual(span0, span1);
- }
- // the NON-DATE-RELATED props
- function isSpanPropsEqual(span0, span1) {
- for (var propName in span1) {
- if (propName !== 'range' && propName !== 'allDay') {
- if (span0[propName] !== span1[propName]) {
- return false;
- }
- }
- }
- // are there any props that span0 has that span1 DOESN'T have?
- // both have range/allDay, so no need to special-case.
- for (var propName in span0) {
- if (!(propName in span1)) {
- return false;
- }
- }
- return true;
- }
- function buildDateSpanApi(span, dateEnv) {
- return {
- start: dateEnv.toDate(span.range.start),
- end: dateEnv.toDate(span.range.end),
- startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
- allDay: span.allDay
- };
- }
- function buildDatePointApi(span, dateEnv) {
- return {
- date: dateEnv.toDate(span.range.start),
- dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
- allDay: span.allDay
- };
- }
- function fabricateEventRange(dateSpan, eventUiBases, calendar) {
- var def = parseEventDef({ editable: false }, '', // sourceId
- dateSpan.allDay, true, // hasEnd
- calendar);
- return {
- def: def,
- ui: compileEventUi(def, eventUiBases),
- instance: createEventInstance(def.defId, dateSpan.range),
- range: dateSpan.range,
- isStart: true,
- isEnd: true
- };
- }
-
- function compileViewDefs(defaultConfigs, overrideConfigs) {
- var hash = {};
- var viewType;
- for (viewType in defaultConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- for (viewType in overrideConfigs) {
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- }
- return hash;
- }
- function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- if (hash[viewType]) {
- return hash[viewType];
- }
- var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
- if (viewDef) {
- hash[viewType] = viewDef;
- }
- return viewDef;
- }
- function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
- var defaultConfig = defaultConfigs[viewType];
- var overrideConfig = overrideConfigs[viewType];
- var queryProp = function (name) {
- return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
- };
- var theClass = queryProp('class');
- var superType = queryProp('superType');
- if (!superType && theClass) {
- superType =
- findViewNameBySubclass(theClass, overrideConfigs) ||
- findViewNameBySubclass(theClass, defaultConfigs);
- }
- var superDef = null;
- if (superType) {
- if (superType === viewType) {
- throw new Error('Can\'t have a custom view type that references itself');
- }
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
- }
- if (!theClass && superDef) {
- theClass = superDef.class;
- }
- if (!theClass) {
- return null; // don't throw a warning, might be settings for a single-unit view
- }
- return {
- type: viewType,
- class: theClass,
- defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
- overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
- };
- }
- function findViewNameBySubclass(viewSubclass, configs) {
- var superProto = Object.getPrototypeOf(viewSubclass.prototype);
- for (var viewType in configs) {
- var parsed = configs[viewType];
- // need DIRECT subclass, so instanceof won't do it
- if (parsed.class && parsed.class.prototype === superProto) {
- return viewType;
- }
- }
- return '';
- }
-
- function parseViewConfigs(inputs) {
- return mapHash(inputs, parseViewConfig);
- }
- var VIEW_DEF_PROPS = {
- type: String,
- class: null
- };
- function parseViewConfig(input) {
- if (typeof input === 'function') {
- input = { class: input };
- }
- var options = {};
- var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
- return {
- superType: props.type,
- class: props.class,
- options: options
- };
- }
-
- function buildViewSpecs(defaultInputs, optionsManager) {
- var defaultConfigs = parseViewConfigs(defaultInputs);
- var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
- var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
- return mapHash(viewDefs, function (viewDef) {
- return buildViewSpec(viewDef, overrideConfigs, optionsManager);
- });
- }
- function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
- var durationInput = viewDef.overrides.duration ||
- viewDef.defaults.duration ||
- optionsManager.dynamicOverrides.duration ||
- optionsManager.overrides.duration;
- var duration = null;
- var durationUnit = '';
- var singleUnit = '';
- var singleUnitOverrides = {};
- if (durationInput) {
- duration = createDuration(durationInput);
- if (duration) { // valid?
- var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
- durationUnit = denom.unit;
- if (denom.value === 1) {
- singleUnit = durationUnit;
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
- }
- }
- }
- var queryButtonText = function (options) {
- var buttonTextMap = options.buttonText || {};
- var buttonTextKey = viewDef.defaults.buttonTextKey;
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
- return buttonTextMap[buttonTextKey];
- }
- if (buttonTextMap[viewDef.type] != null) {
- return buttonTextMap[viewDef.type];
- }
- if (buttonTextMap[singleUnit] != null) {
- return buttonTextMap[singleUnit];
- }
- };
- return {
- type: viewDef.type,
- class: viewDef.class,
- duration: duration,
- durationUnit: durationUnit,
- singleUnit: singleUnit,
- options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
- buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
- queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
- viewDef.overrides.buttonText,
- buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
- queryButtonText(optionsManager.dirDefaults) ||
- viewDef.defaults.buttonText ||
- queryButtonText(globalDefaults) ||
- viewDef.type // fall back to given view name
- };
- }
-
- var Toolbar = /** @class */ (function (_super) {
- __extends(Toolbar, _super);
- function Toolbar(extraClassName) {
- var _this = _super.call(this) || this;
- _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
- _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
- _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
- _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
- _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
- _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
- _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
- return _this;
- }
- Toolbar.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this._renderLayout.unrender(); // should unrender everything else
- removeElement(this.el);
- };
- Toolbar.prototype.render = function (props) {
- this._renderLayout(props.layout);
- this._updateTitle(props.title);
- this._updateActiveButton(props.activeButton);
- this._updateToday(props.isTodayEnabled);
- this._updatePrev(props.isPrevEnabled);
- this._updateNext(props.isNextEnabled);
- };
- Toolbar.prototype.renderLayout = function (layout) {
- var el = this.el;
- this.viewsWithButtons = [];
- appendToElement(el, this.renderSection('left', layout.left));
- appendToElement(el, this.renderSection('center', layout.center));
- appendToElement(el, this.renderSection('right', layout.right));
- };
- Toolbar.prototype.unrenderLayout = function () {
- this.el.innerHTML = '';
- };
- Toolbar.prototype.renderSection = function (position, buttonStr) {
- var _this = this;
- var _a = this.context, theme = _a.theme, calendar = _a.calendar;
- var optionsManager = calendar.optionsManager;
- var viewSpecs = calendar.viewSpecs;
- var sectionEl = createElement('div', { className: 'fc-' + position });
- var calendarCustomButtons = optionsManager.computed.customButtons || {};
- var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
- var calendarButtonText = optionsManager.computed.buttonText || {};
- if (buttonStr) {
- buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
- var groupChildren = [];
- var isOnlyButtons = true;
- var groupEl;
- buttonGroupStr.split(',').forEach(function (buttonName, j) {
- var customButtonProps;
- var viewSpec;
- var buttonClick;
- var buttonIcon; // only one of these will be set
- var buttonText; // "
- var buttonInnerHtml;
- var buttonClasses;
- var buttonEl;
- var buttonAriaAttr;
- if (buttonName === 'title') {
- groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
- isOnlyButtons = false;
- }
- else {
- if ((customButtonProps = calendarCustomButtons[buttonName])) {
- buttonClick = function (ev) {
- if (customButtonProps.click) {
- customButtonProps.click.call(buttonEl, ev);
- }
- };
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = customButtonProps.text);
- }
- else if ((viewSpec = viewSpecs[buttonName])) {
- _this.viewsWithButtons.push(buttonName);
- buttonClick = function () {
- calendar.changeView(buttonName);
- };
- (buttonText = viewSpec.buttonTextOverride) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = viewSpec.buttonTextDefault);
- }
- else if (calendar[buttonName]) { // a calendar method
- buttonClick = function () {
- calendar[buttonName]();
- };
- (buttonText = calendarButtonTextOverrides[buttonName]) ||
- (buttonIcon = theme.getIconClass(buttonName)) ||
- (buttonText = calendarButtonText[buttonName]);
- // ^ everything else is considered default
- }
- if (buttonClick) {
- buttonClasses = [
- 'fc-' + buttonName + '-button',
- theme.getClass('button')
- ];
- if (buttonText) {
- buttonInnerHtml = htmlEscape(buttonText);
- buttonAriaAttr = '';
- }
- else if (buttonIcon) {
- buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
- buttonAriaAttr = ' aria-label="' + buttonName + '"';
- }
- buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
- '<button type="button" class="' + buttonClasses.join(' ') + '"' +
- buttonAriaAttr +
- '>' + buttonInnerHtml + '</button>');
- buttonEl.addEventListener('click', buttonClick);
- groupChildren.push(buttonEl);
- }
- }
- });
- if (groupChildren.length > 1) {
- groupEl = document.createElement('div');
- var buttonGroupClassName = theme.getClass('buttonGroup');
- if (isOnlyButtons && buttonGroupClassName) {
- groupEl.classList.add(buttonGroupClassName);
- }
- appendToElement(groupEl, groupChildren);
- sectionEl.appendChild(groupEl);
- }
- else {
- appendToElement(sectionEl, groupChildren); // 1 or 0 children
- }
- });
- }
- return sectionEl;
- };
- Toolbar.prototype.updateToday = function (isTodayEnabled) {
- this.toggleButtonEnabled('today', isTodayEnabled);
- };
- Toolbar.prototype.updatePrev = function (isPrevEnabled) {
- this.toggleButtonEnabled('prev', isPrevEnabled);
- };
- Toolbar.prototype.updateNext = function (isNextEnabled) {
- this.toggleButtonEnabled('next', isNextEnabled);
- };
- Toolbar.prototype.updateTitle = function (text) {
- findElements(this.el, 'h2').forEach(function (titleEl) {
- titleEl.innerText = text;
- });
- };
- Toolbar.prototype.updateActiveButton = function (buttonName) {
- var theme = this.context.theme;
- var className = theme.getClass('buttonActive');
- findElements(this.el, 'button').forEach(function (buttonEl) {
- if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
- buttonEl.classList.add(className);
- }
- else {
- buttonEl.classList.remove(className);
- }
- });
- };
- Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
- findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
- buttonEl.disabled = !bool;
- });
- };
- return Toolbar;
- }(Component));
-
- var CalendarComponent = /** @class */ (function (_super) {
- __extends(CalendarComponent, _super);
- function CalendarComponent(el) {
- var _this = _super.call(this) || this;
- _this.elClassNames = [];
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.renderToolbars = memoizeRendering(_this._renderToolbars, _this._unrenderToolbars, [_this.renderSkeleton]);
- _this.buildComponentContext = memoize(buildComponentContext);
- _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
- _this.el = el;
- _this.computeTitle = memoize(computeTitle);
- _this.parseBusinessHours = memoize(function (input) {
- return parseBusinessHours(input, _this.context.calendar);
- });
- return _this;
- }
- CalendarComponent.prototype.render = function (props, context) {
- this.freezeHeight();
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
- this.renderSkeleton(context);
- this.renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, title);
- this.renderView(props, title);
- this.updateSize();
- this.thawHeight();
- };
- CalendarComponent.prototype.destroy = function () {
- if (this.header) {
- this.header.destroy();
- }
- if (this.footer) {
- this.footer.destroy();
- }
- this.renderSkeleton.unrender(); // will call destroyView
- _super.prototype.destroy.call(this);
- };
- CalendarComponent.prototype._renderSkeleton = function (context) {
- this.updateElClassNames(context);
- prependToElement(this.el, this.contentEl = createElement('div', { className: 'fc-view-container' }));
- var calendar = context.calendar;
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
- var modifyViewContainer = _a[_i];
- modifyViewContainer(this.contentEl, calendar);
- }
- };
- CalendarComponent.prototype._unrenderSkeleton = function () {
- // weird to have this here
- if (this.view) {
- this.savedScroll = this.view.queryScroll();
- this.view.destroy();
- this.view = null;
- }
- removeElement(this.contentEl);
- this.removeElClassNames();
- };
- CalendarComponent.prototype.removeElClassNames = function () {
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.remove(className);
- }
- this.elClassNames = [];
- };
- CalendarComponent.prototype.updateElClassNames = function (context) {
- this.removeElClassNames();
- var theme = context.theme, options = context.options;
- this.elClassNames = [
- 'fc',
- 'fc-' + options.dir,
- theme.getClass('widget')
- ];
- var classList = this.el.classList;
- for (var _i = 0, _a = this.elClassNames; _i < _a.length; _i++) {
- var className = _a[_i];
- classList.add(className);
- }
- };
- CalendarComponent.prototype._renderToolbars = function (viewSpec, dateProfile, currentDate, title) {
- var _a = this, context = _a.context, header = _a.header, footer = _a.footer;
- var options = context.options, calendar = context.calendar;
- var headerLayout = options.header;
- var footerLayout = options.footer;
- var dateProfileGenerator = this.props.dateProfileGenerator;
- var now = calendar.getNow();
- var todayInfo = dateProfileGenerator.build(now);
- var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
- var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
- var toolbarProps = {
- title: title,
- activeButton: viewSpec.type,
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
- isPrevEnabled: prevInfo.isValid,
- isNextEnabled: nextInfo.isValid
- };
- if (headerLayout) {
- if (!header) {
- header = this.header = new Toolbar('fc-header-toolbar');
- prependToElement(this.el, header.el);
- }
- header.receiveProps(__assign({ layout: headerLayout }, toolbarProps), context);
- }
- else if (header) {
- header.destroy();
- header = this.header = null;
- }
- if (footerLayout) {
- if (!footer) {
- footer = this.footer = new Toolbar('fc-footer-toolbar');
- appendToElement(this.el, footer.el);
- }
- footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps), context);
- }
- else if (footer) {
- footer.destroy();
- footer = this.footer = null;
- }
- };
- CalendarComponent.prototype._unrenderToolbars = function () {
- if (this.header) {
- this.header.destroy();
- this.header = null;
- }
- if (this.footer) {
- this.footer.destroy();
- this.footer = null;
- }
- };
- CalendarComponent.prototype.renderView = function (props, title) {
- var view = this.view;
- var _a = this.context, calendar = _a.calendar, options = _a.options;
- var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
- if (!view || view.viewSpec !== viewSpec) {
- if (view) {
- view.destroy();
- }
- view = this.view = new viewSpec['class'](viewSpec, this.contentEl);
- if (this.savedScroll) {
- view.addScroll(this.savedScroll, true);
- this.savedScroll = null;
- }
- }
- view.title = title; // for the API
- var viewProps = {
- dateProfileGenerator: dateProfileGenerator,
- dateProfile: props.dateProfile,
- businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- dateSelection: props.dateSelection,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize
- };
- var transformers = this.buildViewPropTransformers(calendar.pluginSystem.hooks.viewPropsTransformers);
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
- var transformer = transformers_1[_i];
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, options));
- }
- view.receiveProps(viewProps, this.buildComponentContext(this.context, viewSpec, view));
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.updateSize = function (isResize) {
- if (isResize === void 0) { isResize = false; }
- var view = this.view;
- if (!view) {
- return; // why?
- }
- if (isResize || this.isHeightAuto == null) {
- this.computeHeightVars();
- }
- view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
- view.updateNowIndicator(); // we need to guarantee this will run after updateSize
- view.popScroll(isResize);
- };
- CalendarComponent.prototype.computeHeightVars = function () {
- var calendar = this.context.calendar; // yuck. need to handle dynamic options
- var heightInput = calendar.opt('height');
- var contentHeightInput = calendar.opt('contentHeight');
- this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
- if (typeof contentHeightInput === 'number') { // exists and not 'auto'
- this.viewHeight = contentHeightInput;
- }
- else if (typeof contentHeightInput === 'function') { // exists and is a function
- this.viewHeight = contentHeightInput();
- }
- else if (typeof heightInput === 'number') { // exists and not 'auto'
- this.viewHeight = heightInput - this.queryToolbarsHeight();
- }
- else if (typeof heightInput === 'function') { // exists and is a function
- this.viewHeight = heightInput() - this.queryToolbarsHeight();
- }
- else if (heightInput === 'parent') { // set to height of parent element
- var parentEl = this.el.parentNode;
- this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
- }
- else {
- this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
- Math.max(calendar.opt('aspectRatio'), .5));
- }
- };
- CalendarComponent.prototype.queryToolbarsHeight = function () {
- var height = 0;
- if (this.header) {
- height += computeHeightAndMargins(this.header.el);
- }
- if (this.footer) {
- height += computeHeightAndMargins(this.footer.el);
- }
- return height;
- };
- // Height "Freezing"
- // -----------------------------------------------------------------------------------------------------------------
- CalendarComponent.prototype.freezeHeight = function () {
- applyStyle(this.el, {
- height: this.el.getBoundingClientRect().height,
- overflow: 'hidden'
- });
- };
- CalendarComponent.prototype.thawHeight = function () {
- applyStyle(this.el, {
- height: '',
- overflow: ''
- });
- };
- return CalendarComponent;
- }(Component));
- // Title and Date Formatting
- // -----------------------------------------------------------------------------------------------------------------
- // Computes what the title at the top of the calendar should be for this view
- function computeTitle(dateProfile, viewOptions) {
- var range;
- // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
- range = dateProfile.currentRange;
- }
- else { // for day units or smaller, use the actual day range
- range = dateProfile.activeRange;
- }
- return this.context.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
- }
- // Generates the format string that should be used to generate the title for the current date range.
- // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
- function computeTitleFormat(dateProfile) {
- var currentRangeUnit = dateProfile.currentRangeUnit;
- if (currentRangeUnit === 'year') {
- return { year: 'numeric' };
- }
- else if (currentRangeUnit === 'month') {
- return { year: 'numeric', month: 'long' }; // like "September 2014"
- }
- else {
- var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
- if (days !== null && days > 1) {
- // multi-day range. shorter, like "Sep 9 - 10 2014"
- return { year: 'numeric', month: 'short', day: 'numeric' };
- }
- else {
- // one day. longer, like "September 9 2014"
- return { year: 'numeric', month: 'long', day: 'numeric' };
- }
- }
- }
- // build a context scoped to the view
- function buildComponentContext(context, viewSpec, view) {
- return context.extend(viewSpec.options, view);
- }
- // Plugin
- // -----------------------------------------------------------------------------------------------------------------
- function buildViewPropTransformers(theClasses) {
- return theClasses.map(function (theClass) {
- return new theClass();
- });
- }
-
- var Interaction = /** @class */ (function () {
- function Interaction(settings) {
- this.component = settings.component;
- }
- Interaction.prototype.destroy = function () {
- };
- return Interaction;
- }());
- function parseInteractionSettings(component, input) {
- return {
- component: component,
- el: input.el,
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
- };
- }
- function interactionSettingsToStore(settings) {
- var _a;
- return _a = {},
- _a[settings.component.uid] = settings,
- _a;
- }
- // global state
- var interactionSettingsStore = {};
-
- /*
- Detects when the user clicks on an event within a DateComponent
- */
- var EventClicking = /** @class */ (function (_super) {
- __extends(EventClicking, _super);
- function EventClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handleSegClick = function (ev, segEl) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (seg && // might be the <div> surrounding the more link
- component.isValidSegDownEl(ev.target)) {
- // our way to simulate a link click for elements that can't be <a> tags
- // grab before trigger fired in case trigger trashes DOM thru rerendering
- var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
- var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
- calendar.publiclyTrigger('eventClick', [
- {
- el: segEl,
- event: new EventApi(component.context.calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- if (url && !ev.defaultPrevented) {
- window.location.href = url;
- }
- }
- };
- var component = settings.component;
- _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
- return _this;
- }
- return EventClicking;
- }(Interaction));
-
- /*
- Triggers events and adds/removes core classNames when the user's pointer
- enters/leaves event-elements of a component.
- */
- var EventHovering = /** @class */ (function (_super) {
- __extends(EventHovering, _super);
- function EventHovering(settings) {
- var _this = _super.call(this, settings) || this;
- // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
- _this.handleEventElRemove = function (el) {
- if (el === _this.currentSegEl) {
- _this.handleSegLeave(null, _this.currentSegEl);
- }
- };
- _this.handleSegEnter = function (ev, segEl) {
- if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
- segEl.classList.add('fc-allow-mouse-resize');
- _this.currentSegEl = segEl;
- _this.triggerEvent('eventMouseEnter', ev, segEl);
- }
- };
- _this.handleSegLeave = function (ev, segEl) {
- if (_this.currentSegEl) {
- segEl.classList.remove('fc-allow-mouse-resize');
- _this.currentSegEl = null;
- _this.triggerEvent('eventMouseLeave', ev, segEl);
- }
- };
- var component = settings.component;
- _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
- // how to make sure component already has context?
- component.context.calendar.on('eventElRemove', _this.handleEventElRemove);
- return _this;
- }
- EventHovering.prototype.destroy = function () {
- this.removeHoverListeners();
- this.component.context.calendar.off('eventElRemove', this.handleEventElRemove);
- };
- EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
- var component = this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var seg = getElSeg(segEl);
- if (!ev || component.isValidSegDownEl(ev.target)) {
- calendar.publiclyTrigger(publicEvName, [
- {
- el: segEl,
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
- jsEvent: ev,
- view: view
- }
- ]);
- }
- };
- return EventHovering;
- }(Interaction));
-
- var StandardTheme = /** @class */ (function (_super) {
- __extends(StandardTheme, _super);
- function StandardTheme() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- return StandardTheme;
- }(Theme));
- StandardTheme.prototype.classes = {
- widget: 'fc-unthemed',
- widgetHeader: 'fc-widget-header',
- widgetContent: 'fc-widget-content',
- buttonGroup: 'fc-button-group',
- button: 'fc-button fc-button-primary',
- buttonActive: 'fc-button-active',
- popoverHeader: 'fc-widget-header',
- popoverContent: 'fc-widget-content',
- // day grid
- headerRow: 'fc-widget-header',
- dayRow: 'fc-widget-content',
- // list view
- listView: 'fc-widget-content'
- };
- StandardTheme.prototype.baseIconClass = 'fc-icon';
- StandardTheme.prototype.iconClasses = {
- close: 'fc-icon-x',
- prev: 'fc-icon-chevron-left',
- next: 'fc-icon-chevron-right',
- prevYear: 'fc-icon-chevrons-left',
- nextYear: 'fc-icon-chevrons-right'
- };
- StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
- StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
- StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
- var Calendar = /** @class */ (function () {
- function Calendar(el, overrides) {
- var _this = this;
- this.buildComponentContext = memoize(buildComponentContext$1);
- this.parseRawLocales = memoize(parseRawLocales);
- this.buildLocale = memoize(buildLocale);
- this.buildDateEnv = memoize(buildDateEnv);
- this.buildTheme = memoize(buildTheme);
- this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
- this.buildSelectionConfig = memoize(this._buildSelectionConfig);
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
- this.buildEventUiBases = memoize(buildEventUiBases);
- this.interactionsStore = {};
- this.actionQueue = [];
- this.isReducing = false;
- // isDisplaying: boolean = false // installed in DOM? accepting renders?
- this.needsRerender = false; // needs a render?
- this.isRendering = false; // currently in the executeRender function?
- this.renderingPauseDepth = 0;
- this.buildDelayedRerender = memoize(buildDelayedRerender);
- this.afterSizingTriggers = {};
- this.isViewUpdated = false;
- this.isDatesUpdated = false;
- this.isEventsUpdated = false;
- this.el = el;
- this.optionsManager = new OptionsManager(overrides || {});
- this.pluginSystem = new PluginSystem();
- // only do once. don't do in handleOptions. because can't remove plugins
- this.addPluginInputs(this.optionsManager.computed.plugins || []);
- this.handleOptions(this.optionsManager.computed);
- this.publiclyTrigger('_init'); // for tests
- this.hydrate();
- this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
- .map(function (calendarInteractionClass) {
- return new calendarInteractionClass(_this);
- });
- }
- Calendar.prototype.addPluginInputs = function (pluginInputs) {
- var pluginDefs = refinePluginDefs(pluginInputs);
- for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
- var pluginDef = pluginDefs_1[_i];
- this.pluginSystem.add(pluginDef);
- }
- };
- Object.defineProperty(Calendar.prototype, "view", {
- // public API
- get: function () {
- return this.component ? this.component.view : null;
- },
- enumerable: true,
- configurable: true
- });
- // Public API for rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.render = function () {
- if (!this.component) {
- this.component = new CalendarComponent(this.el);
- this.renderableEventStore = createEmptyEventStore();
- this.bindHandlers();
- this.executeRender();
- }
- else {
- this.requestRerender();
- }
- };
- Calendar.prototype.destroy = function () {
- if (this.component) {
- this.unbindHandlers();
- this.component.destroy(); // don't null-out. in case API needs access
- this.component = null; // umm ???
- for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
- var interaction = _a[_i];
- interaction.destroy();
- }
- this.publiclyTrigger('_destroyed');
- }
- };
- // Handlers
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.bindHandlers = function () {
- var _this = this;
- // event delegation for nav links
- this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
- var gotoOptions = anchorEl.getAttribute('data-goto');
- gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
- var dateEnv = _this.dateEnv;
- var dateMarker = dateEnv.createMarker(gotoOptions.date);
- var viewType = gotoOptions.type;
- // property like "navLinkDayClick". might be a string or a function
- var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
- if (typeof customAction === 'function') {
- customAction(dateEnv.toDate(dateMarker), ev);
- }
- else {
- if (typeof customAction === 'string') {
- viewType = customAction;
- }
- _this.zoomTo(dateMarker, viewType);
- }
- });
- if (this.opt('handleWindowResize')) {
- window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
- this.windowResize.bind(this), this.opt('windowResizeDelay')));
- }
- };
- Calendar.prototype.unbindHandlers = function () {
- this.removeNavLinkListener();
- if (this.windowResizeProxy) {
- window.removeEventListener('resize', this.windowResizeProxy);
- this.windowResizeProxy = null;
- }
- };
- // Dispatcher
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hydrate = function () {
- var _this = this;
- this.state = this.buildInitialState();
- var rawSources = this.opt('eventSources') || [];
- var singleRawSource = this.opt('events');
- var sources = []; // parsed
- if (singleRawSource) {
- rawSources.unshift(singleRawSource);
- }
- for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
- var rawSource = rawSources_1[_i];
- var source = parseEventSource(rawSource, this);
- if (source) {
- sources.push(source);
- }
- }
- this.batchRendering(function () {
- _this.dispatch({ type: 'INIT' }); // pass in sources here?
- _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
- });
- });
- };
- Calendar.prototype.buildInitialState = function () {
- return {
- viewType: null,
- loadingLevel: 0,
- eventSourceLoadingLevel: 0,
- currentDate: this.getInitialDate(),
- dateProfile: null,
- eventSources: {},
- eventStore: createEmptyEventStore(),
- dateSelection: null,
- eventSelection: '',
- eventDrag: null,
- eventResize: null
- };
- };
- Calendar.prototype.dispatch = function (action) {
- this.actionQueue.push(action);
- if (!this.isReducing) {
- this.isReducing = true;
- var oldState = this.state;
- while (this.actionQueue.length) {
- this.state = this.reduce(this.state, this.actionQueue.shift(), this);
- }
- var newState = this.state;
- this.isReducing = false;
- if (!oldState.loadingLevel && newState.loadingLevel) {
- this.publiclyTrigger('loading', [true]);
- }
- else if (oldState.loadingLevel && !newState.loadingLevel) {
- this.publiclyTrigger('loading', [false]);
- }
- var view = this.component && this.component.view;
- if (oldState.eventStore !== newState.eventStore) {
- if (oldState.eventStore) {
- this.isEventsUpdated = true;
- }
- }
- if (oldState.dateProfile !== newState.dateProfile) {
- if (oldState.dateProfile && view) { // why would view be null!?
- this.publiclyTrigger('datesDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isDatesUpdated = true;
- }
- if (oldState.viewType !== newState.viewType) {
- if (oldState.viewType && view) { // why would view be null!?
- this.publiclyTrigger('viewSkeletonDestroy', [
- {
- view: view,
- el: view.el
- }
- ]);
- }
- this.isViewUpdated = true;
- }
- this.requestRerender();
- }
- };
- Calendar.prototype.reduce = function (state, action, calendar) {
- return reduce(state, action, calendar);
- };
- // Render Queue
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.requestRerender = function () {
- this.needsRerender = true;
- this.delayedRerender(); // will call a debounced-version of tryRerender
- };
- Calendar.prototype.tryRerender = function () {
- if (this.component && // must be accepting renders
- this.needsRerender && // indicates that a rerender was requested
- !this.renderingPauseDepth && // not paused
- !this.isRendering // not currently in the render loop
- ) {
- this.executeRender();
- }
- };
- Calendar.prototype.batchRendering = function (func) {
- this.renderingPauseDepth++;
- func();
- this.renderingPauseDepth--;
- if (this.needsRerender) {
- this.requestRerender();
- }
- };
- // Rendering
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.executeRender = function () {
- // clear these BEFORE the render so that new values will accumulate during render
- this.needsRerender = false;
- this.isRendering = true;
- this.renderComponent();
- this.isRendering = false;
- // received a rerender request while rendering
- if (this.needsRerender) {
- this.delayedRerender();
- }
- };
- /*
- don't call this directly. use executeRender instead
- */
- Calendar.prototype.renderComponent = function () {
- var _a = this, state = _a.state, component = _a.component;
- var viewType = state.viewType;
- var viewSpec = this.viewSpecs[viewType];
- if (!viewSpec) {
- throw new Error("View type \"" + viewType + "\" is not valid");
- }
- // if event sources are still loading and progressive rendering hasn't been enabled,
- // keep rendering the last fully loaded set of events
- var renderableEventStore = this.renderableEventStore =
- (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
- this.renderableEventStore :
- state.eventStore;
- var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
- var eventUiBySource = this.buildEventUiBySource(state.eventSources);
- var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfileGenerator: this.dateProfileGenerators[viewType], dateProfile: state.dateProfile, eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }), this.buildComponentContext(this.theme, this.dateEnv, this.optionsManager.computed));
- if (this.isViewUpdated) {
- this.isViewUpdated = false;
- this.publiclyTrigger('viewSkeletonRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isDatesUpdated) {
- this.isDatesUpdated = false;
- this.publiclyTrigger('datesRender', [
- {
- view: component.view,
- el: component.view.el
- }
- ]);
- }
- if (this.isEventsUpdated) {
- this.isEventsUpdated = false;
- }
- this.releaseAfterSizingTriggers();
- };
- // Options
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.setOption = function (name, val) {
- var _a;
- this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
- };
- Calendar.prototype.getOption = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.opt = function (name) {
- return this.optionsManager.computed[name];
- };
- Calendar.prototype.viewOpt = function (name) {
- return this.viewOpts()[name];
- };
- Calendar.prototype.viewOpts = function () {
- return this.viewSpecs[this.state.viewType].options;
- };
- /*
- handles option changes (like a diff)
- */
- Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
- var _this = this;
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
- var normalUpdates = {};
- var specialUpdates = {};
- var oldDateEnv = this.dateEnv; // do this before handleOptions
- var isTimeZoneDirty = false;
- var isSizeDirty = false;
- var anyDifficultOptions = Boolean(removals.length);
- for (var name_1 in updates) {
- if (changeHandlers[name_1]) {
- specialUpdates[name_1] = updates[name_1];
- }
- else {
- normalUpdates[name_1] = updates[name_1];
- }
- }
- for (var name_2 in normalUpdates) {
- if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
- isSizeDirty = true;
- }
- else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
- else {
- anyDifficultOptions = true;
- if (name_2 === 'timeZone') {
- isTimeZoneDirty = true;
- }
- }
- }
- this.optionsManager.mutate(normalUpdates, removals, isDynamic);
- if (anyDifficultOptions) {
- this.handleOptions(this.optionsManager.computed);
- }
- this.batchRendering(function () {
- if (anyDifficultOptions) {
- if (isTimeZoneDirty) {
- _this.dispatch({
- type: 'CHANGE_TIMEZONE',
- oldDateEnv: oldDateEnv
- });
- }
- /* HACK
- has the same effect as calling this.requestRerender()
- but recomputes the state's dateProfile
- */
- _this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: _this.state.viewType
- });
- }
- else if (isSizeDirty) {
- _this.updateSize();
- }
- // special updates
- if (deepEqual) {
- for (var name_3 in specialUpdates) {
- changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
- }
- }
- });
- };
- /*
- rebuilds things based off of a complete set of refined options
- */
- Calendar.prototype.handleOptions = function (options) {
- var _this = this;
- var pluginHooks = this.pluginSystem.hooks;
- this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
- this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
- this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
- this.theme = this.buildTheme(options);
- var available = this.parseRawLocales(options.locales);
- this.availableRawLocales = available.map;
- var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
- this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
- this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
- // ineffecient to do every time?
- this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
- // ineffecient to do every time?
- this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
- return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
- });
- };
- Calendar.prototype.getAvailableLocaleCodes = function () {
- return Object.keys(this.availableRawLocales);
- };
- Calendar.prototype._buildSelectionConfig = function (rawOpts) {
- return processScopedUiProps('select', rawOpts, this);
- };
- Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
- if (rawOpts.editable) { // so 'editable' affected events
- rawOpts = __assign({}, rawOpts, { eventEditable: true });
- }
- return processScopedUiProps('event', rawOpts, this);
- };
- // Trigger
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.hasPublicHandlers = function (name) {
- return this.hasHandlers(name) ||
- this.opt(name); // handler specified in options
- };
- Calendar.prototype.publiclyTrigger = function (name, args) {
- var optHandler = this.opt(name);
- this.triggerWith(name, this, args);
- if (optHandler) {
- return optHandler.apply(this, args);
- }
- };
- Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
- var afterSizingTriggers = this.afterSizingTriggers;
- (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
- };
- Calendar.prototype.releaseAfterSizingTriggers = function () {
- var afterSizingTriggers = this.afterSizingTriggers;
- for (var name_4 in afterSizingTriggers) {
- for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
- var args = _a[_i];
- this.publiclyTrigger(name_4, args);
- }
- }
- this.afterSizingTriggers = {};
- };
- // View
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a boolean about whether the view is okay to instantiate at some point
- Calendar.prototype.isValidViewType = function (viewType) {
- return Boolean(this.viewSpecs[viewType]);
- };
- Calendar.prototype.changeView = function (viewType, dateOrRange) {
- var dateMarker = null;
- if (dateOrRange) {
- if (dateOrRange.start && dateOrRange.end) { // a range
- this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
- this.handleOptions(this.optionsManager.computed); // ...but yuck
- }
- else { // a date
- dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
- }
- }
- this.unselect();
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: viewType,
- dateMarker: dateMarker
- });
- };
- // Forces navigation to a view for the given date.
- // `viewType` can be a specific view name or a generic one like "week" or "day".
- // needs to change
- Calendar.prototype.zoomTo = function (dateMarker, viewType) {
- var spec;
- viewType = viewType || 'day'; // day is default zoom
- spec = this.viewSpecs[viewType] ||
- this.getUnitViewSpec(viewType);
- this.unselect();
- if (spec) {
- this.dispatch({
- type: 'SET_VIEW_TYPE',
- viewType: spec.type,
- dateMarker: dateMarker
- });
- }
- else {
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: dateMarker
- });
- }
- };
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
- // Preference is given to views that have corresponding buttons.
- Calendar.prototype.getUnitViewSpec = function (unit) {
- var component = this.component;
- var viewTypes = [];
- var i;
- var spec;
- // put views that have buttons first. there will be duplicates, but oh
- if (component.header) {
- viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
- }
- if (component.footer) {
- viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
- }
- for (var viewType in this.viewSpecs) {
- viewTypes.push(viewType);
- }
- for (i = 0; i < viewTypes.length; i++) {
- spec = this.viewSpecs[viewTypes[i]];
- if (spec) {
- if (spec.singleUnit === unit) {
- return spec;
- }
- }
- }
- };
- // Current Date
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getInitialDate = function () {
- var defaultDateInput = this.opt('defaultDate');
- // compute the initial ambig-timezone date
- if (defaultDateInput != null) {
- return this.dateEnv.createMarker(defaultDateInput);
- }
- else {
- return this.getNow(); // getNow already returns unzoned
- }
- };
- Calendar.prototype.prev = function () {
- this.unselect();
- this.dispatch({ type: 'PREV' });
- };
- Calendar.prototype.next = function () {
- this.unselect();
- this.dispatch({ type: 'NEXT' });
- };
- Calendar.prototype.prevYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
- });
- };
- Calendar.prototype.nextYear = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
- });
- };
- Calendar.prototype.today = function () {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.getNow()
- });
- };
- Calendar.prototype.gotoDate = function (zonedDateInput) {
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.createMarker(zonedDateInput)
- });
- };
- Calendar.prototype.incrementDate = function (deltaInput) {
- var delta = createDuration(deltaInput);
- if (delta) { // else, warn about invalid input?
- this.unselect();
- this.dispatch({
- type: 'SET_DATE',
- dateMarker: this.dateEnv.add(this.state.currentDate, delta)
- });
- }
- };
- // for external API
- Calendar.prototype.getDate = function () {
- return this.dateEnv.toDate(this.state.currentDate);
- };
- // Date Formatting Utils
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.formatDate = function (d, formatter) {
- var dateEnv = this.dateEnv;
- return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
- };
- // `settings` is for formatter AND isEndExclusive
- Calendar.prototype.formatRange = function (d0, d1, settings) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
- };
- Calendar.prototype.formatIso = function (d, omitTime) {
- var dateEnv = this.dateEnv;
- return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.windowResize = function (ev) {
- if (!this.isHandlingWindowResize &&
- this.component && // why?
- ev.target === window // not a jqui resize event
- ) {
- this.isHandlingWindowResize = true;
- this.updateSize();
- this.publiclyTrigger('windowResize', [this.view]);
- this.isHandlingWindowResize = false;
- }
- };
- Calendar.prototype.updateSize = function () {
- if (this.component) { // when?
- this.component.updateSize(true);
- }
- };
- // Component Registration
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
- var settings = parseInteractionSettings(component, settingsInput);
- var DEFAULT_INTERACTIONS = [
- EventClicking,
- EventHovering
- ];
- var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
- var interactions = interactionClasses.map(function (interactionClass) {
- return new interactionClass(settings);
- });
- this.interactionsStore[component.uid] = interactions;
- interactionSettingsStore[component.uid] = settings;
- };
- Calendar.prototype.unregisterInteractiveComponent = function (component) {
- for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
- var listener = _a[_i];
- listener.destroy();
- }
- delete this.interactionsStore[component.uid];
- delete interactionSettingsStore[component.uid];
- };
- // Date Selection / Event Selection / DayClick
- // -----------------------------------------------------------------------------------------------------------------
- // this public method receives start/end dates in any format, with any timezone
- // NOTE: args were changed from v3
- Calendar.prototype.select = function (dateOrObj, endDate) {
- var selectionInput;
- if (endDate == null) {
- if (dateOrObj.start != null) {
- selectionInput = dateOrObj;
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: null
- };
- }
- }
- else {
- selectionInput = {
- start: dateOrObj,
- end: endDate
- };
- }
- var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
- );
- if (selection) { // throw parse error otherwise?
- this.dispatch({ type: 'SELECT_DATES', selection: selection });
- this.triggerDateSelect(selection);
- }
- };
- // public method
- Calendar.prototype.unselect = function (pev) {
- if (this.state.dateSelection) {
- this.dispatch({ type: 'UNSELECT_DATES' });
- this.triggerDateUnselect(pev);
- }
- };
- Calendar.prototype.triggerDateSelect = function (selection, pev) {
- var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
- this.publiclyTrigger('select', [arg]);
- };
- Calendar.prototype.triggerDateUnselect = function (pev) {
- this.publiclyTrigger('unselect', [
- {
- jsEvent: pev ? pev.origEvent : null,
- view: this.view
- }
- ]);
- };
- // TODO: receive pev?
- Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
- var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
- view: view });
- this.publiclyTrigger('dateClick', [arg]);
- };
- Calendar.prototype.buildDatePointApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
- return props;
- };
- Calendar.prototype.buildDateSpanApi = function (dateSpan) {
- var props = {};
- for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(props, transform(dateSpan, this));
- }
- __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
- return props;
- };
- // Date Utils
- // -----------------------------------------------------------------------------------------------------------------
- // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
- Calendar.prototype.getNow = function () {
- var now = this.opt('now');
- if (typeof now === 'function') {
- now = now();
- }
- if (now == null) {
- return this.dateEnv.createNowMarker();
- }
- return this.dateEnv.createMarker(now);
- };
- // Event-Date Utilities
- // -----------------------------------------------------------------------------------------------------------------
- // Given an event's allDay status and start date, return what its fallback end date should be.
- // TODO: rename to computeDefaultEventEnd
- Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
- var end = marker;
- if (allDay) {
- end = startOfDay(end);
- end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
- }
- else {
- end = this.dateEnv.add(end, this.defaultTimedEventDuration);
- }
- return end;
- };
- // Public Events API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.addEvent = function (eventInput, sourceInput) {
- if (eventInput instanceof EventApi) {
- var def = eventInput._def;
- var instance = eventInput._instance;
- // not already present? don't want to add an old snapshot
- if (!this.state.eventStore.defs[def.defId]) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
- });
- }
- return eventInput;
- }
- var sourceId;
- if (sourceInput instanceof EventSourceApi) {
- sourceId = sourceInput.internalEventSource.sourceId;
- }
- else if (sourceInput != null) {
- var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
- if (!sourceApi) {
- console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
- return null;
- }
- else {
- sourceId = sourceApi.internalEventSource.sourceId;
- }
- }
- var tuple = parseEvent(eventInput, sourceId, this);
- if (tuple) {
- this.dispatch({
- type: 'ADD_EVENTS',
- eventStore: eventTupleToStore(tuple)
- });
- return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
- }
- return null;
- };
- // TODO: optimize
- Calendar.prototype.getEventById = function (id) {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- id = String(id);
- for (var defId in defs) {
- var def = defs[defId];
- if (def.publicId === id) {
- if (def.recurringDef) {
- return new EventApi(this, def, null);
- }
- else {
- for (var instanceId in instances) {
- var instance = instances[instanceId];
- if (instance.defId === def.defId) {
- return new EventApi(this, def, instance);
- }
- }
- }
- }
- }
- return null;
- };
- Calendar.prototype.getEvents = function () {
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
- var eventApis = [];
- for (var id in instances) {
- var instance = instances[id];
- var def = defs[instance.defId];
- eventApis.push(new EventApi(this, def, instance));
- }
- return eventApis;
- };
- Calendar.prototype.removeAllEvents = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
- };
- Calendar.prototype.rerenderEvents = function () {
- this.dispatch({ type: 'RESET_EVENTS' });
- };
- // Public Event Sources API
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.getEventSources = function () {
- var sourceHash = this.state.eventSources;
- var sourceApis = [];
- for (var internalId in sourceHash) {
- sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
- }
- return sourceApis;
- };
- Calendar.prototype.getEventSourceById = function (id) {
- var sourceHash = this.state.eventSources;
- id = String(id);
- for (var sourceId in sourceHash) {
- if (sourceHash[sourceId].publicId === id) {
- return new EventSourceApi(this, sourceHash[sourceId]);
- }
- }
- return null;
- };
- Calendar.prototype.addEventSource = function (sourceInput) {
- if (sourceInput instanceof EventSourceApi) {
- // not already present? don't want to add an old snapshot
- if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
- this.dispatch({
- type: 'ADD_EVENT_SOURCES',
- sources: [sourceInput.internalEventSource]
- });
- }
- return sourceInput;
- }
- var eventSource = parseEventSource(sourceInput, this);
- if (eventSource) { // TODO: error otherwise?
- this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
- return new EventSourceApi(this, eventSource);
- }
- return null;
- };
- Calendar.prototype.removeAllEventSources = function () {
- this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
- };
- Calendar.prototype.refetchEvents = function () {
- this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
- };
- // Scroll
- // -----------------------------------------------------------------------------------------------------------------
- Calendar.prototype.scrollToTime = function (timeInput) {
- var duration = createDuration(timeInput);
- if (duration) {
- this.component.view.scrollToDuration(duration);
- }
- };
- return Calendar;
- }());
- EmitterMixin.mixInto(Calendar);
- // for memoizers
- // -----------------------------------------------------------------------------------------------------------------
- function buildComponentContext$1(theme, dateEnv, options) {
- return new ComponentContext(this, theme, dateEnv, options, null);
- }
- function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
- return new DateEnv({
- calendarSystem: 'gregory',
- timeZone: timeZone,
- namedTimeZoneImpl: namedTimeZoneImpl,
- locale: locale,
- weekNumberCalculation: weekNumberCalculation,
- firstDay: firstDay,
- weekLabel: weekLabel,
- cmdFormatter: cmdFormatter
- });
- }
- function buildTheme(calendarOptions) {
- var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
- return new themeClass(calendarOptions);
- }
- function buildDelayedRerender(wait) {
- var func = this.tryRerender.bind(this);
- if (wait != null) {
- func = debounce(func, wait);
- }
- return func;
- }
- function buildEventUiBySource(eventSources) {
- return mapHash(eventSources, function (eventSource) {
- return eventSource.ui;
- });
- }
- function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
- var eventUiBases = { '': eventUiSingleBase };
- for (var defId in eventDefs) {
- var def = eventDefs[defId];
- if (def.sourceId && eventUiBySource[def.sourceId]) {
- eventUiBases[defId] = eventUiBySource[def.sourceId];
- }
- }
- return eventUiBases;
- }
-
- var View = /** @class */ (function (_super) {
- __extends(View, _super);
- function View(viewSpec, parentEl) {
- var _this = _super.call(this, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' })) || this;
- _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
- _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
- _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
- _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
- _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
- _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
- _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
- _this.viewSpec = viewSpec;
- _this.type = viewSpec.type;
- parentEl.appendChild(_this.el);
- _this.initialize();
- return _this;
- }
- View.prototype.initialize = function () {
- };
- Object.defineProperty(View.prototype, "activeStart", {
- // Date Setting/Unsetting
- // -----------------------------------------------------------------------------------------------------------------
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "activeEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentStart", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(View.prototype, "currentEnd", {
- get: function () {
- return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end);
- },
- enumerable: true,
- configurable: true
- });
- // General Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.render = function (props, context) {
- this.renderDatesMem(props.dateProfile);
- this.renderBusinessHoursMem(props.businessHours);
- this.renderDateSelectionMem(props.dateSelection);
- this.renderEventsMem(props.eventStore);
- this.renderEventSelectionMem(props.eventSelection);
- this.renderEventDragMem(props.eventDrag);
- this.renderEventResizeMem(props.eventResize);
- };
- View.prototype.beforeUpdate = function () {
- this.addScroll(this.queryScroll());
- };
- View.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderDatesMem.unrender(); // should unrender everything else
- };
- // Sizing
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- var calendar = this.context.calendar;
- if (isResize) {
- this.addScroll(this.queryScroll()); // NOTE: same code as in beforeUpdate
- }
- if (isResize || // HACKS...
- calendar.isViewUpdated ||
- calendar.isDatesUpdated ||
- calendar.isEventsUpdated) {
- // sort of the catch-all sizing
- // anything that might cause dimension changes
- this.updateBaseSize(isResize, viewHeight, isAuto);
- }
- // NOTE: popScroll is called by CalendarComponent
- };
- View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- };
- // Date Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDatesWrap = function (dateProfile) {
- this.renderDates(dateProfile);
- this.addScroll({
- duration: createDuration(this.context.options.scrollTime)
- });
- };
- View.prototype.unrenderDatesWrap = function () {
- this.stopNowIndicator();
- this.unrenderDates();
- };
- View.prototype.renderDates = function (dateProfile) { };
- View.prototype.unrenderDates = function () { };
- // Business Hours
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderBusinessHours = function (businessHours) { };
- View.prototype.unrenderBusinessHours = function () { };
- // Date Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderDateSelectionWrap = function (selection) {
- if (selection) {
- this.renderDateSelection(selection);
- }
- };
- View.prototype.unrenderDateSelectionWrap = function (selection) {
- if (selection) {
- this.unrenderDateSelection(selection);
- }
- };
- View.prototype.renderDateSelection = function (selection) { };
- View.prototype.unrenderDateSelection = function (selection) { };
- // Event Rendering
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEvents = function (eventStore) { };
- View.prototype.unrenderEvents = function () { };
- // util for subclasses
- View.prototype.sliceEvents = function (eventStore, allDay) {
- var props = this.props;
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.context.nextDayThreshold : null).fg;
- };
- // Event Selection
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.renderEventSelection(instanceId);
- }
- };
- View.prototype.unrenderEventSelectionWrap = function (instanceId) {
- if (instanceId) {
- this.unrenderEventSelection(instanceId);
- }
- };
- View.prototype.renderEventSelection = function (instanceId) { };
- View.prototype.unrenderEventSelection = function (instanceId) { };
- // Event Drag
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventDragWrap = function (state) {
- if (state) {
- this.renderEventDrag(state);
- }
- };
- View.prototype.unrenderEventDragWrap = function (state) {
- if (state) {
- this.unrenderEventDrag(state);
- }
- };
- View.prototype.renderEventDrag = function (state) { };
- View.prototype.unrenderEventDrag = function (state) { };
- // Event Resize
- // -----------------------------------------------------------------------------------------------------------------
- View.prototype.renderEventResizeWrap = function (state) {
- if (state) {
- this.renderEventResize(state);
- }
- };
- View.prototype.unrenderEventResizeWrap = function (state) {
- if (state) {
- this.unrenderEventResize(state);
- }
- };
- View.prototype.renderEventResize = function (state) { };
- View.prototype.unrenderEventResize = function (state) { };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- // Immediately render the current time indicator and begins re-rendering it at an interval,
- // which is defined by this.getNowIndicatorUnit().
- // TODO: somehow do this for the current whole day's background too
- // USAGE: must be called manually from subclasses' render methods! don't need to call stopNowIndicator tho
- View.prototype.startNowIndicator = function (dateProfile, dateProfileGenerator) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, dateEnv = _a.dateEnv, options = _a.options;
- var unit;
- var update;
- var delay; // ms wait value
- if (options.nowIndicator && !this.initialNowDate) {
- unit = this.getNowIndicatorUnit(dateProfile, dateProfileGenerator);
- if (unit) {
- update = this.updateNowIndicator.bind(this);
- this.initialNowDate = calendar.getNow();
- this.initialNowQueriedMs = new Date().valueOf();
- // wait until the beginning of the next interval
- delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
- // TODO: maybe always use setTimeout, waiting until start of next unit
- this.nowIndicatorTimeoutID = setTimeout(function () {
- _this.nowIndicatorTimeoutID = null;
- update();
- if (unit === 'second') {
- delay = 1000; // every second
- }
- else {
- delay = 1000 * 60; // otherwise, every minute
- }
- _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
- }, delay);
- }
- // rendering will be initiated in updateSize
- }
- };
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
- // since the initial getNow call.
- View.prototype.updateNowIndicator = function () {
- if (this.props.dateProfile && // a way to determine if dates were rendered yet
- this.initialNowDate // activated before?
- ) {
- this.unrenderNowIndicator(); // won't unrender if unnecessary
- this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
- this.isNowIndicatorRendered = true;
- }
- };
- // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
- // Won't cause side effects if indicator isn't rendered.
- View.prototype.stopNowIndicator = function () {
- if (this.nowIndicatorTimeoutID) {
- clearTimeout(this.nowIndicatorTimeoutID);
- this.nowIndicatorTimeoutID = null;
- }
- if (this.nowIndicatorIntervalID) {
- clearInterval(this.nowIndicatorIntervalID);
- this.nowIndicatorIntervalID = null;
- }
- if (this.isNowIndicatorRendered) {
- this.unrenderNowIndicator();
- this.isNowIndicatorRendered = false;
- }
- };
- View.prototype.getNowIndicatorUnit = function (dateProfile, dateProfileGenerator) {
- // subclasses should implement
- };
- // Renders a current time indicator at the given datetime
- View.prototype.renderNowIndicator = function (date) {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- // Undoes the rendering actions from renderNowIndicator
- View.prototype.unrenderNowIndicator = function () {
- // SUBCLASSES MUST PASS TO CHILDREN!
- };
- /* Scroller
- ------------------------------------------------------------------------------------------------------------------*/
- View.prototype.addScroll = function (scroll, isForced) {
- if (isForced) {
- scroll.isForced = isForced;
- }
- __assign(this.queuedScroll || (this.queuedScroll = {}), scroll);
- };
- View.prototype.popScroll = function (isResize) {
- this.applyQueuedScroll(isResize);
- this.queuedScroll = null;
- };
- View.prototype.applyQueuedScroll = function (isResize) {
- if (this.queuedScroll) {
- this.applyScroll(this.queuedScroll, isResize);
- }
- };
- View.prototype.queryScroll = function () {
- var scroll = {};
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.queryDateScroll());
- }
- return scroll;
- };
- View.prototype.applyScroll = function (scroll, isResize) {
- var duration = scroll.duration, isForced = scroll.isForced;
- if (duration != null && !isForced) {
- delete scroll.duration;
- if (this.props.dateProfile) { // dates rendered yet?
- __assign(scroll, this.computeDateScroll(duration));
- }
- }
- if (this.props.dateProfile) { // dates rendered yet?
- this.applyDateScroll(scroll);
- }
- };
- View.prototype.computeDateScroll = function (duration) {
- return {}; // subclasses must implement
- };
- View.prototype.queryDateScroll = function () {
- return {}; // subclasses must implement
- };
- View.prototype.applyDateScroll = function (scroll) {
- // subclasses must implement
- };
- // for API
- View.prototype.scrollToDuration = function (duration) {
- this.applyScroll({ duration: duration }, false);
- };
- return View;
- }(DateComponent));
- EmitterMixin.mixInto(View);
- View.prototype.usesMinMaxTime = false;
- View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
- var FgEventRenderer = /** @class */ (function () {
- function FgEventRenderer() {
- this.segs = [];
- this.isSizeDirty = false;
- }
- FgEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- this.context = context;
- this.rangeUpdated(); // called too frequently :(
- // render an `.el` on each seg
- // returns a subset of the segs. segs that were actually rendered
- segs = this.renderSegEls(segs, mirrorInfo);
- this.segs = segs;
- this.attachSegs(segs, mirrorInfo);
- this.isSizeDirty = true;
- triggerRenderedSegs(this.context, this.segs, Boolean(mirrorInfo));
- };
- FgEventRenderer.prototype.unrender = function (context, _segs, mirrorInfo) {
- triggerWillRemoveSegs(this.context, this.segs, Boolean(mirrorInfo));
- this.detachSegs(this.segs);
- this.segs = [];
- };
- // Updates values that rely on options and also relate to range
- FgEventRenderer.prototype.rangeUpdated = function () {
- var options = this.context.options;
- var displayEventTime;
- var displayEventEnd;
- this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
- displayEventTime = options.displayEventTime;
- if (displayEventTime == null) {
- displayEventTime = this.computeDisplayEventTime(); // might be based off of range
- }
- displayEventEnd = options.displayEventEnd;
- if (displayEventEnd == null) {
- displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
- }
- this.displayEventTime = displayEventTime;
- this.displayEventEnd = displayEventEnd;
- };
- // Renders and assigns an `el` property for each foreground event segment.
- // Only returns segments that successfully rendered.
- FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
- var html = '';
- var i;
- if (segs.length) { // don't build an empty html string
- // build a large concatenation of event segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(segs[i], mirrorInfo);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- segs = filterSegsViaEls(this.context, segs, Boolean(mirrorInfo));
- }
- return segs;
- };
- // Generic utility for generating the HTML classNames for an event segment's element
- FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
- var classes = [
- 'fc-event',
- seg.isStart ? 'fc-start' : 'fc-not-start',
- seg.isEnd ? 'fc-end' : 'fc-not-end'
- ].concat(seg.eventRange.ui.classNames);
- if (isDraggable) {
- classes.push('fc-draggable');
- }
- if (isResizable) {
- classes.push('fc-resizable');
- }
- if (mirrorInfo) {
- classes.push('fc-mirror');
- if (mirrorInfo.isDragging) {
- classes.push('fc-dragging');
- }
- if (mirrorInfo.isResizing) {
- classes.push('fc-resizing');
- }
- }
- return classes;
- };
- // Compute the text that should be displayed on an event's element.
- // `range` can be the Event object itself, or something range-like, with at least a `start`.
- // If event times are disabled, or the event has no time, will return a blank string.
- // If not specified, formatter will default to the eventTimeFormat setting,
- // and displayEnd will default to the displayEventEnd setting.
- FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
- var def = eventRange.def, instance = eventRange.instance;
- return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
- };
- FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
- var dateEnv = this.context.dateEnv;
- if (formatter == null) {
- formatter = this.eventTimeFormat;
- }
- if (displayEnd == null) {
- displayEnd = this.displayEventEnd;
- }
- if (this.displayEventTime && !allDay) {
- if (displayEnd && end) {
- return dateEnv.formatRange(start, end, formatter, {
- forcedStartTzo: forcedStartTzo,
- forcedEndTzo: forcedEndTzo
- });
- }
- else {
- return dateEnv.format(start, formatter, {
- forcedTzo: forcedStartTzo
- });
- }
- }
- return '';
- };
- FgEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true
- };
- };
- FgEventRenderer.prototype.computeDisplayEventTime = function () {
- return true;
- };
- FgEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Utility for generating event skin-related CSS properties
- FgEventRenderer.prototype.getSkinCss = function (ui) {
- return {
- 'background-color': ui.backgroundColor,
- 'border-color': ui.borderColor,
- color: ui.textColor
- };
- };
- FgEventRenderer.prototype.sortEventSegs = function (segs) {
- var specs = this.context.eventOrderSpecs;
- var objs = segs.map(buildSegCompareObj);
- objs.sort(function (obj0, obj1) {
- return compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- FgEventRenderer.prototype.computeSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.computeSegSizes(this.segs);
- }
- };
- FgEventRenderer.prototype.assignSizes = function (force) {
- if (force || this.isSizeDirty) {
- this.assignSegSizes(this.segs);
- this.isSizeDirty = false;
- }
- };
- FgEventRenderer.prototype.computeSegSizes = function (segs) {
- };
- FgEventRenderer.prototype.assignSegSizes = function (segs) {
- };
- // Manipulation on rendered segs
- FgEventRenderer.prototype.hideByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = 'hidden';
- }
- }
- }
- };
- FgEventRenderer.prototype.showByHash = function (hash) {
- if (hash) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (hash[seg.eventRange.instance.instanceId]) {
- seg.el.style.visibility = '';
- }
- }
- }
- };
- FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- var eventInstance = seg.eventRange.instance;
- if (eventInstance && eventInstance.instanceId === instanceId &&
- seg.el // necessary?
- ) {
- seg.el.classList.add('fc-selected');
- }
- }
- }
- };
- FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
- if (instanceId) {
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
- var seg = _a[_i];
- if (seg.el) { // necessary?
- seg.el.classList.remove('fc-selected');
- }
- }
- }
- };
- return FgEventRenderer;
- }());
- // returns a object with all primitive props that can be compared
- function buildSegCompareObj(seg) {
- var eventDef = seg.eventRange.def;
- var range = seg.eventRange.instance.range;
- var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
- var end = range.end ? range.end.valueOf() : 0; // "
- return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
- end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
- });
- }
-
- /*
- TODO: when refactoring this class, make a new FillRenderer instance for each `type`
- */
- var FillRenderer = /** @class */ (function () {
- function FillRenderer() {
- this.fillSegTag = 'div';
- this.dirtySizeFlags = {};
- this.containerElsByType = {};
- this.segsByType = {};
- }
- FillRenderer.prototype.getSegsByType = function (type) {
- return this.segsByType[type] || [];
- };
- FillRenderer.prototype.renderSegs = function (type, context, segs) {
- var _a;
- this.context = context;
- var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
- var containerEls = this.attachSegs(type, renderedSegs);
- if (containerEls) {
- (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
- }
- this.segsByType[type] = renderedSegs;
- if (type === 'bgEvent') {
- triggerRenderedSegs(context, renderedSegs, false); // isMirror=false
- }
- this.dirtySizeFlags[type] = true;
- };
- // Unrenders a specific type of fill that is currently rendered on the grid
- FillRenderer.prototype.unrender = function (type, context) {
- var segs = this.segsByType[type];
- if (segs) {
- if (type === 'bgEvent') {
- triggerWillRemoveSegs(context, segs, false); // isMirror=false
- }
- this.detachSegs(type, segs);
- }
- };
- // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
- // Only returns segments that successfully rendered.
- FillRenderer.prototype.renderSegEls = function (type, segs) {
- var _this = this;
- var html = '';
- var i;
- if (segs.length) {
- // build a large concatenation of segment HTML
- for (i = 0; i < segs.length; i++) {
- html += this.renderSegHtml(type, segs[i]);
- }
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
- // Then, compute the 'el' for each segment.
- htmlToElements(html).forEach(function (el, i) {
- var seg = segs[i];
- if (el) {
- seg.el = el;
- }
- });
- if (type === 'bgEvent') {
- segs = filterSegsViaEls(this.context, segs, false // isMirror. background events can never be mirror elements
- );
- }
- // correct element type? (would be bad if a non-TD were inserted into a table for example)
- segs = segs.filter(function (seg) {
- return elementMatches(seg.el, _this.fillSegTag);
- });
- }
- return segs;
- };
- // Builds the HTML needed for one fill segment. Generic enough to work with different types.
- FillRenderer.prototype.renderSegHtml = function (type, seg) {
- var css = null;
- var classNames = [];
- if (type !== 'highlight' && type !== 'businessHours') {
- css = {
- 'background-color': seg.eventRange.ui.backgroundColor
- };
- }
- if (type !== 'highlight') {
- classNames = classNames.concat(seg.eventRange.ui.classNames);
- }
- if (type === 'businessHours') {
- classNames.push('fc-bgevent');
- }
- else {
- classNames.push('fc-' + type.toLowerCase());
- }
- return '<' + this.fillSegTag +
- (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
- (css ? ' style="' + cssToStr(css) + '"' : '') +
- '></' + this.fillSegTag + '>';
- };
- FillRenderer.prototype.detachSegs = function (type, segs) {
- var containerEls = this.containerElsByType[type];
- if (containerEls) {
- containerEls.forEach(removeElement);
- delete this.containerElsByType[type];
- }
- };
- FillRenderer.prototype.computeSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.computeSegSizes(this.segsByType[type]);
- }
- }
- };
- FillRenderer.prototype.assignSizes = function (force) {
- for (var type in this.segsByType) {
- if (force || this.dirtySizeFlags[type]) {
- this.assignSegSizes(this.segsByType[type]);
- }
- }
- this.dirtySizeFlags = {};
- };
- FillRenderer.prototype.computeSegSizes = function (segs) {
- };
- FillRenderer.prototype.assignSegSizes = function (segs) {
- };
- return FillRenderer;
- }());
-
- var NamedTimeZoneImpl = /** @class */ (function () {
- function NamedTimeZoneImpl(timeZoneName) {
- this.timeZoneName = timeZoneName;
- }
- return NamedTimeZoneImpl;
- }());
-
- /*
- An abstraction for a dragging interaction originating on an event.
- Does higher-level things than PointerDragger, such as possibly:
- - a "mirror" that moves with the pointer
- - a minimum number of pixels or other criteria for a true drag to begin
-
- subclasses must emit:
- - pointerdown
- - dragstart
- - dragmove
- - pointerup
- - dragend
- */
- var ElementDragging = /** @class */ (function () {
- function ElementDragging(el) {
- this.emitter = new EmitterMixin();
- }
- ElementDragging.prototype.destroy = function () {
- };
- ElementDragging.prototype.setMirrorIsVisible = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- // optional if subclass doesn't want to support a mirror
- };
- ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- // optional
- };
- return ElementDragging;
- }());
-
- function formatDate(dateInput, settings) {
- if (settings === void 0) { settings = {}; }
- var dateEnv = buildDateEnv$1(settings);
- var formatter = createFormatter(settings);
- var dateMeta = dateEnv.createMarkerMeta(dateInput);
- if (!dateMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.format(dateMeta.marker, formatter, {
- forcedTzo: dateMeta.forcedTzo
- });
- }
- function formatRange(startInput, endInput, settings // mixture of env and formatter settings
- ) {
- var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
- var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
- var startMeta = dateEnv.createMarkerMeta(startInput);
- var endMeta = dateEnv.createMarkerMeta(endInput);
- if (!startMeta || !endMeta) { // TODO: warning?
- return '';
- }
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
- forcedStartTzo: startMeta.forcedTzo,
- forcedEndTzo: endMeta.forcedTzo,
- isEndExclusive: settings.isEndExclusive
- });
- }
- // TODO: more DRY and optimized
- function buildDateEnv$1(settings) {
- var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
- // ensure required settings
- settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
- return new DateEnv(settings);
- }
-
- var DRAG_META_PROPS = {
- startTime: createDuration,
- duration: createDuration,
- create: Boolean,
- sourceId: String
- };
- var DRAG_META_DEFAULTS = {
- create: true
- };
- function parseDragMeta(raw) {
- var leftoverProps = {};
- var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
- refined.leftoverProps = leftoverProps;
- return refined;
- }
-
- // Computes a default column header formatting string if `colFormat` is not explicitly defined
- function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
- // if more than one week row, or if there are a lot of columns with not much space,
- // put just the day numbers will be in each cell
- if (!datesRepDistinctDays || dayCnt > 10) {
- return { weekday: 'short' }; // "Sat"
- }
- else if (dayCnt > 1) {
- return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
- }
- else {
- return { weekday: 'long' }; // "Saturday"
- }
- }
- function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme, options = context.options;
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
- var classNames = [
- 'fc-day-header',
- theme.getClass('widgetHeader')
- ];
- var innerHtml;
- if (typeof options.columnHeaderHtml === 'function') {
- innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
- }
- else if (typeof options.columnHeaderText === 'function') {
- innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
- }
- else {
- innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
- }
- // if only one row of days, the classNames on the header can represent the specific days beneath
- if (datesRepDistinctDays) {
- classNames = classNames.concat(
- // includes the day-of-week class
- // noThemeHighlight=true (don't highlight the header)
- getDayClasses(dateMarker, dateProfile, context, true));
- }
- else {
- classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
- }
- return '' +
- '<th class="' + classNames.join(' ') + '"' +
- ((isDateValid && datesRepDistinctDays) ?
- ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
- '') +
- (colspan > 1 ?
- ' colspan="' + colspan + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '>' +
- (isDateValid ?
- // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
- buildGotoAnchorHtml(options, dateEnv, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
- // if not valid, display text, but no link
- innerHtml) +
- '</th>';
- }
-
- var DayHeader = /** @class */ (function (_super) {
- __extends(DayHeader, _super);
- function DayHeader(parentEl) {
- var _this = _super.call(this) || this;
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- _this.parentEl = parentEl;
- return _this;
- }
- DayHeader.prototype.render = function (props, context) {
- var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
- var parts = [];
- this.renderSkeleton(context);
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- var colHeadFormat = createFormatter(context.options.columnHeaderFormat ||
- computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
- for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
- var date = dates_1[_i];
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, context));
- }
- if (context.isRtl) {
- parts.reverse();
- }
- this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
- };
- DayHeader.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- DayHeader.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- var parentEl = this.parentEl;
- parentEl.innerHTML = ''; // because might be nbsp
- parentEl.appendChild(this.el = htmlToElement('<div class="fc-row ' + theme.getClass('headerRow') + '">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- '<thead></thead>' +
- '</table>' +
- '</div>'));
- this.thead = this.el.querySelector('thead');
- };
- DayHeader.prototype._unrenderSkeleton = function () {
- removeElement(this.el);
- };
- return DayHeader;
- }(Component));
-
- var DaySeries = /** @class */ (function () {
- function DaySeries(range, dateProfileGenerator) {
- var date = range.start;
- var end = range.end;
- var indices = [];
- var dates = [];
- var dayIndex = -1;
- while (date < end) { // loop each day from start to end
- if (dateProfileGenerator.isHiddenDay(date)) {
- indices.push(dayIndex + 0.5); // mark that it's between indices
- }
- else {
- dayIndex++;
- indices.push(dayIndex);
- dates.push(date);
- }
- date = addDays(date, 1);
- }
- this.dates = dates;
- this.indices = indices;
- this.cnt = dates.length;
- }
- DaySeries.prototype.sliceRange = function (range) {
- var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
- var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
- var clippedFirstIndex = Math.max(0, firstIndex);
- var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
- // deal with in-between indices
- clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
- clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
- if (clippedFirstIndex <= clippedLastIndex) {
- return {
- firstIndex: clippedFirstIndex,
- lastIndex: clippedLastIndex,
- isStart: firstIndex === clippedFirstIndex,
- isEnd: lastIndex === clippedLastIndex
- };
- }
- else {
- return null;
- }
- };
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
- // If before the first offset, returns a negative number.
- // If after the last offset, returns an offset past the last cell offset.
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
- DaySeries.prototype.getDateDayIndex = function (date) {
- var indices = this.indices;
- var dayOffset = Math.floor(diffDays(this.dates[0], date));
- if (dayOffset < 0) {
- return indices[0] - 1;
- }
- else if (dayOffset >= indices.length) {
- return indices[indices.length - 1] + 1;
- }
- else {
- return indices[dayOffset];
- }
- };
- return DaySeries;
- }());
-
- var DayTable = /** @class */ (function () {
- function DayTable(daySeries, breakOnWeeks) {
- var dates = daySeries.dates;
- var daysPerRow;
- var firstDay;
- var rowCnt;
- if (breakOnWeeks) {
- // count columns until the day-of-week repeats
- firstDay = dates[0].getUTCDay();
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
- if (dates[daysPerRow].getUTCDay() === firstDay) {
- break;
- }
- }
- rowCnt = Math.ceil(dates.length / daysPerRow);
- }
- else {
- rowCnt = 1;
- daysPerRow = dates.length;
- }
- this.rowCnt = rowCnt;
- this.colCnt = daysPerRow;
- this.daySeries = daySeries;
- this.cells = this.buildCells();
- this.headerDates = this.buildHeaderDates();
- }
- DayTable.prototype.buildCells = function () {
- var rows = [];
- for (var row = 0; row < this.rowCnt; row++) {
- var cells = [];
- for (var col = 0; col < this.colCnt; col++) {
- cells.push(this.buildCell(row, col));
- }
- rows.push(cells);
- }
- return rows;
- };
- DayTable.prototype.buildCell = function (row, col) {
- return {
- date: this.daySeries.dates[row * this.colCnt + col]
- };
- };
- DayTable.prototype.buildHeaderDates = function () {
- var dates = [];
- for (var col = 0; col < this.colCnt; col++) {
- dates.push(this.cells[0][col].date);
- }
- return dates;
- };
- DayTable.prototype.sliceRange = function (range) {
- var colCnt = this.colCnt;
- var seriesSeg = this.daySeries.sliceRange(range);
- var segs = [];
- if (seriesSeg) {
- var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
- var index = firstIndex;
- while (index <= lastIndex) {
- var row = Math.floor(index / colCnt);
- var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
- segs.push({
- row: row,
- firstCol: index % colCnt,
- lastCol: (nextIndex - 1) % colCnt,
- isStart: seriesSeg.isStart && index === firstIndex,
- isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
- });
- index = nextIndex;
- }
- }
- return segs;
- };
- return DayTable;
- }());
-
- var Slicer = /** @class */ (function () {
- function Slicer() {
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
- this.sliceDateSelection = memoize(this._sliceDateSpan);
- this.sliceEventStore = memoize(this._sliceEventStore);
- this.sliceEventDrag = memoize(this._sliceInteraction);
- this.sliceEventResize = memoize(this._sliceInteraction);
- }
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- var eventUiBases = props.eventUiBases;
- var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
- return {
- dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, calendar, component].concat(extraArgs)),
- fgEventSegs: eventSegs.fg,
- bgEventSegs: eventSegs.bg,
- eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
- eventSelection: props.eventSelection
- }; // TODO: give interactionSegs?
- };
- Slicer.prototype.sliceNowDate = function (// does not memoize
- date, component) {
- var extraArgs = [];
- for (var _i = 2; _i < arguments.length; _i++) {
- extraArgs[_i - 2] = arguments[_i];
- }
- return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
- {},
- component].concat(extraArgs));
- };
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, calendar, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!businessHours) {
- return [];
- }
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), calendar),
- {},
- dateProfile,
- nextDayThreshold,
- component].concat(extraArgs)).bg;
- };
- Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (eventStore) {
- var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
- fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
- };
- }
- else {
- return { bg: [], fg: [] };
- }
- };
- Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
- var extraArgs = [];
- for (var _i = 5; _i < arguments.length; _i++) {
- extraArgs[_i - 5] = arguments[_i];
- }
- if (!interaction) {
- return null;
- }
- var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
- return {
- segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
- affectedInstances: interaction.affectedEvents.instances,
- isEvent: interaction.isEvent,
- sourceSeg: interaction.origSeg
- };
- };
- Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
- var extraArgs = [];
- for (var _i = 3; _i < arguments.length; _i++) {
- extraArgs[_i - 3] = arguments[_i];
- }
- if (!dateSpan) {
- return [];
- }
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.context.calendar);
- var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
- for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
- var seg = segs_1[_a];
- seg.component = component;
- seg.eventRange = eventRange;
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
- extraArgs) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
- }
- return segs;
- };
- /*
- "complete" seg means it has component and eventRange
- */
- Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
- extraArgs) {
- var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- seg.component = component;
- seg.eventRange = eventRange;
- seg.isStart = eventRange.isStart && seg.isStart;
- seg.isEnd = eventRange.isEnd && seg.isEnd;
- }
- return segs;
- };
- return Slicer;
- }());
- /*
- for incorporating minTime/maxTime if appropriate
- TODO: should be part of DateProfile!
- TimelineDateProfile already does this btw
- */
- function computeActiveRange(dateProfile, isComponentAllDay) {
- var range = dateProfile.activeRange;
- if (isComponentAllDay) {
- return range;
- }
- return {
- start: addMs(range.start, dateProfile.minTime.milliseconds),
- end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
- };
- }
-
- // exports
- // --------------------------------------------------------------------------------------------------
- var version = '4.4.2';
-
- exports.Calendar = Calendar;
- exports.Component = Component;
- exports.ComponentContext = ComponentContext;
- exports.DateComponent = DateComponent;
- exports.DateEnv = DateEnv;
- exports.DateProfileGenerator = DateProfileGenerator;
- exports.DayHeader = DayHeader;
- exports.DaySeries = DaySeries;
- exports.DayTable = DayTable;
- exports.ElementDragging = ElementDragging;
- exports.ElementScrollController = ElementScrollController;
- exports.EmitterMixin = EmitterMixin;
- exports.EventApi = EventApi;
- exports.FgEventRenderer = FgEventRenderer;
- exports.FillRenderer = FillRenderer;
- exports.Interaction = Interaction;
- exports.Mixin = Mixin;
- exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
- exports.PositionCache = PositionCache;
- exports.ScrollComponent = ScrollComponent;
- exports.ScrollController = ScrollController;
- exports.Slicer = Slicer;
- exports.Splitter = Splitter;
- exports.Theme = Theme;
- exports.View = View;
- exports.WindowScrollController = WindowScrollController;
- exports.addDays = addDays;
- exports.addDurations = addDurations;
- exports.addMs = addMs;
- exports.addWeeks = addWeeks;
- exports.allowContextMenu = allowContextMenu;
- exports.allowSelection = allowSelection;
- exports.appendToElement = appendToElement;
- exports.applyAll = applyAll;
- exports.applyMutationToEventStore = applyMutationToEventStore;
- exports.applyStyle = applyStyle;
- exports.applyStyleProp = applyStyleProp;
- exports.asRoughMinutes = asRoughMinutes;
- exports.asRoughMs = asRoughMs;
- exports.asRoughSeconds = asRoughSeconds;
- exports.buildGotoAnchorHtml = buildGotoAnchorHtml;
- exports.buildSegCompareObj = buildSegCompareObj;
- exports.capitaliseFirstLetter = capitaliseFirstLetter;
- exports.combineEventUis = combineEventUis;
- exports.compareByFieldSpec = compareByFieldSpec;
- exports.compareByFieldSpecs = compareByFieldSpecs;
- exports.compareNumbers = compareNumbers;
- exports.compensateScroll = compensateScroll;
- exports.computeClippingRect = computeClippingRect;
- exports.computeEdges = computeEdges;
- exports.computeEventDraggable = computeEventDraggable;
- exports.computeEventEndResizable = computeEventEndResizable;
- exports.computeEventStartResizable = computeEventStartResizable;
- exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
- exports.computeHeightAndMargins = computeHeightAndMargins;
- exports.computeInnerRect = computeInnerRect;
- exports.computeRect = computeRect;
- exports.computeVisibleDayRange = computeVisibleDayRange;
- exports.config = config;
- exports.constrainPoint = constrainPoint;
- exports.createDuration = createDuration;
- exports.createElement = createElement;
- exports.createEmptyEventStore = createEmptyEventStore;
- exports.createEventInstance = createEventInstance;
- exports.createFormatter = createFormatter;
- exports.createPlugin = createPlugin;
- exports.cssToStr = cssToStr;
- exports.debounce = debounce;
- exports.diffDates = diffDates;
- exports.diffDayAndTime = diffDayAndTime;
- exports.diffDays = diffDays;
- exports.diffPoints = diffPoints;
- exports.diffWeeks = diffWeeks;
- exports.diffWholeDays = diffWholeDays;
- exports.diffWholeWeeks = diffWholeWeeks;
- exports.disableCursor = disableCursor;
- exports.distributeHeight = distributeHeight;
- exports.elementClosest = elementClosest;
- exports.elementMatches = elementMatches;
- exports.enableCursor = enableCursor;
- exports.eventTupleToStore = eventTupleToStore;
- exports.filterEventStoreDefs = filterEventStoreDefs;
- exports.filterHash = filterHash;
- exports.findChildren = findChildren;
- exports.findElements = findElements;
- exports.flexibleCompare = flexibleCompare;
- exports.forceClassName = forceClassName;
- exports.formatDate = formatDate;
- exports.formatIsoTimeString = formatIsoTimeString;
- exports.formatRange = formatRange;
- exports.getAllDayHtml = getAllDayHtml;
- exports.getClippingParents = getClippingParents;
- exports.getDayClasses = getDayClasses;
- exports.getElSeg = getElSeg;
- exports.getRectCenter = getRectCenter;
- exports.getRelevantEvents = getRelevantEvents;
- exports.globalDefaults = globalDefaults;
- exports.greatestDurationDenominator = greatestDurationDenominator;
- exports.hasBgRendering = hasBgRendering;
- exports.htmlEscape = htmlEscape;
- exports.htmlToElement = htmlToElement;
- exports.insertAfterElement = insertAfterElement;
- exports.interactionSettingsStore = interactionSettingsStore;
- exports.interactionSettingsToStore = interactionSettingsToStore;
- exports.intersectRanges = intersectRanges;
- exports.intersectRects = intersectRects;
- exports.isArraysEqual = isArraysEqual;
- exports.isDateSpansEqual = isDateSpansEqual;
- exports.isInt = isInt;
- exports.isInteractionValid = isInteractionValid;
- exports.isMultiDayRange = isMultiDayRange;
- exports.isPropsEqual = isPropsEqual;
- exports.isPropsValid = isPropsValid;
- exports.isSingleDay = isSingleDay;
- exports.isValidDate = isValidDate;
- exports.listenBySelector = listenBySelector;
- exports.mapHash = mapHash;
- exports.matchCellWidths = matchCellWidths;
- exports.memoize = memoize;
- exports.memoizeOutput = memoizeOutput;
- exports.memoizeRendering = memoizeRendering;
- exports.mergeEventStores = mergeEventStores;
- exports.multiplyDuration = multiplyDuration;
- exports.padStart = padStart;
- exports.parseBusinessHours = parseBusinessHours;
- exports.parseDragMeta = parseDragMeta;
- exports.parseEventDef = parseEventDef;
- exports.parseFieldSpecs = parseFieldSpecs;
- exports.parseMarker = parse;
- exports.pointInsideRect = pointInsideRect;
- exports.prependToElement = prependToElement;
- exports.preventContextMenu = preventContextMenu;
- exports.preventDefault = preventDefault;
- exports.preventSelection = preventSelection;
- exports.processScopedUiProps = processScopedUiProps;
- exports.rangeContainsMarker = rangeContainsMarker;
- exports.rangeContainsRange = rangeContainsRange;
- exports.rangesEqual = rangesEqual;
- exports.rangesIntersect = rangesIntersect;
- exports.refineProps = refineProps;
- exports.removeElement = removeElement;
- exports.removeExact = removeExact;
- exports.renderDateCell = renderDateCell;
- exports.requestJson = requestJson;
- exports.sliceEventStore = sliceEventStore;
- exports.startOfDay = startOfDay;
- exports.subtractInnerElHeight = subtractInnerElHeight;
- exports.translateRect = translateRect;
- exports.uncompensateScroll = uncompensateScroll;
- exports.undistributeHeight = undistributeHeight;
- exports.unpromisify = unpromisify;
- exports.version = version;
- exports.whenTransitionDone = whenTransitionDone;
- exports.wholeDivideDurations = wholeDivideDurations;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/core/main.min.css b/library/fullcalendar/packages/core/main.min.css
deleted file mode 100644
index 8948b534b..000000000
--- a/library/fullcalendar/packages/core/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}} \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/main.min.js b/library/fullcalendar/packages/core/main.min.js
deleted file mode 100644
index 8745717dd..000000000
--- a/library/fullcalendar/packages/core/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Core Package v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FullCalendar={})}(this,(function(e){"use strict";var t={className:!0,colSpan:!0,rowSpan:!0},n={"<tr":"tbody","<td":"tr"};function r(e,n,r){var i=document.createElement(e);if(n)for(var o in n)"style"===o?y(i,n[o]):t[o]?i[o]=n[o]:i.setAttribute(o,n[o]);return"string"==typeof r?i.innerHTML=r:null!=r&&s(i,r),i}function i(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.firstChild}function o(e){return Array.prototype.slice.call(function(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.childNodes}(e))}function a(e){return n[e.substr(0,3)]||"div"}function s(e,t){for(var n=l(t),r=0;r<n.length;r++)e.appendChild(n[r])}function u(e,t){for(var n=l(t),r=e.firstChild||null,i=0;i<n.length;i++)e.insertBefore(n[i],r)}function l(e){return"string"==typeof e?o(e):e instanceof Node?[e]:Array.prototype.slice.call(e)}function c(e){e.parentNode&&e.parentNode.removeChild(e)}var d=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector,f=Element.prototype.closest||function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(h(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null};function p(e,t){return f.call(e,t)}function h(e,t){return d.call(e,t)}function v(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].querySelectorAll(t),a=0;a<o.length;a++)r.push(o[a]);return r}var g=/(top|left|right|bottom|width|height)$/i;function y(e,t){for(var n in t)m(e,n,t[n])}function m(e,t,n){null==n?e.style[t]="":"number"==typeof n&&g.test(t)?e.style[t]=n+"px":e.style[t]=n}function E(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}var S=null;function b(){return null===S&&(S=function(){var e=r("div",{style:{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}},"<div></div>");document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),t}()),S}function D(e){return e=Math.max(0,e),e=Math.round(e)}function T(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=D(e.offsetWidth-e.clientWidth-r-i),u={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:D(e.offsetHeight-e.clientHeight-o-a),scrollbarLeft:0,scrollbarRight:0};return b()&&"rtl"===n.direction?u.scrollbarLeft=s:u.scrollbarRight=s,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function w(e,t){void 0===t&&(t=!1);var n=R(e),r=T(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function R(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function C(e){return e.getBoundingClientRect().height+I(e)}function I(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function M(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function k(e){e.preventDefault()}function _(e,t,n,r){function i(e){var t=p(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}var O=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];var P=["sun","mon","tue","wed","thu","fri","sat"];function x(e,t){var n=Z(e);return n[2]+=t,j(n)}function N(e,t){var n=Z(e);return n[6]+=t,j(n)}function H(e,t){return(t.valueOf()-e.valueOf())/864e5}function U(e,t){var n=B(e),r=B(t);return{years:0,months:0,days:Math.round(H(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function z(e,t){var n=L(e,t);return null!==n&&n%7==0?n/7:null}function L(e,t){return q(e)===q(t)?Math.round(H(e,t)):null}function B(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function V(e,t,n,r){var i=j([t,0,1+A(t,n,r)]),o=B(e),a=Math.round(H(i,o));return Math.floor(a/7)+1}function A(e,t,n){var r=7+t-n;return-((7+j([e,0,r]).getUTCDay()-t)%7)+r-1}function F(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function W(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Z(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function j(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Y(e){return!isNaN(e.valueOf())}function q(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}var G=["years","months","days","milliseconds"],X=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function J(e,t){var n;return"string"==typeof e?function(e){var t=X.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?K(e):"number"==typeof e?K(((n={})[t||"milliseconds"]=e,n)):null}function K(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*Q(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function Q(e){return e.weeks||e.week||0}function $(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function ee(e){return te(e)/864e5}function te(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ne(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function re(e){e.forEach((function(e){e.style.height=""}))}function ie(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t++)"string"==typeof(n=i[t])?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function oe(e,t,n){var r,i;for(r=0;r<n.length;r++)if(i=ae(e,t,n[r]))return i;return 0}function ae(e,t,n){return n.func?n.func(e,t):se(e[n.field],t[n.field])*(n.order||1)}function se(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function ce(e){return e%1==0}function de(e,t,n){if("function"==typeof e&&(e=[e]),e){var r=void 0,i=void 0;for(r=0;r<e.length;r++)i=e[r].apply(t,n)||i;return i}}function fe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=0;n<e.length;n++)if(void 0!==e[n])return e[n]}function pe(e,t){var n,r,i,o,a,s=function(){var u=(new Date).valueOf()-o;u<t?n=setTimeout(s,t-u):(n=null,a=e.apply(i,r),i=r=null)};return function(){return i=this,r=arguments,o=(new Date).valueOf(),n||(n=setTimeout(s,t)),a}}function he(e,t,n,r){void 0===n&&(n={});var i={};for(var o in t){var a=t[o];void 0!==e[o]?i[o]=a===Function?"function"==typeof e[o]?e[o]:null:a?a(e[o]):e[o]:void 0!==n[o]?i[o]=n[o]:a===String?i[o]="":a&&a!==Number&&a!==Boolean&&a!==Function?i[o]=a(null):i[o]=null}if(r)for(var o in e)void 0===t[o]&&(r[o]=e[o]);return i}function ve(e){var t=Math.floor(H(e.start,e.end))||1,n=B(e.start);return{start:n,end:x(n,t)}}function ge(e,t){void 0===t&&(t=J(0));var n=null,r=null;if(e.end){r=B(e.end);var i=e.end.valueOf()-r.valueOf();i&&i>=te(t)&&(r=x(r,1))}return e.start&&(n=B(e.start),r&&r<=n&&(r=x(n,1))),{start:n,end:r}}function ye(e,t,n,r){return"year"===r?J(n.diffWholeYears(e,t),"year"):"month"===r?J(n.diffWholeMonths(e,t),"month"):U(e,t)}var me=function(e,t){return(me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Ee(e,t){function n(){this.constructor=e}me(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Se=function(){return(Se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function be(e,t,n,r,i){var o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map(B)),o}var De=Object.prototype.hasOwnProperty;function Te(e,t){var n,r,i,o,a,s,u={};if(t)for(n=0;n<t.length;n++){for(r=t[n],i=[],o=e.length-1;o>=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=Te(i))}for(n=e.length-1;n>=0;n--)for(r in s=e[n])r in u||(u[r]=s[r]);return u}function we(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Re(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Ce(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function Ie(e){var t=[];for(var n in e)t.push(e[n]);return t}function Me(e,t){for(var n in e)if(De.call(e,n)&&!(n in t))return!1;for(var n in t)if(De.call(t,n)&&e[n]!==t[n])return!1;return!0}function ke(e,t,n,r){for(var i={defs:{},instances:{}},o=0,a=e;o<a.length;o++){var s=Zt(a[o],t,n,r);s&&_e(s,i)}return i}function _e(e,t){return void 0===t&&(t={defs:{},instances:{}}),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Oe(e,t,n){var r=n.dateEnv,i=e.defs,o=e.instances;for(var a in o=we(o,(function(e){return!i[e.defId].recurringDef})),i){var s=i[a];if(s.recurringDef){var u=s.recurringDef.duration;u||(u=s.allDay?n.defaultAllDayEventDuration:n.defaultTimedEventDuration);for(var l=0,c=be(s,u,t,n.dateEnv,n.pluginSystem.hooks.recurringTypes);l<c.length;l++){var d=c[l],f=Yt(a,{start:d,end:r.add(d,u)});o[f.instanceId]=f}}}return{defs:i,instances:o}}function Pe(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],i=Ue(e,(function(e){return t=r,n=e,Boolean(t.groupId&&t.groupId===n.groupId);var t,n}));return i.defs[r.defId]=r,i.instances[n.instanceId]=n,i}return{defs:{},instances:{}}}function xe(e,t){var n;if(t){n=[];for(var r=0,i=e;r<i.length;r++){var o=i[r],a=t(o);a?n.push(a):null==a&&n.push(o)}}else n=e;return n}function Ne(){return{defs:{},instances:{}}}function He(e,t){return{defs:Se({},e.defs,t.defs),instances:Se({},e.instances,t.instances)}}function Ue(e,t){var n=we(e.defs,t),r=we(e.instances,(function(e){return n[e.defId]}));return{defs:n,instances:r}}function ze(e,t){var n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}function Le(e,t){var n,r,i=[],o=t.start;for(e.sort(Be),n=0;n<e.length;n++)(r=e[n]).start>o&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return o<t.end&&i.push({start:o,end:t.end}),i}function Be(e,t){return e.start.valueOf()-t.start.valueOf()}function Ve(e,t){var n=e.start,r=e.end,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function Ae(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function Fe(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function We(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Ze(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function je(e,t){var n,r=e.length;if(r!==t.length)return!1;for(n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function Ye(e){var t,n;return function(){return t&&je(t,arguments)||(t=arguments,n=e.apply(this,arguments)),n}}function qe(e,t){var n=null;return function(){var r=e.apply(this,arguments);return(null===n||n!==r&&!t(n,r))&&(n=r),n}}var Ge={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Xe={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Je=/\s*([ap])\.?m\.?/i,Ke=/,/g,Qe=/\s+/g,$e=/\u200e/g,et=/UTC|GMT/,tt=function(){function e(e){var t={},n={},r=0;for(var i in e)i in Ge?(n[i]=e[i],r=Math.max(Ge[i],r)):(t[i]=e[i],i in Xe&&(r=Math.max(Xe[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Ye(nt)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n){var r=this.standardDateProps,i=this.extendedSettings,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(q(e)!==q(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);var a=o;!(a>1)||"numeric"!==r.year&&"2-digit"!==r.year||"numeric"!==r.month&&"2-digit"!==r.month||"numeric"!==r.day&&"2-digit"!==r.day||(a=1);var s=this.format(e,n),u=this.format(t,n);if(s===u)return s;var l=nt(function(e,t){var n={};for(var r in e)(!(r in Xe)||Xe[r]<=t)&&(n[r]=e[r]);return n}(r,a),i,n),c=l(e),d=l(t),f=function(e,t,n,r){var i=0;for(;i<e.length;){var o=e.indexOf(t,i);if(-1===o)break;var a=e.substr(0,o);i=o+t.length;for(var s=e.substr(i),u=0;u<n.length;){var l=n.indexOf(r,u);if(-1===l)break;var c=n.substr(0,l);u=l+r.length;var d=n.substr(u);if(a===c&&s===d)return{before:a,after:s}}}return null}(s,c,u,d),p=i.separator||"";return f?f.before+c+p+d+f.after:s+p+u},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";default:return"day"}},e}();function nt(e,t,n){var r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?function(e){return at(e.timeZoneOffset)}:0===r&&t.week?function(e){return function(e,t,n,r){var i=[];"narrow"===r?i.push(t):"short"===r&&i.push(t," ");i.push(n.simpleNumberFormat.format(e)),n.options.isRtl&&i.reverse();return i.join("")}(n.computeWeekNumber(e.marker),n.weekLabel,n.locale,t.week)}:function(e,t,n){e=Se({},e),t=Se({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";var r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var o=Se({},e);delete o.minute,r=new Intl.DateTimeFormat(n.locale.codes,o)}return function(o){var a=o.marker;return function(e,t,n,r,i){e=e.replace($e,""),"short"===n.timeZoneName&&(e=function(e,t){var n=!1;e=e.replace(et,(function(){return n=!0,t})),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":at(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Ke,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Je,"").trim():"narrow"===r.meridiem?e=e.replace(Je,(function(e,t){return t.toLocaleLowerCase()})):"short"===r.meridiem?e=e.replace(Je,(function(e,t){return t.toLocaleLowerCase()+"m"})):"lowercase"===r.meridiem&&(e=e.replace(Je,(function(e){return e.toLocaleLowerCase()})));return e=(e=e.replace(Qe," ")).trim()}((r&&!a.getUTCMinutes()?r:i).format(a),o,e,t,n)}}(e,t,n)}var rt=function(){function e(e,t){this.cmdStr=e,this.separator=t}return e.prototype.format=function(e,t){return t.cmdFormatter(this.cmdStr,st(e,null,t,this.separator))},e.prototype.formatRange=function(e,t,n){return n.cmdFormatter(this.cmdStr,st(e,t,n,this.separator))},e}(),it=function(){function e(e){this.func=e}return e.prototype.format=function(e,t){return this.func(st(e,null,t))},e.prototype.formatRange=function(e,t,n){return this.func(st(e,t,n))},e}();function ot(e,t){return"object"==typeof e&&e?("string"==typeof t&&(e=Se({separator:t},e)),new tt(e)):"string"==typeof e?new rt(e,t):"function"==typeof e?new it(e):void 0}function at(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?n+le(i,2)+":"+le(o,2):"GMT"+n+i+(o?":"+le(o,2):"")}function st(e,t,n,r){var i=ut(e,n.calendarSystem);return{date:i,start:i,end:t?ut(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,separator:r}}function ut(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}var lt=function(){function e(e,t){this.calendar=e,this.internalEventSource=t}return e.prototype.remove=function(){this.calendar.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.calendar.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId]})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!0,configurable:!0}),e}(),ct=function(){function e(e,t,n){this._calendar=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in Ft);else if(e in At)"function"==typeof At[e]&&(t=At[e](t)),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in Ht){var i=void 0;"function"==typeof Ht[e]&&(t=Ht[e](t)),"color"===e?i={backgroundColor:t,borderColor:t}:"editable"===e?i={startEditable:t,durationEditable:t}:((r={})[e]=t,i=r),this.mutate({standardProps:{ui:i}})}},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._calendar.dateEnv,r=n.createMarker(e);if(r&&this._instance){var i=ye(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:i}):this.mutate({startDelta:i})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._calendar.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var i=ye(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:i})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,i=this._calendar.dateEnv,o={allDay:n.allDay},a=i.createMarker(e);if(a&&(null==t||(r=i.createMarker(t)))&&this._instance){var s=this._instance.range;!0===n.allDay&&(s=ve(s));var u=ye(s.start,a,i,n.granularity);if(r){var l=ye(s.end,r,i,n.granularity);$(u,l)?this.mutate({datesDelta:u,standardProps:o}):this.mutate({startDelta:u,endDelta:l,standardProps:o})}else o.hasEnd=!1,this.mutate({datesDelta:u,standardProps:o})}},e.prototype.moveStart=function(e){var t=J(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=J(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=J(e);t&&this.mutate({datesDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._calendar.opt("allDayMaintainDuration")),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._calendar.dateEnv,n=this._instance,r=ot(e,this._calendar.opt("defaultRangeSeparator"));return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(e){var t=this._def,n=this._instance;if(n){this._calendar.dispatch({type:"MUTATE_EVENTS",instanceId:n.instanceId,mutation:e,fromApi:!0});var r=this._calendar.state.eventStore;this._def=r.defs[t.defId],this._instance=r.instances[n.instanceId]}},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_EVENT_DEF",defId:this._def.defId})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new lt(this._calendar,this._calendar.state.eventSources[e]):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._calendar.dateEnv.toDate(this._instance.range.start):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._calendar.dateEnv.toDate(this._instance.range.end):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rendering",{get:function(){return this._def.rendering},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!0,configurable:!0}),e}();function dt(e,t,n,r){var i={},o={},a={},s=[],u=[],l=vt(e.defs,t);for(var c in e.defs){"inverse-background"===(S=e.defs[c]).rendering&&(S.groupId?(i[S.groupId]=[],a[S.groupId]||(a[S.groupId]=S)):o[c]=[])}for(var d in e.instances){var f=e.instances[d],p=l[(S=e.defs[f.defId]).defId],h=f.range,v=!S.allDay&&r?ge(h,r):h,g=Ve(v,n);g&&("inverse-background"===S.rendering?S.groupId?i[S.groupId].push(g):o[f.defId].push(g):("background"===S.rendering?s:u).push({def:S,ui:p,instance:f,range:g,isStart:v.start&&v.start.valueOf()===g.start.valueOf(),isEnd:v.end&&v.end.valueOf()===g.end.valueOf()}))}for(var y in i)for(var m=0,E=Le(i[y],n);m<E.length;m++){var S,b=E[m];p=l[(S=a[y]).defId];s.push({def:S,ui:p,instance:null,range:b,isStart:!1,isEnd:!1})}for(var c in o)for(var D=0,T=Le(o[c],n);D<T.length;D++){b=T[D];s.push({def:e.defs[c],ui:l[c],instance:null,range:b,isStart:!1,isEnd:!1})}return{bg:s,fg:u}}function ft(e,t,n){var r=e.calendar,i=e.view;r.hasPublicHandlers("eventRender")&&(t=t.filter((function(e){var t=r.publiclyTrigger("eventRender",[{event:new ct(r,e.eventRange.def,e.eventRange.instance),isMirror:n,isStart:e.isStart,isEnd:e.isEnd,el:e.el,view:i}]);return!1!==t&&(t&&!0!==t&&(e.el=t),!0)})));for(var o=0,a=t;o<a.length;o++){var s=a[o];pt(s.el,s)}return t}function pt(e,t){e.fcSeg=t}function ht(e){return e.fcSeg||null}function vt(e,t){return Re(e,(function(e){return gt(e,t)}))}function gt(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Bt(n)}function yt(e,t,n){var r=e.calendar,i=e.view;if(r.hasPublicHandlers("eventPositioned"))for(var o=0,a=t;o<a.length;o++){var s=a[o];r.publiclyTriggerAfterSizing("eventPositioned",[{event:new ct(r,s.eventRange.def,s.eventRange.instance),isMirror:n,isStart:s.isStart,isEnd:s.isEnd,el:s.el,view:i}])}r.state.eventSourceLoadingLevel||(r.afterSizingTriggers._eventsPositioned=[null])}function mt(e,t,n){for(var r=e.calendar,i=e.view,o=0,a=t;o<a.length;o++){var s=a[o];r.trigger("eventElRemove",s.el)}if(r.hasPublicHandlers("eventDestroy"))for(var u=0,l=t;u<l.length;u++){s=l[u];r.publiclyTrigger("eventDestroy",[{event:new ct(r,s.eventRange.def,s.eventRange.instance),isMirror:n,el:s.el,view:i}])}}function Et(e,t,n,r){var i=vt(e.defs,t),o={defs:{},instances:{}};for(var a in e.defs){var s=e.defs[a];o.defs[a]=St(s,i[a],n,r.pluginSystem.hooks.eventDefMutationAppliers,r)}for(var u in e.instances){var l=e.instances[u];s=o.defs[l.defId];o.instances[u]=bt(l,s,i[l.defId],n,r)}return o}function St(e,t,n,r,i){var o=n.standardProps||{};null==o.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(o.hasEnd=!0);var a=Se({},e,o,{ui:Se({},e.ui,o.ui)});n.extendedProps&&(a.extendedProps=Se({},a.extendedProps,n.extendedProps));for(var s=0,u=r;s<u.length;s++){(0,u[s])(a,n,i)}return!a.hasEnd&&i.opt("forceEventDuration")&&(a.hasEnd=!0),a}function bt(e,t,n,r,i){var o=i.dateEnv,a=r.standardProps&&!0===r.standardProps.allDay,s=r.standardProps&&!1===r.standardProps.hasEnd,u=Se({},e);return a&&(u.range=ve(u.range)),r.datesDelta&&n.startEditable&&(u.range={start:o.add(u.range.start,r.datesDelta),end:o.add(u.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(u.range={start:o.add(u.range.start,r.startDelta),end:u.range.end}),r.endDelta&&n.durationEditable&&(u.range={start:u.range.start,end:o.add(u.range.end,r.endDelta)}),s&&(u.range={start:u.range.start,end:i.getDefaultEventEnd(t.allDay,u.range.start)}),t.allDay&&(u.range={start:B(u.range.start),end:B(u.range.end)}),u.range.end<u.range.start&&(u.range.end=i.getDefaultEventEnd(t.allDay,u.range.start)),u}function Dt(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,o){if(t&&n===t.latestFetchId){var a=ke(function(e,t,n){var r=n.opt("eventDataTransform"),i=t?t.eventDataTransform:null;return i&&(e=xe(e,i)),r&&(e=xe(e,r)),e}(i,t,o),t.sourceId,o);return r&&(a=Oe(a,r,o)),He(Tt(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Oe(t,n,r));return He(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"MERGE_EVENTS":return He(e,t.eventStore);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return r?Oe(e,r.activeRange,i):e;case"CHANGE_TIMEZONE":return function(e,t,n){var r=e.defs,i=Re(e.instances,(function(e){var i=r[e.defId];return i.allDay||i.recurringDef?e:Se({},e,{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})}));return{defs:r,instances:i}}(e,t.oldDateEnv,i.dateEnv);case"MUTATE_EVENTS":return function(e,t,n,r,i){var o=Pe(e,t),a=r?{"":{startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}}:i.eventUiBases;return o=Et(o,a,n,i),He(e,o)}(e,t.instanceId,t.mutation,t.fromApi,i);case"REMOVE_EVENT_INSTANCES":return wt(e,t.instances);case"REMOVE_EVENT_DEF":return Ue(e,(function(e){return e.defId!==t.defId}));case"REMOVE_EVENT_SOURCE":return Tt(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return Ue(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};case"RESET_EVENTS":return{defs:e.defs,instances:e.instances};default:return e}}function Tt(e,t){return Ue(e,(function(e){return e.sourceId!==t}))}function wt(e,t){return{defs:e.defs,instances:we(e.instances,(function(e){return!t[e.instanceId]}))}}function Rt(e,t){return Ct({eventDrag:e},t)}function Ct(e,t){var n=t.view,r=Se({businessHours:n?n.props.businessHours:{defs:{},instances:{}},dateSelection:"",eventStore:t.state.eventStore,eventUiBases:t.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginSystem.hooks.isPropsValid||It)(r,t)}function It(e,t,n,r){return void 0===n&&(n={}),!(e.eventDrag&&!function(e,t,n,r){var i=e.eventDrag,o=i.mutatedEvents,a=o.defs,s=o.instances,u=vt(a,i.isEvent?e.eventUiBases:{"":t.selectionConfig});r&&(u=Re(u,r));var l=wt(e.eventStore,i.affectedEvents.instances),c=l.defs,d=l.instances,f=vt(c,e.eventUiBases);for(var p in s){var h=s[p],v=h.range,g=u[h.defId],y=a[h.defId];if(!Mt(g.constraints,v,l,e.businessHours,t))return!1;var m=t.opt("eventOverlap");for(var E in"function"!=typeof m&&(m=null),d){var S=d[E];if(Fe(v,S.range)){if(!1===f[S.defId].overlap&&i.isEvent)return!1;if(!1===g.overlap)return!1;if(m&&!m(new ct(t,c[S.defId],S),new ct(t,y,h)))return!1}}for(var b=t.state.eventStore,D=0,T=g.allows;D<T.length;D++){var w=T[D],R=Se({},n,{range:h.range,allDay:y.allDay}),C=b.defs[y.defId],I=b.instances[p],M=void 0;if(M=C?new ct(t,C,I):new ct(t,y),!w(t.buildDateSpanApi(R),M))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){var i=e.eventStore,o=i.defs,a=i.instances,s=e.dateSelection,u=s.range,l=t.selectionConfig;r&&(l=r(l));if(!Mt(l.constraints,u,i,e.businessHours,t))return!1;var c=t.opt("selectOverlap");"function"!=typeof c&&(c=null);for(var d in a){var f=a[d];if(Fe(u,f.range)){if(!1===l.overlap)return!1;if(c&&!c(new ct(t,o[f.defId],f)))return!1}}for(var p=0,h=l.allows;p<h.length;p++){var v=h[p],g=Se({},n,s);if(!v(t.buildDateSpanApi(g),null))return!1}return!0}(e,t,n,r))}function Mt(e,t,n,r,i){for(var o=0,a=e;o<a.length;o++){if(!Ot(kt(a[o],t,n,r,i),t))return!1}return!0}function kt(e,t,n,r,i){return"businessHours"===e?_t(Oe(r,t,i)):"string"==typeof e?_t(Ue(n,(function(t){return t.groupId===e}))):"object"==typeof e&&e?_t(Oe(e,t,i)):[]}function _t(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function Ot(e,t){for(var n=0,r=e;n<r.length;n++){if(We(r[n],t))return!0}return!1}function Pt(e){return(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function xt(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function Nt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var Ht={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Nt,classNames:Nt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Ut(e,t,n){var r=he(e,Ht,{},n),i=function(e,t){return Array.isArray(e)?ke(e,"",t,!0):"object"==typeof e&&e?ke([e],"",t,!0):null!=e?String(e):null}(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function zt(e,t,n,r){var i={},o={};for(var a in Ht){var s=e+ue(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return Ut(i,n)}var Lt={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Bt(e){return e.reduce(Vt,Lt)}function Vt(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var At={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},Ft={start:null,date:null,end:null,allDay:null},Wt=0;function Zt(e,t,n,r){var i=function(e,t){var n=null;if(e){var r=t.state.eventSources[e];n=r.allDayDefault}null==n&&(n=t.opt("allDayDefault"));return n}(t,n),o={},a=function(e,t,n,r,i){for(var o=0;o<r.length;o++){var a={},s=r[o].parse(e,a,n);if(s){var u=a.allDay;return delete a.allDay,null==u&&null==(u=t)&&null==(u=s.allDayGuess)&&(u=!1),Se(i,a),{allDay:u,duration:s.duration,typeData:s.typeData,typeId:o}}}return null}(e,i,n.dateEnv,n.pluginSystem.hooks.recurringTypes,o);if(a)return(s=jt(o,t,a.allDay,Boolean(a.duration),n)).recurringDef={typeId:a.typeId,typeData:a.typeData,duration:a.duration},{def:s,instance:null};var s,u={},l=function(e,t,n,r,i){var o,a,s=function(e,t){var n=he(e,Ft,{},t);return n.start=null!==n.start?n.start:n.date,delete n.date,n}(e,r),u=s.allDay,l=null,c=!1,d=null;if(o=n.dateEnv.createMarkerMeta(s.start))l=o.marker;else if(!i)return null;null!=s.end&&(a=n.dateEnv.createMarkerMeta(s.end));null==u&&(u=null!=t?t:(!o||o.isTimeUnspecified)&&(!a||a.isTimeUnspecified));u&&l&&(l=B(l));a&&(d=a.marker,u&&(d=B(d)),l&&d<=l&&(d=null));d?c=!0:i||(c=n.opt("forceEventDuration")||!1,d=n.dateEnv.add(l,u?n.defaultAllDayEventDuration:n.defaultTimedEventDuration));return{allDay:u,hasEnd:c,range:{start:l,end:d},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:a?a.forcedTzo:null}}(e,i,n,u,r);return l?{def:s=jt(u,t,l.allDay,l.hasEnd,n),instance:Yt(s.defId,l.range,l.forcedStartTzo,l.forcedEndTzo)}:null}function jt(e,t,n,r,i){var o={},a=function(e,t,n){var r={},i=he(e,At,{},r),o=Ut(r,t,n);return i.publicId=i.id,delete i.id,i.ui=o,i}(e,i,o);a.defId=String(Wt++),a.sourceId=t,a.allDay=n,a.hasEnd=r;for(var s=0,u=i.pluginSystem.hooks.eventDefParsers;s<u.length;s++){var l={};(0,u[s])(a,o,l),o=l}return a.extendedProps=Se(o,a.extendedProps||{}),Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}function Yt(e,t,n,r){return{instanceId:String(Wt++),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}var qt={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],rendering:"inverse-background",classNames:"fc-nonbusiness",groupId:"_businessHours"};function Gt(e,t){return ke(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return Se({},qt,e)}))}(e),"",t)}function Xt(e,t,n){void 0===n&&(n=[]);var r,i,o=[];function a(){if(i){for(var e=0,n=o;e<n.length;e++){n[e].unrender()}t&&t.apply(r,i),i=null}}function s(){i&&je(i,arguments)||(a(),r=this,i=arguments,e.apply(this,arguments))}s.dependents=o,s.unrender=a;for(var u=0,l=n;u<l.length;u++){l[u].dependents.push(s)}return s}var Jt={defs:{},instances:{}},Kt=function(){function e(){this.getKeysForEventDefs=Ye(this._getKeysForEventDefs),this.splitDateSelection=Ye(this._splitDateSpan),this.splitEventStore=Ye(this._splitEventStore),this.splitIndividualUi=Ye(this._splitIndividualUi),this.splitEventDrag=Ye(this._splitInteraction),this.splitEventResize=Ye(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),i=this.splitDateSelection(e.dateSelection),o=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),u=this.splitEventResize(e.eventResize),l={};for(var c in this.eventUiBuilders=Re(n,(function(e,n){return t.eventUiBuilders[n]||Ye(Qt)})),n){var d=n[c],f=a[c]||Jt,p=this.eventUiBuilders[c];l[c]={businessHours:d.businessHours||e.businessHours,dateSelection:i[c]||null,eventStore:f,eventUiBases:p(e.eventUiBases[""],d.ui,o[c]),eventSelection:f.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:u[c]||null}}return l},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);n<r.length;n++){t[r[n]]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return Re(e.defs,(function(e){return t.getKeysForEventDef(e)}))},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,i={};for(var o in n)for(var a=0,s=t[o];a<s.length;a++){i[f=s[a]]||(i[f]={defs:{},instances:{}}),i[f].defs[o]=n[o]}for(var u in r)for(var l=r[u],c=0,d=t[l.defId];c<d.length;c++){var f;i[f=d[c]]&&(i[f].instances[u]=l)}return i},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var i=0,o=t[r];i<o.length;i++){var a=o[i];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=function(r){t[r]||(t[r]={affectedEvents:n[r]||Jt,mutatedEvents:i[r]||Jt,isEvent:e.isEvent,origSeg:e.origSeg})};for(var a in n)o(a);for(var a in i)o(a)}return t},e}();function Qt(e,t,n){var r=[];e&&r.push(e),t&&r.push(t);var i={"":Bt(r)};return n&&Se(i,n),i}function $t(e,t,n,r,i){var o,a,s,u;return n instanceof Date?o=n:(o=n.date,a=n.type,s=n.forceOff),u={date:t.formatIso(o,{omitTime:!0}),type:a||"day"},"string"==typeof r&&(i=r,r=null),r=r?" "+function(e){var t=[];for(var n in e){var r=e[n];null!=r&&t.push(n+'="'+Pt(r)+'"')}return t.join(" ")}(r):"",i=i||"",!s&&e.navLinks?"<a"+r+' data-goto="'+Pt(JSON.stringify(u))+'">'+i+"</a>":"<span"+r+">"+i+"</span>"}function en(e,t,n,r){var i,o,a=n.calendar,s=n.options,u=n.theme,l=n.dateEnv,c=[];return Ze(t.activeRange,e)?(c.push("fc-"+P[e.getUTCDay()]),s.monthMode&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),o=x(i=B(a.getNow()),1),e<i?c.push("fc-past"):e>=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function tn(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}var nn=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach((function(n){e[n]||(e[n]=t.prototype[n])}))},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach((function(n){e.prototype[n]=t.prototype[n]}))},e}(),rn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.on=function(e,t){return on(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return on(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&an(this._handlers,e,t),this._oneHandlers&&an(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return this.triggerWith(e,this,t),this},t.prototype.triggerWith=function(e,t,n){return this._handlers&&de(this._handlers[e],t,n),this._oneHandlers&&(de(this._oneHandlers[e],t,n),delete this._oneHandlers[e]),this},t.prototype.hasHandlers=function(e){return this._handlers&&this._handlers[e]&&this._handlers[e].length||this._oneHandlers&&this._oneHandlers[e]&&this._oneHandlers[e].length},t}(nn);function on(e,t,n){(e[t]||(e[t]=[])).push(n)}function an(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}var sn=function(){function e(e,t,n,r){this.originEl=e,this.els=t,this.isHorizontal=n,this.isVertical=r}return e.prototype.build=function(){var e=this.originEl,t=this.originClientRect=e.getBoundingClientRect();this.isHorizontal&&this.buildElHorizontals(t.left),this.isVertical&&this.buildElVerticals(t.top)},e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.left-e),n.push(o.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.top-e),n.push(o.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),un=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),ln=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return Ee(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}(un),cn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}(un),dn=function(e){function t(t,n){var i=e.call(this,r("div",{className:"fc-scroller"}))||this;return i.overflowX=t,i.overflowY=n,i.applyOverflow(),i}return Ee(t,e),t.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},t.prototype.destroy=function(){c(this.el)},t.prototype.applyOverflow=function(){y(this.el,{overflowX:this.overflowX,overflowY:this.overflowY})},t.prototype.lockOverflow=function(e){var t=this.overflowX,n=this.overflowY;e=e||this.getScrollbarWidths(),"auto"===t&&(t=e.bottom||this.canScrollHorizontally()?"scroll":"hidden"),"auto"===n&&(n=e.left||e.right||this.canScrollVertically()?"scroll":"hidden"),y(this.el,{overflowX:t,overflowY:n})},t.prototype.setHeight=function(e){m(this.el,"height",e)},t.prototype.getScrollbarWidths=function(){var e=T(this.el);return{left:e.scrollbarLeft,right:e.scrollbarRight,bottom:e.scrollbarBottom}},t}(ln),fn=function(){function e(e){this.calendarOptions=e,this.processIconOverride()}return e.prototype.processIconOverride=function(){this.iconOverrideOption&&this.setIconOverride(this.calendarOptions[this.iconOverrideOption])},e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){for(n in t=Se({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e){var t=this.iconClasses[e];return t?this.baseIconClass+" "+t:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();fn.prototype.classes={},fn.prototype.iconClasses={},fn.prototype.baseIconClass="",fn.prototype.iconOverridePrefix="";var pn=0,hn=function(){function e(e,t,n,r,i){this.calendar=e,this.theme=t,this.dateEnv=n,this.options=r,this.view=i,this.isRtl="rtl"===r.dir,this.eventOrderSpecs=ie(r.eventOrder),this.nextDayThreshold=J(r.nextDayThreshold)}return e.prototype.extend=function(t,n){return new e(this.calendar,this.theme,this.dateEnv,t||this.options,n||this.view)},e}(),vn=function(){function e(){this.everRendered=!1,this.uid=String(pn++)}return e.addEqualityFuncs=function(e){this.prototype.equalityFuncs=Se({},this.prototype.equalityFuncs,e)},e.prototype.receiveProps=function(e,t){this.receiveContext(t);var n=function(e,t,n){var r={},i=!1;for(var o in t)o in e&&(e[o]===t[o]||n[o]&&n[o](e[o],t[o]))?r[o]=e[o]:(r[o]=t[o],i=!0);for(var o in e)if(!(o in t)){i=!0;break}return{anyChanges:i,comboProps:r}}(this.props||{},e,this.equalityFuncs),r=n.anyChanges,i=n.comboProps;this.props=i,r&&(this.everRendered&&this.beforeUpdate(),this.render(i,t),this.everRendered&&this.afterUpdate()),this.everRendered=!0},e.prototype.receiveContext=function(e){var t=this.context;this.context=e,t||this.firstContext(e)},e.prototype.render=function(e,t){},e.prototype.firstContext=function(e){},e.prototype.beforeUpdate=function(){},e.prototype.afterUpdate=function(){},e.prototype.destroy=function(){},e}();vn.prototype.equalityFuncs={};var gn=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),c(this.el)},t.prototype.buildPositionCaches=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isInteractionValid=function(e){var t=this.context.calendar,n=this.props.dateProfile,r=e.mutatedEvents.instances;if(n)for(var i in r)if(!We(n.validRange,r[i].range))return!1;return Rt(e,t)},t.prototype.isDateSelectionValid=function(e){var t=this.context.calendar,n=this.props.dateProfile;return!(n&&!We(n.validRange,e.range))&&function(e,t){return Ct({dateSelection:e},t)}(e,t)},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!p(e,".fc-mirror")&&(this.isPopover()||!this.isInPopover(e))},t.prototype.isValidDateDownEl=function(e){var t=p(e,this.fgSegSelector);return(!t||t.classList.contains("fc-mirror"))&&!p(e,".fc-more")&&!p(e,"a[data-goto]")&&!this.isInPopover(e)},t.prototype.isPopover=function(){return this.el.classList.contains("fc-popover")},t.prototype.isInPopover=function(e){return Boolean(p(e,".fc-popover"))},t}(vn);gn.prototype.fgSegSelector=".fc-event-container > *",gn.prototype.bgSegSelector=".fc-bgevent:not(.fc-nonbusiness)";var yn=0;function mn(e){return{id:String(yn++),deps:e.deps||[],reducers:e.reducers||[],eventDefParsers:e.eventDefParsers||[],isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],eventResizeJoinTransforms:e.eventResizeJoinTransforms||[],viewContainerModifiers:e.viewContainerModifiers||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,defaultView:e.defaultView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{}}}var En=function(){function e(){this.hooks={reducers:[],eventDefParsers:[],isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerModifiers:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,defaultView:"",elementDraggingImpl:null,optionChangeHandlers:{}},this.addedHash={}}return e.prototype.add=function(e){if(!this.addedHash[e.id]){this.addedHash[e.id]=!0;for(var t=0,n=e.deps;t<n.length;t++){var r=n[t];this.add(r)}this.hooks=(i=this.hooks,o=e,{reducers:i.reducers.concat(o.reducers),eventDefParsers:i.eventDefParsers.concat(o.eventDefParsers),isDraggableTransformers:i.isDraggableTransformers.concat(o.isDraggableTransformers),eventDragMutationMassagers:i.eventDragMutationMassagers.concat(o.eventDragMutationMassagers),eventDefMutationAppliers:i.eventDefMutationAppliers.concat(o.eventDefMutationAppliers),dateSelectionTransformers:i.dateSelectionTransformers.concat(o.dateSelectionTransformers),datePointTransforms:i.datePointTransforms.concat(o.datePointTransforms),dateSpanTransforms:i.dateSpanTransforms.concat(o.dateSpanTransforms),views:Se({},i.views,o.views),viewPropsTransformers:i.viewPropsTransformers.concat(o.viewPropsTransformers),isPropsValid:o.isPropsValid||i.isPropsValid,externalDefTransforms:i.externalDefTransforms.concat(o.externalDefTransforms),eventResizeJoinTransforms:i.eventResizeJoinTransforms.concat(o.eventResizeJoinTransforms),viewContainerModifiers:i.viewContainerModifiers.concat(o.viewContainerModifiers),eventDropTransformers:i.eventDropTransformers.concat(o.eventDropTransformers),calendarInteractions:i.calendarInteractions.concat(o.calendarInteractions),componentInteractions:i.componentInteractions.concat(o.componentInteractions),themeClasses:Se({},i.themeClasses,o.themeClasses),eventSourceDefs:i.eventSourceDefs.concat(o.eventSourceDefs),cmdFormatter:o.cmdFormatter||i.cmdFormatter,recurringTypes:i.recurringTypes.concat(o.recurringTypes),namedTimeZonedImpl:o.namedTimeZonedImpl||i.namedTimeZonedImpl,defaultView:i.defaultView||o.defaultView,elementDraggingImpl:i.elementDraggingImpl||o.elementDraggingImpl,optionChangeHandlers:Se({},i.optionChangeHandlers,o.optionChangeHandlers)})}var i,o},e}();var Sn=mn({eventSourceDefs:[{ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}}]}),bn=mn({eventSourceDefs:[{parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.calendar.dateEnv;tn(e.eventSource.meta.bind(null,{start:r.toDate(e.range.start),end:r.toDate(e.range.end),startStr:r.formatIso(e.range.start),endStr:r.formatIso(e.range.end),timeZone:r.timeZone}),(function(e){t({rawEvents:e})}),n)}}]});function Dn(e,t,n,r,i){var o=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Tn(t)}(t,n):o=Tn(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function Tn(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}var wn=mn({eventSourceDefs:[{parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=function(e,t,n){var r,i,o,a,s=n.dateEnv,u={};null==(r=e.startParam)&&(r=n.opt("startParam"));null==(i=e.endParam)&&(i=n.opt("endParam"));null==(o=e.timeZoneParam)&&(o=n.opt("timeZoneParam"));a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Se(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone);return u}(r,e.range,e.calendar);Dn(r.method,r.url,i,(function(e,n){t({rawEvents:e,xhr:n})}),(function(e,t){n({message:e,xhr:t})}))}}]});var Rn=mn({recurringTypes:[{parse:function(e,t,n){var r,i,o=n.createMarker.bind(n),a=he(e,{daysOfWeek:null,startTime:J,endTime:J,startRecur:o,endRecur:o},{},t),s=!1;for(var u in a)if(null!=a[u]){s=!0;break}if(s){var l=null;return"duration"in t&&(l=J(t.duration),delete t.duration),!l&&a.startTime&&a.endTime&&(r=a.endTime,i=a.startTime,l={years:r.years-i.years,months:r.months-i.months,days:r.days-i.days,milliseconds:r.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!a.startTime&&!a.endTime),duration:l,typeData:a}}return null},expand:function(e,t,n){var r=Ve(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var i=e?Ce(e):null,o=B(n.start),a=n.end,s=[];for(;o<a;){var u=void 0;i&&!i[o.getUTCDay()]||(u=t?r.add(o,t):o,s.push(u)),o=x(o,1)}return s}(e.daysOfWeek,e.startTime,r,n):[]}}]});var Cn=mn({optionChangeHandlers:{events:function(e,t,n){In([e],t,n)},eventSources:In,plugins:function(e,t){t.addPluginInputs(e)}}});function In(e,t,n){for(var r=Ie(t.state.eventSources),i=[],o=0,a=e;o<a.length;o++){for(var s=a[o],u=!1,l=0;l<r.length;l++)if(n(r[l]._raw,s)){r.splice(l,1),u=!0;break}u||i.push(s)}for(var c=0,d=r;c<d.length;c++){var f=d[c];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:f.sourceId})}for(var p=0,h=i;p<h.length;p++){var v=h[p];t.addEventSource(v)}}var Mn={defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",columnHeader:!0,defaultView:"",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,scrollTime:"06:00:00",minTime:"00:00:00",maxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",timeGridEventMinHeight:0,themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",eventLimit:!1,eventLimitClick:"popover",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5},kn={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"}},_n=["header","footer","buttonText","buttonIcons"];var On=[Sn,bn,wn,Rn,Cn];var Pn={code:"en",week:{dow:0,doy:4},dir:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekLabel:"W",allDayText:"all-day",eventLimitText:"more",noEventsMessage:"No events to display"};function xn(e){for(var t=e.length>0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(Ie(r),e),o={en:Pn},a=0,s=i;a<s.length;a++){var u=s[a];o[u.code]=u}return{map:o,defaultCode:t}}function Nn(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){var n=[].concat(e||[]),r=function(e,t){for(var n=0;n<e.length;n++)for(var r=e[n].toLocaleLowerCase().split("-"),i=r.length;i>0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}(n,t)||Pn;return Hn(e,n,r)}(e,t):Hn(e.code,[e.code],e)}function Hn(e,t,n){var r=Te([Pn,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}var Un=function(){function e(e){this.overrides=Se({},e),this.dynamicOverrides={},this.compute()}return e.prototype.mutate=function(e,t,n){if(Object.keys(e).length||t.length){var r=n?this.dynamicOverrides:this.overrides;Se(r,e);for(var i=0,o=t;i<o.length;i++){delete r[o[i]]}this.compute()}},e.prototype.compute=function(){var e=fe(this.dynamicOverrides.locales,this.overrides.locales,Mn.locales),t=fe(this.dynamicOverrides.locale,this.overrides.locale,Mn.locale),n=xn(e),r=Nn(t||n.defaultCode,n.map).options,i="rtl"===fe(this.dynamicOverrides.dir,this.overrides.dir,r.dir)?kn:{};this.dirDefaults=i,this.localeDefaults=r,this.computed=Te([Mn,i,r,this.overrides,this.dynamicOverrides],_n)},e}(),zn={};var Ln,Bn=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return j(e)},e.prototype.markerToArray=function(e){return Z(e)},e}();Ln=Bn,zn["gregory"]=Ln;var Vn=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function An(e){var t=Vn.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(Y(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}var Fn=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new zn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekLabel=null!=e.weekLabel?e.weekLabel:e.locale.options.weekLabel,this.cmdFormatter=e.cmdFormatter}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):j(F(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=j(e)),null!==t&&Y(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=An(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=z(e,t))?{unit:"week",value:n}:null!==(n=L(e,t))?{unit:"day",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t))?{unit:"hour",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t))?{unit:"minute",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t))?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/(ee(n)/365):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/function(e){return ee(e)/30}(n):n.days&&null!==(r=L(e,t))?r/ee(n):(t.valueOf()-e.valueOf())/te(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?B(e):"hour"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):void 0},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){var r=e.getUTCFullYear(),i=V(e,r,t,n);if(i<1)return V(e,r-1,t,n);var o=V(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=N(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",at(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?j(F(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?j(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-W(Z(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Z(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?W(Z(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Z(e))*60):new Date(e.valueOf()-(t||0))},e}(),Wn={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},Zn=0;function jn(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Yn(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r].parseMeta(e);if(i){var o=qn("object"==typeof e?e:{},i,r,t);return o._raw=e,o}}return null}function qn(e,t,n,r){var i={},o=he(e,Wn,{},i),a={},s=Ut(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(Zn++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function Gn(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return function(e,t,n,r){for(var i={},o=0,a=t;o<a.length;o++){var s=a[o];i[s.sourceId]=s}n&&(i=Jn(i,n,r));return Se({},e,i)}(e,t.sources,n?n.activeRange:null,r);case"REMOVE_EVENT_SOURCE":return i=e,o=t.sourceId,we(i,(function(e){return e.sourceId!==o}));case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return n?Jn(e,n.activeRange,r):e;case"FETCH_EVENT_SOURCES":case"CHANGE_TIMEZONE":return Kn(e,t.sourceIds?Ce(t.sourceIds):function(e,t){return we(e,(function(e){return jn(e,t)}))}(e,r),n?n.activeRange:null,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){var i,o=e[t];if(o&&n===o.latestFetchId)return Se({},e,((i={})[t]=Se({},o,{isFetching:!1,fetchRange:r}),i));return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var i,o}var Xn=0;function Jn(e,t,n){return Kn(e,we(e,(function(e){return function(e,t,n){return jn(e,n)?!n.opt("lazyFetching")||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end:!e.latestFetchId}(e,t,n)})),t,n)}function Kn(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Qn(a,n,r):i[o]=a}return i}function Qn(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Xn++);return r.fetch({eventSource:e,calendar:n,range:t},(function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})}),(function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})})),Se({},e,{isFetching:!0,latestFetchId:i})}var $n=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){var r;void 0===n&&(n=!1);var i,o,a,s,u,l,c,d,f;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(f=r).start&&d<f.start?f.start:null!=f.end&&d>=f.end?new Date(f.end.valueOf()-1):d),a=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(a.unit),u=this.buildRenderRange(this.trimHiddenDays(a.range),a.unit,s),l=u=this.trimHiddenDays(u),this.options.showNonCurrentDates||(l=Ve(l,a.range)),i=J(this.options.minTime),o=J(this.options.maxTime),l=Ve(l=this.adjustActiveRange(l,i,o),r),c=Fe(a.range,r),{validRange:r,currentRange:a.range,currentRangeUnit:a.unit,isRangeAllDay:s,activeRange:l,renderRange:u,minTime:i,maxTime:o,isValid:c,dateIncrement:this.buildDateIncrement(a.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.viewSpec,i=this.dateEnv,o=null,a=null,s=null;return r.duration?(o=r.duration,a=r.durationUnit,s=this.buildRangeFromDuration(e,t,o,a)):(n=this.options.dayCount)?(a="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?a=i.greatestWholeUnit(s.start,s.end).unit:(a=ne(o=this.getFallbackDuration()).unit,s=this.buildRangeFromDuration(e,t,o,a)),{duration:o,unit:a,range:s}},e.prototype.getFallbackDuration=function(){return J({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(ee(t)<0&&(i=B(i),i=r.add(i,t)),ee(n)>1&&(o=x(o=B(o),-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var i,o,a,s,u,l=this.dateEnv,c=this.options.dateAlignment;function d(){a=l.startOf(e,c),s=l.add(a,n),u={start:a,end:s}}return c||((i=this.options.dateIncrement)?(o=J(i),c=te(o)<te(n)?ne(o,!Q(i)).unit:r):c=r),ee(n)<=1&&this.isHiddenDay(a)&&(a=B(a=this.skipHiddenDays(a,t))),d(),this.trimHiddenDays(u)||(e=this.skipHiddenDays(e,t),d()),u},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,i=this.dateEnv,o=this.options.dateAlignment,a=0,s=e;o&&(s=i.startOf(s,o)),s=B(s),r=s=this.skipHiddenDays(s,t);do{r=x(r,1),this.isHiddenDay(r)||a++}while(a<n);return{start:s,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.dateEnv,n=this.getRangeOption("visibleRange",t.toDate(e));return!n||null!=n.start&&null!=n.end?n:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.options.dateIncrement;return n?J(n):(t=this.options.dateAlignment)?J(1,t):e||J({days:1})},e.prototype.getRangeOption=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=this.options[e];return"function"==typeof r&&(r=r.apply(null,t)),r&&(r=ze(r,this.dateEnv)),r&&(r=ge(r)),r},e.prototype.initHiddenDays=function(){var e,t=this.options.hiddenDays||[],n=[],r=0;for(!1===this.options.weekends&&t.push(0,6),e=0;e<7;e++)(n[e]=-1!==t.indexOf(e))||r++;if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=x(e,t);return e},e}();function er(e,t,n){for(var r=function(e,t){switch(t.type){case"SET_VIEW_TYPE":return t.viewType;default:return e}}(e.viewType,t),i=function(e,t,n,r,i){var o;switch(t.type){case"PREV":o=i.dateProfileGenerators[r].buildPrev(e,n);break;case"NEXT":o=i.dateProfileGenerators[r].buildNext(e,n);break;case"SET_DATE":e.activeRange&&Ze(e.currentRange,t.dateMarker)||(o=i.dateProfileGenerators[r].build(t.dateMarker,void 0,!0));break;case"SET_VIEW_TYPE":var a=i.dateProfileGenerators[r];if(!a)throw new Error(r?'The FullCalendar view "'+r+'" does not exist. Make sure your plugins are loaded correctly.':"No available FullCalendar view plugins.");o=a.build(t.dateMarker||n,void 0,!0)}return!o||!o.isValid||e&&(s=e,u=o,Ae(s.validRange,u.validRange)&&Ae(s.activeRange,u.activeRange)&&Ae(s.renderRange,u.renderRange)&&$(s.minTime,u.minTime)&&$(s.maxTime,u.maxTime))?e:o;var s,u}(e.dateProfile,t,e.currentDate,r,n),o=Gn(e.eventSources,t,i,n),a=Se({},e,{viewType:r,dateProfile:i,currentDate:tr(e.currentDate,t,i),eventSources:o,eventStore:Dt(e.eventStore,t,o,i,n),dateSelection:nr(e.dateSelection,t,n),eventSelection:rr(e.eventSelection,t),eventDrag:ir(e.eventDrag,t,o,n),eventResize:or(e.eventResize,t,o,n),eventSourceLoadingLevel:ar(o),loadingLevel:ar(o)}),s=0,u=n.pluginSystem.hooks.reducers;s<u.length;s++){a=(0,u[s])(a,t,n)}return a}function tr(e,t,n){switch(t.type){case"PREV":case"NEXT":return Ze(n.currentRange,e)?e:n.currentRange.start;case"SET_DATE":case"SET_VIEW_TYPE":var r=t.dateMarker||e;return n.activeRange&&!Ze(n.activeRange,r)?n.currentRange.start:r;default:return e}}function nr(e,t,n){switch(t.type){case"SELECT_DATES":return t.selection;case"UNSELECT_DATES":return null;default:return e}}function rr(e,t){switch(t.type){case"SELECT_EVENT":return t.eventInstanceId;case"UNSELECT_EVENT":return"";default:return e}}function ir(e,t,n,r){switch(t.type){case"SET_EVENT_DRAG":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_DRAG":return null;default:return e}}function or(e,t,n,r){switch(t.type){case"SET_EVENT_RESIZE":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_RESIZE":return null;default:return e}}function ar(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}var sr={start:null,end:null,allDay:Boolean};function ur(e,t,n){var r=function(e,t){var n={},r=he(e,sr,{},n),i=r.start?t.createMarkerMeta(r.start):null,o=r.end?t.createMarkerMeta(r.end):null,a=r.allDay;null==a&&(a=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified));return n.range={start:i?i.marker:null,end:o?o.marker:null},n.allDay=a,n}(e,t),i=r.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function lr(e,t,n){var r=jt({editable:!1},"",e.allDay,!0,n);return{def:r,ui:gt(r,t),instance:Yt(r.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function cr(e,t,n,r){if(t[e])return t[e];var i=function(e,t,n,r){var i=n[e],o=r[e],a=function(e){return i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null},s=a("class"),u=a("superType");!u&&s&&(u=dr(s,r)||dr(s,n));var l=null;if(u){if(u===e)throw new Error("Can't have a custom view type that references itself");l=cr(u,t,n,r)}!s&&l&&(s=l.class);if(!s)return null;return{type:e,class:s,defaults:Se({},l?l.defaults:{},i?i.options:{}),overrides:Se({},l?l.overrides:{},o?o.options:{})}}(e,t,n,r);return i&&(t[e]=i),i}function dr(e,t){var n=Object.getPrototypeOf(e.prototype);for(var r in t){var i=t[r];if(i.class&&i.class.prototype===n)return r}return""}function fr(e){return Re(e,hr)}var pr={type:String,class:null};function hr(e){"function"==typeof e&&(e={class:e});var t={},n=he(e,pr,{},t);return{superType:n.type,class:n.class,options:t}}function vr(e,t){var n=fr(e),r=fr(t.overrides.views);return Re(function(e,t){var n,r={};for(n in e)cr(n,r,e,t);for(n in t)cr(n,r,e,t);return r}(n,r),(function(e){return function(e,t,n){var r=e.overrides.duration||e.defaults.duration||n.dynamicOverrides.duration||n.overrides.duration,i=null,o="",a="",s={};if(r&&(i=J(r))){var u=ne(i,!Q(r));o=u.unit,1===u.value&&(a=o,s=t[o]?t[o].options:{})}var l=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[a]?n[a]:void 0};return{type:e.type,class:e.class,duration:i,durationUnit:o,singleUnit:a,options:Se({},Mn,e.defaults,n.dirDefaults,n.localeDefaults,n.overrides,s,e.overrides,n.dynamicOverrides),buttonTextOverride:l(n.dynamicOverrides)||l(n.overrides)||e.overrides.buttonText,buttonTextDefault:l(n.localeDefaults)||l(n.dirDefaults)||e.defaults.buttonText||l(Mn)||e.type}}(e,r,t)}))}var gr=function(e){function t(t){var n=e.call(this)||this;return n._renderLayout=Xt(n.renderLayout,n.unrenderLayout),n._updateTitle=Xt(n.updateTitle,null,[n._renderLayout]),n._updateActiveButton=Xt(n.updateActiveButton,null,[n._renderLayout]),n._updateToday=Xt(n.updateToday,null,[n._renderLayout]),n._updatePrev=Xt(n.updatePrev,null,[n._renderLayout]),n._updateNext=Xt(n.updateNext,null,[n._renderLayout]),n.el=r("div",{className:"fc-toolbar "+t}),n}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderLayout.unrender(),c(this.el)},t.prototype.render=function(e){this._renderLayout(e.layout),this._updateTitle(e.title),this._updateActiveButton(e.activeButton),this._updateToday(e.isTodayEnabled),this._updatePrev(e.isPrevEnabled),this._updateNext(e.isNextEnabled)},t.prototype.renderLayout=function(e){var t=this.el;this.viewsWithButtons=[],s(t,this.renderSection("left",e.left)),s(t,this.renderSection("center",e.center)),s(t,this.renderSection("right",e.right))},t.prototype.unrenderLayout=function(){this.el.innerHTML=""},t.prototype.renderSection=function(e,t){var n=this,o=this.context,a=o.theme,u=o.calendar,l=u.optionsManager,c=u.viewSpecs,d=r("div",{className:"fc-"+e}),f=l.computed.customButtons||{},p=l.overrides.buttonText||{},h=l.computed.buttonText||{};return t&&t.split(" ").forEach((function(e,t){var r,o=[],l=!0;if(e.split(",").forEach((function(e,t){var r,s,d,v,g,y,m,E,S;"title"===e?(o.push(i("<h2>&nbsp;</h2>")),l=!1):((r=f[e])?(d=function(e){r.click&&r.click.call(E,e)},(v=a.getCustomButtonIconClass(r))||(v=a.getIconClass(e))||(g=r.text)):(s=c[e])?(n.viewsWithButtons.push(e),d=function(){u.changeView(e)},(g=s.buttonTextOverride)||(v=a.getIconClass(e))||(g=s.buttonTextDefault)):u[e]&&(d=function(){u[e]()},(g=p[e])||(v=a.getIconClass(e))||(g=h[e])),d&&(m=["fc-"+e+"-button",a.getClass("button")],g?(y=Pt(g),S=""):v&&(y="<span class='"+v+"'></span>",S=' aria-label="'+e+'"'),(E=i('<button type="button" class="'+m.join(" ")+'"'+S+">"+y+"</button>")).addEventListener("click",d),o.push(E)))})),o.length>1){r=document.createElement("div");var v=a.getClass("buttonGroup");l&&v&&r.classList.add(v),s(r,o),d.appendChild(r)}else s(d,o)})),d},t.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},t.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},t.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},t.prototype.updateTitle=function(e){v(this.el,"h2").forEach((function(t){t.innerText=e}))},t.prototype.updateActiveButton=function(e){var t=this.context.theme.getClass("buttonActive");v(this.el,"button").forEach((function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)}))},t.prototype.toggleButtonEnabled=function(e,t){v(this.el,".fc-"+e+"-button").forEach((function(e){e.disabled=!t}))},t}(vn),yr=function(e){function t(t){var n=e.call(this)||this;return n.elClassNames=[],n.renderSkeleton=Xt(n._renderSkeleton,n._unrenderSkeleton),n.renderToolbars=Xt(n._renderToolbars,n._unrenderToolbars,[n.renderSkeleton]),n.buildComponentContext=Ye(Er),n.buildViewPropTransformers=Ye(Sr),n.el=t,n.computeTitle=Ye(mr),n.parseBusinessHours=Ye((function(e){return Gt(e,n.context.calendar)})),n}return Ee(t,e),t.prototype.render=function(e,t){this.freezeHeight();var n=this.computeTitle(e.dateProfile,e.viewSpec.options);this.renderSkeleton(t),this.renderToolbars(e.viewSpec,e.dateProfile,e.currentDate,n),this.renderView(e,n),this.updateSize(),this.thawHeight()},t.prototype.destroy=function(){this.header&&this.header.destroy(),this.footer&&this.footer.destroy(),this.renderSkeleton.unrender(),e.prototype.destroy.call(this)},t.prototype._renderSkeleton=function(e){this.updateElClassNames(e),u(this.el,this.contentEl=r("div",{className:"fc-view-container"}));for(var t=e.calendar,n=0,i=t.pluginSystem.hooks.viewContainerModifiers;n<i.length;n++){(0,i[n])(this.contentEl,t)}},t.prototype._unrenderSkeleton=function(){this.view&&(this.savedScroll=this.view.queryScroll(),this.view.destroy(),this.view=null),c(this.contentEl),this.removeElClassNames()},t.prototype.removeElClassNames=function(){for(var e=this.el.classList,t=0,n=this.elClassNames;t<n.length;t++){var r=n[t];e.remove(r)}this.elClassNames=[]},t.prototype.updateElClassNames=function(e){this.removeElClassNames();var t=e.theme,n=e.options;this.elClassNames=["fc","fc-"+n.dir,t.getClass("widget")];for(var r=this.el.classList,i=0,o=this.elClassNames;i<o.length;i++){var a=o[i];r.add(a)}},t.prototype._renderToolbars=function(e,t,n,r){var i=this.context,o=this.header,a=this.footer,l=i.options,c=i.calendar,d=l.header,f=l.footer,p=this.props.dateProfileGenerator,h=c.getNow(),v=p.build(h),g=p.buildPrev(t,n),y=p.buildNext(t,n),m={title:r,activeButton:e.type,isTodayEnabled:v.isValid&&!Ze(t.currentRange,h),isPrevEnabled:g.isValid,isNextEnabled:y.isValid};d?(o||(o=this.header=new gr("fc-header-toolbar"),u(this.el,o.el)),o.receiveProps(Se({layout:d},m),i)):o&&(o.destroy(),o=this.header=null),f?(a||(a=this.footer=new gr("fc-footer-toolbar"),s(this.el,a.el)),a.receiveProps(Se({layout:f},m),i)):a&&(a.destroy(),a=this.footer=null)},t.prototype._unrenderToolbars=function(){this.header&&(this.header.destroy(),this.header=null),this.footer&&(this.footer.destroy(),this.footer=null)},t.prototype.renderView=function(e,t){var n=this.view,r=this.context,i=r.calendar,o=r.options,a=e.viewSpec,s=e.dateProfileGenerator;n&&n.viewSpec===a||(n&&n.destroy(),n=this.view=new a.class(a,this.contentEl),this.savedScroll&&(n.addScroll(this.savedScroll,!0),this.savedScroll=null)),n.title=t;for(var u={dateProfileGenerator:s,dateProfile:e.dateProfile,businessHours:this.parseBusinessHours(a.options.businessHours),eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize},l=0,c=this.buildViewPropTransformers(i.pluginSystem.hooks.viewPropsTransformers);l<c.length;l++){var d=c[l];Se(u,d.transform(u,a,e,o))}n.receiveProps(u,this.buildComponentContext(this.context,a,n))},t.prototype.updateSize=function(e){void 0===e&&(e=!1);var t=this.view;t&&((e||null==this.isHeightAuto)&&this.computeHeightVars(),t.updateSize(e,this.viewHeight,this.isHeightAuto),t.updateNowIndicator(),t.popScroll(e))},t.prototype.computeHeightVars=function(){var e=this.context.calendar,t=e.opt("height"),n=e.opt("contentHeight");if(this.isHeightAuto="auto"===t||"auto"===n,"number"==typeof n)this.viewHeight=n;else if("function"==typeof n)this.viewHeight=n();else if("number"==typeof t)this.viewHeight=t-this.queryToolbarsHeight();else if("function"==typeof t)this.viewHeight=t()-this.queryToolbarsHeight();else if("parent"===t){var r=this.el.parentNode;this.viewHeight=r.getBoundingClientRect().height-this.queryToolbarsHeight()}else this.viewHeight=Math.round(this.contentEl.getBoundingClientRect().width/Math.max(e.opt("aspectRatio"),.5))},t.prototype.queryToolbarsHeight=function(){var e=0;return this.header&&(e+=C(this.header.el)),this.footer&&(e+=C(this.footer.el)),e},t.prototype.freezeHeight=function(){y(this.el,{height:this.el.getBoundingClientRect().height,overflow:"hidden"})},t.prototype.thawHeight=function(){y(this.el,{height:"",overflow:""})},t}(vn);function mr(e,t){var n;return n=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,this.context.dateEnv.formatRange(n.start,n.end,ot(t.titleFormat||function(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=L(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function Er(e,t,n){return e.extend(t.options,n)}function Sr(e){return e.map((function(e){return new e}))}var br=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();var Dr={},Tr=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=r.context,o=i.calendar,a=i.view,s=ht(t);if(s&&r.isValidSegDownEl(e.target)){var u=p(e.target,".fc-has-url"),l=u?u.querySelector("a[href]").href:"";o.publiclyTrigger("eventClick",[{el:t,event:new ct(r.context.calendar,s.eventRange.def,s.eventRange.instance),jsEvent:e,view:a}]),l&&!e.defaultPrevented&&(window.location.href=l)}};var r=t.component;return n.destroy=_(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return Ee(t,e),t}(br),wr=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){ht(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r,i,o,a,s,u=t.component;return n.removeHoverListeners=(r=u.el,i=u.fgSegSelector+","+u.bgSegSelector,o=n.handleSegEnter,a=n.handleSegLeave,_(r,"mouseover",i,(function(e,t){if(t!==s){s=t,o(e,t);var n=function(e){s=null,a(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),u.context.calendar.on("eventElRemove",n.handleEventElRemove),n}return Ee(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.context.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=r.context,o=i.calendar,a=i.view,s=ht(n);t&&!r.isValidSegDownEl(t.target)||o.publiclyTrigger(e,[{el:n,event:new ct(o,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:a}])},t}(br),Rr=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t}(fn);Rr.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},Rr.prototype.baseIconClass="fc-icon",Rr.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Rr.prototype.iconOverrideOption="buttonIcons",Rr.prototype.iconOverrideCustomButtonOption="icon",Rr.prototype.iconOverridePrefix="fc-icon-";var Cr=function(){function e(e,t){var n=this;this.buildComponentContext=Ye(Ir),this.parseRawLocales=Ye(xn),this.buildLocale=Ye(Nn),this.buildDateEnv=Ye(Mr),this.buildTheme=Ye(kr),this.buildEventUiSingleBase=Ye(this._buildEventUiSingleBase),this.buildSelectionConfig=Ye(this._buildSelectionConfig),this.buildEventUiBySource=qe(Or,Me),this.buildEventUiBases=Ye(Pr),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=Ye(_r),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new Un(t||{}),this.pluginSystem=new En,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map((function(e){return new e(n)}))}return e.prototype.addPluginInputs=function(e){for(var t=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var i=r[n];if("string"==typeof i){var o="FullCalendar"+ue(i);window[o]?t.push(window[o].default):console.warn("Plugin file not loaded for "+i)}else t.push(i)}return On.concat(t)}(e),n=0,r=t;n<r.length;n++){var i=r[n];this.pluginSystem.add(i)}},Object.defineProperty(e.prototype,"view",{get:function(){return this.component?this.component.view:null},enumerable:!0,configurable:!0}),e.prototype.render=function(){this.component?this.requestRerender():(this.component=new yr(this.el),this.renderableEventStore={defs:{},instances:{}},this.bindHandlers(),this.executeRender())},e.prototype.destroy=function(){if(this.component){this.unbindHandlers(),this.component.destroy(),this.component=null;for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.publiclyTrigger("_destroyed")}},e.prototype.bindHandlers=function(){var e=this;this.removeNavLinkListener=_(this.el,"click","a[data-goto]",(function(t,n){var r=n.getAttribute("data-goto");r=r?JSON.parse(r):{};var i=e.dateEnv,o=i.createMarker(r.date),a=r.type,s=e.viewOpt("navLink"+ue(a)+"Click");"function"==typeof s?s(i.toDate(o),t):("string"==typeof s&&(a=s),e.zoomTo(o,a))})),this.opt("handleWindowResize")&&window.addEventListener("resize",this.windowResizeProxy=pe(this.windowResize.bind(this),this.opt("windowResizeDelay")))},e.prototype.unbindHandlers=function(){this.removeNavLinkListener(),this.windowResizeProxy&&(window.removeEventListener("resize",this.windowResizeProxy),this.windowResizeProxy=null)},e.prototype.hydrate=function(){var e=this;this.state=this.buildInitialState();var t=this.opt("eventSources")||[],n=this.opt("events"),r=[];n&&t.unshift(n);for(var i=0,o=t;i<o.length;i++){var a=Yn(o[i],this);a&&r.push(a)}this.batchRendering((function(){e.dispatch({type:"INIT"}),e.dispatch({type:"ADD_EVENT_SOURCES",sources:r}),e.dispatch({type:"SET_VIEW_TYPE",viewType:e.opt("defaultView")||e.pluginSystem.hooks.defaultView})}))},e.prototype.buildInitialState=function(){return{viewType:null,loadingLevel:0,eventSourceLoadingLevel:0,currentDate:this.getInitialDate(),dateProfile:null,eventSources:{},eventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null}},e.prototype.dispatch=function(e){if(this.actionQueue.push(e),!this.isReducing){this.isReducing=!0;for(var t=this.state;this.actionQueue.length;)this.state=this.reduce(this.state,this.actionQueue.shift(),this);var n=this.state;this.isReducing=!1,!t.loadingLevel&&n.loadingLevel?this.publiclyTrigger("loading",[!0]):t.loadingLevel&&!n.loadingLevel&&this.publiclyTrigger("loading",[!1]);var r=this.component&&this.component.view;t.eventStore!==n.eventStore&&t.eventStore&&(this.isEventsUpdated=!0),t.dateProfile!==n.dateProfile&&(t.dateProfile&&r&&this.publiclyTrigger("datesDestroy",[{view:r,el:r.el}]),this.isDatesUpdated=!0),t.viewType!==n.viewType&&(t.viewType&&r&&this.publiclyTrigger("viewSkeletonDestroy",[{view:r,el:r.el}]),this.isViewUpdated=!0),this.requestRerender()}},e.prototype.reduce=function(e,t,n){return er(e,t,n)},e.prototype.requestRerender=function(){this.needsRerender=!0,this.delayedRerender()},e.prototype.tryRerender=function(){this.component&&this.needsRerender&&!this.renderingPauseDepth&&!this.isRendering&&this.executeRender()},e.prototype.batchRendering=function(e){this.renderingPauseDepth++,e(),this.renderingPauseDepth--,this.needsRerender&&this.requestRerender()},e.prototype.executeRender=function(){this.needsRerender=!1,this.isRendering=!0,this.renderComponent(),this.isRendering=!1,this.needsRerender&&this.delayedRerender()},e.prototype.renderComponent=function(){var e=this.state,t=this.component,n=e.viewType,r=this.viewSpecs[n];if(!r)throw new Error('View type "'+n+'" is not valid');var i=this.renderableEventStore=e.eventSourceLoadingLevel&&!this.opt("progressiveEventRendering")?this.renderableEventStore:e.eventStore,o=this.buildEventUiSingleBase(r.options),a=this.buildEventUiBySource(e.eventSources),s=this.eventUiBases=this.buildEventUiBases(i.defs,o,a);t.receiveProps(Se({},e,{viewSpec:r,dateProfileGenerator:this.dateProfileGenerators[n],dateProfile:e.dateProfile,eventStore:i,eventUiBases:s,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize}),this.buildComponentContext(this.theme,this.dateEnv,this.optionsManager.computed)),this.isViewUpdated&&(this.isViewUpdated=!1,this.publiclyTrigger("viewSkeletonRender",[{view:t.view,el:t.view.el}])),this.isDatesUpdated&&(this.isDatesUpdated=!1,this.publiclyTrigger("datesRender",[{view:t.view,el:t.view.el}])),this.isEventsUpdated&&(this.isEventsUpdated=!1),this.releaseAfterSizingTriggers()},e.prototype.setOption=function(e,t){var n;this.mutateOptions(((n={})[e]=t,n),[],!0)},e.prototype.getOption=function(e){return this.optionsManager.computed[e]},e.prototype.opt=function(e){return this.optionsManager.computed[e]},e.prototype.viewOpt=function(e){return this.viewOpts()[e]},e.prototype.viewOpts=function(){return this.viewSpecs[this.state.viewType].options},e.prototype.mutateOptions=function(e,t,n,r){var i=this,o=this.pluginSystem.hooks.optionChangeHandlers,a={},s={},u=this.dateEnv,l=!1,c=!1,d=Boolean(t.length);for(var f in e)o[f]?s[f]=e[f]:a[f]=e[f];for(var p in a)/^(height|contentHeight|aspectRatio)$/.test(p)?c=!0:/^(defaultDate|defaultView)$/.test(p)||(d=!0,"timeZone"===p&&(l=!0));this.optionsManager.mutate(a,t,n),d&&this.handleOptions(this.optionsManager.computed),this.batchRendering((function(){if(d?(l&&i.dispatch({type:"CHANGE_TIMEZONE",oldDateEnv:u}),i.dispatch({type:"SET_VIEW_TYPE",viewType:i.state.viewType})):c&&i.updateSize(),r)for(var e in s)o[e](s[e],i,r)}))},e.prototype.handleOptions=function(e){var t=this,n=this.pluginSystem.hooks;this.defaultAllDayEventDuration=J(e.defaultAllDayEventDuration),this.defaultTimedEventDuration=J(e.defaultTimedEventDuration),this.delayedRerender=this.buildDelayedRerender(e.rerenderDelay),this.theme=this.buildTheme(e);var r=this.parseRawLocales(e.locales);this.availableRawLocales=r.map;var i=this.buildLocale(e.locale||r.defaultCode,r.map);this.dateEnv=this.buildDateEnv(i,e.timeZone,n.namedTimeZonedImpl,e.firstDay,e.weekNumberCalculation,e.weekLabel,n.cmdFormatter),this.selectionConfig=this.buildSelectionConfig(e),this.viewSpecs=vr(n.views,this.optionsManager),this.dateProfileGenerators=Re(this.viewSpecs,(function(e){return new e.class.prototype.dateProfileGeneratorClass(e,t)}))},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.availableRawLocales)},e.prototype._buildSelectionConfig=function(e){return zt("select",e,this)},e.prototype._buildEventUiSingleBase=function(e){return e.editable&&(e=Se({},e,{eventEditable:!0})),zt("event",e,this)},e.prototype.hasPublicHandlers=function(e){return this.hasHandlers(e)||this.opt(e)},e.prototype.publiclyTrigger=function(e,t){var n=this.opt(e);if(this.triggerWith(e,this,t),n)return n.apply(this,t)},e.prototype.publiclyTriggerAfterSizing=function(e,t){var n=this.afterSizingTriggers;(n[e]||(n[e]=[])).push(t)},e.prototype.releaseAfterSizingTriggers=function(){var e=this.afterSizingTriggers;for(var t in e)for(var n=0,r=e[t];n<r.length;n++){var i=r[n];this.publiclyTrigger(t,i)}this.afterSizingTriggers={}},e.prototype.isValidViewType=function(e){return Boolean(this.viewSpecs[e])},e.prototype.changeView=function(e,t){var n=null;t&&(t.start&&t.end?(this.optionsManager.mutate({visibleRange:t},[]),this.handleOptions(this.optionsManager.computed)):n=this.dateEnv.createMarker(t)),this.unselect(),this.dispatch({type:"SET_VIEW_TYPE",viewType:e,dateMarker:n})},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"SET_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"SET_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.component,i=[];for(var o in r.header&&i.push.apply(i,r.header.viewsWithButtons),r.footer&&i.push.apply(i,r.footer.viewsWithButtons),this.viewSpecs)i.push(o);for(t=0;t<i.length;t++)if((n=this.viewSpecs[i[t]])&&n.singleUnit===e)return n},e.prototype.getInitialDate=function(){var e=this.opt("defaultDate");return null!=e?this.dateEnv.createMarker(e):this.getNow()},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,-1)})},e.prototype.nextYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,1)})},e.prototype.today=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.getNow()})},e.prototype.gotoDate=function(e){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=J(e);t&&(this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.add(this.state.currentDate,t)}))},e.prototype.getDate=function(){return this.dateEnv.toDate(this.state.currentDate)},e.prototype.formatDate=function(e,t){var n=this.dateEnv;return n.format(n.createMarker(e),ot(t))},e.prototype.formatRange=function(e,t,n){var r=this.dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),ot(n,this.opt("defaultRangeSeparator")),n)},e.prototype.formatIso=function(e,t){var n=this.dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.windowResize=function(e){!this.isHandlingWindowResize&&this.component&&e.target===window&&(this.isHandlingWindowResize=!0,this.updateSize(),this.publiclyTrigger("windowResize",[this.view]),this.isHandlingWindowResize=!1)},e.prototype.updateSize=function(){this.component&&this.component.updateSize(!0)},e.prototype.registerInteractiveComponent=function(e,t){var n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter}}(e,t),r=[Tr,wr].concat(this.pluginSystem.hooks.componentInteractions).map((function(e){return new e(n)}));this.interactionsStore[e.uid]=r,Dr[e.uid]=n},e.prototype.unregisterInteractiveComponent=function(e){for(var t=0,n=this.interactionsStore[e.uid];t<n.length;t++){n[t].destroy()}delete this.interactionsStore[e.uid],delete Dr[e.uid]},e.prototype.select=function(e,t){var n=ur(null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t},this.dateEnv,J({days:1}));n&&(this.dispatch({type:"SELECT_DATES",selection:n}),this.triggerDateSelect(n))},e.prototype.unselect=function(e){this.state.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),this.triggerDateUnselect(e))},e.prototype.triggerDateSelect=function(e,t){var n=Se({},this.buildDateSpanApi(e),{jsEvent:t?t.origEvent:null,view:this.view});this.publiclyTrigger("select",[n])},e.prototype.triggerDateUnselect=function(e){this.publiclyTrigger("unselect",[{jsEvent:e?e.origEvent:null,view:this.view}])},e.prototype.triggerDateClick=function(e,t,n,r){var i=Se({},this.buildDatePointApi(e),{dayEl:t,jsEvent:r,view:n});this.publiclyTrigger("dateClick",[i])},e.prototype.buildDatePointApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.datePointTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{date:(n=this.dateEnv).toDate(t.range.start),dateStr:n.formatIso(t.range.start,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.buildDateSpanApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.dateSpanTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{start:(n=this.dateEnv).toDate(t.range.start),end:n.toDate(t.range.end),startStr:n.formatIso(t.range.start,{omitTime:t.allDay}),endStr:n.formatIso(t.range.end,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.getNow=function(){var e=this.opt("now");return"function"==typeof e&&(e=e()),null==e?this.dateEnv.createNowMarker():this.dateEnv.createMarker(e)},e.prototype.getDefaultEventEnd=function(e,t){var n=t;return e?(n=B(n),n=this.dateEnv.add(n,this.defaultAllDayEventDuration)):n=this.dateEnv.add(n,this.defaultTimedEventDuration),n},e.prototype.addEvent=function(e,t){if(e instanceof ct){var n=e._def,r=e._instance;return this.state.eventStore.defs[n.defId]||this.dispatch({type:"ADD_EVENTS",eventStore:_e({def:n,instance:r})}),e}var i;if(t instanceof lt)i=t.internalEventSource.sourceId;else if(null!=t){var o=this.getEventSourceById(t);if(!o)return console.warn('Could not find an event source with ID "'+t+'"'),null;i=o.internalEventSource.sourceId}var a=Zt(e,i,this);return a?(this.dispatch({type:"ADD_EVENTS",eventStore:_e(a)}),new ct(this,a.def,a.def.recurringDef?null:a.instance)):null},e.prototype.getEventById=function(e){var t=this.state.eventStore,n=t.defs,r=t.instances;for(var i in e=String(e),n){var o=n[i];if(o.publicId===e){if(o.recurringDef)return new ct(this,o,null);for(var a in r){var s=r[a];if(s.defId===o.defId)return new ct(this,o,s)}}}return null},e.prototype.getEvents=function(){var e=this.state.eventStore,t=e.defs,n=e.instances,r=[];for(var i in n){var o=n[i],a=t[o.defId];r.push(new ct(this,a,o))}return r},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.rerenderEvents=function(){this.dispatch({type:"RESET_EVENTS"})},e.prototype.getEventSources=function(){var e=this.state.eventSources,t=[];for(var n in e)t.push(new lt(this,e[n]));return t},e.prototype.getEventSourceById=function(e){var t=this.state.eventSources;for(var n in e=String(e),t)if(t[n].publicId===e)return new lt(this,t[n]);return null},e.prototype.addEventSource=function(e){if(e instanceof lt)return this.state.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var t=Yn(e,this);return t?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[t]}),new lt(this,t)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES"})},e.prototype.scrollToTime=function(e){var t=J(e);t&&this.component.view.scrollToDuration(t)},e}();function Ir(e,t,n){return new hn(this,e,t,n,null)}function Mr(e,t,n,r,i,o,a){return new Fn({calendarSystem:"gregory",timeZone:t,namedTimeZoneImpl:n,locale:e,weekNumberCalculation:i,firstDay:r,weekLabel:o,cmdFormatter:a})}function kr(e){return new(this.pluginSystem.hooks.themeClasses[e.themeSystem]||Rr)(e)}function _r(e){var t=this.tryRerender.bind(this);return null!=e&&(t=pe(t,e)),t}function Or(e){return Re(e,(function(e){return e.ui}))}function Pr(e,t,n){var r={"":t};for(var i in e){var o=e[i];o.sourceId&&n[o.sourceId]&&(r[i]=n[o.sourceId])}return r}rn.mixInto(Cr);var xr=function(e){function t(t,n){var i=e.call(this,r("div",{className:"fc-view fc-"+t.type+"-view"}))||this;return i.renderDatesMem=Xt(i.renderDatesWrap,i.unrenderDatesWrap),i.renderBusinessHoursMem=Xt(i.renderBusinessHours,i.unrenderBusinessHours,[i.renderDatesMem]),i.renderDateSelectionMem=Xt(i.renderDateSelectionWrap,i.unrenderDateSelectionWrap,[i.renderDatesMem]),i.renderEventsMem=Xt(i.renderEvents,i.unrenderEvents,[i.renderDatesMem]),i.renderEventSelectionMem=Xt(i.renderEventSelectionWrap,i.unrenderEventSelectionWrap,[i.renderEventsMem]),i.renderEventDragMem=Xt(i.renderEventDragWrap,i.unrenderEventDragWrap,[i.renderDatesMem]),i.renderEventResizeMem=Xt(i.renderEventResizeWrap,i.unrenderEventResizeWrap,[i.renderDatesMem]),i.viewSpec=t,i.type=t.type,n.appendChild(i.el),i.initialize(),i}return Ee(t,e),t.prototype.initialize=function(){},Object.defineProperty(t.prototype,"activeStart",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeEnd",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.activeRange.end)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentStart",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentEnd",{get:function(){return this.context.dateEnv.toDate(this.props.dateProfile.currentRange.end)},enumerable:!0,configurable:!0}),t.prototype.render=function(e,t){this.renderDatesMem(e.dateProfile),this.renderBusinessHoursMem(e.businessHours),this.renderDateSelectionMem(e.dateSelection),this.renderEventsMem(e.eventStore),this.renderEventSelectionMem(e.eventSelection),this.renderEventDragMem(e.eventDrag),this.renderEventResizeMem(e.eventResize)},t.prototype.beforeUpdate=function(){this.addScroll(this.queryScroll())},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderDatesMem.unrender()},t.prototype.updateSize=function(e,t,n){var r=this.context.calendar;e&&this.addScroll(this.queryScroll()),(e||r.isViewUpdated||r.isDatesUpdated||r.isEventsUpdated)&&this.updateBaseSize(e,t,n)},t.prototype.updateBaseSize=function(e,t,n){},t.prototype.renderDatesWrap=function(e){this.renderDates(e),this.addScroll({duration:J(this.context.options.scrollTime)})},t.prototype.unrenderDatesWrap=function(){this.stopNowIndicator(),this.unrenderDates()},t.prototype.renderDates=function(e){},t.prototype.unrenderDates=function(){},t.prototype.renderBusinessHours=function(e){},t.prototype.unrenderBusinessHours=function(){},t.prototype.renderDateSelectionWrap=function(e){e&&this.renderDateSelection(e)},t.prototype.unrenderDateSelectionWrap=function(e){e&&this.unrenderDateSelection(e)},t.prototype.renderDateSelection=function(e){},t.prototype.unrenderDateSelection=function(e){},t.prototype.renderEvents=function(e){},t.prototype.unrenderEvents=function(){},t.prototype.sliceEvents=function(e,t){var n=this.props;return dt(e,n.eventUiBases,n.dateProfile.activeRange,t?this.context.nextDayThreshold:null).fg},t.prototype.renderEventSelectionWrap=function(e){e&&this.renderEventSelection(e)},t.prototype.unrenderEventSelectionWrap=function(e){e&&this.unrenderEventSelection(e)},t.prototype.renderEventSelection=function(e){},t.prototype.unrenderEventSelection=function(e){},t.prototype.renderEventDragWrap=function(e){e&&this.renderEventDrag(e)},t.prototype.unrenderEventDragWrap=function(e){e&&this.unrenderEventDrag(e)},t.prototype.renderEventDrag=function(e){},t.prototype.unrenderEventDrag=function(e){},t.prototype.renderEventResizeWrap=function(e){e&&this.renderEventResize(e)},t.prototype.unrenderEventResizeWrap=function(e){e&&this.unrenderEventResize(e)},t.prototype.renderEventResize=function(e){},t.prototype.unrenderEventResize=function(e){},t.prototype.startNowIndicator=function(e,t){var n,r,i,o=this,a=this.context,s=a.calendar,u=a.dateEnv;a.options.nowIndicator&&!this.initialNowDate&&(n=this.getNowIndicatorUnit(e,t))&&(r=this.updateNowIndicator.bind(this),this.initialNowDate=s.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),i=u.add(u.startOf(this.initialNowDate,n),J(1,n)).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout((function(){o.nowIndicatorTimeoutID=null,r(),i="second"===n?1e3:6e4,o.nowIndicatorIntervalID=setInterval(r,i)}),i))},t.prototype.updateNowIndicator=function(){this.props.dateProfile&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(N(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},t.prototype.stopNowIndicator=function(){this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},t.prototype.getNowIndicatorUnit=function(e,t){},t.prototype.renderNowIndicator=function(e){},t.prototype.unrenderNowIndicator=function(){},t.prototype.addScroll=function(e,t){t&&(e.isForced=t),Se(this.queuedScroll||(this.queuedScroll={}),e)},t.prototype.popScroll=function(e){this.applyQueuedScroll(e),this.queuedScroll=null},t.prototype.applyQueuedScroll=function(e){this.queuedScroll&&this.applyScroll(this.queuedScroll,e)},t.prototype.queryScroll=function(){var e={};return this.props.dateProfile&&Se(e,this.queryDateScroll()),e},t.prototype.applyScroll=function(e,t){var n=e.duration,r=e.isForced;null==n||r||(delete e.duration,this.props.dateProfile&&Se(e,this.computeDateScroll(n))),this.props.dateProfile&&this.applyDateScroll(e)},t.prototype.computeDateScroll=function(e){return{}},t.prototype.queryDateScroll=function(){return{}},t.prototype.applyDateScroll=function(e){},t.prototype.scrollToDuration=function(e){this.applyScroll({duration:e},!1)},t}(gn);rn.mixInto(xr),xr.prototype.usesMinMaxTime=!1,xr.prototype.dateProfileGeneratorClass=$n;var Nr=function(){function e(){this.segs=[],this.isSizeDirty=!1}return e.prototype.renderSegs=function(e,t,n){this.context=e,this.rangeUpdated(),t=this.renderSegEls(t,n),this.segs=t,this.attachSegs(t,n),this.isSizeDirty=!0,yt(this.context,this.segs,Boolean(n))},e.prototype.unrender=function(e,t,n){mt(this.context,this.segs,Boolean(n)),this.detachSegs(this.segs),this.segs=[]},e.prototype.rangeUpdated=function(){var e,t,n=this.context.options;this.eventTimeFormat=ot(n.eventTimeFormat||this.computeEventTimeFormat(),n.defaultRangeSeparator),null==(e=n.displayEventTime)&&(e=this.computeDisplayEventTime()),null==(t=n.displayEventEnd)&&(t=this.computeDisplayEventEnd()),this.displayEventTime=e,this.displayEventEnd=t},e.prototype.renderSegEls=function(e,t){var n,r="";if(e.length){for(n=0;n<e.length;n++)r+=this.renderSegHtml(e[n],t);o(r).forEach((function(t,n){var r=e[n];t&&(r.el=t)})),e=ft(this.context,e,Boolean(t))}return e},e.prototype.getSegClasses=function(e,t,n,r){var i=["fc-event",e.isStart?"fc-start":"fc-not-start",e.isEnd?"fc-end":"fc-not-end"].concat(e.eventRange.ui.classNames);return t&&i.push("fc-draggable"),n&&i.push("fc-resizable"),r&&(i.push("fc-mirror"),r.isDragging&&i.push("fc-dragging"),r.isResizing&&i.push("fc-resizing")),i},e.prototype.getTimeText=function(e,t,n){var r=e.def,i=e.instance;return this._getTimeText(i.range.start,r.hasEnd?i.range.end:null,r.allDay,t,n,i.forcedStartTzo,i.forcedEndTzo)},e.prototype._getTimeText=function(e,t,n,r,i,o,a){var s=this.context.dateEnv;return null==r&&(r=this.eventTimeFormat),null==i&&(i=this.displayEventEnd),this.displayEventTime&&!n?i&&t?s.formatRange(e,t,r,{forcedStartTzo:o,forcedEndTzo:a}):s.format(e,r,{forcedTzo:o}):""},e.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0}},e.prototype.computeDisplayEventTime=function(){return!0},e.prototype.computeDisplayEventEnd=function(){return!0},e.prototype.getSkinCss=function(e){return{"background-color":e.backgroundColor,"border-color":e.borderColor,color:e.textColor}},e.prototype.sortEventSegs=function(e){var t=this.context.eventOrderSpecs,n=e.map(Hr);return n.sort((function(e,n){return oe(e,n,t)})),n.map((function(e){return e._seg}))},e.prototype.computeSizes=function(e){(e||this.isSizeDirty)&&this.computeSegSizes(this.segs)},e.prototype.assignSizes=function(e){(e||this.isSizeDirty)&&(this.assignSegSizes(this.segs),this.isSizeDirty=!1)},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e.prototype.hideByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="hidden")}},e.prototype.showByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="")}},e.prototype.selectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t],i=r.eventRange.instance;i&&i.instanceId===e&&r.el&&r.el.classList.add("fc-selected")}},e.prototype.unselectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];r.el&&r.el.classList.remove("fc-selected")}},e}();function Hr(e){var t=e.eventRange.def,n=e.eventRange.instance.range,r=n.start?n.start.valueOf():0,i=n.end?n.end.valueOf():0;return Se({},t.extendedProps,t,{id:t.publicId,start:r,end:i,duration:i-r,allDay:Number(t.allDay),_seg:e})}var Ur=function(){function e(){this.fillSegTag="div",this.dirtySizeFlags={},this.containerElsByType={},this.segsByType={}}return e.prototype.getSegsByType=function(e){return this.segsByType[e]||[]},e.prototype.renderSegs=function(e,t,n){var r;this.context=t;var i=this.renderSegEls(e,n),o=this.attachSegs(e,i);o&&(r=this.containerElsByType[e]||(this.containerElsByType[e]=[])).push.apply(r,o),this.segsByType[e]=i,"bgEvent"===e&&yt(t,i,!1),this.dirtySizeFlags[e]=!0},e.prototype.unrender=function(e,t){var n=this.segsByType[e];n&&("bgEvent"===e&&mt(t,n,!1),this.detachSegs(e,n))},e.prototype.renderSegEls=function(e,t){var n,r=this,i="";if(t.length){for(n=0;n<t.length;n++)i+=this.renderSegHtml(e,t[n]);o(i).forEach((function(e,n){var r=t[n];e&&(r.el=e)})),"bgEvent"===e&&(t=ft(this.context,t,!1)),t=t.filter((function(e){return h(e.el,r.fillSegTag)}))}return t},e.prototype.renderSegHtml=function(e,t){var n=null,r=[];return"highlight"!==e&&"businessHours"!==e&&(n={"background-color":t.eventRange.ui.backgroundColor}),"highlight"!==e&&(r=r.concat(t.eventRange.ui.classNames)),"businessHours"===e?r.push("fc-bgevent"):r.push("fc-"+e.toLowerCase()),"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(n?' style="'+xt(n)+'"':"")+"></"+this.fillSegTag+">"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),zr=function(e){this.timeZoneName=e},Lr=function(){function e(e){this.emitter=new rn}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}();function Br(e){var t=Nn(e.locale||"en",xn([]).map);return e=Se({timeZone:Mn.timeZone,calendarSystem:"gregory"},e,{locale:t}),new Fn(e)}var Vr={startTime:J,duration:J,create:Boolean,sourceId:String},Ar={create:!0};function Fr(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function Wr(e,t,n,r,i,o,a,s){var u,l=o.dateEnv,c=o.theme,d=o.options,f=Ze(t.activeRange,e),p=["fc-day-header",c.getClass("widgetHeader")];return u="function"==typeof d.columnHeaderHtml?d.columnHeaderHtml(l.toDate(e)):"function"==typeof d.columnHeaderText?Pt(d.columnHeaderText(l.toDate(e))):Pt(l.format(e,i)),n?p=p.concat(en(e,t,o,!0)):p.push("fc-"+P[e.getUTCDay()]),'<th class="'+p.join(" ")+'"'+(f&&n?' data-date="'+l.formatIso(e,{omitTime:!0})+'"':"")+(a>1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(f?$t(d,l,{date:e,forceOff:!n||1===r},u):u)+"</th>"}var Zr=function(e){function t(t){var n=e.call(this)||this;return n.renderSkeleton=Xt(n._renderSkeleton,n._unrenderSkeleton),n.parentEl=t,n}return Ee(t,e),t.prototype.render=function(e,t){var n=e.dates,r=e.datesRepDistinctDays,i=[];this.renderSkeleton(t),e.renderIntroHtml&&i.push(e.renderIntroHtml());for(var o=ot(t.options.columnHeaderFormat||Fr(r,n.length)),a=0,s=n;a<s.length;a++){var u=s[a];i.push(Wr(u,e.dateProfile,r,n.length,o,t))}t.isRtl&&i.reverse(),this.thead.innerHTML="<tr>"+i.join("")+"</tr>"},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSkeleton.unrender()},t.prototype._renderSkeleton=function(e){var t=e.theme,n=this.parentEl;n.innerHTML="",n.appendChild(this.el=i('<div class="fc-row '+t.getClass("headerRow")+'"><table class="'+t.getClass("tableGrid")+'"><thead></thead></table></div>')),this.thead=this.el.querySelector("thead")},t.prototype._unrenderSkeleton=function(){c(this.el)},t}(vn),jr=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n<r;)t.isHiddenDay(n)?i.push(a+.5):(a++,i.push(a),o.push(n)),n=x(n,1);this.dates=o,this.indices=i,this.cnt=o.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(x(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return(r=Math.ceil(r))<=(i=Math.floor(i))?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(H(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),Yr=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n<o.length&&o[n].getUTCDay()!==r;n++);i=Math.ceil(o.length/n)}else i=1,n=o.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t++){for(var n=[],r=0;r<this.colCnt;r++)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){return{date:this.daySeries.dates[e*this.colCnt+t]}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t++)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var i=n.firstIndex,o=n.lastIndex,a=i;a<=o;){var s=Math.floor(a/t),u=Math.min((s+1)*t,o+1);r.push({row:s,firstCol:a%t,lastCol:(u-1)%t,isStart:n.isStart&&a===i,isEnd:n.isEnd&&u-1===o}),a=u}return r},e}(),qr=function(){function e(){this.sliceBusinessHours=Ye(this._sliceBusinessHours),this.sliceDateSelection=Ye(this._sliceDateSpan),this.sliceEventStore=Ye(this._sliceEventStore),this.sliceEventDrag=Ye(this._sliceInteraction),this.sliceEventResize=Ye(this._sliceInteraction)}return e.prototype.sliceProps=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];var s=e.eventUiBases,u=this.sliceEventStore.apply(this,[e.eventStore,s,t,n,i].concat(o));return{dateSelectionSegs:this.sliceDateSelection.apply(this,[e.dateSelection,s,i].concat(o)),businessHourSegs:this.sliceBusinessHours.apply(this,[e.businessHours,t,n,r,i].concat(o)),fgEventSegs:u.fg,bgEventSegs:u.bg,eventDrag:this.sliceEventDrag.apply(this,[e.eventDrag,s,t,n,i].concat(o)),eventResize:this.sliceEventResize.apply(this,[e.eventResize,s,t,n,i].concat(o)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,[{range:{start:e,end:N(e,1)},allDay:!1},{},t].concat(n))},e.prototype._sliceBusinessHours=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];return e?this._sliceEventStore.apply(this,[Oe(e,Gr(t,Boolean(n)),r),{},t,n,i].concat(o)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(e){var s=dt(e,t,Gr(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i,o),fg:this.sliceEventRanges(s.fg,i,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(!e)return null;var s=dt(e.mutatedEvents,t,Gr(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent,sourceSeg:e.origSeg}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var o=lr(e,t,n.context.calendar),a=this.sliceRange.apply(this,[e.range].concat(r)),s=0,u=a;s<u.length;s++){var l=u[s];l.component=n,l.eventRange=o}return a},e.prototype.sliceEventRanges=function(e,t,n){for(var r=[],i=0,o=e;i<o.length;i++){var a=o[i];r.push.apply(r,this.sliceEventRange(a,t,n))}return r},e.prototype.sliceEventRange=function(e,t,n){for(var r=this.sliceRange.apply(this,[e.range].concat(n)),i=0,o=r;i<o.length;i++){var a=o[i];a.component=t,a.eventRange=e,a.isStart=e.isStart&&a.isStart,a.isEnd=e.isEnd&&a.isEnd}return r},e}();function Gr(e,t){var n=e.activeRange;return t?n:{start:N(n.start,e.minTime.milliseconds),end:N(n.end,e.maxTime.milliseconds-864e5)}}e.Calendar=Cr,e.Component=vn,e.ComponentContext=hn,e.DateComponent=gn,e.DateEnv=Fn,e.DateProfileGenerator=$n,e.DayHeader=Zr,e.DaySeries=jr,e.DayTable=Yr,e.ElementDragging=Lr,e.ElementScrollController=ln,e.EmitterMixin=rn,e.EventApi=ct,e.FgEventRenderer=Nr,e.FillRenderer=Ur,e.Interaction=br,e.Mixin=nn,e.NamedTimeZoneImpl=zr,e.PositionCache=sn,e.ScrollComponent=dn,e.ScrollController=un,e.Slicer=qr,e.Splitter=Kt,e.Theme=fn,e.View=xr,e.WindowScrollController=cn,e.addDays=x,e.addDurations=function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},e.addMs=N,e.addWeeks=function(e,t){var n=Z(e);return n[2]+=7*t,j(n)},e.allowContextMenu=function(e){e.removeEventListener("contextmenu",k)},e.allowSelection=function(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",k)},e.appendToElement=s,e.applyAll=de,e.applyMutationToEventStore=Et,e.applyStyle=y,e.applyStyleProp=m,e.asRoughMinutes=function(e){return te(e)/6e4},e.asRoughMs=te,e.asRoughSeconds=function(e){return te(e)/1e3},e.buildGotoAnchorHtml=$t,e.buildSegCompareObj=Hr,e.capitaliseFirstLetter=ue,e.combineEventUis=Bt,e.compareByFieldSpec=ae,e.compareByFieldSpecs=oe,e.compareNumbers=function(e,t){return e-t},e.compensateScroll=function(e,t){t.left&&y(e,{borderLeftWidth:1,marginLeft:t.left-1}),t.right&&y(e,{borderRightWidth:1,marginRight:t.right-1})},e.computeClippingRect=function(e){return M(e).map((function(e){return w(e)})).concat({left:window.pageXOffset,right:window.pageXOffset+document.documentElement.clientWidth,top:window.pageYOffset,bottom:window.pageYOffset+document.documentElement.clientHeight}).reduce((function(e,t){return E(e,t)||t}))},e.computeEdges=T,e.computeEventDraggable=function(e,t,n){for(var r=e.calendar,i=e.view,o=r.pluginSystem.hooks.isDraggableTransformers,a=n.startEditable,s=0,u=o;s<u.length;s++){a=(0,u[s])(a,t,n,i)}return a},e.computeEventEndResizable=function(e,t,n){return n.durationEditable},e.computeEventStartResizable=function(e,t,n){return n.durationEditable&&e.options.eventResizableFromStart},e.computeFallbackHeaderFormat=Fr,e.computeHeightAndMargins=C,e.computeInnerRect=w,e.computeRect=R,e.computeVisibleDayRange=ge,e.config={},e.constrainPoint=function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},e.createDuration=J,e.createElement=r,e.createEmptyEventStore=Ne,e.createEventInstance=Yt,e.createFormatter=ot,e.createPlugin=mn,e.cssToStr=xt,e.debounce=pe,e.diffDates=ye,e.diffDayAndTime=U,e.diffDays=H,e.diffPoints=function(e,t){return{left:e.left-t.left,top:e.top-t.top}},e.diffWeeks=function(e,t){return H(e,t)/7},e.diffWholeDays=L,e.diffWholeWeeks=z,e.disableCursor=function(){document.body.classList.add("fc-not-allowed")},e.distributeHeight=function(e,t,n){var r=Math.floor(t/e.length),i=Math.floor(t-r*(e.length-1)),o=[],a=[],s=[],u=0;re(e),e.forEach((function(t,n){var l=n===e.length-1?i:r,c=t.getBoundingClientRect().height,d=c+I(t);d<l?(o.push(t),a.push(d),s.push(c)):u+=d})),n&&(t-=u,r=Math.floor(t/o.length),i=Math.floor(t-r*(o.length-1))),o.forEach((function(e,t){var n=t===o.length-1?i:r,u=a[t],l=n-(u-s[t]);u<n&&(e.style.height=l+"px")}))},e.elementClosest=p,e.elementMatches=h,e.enableCursor=function(){document.body.classList.remove("fc-not-allowed")},e.eventTupleToStore=_e,e.filterEventStoreDefs=Ue,e.filterHash=we,e.findChildren=function(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].children,a=0;a<o.length;a++){var s=o[a];t&&!h(s,t)||r.push(s)}return r},e.findElements=v,e.flexibleCompare=se,e.forceClassName=function(e,t,n){n?e.classList.add(t):e.classList.remove(t)},e.formatDate=function(e,t){void 0===t&&(t={});var n=Br(t),r=ot(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatIsoTimeString=function(e){return le(e.getUTCHours(),2)+":"+le(e.getUTCMinutes(),2)+":"+le(e.getUTCSeconds(),2)},e.formatRange=function(e,t,n){var r=Br("object"==typeof n&&n?n:{}),i=ot(n,Mn.defaultRangeSeparator),o=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return o&&a?r.formatRange(o.marker,a.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive}):""},e.getAllDayHtml=function(e){return e.allDayHtml||Pt(e.allDayText)},e.getClippingParents=M,e.getDayClasses=en,e.getElSeg=ht,e.getRectCenter=function(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}},e.getRelevantEvents=Pe,e.globalDefaults=Mn,e.greatestDurationDenominator=ne,e.hasBgRendering=function(e){return"background"===e.rendering||"inverse-background"===e.rendering},e.htmlEscape=Pt,e.htmlToElement=i,e.insertAfterElement=function(e,t){for(var n=l(t),r=e.nextSibling||null,i=0;i<n.length;i++)e.parentNode.insertBefore(n[i],r)},e.interactionSettingsStore=Dr,e.interactionSettingsToStore=function(e){var t;return(t={})[e.component.uid]=e,t},e.intersectRanges=Ve,e.intersectRects=E,e.isArraysEqual=je,e.isDateSpansEqual=function(e,t){return Ae(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)},e.isInt=ce,e.isInteractionValid=Rt,e.isMultiDayRange=function(e){var t=ge(e);return H(t.start,t.end)>1},e.isPropsEqual=Me,e.isPropsValid=It,e.isSingleDay=function(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds},e.isValidDate=Y,e.listenBySelector=_,e.mapHash=Re,e.matchCellWidths=function(e){var t=0;return e.forEach((function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.getBoundingClientRect().width;r>t&&(t=r)}})),t++,e.forEach((function(e){e.style.width=t+"px"})),t},e.memoize=Ye,e.memoizeOutput=qe,e.memoizeRendering=Xt,e.mergeEventStores=He,e.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},e.padStart=le,e.parseBusinessHours=Gt,e.parseDragMeta=function(e){var t={},n=he(e,Vr,Ar,t);return n.leftoverProps=t,n},e.parseEventDef=jt,e.parseFieldSpecs=ie,e.parseMarker=An,e.pointInsideRect=function(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom},e.prependToElement=u,e.preventContextMenu=function(e){e.addEventListener("contextmenu",k)},e.preventDefault=k,e.preventSelection=function(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",k)},e.processScopedUiProps=zt,e.rangeContainsMarker=Ze,e.rangeContainsRange=We,e.rangesEqual=Ae,e.rangesIntersect=Fe,e.refineProps=he,e.removeElement=c,e.removeExact=function(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n++):r++;return n},e.renderDateCell=Wr,e.requestJson=Dn,e.sliceEventStore=dt,e.startOfDay=B,e.subtractInnerElHeight=function(e,t){var n={position:"relative",left:-1};y(e,n),y(t,n);var r=e.getBoundingClientRect().height-t.getBoundingClientRect().height,i={position:"",left:""};return y(e,i),y(t,i),r},e.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},e.uncompensateScroll=function(e){y(e,{marginLeft:"",marginRight:"",borderLeftWidth:"",borderRightWidth:""})},e.undistributeHeight=re,e.unpromisify=tn,e.version="4.4.2",e.whenTransitionDone=function(e,t){var n=function(r){t(r),O.forEach((function(t){e.removeEventListener(t,n)}))};O.forEach((function(t){e.addEventListener(t,n)}))},e.wholeDivideDurations=function(e,t){for(var n=null,r=0;r<G.length;r++){var i=G[r];if(t[i]){var o=e[i]/t[i];if(!ce(o)||null!==n&&n!==o)return null;n=o}else if(e[i])return null}return n},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/core/package.json b/library/fullcalendar/packages/core/package.json
deleted file mode 100644
index 5040089ad..000000000
--- a/library/fullcalendar/packages/core/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "@fullcalendar/core",
- "version": "4.4.2",
- "title": "FullCalendar Core Package",
- "description": "Provides core functionality, including the Calendar class",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/initialize-es6",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/daygrid/LICENSE.txt b/library/fullcalendar/packages/daygrid/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/daygrid/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/daygrid/README.md b/library/fullcalendar/packages/daygrid/README.md
deleted file mode 100644
index e00936542..000000000
--- a/library/fullcalendar/packages/daygrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Day Grid Plugin
-
-Display events on Month view or DayGrid view
-
-[View the docs &raquo;](https://fullcalendar.io/docs/month-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/daygrid/index.global.js b/library/fullcalendar/packages/daygrid/index.global.js
new file mode 100644
index 000000000..58c6a55cf
--- /dev/null
+++ b/library/fullcalendar/packages/daygrid/index.global.js
@@ -0,0 +1,909 @@
+/*!
+FullCalendar Day Grid Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/month-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.DayGrid = (function (exports, core, internal$1, preact) {
+ 'use strict';
+
+ /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
+ ----------------------------------------------------------------------------------------------------------------------*/
+ // It is a manager for a Table subcomponent, which does most of the heavy lifting.
+ // It is responsible for managing width/height.
+ class TableView extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.headerElRef = preact.createRef();
+ }
+ renderSimpleLayout(headerRowContent, bodyContent) {
+ let { props, context } = this;
+ let sections = [];
+ let stickyHeaderDates = internal$1.getStickyHeaderDates(context.options);
+ if (headerRowContent) {
+ sections.push({
+ type: 'header',
+ key: 'header',
+ isSticky: stickyHeaderDates,
+ chunk: {
+ elRef: this.headerElRef,
+ tableClassName: 'fc-col-header',
+ rowContent: headerRowContent,
+ },
+ });
+ }
+ sections.push({
+ type: 'body',
+ key: 'body',
+ liquid: true,
+ chunk: { content: bodyContent },
+ });
+ return (preact.createElement(internal$1.ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
+ preact.createElement(internal$1.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */, sections: sections })));
+ }
+ renderHScrollLayout(headerRowContent, bodyContent, colCnt, dayMinWidth) {
+ let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
+ if (!ScrollGrid) {
+ throw new Error('No ScrollGrid implementation');
+ }
+ let { props, context } = this;
+ let stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(context.options);
+ let stickyFooterScrollbar = !props.forPrint && internal$1.getStickyFooterScrollbar(context.options);
+ let sections = [];
+ if (headerRowContent) {
+ sections.push({
+ type: 'header',
+ key: 'header',
+ isSticky: stickyHeaderDates,
+ chunks: [{
+ key: 'main',
+ elRef: this.headerElRef,
+ tableClassName: 'fc-col-header',
+ rowContent: headerRowContent,
+ }],
+ });
+ }
+ sections.push({
+ type: 'body',
+ key: 'body',
+ liquid: true,
+ chunks: [{
+ key: 'main',
+ content: bodyContent,
+ }],
+ });
+ if (stickyFooterScrollbar) {
+ sections.push({
+ type: 'footer',
+ key: 'footer',
+ isSticky: true,
+ chunks: [{
+ key: 'main',
+ content: internal$1.renderScrollShim,
+ }],
+ });
+ }
+ return (preact.createElement(internal$1.ViewContainer, { elClasses: ['fc-daygrid'], viewSpec: context.viewSpec },
+ preact.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })));
+ }
+ }
+
+ function splitSegsByRow(segs, rowCnt) {
+ let byRow = [];
+ for (let i = 0; i < rowCnt; i += 1) {
+ byRow[i] = [];
+ }
+ for (let seg of segs) {
+ byRow[seg.row].push(seg);
+ }
+ return byRow;
+ }
+ function splitSegsByFirstCol(segs, colCnt) {
+ let byCol = [];
+ for (let i = 0; i < colCnt; i += 1) {
+ byCol[i] = [];
+ }
+ for (let seg of segs) {
+ byCol[seg.firstCol].push(seg);
+ }
+ return byCol;
+ }
+ function splitInteractionByRow(ui, rowCnt) {
+ let byRow = [];
+ if (!ui) {
+ for (let i = 0; i < rowCnt; i += 1) {
+ byRow[i] = null;
+ }
+ }
+ else {
+ for (let i = 0; i < rowCnt; i += 1) {
+ byRow[i] = {
+ affectedInstances: ui.affectedInstances,
+ isEvent: ui.isEvent,
+ segs: [],
+ };
+ }
+ for (let seg of ui.segs) {
+ byRow[seg.row].segs.push(seg);
+ }
+ }
+ return byRow;
+ }
+
+ const DEFAULT_TABLE_EVENT_TIME_FORMAT = internal$1.createFormatter({
+ hour: 'numeric',
+ minute: '2-digit',
+ omitZeroMinute: true,
+ meridiem: 'narrow',
+ });
+ function hasListItemDisplay(seg) {
+ let { display } = seg.eventRange.ui;
+ return display === 'list-item' || (display === 'auto' &&
+ !seg.eventRange.def.allDay &&
+ seg.firstCol === seg.lastCol && // can't be multi-day
+ seg.isStart && // "
+ seg.isEnd // "
+ );
+ }
+
+ class TableBlockEvent extends internal$1.BaseComponent {
+ render() {
+ let { props } = this;
+ return (preact.createElement(internal$1.StandardEvent, Object.assign({}, props, { elClasses: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay })));
+ }
+ }
+
+ class TableListItemEvent extends internal$1.BaseComponent {
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let { seg } = props;
+ let timeFormat = options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT;
+ let timeText = internal$1.buildSegTimeText(seg, timeFormat, context, true, props.defaultDisplayEventEnd);
+ return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "a", elClasses: ['fc-daygrid-event', 'fc-daygrid-dot-event'], elAttrs: internal$1.getSegAnchorAttrs(props.seg, context), defaultGenerator: renderInnerContent, timeText: timeText, isResizing: false, isDateSelecting: false })));
+ }
+ }
+ function renderInnerContent(renderProps) {
+ return (preact.createElement(preact.Fragment, null,
+ preact.createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: renderProps.borderColor || renderProps.backgroundColor } }),
+ renderProps.timeText && (preact.createElement("div", { className: "fc-event-time" }, renderProps.timeText)),
+ preact.createElement("div", { className: "fc-event-title" }, renderProps.event.title || preact.createElement(preact.Fragment, null, "\u00A0"))));
+ }
+
+ class TableCellMoreLink extends internal$1.BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.compileSegs = internal$1.memoize(compileSegs);
+ }
+ render() {
+ let { props } = this;
+ let { allSegs, invisibleSegs } = this.compileSegs(props.singlePlacements);
+ return (preact.createElement(internal$1.MoreLinkContainer, { elClasses: ['fc-daygrid-more-link'], dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: () => {
+ let isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) ||
+ (props.eventResize ? props.eventResize.affectedInstances : null) ||
+ {};
+ return (preact.createElement(preact.Fragment, null, allSegs.map((seg) => {
+ let instanceId = seg.eventRange.instance.instanceId;
+ return (preact.createElement("div", { className: "fc-daygrid-event-harness", key: instanceId, style: {
+ visibility: isForcedInvisible[instanceId] ? 'hidden' : '',
+ } }, hasListItemDisplay(seg) ? (preact.createElement(TableListItemEvent, Object.assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, internal$1.getSegMeta(seg, props.todayRange)))) : (preact.createElement(TableBlockEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, internal$1.getSegMeta(seg, props.todayRange))))));
+ })));
+ } }));
+ }
+ }
+ function compileSegs(singlePlacements) {
+ let allSegs = [];
+ let invisibleSegs = [];
+ for (let placement of singlePlacements) {
+ allSegs.push(placement.seg);
+ if (!placement.isVisible) {
+ invisibleSegs.push(placement.seg);
+ }
+ }
+ return { allSegs, invisibleSegs };
+ }
+
+ const DEFAULT_WEEK_NUM_FORMAT = internal$1.createFormatter({ week: 'narrow' });
+ class TableCell extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.rootElRef = preact.createRef();
+ this.state = {
+ dayNumberId: internal$1.getUniqueDomId(),
+ };
+ this.handleRootEl = (el) => {
+ internal$1.setRef(this.rootElRef, el);
+ internal$1.setRef(this.props.elRef, el);
+ };
+ }
+ render() {
+ let { context, props, state, rootElRef } = this;
+ let { options } = context;
+ let { date, dateProfile } = props;
+ return (preact.createElement(internal$1.DayCellContainer, { elTag: "td", elRef: this.handleRootEl, elClasses: [
+ 'fc-daygrid-day',
+ ...(props.extraClassNames || []),
+ ], elAttrs: Object.assign(Object.assign(Object.assign({}, props.extraDataAttrs), (props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {})), { role: 'gridcell' }), defaultGenerator: renderTopInner, date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraRenderProps: props.extraRenderProps }, (InnerContent, renderProps) => (preact.createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef },
+ props.showWeekNumber && (preact.createElement(internal$1.WeekNumberContainer, { elTag: "a", elClasses: ['fc-daygrid-week-number'], elAttrs: internal$1.buildNavLinkAttrs(context, date, 'week'), date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT })),
+ Boolean(!renderProps.isDisabled &&
+ (props.showDayNumber || internal$1.hasCustomDayCellContent(options) || props.forceDayTop)) && (preact.createElement("div", { className: "fc-daygrid-day-top" },
+ preact.createElement(InnerContent, { elTag: "a", elClasses: ['fc-daygrid-day-number'], elAttrs: Object.assign(Object.assign({}, internal$1.buildNavLinkAttrs(context, date)), { id: state.dayNumberId }) }))),
+ preact.createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef },
+ props.fgContent,
+ preact.createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } },
+ preact.createElement(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))),
+ preact.createElement("div", { className: "fc-daygrid-day-bg" }, props.bgContent)))));
+ }
+ }
+ function renderTopInner(props) {
+ return props.dayNumberText || preact.createElement(preact.Fragment, null, "\u00A0");
+ }
+
+ function computeFgSegPlacement(segs, // assumed already sorted
+ dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) {
+ let hierarchy = new DayGridSegHierarchy();
+ hierarchy.allowReslicing = true;
+ hierarchy.strictOrder = strictOrder;
+ if (dayMaxEvents === true || dayMaxEventRows === true) {
+ hierarchy.maxCoord = maxContentHeight;
+ hierarchy.hiddenConsumes = true;
+ }
+ else if (typeof dayMaxEvents === 'number') {
+ hierarchy.maxStackCnt = dayMaxEvents;
+ }
+ else if (typeof dayMaxEventRows === 'number') {
+ hierarchy.maxStackCnt = dayMaxEventRows;
+ hierarchy.hiddenConsumes = true;
+ }
+ // create segInputs only for segs with known heights
+ let segInputs = [];
+ let unknownHeightSegs = [];
+ for (let i = 0; i < segs.length; i += 1) {
+ let seg = segs[i];
+ let { instanceId } = seg.eventRange.instance;
+ let eventHeight = eventInstanceHeights[instanceId];
+ if (eventHeight != null) {
+ segInputs.push({
+ index: i,
+ thickness: eventHeight,
+ span: {
+ start: seg.firstCol,
+ end: seg.lastCol + 1,
+ },
+ });
+ }
+ else {
+ unknownHeightSegs.push(seg);
+ }
+ }
+ let hiddenEntries = hierarchy.addSegs(segInputs);
+ let segRects = hierarchy.toRects();
+ let { singleColPlacements, multiColPlacements, leftoverMargins } = placeRects(segRects, segs, cells);
+ let moreCnts = [];
+ let moreMarginTops = [];
+ // add segs with unknown heights
+ for (let seg of unknownHeightSegs) {
+ multiColPlacements[seg.firstCol].push({
+ seg,
+ isVisible: false,
+ isAbsolute: true,
+ absoluteTop: 0,
+ marginTop: 0,
+ });
+ for (let col = seg.firstCol; col <= seg.lastCol; col += 1) {
+ singleColPlacements[col].push({
+ seg: resliceSeg(seg, col, col + 1, cells),
+ isVisible: false,
+ isAbsolute: false,
+ absoluteTop: 0,
+ marginTop: 0,
+ });
+ }
+ }
+ // add the hidden entries
+ for (let col = 0; col < cells.length; col += 1) {
+ moreCnts.push(0);
+ }
+ for (let hiddenEntry of hiddenEntries) {
+ let seg = segs[hiddenEntry.index];
+ let hiddenSpan = hiddenEntry.span;
+ multiColPlacements[hiddenSpan.start].push({
+ seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells),
+ isVisible: false,
+ isAbsolute: true,
+ absoluteTop: 0,
+ marginTop: 0,
+ });
+ for (let col = hiddenSpan.start; col < hiddenSpan.end; col += 1) {
+ moreCnts[col] += 1;
+ singleColPlacements[col].push({
+ seg: resliceSeg(seg, col, col + 1, cells),
+ isVisible: false,
+ isAbsolute: false,
+ absoluteTop: 0,
+ marginTop: 0,
+ });
+ }
+ }
+ // deal with leftover margins
+ for (let col = 0; col < cells.length; col += 1) {
+ moreMarginTops.push(leftoverMargins[col]);
+ }
+ return { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops };
+ }
+ // rects ordered by top coord, then left
+ function placeRects(allRects, segs, cells) {
+ let rectsByEachCol = groupRectsByEachCol(allRects, cells.length);
+ let singleColPlacements = [];
+ let multiColPlacements = [];
+ let leftoverMargins = [];
+ for (let col = 0; col < cells.length; col += 1) {
+ let rects = rectsByEachCol[col];
+ // compute all static segs in singlePlacements
+ let singlePlacements = [];
+ let currentHeight = 0;
+ let currentMarginTop = 0;
+ for (let rect of rects) {
+ let seg = segs[rect.index];
+ singlePlacements.push({
+ seg: resliceSeg(seg, col, col + 1, cells),
+ isVisible: true,
+ isAbsolute: false,
+ absoluteTop: rect.levelCoord,
+ marginTop: rect.levelCoord - currentHeight,
+ });
+ currentHeight = rect.levelCoord + rect.thickness;
+ }
+ // compute mixed static/absolute segs in multiPlacements
+ let multiPlacements = [];
+ currentHeight = 0;
+ currentMarginTop = 0;
+ for (let rect of rects) {
+ let seg = segs[rect.index];
+ let isAbsolute = rect.span.end - rect.span.start > 1; // multi-column?
+ let isFirstCol = rect.span.start === col;
+ currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg
+ currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg
+ if (isAbsolute) {
+ currentMarginTop += rect.thickness;
+ if (isFirstCol) {
+ multiPlacements.push({
+ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells),
+ isVisible: true,
+ isAbsolute: true,
+ absoluteTop: rect.levelCoord,
+ marginTop: 0,
+ });
+ }
+ }
+ else if (isFirstCol) {
+ multiPlacements.push({
+ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells),
+ isVisible: true,
+ isAbsolute: false,
+ absoluteTop: rect.levelCoord,
+ marginTop: currentMarginTop, // claim the margin
+ });
+ currentMarginTop = 0;
+ }
+ }
+ singleColPlacements.push(singlePlacements);
+ multiColPlacements.push(multiPlacements);
+ leftoverMargins.push(currentMarginTop);
+ }
+ return { singleColPlacements, multiColPlacements, leftoverMargins };
+ }
+ function groupRectsByEachCol(rects, colCnt) {
+ let rectsByEachCol = [];
+ for (let col = 0; col < colCnt; col += 1) {
+ rectsByEachCol.push([]);
+ }
+ for (let rect of rects) {
+ for (let col = rect.span.start; col < rect.span.end; col += 1) {
+ rectsByEachCol[col].push(rect);
+ }
+ }
+ return rectsByEachCol;
+ }
+ function resliceSeg(seg, spanStart, spanEnd, cells) {
+ if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) {
+ return seg;
+ }
+ let eventRange = seg.eventRange;
+ let origRange = eventRange.range;
+ let slicedRange = internal$1.intersectRanges(origRange, {
+ start: cells[spanStart].date,
+ end: internal$1.addDays(cells[spanEnd - 1].date, 1),
+ });
+ return Object.assign(Object.assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: {
+ def: eventRange.def,
+ ui: Object.assign(Object.assign({}, eventRange.ui), { durationEditable: false }),
+ instance: eventRange.instance,
+ range: slicedRange,
+ }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() });
+ }
+ class DayGridSegHierarchy extends internal$1.SegHierarchy {
+ constructor() {
+ super(...arguments);
+ // config
+ this.hiddenConsumes = false;
+ // allows us to keep hidden entries in the hierarchy so they take up space
+ this.forceHidden = {};
+ }
+ addSegs(segInputs) {
+ const hiddenSegs = super.addSegs(segInputs);
+ const { entriesByLevel } = this;
+ const excludeHidden = (entry) => !this.forceHidden[internal$1.buildEntryKey(entry)];
+ // remove the forced-hidden segs
+ for (let level = 0; level < entriesByLevel.length; level += 1) {
+ entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden);
+ }
+ return hiddenSegs;
+ }
+ handleInvalidInsertion(insertion, entry, hiddenEntries) {
+ const { entriesByLevel, forceHidden } = this;
+ const { touchingEntry, touchingLevel, touchingLateral } = insertion;
+ if (this.hiddenConsumes && touchingEntry) {
+ const touchingEntryId = internal$1.buildEntryKey(touchingEntry);
+ // if not already hidden
+ if (!forceHidden[touchingEntryId]) {
+ if (this.allowReslicing) {
+ const placeholderEntry = Object.assign(Object.assign({}, touchingEntry), { span: internal$1.intersectSpans(touchingEntry.span, entry.span) });
+ const placeholderEntryId = internal$1.buildEntryKey(placeholderEntry);
+ forceHidden[placeholderEntryId] = true;
+ entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder
+ this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it
+ }
+ else {
+ forceHidden[touchingEntryId] = true;
+ hiddenEntries.push(touchingEntry);
+ }
+ }
+ }
+ return super.handleInvalidInsertion(insertion, entry, hiddenEntries);
+ }
+ }
+
+ class TableRow extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.cellElRefs = new internal$1.RefMap(); // the <td>
+ this.frameElRefs = new internal$1.RefMap(); // the fc-daygrid-day-frame
+ this.fgElRefs = new internal$1.RefMap(); // the fc-daygrid-day-events
+ this.segHarnessRefs = new internal$1.RefMap(); // indexed by "instanceId:firstCol"
+ this.rootElRef = preact.createRef();
+ this.state = {
+ framePositions: null,
+ maxContentHeight: null,
+ eventInstanceHeights: {},
+ };
+ this.handleResize = (isForced) => {
+ if (isForced) {
+ this.updateSizing(true); // isExternal=true
+ }
+ };
+ }
+ render() {
+ let { props, state, context } = this;
+ let { options } = context;
+ let colCnt = props.cells.length;
+ let businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt);
+ let bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt);
+ let highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt);
+ let mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt);
+ let { singleColPlacements, multiColPlacements, moreCnts, moreMarginTops } = computeFgSegPlacement(internal$1.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells);
+ let isForcedInvisible = // TODO: messy way to compute this
+ (props.eventDrag && props.eventDrag.affectedInstances) ||
+ (props.eventResize && props.eventResize.affectedInstances) ||
+ {};
+ return (preact.createElement("tr", { ref: this.rootElRef, role: "row" },
+ props.renderIntro && props.renderIntro(),
+ props.cells.map((cell, col) => {
+ let normalFgNodes = this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible);
+ let mirrorFgNodes = this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false);
+ return (preact.createElement(TableCell, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), innerElRef: this.frameElRefs.createRef(cell.key) /* FF <td> problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */, todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys
+ preact.createElement(preact.Fragment, null,
+ preact.createElement(preact.Fragment, null, normalFgNodes),
+ preact.createElement(preact.Fragment, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys
+ preact.createElement(preact.Fragment, null,
+ this.renderFillSegs(highlightSegsByCol[col], 'highlight'),
+ this.renderFillSegs(businessHoursByCol[col], 'non-business'),
+ this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) }));
+ })));
+ }
+ componentDidMount() {
+ this.updateSizing(true);
+ this.context.addResizeHandler(this.handleResize);
+ }
+ componentDidUpdate(prevProps, prevState) {
+ let currentProps = this.props;
+ this.updateSizing(!internal$1.isPropsEqual(prevProps, currentProps));
+ }
+ componentWillUnmount() {
+ this.context.removeResizeHandler(this.handleResize);
+ }
+ getHighlightSegs() {
+ let { props } = this;
+ if (props.eventDrag && props.eventDrag.segs.length) { // messy check
+ return props.eventDrag.segs;
+ }
+ if (props.eventResize && props.eventResize.segs.length) { // messy check
+ return props.eventResize.segs;
+ }
+ return props.dateSelectionSegs;
+ }
+ getMirrorSegs() {
+ let { props } = this;
+ if (props.eventResize && props.eventResize.segs.length) { // messy check
+ return props.eventResize.segs;
+ }
+ return [];
+ }
+ renderFgSegs(col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) {
+ let { context } = this;
+ let { eventSelection } = this.props;
+ let { framePositions } = this.state;
+ let defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1
+ let isMirror = isDragging || isResizing || isDateSelecting;
+ let nodes = [];
+ if (framePositions) {
+ for (let placement of segPlacements) {
+ let { seg } = placement;
+ let { instanceId } = seg.eventRange.instance;
+ let key = instanceId + ':' + col;
+ let isVisible = placement.isVisible && !isForcedInvisible[instanceId];
+ let isAbsolute = placement.isAbsolute;
+ let left = '';
+ let right = '';
+ if (isAbsolute) {
+ if (context.isRtl) {
+ right = 0;
+ left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol];
+ }
+ else {
+ left = 0;
+ right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol];
+ }
+ }
+ /*
+ known bug: events that are force to be list-item but span multiple days still take up space in later columns
+ todo: in print view, for multi-day events, don't display title within non-start/end segs
+ */
+ nodes.push(preact.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: {
+ visibility: isVisible ? '' : 'hidden',
+ marginTop: isAbsolute ? '' : placement.marginTop,
+ top: isAbsolute ? placement.absoluteTop : '',
+ left,
+ right,
+ } }, hasListItemDisplay(seg) ? (preact.createElement(TableListItemEvent, Object.assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, internal$1.getSegMeta(seg, todayRange)))) : (preact.createElement(TableBlockEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, internal$1.getSegMeta(seg, todayRange))))));
+ }
+ }
+ return nodes;
+ }
+ renderFillSegs(segs, fillType) {
+ let { isRtl } = this.context;
+ let { todayRange } = this.props;
+ let { framePositions } = this.state;
+ let nodes = [];
+ if (framePositions) {
+ for (let seg of segs) {
+ let leftRightCss = isRtl ? {
+ right: 0,
+ left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol],
+ } : {
+ left: 0,
+ right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol],
+ };
+ nodes.push(preact.createElement("div", { key: internal$1.buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ?
+ preact.createElement(internal$1.BgEvent, Object.assign({ seg: seg }, internal$1.getSegMeta(seg, todayRange))) :
+ internal$1.renderFill(fillType)));
+ }
+ }
+ return preact.createElement(preact.Fragment, {}, ...nodes);
+ }
+ updateSizing(isExternalSizingChange) {
+ let { props, state, frameElRefs } = this;
+ if (!props.forPrint &&
+ props.clientWidth !== null // positioning ready?
+ ) {
+ if (isExternalSizingChange) {
+ let frameEls = props.cells.map((cell) => frameElRefs.currentMap[cell.key]);
+ if (frameEls.length) {
+ let originEl = this.rootElRef.current;
+ let newPositionCache = new internal$1.PositionCache(originEl, frameEls, true, // isHorizontal
+ false);
+ if (!state.framePositions || !state.framePositions.similarTo(newPositionCache)) {
+ this.setState({
+ framePositions: new internal$1.PositionCache(originEl, frameEls, true, // isHorizontal
+ false),
+ });
+ }
+ }
+ }
+ const oldInstanceHeights = this.state.eventInstanceHeights;
+ const newInstanceHeights = this.queryEventInstanceHeights();
+ const limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true;
+ this.safeSetState({
+ // HACK to prevent oscillations of events being shown/hidden from max-event-rows
+ // Essentially, once you compute an element's height, never null-out.
+ // TODO: always display all events, as visibility:hidden?
+ eventInstanceHeights: Object.assign(Object.assign({}, oldInstanceHeights), newInstanceHeights),
+ maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null,
+ });
+ }
+ }
+ queryEventInstanceHeights() {
+ let segElMap = this.segHarnessRefs.currentMap;
+ let eventInstanceHeights = {};
+ // get the max height amongst instance segs
+ for (let key in segElMap) {
+ let height = Math.round(segElMap[key].getBoundingClientRect().height);
+ let instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key
+ eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height);
+ }
+ return eventInstanceHeights;
+ }
+ computeMaxContentHeight() {
+ let firstKey = this.props.cells[0].key;
+ let cellEl = this.cellElRefs.currentMap[firstKey];
+ let fcContainerEl = this.fgElRefs.currentMap[firstKey];
+ return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top;
+ }
+ getCellEls() {
+ let elMap = this.cellElRefs.currentMap;
+ return this.props.cells.map((cell) => elMap[cell.key]);
+ }
+ }
+ TableRow.addStateEquality({
+ eventInstanceHeights: internal$1.isPropsEqual,
+ });
+ function buildMirrorPlacements(mirrorSegs, colPlacements) {
+ if (!mirrorSegs.length) {
+ return [];
+ }
+ let topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render?
+ return mirrorSegs.map((seg) => ({
+ seg,
+ isVisible: true,
+ isAbsolute: true,
+ absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId],
+ marginTop: 0,
+ }));
+ }
+ function buildAbsoluteTopHash(colPlacements) {
+ let topsByInstanceId = {};
+ for (let placements of colPlacements) {
+ for (let placement of placements) {
+ topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop;
+ }
+ }
+ return topsByInstanceId;
+ }
+
+ class Table extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.splitBusinessHourSegs = internal$1.memoize(splitSegsByRow);
+ this.splitBgEventSegs = internal$1.memoize(splitSegsByRow);
+ this.splitFgEventSegs = internal$1.memoize(splitSegsByRow);
+ this.splitDateSelectionSegs = internal$1.memoize(splitSegsByRow);
+ this.splitEventDrag = internal$1.memoize(splitInteractionByRow);
+ this.splitEventResize = internal$1.memoize(splitInteractionByRow);
+ this.rowRefs = new internal$1.RefMap();
+ this.handleRootEl = (rootEl) => {
+ this.rootEl = rootEl;
+ if (rootEl) {
+ this.context.registerInteractiveComponent(this, {
+ el: rootEl,
+ isHitComboAllowed: this.props.isHitComboAllowed,
+ });
+ }
+ else {
+ this.context.unregisterInteractiveComponent(this);
+ }
+ };
+ }
+ render() {
+ let { props } = this;
+ let { dateProfile, dayMaxEventRows, dayMaxEvents, expandRows } = props;
+ let rowCnt = props.cells.length;
+ let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt);
+ let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt);
+ let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt);
+ let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt);
+ let eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt);
+ let eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt);
+ let limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true;
+ // if rows can't expand to fill fixed height, can't do balanced-height event limit
+ // TODO: best place to normalize these options?
+ if (limitViaBalanced && !expandRows) {
+ limitViaBalanced = false;
+ dayMaxEventRows = null;
+ dayMaxEvents = null;
+ }
+ let classNames = [
+ 'fc-daygrid-body',
+ limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced',
+ expandRows ? '' : 'fc-daygrid-body-natural', // will height of one row depend on the others?
+ ];
+ return (preact.createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: {
+ // these props are important to give this wrapper correct dimensions for interactions
+ // TODO: if we set it here, can we avoid giving to inner tables?
+ width: props.clientWidth,
+ minWidth: props.tableMinWidth,
+ } },
+ preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => (preact.createElement(preact.Fragment, null,
+ preact.createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: {
+ width: props.clientWidth,
+ minWidth: props.tableMinWidth,
+ height: expandRows ? props.clientHeight : '',
+ } },
+ props.colGroupNode,
+ preact.createElement("tbody", { role: "presentation" }, props.cells.map((cells, row) => (preact.createElement(TableRow, { ref: this.rowRefs.createRef(row), key: cells.length
+ ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */
+ : row // in case there are no cells (like when resource view is loading)
+ , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }))))))))));
+ }
+ // Hit System
+ // ----------------------------------------------------------------------------------------------------
+ prepareHits() {
+ this.rowPositions = new internal$1.PositionCache(this.rootEl, this.rowRefs.collect().map((rowObj) => rowObj.getCellEls()[0]), // first cell el in each row. TODO: not optimal
+ false, true);
+ this.colPositions = new internal$1.PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row
+ true, // horizontal
+ false);
+ }
+ queryHit(positionLeft, positionTop) {
+ let { colPositions, rowPositions } = this;
+ let col = colPositions.leftToIndex(positionLeft);
+ let row = rowPositions.topToIndex(positionTop);
+ if (row != null && col != null) {
+ let cell = this.props.cells[row][col];
+ return {
+ dateProfile: this.props.dateProfile,
+ dateSpan: Object.assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan),
+ dayEl: this.getCellEl(row, col),
+ rect: {
+ left: colPositions.lefts[col],
+ right: colPositions.rights[col],
+ top: rowPositions.tops[row],
+ bottom: rowPositions.bottoms[row],
+ },
+ layer: 0,
+ };
+ }
+ return null;
+ }
+ getCellEl(row, col) {
+ return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal
+ }
+ getCellRange(row, col) {
+ let start = this.props.cells[row][col].date;
+ let end = internal$1.addDays(start, 1);
+ return { start, end };
+ }
+ }
+ function isSegAllDay(seg) {
+ return seg.eventRange.def.allDay;
+ }
+
+ class DayTableSlicer extends internal$1.Slicer {
+ constructor() {
+ super(...arguments);
+ this.forceDayIfListItem = true;
+ }
+ sliceRange(dateRange, dayTableModel) {
+ return dayTableModel.sliceRange(dateRange);
+ }
+ }
+
+ class DayTable extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.slicer = new DayTableSlicer();
+ this.tableRef = preact.createRef();
+ }
+ render() {
+ let { props, context } = this;
+ return (preact.createElement(Table, Object.assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })));
+ }
+ }
+
+ class DayTableView extends TableView {
+ constructor() {
+ super(...arguments);
+ this.buildDayTableModel = internal$1.memoize(buildDayTableModel);
+ this.headerRef = preact.createRef();
+ this.tableRef = preact.createRef();
+ }
+ render() {
+ let { options, dateProfileGenerator } = this.context;
+ let { props } = this;
+ let dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator);
+ let headerContent = options.dayHeaders && (preact.createElement(internal$1.DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 }));
+ let bodyContent = (contentArg) => (preact.createElement(DayTable, { ref: this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }));
+ return options.dayMinWidth
+ ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth)
+ : this.renderSimpleLayout(headerContent, bodyContent);
+ }
+ }
+ function buildDayTableModel(dateProfile, dateProfileGenerator) {
+ let daySeries = new internal$1.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
+ return new internal$1.DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
+ }
+
+ class TableDateProfileGenerator extends internal$1.DateProfileGenerator {
+ // Computes the date range that will be rendered.
+ buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay) {
+ let { dateEnv } = this.props;
+ let renderRange = super.buildRenderRange(currentRange, currentRangeUnit, isRangeAllDay);
+ let start = renderRange.start;
+ let end = renderRange.end;
+ let endOfWeek;
+ // year and month views should be aligned with weeks. this is already done for week
+ if (/^(year|month)$/.test(currentRangeUnit)) {
+ start = dateEnv.startOfWeek(start);
+ // make end-of-week if not already
+ endOfWeek = dateEnv.startOfWeek(end);
+ if (endOfWeek.valueOf() !== end.valueOf()) {
+ end = internal$1.addWeeks(endOfWeek, 1);
+ }
+ }
+ // ensure 6 weeks
+ if (this.props.monthMode &&
+ this.props.fixedWeekCount) {
+ let rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
+ internal$1.diffWeeks(start, end));
+ end = internal$1.addWeeks(end, 6 - rowCnt);
+ }
+ return { start, end };
+ }
+ }
+
+ var css_248z = ":root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:\"\";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}";
+ internal$1.injectStyles(css_248z);
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/daygrid',
+ initialView: 'dayGridMonth',
+ views: {
+ dayGrid: {
+ component: DayTableView,
+ dateProfileGeneratorClass: TableDateProfileGenerator,
+ },
+ dayGridDay: {
+ type: 'dayGrid',
+ duration: { days: 1 },
+ },
+ dayGridWeek: {
+ type: 'dayGrid',
+ duration: { weeks: 1 },
+ },
+ dayGridMonth: {
+ type: 'dayGrid',
+ duration: { months: 1 },
+ monthMode: true,
+ fixedWeekCount: true,
+ },
+ },
+ });
+
+ var internal = {
+ __proto__: null,
+ DayTable: DayTable,
+ DayTableSlicer: DayTableSlicer,
+ Table: Table,
+ TableView: TableView,
+ buildDayTableModel: buildDayTableModel,
+ DayGridView: DayTableView
+ };
+
+ core.globalPlugins.push(plugin);
+
+ exports.Internal = internal;
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact);
diff --git a/library/fullcalendar/packages/daygrid/index.global.min.js b/library/fullcalendar/packages/daygrid/index.global.min.js
new file mode 100644
index 000000000..5a3aa763e
--- /dev/null
+++ b/library/fullcalendar/packages/daygrid/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Day Grid Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/month-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.DayGrid=function(e,t,n,s){"use strict";class i extends n.DateComponent{constructor(){super(...arguments),this.headerElRef=s.createRef()}renderSimpleLayout(e,t){let{props:i,context:r}=this,a=[],l=n.getStickyHeaderDates(r.options);return e&&a.push({type:"header",key:"header",isSticky:l,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),a.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),s.createElement(n.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:r.viewSpec},s.createElement(n.SimpleScrollGrid,{liquid:!i.isHeightAuto&&!i.forPrint,collapsibleWidth:i.forPrint,cols:[],sections:a}))}renderHScrollLayout(e,t,i,r){let a=this.context.pluginHooks.scrollGridImpl;if(!a)throw new Error("No ScrollGrid implementation");let{props:l,context:o}=this,d=!l.forPrint&&n.getStickyHeaderDates(o.options),c=!l.forPrint&&n.getStickyFooterScrollbar(o.options),g=[];return e&&g.push({type:"header",key:"header",isSticky:d,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),g.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),c&&g.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:n.renderScrollShim}]}),s.createElement(n.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},s.createElement(a,{liquid:!l.isHeightAuto&&!l.forPrint,collapsibleWidth:l.forPrint,colGroups:[{cols:[{span:i,minWidth:r}]}],sections:g}))}}function r(e,t){let n=[];for(let e=0;e<t;e+=1)n[e]=[];for(let t of e)n[t.row].push(t);return n}function a(e,t){let n=[];for(let e=0;e<t;e+=1)n[e]=[];for(let t of e)n[t.firstCol].push(t);return n}function l(e,t){let n=[];if(e){for(let s=0;s<t;s+=1)n[s]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)n[t.row].segs.push(t)}else for(let e=0;e<t;e+=1)n[e]=null;return n}const o=n.createFormatter({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"});function d(e){let{display:t}=e.eventRange.ui;return"list-item"===t||"auto"===t&&!e.eventRange.def.allDay&&e.firstCol===e.lastCol&&e.isStart&&e.isEnd}class c extends n.BaseComponent{render(){let{props:e}=this;return s.createElement(n.StandardEvent,Object.assign({},e,{elClasses:["fc-daygrid-event","fc-daygrid-block-event","fc-h-event"],defaultTimeFormat:o,defaultDisplayEventEnd:e.defaultDisplayEventEnd,disableResizing:!e.seg.eventRange.def.allDay}))}}class g extends n.BaseComponent{render(){let{props:e,context:t}=this,{options:i}=t,{seg:r}=e,a=i.eventTimeFormat||o,l=n.buildSegTimeText(r,a,t,!0,e.defaultDisplayEventEnd);return s.createElement(n.EventContainer,Object.assign({},e,{elTag:"a",elClasses:["fc-daygrid-event","fc-daygrid-dot-event"],elAttrs:n.getSegAnchorAttrs(e.seg,t),defaultGenerator:f,timeText:l,isResizing:!1,isDateSelecting:!1}))}}function f(e){return s.createElement(s.Fragment,null,s.createElement("div",{className:"fc-daygrid-event-dot",style:{borderColor:e.borderColor||e.backgroundColor}}),e.timeText&&s.createElement("div",{className:"fc-event-time"},e.timeText),s.createElement("div",{className:"fc-event-title"},e.event.title||s.createElement(s.Fragment,null," ")))}class h extends n.BaseComponent{constructor(){super(...arguments),this.compileSegs=n.memoize(u)}render(){let{props:e}=this,{allSegs:t,invisibleSegs:i}=this.compileSegs(e.singlePlacements);return s.createElement(n.MoreLinkContainer,{elClasses:["fc-daygrid-more-link"],dateProfile:e.dateProfile,todayRange:e.todayRange,allDayDate:e.allDayDate,moreCnt:e.moreCnt,allSegs:t,hiddenSegs:i,alignmentElRef:e.alignmentElRef,alignGridTop:e.alignGridTop,extraDateSpan:e.extraDateSpan,popoverContent:()=>{let i=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return s.createElement(s.Fragment,null,t.map(t=>{let r=t.eventRange.instance.instanceId;return s.createElement("div",{className:"fc-daygrid-event-harness",key:r,style:{visibility:i[r]?"hidden":""}},d(t)?s.createElement(g,Object.assign({seg:t,isDragging:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},n.getSegMeta(t,e.todayRange))):s.createElement(c,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:r===e.eventSelection,defaultDisplayEventEnd:!1},n.getSegMeta(t,e.todayRange))))}))}})}}function u(e){let t=[],n=[];for(let s of e)t.push(s.seg),s.isVisible||n.push(s.seg);return{allSegs:t,invisibleSegs:n}}const p=n.createFormatter({week:"narrow"});class m extends n.DateComponent{constructor(){super(...arguments),this.rootElRef=s.createRef(),this.state={dayNumberId:n.getUniqueDomId()},this.handleRootEl=e=>{n.setRef(this.rootElRef,e),n.setRef(this.props.elRef,e)}}render(){let{context:e,props:t,state:i,rootElRef:r}=this,{options:a}=e,{date:l,dateProfile:o}=t;return s.createElement(n.DayCellContainer,{elTag:"td",elRef:this.handleRootEl,elClasses:["fc-daygrid-day",...t.extraClassNames||[]],elAttrs:Object.assign(Object.assign(Object.assign({},t.extraDataAttrs),t.showDayNumber?{"aria-labelledby":i.dayNumberId}:{}),{role:"gridcell"}),defaultGenerator:y,date:l,dateProfile:o,todayRange:t.todayRange,showDayNumber:t.showDayNumber,extraRenderProps:t.extraRenderProps},(o,d)=>s.createElement("div",{className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",ref:t.innerElRef},t.showWeekNumber&&s.createElement(n.WeekNumberContainer,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:n.buildNavLinkAttrs(e,l,"week"),date:l,defaultFormat:p}),Boolean(!d.isDisabled&&(t.showDayNumber||n.hasCustomDayCellContent(a)||t.forceDayTop))&&s.createElement("div",{className:"fc-daygrid-day-top"},s.createElement(o,{elTag:"a",elClasses:["fc-daygrid-day-number"],elAttrs:Object.assign(Object.assign({},n.buildNavLinkAttrs(e,l)),{id:i.dayNumberId})})),s.createElement("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,s.createElement("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},s.createElement(h,{allDayDate:l,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:r,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),s.createElement("div",{className:"fc-daygrid-day-bg"},t.bgContent)))}}function y(e){return e.dayNumberText||s.createElement(s.Fragment,null," ")}function v(e,t,n,s,i,r,a){let l=new R;l.allowReslicing=!0,l.strictOrder=s,!0===t||!0===n?(l.maxCoord=r,l.hiddenConsumes=!0):"number"==typeof t?l.maxStackCnt=t:"number"==typeof n&&(l.maxStackCnt=n,l.hiddenConsumes=!0);let o=[],d=[];for(let t=0;t<e.length;t+=1){let n=e[t],{instanceId:s}=n.eventRange.instance,r=i[s];null!=r?o.push({index:t,thickness:r,span:{start:n.firstCol,end:n.lastCol+1}}):d.push(n)}let c=l.addSegs(o),g=l.toRects(),{singleColPlacements:f,multiColPlacements:h,leftoverMargins:u}=function(e,t,n){let s=function(e,t){let n=[];for(let e=0;e<t;e+=1)n.push([]);for(let t of e)for(let e=t.span.start;e<t.span.end;e+=1)n[e].push(t);return n}(e,n.length),i=[],r=[],a=[];for(let e=0;e<n.length;e+=1){let l=s[e],o=[],d=0,c=0;for(let s of l){let i=t[s.index];o.push({seg:b(i,e,e+1,n),isVisible:!0,isAbsolute:!1,absoluteTop:s.levelCoord,marginTop:s.levelCoord-d}),d=s.levelCoord+s.thickness}let g=[];d=0,c=0;for(let s of l){let i=t[s.index],r=s.span.end-s.span.start>1,a=s.span.start===e;c+=s.levelCoord-d,d=s.levelCoord+s.thickness,r?(c+=s.thickness,a&&g.push({seg:b(i,s.span.start,s.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:s.levelCoord,marginTop:0})):a&&(g.push({seg:b(i,s.span.start,s.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:s.levelCoord,marginTop:c}),c=0)}i.push(o),r.push(g),a.push(c)}return{singleColPlacements:i,multiColPlacements:r,leftoverMargins:a}}(g,e,a),p=[],m=[];for(let e of d){h[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)f[t].push({seg:b(e,t,t+1,a),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e<a.length;e+=1)p.push(0);for(let t of c){let n=e[t.index],s=t.span;h[s.start].push({seg:b(n,s.start,s.end,a),isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let e=s.start;e<s.end;e+=1)p[e]+=1,f[e].push({seg:b(n,e,e+1,a),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e<a.length;e+=1)m.push(u[e]);return{singleColPlacements:f,multiColPlacements:h,moreCnts:p,moreMarginTops:m}}function b(e,t,s,i){if(e.firstCol===t&&e.lastCol===s-1)return e;let r=e.eventRange,a=r.range,l=n.intersectRanges(a,{start:i[t].date,end:n.addDays(i[s-1].date,1)});return Object.assign(Object.assign({},e),{firstCol:t,lastCol:s-1,eventRange:{def:r.def,ui:Object.assign(Object.assign({},r.ui),{durationEditable:!1}),instance:r.instance,range:l},isStart:e.isStart&&l.start.valueOf()===a.start.valueOf(),isEnd:e.isEnd&&l.end.valueOf()===a.end.valueOf()})}class R extends n.SegHierarchy{constructor(){super(...arguments),this.hiddenConsumes=!1,this.forceHidden={}}addSegs(e){const t=super.addSegs(e),{entriesByLevel:s}=this,i=e=>!this.forceHidden[n.buildEntryKey(e)];for(let e=0;e<s.length;e+=1)s[e]=s[e].filter(i);return t}handleInvalidInsertion(e,t,s){const{entriesByLevel:i,forceHidden:r}=this,{touchingEntry:a,touchingLevel:l,touchingLateral:o}=e;if(this.hiddenConsumes&&a){const e=n.buildEntryKey(a);if(!r[e])if(this.allowReslicing){const e=Object.assign(Object.assign({},a),{span:n.intersectSpans(a.span,t.span)});r[n.buildEntryKey(e)]=!0,i[l][o]=e,this.splitEntry(a,t,s)}else r[e]=!0,s.push(a)}return super.handleInvalidInsertion(e,t,s)}}class E extends n.DateComponent{constructor(){super(...arguments),this.cellElRefs=new n.RefMap,this.frameElRefs=new n.RefMap,this.fgElRefs=new n.RefMap,this.segHarnessRefs=new n.RefMap,this.rootElRef=s.createRef(),this.state={framePositions:null,maxContentHeight:null,eventInstanceHeights:{}},this.handleResize=e=>{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:i}=this,{options:r}=i,l=e.cells.length,o=a(e.businessHourSegs,l),d=a(e.bgEventSegs,l),c=a(this.getHighlightSegs(),l),g=a(this.getMirrorSegs(),l),{singleColPlacements:f,multiColPlacements:h,moreCnts:u,moreMarginTops:p}=v(n.sortEventSegs(e.fgEventSegs,r.eventOrder),e.dayMaxEvents,e.dayMaxEventRows,r.eventOrderStrict,t.eventInstanceHeights,t.maxContentHeight,e.cells),y=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{};return s.createElement("tr",{ref:this.rootElRef,role:"row"},e.renderIntro&&e.renderIntro(),e.cells.map((t,n)=>{let i=this.renderFgSegs(n,e.forPrint?f[n]:h[n],e.todayRange,y),r=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map(e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0}))}(g[n],h),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return s.createElement(m,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:u[n],moreMarginTop:p[n],singlePlacements:f[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:s.createElement(s.Fragment,null,s.createElement(s.Fragment,null,i),s.createElement(s.Fragment,null,r)),bgContent:s.createElement(s.Fragment,null,this.renderFillSegs(c[n],"highlight"),this.renderFillSegs(o[n],"non-business"),this.renderFillSegs(d[n],"bg-event"))})}))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let s=this.props;this.updateSizing(!n.isPropsEqual(e,s))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,i,r,a,l,o){let{context:f}=this,{eventSelection:h}=this.props,{framePositions:u}=this.state,p=1===this.props.cells.length,m=a||l||o,y=[];if(u)for(let v of t){let{seg:t}=v,{instanceId:b}=t.eventRange.instance,R=b+":"+e,E=v.isVisible&&!r[b],S=v.isAbsolute,x="",C="";S&&(f.isRtl?(C=0,x=u.lefts[t.lastCol]-u.lefts[t.firstCol]):(x=0,C=u.rights[t.firstCol]-u.rights[t.lastCol])),y.push(s.createElement("div",{className:"fc-daygrid-event-harness"+(S?" fc-daygrid-event-harness-abs":""),key:R,ref:m?null:this.segHarnessRefs.createRef(R),style:{visibility:E?"":"hidden",marginTop:S?"":v.marginTop,top:S?v.absoluteTop:"",left:x,right:C}},d(t)?s.createElement(g,Object.assign({seg:t,isDragging:a,isSelected:b===h,defaultDisplayEventEnd:p},n.getSegMeta(t,i))):s.createElement(c,Object.assign({seg:t,isDragging:a,isResizing:l,isDateSelecting:o,isSelected:b===h,defaultDisplayEventEnd:p},n.getSegMeta(t,i)))))}return y}renderFillSegs(e,t){let{isRtl:i}=this.context,{todayRange:r}=this.props,{framePositions:a}=this.state,l=[];if(a)for(let o of e){let e=i?{right:0,left:a.lefts[o.lastCol]-a.lefts[o.firstCol]}:{left:0,right:a.rights[o.firstCol]-a.rights[o.lastCol]};l.push(s.createElement("div",{key:n.buildEventRangeKey(o.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?s.createElement(n.BgEvent,Object.assign({seg:o},n.getSegMeta(o,r))):n.renderFill(t)))}return s.createElement(s.Fragment,{},...l)}updateSizing(e){let{props:t,state:s,frameElRefs:i}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map(e=>i.currentMap[e.key]);if(e.length){let t=this.rootElRef.current,i=new n.PositionCache(t,e,!0,!1);s.framePositions&&s.framePositions.similarTo(i)||this.setState({framePositions:new n.PositionCache(t,e,!0,!1)})}}const r=this.state.eventInstanceHeights,a=this.queryEventInstanceHeights(),l=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},r),a),maxContentHeight:l?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let s=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,s)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map(t=>e[t.key])}}E.addStateEquality({eventInstanceHeights:n.isPropsEqual});class S extends n.DateComponent{constructor(){super(...arguments),this.splitBusinessHourSegs=n.memoize(r),this.splitBgEventSegs=n.memoize(r),this.splitFgEventSegs=n.memoize(r),this.splitDateSelectionSegs=n.memoize(r),this.splitEventDrag=n.memoize(l),this.splitEventResize=n.memoize(l),this.rowRefs=new n.RefMap,this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e}=this,{dateProfile:t,dayMaxEventRows:i,dayMaxEvents:r,expandRows:a}=e,l=e.cells.length,o=this.splitBusinessHourSegs(e.businessHourSegs,l),d=this.splitBgEventSegs(e.bgEventSegs,l),c=this.splitFgEventSegs(e.fgEventSegs,l),g=this.splitDateSelectionSegs(e.dateSelectionSegs,l),f=this.splitEventDrag(e.eventDrag,l),h=this.splitEventResize(e.eventResize,l),u=!0===r||!0===i;u&&!a&&(u=!1,i=null,r=null);let p=["fc-daygrid-body",u?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",a?"":"fc-daygrid-body-natural"];return s.createElement("div",{className:p.join(" "),ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},s.createElement(n.NowTimer,{unit:"day"},(n,u)=>s.createElement(s.Fragment,null,s.createElement("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:a?e.clientHeight:""}},e.colGroupNode,s.createElement("tbody",{role:"presentation"},e.cells.map((n,a)=>s.createElement(E,{ref:this.rowRefs.createRef(a),key:n.length?n[0].date.toISOString():a,showDayNumbers:l>1,showWeekNumbers:e.showWeekNumbers,todayRange:u,dateProfile:t,cells:n,renderIntro:e.renderRowIntro,businessHourSegs:o[a],eventSelection:e.eventSelection,bgEventSegs:d[a].filter(x),fgEventSegs:c[a],dateSelectionSegs:g[a],eventDrag:f[a],eventResize:h[a],dayMaxEvents:r,dayMaxEventRows:i,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint})))))))}prepareHits(){this.rowPositions=new n.PositionCache(this.rootEl,this.rowRefs.collect().map(e=>e.getCellEls()[0]),!1,!0),this.colPositions=new n.PositionCache(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:s}=this,i=n.leftToIndex(e),r=s.topToIndex(t);if(null!=r&&null!=i){let e=this.props.cells[r][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(r,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(r,i),rect:{left:n.lefts[i],right:n.rights[i],top:s.tops[r],bottom:s.bottoms[r]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let s=this.props.cells[e][t].date;return{start:s,end:n.addDays(s,1)}}}function x(e){return e.eventRange.def.allDay}class C extends n.Slicer{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class w extends n.DateComponent{constructor(){super(...arguments),this.slicer=new C,this.tableRef=s.createRef()}render(){let{props:e,context:t}=this;return s.createElement(S,Object.assign({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))}}class D extends i{constructor(){super(...arguments),this.buildDayTableModel=n.memoize(k),this.headerRef=s.createRef(),this.tableRef=s.createRef()}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:i}=this,r=this.buildDayTableModel(i.dateProfile,t),a=e.dayHeaders&&s.createElement(n.DayHeader,{ref:this.headerRef,dateProfile:i.dateProfile,dates:r.headerDates,datesRepDistinctDays:1===r.rowCnt}),l=t=>s.createElement(w,{ref:this.tableRef,dateProfile:i.dateProfile,dayTableModel:r,businessHours:i.businessHours,dateSelection:i.dateSelection,eventStore:i.eventStore,eventUiBases:i.eventUiBases,eventSelection:i.eventSelection,eventDrag:i.eventDrag,eventResize:i.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!i.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:i.forPrint});return e.dayMinWidth?this.renderHScrollLayout(a,l,r.colCnt,e.dayMinWidth):this.renderSimpleLayout(a,l)}}function k(e,t){let s=new n.DaySeriesModel(e.renderRange,t);return new n.DayTableModel(s,/year|month|week/.test(e.currentRangeUnit))}class P extends n.DateProfileGenerator{buildRenderRange(e,t,s){let i,{dateEnv:r}=this.props,a=super.buildRenderRange(e,t,s),l=a.start,o=a.end;if(/^(year|month)$/.test(t)&&(l=r.startOfWeek(l),i=r.startOfWeek(o),i.valueOf()!==o.valueOf()&&(o=n.addWeeks(i,1))),this.props.monthMode&&this.props.fixedWeekCount){let e=Math.ceil(n.diffWeeks(l,o));o=n.addWeeks(o,6-e)}return{start:l,end:o}}}n.injectStyles(':root{--fc-daygrid-event-dot-width:8px}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{clear:both;content:"";display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-daygrid-day-frame{min-height:100%;position:relative}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px;position:relative;z-index:4}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{left:0;position:absolute;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{min-height:2em;position:relative}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{left:0;position:absolute;right:0;top:0}.fc .fc-daygrid-bg-harness{bottom:0;position:absolute;top:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{margin-top:1px;z-index:6}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{clear:both;content:"";display:table}.fc .fc-daygrid-more-link{cursor:pointer;position:relative;z-index:4}.fc .fc-daygrid-week-number{background-color:var(--fc-neutral-bg-color);color:var(--fc-neutral-text-color);min-width:1.5em;padding:2px;position:absolute;text-align:center;top:0;z-index:5}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{border-radius:0 0 3px 0;left:0}.fc-direction-rtl .fc-daygrid-week-number{border-radius:0 0 0 3px;right:0}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{border-radius:3px;font-size:var(--fc-small-font-size);position:relative;white-space:nowrap}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{align-items:center;display:flex;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;font-weight:700;min-width:0;overflow:hidden}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-daygrid-event-dot{border:calc(var(--fc-daygrid-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-daygrid-event-dot-width)/2);box-sizing:content-box;height:0;margin:0 4px;width:0}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}');var M=t.createPlugin({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:D,dateProfileGeneratorClass:P},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),T={__proto__:null,DayTable:w,DayTableSlicer:C,Table:S,TableView:i,buildDayTableModel:k,DayGridView:D};return t.globalPlugins.push(M),e.Internal=T,e.default=M,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact); \ No newline at end of file
diff --git a/library/fullcalendar/packages/daygrid/main.css b/library/fullcalendar/packages/daygrid/main.css
deleted file mode 100644
index 81f589554..000000000
--- a/library/fullcalendar/packages/daygrid/main.css
+++ /dev/null
@@ -1,78 +0,0 @@
-/* DayGridView
---------------------------------------------------------------------------------------------------*/
-/* day row structure */
-.fc-dayGridWeek-view .fc-content-skeleton,
-.fc-dayGridDay-view .fc-content-skeleton {
- /* there may be week numbers in these views, so no padding-top */
- padding-bottom: 1em;
- /* ensure a space at bottom of cell for user selecting/clicking */
-}
-
-.fc-dayGrid-view .fc-body .fc-row {
- min-height: 4em;
- /* ensure that all rows are at least this tall */
-}
-
-/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
-.fc-row.fc-rigid {
- overflow: hidden;
-}
-
-.fc-row.fc-rigid .fc-content-skeleton {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
-}
-
-/* week and day number styling */
-.fc-day-top.fc-other-month {
- opacity: 0.3;
-}
-
-.fc-dayGrid-view .fc-week-number,
-.fc-dayGrid-view .fc-day-number {
- padding: 2px;
-}
-
-.fc-dayGrid-view th.fc-week-number,
-.fc-dayGrid-view th.fc-day-number {
- padding: 0 2px;
- /* column headers can't have as much v space */
-}
-
-.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number {
- float: right;
-}
-
-.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number {
- float: left;
-}
-
-.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number {
- float: left;
- border-radius: 0 0 3px 0;
-}
-
-.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number {
- float: right;
- border-radius: 0 0 0 3px;
-}
-
-.fc-dayGrid-view .fc-day-top .fc-week-number {
- min-width: 1.5em;
- text-align: center;
- background-color: #f2f2f2;
- color: #808080;
-}
-
-/* when week/day number have own column */
-.fc-dayGrid-view td.fc-week-number {
- text-align: center;
-}
-
-.fc-dayGrid-view td.fc-week-number > * {
- /* work around the way we do column resizing and ensure a minimum width */
- display: inline-block;
- min-width: 1.25em;
-}
diff --git a/library/fullcalendar/packages/daygrid/main.d.ts b/library/fullcalendar/packages/daygrid/main.d.ts
deleted file mode 100644
index 312ddd97b..000000000
--- a/library/fullcalendar/packages/daygrid/main.d.ts
+++ /dev/null
@@ -1,316 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/daygrid' {
- export { default as SimpleDayGrid, DayGridSlicer } from '@fullcalendar/daygrid/SimpleDayGrid';
- export { default as DayGrid, DayGridSeg } from '@fullcalendar/daygrid/DayGrid';
- export { default as AbstractDayGridView } from '@fullcalendar/daygrid/AbstractDayGridView';
- export { default as DayGridView, buildDayTable as buildBasicDayTable } from '@fullcalendar/daygrid/DayGridView';
- export { default as DayBgRow } from '@fullcalendar/daygrid/DayBgRow';
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
-declare module '@fullcalendar/daygrid/SimpleDayGrid' {
- import { DateProfile, EventStore, EventUiHash, DateSpan, EventInteractionState, DayTable, Duration, DateComponent, DateRange, Slicer, Hit, ComponentContext } from '@fullcalendar/core';
- import { default as DayGrid, DayGridSeg } from '@fullcalendar/daygrid/DayGrid';
- export interface SimpleDayGridProps {
- dateProfile: DateProfile | null;
- dayTable: DayTable;
- nextDayThreshold: Duration;
- businessHours: EventStore;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- isRigid: boolean;
- }
- export { SimpleDayGrid as default, SimpleDayGrid };
- class SimpleDayGrid extends DateComponent<SimpleDayGridProps> {
- dayGrid: DayGrid;
- constructor(dayGrid: DayGrid);
- firstContext(context: ComponentContext): void;
- destroy(): void;
- render(props: SimpleDayGridProps, context: ComponentContext): void;
- buildPositionCaches(): void;
- queryHit(positionLeft: number, positionTop: number): Hit;
- }
- export class DayGridSlicer extends Slicer<DayGridSeg, [DayTable]> {
- sliceRange(dateRange: DateRange, dayTable: DayTable): DayGridSeg[];
- }
-}
-
-declare module '@fullcalendar/daygrid/DayGrid' {
- import { PositionCache, DateMarker, DateComponent, EventSegUiInteractionState, Seg, DateProfile, ComponentContext } from '@fullcalendar/core';
- import Popover from '@fullcalendar/daygrid/Popover';
- import DayGridEventRenderer from '@fullcalendar/daygrid/DayGridEventRenderer';
- import DayTile from '@fullcalendar/daygrid/DayTile';
- export interface RenderProps {
- renderNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
- renderBgIntroHtml: () => string;
- renderIntroHtml: () => string;
- colWeekNumbersVisible: boolean;
- cellWeekNumbersVisible: boolean;
- }
- export interface DayGridSeg extends Seg {
- row: number;
- firstCol: number;
- lastCol: number;
- }
- export interface DayGridCell {
- date: DateMarker;
- htmlAttrs?: string;
- }
- export interface DayGridProps {
- dateProfile: DateProfile;
- cells: DayGridCell[][];
- businessHourSegs: DayGridSeg[];
- bgEventSegs: DayGridSeg[];
- fgEventSegs: DayGridSeg[];
- dateSelectionSegs: DayGridSeg[];
- eventSelection: string;
- eventDrag: EventSegUiInteractionState | null;
- eventResize: EventSegUiInteractionState | null;
- isRigid: boolean;
- }
- export { DayGrid as default, DayGrid };
- class DayGrid extends DateComponent<DayGridProps> {
- eventRenderer: DayGridEventRenderer;
- renderProps: RenderProps;
- rowCnt: number;
- colCnt: number;
- bottomCoordPadding: number;
- rowEls: HTMLElement[];
- cellEls: HTMLElement[];
- isCellSizesDirty: boolean;
- rowPositions: PositionCache;
- colPositions: PositionCache;
- segPopover: Popover;
- segPopoverTile: DayTile;
- constructor(el: any, renderProps: RenderProps);
- render(props: DayGridProps, context: ComponentContext): void;
- destroy(): void;
- getCellRange(row: any, col: any): {
- start: Date;
- end: Date;
- };
- updateSegPopoverTile(date?: any, segs?: any): void;
- _renderCells(cells: DayGridCell[][], isRigid: boolean): void;
- _unrenderCells(): void;
- renderDayRowHtml(row: any, isRigid: any): string;
- getIsNumbersVisible(): boolean;
- getIsDayNumbersVisible(): boolean;
- renderNumberTrHtml(row: number): string;
- renderNumberCellsHtml(row: any): string;
- renderNumberCellHtml(date: any): string;
- updateSize(isResize: boolean): void;
- buildPositionCaches(): void;
- buildColPositions(): void;
- buildRowPositions(): void;
- positionToHit(leftPosition: any, topPosition: any): {
- row: any;
- col: any;
- dateSpan: {
- range: {
- start: Date;
- end: Date;
- };
- allDay: boolean;
- };
- dayEl: HTMLElement;
- relativeRect: {
- left: any;
- right: any;
- top: any;
- bottom: any;
- };
- };
- getCellEl(row: any, col: any): HTMLElement;
- _renderEventDrag(state: EventSegUiInteractionState): void;
- _unrenderEventDrag(state: EventSegUiInteractionState): void;
- _renderEventResize(state: EventSegUiInteractionState): void;
- _unrenderEventResize(state: EventSegUiInteractionState): void;
- removeSegPopover(): void;
- limitRows(levelLimit: any): void;
- computeRowLevelLimit(row: any): (number | false);
- limitRow(row: any, levelLimit: any): void;
- unlimitRow(row: any): void;
- renderMoreLink(row: any, col: any, hiddenSegs: any): HTMLElement;
- showSegPopover(row: any, col: any, moreLink: HTMLElement, segs: any): void;
- resliceDaySegs(segs: any, dayDate: any): any[];
- getMoreLinkText(num: any): any;
- getCellSegs(row: any, col: any, startLevel?: any): any[];
- }
-}
-
-declare module '@fullcalendar/daygrid/AbstractDayGridView' {
- import { ScrollComponent, View, Duration, ComponentContext, ViewProps } from '@fullcalendar/core';
- import DayGrid from '@fullcalendar/daygrid/DayGrid';
- export { AbstractDayGridView as default, AbstractDayGridView };
- abstract class AbstractDayGridView extends View {
- scroller: ScrollComponent;
- dayGrid: DayGrid;
- colWeekNumbersVisible: boolean;
- cellWeekNumbersVisible: boolean;
- weekNumberWidth: number;
- _processOptions(options: any): void;
- render(props: ViewProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- renderSkeletonHtml(): string;
- weekNumberStyleAttr(): string;
- hasRigidRows(): boolean;
- updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- computeScrollerHeight(viewHeight: any): number;
- setGridHeight(height: any, isAuto: any): void;
- computeDateScroll(duration: Duration): {
- top: number;
- };
- queryDateScroll(): {
- top: number;
- };
- applyDateScroll(scroll: any): void;
- renderHeadIntroHtml: () => string;
- renderDayGridNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
- renderDayGridBgIntroHtml: () => string;
- renderDayGridIntroHtml: () => string;
- }
-}
-
-declare module '@fullcalendar/daygrid/DayGridView' {
- import { DayHeader, ComponentContext, DateProfileGenerator, DateProfile, ViewProps, DayTable } from '@fullcalendar/core';
- import AbstractDayGridView from '@fullcalendar/daygrid/AbstractDayGridView';
- import SimpleDayGrid from '@fullcalendar/daygrid/SimpleDayGrid';
- export { DayGridView as default, DayGridView };
- class DayGridView extends AbstractDayGridView {
- header: DayHeader;
- simpleDayGrid: SimpleDayGrid;
- dayTable: DayTable;
- render(props: ViewProps, context: ComponentContext): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- }
- export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
-}
-
-declare module '@fullcalendar/daygrid/DayBgRow' {
- import { ComponentContext, DateMarker, DateProfile } from '@fullcalendar/core';
- export interface DayBgCell {
- date: DateMarker;
- htmlAttrs?: string;
- }
- export interface DayBgRowProps {
- cells: DayBgCell[];
- dateProfile: DateProfile;
- renderIntroHtml?: () => string;
- }
- export { DayBgRow as default, DayBgRow };
- class DayBgRow {
- context: ComponentContext;
- constructor(context: ComponentContext);
- renderHtml(props: DayBgRowProps): string;
- }
-}
-
-declare module '@fullcalendar/daygrid/Popover' {
- export interface PopoverOptions {
- className?: string;
- content?: (el: HTMLElement) => void;
- parentEl: HTMLElement;
- autoHide?: boolean;
- top?: number;
- left?: number;
- right?: number;
- viewportConstrain?: boolean;
- }
- export { Popover as default, Popover };
- class Popover {
- isHidden: boolean;
- options: PopoverOptions;
- el: HTMLElement;
- margin: number;
- constructor(options: PopoverOptions);
- show(): void;
- hide(): void;
- render(): void;
- documentMousedown: (ev: any) => void;
- destroy(): void;
- position(): void;
- trigger(name: any): void;
- }
-}
-
-declare module '@fullcalendar/daygrid/DayGridEventRenderer' {
- import { Seg } from '@fullcalendar/core';
- import DayGrid from '@fullcalendar/daygrid/DayGrid';
- import SimpleDayGridEventRenderer from '@fullcalendar/daygrid/SimpleDayGridEventRenderer';
- export { DayGridEventRenderer as default, DayGridEventRenderer };
- class DayGridEventRenderer extends SimpleDayGridEventRenderer {
- dayGrid: DayGrid;
- rowStructs: any;
- constructor(dayGrid: DayGrid);
- attachSegs(segs: Seg[], mirrorInfo: any): void;
- detachSegs(): void;
- renderSegRows(segs: Seg[]): any[];
- renderSegRow(row: any, rowSegs: any): {
- row: any;
- tbodyEl: HTMLTableSectionElement;
- cellMatrix: any[];
- segMatrix: any[];
- segLevels: any[];
- segs: any;
- };
- buildSegLevels(segs: Seg[]): any[];
- groupSegRows(segs: Seg[]): any[];
- computeDisplayEventEnd(): boolean;
- }
-}
-
-declare module '@fullcalendar/daygrid/DayTile' {
- import { DateComponent, Seg, Hit, DateMarker, ComponentContext, EventInstanceHash } from '@fullcalendar/core';
- import SimpleDayGridEventRenderer from '@fullcalendar/daygrid/SimpleDayGridEventRenderer';
- export interface DayTileProps {
- date: DateMarker;
- fgSegs: Seg[];
- eventSelection: string;
- eventDragInstances: EventInstanceHash;
- eventResizeInstances: EventInstanceHash;
- }
- export { DayTile as default, DayTile };
- class DayTile extends DateComponent<DayTileProps> {
- segContainerEl: HTMLElement;
- constructor(el: HTMLElement);
- firstContext(context: ComponentContext): void;
- render(props: DayTileProps, context: ComponentContext): void;
- destroy(): void;
- _renderFrame(date: DateMarker): void;
- queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
- }
- export class DayTileEventRenderer extends SimpleDayGridEventRenderer {
- dayTile: DayTile;
- constructor(dayTile: any);
- attachSegs(segs: Seg[]): void;
- detachSegs(segs: Seg[]): void;
- }
-}
-
-declare module '@fullcalendar/daygrid/SimpleDayGridEventRenderer' {
- import { FgEventRenderer, Seg } from '@fullcalendar/core';
- export { SimpleDayGridEventRenderer as default, SimpleDayGridEventRenderer };
- abstract class SimpleDayGridEventRenderer extends FgEventRenderer {
- renderSegHtml(seg: Seg, mirrorInfo: any): string;
- computeEventTimeFormat(): {
- hour: string;
- minute: string;
- omitZeroMinute: boolean;
- meridiem: string;
- };
- computeDisplayEventEnd(): boolean;
- }
-}
-
diff --git a/library/fullcalendar/packages/daygrid/main.esm.js b/library/fullcalendar/packages/daygrid/main.esm.js
deleted file mode 100644
index 5d33b7cfb..000000000
--- a/library/fullcalendar/packages/daygrid/main.esm.js
+++ /dev/null
@@ -1,1655 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { addWeeks, diffWeeks, DateProfileGenerator, createElement, listenBySelector, removeElement, computeRect, computeClippingRect, applyStyle, computeEventDraggable, computeEventStartResizable, computeEventEndResizable, cssToStr, htmlEscape, FgEventRenderer, appendToElement, prependToElement, htmlToElement, FillRenderer, memoizeRendering, createFormatter, addDays, DateComponent, rangeContainsMarker, getDayClasses, findElements, PositionCache, buildGotoAnchorHtml, findChildren, insertAfterElement, intersectRanges, memoize, ScrollComponent, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, distributeHeight, undistributeHeight, View, Slicer, DayHeader, DaySeries, DayTable, createPlugin } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-var DayGridDateProfileGenerator = /** @class */ (function (_super) {
- __extends(DayGridDateProfileGenerator, _super);
- function DayGridDateProfileGenerator() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- // Computes the date range that will be rendered.
- DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- var dateEnv = this.dateEnv;
- var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
- var start = renderRange.start;
- var end = renderRange.end;
- var endOfWeek;
- // year and month views should be aligned with weeks. this is already done for week
- if (/^(year|month)$/.test(currentRangeUnit)) {
- start = dateEnv.startOfWeek(start);
- // make end-of-week if not already
- endOfWeek = dateEnv.startOfWeek(end);
- if (endOfWeek.valueOf() !== end.valueOf()) {
- end = addWeeks(endOfWeek, 1);
- }
- }
- // ensure 6 weeks
- if (this.options.monthMode &&
- this.options.fixedWeekCount) {
- var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
- diffWeeks(start, end));
- end = addWeeks(end, 6 - rowCnt);
- }
- return { start: start, end: end };
- };
- return DayGridDateProfileGenerator;
-}(DateProfileGenerator));
-
-/* A rectangular panel that is absolutely positioned over other content
-------------------------------------------------------------------------------------------------------------------------
-Options:
- - className (string)
- - content (HTML string, element, or element array)
- - parentEl
- - top
- - left
- - right (the x coord of where the right edge should be. not a "CSS" right)
- - autoHide (boolean)
- - show (callback)
- - hide (callback)
-*/
-var Popover = /** @class */ (function () {
- function Popover(options) {
- var _this = this;
- this.isHidden = true;
- this.margin = 10; // the space required between the popover and the edges of the scroll container
- // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
- this.documentMousedown = function (ev) {
- // only hide the popover if the click happened outside the popover
- if (_this.el && !_this.el.contains(ev.target)) {
- _this.hide();
- }
- };
- this.options = options;
- }
- // Shows the popover on the specified position. Renders it if not already
- Popover.prototype.show = function () {
- if (this.isHidden) {
- if (!this.el) {
- this.render();
- }
- this.el.style.display = '';
- this.position();
- this.isHidden = false;
- this.trigger('show');
- }
- };
- // Hides the popover, through CSS, but does not remove it from the DOM
- Popover.prototype.hide = function () {
- if (!this.isHidden) {
- this.el.style.display = 'none';
- this.isHidden = true;
- this.trigger('hide');
- }
- };
- // Creates `this.el` and renders content inside of it
- Popover.prototype.render = function () {
- var _this = this;
- var options = this.options;
- var el = this.el = createElement('div', {
- className: 'fc-popover ' + (options.className || ''),
- style: {
- top: '0',
- left: '0'
- }
- });
- if (typeof options.content === 'function') {
- options.content(el);
- }
- options.parentEl.appendChild(el);
- // when a click happens on anything inside with a 'fc-close' className, hide the popover
- listenBySelector(el, 'click', '.fc-close', function (ev) {
- _this.hide();
- });
- if (options.autoHide) {
- document.addEventListener('mousedown', this.documentMousedown);
- }
- };
- // Hides and unregisters any handlers
- Popover.prototype.destroy = function () {
- this.hide();
- if (this.el) {
- removeElement(this.el);
- this.el = null;
- }
- document.removeEventListener('mousedown', this.documentMousedown);
- };
- // Positions the popover optimally, using the top/left/right options
- Popover.prototype.position = function () {
- var options = this.options;
- var el = this.el;
- var elDims = el.getBoundingClientRect(); // only used for width,height
- var origin = computeRect(el.offsetParent);
- var clippingRect = computeClippingRect(options.parentEl);
- var top; // the "position" (not "offset") values for the popover
- var left; //
- // compute top and left
- top = options.top || 0;
- if (options.left !== undefined) {
- left = options.left;
- }
- else if (options.right !== undefined) {
- left = options.right - elDims.width; // derive the left value from the right value
- }
- else {
- left = 0;
- }
- // constrain to the view port. if constrained by two edges, give precedence to top/left
- top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
- top = Math.max(top, clippingRect.top + this.margin);
- left = Math.min(left, clippingRect.right - elDims.width - this.margin);
- left = Math.max(left, clippingRect.left + this.margin);
- applyStyle(el, {
- top: top - origin.top,
- left: left - origin.left
- });
- };
- // Triggers a callback. Calls a function in the option hash of the same name.
- // Arguments beyond the first `name` are forwarded on.
- // TODO: better code reuse for this. Repeat code
- // can kill this???
- Popover.prototype.trigger = function (name) {
- if (this.options[name]) {
- this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
- }
- };
- return Popover;
-}());
-
-/* Event-rendering methods for the DayGrid class
-----------------------------------------------------------------------------------------------------------------------*/
-// "Simple" is bad a name. has nothing to do with SimpleDayGrid
-var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
- __extends(SimpleDayGridEventRenderer, _super);
- function SimpleDayGridEventRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- // Builds the HTML to be used for the default element for an individual segment
- SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
- var context = this.context;
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventUi = eventRange.ui;
- var allDay = eventDef.allDay;
- var isDraggable = computeEventDraggable(context, eventDef, eventUi);
- var isResizableFromStart = allDay && seg.isStart && computeEventStartResizable(context, eventDef, eventUi);
- var isResizableFromEnd = allDay && seg.isEnd && computeEventEndResizable(context, eventDef, eventUi);
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
- var skinCss = cssToStr(this.getSkinCss(eventUi));
- var timeHtml = '';
- var timeText;
- var titleHtml;
- classes.unshift('fc-day-grid-event', 'fc-h-event');
- // Only display a timed events time if it is the starting segment
- if (seg.isStart) {
- timeText = this.getTimeText(eventRange);
- if (timeText) {
- timeHtml = '<span class="fc-time">' + htmlEscape(timeText) + '</span>';
- }
- }
- titleHtml =
- '<span class="fc-title">' +
- (htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
- '</span>';
- return '<a class="' + classes.join(' ') + '"' +
- (eventDef.url ?
- ' href="' + htmlEscape(eventDef.url) + '"' :
- '') +
- (skinCss ?
- ' style="' + skinCss + '"' :
- '') +
- '>' +
- '<div class="fc-content">' +
- (context.options.dir === 'rtl' ?
- titleHtml + ' ' + timeHtml : // put a natural space in between
- timeHtml + ' ' + titleHtml //
- ) +
- '</div>' +
- (isResizableFromStart ?
- '<div class="fc-resizer fc-start-resizer"></div>' :
- '') +
- (isResizableFromEnd ?
- '<div class="fc-resizer fc-end-resizer"></div>' :
- '') +
- '</a>';
- };
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
- SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true,
- meridiem: 'narrow'
- };
- };
- SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return false; // TODO: somehow consider the originating DayGrid's column count
- };
- return SimpleDayGridEventRenderer;
-}(FgEventRenderer));
-
-/* Event-rendering methods for the DayGrid class
-----------------------------------------------------------------------------------------------------------------------*/
-var DayGridEventRenderer = /** @class */ (function (_super) {
- __extends(DayGridEventRenderer, _super);
- function DayGridEventRenderer(dayGrid) {
- var _this = _super.call(this) || this;
- _this.dayGrid = dayGrid;
- return _this;
- }
- // Renders the given foreground event segments onto the grid
- DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
- // append to each row's content skeleton
- this.dayGrid.rowEls.forEach(function (rowNode, i) {
- rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
- });
- // removes the "more.." events popover
- if (!mirrorInfo) {
- this.dayGrid.removeSegPopover();
- }
- };
- // Unrenders all currently rendered foreground event segments
- DayGridEventRenderer.prototype.detachSegs = function () {
- var rowStructs = this.rowStructs || [];
- var rowStruct;
- while ((rowStruct = rowStructs.pop())) {
- removeElement(rowStruct.tbodyEl);
- }
- this.rowStructs = null;
- };
- // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
- // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
- // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
- DayGridEventRenderer.prototype.renderSegRows = function (segs) {
- var rowStructs = [];
- var segRows;
- var row;
- segRows = this.groupSegRows(segs); // group into nested arrays
- // iterate each row of segment groupings
- for (row = 0; row < segRows.length; row++) {
- rowStructs.push(this.renderSegRow(row, segRows[row]));
- }
- return rowStructs;
- };
- // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
- // the segments. Returns object with a bunch of internal data about how the render was calculated.
- // NOTE: modifies rowSegs
- DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
- var isRtl = this.context.isRtl;
- var dayGrid = this.dayGrid;
- var colCnt = dayGrid.colCnt;
- var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
- var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
- var tbody = document.createElement('tbody');
- var segMatrix = []; // lookup for which segments are rendered into which level+col cells
- var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
- var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
- var i;
- var levelSegs;
- var col;
- var tr;
- var j;
- var seg;
- var td;
- // populates empty cells from the current column (`col`) to `endCol`
- function emptyCellsUntil(endCol) {
- while (col < endCol) {
- // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
- td = (loneCellMatrix[i - 1] || [])[col];
- if (td) {
- td.rowSpan = (td.rowSpan || 1) + 1;
- }
- else {
- td = document.createElement('td');
- tr.appendChild(td);
- }
- cellMatrix[i][col] = td;
- loneCellMatrix[i][col] = td;
- col++;
- }
- }
- for (i = 0; i < levelCnt; i++) { // iterate through all levels
- levelSegs = segLevels[i];
- col = 0;
- tr = document.createElement('tr');
- segMatrix.push([]);
- cellMatrix.push([]);
- loneCellMatrix.push([]);
- // levelCnt might be 1 even though there are no actual levels. protect against this.
- // this single empty row is useful for styling.
- if (levelSegs) {
- for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
- seg = levelSegs[j];
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- emptyCellsUntil(leftCol);
- // create a container that occupies or more columns. append the event element.
- td = createElement('td', { className: 'fc-event-container' }, seg.el);
- if (leftCol !== rightCol) {
- td.colSpan = rightCol - leftCol + 1;
- }
- else { // a single-column segment
- loneCellMatrix[i][col] = td;
- }
- while (col <= rightCol) {
- cellMatrix[i][col] = td;
- segMatrix[i][col] = seg;
- col++;
- }
- tr.appendChild(td);
- }
- }
- emptyCellsUntil(colCnt); // finish off the row
- var introHtml = dayGrid.renderProps.renderIntroHtml();
- if (introHtml) {
- if (isRtl) {
- appendToElement(tr, introHtml);
- }
- else {
- prependToElement(tr, introHtml);
- }
- }
- tbody.appendChild(tr);
- }
- return {
- row: row,
- tbodyEl: tbody,
- cellMatrix: cellMatrix,
- segMatrix: segMatrix,
- segLevels: segLevels,
- segs: rowSegs
- };
- };
- // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
- // NOTE: modifies segs
- DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
- var isRtl = this.context.isRtl;
- var colCnt = this.dayGrid.colCnt;
- var levels = [];
- var i;
- var seg;
- var j;
- // Give preference to elements with certain criteria, so they have
- // a chance to be closer to the top.
- segs = this.sortEventSegs(segs);
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
- for (j = 0; j < levels.length; j++) {
- if (!isDaySegCollision(seg, levels[j])) {
- break;
- }
- }
- // `j` now holds the desired subrow index
- seg.level = j;
- seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
- seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
- ;
- (levels[j] || (levels[j] = [])).push(seg);
- }
- // order segments left-to-right. very important if calendar is RTL
- for (j = 0; j < levels.length; j++) {
- levels[j].sort(compareDaySegCols);
- }
- return levels;
- };
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
- DayGridEventRenderer.prototype.groupSegRows = function (segs) {
- var segRows = [];
- var i;
- for (i = 0; i < this.dayGrid.rowCnt; i++) {
- segRows.push([]);
- }
- for (i = 0; i < segs.length; i++) {
- segRows[segs[i].row].push(segs[i]);
- }
- return segRows;
- };
- // Computes a default `displayEventEnd` value if one is not expliclty defined
- DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
- };
- return DayGridEventRenderer;
-}(SimpleDayGridEventRenderer));
-// Computes whether two segments' columns collide. They are assumed to be in the same row.
-function isDaySegCollision(seg, otherSegs) {
- var i;
- var otherSeg;
- for (i = 0; i < otherSegs.length; i++) {
- otherSeg = otherSegs[i];
- if (otherSeg.firstCol <= seg.lastCol &&
- otherSeg.lastCol >= seg.firstCol) {
- return true;
- }
- }
- return false;
-}
-// A cmp function for determining the leftmost event
-function compareDaySegCols(a, b) {
- return a.leftCol - b.leftCol;
-}
-
-var DayGridMirrorRenderer = /** @class */ (function (_super) {
- __extends(DayGridMirrorRenderer, _super);
- function DayGridMirrorRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var sourceSeg = mirrorInfo.sourceSeg;
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
- // inject each new event skeleton into each associated row
- this.dayGrid.rowEls.forEach(function (rowNode, row) {
- var skeletonEl = htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
- var skeletonTopEl;
- var skeletonTop;
- // If there is an original segment, match the top position. Otherwise, put it at the row's top level
- if (sourceSeg && sourceSeg.row === row) {
- skeletonTopEl = sourceSeg.el;
- }
- else {
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
- if (!skeletonTopEl) { // when no events
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
- }
- }
- skeletonTop = skeletonTopEl.getBoundingClientRect().top -
- rowNode.getBoundingClientRect().top; // the offsetParent origin
- skeletonEl.style.top = skeletonTop + 'px';
- skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
- rowNode.appendChild(skeletonEl);
- });
- };
- return DayGridMirrorRenderer;
-}(DayGridEventRenderer));
-
-var EMPTY_CELL_HTML = '<td style="pointer-events:none"></td>';
-var DayGridFillRenderer = /** @class */ (function (_super) {
- __extends(DayGridFillRenderer, _super);
- function DayGridFillRenderer(dayGrid) {
- var _this = _super.call(this) || this;
- _this.fillSegTag = 'td'; // override the default tag name
- _this.dayGrid = dayGrid;
- return _this;
- }
- DayGridFillRenderer.prototype.renderSegs = function (type, context, segs) {
- // don't render timed background events
- if (type === 'bgEvent') {
- segs = segs.filter(function (seg) {
- return seg.eventRange.def.allDay;
- });
- }
- _super.prototype.renderSegs.call(this, type, context, segs);
- };
- DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
- var els = [];
- var i;
- var seg;
- var skeletonEl;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- skeletonEl = this.renderFillRow(type, seg);
- this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
- els.push(skeletonEl);
- }
- return els;
- };
- // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
- DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
- var dayGrid = this.dayGrid;
- var isRtl = this.context.isRtl;
- var colCnt = dayGrid.colCnt;
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- var startCol = leftCol;
- var endCol = rightCol + 1;
- var className;
- var skeletonEl;
- var trEl;
- if (type === 'businessHours') {
- className = 'bgevent';
- }
- else {
- className = type.toLowerCase();
- }
- skeletonEl = htmlToElement('<div class="fc-' + className + '-skeleton">' +
- '<table><tr></tr></table>' +
- '</div>');
- trEl = skeletonEl.getElementsByTagName('tr')[0];
- if (startCol > 0) {
- appendToElement(trEl,
- // will create (startCol + 1) td's
- new Array(startCol + 1).join(EMPTY_CELL_HTML));
- }
- seg.el.colSpan = endCol - startCol;
- trEl.appendChild(seg.el);
- if (endCol < colCnt) {
- appendToElement(trEl,
- // will create (colCnt - endCol) td's
- new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML));
- }
- var introHtml = dayGrid.renderProps.renderIntroHtml();
- if (introHtml) {
- if (isRtl) {
- appendToElement(trEl, introHtml);
- }
- else {
- prependToElement(trEl, introHtml);
- }
- }
- return skeletonEl;
- };
- return DayGridFillRenderer;
-}(FillRenderer));
-
-var DayTile = /** @class */ (function (_super) {
- __extends(DayTile, _super);
- function DayTile(el) {
- var _this = _super.call(this, el) || this;
- var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
- var renderFrame = _this.renderFrame = memoizeRendering(_this._renderFrame);
- _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
- _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
- _this.renderEventResize = memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
- return _this;
- }
- DayTile.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.el,
- useEventCenter: false
- });
- };
- DayTile.prototype.render = function (props, context) {
- this.renderFrame(props.date);
- this.renderFgEvents(context, props.fgSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDragInstances);
- this.renderEventResize(props.eventResizeInstances);
- };
- DayTile.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderFrame.unrender(); // should unrender everything else
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- DayTile.prototype._renderFrame = function (date) {
- var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var title = dateEnv.format(date, createFormatter(options.dayPopoverFormat) // TODO: cache
- );
- this.el.innerHTML =
- '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
- '<span class="fc-title">' +
- htmlEscape(title) +
- '</span>' +
- '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
- '</div>' +
- '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
- '<div class="fc-event-container"></div>' +
- '</div>';
- this.segContainerEl = this.el.querySelector('.fc-event-container');
- };
- DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- var date = this.props.date; // HACK
- if (positionLeft < elWidth && positionTop < elHeight) {
- return {
- component: this,
- dateSpan: {
- allDay: true,
- range: { start: date, end: addDays(date, 1) }
- },
- dayEl: this.el,
- rect: {
- left: 0,
- top: 0,
- right: elWidth,
- bottom: elHeight
- },
- layer: 1
- };
- }
- };
- return DayTile;
-}(DateComponent));
-var DayTileEventRenderer = /** @class */ (function (_super) {
- __extends(DayTileEventRenderer, _super);
- function DayTileEventRenderer(dayTile) {
- var _this = _super.call(this) || this;
- _this.dayTile = dayTile;
- return _this;
- }
- DayTileEventRenderer.prototype.attachSegs = function (segs) {
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- this.dayTile.segContainerEl.appendChild(seg.el);
- }
- };
- DayTileEventRenderer.prototype.detachSegs = function (segs) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- removeElement(seg.el);
- }
- };
- return DayTileEventRenderer;
-}(SimpleDayGridEventRenderer));
-
-var DayBgRow = /** @class */ (function () {
- function DayBgRow(context) {
- this.context = context;
- }
- DayBgRow.prototype.renderHtml = function (props) {
- var parts = [];
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
- var cell = _a[_i];
- parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
- }
- if (!props.cells.length) {
- parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
- }
- if (this.context.options.dir === 'rtl') {
- parts.reverse();
- }
- return '<tr>' + parts.join('') + '</tr>';
- };
- return DayBgRow;
-}());
-function renderCellHtml(date, dateProfile, context, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme;
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
- var classes = getDayClasses(date, dateProfile, context);
- classes.unshift('fc-day', theme.getClass('widgetContent'));
- return '<td class="' + classes.join(' ') + '"' +
- (isDateValid ?
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '></td>';
-}
-
-var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
-var WEEK_NUM_FORMAT = createFormatter({ week: 'numeric' });
-var DayGrid = /** @class */ (function (_super) {
- __extends(DayGrid, _super);
- function DayGrid(el, renderProps) {
- var _this = _super.call(this, el) || this;
- _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
- _this.isCellSizesDirty = false;
- _this.renderProps = renderProps;
- var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
- var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
- _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
- var renderCells = _this.renderCells = memoizeRendering(_this._renderCells, _this._unrenderCells);
- _this.renderBusinessHours = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
- _this.renderDateSelection = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
- _this.renderBgEvents = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
- _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
- _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
- _this.renderEventResize = memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
- return _this;
- }
- DayGrid.prototype.render = function (props, context) {
- var cells = props.cells;
- this.rowCnt = cells.length;
- this.colCnt = cells[0].length;
- this.renderCells(cells, props.isRigid);
- this.renderBusinessHours(context, props.businessHourSegs);
- this.renderDateSelection(context, props.dateSelectionSegs);
- this.renderBgEvents(context, props.bgEventSegs);
- this.renderFgEvents(context, props.fgEventSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDrag);
- this.renderEventResize(props.eventResize);
- if (this.segPopoverTile) {
- this.updateSegPopoverTile();
- }
- };
- DayGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderCells.unrender(); // will unrender everything else
- };
- DayGrid.prototype.getCellRange = function (row, col) {
- var start = this.props.cells[row][col].date;
- var end = addDays(start, 1);
- return { start: start, end: end };
- };
- DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
- var ownProps = this.props;
- this.segPopoverTile.receiveProps({
- date: date || this.segPopoverTile.props.date,
- fgSegs: segs || this.segPopoverTile.props.fgSegs,
- eventSelection: ownProps.eventSelection,
- eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
- eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
- }, this.context);
- };
- /* Date Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderCells = function (cells, isRigid) {
- var _a = this.context, calendar = _a.calendar, view = _a.view, isRtl = _a.isRtl, dateEnv = _a.dateEnv;
- var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
- var html = '';
- var row;
- var col;
- for (row = 0; row < rowCnt; row++) {
- html += this.renderDayRowHtml(row, isRigid);
- }
- this.el.innerHTML = html;
- this.rowEls = findElements(this.el, '.fc-row');
- this.cellEls = findElements(this.el, '.fc-day, .fc-disabled-day');
- if (isRtl) {
- this.cellEls.reverse();
- }
- this.rowPositions = new PositionCache(this.el, this.rowEls, false, true // vertical
- );
- this.colPositions = new PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
- true, false // horizontal
- );
- // trigger dayRender with each cell's element
- for (row = 0; row < rowCnt; row++) {
- for (col = 0; col < colCnt; col++) {
- calendar.publiclyTrigger('dayRender', [
- {
- date: dateEnv.toDate(cells[row][col].date),
- el: this.getCellEl(row, col),
- view: view
- }
- ]);
- }
- }
- this.isCellSizesDirty = true;
- };
- DayGrid.prototype._unrenderCells = function () {
- this.removeSegPopover();
- };
- // Generates the HTML for a single row, which is a div that wraps a table.
- // `row` is the row number.
- DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
- var theme = this.context.theme;
- var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
- if (isRigid) {
- classes.push('fc-rigid');
- }
- var bgRow = new DayBgRow(this.context);
- return '' +
- '<div class="' + classes.join(' ') + '">' +
- '<div class="fc-bg">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- bgRow.renderHtml({
- cells: this.props.cells[row],
- dateProfile: this.props.dateProfile,
- renderIntroHtml: this.renderProps.renderBgIntroHtml
- }) +
- '</table>' +
- '</div>' +
- '<div class="fc-content-skeleton">' +
- '<table>' +
- (this.getIsNumbersVisible() ?
- '<thead>' +
- this.renderNumberTrHtml(row) +
- '</thead>' :
- '') +
- '</table>' +
- '</div>' +
- '</div>';
- };
- DayGrid.prototype.getIsNumbersVisible = function () {
- return this.getIsDayNumbersVisible() ||
- this.renderProps.cellWeekNumbersVisible ||
- this.renderProps.colWeekNumbersVisible;
- };
- DayGrid.prototype.getIsDayNumbersVisible = function () {
- return this.rowCnt > 1;
- };
- /* Grid Number Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.renderNumberTrHtml = function (row) {
- var isRtl = this.context.isRtl;
- var intro = this.renderProps.renderNumberIntroHtml(row, this);
- return '' +
- '<tr>' +
- (isRtl ? '' : intro) +
- this.renderNumberCellsHtml(row) +
- (isRtl ? intro : '') +
- '</tr>';
- };
- DayGrid.prototype.renderNumberCellsHtml = function (row) {
- var htmls = [];
- var col;
- var date;
- for (col = 0; col < this.colCnt; col++) {
- date = this.props.cells[row][col].date;
- htmls.push(this.renderNumberCellHtml(date));
- }
- if (this.context.isRtl) {
- htmls.reverse();
- }
- return htmls.join('');
- };
- // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
- // The number row will only exist if either day numbers or week numbers are turned on.
- DayGrid.prototype.renderNumberCellHtml = function (date) {
- var _a = this.context, dateEnv = _a.dateEnv, options = _a.options;
- var html = '';
- var isDateValid = rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
- var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
- var classes;
- var weekCalcFirstDow;
- if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
- // no numbers in day cell (week number must be along the side)
- return '<td></td>'; // will create an empty space above events :(
- }
- classes = getDayClasses(date, this.props.dateProfile, this.context);
- classes.unshift('fc-day-top');
- if (this.renderProps.cellWeekNumbersVisible) {
- weekCalcFirstDow = dateEnv.weekDow;
- }
- html += '<td class="' + classes.join(' ') + '"' +
- (isDateValid ?
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
- '') +
- '>';
- if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
- html += buildGotoAnchorHtml(options, dateEnv, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
- );
- }
- if (isDayNumberVisible) {
- html += buildGotoAnchorHtml(options, dateEnv, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
- );
- }
- html += '</td>';
- return html;
- };
- /* Sizing
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.updateSize = function (isResize) {
- var calendar = this.context.calendar;
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
- if (isResize ||
- this.isCellSizesDirty ||
- calendar.isEventsUpdated // hack
- ) {
- this.buildPositionCaches();
- this.isCellSizesDirty = false;
- }
- fillRenderer.computeSizes(isResize);
- eventRenderer.computeSizes(isResize);
- mirrorRenderer.computeSizes(isResize);
- fillRenderer.assignSizes(isResize);
- eventRenderer.assignSizes(isResize);
- mirrorRenderer.assignSizes(isResize);
- };
- DayGrid.prototype.buildPositionCaches = function () {
- this.buildColPositions();
- this.buildRowPositions();
- };
- DayGrid.prototype.buildColPositions = function () {
- this.colPositions.build();
- };
- DayGrid.prototype.buildRowPositions = function () {
- this.rowPositions.build();
- this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
- };
- /* Hit System
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
- var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
- var col = colPositions.leftToIndex(leftPosition);
- var row = rowPositions.topToIndex(topPosition);
- if (row != null && col != null) {
- return {
- row: row,
- col: col,
- dateSpan: {
- range: this.getCellRange(row, col),
- allDay: true
- },
- dayEl: this.getCellEl(row, col),
- relativeRect: {
- left: colPositions.lefts[col],
- right: colPositions.rights[col],
- top: rowPositions.tops[row],
- bottom: rowPositions.bottoms[row]
- }
- };
- }
- };
- /* Cell System
- ------------------------------------------------------------------------------------------------------------------*/
- // FYI: the first column is the leftmost column, regardless of date
- DayGrid.prototype.getCellEl = function (row, col) {
- return this.cellEls[row * this.colCnt + col];
- };
- /* Event Drag Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- }
- };
- DayGrid.prototype._unrenderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.fillRenderer.unrender('highlight', this.context);
- }
- };
- /* Event Resize Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderEventResize = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- DayGrid.prototype._unrenderEventResize = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.fillRenderer.unrender('highlight', this.context);
- this.mirrorRenderer.unrender(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- /* More+ Link Popover
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.removeSegPopover = function () {
- if (this.segPopover) {
- this.segPopover.hide(); // in handler, will call segPopover's removeElement
- }
- };
- // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
- // `levelLimit` can be false (don't limit), a number, or true (should be computed).
- DayGrid.prototype.limitRows = function (levelLimit) {
- var rowStructs = this.eventRenderer.rowStructs || [];
- var row; // row #
- var rowLevelLimit;
- for (row = 0; row < rowStructs.length; row++) {
- this.unlimitRow(row);
- if (!levelLimit) {
- rowLevelLimit = false;
- }
- else if (typeof levelLimit === 'number') {
- rowLevelLimit = levelLimit;
- }
- else {
- rowLevelLimit = this.computeRowLevelLimit(row);
- }
- if (rowLevelLimit !== false) {
- this.limitRow(row, rowLevelLimit);
- }
- }
- };
- // Computes the number of levels a row will accomodate without going outside its bounds.
- // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
- // `row` is the row number.
- DayGrid.prototype.computeRowLevelLimit = function (row) {
- var rowEl = this.rowEls[row]; // the containing "fake" row div
- var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
- var trEls = findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
- var i;
- var trEl;
- // Reveal one level <tr> at a time and stop when we find one out of bounds
- for (i = 0; i < trEls.length; i++) {
- trEl = trEls[i];
- trEl.classList.remove('fc-limited'); // reset to original state (reveal)
- if (trEl.getBoundingClientRect().bottom > rowBottom) {
- return i;
- }
- }
- return false; // should not limit at all
- };
- // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
- // `row` is the row number.
- // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
- DayGrid.prototype.limitRow = function (row, levelLimit) {
- var _this = this;
- var colCnt = this.colCnt;
- var isRtl = this.context.isRtl;
- var rowStruct = this.eventRenderer.rowStructs[row];
- var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
- var col = 0; // col #, left-to-right (not chronologically)
- var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
- var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
- var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
- var i;
- var seg;
- var segsBelow; // array of segment objects below `seg` in the current `col`
- var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
- var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
- var td;
- var rowSpan;
- var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
- var j;
- var moreTd;
- var moreWrap;
- var moreLink;
- // Iterates through empty level cells and places "more" links inside if need be
- var emptyCellsUntil = function (endCol) {
- while (col < endCol) {
- segsBelow = _this.getCellSegs(row, col, levelLimit);
- if (segsBelow.length) {
- td = cellMatrix[levelLimit - 1][col];
- moreLink = _this.renderMoreLink(row, col, segsBelow);
- moreWrap = createElement('div', null, moreLink);
- td.appendChild(moreWrap);
- moreNodes.push(moreWrap);
- }
- col++;
- }
- };
- if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
- levelSegs = rowStruct.segLevels[levelLimit - 1];
- cellMatrix = rowStruct.cellMatrix;
- limitedNodes = findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
- limitedNodes.forEach(function (node) {
- node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
- });
- // iterate though segments in the last allowable level
- for (i = 0; i < levelSegs.length; i++) {
- seg = levelSegs[i];
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- emptyCellsUntil(leftCol); // process empty cells before the segment
- // determine *all* segments below `seg` that occupy the same columns
- colSegsBelow = [];
- totalSegsBelow = 0;
- while (col <= rightCol) {
- segsBelow = this.getCellSegs(row, col, levelLimit);
- colSegsBelow.push(segsBelow);
- totalSegsBelow += segsBelow.length;
- col++;
- }
- if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
- td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
- rowSpan = td.rowSpan || 1;
- segMoreNodes = [];
- // make a replacement <td> for each column the segment occupies. will be one for each colspan
- for (j = 0; j < colSegsBelow.length; j++) {
- moreTd = createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
- segsBelow = colSegsBelow[j];
- moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
- );
- moreWrap = createElement('div', null, moreLink);
- moreTd.appendChild(moreWrap);
- segMoreNodes.push(moreTd);
- moreNodes.push(moreTd);
- }
- td.classList.add('fc-limited');
- insertAfterElement(td, segMoreNodes);
- limitedNodes.push(td);
- }
- }
- emptyCellsUntil(this.colCnt); // finish off the level
- rowStruct.moreEls = moreNodes; // for easy undoing later
- rowStruct.limitedEls = limitedNodes; // for easy undoing later
- }
- };
- // Reveals all levels and removes all "more"-related elements for a grid's row.
- // `row` is a row number.
- DayGrid.prototype.unlimitRow = function (row) {
- var rowStruct = this.eventRenderer.rowStructs[row];
- if (rowStruct.moreEls) {
- rowStruct.moreEls.forEach(removeElement);
- rowStruct.moreEls = null;
- }
- if (rowStruct.limitedEls) {
- rowStruct.limitedEls.forEach(function (limitedEl) {
- limitedEl.classList.remove('fc-limited');
- });
- rowStruct.limitedEls = null;
- }
- };
- // Renders an <a> element that represents hidden event element for a cell.
- // Responsible for attaching click handler as well.
- DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, view = _a.view, dateEnv = _a.dateEnv, options = _a.options, isRtl = _a.isRtl;
- var a = createElement('a', { className: 'fc-more' });
- a.innerText = this.getMoreLinkText(hiddenSegs.length);
- a.addEventListener('click', function (ev) {
- var clickOption = options.eventLimitClick;
- var _col = isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
- var date = _this.props.cells[row][_col].date;
- var moreEl = ev.currentTarget;
- var dayEl = _this.getCellEl(row, col);
- var allSegs = _this.getCellSegs(row, col);
- // rescope the segments to be within the cell's date
- var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
- var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
- if (typeof clickOption === 'function') {
- // the returned value can be an atomic option
- clickOption = calendar.publiclyTrigger('eventLimitClick', [
- {
- date: dateEnv.toDate(date),
- allDay: true,
- dayEl: dayEl,
- moreEl: moreEl,
- segs: reslicedAllSegs,
- hiddenSegs: reslicedHiddenSegs,
- jsEvent: ev,
- view: view
- }
- ]);
- }
- if (clickOption === 'popover') {
- _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
- }
- else if (typeof clickOption === 'string') { // a view name
- calendar.zoomTo(date, clickOption);
- }
- });
- return a;
- };
- // Reveals the popover that displays all events within a cell
- DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, view = _a.view, theme = _a.theme, isRtl = _a.isRtl;
- var _col = isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
- var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
- var topEl; // the element we want to match the top coordinate of
- var options;
- if (this.rowCnt === 1) {
- topEl = view.el; // will cause the popover to cover any sort of header
- }
- else {
- topEl = this.rowEls[row]; // will align with top of row
- }
- options = {
- className: 'fc-more-popover ' + theme.getClass('popover'),
- parentEl: view.el,
- top: computeRect(topEl).top,
- autoHide: true,
- content: function (el) {
- _this.segPopoverTile = new DayTile(el);
- _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
- },
- hide: function () {
- _this.segPopoverTile.destroy();
- _this.segPopoverTile = null;
- _this.segPopover.destroy();
- _this.segPopover = null;
- }
- };
- // Determine horizontal coordinate.
- // We use the moreWrap instead of the <td> to avoid border confusion.
- if (isRtl) {
- options.right = computeRect(moreWrap).right + 1; // +1 to be over cell border
- }
- else {
- options.left = computeRect(moreWrap).left - 1; // -1 to be over cell border
- }
- this.segPopover = new Popover(options);
- this.segPopover.show();
- calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
- };
- // Given the events within an array of segment objects, reslice them to be in a single day
- DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
- var dayStart = dayDate;
- var dayEnd = addDays(dayStart, 1);
- var dayRange = { start: dayStart, end: dayEnd };
- var newSegs = [];
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- var eventRange = seg.eventRange;
- var origRange = eventRange.range;
- var slicedRange = intersectRanges(origRange, dayRange);
- if (slicedRange) {
- newSegs.push(__assign({}, seg, { eventRange: {
- def: eventRange.def,
- ui: __assign({}, eventRange.ui, { durationEditable: false }),
- instance: eventRange.instance,
- range: slicedRange
- }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
- }
- }
- return newSegs;
- };
- // Generates the text that should be inside a "more" link, given the number of events it represents
- DayGrid.prototype.getMoreLinkText = function (num) {
- var opt = this.context.options.eventLimitText;
- if (typeof opt === 'function') {
- return opt(num);
- }
- else {
- return '+' + num + ' ' + opt;
- }
- };
- // Returns segments within a given cell.
- // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
- DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
- var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
- var level = startLevel || 0;
- var segs = [];
- var seg;
- while (level < segMatrix.length) {
- seg = segMatrix[level][col];
- if (seg) {
- segs.push(seg);
- }
- level++;
- }
- return segs;
- };
- return DayGrid;
-}(DateComponent));
-
-var WEEK_NUM_FORMAT$1 = createFormatter({ week: 'numeric' });
-/* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
-----------------------------------------------------------------------------------------------------------------------*/
-// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
-// It is responsible for managing width/height.
-var AbstractDayGridView = /** @class */ (function (_super) {
- __extends(AbstractDayGridView, _super);
- function AbstractDayGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.processOptions = memoize(_this._processOptions);
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- /* Header Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before the day-of week header cells
- _this.renderHeadIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, options = _a.options;
- if (_this.colWeekNumbersVisible) {
- return '' +
- '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
- '<span>' + // needed for matchCellWidths
- htmlEscape(options.weekLabel) +
- '</span>' +
- '</th>';
- }
- return '';
- };
- /* Day Grid Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
- _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
- var _a = _this.context, options = _a.options, dateEnv = _a.dateEnv;
- var weekStart = dayGrid.props.cells[row][0].date;
- if (_this.colWeekNumbersVisible) {
- return '' +
- '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
- buildGotoAnchorHtml(// aside from link, important for matchCellWidths
- options, dateEnv, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
- ) +
- '</td>';
- }
- return '';
- };
- // Generates the HTML that goes before the day bg cells for each day-row
- _this.renderDayGridBgIntroHtml = function () {
- var theme = _this.context.theme;
- if (_this.colWeekNumbersVisible) {
- return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
- }
- return '';
- };
- // Generates the HTML that goes before every other type of row generated by DayGrid.
- // Affects mirror-skeleton and highlight-skeleton rows.
- _this.renderDayGridIntroHtml = function () {
- if (_this.colWeekNumbersVisible) {
- return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
- }
- return '';
- };
- return _this;
- }
- AbstractDayGridView.prototype._processOptions = function (options) {
- if (options.weekNumbers) {
- if (options.weekNumbersWithinDays) {
- this.cellWeekNumbersVisible = true;
- this.colWeekNumbersVisible = false;
- }
- else {
- this.cellWeekNumbersVisible = false;
- this.colWeekNumbersVisible = true;
- }
- }
- else {
- this.colWeekNumbersVisible = false;
- this.cellWeekNumbersVisible = false;
- }
- };
- AbstractDayGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- this.processOptions(context.options);
- this.renderSkeleton(context);
- };
- AbstractDayGridView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- AbstractDayGridView.prototype._renderSkeleton = function (context) {
- this.el.classList.add('fc-dayGrid-view');
- this.el.innerHTML = this.renderSkeletonHtml();
- this.scroller = new ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- var dayGridContainerEl = this.scroller.el;
- this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
- dayGridContainerEl.classList.add('fc-day-grid-container');
- var dayGridEl = createElement('div', { className: 'fc-day-grid' });
- dayGridContainerEl.appendChild(dayGridEl);
- this.dayGrid = new DayGrid(dayGridEl, {
- renderNumberIntroHtml: this.renderDayGridNumberIntroHtml,
- renderBgIntroHtml: this.renderDayGridBgIntroHtml,
- renderIntroHtml: this.renderDayGridIntroHtml,
- colWeekNumbersVisible: this.colWeekNumbersVisible,
- cellWeekNumbersVisible: this.cellWeekNumbersVisible
- });
- };
- AbstractDayGridView.prototype._unrenderSkeleton = function () {
- this.el.classList.remove('fc-dayGrid-view');
- this.dayGrid.destroy();
- this.scroller.destroy();
- };
- // Builds the HTML skeleton for the view.
- // The day-grid component will render inside of a container defined by this HTML.
- AbstractDayGridView.prototype.renderSkeletonHtml = function () {
- var _a = this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- (options.columnHeader ?
- '<thead class="fc-head">' +
- '<tr>' +
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
- '</tr>' +
- '</thead>' :
- '') +
- '<tbody class="fc-body">' +
- '<tr>' +
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
- '</tr>' +
- '</tbody>' +
- '</table>';
- };
- // Generates an HTML attribute string for setting the width of the week number column, if it is known
- AbstractDayGridView.prototype.weekNumberStyleAttr = function () {
- if (this.weekNumberWidth != null) {
- return 'style="width:' + this.weekNumberWidth + 'px"';
- }
- return '';
- };
- // Determines whether each row should have a constant height
- AbstractDayGridView.prototype.hasRigidRows = function () {
- var eventLimit = this.context.options.eventLimit;
- return eventLimit && typeof eventLimit !== 'number';
- };
- /* Dimensions
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractDayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
- this.dayGrid.updateSize(isResize);
- };
- // Refreshes the horizontal dimensions of the view
- AbstractDayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- var dayGrid = this.dayGrid;
- var eventLimit = this.context.options.eventLimit;
- var headRowEl = this.header ? this.header.el : null; // HACK
- var scrollerHeight;
- var scrollbarWidths;
- // hack to give the view some height prior to dayGrid's columns being rendered
- // TODO: separate setting height from scroller VS dayGrid.
- if (!dayGrid.rowEls) {
- if (!isAuto) {
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- return;
- }
- if (this.colWeekNumbersVisible) {
- // Make sure all week number cells running down the side have the same width.
- this.weekNumberWidth = matchCellWidths(findElements(this.el, '.fc-week-number'));
- }
- // reset all heights to be natural
- this.scroller.clear();
- if (headRowEl) {
- uncompensateScroll(headRowEl);
- }
- dayGrid.removeSegPopover(); // kill the "more" popover if displayed
- // is the event limit a constant level number?
- if (eventLimit && typeof eventLimit === 'number') {
- dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
- }
- // distribute the height to the rows
- // (viewHeight is a "recommended" value if isAuto)
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.setGridHeight(scrollerHeight, isAuto);
- // is the event limit dynamically calculated?
- if (eventLimit && typeof eventLimit !== 'number') {
- dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
- }
- if (!isAuto) { // should we force dimensions of the scroll container?
- this.scroller.setHeight(scrollerHeight);
- scrollbarWidths = this.scroller.getScrollbarWidths();
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
- if (headRowEl) {
- compensateScroll(headRowEl, scrollbarWidths);
- }
- // doing the scrollbar compensation might have created text overflow which created more height. redo
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- // guarantees the same scrollbar widths
- this.scroller.lockOverflow(scrollbarWidths);
- }
- };
- // given a desired total height of the view, returns what the height of the scroller should be
- AbstractDayGridView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- // Sets the height of just the DayGrid component in this view
- AbstractDayGridView.prototype.setGridHeight = function (height, isAuto) {
- if (this.context.options.monthMode) {
- // if auto, make the height of each row the height that it would be if there were 6 weeks
- if (isAuto) {
- height *= this.dayGrid.rowCnt / 6;
- }
- distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
- }
- else {
- if (isAuto) {
- undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
- }
- else {
- distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
- }
- }
- };
- /* Scroll
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractDayGridView.prototype.computeDateScroll = function (duration) {
- return { top: 0 };
- };
- AbstractDayGridView.prototype.queryDateScroll = function () {
- return { top: this.scroller.getScrollTop() };
- };
- AbstractDayGridView.prototype.applyDateScroll = function (scroll) {
- if (scroll.top !== undefined) {
- this.scroller.setScrollTop(scroll.top);
- }
- };
- return AbstractDayGridView;
-}(View));
-AbstractDayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
-
-var SimpleDayGrid = /** @class */ (function (_super) {
- __extends(SimpleDayGrid, _super);
- function SimpleDayGrid(dayGrid) {
- var _this = _super.call(this, dayGrid.el) || this;
- _this.slicer = new DayGridSlicer();
- _this.dayGrid = dayGrid;
- return _this;
- }
- SimpleDayGrid.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, { el: this.dayGrid.el });
- };
- SimpleDayGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- SimpleDayGrid.prototype.render = function (props, context) {
- var dayGrid = this.dayGrid;
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
- dayGrid.receiveContext(context); // hack because context is used in sliceProps
- dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, context.calendar, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }), context);
- };
- SimpleDayGrid.prototype.buildPositionCaches = function () {
- this.dayGrid.buildPositionCaches();
- };
- SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
- var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
- if (rawHit) {
- return {
- component: this.dayGrid,
- dateSpan: rawHit.dateSpan,
- dayEl: rawHit.dayEl,
- rect: {
- left: rawHit.relativeRect.left,
- right: rawHit.relativeRect.right,
- top: rawHit.relativeRect.top,
- bottom: rawHit.relativeRect.bottom
- },
- layer: 0
- };
- }
- };
- return SimpleDayGrid;
-}(DateComponent));
-var DayGridSlicer = /** @class */ (function (_super) {
- __extends(DayGridSlicer, _super);
- function DayGridSlicer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
- return dayTable.sliceRange(dateRange);
- };
- return DayGridSlicer;
-}(Slicer));
-
-var DayGridView = /** @class */ (function (_super) {
- __extends(DayGridView, _super);
- function DayGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.buildDayTable = memoize(buildDayTable);
- return _this;
- }
- DayGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context); // will call _renderSkeleton/_unrenderSkeleton
- var dateProfile = this.props.dateProfile;
- var dayTable = this.dayTable =
- this.buildDayTable(dateProfile, props.dateProfileGenerator);
- if (this.header) {
- this.header.receiveProps({
- dateProfile: dateProfile,
- dates: dayTable.headerDates,
- datesRepDistinctDays: dayTable.rowCnt === 1,
- renderIntroHtml: this.renderHeadIntroHtml
- }, context);
- }
- this.simpleDayGrid.receiveProps({
- dateProfile: dateProfile,
- dayTable: dayTable,
- businessHours: props.businessHours,
- dateSelection: props.dateSelection,
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize,
- isRigid: this.hasRigidRows(),
- nextDayThreshold: this.context.nextDayThreshold
- }, context);
- };
- DayGridView.prototype._renderSkeleton = function (context) {
- _super.prototype._renderSkeleton.call(this, context);
- if (context.options.columnHeader) {
- this.header = new DayHeader(this.el.querySelector('.fc-head-container'));
- }
- this.simpleDayGrid = new SimpleDayGrid(this.dayGrid);
- };
- DayGridView.prototype._unrenderSkeleton = function () {
- _super.prototype._unrenderSkeleton.call(this);
- if (this.header) {
- this.header.destroy();
- }
- this.simpleDayGrid.destroy();
- };
- return DayGridView;
-}(AbstractDayGridView));
-function buildDayTable(dateProfile, dateProfileGenerator) {
- var daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator);
- return new DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
-}
-
-var main = createPlugin({
- defaultView: 'dayGridMonth',
- views: {
- dayGrid: DayGridView,
- dayGridDay: {
- type: 'dayGrid',
- duration: { days: 1 }
- },
- dayGridWeek: {
- type: 'dayGrid',
- duration: { weeks: 1 }
- },
- dayGridMonth: {
- type: 'dayGrid',
- duration: { months: 1 },
- monthMode: true,
- fixedWeekCount: true
- }
- }
-});
-
-export default main;
-export { AbstractDayGridView, DayBgRow, DayGrid, DayGridSlicer, DayGridView, SimpleDayGrid, buildDayTable as buildBasicDayTable };
diff --git a/library/fullcalendar/packages/daygrid/main.js b/library/fullcalendar/packages/daygrid/main.js
deleted file mode 100644
index 8ccdef25d..000000000
--- a/library/fullcalendar/packages/daygrid/main.js
+++ /dev/null
@@ -1,1669 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- var DayGridDateProfileGenerator = /** @class */ (function (_super) {
- __extends(DayGridDateProfileGenerator, _super);
- function DayGridDateProfileGenerator() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- // Computes the date range that will be rendered.
- DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
- var dateEnv = this.dateEnv;
- var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
- var start = renderRange.start;
- var end = renderRange.end;
- var endOfWeek;
- // year and month views should be aligned with weeks. this is already done for week
- if (/^(year|month)$/.test(currentRangeUnit)) {
- start = dateEnv.startOfWeek(start);
- // make end-of-week if not already
- endOfWeek = dateEnv.startOfWeek(end);
- if (endOfWeek.valueOf() !== end.valueOf()) {
- end = core.addWeeks(endOfWeek, 1);
- }
- }
- // ensure 6 weeks
- if (this.options.monthMode &&
- this.options.fixedWeekCount) {
- var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
- core.diffWeeks(start, end));
- end = core.addWeeks(end, 6 - rowCnt);
- }
- return { start: start, end: end };
- };
- return DayGridDateProfileGenerator;
- }(core.DateProfileGenerator));
-
- /* A rectangular panel that is absolutely positioned over other content
- ------------------------------------------------------------------------------------------------------------------------
- Options:
- - className (string)
- - content (HTML string, element, or element array)
- - parentEl
- - top
- - left
- - right (the x coord of where the right edge should be. not a "CSS" right)
- - autoHide (boolean)
- - show (callback)
- - hide (callback)
- */
- var Popover = /** @class */ (function () {
- function Popover(options) {
- var _this = this;
- this.isHidden = true;
- this.margin = 10; // the space required between the popover and the edges of the scroll container
- // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
- this.documentMousedown = function (ev) {
- // only hide the popover if the click happened outside the popover
- if (_this.el && !_this.el.contains(ev.target)) {
- _this.hide();
- }
- };
- this.options = options;
- }
- // Shows the popover on the specified position. Renders it if not already
- Popover.prototype.show = function () {
- if (this.isHidden) {
- if (!this.el) {
- this.render();
- }
- this.el.style.display = '';
- this.position();
- this.isHidden = false;
- this.trigger('show');
- }
- };
- // Hides the popover, through CSS, but does not remove it from the DOM
- Popover.prototype.hide = function () {
- if (!this.isHidden) {
- this.el.style.display = 'none';
- this.isHidden = true;
- this.trigger('hide');
- }
- };
- // Creates `this.el` and renders content inside of it
- Popover.prototype.render = function () {
- var _this = this;
- var options = this.options;
- var el = this.el = core.createElement('div', {
- className: 'fc-popover ' + (options.className || ''),
- style: {
- top: '0',
- left: '0'
- }
- });
- if (typeof options.content === 'function') {
- options.content(el);
- }
- options.parentEl.appendChild(el);
- // when a click happens on anything inside with a 'fc-close' className, hide the popover
- core.listenBySelector(el, 'click', '.fc-close', function (ev) {
- _this.hide();
- });
- if (options.autoHide) {
- document.addEventListener('mousedown', this.documentMousedown);
- }
- };
- // Hides and unregisters any handlers
- Popover.prototype.destroy = function () {
- this.hide();
- if (this.el) {
- core.removeElement(this.el);
- this.el = null;
- }
- document.removeEventListener('mousedown', this.documentMousedown);
- };
- // Positions the popover optimally, using the top/left/right options
- Popover.prototype.position = function () {
- var options = this.options;
- var el = this.el;
- var elDims = el.getBoundingClientRect(); // only used for width,height
- var origin = core.computeRect(el.offsetParent);
- var clippingRect = core.computeClippingRect(options.parentEl);
- var top; // the "position" (not "offset") values for the popover
- var left; //
- // compute top and left
- top = options.top || 0;
- if (options.left !== undefined) {
- left = options.left;
- }
- else if (options.right !== undefined) {
- left = options.right - elDims.width; // derive the left value from the right value
- }
- else {
- left = 0;
- }
- // constrain to the view port. if constrained by two edges, give precedence to top/left
- top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
- top = Math.max(top, clippingRect.top + this.margin);
- left = Math.min(left, clippingRect.right - elDims.width - this.margin);
- left = Math.max(left, clippingRect.left + this.margin);
- core.applyStyle(el, {
- top: top - origin.top,
- left: left - origin.left
- });
- };
- // Triggers a callback. Calls a function in the option hash of the same name.
- // Arguments beyond the first `name` are forwarded on.
- // TODO: better code reuse for this. Repeat code
- // can kill this???
- Popover.prototype.trigger = function (name) {
- if (this.options[name]) {
- this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
- }
- };
- return Popover;
- }());
-
- /* Event-rendering methods for the DayGrid class
- ----------------------------------------------------------------------------------------------------------------------*/
- // "Simple" is bad a name. has nothing to do with SimpleDayGrid
- var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
- __extends(SimpleDayGridEventRenderer, _super);
- function SimpleDayGridEventRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- // Builds the HTML to be used for the default element for an individual segment
- SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
- var context = this.context;
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventUi = eventRange.ui;
- var allDay = eventDef.allDay;
- var isDraggable = core.computeEventDraggable(context, eventDef, eventUi);
- var isResizableFromStart = allDay && seg.isStart && core.computeEventStartResizable(context, eventDef, eventUi);
- var isResizableFromEnd = allDay && seg.isEnd && core.computeEventEndResizable(context, eventDef, eventUi);
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
- var skinCss = core.cssToStr(this.getSkinCss(eventUi));
- var timeHtml = '';
- var timeText;
- var titleHtml;
- classes.unshift('fc-day-grid-event', 'fc-h-event');
- // Only display a timed events time if it is the starting segment
- if (seg.isStart) {
- timeText = this.getTimeText(eventRange);
- if (timeText) {
- timeHtml = '<span class="fc-time">' + core.htmlEscape(timeText) + '</span>';
- }
- }
- titleHtml =
- '<span class="fc-title">' +
- (core.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
- '</span>';
- return '<a class="' + classes.join(' ') + '"' +
- (eventDef.url ?
- ' href="' + core.htmlEscape(eventDef.url) + '"' :
- '') +
- (skinCss ?
- ' style="' + skinCss + '"' :
- '') +
- '>' +
- '<div class="fc-content">' +
- (context.options.dir === 'rtl' ?
- titleHtml + ' ' + timeHtml : // put a natural space in between
- timeHtml + ' ' + titleHtml //
- ) +
- '</div>' +
- (isResizableFromStart ?
- '<div class="fc-resizer fc-start-resizer"></div>' :
- '') +
- (isResizableFromEnd ?
- '<div class="fc-resizer fc-end-resizer"></div>' :
- '') +
- '</a>';
- };
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
- SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true,
- meridiem: 'narrow'
- };
- };
- SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return false; // TODO: somehow consider the originating DayGrid's column count
- };
- return SimpleDayGridEventRenderer;
- }(core.FgEventRenderer));
-
- /* Event-rendering methods for the DayGrid class
- ----------------------------------------------------------------------------------------------------------------------*/
- var DayGridEventRenderer = /** @class */ (function (_super) {
- __extends(DayGridEventRenderer, _super);
- function DayGridEventRenderer(dayGrid) {
- var _this = _super.call(this) || this;
- _this.dayGrid = dayGrid;
- return _this;
- }
- // Renders the given foreground event segments onto the grid
- DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
- // append to each row's content skeleton
- this.dayGrid.rowEls.forEach(function (rowNode, i) {
- rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
- });
- // removes the "more.." events popover
- if (!mirrorInfo) {
- this.dayGrid.removeSegPopover();
- }
- };
- // Unrenders all currently rendered foreground event segments
- DayGridEventRenderer.prototype.detachSegs = function () {
- var rowStructs = this.rowStructs || [];
- var rowStruct;
- while ((rowStruct = rowStructs.pop())) {
- core.removeElement(rowStruct.tbodyEl);
- }
- this.rowStructs = null;
- };
- // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
- // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
- // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
- DayGridEventRenderer.prototype.renderSegRows = function (segs) {
- var rowStructs = [];
- var segRows;
- var row;
- segRows = this.groupSegRows(segs); // group into nested arrays
- // iterate each row of segment groupings
- for (row = 0; row < segRows.length; row++) {
- rowStructs.push(this.renderSegRow(row, segRows[row]));
- }
- return rowStructs;
- };
- // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
- // the segments. Returns object with a bunch of internal data about how the render was calculated.
- // NOTE: modifies rowSegs
- DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
- var isRtl = this.context.isRtl;
- var dayGrid = this.dayGrid;
- var colCnt = dayGrid.colCnt;
- var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
- var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
- var tbody = document.createElement('tbody');
- var segMatrix = []; // lookup for which segments are rendered into which level+col cells
- var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
- var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
- var i;
- var levelSegs;
- var col;
- var tr;
- var j;
- var seg;
- var td;
- // populates empty cells from the current column (`col`) to `endCol`
- function emptyCellsUntil(endCol) {
- while (col < endCol) {
- // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
- td = (loneCellMatrix[i - 1] || [])[col];
- if (td) {
- td.rowSpan = (td.rowSpan || 1) + 1;
- }
- else {
- td = document.createElement('td');
- tr.appendChild(td);
- }
- cellMatrix[i][col] = td;
- loneCellMatrix[i][col] = td;
- col++;
- }
- }
- for (i = 0; i < levelCnt; i++) { // iterate through all levels
- levelSegs = segLevels[i];
- col = 0;
- tr = document.createElement('tr');
- segMatrix.push([]);
- cellMatrix.push([]);
- loneCellMatrix.push([]);
- // levelCnt might be 1 even though there are no actual levels. protect against this.
- // this single empty row is useful for styling.
- if (levelSegs) {
- for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
- seg = levelSegs[j];
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- emptyCellsUntil(leftCol);
- // create a container that occupies or more columns. append the event element.
- td = core.createElement('td', { className: 'fc-event-container' }, seg.el);
- if (leftCol !== rightCol) {
- td.colSpan = rightCol - leftCol + 1;
- }
- else { // a single-column segment
- loneCellMatrix[i][col] = td;
- }
- while (col <= rightCol) {
- cellMatrix[i][col] = td;
- segMatrix[i][col] = seg;
- col++;
- }
- tr.appendChild(td);
- }
- }
- emptyCellsUntil(colCnt); // finish off the row
- var introHtml = dayGrid.renderProps.renderIntroHtml();
- if (introHtml) {
- if (isRtl) {
- core.appendToElement(tr, introHtml);
- }
- else {
- core.prependToElement(tr, introHtml);
- }
- }
- tbody.appendChild(tr);
- }
- return {
- row: row,
- tbodyEl: tbody,
- cellMatrix: cellMatrix,
- segMatrix: segMatrix,
- segLevels: segLevels,
- segs: rowSegs
- };
- };
- // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
- // NOTE: modifies segs
- DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
- var isRtl = this.context.isRtl;
- var colCnt = this.dayGrid.colCnt;
- var levels = [];
- var i;
- var seg;
- var j;
- // Give preference to elements with certain criteria, so they have
- // a chance to be closer to the top.
- segs = this.sortEventSegs(segs);
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
- for (j = 0; j < levels.length; j++) {
- if (!isDaySegCollision(seg, levels[j])) {
- break;
- }
- }
- // `j` now holds the desired subrow index
- seg.level = j;
- seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
- seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
- ;
- (levels[j] || (levels[j] = [])).push(seg);
- }
- // order segments left-to-right. very important if calendar is RTL
- for (j = 0; j < levels.length; j++) {
- levels[j].sort(compareDaySegCols);
- }
- return levels;
- };
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
- DayGridEventRenderer.prototype.groupSegRows = function (segs) {
- var segRows = [];
- var i;
- for (i = 0; i < this.dayGrid.rowCnt; i++) {
- segRows.push([]);
- }
- for (i = 0; i < segs.length; i++) {
- segRows[segs[i].row].push(segs[i]);
- }
- return segRows;
- };
- // Computes a default `displayEventEnd` value if one is not expliclty defined
- DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
- };
- return DayGridEventRenderer;
- }(SimpleDayGridEventRenderer));
- // Computes whether two segments' columns collide. They are assumed to be in the same row.
- function isDaySegCollision(seg, otherSegs) {
- var i;
- var otherSeg;
- for (i = 0; i < otherSegs.length; i++) {
- otherSeg = otherSegs[i];
- if (otherSeg.firstCol <= seg.lastCol &&
- otherSeg.lastCol >= seg.firstCol) {
- return true;
- }
- }
- return false;
- }
- // A cmp function for determining the leftmost event
- function compareDaySegCols(a, b) {
- return a.leftCol - b.leftCol;
- }
-
- var DayGridMirrorRenderer = /** @class */ (function (_super) {
- __extends(DayGridMirrorRenderer, _super);
- function DayGridMirrorRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var sourceSeg = mirrorInfo.sourceSeg;
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
- // inject each new event skeleton into each associated row
- this.dayGrid.rowEls.forEach(function (rowNode, row) {
- var skeletonEl = core.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
- var skeletonTopEl;
- var skeletonTop;
- // If there is an original segment, match the top position. Otherwise, put it at the row's top level
- if (sourceSeg && sourceSeg.row === row) {
- skeletonTopEl = sourceSeg.el;
- }
- else {
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
- if (!skeletonTopEl) { // when no events
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
- }
- }
- skeletonTop = skeletonTopEl.getBoundingClientRect().top -
- rowNode.getBoundingClientRect().top; // the offsetParent origin
- skeletonEl.style.top = skeletonTop + 'px';
- skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
- rowNode.appendChild(skeletonEl);
- });
- };
- return DayGridMirrorRenderer;
- }(DayGridEventRenderer));
-
- var EMPTY_CELL_HTML = '<td style="pointer-events:none"></td>';
- var DayGridFillRenderer = /** @class */ (function (_super) {
- __extends(DayGridFillRenderer, _super);
- function DayGridFillRenderer(dayGrid) {
- var _this = _super.call(this) || this;
- _this.fillSegTag = 'td'; // override the default tag name
- _this.dayGrid = dayGrid;
- return _this;
- }
- DayGridFillRenderer.prototype.renderSegs = function (type, context, segs) {
- // don't render timed background events
- if (type === 'bgEvent') {
- segs = segs.filter(function (seg) {
- return seg.eventRange.def.allDay;
- });
- }
- _super.prototype.renderSegs.call(this, type, context, segs);
- };
- DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
- var els = [];
- var i;
- var seg;
- var skeletonEl;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- skeletonEl = this.renderFillRow(type, seg);
- this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
- els.push(skeletonEl);
- }
- return els;
- };
- // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
- DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
- var dayGrid = this.dayGrid;
- var isRtl = this.context.isRtl;
- var colCnt = dayGrid.colCnt;
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- var startCol = leftCol;
- var endCol = rightCol + 1;
- var className;
- var skeletonEl;
- var trEl;
- if (type === 'businessHours') {
- className = 'bgevent';
- }
- else {
- className = type.toLowerCase();
- }
- skeletonEl = core.htmlToElement('<div class="fc-' + className + '-skeleton">' +
- '<table><tr></tr></table>' +
- '</div>');
- trEl = skeletonEl.getElementsByTagName('tr')[0];
- if (startCol > 0) {
- core.appendToElement(trEl,
- // will create (startCol + 1) td's
- new Array(startCol + 1).join(EMPTY_CELL_HTML));
- }
- seg.el.colSpan = endCol - startCol;
- trEl.appendChild(seg.el);
- if (endCol < colCnt) {
- core.appendToElement(trEl,
- // will create (colCnt - endCol) td's
- new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML));
- }
- var introHtml = dayGrid.renderProps.renderIntroHtml();
- if (introHtml) {
- if (isRtl) {
- core.appendToElement(trEl, introHtml);
- }
- else {
- core.prependToElement(trEl, introHtml);
- }
- }
- return skeletonEl;
- };
- return DayGridFillRenderer;
- }(core.FillRenderer));
-
- var DayTile = /** @class */ (function (_super) {
- __extends(DayTile, _super);
- function DayTile(el) {
- var _this = _super.call(this, el) || this;
- var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
- var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
- _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
- return _this;
- }
- DayTile.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.el,
- useEventCenter: false
- });
- };
- DayTile.prototype.render = function (props, context) {
- this.renderFrame(props.date);
- this.renderFgEvents(context, props.fgSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDragInstances);
- this.renderEventResize(props.eventResizeInstances);
- };
- DayTile.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderFrame.unrender(); // should unrender everything else
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- DayTile.prototype._renderFrame = function (date) {
- var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var title = dateEnv.format(date, core.createFormatter(options.dayPopoverFormat) // TODO: cache
- );
- this.el.innerHTML =
- '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
- '<span class="fc-title">' +
- core.htmlEscape(title) +
- '</span>' +
- '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
- '</div>' +
- '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
- '<div class="fc-event-container"></div>' +
- '</div>';
- this.segContainerEl = this.el.querySelector('.fc-event-container');
- };
- DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
- var date = this.props.date; // HACK
- if (positionLeft < elWidth && positionTop < elHeight) {
- return {
- component: this,
- dateSpan: {
- allDay: true,
- range: { start: date, end: core.addDays(date, 1) }
- },
- dayEl: this.el,
- rect: {
- left: 0,
- top: 0,
- right: elWidth,
- bottom: elHeight
- },
- layer: 1
- };
- }
- };
- return DayTile;
- }(core.DateComponent));
- var DayTileEventRenderer = /** @class */ (function (_super) {
- __extends(DayTileEventRenderer, _super);
- function DayTileEventRenderer(dayTile) {
- var _this = _super.call(this) || this;
- _this.dayTile = dayTile;
- return _this;
- }
- DayTileEventRenderer.prototype.attachSegs = function (segs) {
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- this.dayTile.segContainerEl.appendChild(seg.el);
- }
- };
- DayTileEventRenderer.prototype.detachSegs = function (segs) {
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
- var seg = segs_2[_i];
- core.removeElement(seg.el);
- }
- };
- return DayTileEventRenderer;
- }(SimpleDayGridEventRenderer));
-
- var DayBgRow = /** @class */ (function () {
- function DayBgRow(context) {
- this.context = context;
- }
- DayBgRow.prototype.renderHtml = function (props) {
- var parts = [];
- if (props.renderIntroHtml) {
- parts.push(props.renderIntroHtml());
- }
- for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
- var cell = _a[_i];
- parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
- }
- if (!props.cells.length) {
- parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
- }
- if (this.context.options.dir === 'rtl') {
- parts.reverse();
- }
- return '<tr>' + parts.join('') + '</tr>';
- };
- return DayBgRow;
- }());
- function renderCellHtml(date, dateProfile, context, otherAttrs) {
- var dateEnv = context.dateEnv, theme = context.theme;
- var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
- var classes = core.getDayClasses(date, dateProfile, context);
- classes.unshift('fc-day', theme.getClass('widgetContent'));
- return '<td class="' + classes.join(' ') + '"' +
- (isDateValid ?
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
- '') +
- (otherAttrs ?
- ' ' + otherAttrs :
- '') +
- '></td>';
- }
-
- var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });
- var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });
- var DayGrid = /** @class */ (function (_super) {
- __extends(DayGrid, _super);
- function DayGrid(el, renderProps) {
- var _this = _super.call(this, el) || this;
- _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
- _this.isCellSizesDirty = false;
- _this.renderProps = renderProps;
- var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
- var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
- _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
- var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);
- _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
- _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
- _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
- _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
- return _this;
- }
- DayGrid.prototype.render = function (props, context) {
- var cells = props.cells;
- this.rowCnt = cells.length;
- this.colCnt = cells[0].length;
- this.renderCells(cells, props.isRigid);
- this.renderBusinessHours(context, props.businessHourSegs);
- this.renderDateSelection(context, props.dateSelectionSegs);
- this.renderBgEvents(context, props.bgEventSegs);
- this.renderFgEvents(context, props.fgEventSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDrag);
- this.renderEventResize(props.eventResize);
- if (this.segPopoverTile) {
- this.updateSegPopoverTile();
- }
- };
- DayGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderCells.unrender(); // will unrender everything else
- };
- DayGrid.prototype.getCellRange = function (row, col) {
- var start = this.props.cells[row][col].date;
- var end = core.addDays(start, 1);
- return { start: start, end: end };
- };
- DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
- var ownProps = this.props;
- this.segPopoverTile.receiveProps({
- date: date || this.segPopoverTile.props.date,
- fgSegs: segs || this.segPopoverTile.props.fgSegs,
- eventSelection: ownProps.eventSelection,
- eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
- eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
- }, this.context);
- };
- /* Date Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderCells = function (cells, isRigid) {
- var _a = this.context, calendar = _a.calendar, view = _a.view, isRtl = _a.isRtl, dateEnv = _a.dateEnv;
- var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
- var html = '';
- var row;
- var col;
- for (row = 0; row < rowCnt; row++) {
- html += this.renderDayRowHtml(row, isRigid);
- }
- this.el.innerHTML = html;
- this.rowEls = core.findElements(this.el, '.fc-row');
- this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
- if (isRtl) {
- this.cellEls.reverse();
- }
- this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical
- );
- this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
- true, false // horizontal
- );
- // trigger dayRender with each cell's element
- for (row = 0; row < rowCnt; row++) {
- for (col = 0; col < colCnt; col++) {
- calendar.publiclyTrigger('dayRender', [
- {
- date: dateEnv.toDate(cells[row][col].date),
- el: this.getCellEl(row, col),
- view: view
- }
- ]);
- }
- }
- this.isCellSizesDirty = true;
- };
- DayGrid.prototype._unrenderCells = function () {
- this.removeSegPopover();
- };
- // Generates the HTML for a single row, which is a div that wraps a table.
- // `row` is the row number.
- DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
- var theme = this.context.theme;
- var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
- if (isRigid) {
- classes.push('fc-rigid');
- }
- var bgRow = new DayBgRow(this.context);
- return '' +
- '<div class="' + classes.join(' ') + '">' +
- '<div class="fc-bg">' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- bgRow.renderHtml({
- cells: this.props.cells[row],
- dateProfile: this.props.dateProfile,
- renderIntroHtml: this.renderProps.renderBgIntroHtml
- }) +
- '</table>' +
- '</div>' +
- '<div class="fc-content-skeleton">' +
- '<table>' +
- (this.getIsNumbersVisible() ?
- '<thead>' +
- this.renderNumberTrHtml(row) +
- '</thead>' :
- '') +
- '</table>' +
- '</div>' +
- '</div>';
- };
- DayGrid.prototype.getIsNumbersVisible = function () {
- return this.getIsDayNumbersVisible() ||
- this.renderProps.cellWeekNumbersVisible ||
- this.renderProps.colWeekNumbersVisible;
- };
- DayGrid.prototype.getIsDayNumbersVisible = function () {
- return this.rowCnt > 1;
- };
- /* Grid Number Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.renderNumberTrHtml = function (row) {
- var isRtl = this.context.isRtl;
- var intro = this.renderProps.renderNumberIntroHtml(row, this);
- return '' +
- '<tr>' +
- (isRtl ? '' : intro) +
- this.renderNumberCellsHtml(row) +
- (isRtl ? intro : '') +
- '</tr>';
- };
- DayGrid.prototype.renderNumberCellsHtml = function (row) {
- var htmls = [];
- var col;
- var date;
- for (col = 0; col < this.colCnt; col++) {
- date = this.props.cells[row][col].date;
- htmls.push(this.renderNumberCellHtml(date));
- }
- if (this.context.isRtl) {
- htmls.reverse();
- }
- return htmls.join('');
- };
- // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
- // The number row will only exist if either day numbers or week numbers are turned on.
- DayGrid.prototype.renderNumberCellHtml = function (date) {
- var _a = this.context, dateEnv = _a.dateEnv, options = _a.options;
- var html = '';
- var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
- var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
- var classes;
- var weekCalcFirstDow;
- if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
- // no numbers in day cell (week number must be along the side)
- return '<td></td>'; // will create an empty space above events :(
- }
- classes = core.getDayClasses(date, this.props.dateProfile, this.context);
- classes.unshift('fc-day-top');
- if (this.renderProps.cellWeekNumbersVisible) {
- weekCalcFirstDow = dateEnv.weekDow;
- }
- html += '<td class="' + classes.join(' ') + '"' +
- (isDateValid ?
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
- '') +
- '>';
- if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
- html += core.buildGotoAnchorHtml(options, dateEnv, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
- );
- }
- if (isDayNumberVisible) {
- html += core.buildGotoAnchorHtml(options, dateEnv, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
- );
- }
- html += '</td>';
- return html;
- };
- /* Sizing
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.updateSize = function (isResize) {
- var calendar = this.context.calendar;
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
- if (isResize ||
- this.isCellSizesDirty ||
- calendar.isEventsUpdated // hack
- ) {
- this.buildPositionCaches();
- this.isCellSizesDirty = false;
- }
- fillRenderer.computeSizes(isResize);
- eventRenderer.computeSizes(isResize);
- mirrorRenderer.computeSizes(isResize);
- fillRenderer.assignSizes(isResize);
- eventRenderer.assignSizes(isResize);
- mirrorRenderer.assignSizes(isResize);
- };
- DayGrid.prototype.buildPositionCaches = function () {
- this.buildColPositions();
- this.buildRowPositions();
- };
- DayGrid.prototype.buildColPositions = function () {
- this.colPositions.build();
- };
- DayGrid.prototype.buildRowPositions = function () {
- this.rowPositions.build();
- this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
- };
- /* Hit System
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
- var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
- var col = colPositions.leftToIndex(leftPosition);
- var row = rowPositions.topToIndex(topPosition);
- if (row != null && col != null) {
- return {
- row: row,
- col: col,
- dateSpan: {
- range: this.getCellRange(row, col),
- allDay: true
- },
- dayEl: this.getCellEl(row, col),
- relativeRect: {
- left: colPositions.lefts[col],
- right: colPositions.rights[col],
- top: rowPositions.tops[row],
- bottom: rowPositions.bottoms[row]
- }
- };
- }
- };
- /* Cell System
- ------------------------------------------------------------------------------------------------------------------*/
- // FYI: the first column is the leftmost column, regardless of date
- DayGrid.prototype.getCellEl = function (row, col) {
- return this.cellEls[row * this.colCnt + col];
- };
- /* Event Drag Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- }
- };
- DayGrid.prototype._unrenderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.fillRenderer.unrender('highlight', this.context);
- }
- };
- /* Event Resize Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype._renderEventResize = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- DayGrid.prototype._unrenderEventResize = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.fillRenderer.unrender('highlight', this.context);
- this.mirrorRenderer.unrender(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- /* More+ Link Popover
- ------------------------------------------------------------------------------------------------------------------*/
- DayGrid.prototype.removeSegPopover = function () {
- if (this.segPopover) {
- this.segPopover.hide(); // in handler, will call segPopover's removeElement
- }
- };
- // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
- // `levelLimit` can be false (don't limit), a number, or true (should be computed).
- DayGrid.prototype.limitRows = function (levelLimit) {
- var rowStructs = this.eventRenderer.rowStructs || [];
- var row; // row #
- var rowLevelLimit;
- for (row = 0; row < rowStructs.length; row++) {
- this.unlimitRow(row);
- if (!levelLimit) {
- rowLevelLimit = false;
- }
- else if (typeof levelLimit === 'number') {
- rowLevelLimit = levelLimit;
- }
- else {
- rowLevelLimit = this.computeRowLevelLimit(row);
- }
- if (rowLevelLimit !== false) {
- this.limitRow(row, rowLevelLimit);
- }
- }
- };
- // Computes the number of levels a row will accomodate without going outside its bounds.
- // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
- // `row` is the row number.
- DayGrid.prototype.computeRowLevelLimit = function (row) {
- var rowEl = this.rowEls[row]; // the containing "fake" row div
- var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
- var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
- var i;
- var trEl;
- // Reveal one level <tr> at a time and stop when we find one out of bounds
- for (i = 0; i < trEls.length; i++) {
- trEl = trEls[i];
- trEl.classList.remove('fc-limited'); // reset to original state (reveal)
- if (trEl.getBoundingClientRect().bottom > rowBottom) {
- return i;
- }
- }
- return false; // should not limit at all
- };
- // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
- // `row` is the row number.
- // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
- DayGrid.prototype.limitRow = function (row, levelLimit) {
- var _this = this;
- var colCnt = this.colCnt;
- var isRtl = this.context.isRtl;
- var rowStruct = this.eventRenderer.rowStructs[row];
- var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
- var col = 0; // col #, left-to-right (not chronologically)
- var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
- var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
- var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
- var i;
- var seg;
- var segsBelow; // array of segment objects below `seg` in the current `col`
- var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
- var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
- var td;
- var rowSpan;
- var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
- var j;
- var moreTd;
- var moreWrap;
- var moreLink;
- // Iterates through empty level cells and places "more" links inside if need be
- var emptyCellsUntil = function (endCol) {
- while (col < endCol) {
- segsBelow = _this.getCellSegs(row, col, levelLimit);
- if (segsBelow.length) {
- td = cellMatrix[levelLimit - 1][col];
- moreLink = _this.renderMoreLink(row, col, segsBelow);
- moreWrap = core.createElement('div', null, moreLink);
- td.appendChild(moreWrap);
- moreNodes.push(moreWrap);
- }
- col++;
- }
- };
- if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
- levelSegs = rowStruct.segLevels[levelLimit - 1];
- cellMatrix = rowStruct.cellMatrix;
- limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
- limitedNodes.forEach(function (node) {
- node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
- });
- // iterate though segments in the last allowable level
- for (i = 0; i < levelSegs.length; i++) {
- seg = levelSegs[i];
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
- emptyCellsUntil(leftCol); // process empty cells before the segment
- // determine *all* segments below `seg` that occupy the same columns
- colSegsBelow = [];
- totalSegsBelow = 0;
- while (col <= rightCol) {
- segsBelow = this.getCellSegs(row, col, levelLimit);
- colSegsBelow.push(segsBelow);
- totalSegsBelow += segsBelow.length;
- col++;
- }
- if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
- td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
- rowSpan = td.rowSpan || 1;
- segMoreNodes = [];
- // make a replacement <td> for each column the segment occupies. will be one for each colspan
- for (j = 0; j < colSegsBelow.length; j++) {
- moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
- segsBelow = colSegsBelow[j];
- moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
- );
- moreWrap = core.createElement('div', null, moreLink);
- moreTd.appendChild(moreWrap);
- segMoreNodes.push(moreTd);
- moreNodes.push(moreTd);
- }
- td.classList.add('fc-limited');
- core.insertAfterElement(td, segMoreNodes);
- limitedNodes.push(td);
- }
- }
- emptyCellsUntil(this.colCnt); // finish off the level
- rowStruct.moreEls = moreNodes; // for easy undoing later
- rowStruct.limitedEls = limitedNodes; // for easy undoing later
- }
- };
- // Reveals all levels and removes all "more"-related elements for a grid's row.
- // `row` is a row number.
- DayGrid.prototype.unlimitRow = function (row) {
- var rowStruct = this.eventRenderer.rowStructs[row];
- if (rowStruct.moreEls) {
- rowStruct.moreEls.forEach(core.removeElement);
- rowStruct.moreEls = null;
- }
- if (rowStruct.limitedEls) {
- rowStruct.limitedEls.forEach(function (limitedEl) {
- limitedEl.classList.remove('fc-limited');
- });
- rowStruct.limitedEls = null;
- }
- };
- // Renders an <a> element that represents hidden event element for a cell.
- // Responsible for attaching click handler as well.
- DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, view = _a.view, dateEnv = _a.dateEnv, options = _a.options, isRtl = _a.isRtl;
- var a = core.createElement('a', { className: 'fc-more' });
- a.innerText = this.getMoreLinkText(hiddenSegs.length);
- a.addEventListener('click', function (ev) {
- var clickOption = options.eventLimitClick;
- var _col = isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
- var date = _this.props.cells[row][_col].date;
- var moreEl = ev.currentTarget;
- var dayEl = _this.getCellEl(row, col);
- var allSegs = _this.getCellSegs(row, col);
- // rescope the segments to be within the cell's date
- var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
- var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
- if (typeof clickOption === 'function') {
- // the returned value can be an atomic option
- clickOption = calendar.publiclyTrigger('eventLimitClick', [
- {
- date: dateEnv.toDate(date),
- allDay: true,
- dayEl: dayEl,
- moreEl: moreEl,
- segs: reslicedAllSegs,
- hiddenSegs: reslicedHiddenSegs,
- jsEvent: ev,
- view: view
- }
- ]);
- }
- if (clickOption === 'popover') {
- _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
- }
- else if (typeof clickOption === 'string') { // a view name
- calendar.zoomTo(date, clickOption);
- }
- });
- return a;
- };
- // Reveals the popover that displays all events within a cell
- DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
- var _this = this;
- var _a = this.context, calendar = _a.calendar, view = _a.view, theme = _a.theme, isRtl = _a.isRtl;
- var _col = isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
- var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
- var topEl; // the element we want to match the top coordinate of
- var options;
- if (this.rowCnt === 1) {
- topEl = view.el; // will cause the popover to cover any sort of header
- }
- else {
- topEl = this.rowEls[row]; // will align with top of row
- }
- options = {
- className: 'fc-more-popover ' + theme.getClass('popover'),
- parentEl: view.el,
- top: core.computeRect(topEl).top,
- autoHide: true,
- content: function (el) {
- _this.segPopoverTile = new DayTile(el);
- _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
- },
- hide: function () {
- _this.segPopoverTile.destroy();
- _this.segPopoverTile = null;
- _this.segPopover.destroy();
- _this.segPopover = null;
- }
- };
- // Determine horizontal coordinate.
- // We use the moreWrap instead of the <td> to avoid border confusion.
- if (isRtl) {
- options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border
- }
- else {
- options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border
- }
- this.segPopover = new Popover(options);
- this.segPopover.show();
- calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
- };
- // Given the events within an array of segment objects, reslice them to be in a single day
- DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
- var dayStart = dayDate;
- var dayEnd = core.addDays(dayStart, 1);
- var dayRange = { start: dayStart, end: dayEnd };
- var newSegs = [];
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- var eventRange = seg.eventRange;
- var origRange = eventRange.range;
- var slicedRange = core.intersectRanges(origRange, dayRange);
- if (slicedRange) {
- newSegs.push(__assign({}, seg, { eventRange: {
- def: eventRange.def,
- ui: __assign({}, eventRange.ui, { durationEditable: false }),
- instance: eventRange.instance,
- range: slicedRange
- }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
- }
- }
- return newSegs;
- };
- // Generates the text that should be inside a "more" link, given the number of events it represents
- DayGrid.prototype.getMoreLinkText = function (num) {
- var opt = this.context.options.eventLimitText;
- if (typeof opt === 'function') {
- return opt(num);
- }
- else {
- return '+' + num + ' ' + opt;
- }
- };
- // Returns segments within a given cell.
- // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
- DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
- var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
- var level = startLevel || 0;
- var segs = [];
- var seg;
- while (level < segMatrix.length) {
- seg = segMatrix[level][col];
- if (seg) {
- segs.push(seg);
- }
- level++;
- }
- return segs;
- };
- return DayGrid;
- }(core.DateComponent));
-
- var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });
- /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
- ----------------------------------------------------------------------------------------------------------------------*/
- // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
- // It is responsible for managing width/height.
- var AbstractDayGridView = /** @class */ (function (_super) {
- __extends(AbstractDayGridView, _super);
- function AbstractDayGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.processOptions = core.memoize(_this._processOptions);
- _this.renderSkeleton = core.memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- /* Header Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before the day-of week header cells
- _this.renderHeadIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, options = _a.options;
- if (_this.colWeekNumbersVisible) {
- return '' +
- '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
- '<span>' + // needed for matchCellWidths
- core.htmlEscape(options.weekLabel) +
- '</span>' +
- '</th>';
- }
- return '';
- };
- /* Day Grid Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
- _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
- var _a = _this.context, options = _a.options, dateEnv = _a.dateEnv;
- var weekStart = dayGrid.props.cells[row][0].date;
- if (_this.colWeekNumbersVisible) {
- return '' +
- '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
- core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
- options, dateEnv, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
- ) +
- '</td>';
- }
- return '';
- };
- // Generates the HTML that goes before the day bg cells for each day-row
- _this.renderDayGridBgIntroHtml = function () {
- var theme = _this.context.theme;
- if (_this.colWeekNumbersVisible) {
- return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
- }
- return '';
- };
- // Generates the HTML that goes before every other type of row generated by DayGrid.
- // Affects mirror-skeleton and highlight-skeleton rows.
- _this.renderDayGridIntroHtml = function () {
- if (_this.colWeekNumbersVisible) {
- return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
- }
- return '';
- };
- return _this;
- }
- AbstractDayGridView.prototype._processOptions = function (options) {
- if (options.weekNumbers) {
- if (options.weekNumbersWithinDays) {
- this.cellWeekNumbersVisible = true;
- this.colWeekNumbersVisible = false;
- }
- else {
- this.cellWeekNumbersVisible = false;
- this.colWeekNumbersVisible = true;
- }
- }
- else {
- this.colWeekNumbersVisible = false;
- this.cellWeekNumbersVisible = false;
- }
- };
- AbstractDayGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- this.processOptions(context.options);
- this.renderSkeleton(context);
- };
- AbstractDayGridView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- AbstractDayGridView.prototype._renderSkeleton = function (context) {
- this.el.classList.add('fc-dayGrid-view');
- this.el.innerHTML = this.renderSkeletonHtml();
- this.scroller = new core.ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- var dayGridContainerEl = this.scroller.el;
- this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
- dayGridContainerEl.classList.add('fc-day-grid-container');
- var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });
- dayGridContainerEl.appendChild(dayGridEl);
- this.dayGrid = new DayGrid(dayGridEl, {
- renderNumberIntroHtml: this.renderDayGridNumberIntroHtml,
- renderBgIntroHtml: this.renderDayGridBgIntroHtml,
- renderIntroHtml: this.renderDayGridIntroHtml,
- colWeekNumbersVisible: this.colWeekNumbersVisible,
- cellWeekNumbersVisible: this.cellWeekNumbersVisible
- });
- };
- AbstractDayGridView.prototype._unrenderSkeleton = function () {
- this.el.classList.remove('fc-dayGrid-view');
- this.dayGrid.destroy();
- this.scroller.destroy();
- };
- // Builds the HTML skeleton for the view.
- // The day-grid component will render inside of a container defined by this HTML.
- AbstractDayGridView.prototype.renderSkeletonHtml = function () {
- var _a = this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- (options.columnHeader ?
- '<thead class="fc-head">' +
- '<tr>' +
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
- '</tr>' +
- '</thead>' :
- '') +
- '<tbody class="fc-body">' +
- '<tr>' +
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
- '</tr>' +
- '</tbody>' +
- '</table>';
- };
- // Generates an HTML attribute string for setting the width of the week number column, if it is known
- AbstractDayGridView.prototype.weekNumberStyleAttr = function () {
- if (this.weekNumberWidth != null) {
- return 'style="width:' + this.weekNumberWidth + 'px"';
- }
- return '';
- };
- // Determines whether each row should have a constant height
- AbstractDayGridView.prototype.hasRigidRows = function () {
- var eventLimit = this.context.options.eventLimit;
- return eventLimit && typeof eventLimit !== 'number';
- };
- /* Dimensions
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractDayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
- this.dayGrid.updateSize(isResize);
- };
- // Refreshes the horizontal dimensions of the view
- AbstractDayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- var dayGrid = this.dayGrid;
- var eventLimit = this.context.options.eventLimit;
- var headRowEl = this.header ? this.header.el : null; // HACK
- var scrollerHeight;
- var scrollbarWidths;
- // hack to give the view some height prior to dayGrid's columns being rendered
- // TODO: separate setting height from scroller VS dayGrid.
- if (!dayGrid.rowEls) {
- if (!isAuto) {
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- return;
- }
- if (this.colWeekNumbersVisible) {
- // Make sure all week number cells running down the side have the same width.
- this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));
- }
- // reset all heights to be natural
- this.scroller.clear();
- if (headRowEl) {
- core.uncompensateScroll(headRowEl);
- }
- dayGrid.removeSegPopover(); // kill the "more" popover if displayed
- // is the event limit a constant level number?
- if (eventLimit && typeof eventLimit === 'number') {
- dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
- }
- // distribute the height to the rows
- // (viewHeight is a "recommended" value if isAuto)
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.setGridHeight(scrollerHeight, isAuto);
- // is the event limit dynamically calculated?
- if (eventLimit && typeof eventLimit !== 'number') {
- dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
- }
- if (!isAuto) { // should we force dimensions of the scroll container?
- this.scroller.setHeight(scrollerHeight);
- scrollbarWidths = this.scroller.getScrollbarWidths();
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
- if (headRowEl) {
- core.compensateScroll(headRowEl, scrollbarWidths);
- }
- // doing the scrollbar compensation might have created text overflow which created more height. redo
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- // guarantees the same scrollbar widths
- this.scroller.lockOverflow(scrollbarWidths);
- }
- };
- // given a desired total height of the view, returns what the height of the scroller should be
- AbstractDayGridView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- // Sets the height of just the DayGrid component in this view
- AbstractDayGridView.prototype.setGridHeight = function (height, isAuto) {
- if (this.context.options.monthMode) {
- // if auto, make the height of each row the height that it would be if there were 6 weeks
- if (isAuto) {
- height *= this.dayGrid.rowCnt / 6;
- }
- core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
- }
- else {
- if (isAuto) {
- core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
- }
- else {
- core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
- }
- }
- };
- /* Scroll
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractDayGridView.prototype.computeDateScroll = function (duration) {
- return { top: 0 };
- };
- AbstractDayGridView.prototype.queryDateScroll = function () {
- return { top: this.scroller.getScrollTop() };
- };
- AbstractDayGridView.prototype.applyDateScroll = function (scroll) {
- if (scroll.top !== undefined) {
- this.scroller.setScrollTop(scroll.top);
- }
- };
- return AbstractDayGridView;
- }(core.View));
- AbstractDayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
-
- var SimpleDayGrid = /** @class */ (function (_super) {
- __extends(SimpleDayGrid, _super);
- function SimpleDayGrid(dayGrid) {
- var _this = _super.call(this, dayGrid.el) || this;
- _this.slicer = new DayGridSlicer();
- _this.dayGrid = dayGrid;
- return _this;
- }
- SimpleDayGrid.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, { el: this.dayGrid.el });
- };
- SimpleDayGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- SimpleDayGrid.prototype.render = function (props, context) {
- var dayGrid = this.dayGrid;
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
- dayGrid.receiveContext(context); // hack because context is used in sliceProps
- dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, context.calendar, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }), context);
- };
- SimpleDayGrid.prototype.buildPositionCaches = function () {
- this.dayGrid.buildPositionCaches();
- };
- SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
- var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
- if (rawHit) {
- return {
- component: this.dayGrid,
- dateSpan: rawHit.dateSpan,
- dayEl: rawHit.dayEl,
- rect: {
- left: rawHit.relativeRect.left,
- right: rawHit.relativeRect.right,
- top: rawHit.relativeRect.top,
- bottom: rawHit.relativeRect.bottom
- },
- layer: 0
- };
- }
- };
- return SimpleDayGrid;
- }(core.DateComponent));
- var DayGridSlicer = /** @class */ (function (_super) {
- __extends(DayGridSlicer, _super);
- function DayGridSlicer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
- return dayTable.sliceRange(dateRange);
- };
- return DayGridSlicer;
- }(core.Slicer));
-
- var DayGridView = /** @class */ (function (_super) {
- __extends(DayGridView, _super);
- function DayGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.buildDayTable = core.memoize(buildDayTable);
- return _this;
- }
- DayGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context); // will call _renderSkeleton/_unrenderSkeleton
- var dateProfile = this.props.dateProfile;
- var dayTable = this.dayTable =
- this.buildDayTable(dateProfile, props.dateProfileGenerator);
- if (this.header) {
- this.header.receiveProps({
- dateProfile: dateProfile,
- dates: dayTable.headerDates,
- datesRepDistinctDays: dayTable.rowCnt === 1,
- renderIntroHtml: this.renderHeadIntroHtml
- }, context);
- }
- this.simpleDayGrid.receiveProps({
- dateProfile: dateProfile,
- dayTable: dayTable,
- businessHours: props.businessHours,
- dateSelection: props.dateSelection,
- eventStore: props.eventStore,
- eventUiBases: props.eventUiBases,
- eventSelection: props.eventSelection,
- eventDrag: props.eventDrag,
- eventResize: props.eventResize,
- isRigid: this.hasRigidRows(),
- nextDayThreshold: this.context.nextDayThreshold
- }, context);
- };
- DayGridView.prototype._renderSkeleton = function (context) {
- _super.prototype._renderSkeleton.call(this, context);
- if (context.options.columnHeader) {
- this.header = new core.DayHeader(this.el.querySelector('.fc-head-container'));
- }
- this.simpleDayGrid = new SimpleDayGrid(this.dayGrid);
- };
- DayGridView.prototype._unrenderSkeleton = function () {
- _super.prototype._unrenderSkeleton.call(this);
- if (this.header) {
- this.header.destroy();
- }
- this.simpleDayGrid.destroy();
- };
- return DayGridView;
- }(AbstractDayGridView));
- function buildDayTable(dateProfile, dateProfileGenerator) {
- var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
- return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
- }
-
- var main = core.createPlugin({
- defaultView: 'dayGridMonth',
- views: {
- dayGrid: DayGridView,
- dayGridDay: {
- type: 'dayGrid',
- duration: { days: 1 }
- },
- dayGridWeek: {
- type: 'dayGrid',
- duration: { weeks: 1 }
- },
- dayGridMonth: {
- type: 'dayGrid',
- duration: { months: 1 },
- monthMode: true,
- fixedWeekCount: true
- }
- }
- });
-
- exports.AbstractDayGridView = AbstractDayGridView;
- exports.DayBgRow = DayBgRow;
- exports.DayGrid = DayGrid;
- exports.DayGridSlicer = DayGridSlicer;
- exports.DayGridView = DayGridView;
- exports.SimpleDayGrid = SimpleDayGrid;
- exports.buildBasicDayTable = buildDayTable;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/daygrid/main.min.css b/library/fullcalendar/packages/daygrid/main.min.css
deleted file mode 100644
index 55a572412..000000000
--- a/library/fullcalendar/packages/daygrid/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em} \ No newline at end of file
diff --git a/library/fullcalendar/packages/daygrid/main.min.js b/library/fullcalendar/packages/daygrid/main.min.js
deleted file mode 100644
index 21715dfda..000000000
--- a/library/fullcalendar/packages/daygrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarDayGrid={},e.FullCalendar)}(this,(function(e,t){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},o=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.buildRenderRange=function(r,n,i){var o,s=this.dateEnv,l=e.prototype.buildRenderRange.call(this,r,n,i),a=l.start,d=l.end;if(/^(year|month)$/.test(n)&&(a=s.startOfWeek(a),(o=s.startOfWeek(d)).valueOf()!==d.valueOf()&&(d=t.addWeeks(o,1))),this.options.monthMode&&this.options.fixedWeekCount){var c=Math.ceil(t.diffWeeks(a,d));d=t.addWeeks(d,6-c)}return{start:a,end:d}},r}(t.DateProfileGenerator),s=function(){function e(e){var t=this;this.isHidden=!0,this.margin=10,this.documentMousedown=function(e){t.el&&!t.el.contains(e.target)&&t.hide()},this.options=e}return e.prototype.show=function(){this.isHidden&&(this.el||this.render(),this.el.style.display="",this.position(),this.isHidden=!1,this.trigger("show"))},e.prototype.hide=function(){this.isHidden||(this.el.style.display="none",this.isHidden=!0,this.trigger("hide"))},e.prototype.render=function(){var e=this,r=this.options,n=this.el=t.createElement("div",{className:"fc-popover "+(r.className||""),style:{top:"0",left:"0"}});"function"==typeof r.content&&r.content(n),r.parentEl.appendChild(n),t.listenBySelector(n,"click",".fc-close",(function(t){e.hide()})),r.autoHide&&document.addEventListener("mousedown",this.documentMousedown)},e.prototype.destroy=function(){this.hide(),this.el&&(t.removeElement(this.el),this.el=null),document.removeEventListener("mousedown",this.documentMousedown)},e.prototype.position=function(){var e,r,n=this.options,i=this.el,o=i.getBoundingClientRect(),s=t.computeRect(i.offsetParent),l=t.computeClippingRect(n.parentEl);e=n.top||0,r=void 0!==n.left?n.left:void 0!==n.right?n.right-o.width:0,e=Math.min(e,l.bottom-o.height-this.margin),e=Math.max(e,l.top+this.margin),r=Math.min(r,l.right-o.width-this.margin),r=Math.max(r,l.left+this.margin),t.applyStyle(i,{top:e-s.top,left:r-s.left})},e.prototype.trigger=function(e){this.options[e]&&this.options[e].apply(this,Array.prototype.slice.call(arguments,1))},e}(),l=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.renderSegHtml=function(e,r){var n,i,o=this.context,s=e.eventRange,l=s.def,a=s.ui,d=l.allDay,c=t.computeEventDraggable(o,l,a),h=d&&e.isStart&&t.computeEventStartResizable(o,l,a),p=d&&e.isEnd&&t.computeEventEndResizable(o,l,a),u=this.getSegClasses(e,c,h||p,r),f=t.cssToStr(this.getSkinCss(a)),m="";return u.unshift("fc-day-grid-event","fc-h-event"),e.isStart&&(n=this.getTimeText(s))&&(m='<span class="fc-time">'+t.htmlEscape(n)+"</span>"),i='<span class="fc-title">'+(t.htmlEscape(l.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(l.url?' href="'+t.htmlEscape(l.url)+'"':"")+(f?' style="'+f+'"':"")+'><div class="fc-content">'+("rtl"===o.options.dir?i+" "+m:m+" "+i)+"</div>"+(h?'<div class="fc-resizer fc-start-resizer"></div>':"")+(p?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},r.prototype.computeDisplayEventEnd=function(){return!1},r}(t.FgEventRenderer),a=function(e){function r(t){var r=e.call(this)||this;return r.dayGrid=t,r}return n(r,e),r.prototype.attachSegs=function(e,t){var r=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach((function(e,t){e.querySelector(".fc-content-skeleton > table").appendChild(r[t].tbodyEl)})),t||this.dayGrid.removeSegPopover()},r.prototype.detachSegs=function(){for(var e,r=this.rowStructs||[];e=r.pop();)t.removeElement(e.tbodyEl);this.rowStructs=null},r.prototype.renderSegRows=function(e){var t,r,n=[];for(t=this.groupSegRows(e),r=0;r<t.length;r++)n.push(this.renderSegRow(r,t[r]));return n},r.prototype.renderSegRow=function(e,r){var n,i,o,s,l,a,d,c=this.context.isRtl,h=this.dayGrid,p=h.colCnt,u=this.buildSegLevels(r),f=Math.max(1,u.length),m=document.createElement("tbody"),g=[],y=[],v=[];function b(e){for(;o<e;)(d=(v[n-1]||[])[o])?d.rowSpan=(d.rowSpan||1)+1:(d=document.createElement("td"),s.appendChild(d)),y[n][o]=d,v[n][o]=d,o++}for(n=0;n<f;n++){if(i=u[n],o=0,s=document.createElement("tr"),g.push([]),y.push([]),v.push([]),i)for(l=0;l<i.length;l++){a=i[l];var S=c?p-1-a.lastCol:a.firstCol,w=c?p-1-a.firstCol:a.lastCol;for(b(S),d=t.createElement("td",{className:"fc-event-container"},a.el),S!==w?d.colSpan=w-S+1:v[n][o]=d;o<=w;)y[n][o]=d,g[n][o]=a,o++;s.appendChild(d)}b(p);var C=h.renderProps.renderIntroHtml();C&&(c?t.appendToElement(s,C):t.prependToElement(s,C)),m.appendChild(s)}return{row:e,tbodyEl:m,cellMatrix:y,segMatrix:g,segLevels:u,segs:r}},r.prototype.buildSegLevels=function(e){var t,r,n,i=this.context.isRtl,o=this.dayGrid.colCnt,s=[];for(e=this.sortEventSegs(e),t=0;t<e.length;t++){for(r=e[t],n=0;n<s.length&&d(r,s[n]);n++);r.level=n,r.leftCol=i?o-1-r.lastCol:r.firstCol,r.rightCol=i?o-1-r.firstCol:r.lastCol,(s[n]||(s[n]=[])).push(r)}for(n=0;n<s.length;n++)s[n].sort(c);return s},r.prototype.groupSegRows=function(e){var t,r=[];for(t=0;t<this.dayGrid.rowCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].row].push(e[t]);return r},r.prototype.computeDisplayEventEnd=function(){return 1===this.dayGrid.colCnt},r}(l);function d(e,t){var r,n;for(r=0;r<t.length;r++)if((n=t[r]).firstCol<=e.lastCol&&n.lastCol>=e.firstCol)return!0;return!1}function c(e,t){return e.leftCol-t.leftCol}var h=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.attachSegs=function(e,r){var n=r.sourceSeg,i=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach((function(e,r){var o,s,l=t.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>');n&&n.row===r?o=n.el:(o=e.querySelector(".fc-content-skeleton tbody"))||(o=e.querySelector(".fc-content-skeleton table")),s=o.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(i[r].tbodyEl),e.appendChild(l)}))},r}(a),p=function(e){function r(t){var r=e.call(this)||this;return r.fillSegTag="td",r.dayGrid=t,r}return n(r,e),r.prototype.renderSegs=function(t,r,n){"bgEvent"===t&&(n=n.filter((function(e){return e.eventRange.def.allDay}))),e.prototype.renderSegs.call(this,t,r,n)},r.prototype.attachSegs=function(e,t){var r,n,i,o=[];for(r=0;r<t.length;r++)n=t[r],i=this.renderFillRow(e,n),this.dayGrid.rowEls[n.row].appendChild(i),o.push(i);return o},r.prototype.renderFillRow=function(e,r){var n,i,o,s=this.dayGrid,l=this.context.isRtl,a=s.colCnt,d=l?a-1-r.lastCol:r.firstCol,c=(l?a-1-r.firstCol:r.lastCol)+1;n="businessHours"===e?"bgevent":e.toLowerCase(),o=(i=t.htmlToElement('<div class="fc-'+n+'-skeleton"><table><tr></tr></table></div>')).getElementsByTagName("tr")[0],d>0&&t.appendToElement(o,new Array(d+1).join('<td style="pointer-events:none"></td>')),r.el.colSpan=c-d,o.appendChild(r.el),c<a&&t.appendToElement(o,new Array(a-c+1).join('<td style="pointer-events:none"></td>'));var h=s.renderProps.renderIntroHtml();return h&&(l?t.appendToElement(o,h):t.prependToElement(o,h)),i},r}(t.FillRenderer),u=function(e){function r(r){var n=e.call(this,r)||this,i=n.eventRenderer=new f(n),o=n.renderFrame=t.memoizeRendering(n._renderFrame);return n.renderFgEvents=t.memoizeRendering(i.renderSegs.bind(i),i.unrender.bind(i),[o]),n.renderEventSelection=t.memoizeRendering(i.selectByInstanceId.bind(i),i.unselectByInstanceId.bind(i),[n.renderFgEvents]),n.renderEventDrag=t.memoizeRendering(i.hideByHash.bind(i),i.showByHash.bind(i),[o]),n.renderEventResize=t.memoizeRendering(i.hideByHash.bind(i),i.showByHash.bind(i),[o]),n}return n(r,e),r.prototype.firstContext=function(e){e.calendar.registerInteractiveComponent(this,{el:this.el,useEventCenter:!1})},r.prototype.render=function(e,t){this.renderFrame(e.date),this.renderFgEvents(t,e.fgSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDragInstances),this.renderEventResize(e.eventResizeInstances)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderFrame.unrender(),this.context.calendar.unregisterInteractiveComponent(this)},r.prototype._renderFrame=function(e){var r=this.context,n=r.theme,i=r.dateEnv,o=r.options,s=i.format(e,t.createFormatter(o.dayPopoverFormat));this.el.innerHTML='<div class="fc-header '+n.getClass("popoverHeader")+'"><span class="fc-title">'+t.htmlEscape(s)+'</span><span class="fc-close '+n.getIconClass("close")+'"></span></div><div class="fc-body '+n.getClass("popoverContent")+'"><div class="fc-event-container"></div></div>',this.segContainerEl=this.el.querySelector(".fc-event-container")},r.prototype.queryHit=function(e,r,n,i){var o=this.props.date;if(e<n&&r<i)return{component:this,dateSpan:{allDay:!0,range:{start:o,end:t.addDays(o,1)}},dayEl:this.el,rect:{left:0,top:0,right:n,bottom:i},layer:1}},r}(t.DateComponent),f=function(e){function r(t){var r=e.call(this)||this;return r.dayTile=t,r}return n(r,e),r.prototype.attachSegs=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.dayTile.segContainerEl.appendChild(n.el)}},r.prototype.detachSegs=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.removeElement(i.el)}},r}(l),m=function(){function e(e){this.context=e}return e.prototype.renderHtml=function(e){var t=[];e.renderIntroHtml&&t.push(e.renderIntroHtml());for(var r=0,n=e.cells;r<n.length;r++){var i=n[r];t.push(g(i.date,e.dateProfile,this.context,i.htmlAttrs))}return e.cells.length||t.push('<td class="fc-day '+this.context.theme.getClass("widgetContent")+'"></td>'),"rtl"===this.context.options.dir&&t.reverse(),"<tr>"+t.join("")+"</tr>"},e}();function g(e,r,n,i){var o=n.dateEnv,s=n.theme,l=t.rangeContainsMarker(r.activeRange,e),a=t.getDayClasses(e,r,n);return a.unshift("fc-day",s.getClass("widgetContent")),'<td class="'+a.join(" ")+'"'+(l?' data-date="'+o.formatIso(e,{omitTime:!0})+'"':"")+(i?" "+i:"")+"></td>"}var y=t.createFormatter({day:"numeric"}),v=t.createFormatter({week:"numeric"}),b=function(e){function r(r,n){var i=e.call(this,r)||this;i.bottomCoordPadding=0,i.isCellSizesDirty=!1,i.renderProps=n;var o=i.eventRenderer=new a(i),s=i.fillRenderer=new p(i);i.mirrorRenderer=new h(i);var l=i.renderCells=t.memoizeRendering(i._renderCells,i._unrenderCells);return i.renderBusinessHours=t.memoizeRendering(s.renderSegs.bind(s,"businessHours"),s.unrender.bind(s,"businessHours"),[l]),i.renderDateSelection=t.memoizeRendering(s.renderSegs.bind(s,"highlight"),s.unrender.bind(s,"highlight"),[l]),i.renderBgEvents=t.memoizeRendering(s.renderSegs.bind(s,"bgEvent"),s.unrender.bind(s,"bgEvent"),[l]),i.renderFgEvents=t.memoizeRendering(o.renderSegs.bind(o),o.unrender.bind(o),[l]),i.renderEventSelection=t.memoizeRendering(o.selectByInstanceId.bind(o),o.unselectByInstanceId.bind(o),[i.renderFgEvents]),i.renderEventDrag=t.memoizeRendering(i._renderEventDrag,i._unrenderEventDrag,[l]),i.renderEventResize=t.memoizeRendering(i._renderEventResize,i._unrenderEventResize,[l]),i}return n(r,e),r.prototype.render=function(e,t){var r=e.cells;this.rowCnt=r.length,this.colCnt=r[0].length,this.renderCells(r,e.isRigid),this.renderBusinessHours(t,e.businessHourSegs),this.renderDateSelection(t,e.dateSelectionSegs),this.renderBgEvents(t,e.bgEventSegs),this.renderFgEvents(t,e.fgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize),this.segPopoverTile&&this.updateSegPopoverTile()},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderCells.unrender()},r.prototype.getCellRange=function(e,r){var n=this.props.cells[e][r].date;return{start:n,end:t.addDays(n,1)}},r.prototype.updateSegPopoverTile=function(e,t){var r=this.props;this.segPopoverTile.receiveProps({date:e||this.segPopoverTile.props.date,fgSegs:t||this.segPopoverTile.props.fgSegs,eventSelection:r.eventSelection,eventDragInstances:r.eventDrag?r.eventDrag.affectedInstances:null,eventResizeInstances:r.eventResize?r.eventResize.affectedInstances:null},this.context)},r.prototype._renderCells=function(e,r){var n,i,o=this.context,s=o.calendar,l=o.view,a=o.isRtl,d=o.dateEnv,c=this.rowCnt,h=this.colCnt,p="";for(n=0;n<c;n++)p+=this.renderDayRowHtml(n,r);for(this.el.innerHTML=p,this.rowEls=t.findElements(this.el,".fc-row"),this.cellEls=t.findElements(this.el,".fc-day, .fc-disabled-day"),a&&this.cellEls.reverse(),this.rowPositions=new t.PositionCache(this.el,this.rowEls,!1,!0),this.colPositions=new t.PositionCache(this.el,this.cellEls.slice(0,h),!0,!1),n=0;n<c;n++)for(i=0;i<h;i++)s.publiclyTrigger("dayRender",[{date:d.toDate(e[n][i].date),el:this.getCellEl(n,i),view:l}]);this.isCellSizesDirty=!0},r.prototype._unrenderCells=function(){this.removeSegPopover()},r.prototype.renderDayRowHtml=function(e,t){var r=this.context.theme,n=["fc-row","fc-week",r.getClass("dayRow")];t&&n.push("fc-rigid");var i=new m(this.context);return'<div class="'+n.join(" ")+'"><div class="fc-bg"><table class="'+r.getClass("tableGrid")+'">'+i.renderHtml({cells:this.props.cells[e],dateProfile:this.props.dateProfile,renderIntroHtml:this.renderProps.renderBgIntroHtml})+'</table></div><div class="fc-content-skeleton"><table>'+(this.getIsNumbersVisible()?"<thead>"+this.renderNumberTrHtml(e)+"</thead>":"")+"</table></div></div>"},r.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.renderProps.cellWeekNumbersVisible||this.renderProps.colWeekNumbersVisible},r.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},r.prototype.renderNumberTrHtml=function(e){var t=this.context.isRtl,r=this.renderProps.renderNumberIntroHtml(e,this);return"<tr>"+(t?"":r)+this.renderNumberCellsHtml(e)+(t?r:"")+"</tr>"},r.prototype.renderNumberCellsHtml=function(e){var t,r,n=[];for(t=0;t<this.colCnt;t++)r=this.props.cells[e][t].date,n.push(this.renderNumberCellHtml(r));return this.context.isRtl&&n.reverse(),n.join("")},r.prototype.renderNumberCellHtml=function(e){var r,n,i=this.context,o=i.dateEnv,s=i.options,l="",a=t.rangeContainsMarker(this.props.dateProfile.activeRange,e),d=this.getIsDayNumbersVisible()&&a;return d||this.renderProps.cellWeekNumbersVisible?((r=t.getDayClasses(e,this.props.dateProfile,this.context)).unshift("fc-day-top"),this.renderProps.cellWeekNumbersVisible&&(n=o.weekDow),l+='<td class="'+r.join(" ")+'"'+(a?' data-date="'+o.formatIso(e,{omitTime:!0})+'"':"")+">",this.renderProps.cellWeekNumbersVisible&&e.getUTCDay()===n&&(l+=t.buildGotoAnchorHtml(s,o,{date:e,type:"week"},{class:"fc-week-number"},o.format(e,v))),d&&(l+=t.buildGotoAnchorHtml(s,o,e,{class:"fc-day-number"},o.format(e,y))),l+="</td>"):"<td></td>"},r.prototype.updateSize=function(e){var t=this.context.calendar,r=this.fillRenderer,n=this.eventRenderer,i=this.mirrorRenderer;(e||this.isCellSizesDirty||t.isEventsUpdated)&&(this.buildPositionCaches(),this.isCellSizesDirty=!1),r.computeSizes(e),n.computeSizes(e),i.computeSizes(e),r.assignSizes(e),n.assignSizes(e),i.assignSizes(e)},r.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildRowPositions()},r.prototype.buildColPositions=function(){this.colPositions.build()},r.prototype.buildRowPositions=function(){this.rowPositions.build(),this.rowPositions.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},r.prototype.positionToHit=function(e,t){var r=this.colPositions,n=this.rowPositions,i=r.leftToIndex(e),o=n.topToIndex(t);if(null!=o&&null!=i)return{row:o,col:i,dateSpan:{range:this.getCellRange(o,i),allDay:!0},dayEl:this.getCellEl(o,i),relativeRect:{left:r.lefts[i],right:r.rights[i],top:n.tops[o],bottom:n.bottoms[o]}}},r.prototype.getCellEl=function(e,t){return this.cellEls[e*this.colCnt+t]},r.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",this.context,e.segs))},r.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight",this.context))},r.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",this.context,e.segs),this.mirrorRenderer.renderSegs(this.context,e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight",this.context),this.mirrorRenderer.unrender(this.context,e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},r.prototype.limitRows=function(e){var t,r,n=this.eventRenderer.rowStructs||[];for(t=0;t<n.length;t++)this.unlimitRow(t),!1!==(r=!!e&&("number"==typeof e?e:this.computeRowLevelLimit(t)))&&this.limitRow(t,r)},r.prototype.computeRowLevelLimit=function(e){var r,n,i=this.rowEls[e].getBoundingClientRect().bottom,o=t.findChildren(this.eventRenderer.rowStructs[e].tbodyEl);for(r=0;r<o.length;r++)if((n=o[r]).classList.remove("fc-limited"),n.getBoundingClientRect().bottom>i)return r;return!1},r.prototype.limitRow=function(e,r){var n,i,o,s,l,a,d,c,h,p,u,f,m,g,y,v=this,b=this.colCnt,S=this.context.isRtl,w=this.eventRenderer.rowStructs[e],C=[],E=0,R=function(n){for(;E<n;)(a=v.getCellSegs(e,E,r)).length&&(h=i[r-1][E],y=v.renderMoreLink(e,E,a),g=t.createElement("div",null,y),h.appendChild(g),C.push(g)),E++};if(r&&r<w.segLevels.length){for(n=w.segLevels[r-1],i=w.cellMatrix,(o=t.findChildren(w.tbodyEl).slice(r)).forEach((function(e){e.classList.add("fc-limited")})),s=0;s<n.length;s++){l=n[s];var H=S?b-1-l.lastCol:l.firstCol,k=S?b-1-l.firstCol:l.lastCol;for(R(H),c=[],d=0;E<=k;)a=this.getCellSegs(e,E,r),c.push(a),d+=a.length,E++;if(d){for(p=(h=i[r-1][H]).rowSpan||1,u=[],f=0;f<c.length;f++)m=t.createElement("td",{className:"fc-more-cell",rowSpan:p}),a=c[f],y=this.renderMoreLink(e,H+f,[l].concat(a)),g=t.createElement("div",null,y),m.appendChild(g),u.push(m),C.push(m);h.classList.add("fc-limited"),t.insertAfterElement(h,u),o.push(h)}}R(this.colCnt),w.moreEls=C,w.limitedEls=o}},r.prototype.unlimitRow=function(e){var r=this.eventRenderer.rowStructs[e];r.moreEls&&(r.moreEls.forEach(t.removeElement),r.moreEls=null),r.limitedEls&&(r.limitedEls.forEach((function(e){e.classList.remove("fc-limited")})),r.limitedEls=null)},r.prototype.renderMoreLink=function(e,r,n){var i=this,o=this.context,s=o.calendar,l=o.view,a=o.dateEnv,d=o.options,c=o.isRtl,h=t.createElement("a",{className:"fc-more"});return h.innerText=this.getMoreLinkText(n.length),h.addEventListener("click",(function(t){var o=d.eventLimitClick,h=c?i.colCnt-r-1:r,p=i.props.cells[e][h].date,u=t.currentTarget,f=i.getCellEl(e,r),m=i.getCellSegs(e,r),g=i.resliceDaySegs(m,p),y=i.resliceDaySegs(n,p);"function"==typeof o&&(o=s.publiclyTrigger("eventLimitClick",[{date:a.toDate(p),allDay:!0,dayEl:f,moreEl:u,segs:g,hiddenSegs:y,jsEvent:t,view:l}])),"popover"===o?i.showSegPopover(e,r,u,g):"string"==typeof o&&s.zoomTo(p,o)})),h},r.prototype.showSegPopover=function(e,r,n,i){var o,l,a=this,d=this.context,c=d.calendar,h=d.view,p=d.theme,f=d.isRtl,m=f?this.colCnt-r-1:r,g=n.parentNode;o=1===this.rowCnt?h.el:this.rowEls[e],l={className:"fc-more-popover "+p.getClass("popover"),parentEl:h.el,top:t.computeRect(o).top,autoHide:!0,content:function(t){a.segPopoverTile=new u(t),a.updateSegPopoverTile(a.props.cells[e][m].date,i)},hide:function(){a.segPopoverTile.destroy(),a.segPopoverTile=null,a.segPopover.destroy(),a.segPopover=null}},f?l.right=t.computeRect(g).right+1:l.left=t.computeRect(g).left-1,this.segPopover=new s(l),this.segPopover.show(),c.releaseAfterSizingTriggers()},r.prototype.resliceDaySegs=function(e,r){for(var n=r,o={start:n,end:t.addDays(n,1)},s=[],l=0,a=e;l<a.length;l++){var d=a[l],c=d.eventRange,h=c.range,p=t.intersectRanges(h,o);p&&s.push(i({},d,{eventRange:{def:c.def,ui:i({},c.ui,{durationEditable:!1}),instance:c.instance,range:p},isStart:d.isStart&&p.start.valueOf()===h.start.valueOf(),isEnd:d.isEnd&&p.end.valueOf()===h.end.valueOf()}))}return s},r.prototype.getMoreLinkText=function(e){var t=this.context.options.eventLimitText;return"function"==typeof t?t(e):"+"+e+" "+t},r.prototype.getCellSegs=function(e,t,r){for(var n,i=this.eventRenderer.rowStructs[e].segMatrix,o=r||0,s=[];o<i.length;)(n=i[o][t])&&s.push(n),o++;return s},r}(t.DateComponent),S=t.createFormatter({week:"numeric"}),w=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.processOptions=t.memoize(r._processOptions),r.renderSkeleton=t.memoizeRendering(r._renderSkeleton,r._unrenderSkeleton),r.renderHeadIntroHtml=function(){var e=r.context,n=e.theme,i=e.options;return r.colWeekNumbersVisible?'<th class="fc-week-number '+n.getClass("widgetHeader")+'" '+r.weekNumberStyleAttr()+"><span>"+t.htmlEscape(i.weekLabel)+"</span></th>":""},r.renderDayGridNumberIntroHtml=function(e,n){var i=r.context,o=i.options,s=i.dateEnv,l=n.props.cells[e][0].date;return r.colWeekNumbersVisible?'<td class="fc-week-number" '+r.weekNumberStyleAttr()+">"+t.buildGotoAnchorHtml(o,s,{date:l,type:"week",forceOff:1===n.colCnt},s.format(l,S))+"</td>":""},r.renderDayGridBgIntroHtml=function(){var e=r.context.theme;return r.colWeekNumbersVisible?'<td class="fc-week-number '+e.getClass("widgetContent")+'" '+r.weekNumberStyleAttr()+"></td>":""},r.renderDayGridIntroHtml=function(){return r.colWeekNumbersVisible?'<td class="fc-week-number" '+r.weekNumberStyleAttr()+"></td>":""},r}return n(r,e),r.prototype._processOptions=function(e){e.weekNumbers?e.weekNumbersWithinDays?(this.cellWeekNumbersVisible=!0,this.colWeekNumbersVisible=!1):(this.cellWeekNumbersVisible=!1,this.colWeekNumbersVisible=!0):(this.colWeekNumbersVisible=!1,this.cellWeekNumbersVisible=!1)},r.prototype.render=function(t,r){e.prototype.render.call(this,t,r),this.processOptions(r.options),this.renderSkeleton(r)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSkeleton.unrender()},r.prototype._renderSkeleton=function(e){this.el.classList.add("fc-dayGrid-view"),this.el.innerHTML=this.renderSkeletonHtml(),this.scroller=new t.ScrollComponent("hidden","auto");var r=this.scroller.el;this.el.querySelector(".fc-body > tr > td").appendChild(r),r.classList.add("fc-day-grid-container");var n=t.createElement("div",{className:"fc-day-grid"});r.appendChild(n),this.dayGrid=new b(n,{renderNumberIntroHtml:this.renderDayGridNumberIntroHtml,renderBgIntroHtml:this.renderDayGridBgIntroHtml,renderIntroHtml:this.renderDayGridIntroHtml,colWeekNumbersVisible:this.colWeekNumbersVisible,cellWeekNumbersVisible:this.cellWeekNumbersVisible})},r.prototype._unrenderSkeleton=function(){this.el.classList.remove("fc-dayGrid-view"),this.dayGrid.destroy(),this.scroller.destroy()},r.prototype.renderSkeletonHtml=function(){var e=this.context,t=e.theme,r=e.options;return'<table class="'+t.getClass("tableGrid")+'">'+(r.columnHeader?'<thead class="fc-head"><tr><td class="fc-head-container '+t.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+t.getClass("widgetContent")+'"></td></tr></tbody></table>'},r.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},r.prototype.hasRigidRows=function(){var e=this.context.options.eventLimit;return e&&"number"!=typeof e},r.prototype.updateSize=function(t,r,n){e.prototype.updateSize.call(this,t,r,n),this.dayGrid.updateSize(t)},r.prototype.updateBaseSize=function(e,r,n){var i,o,s=this.dayGrid,l=this.context.options.eventLimit,a=this.header?this.header.el:null;s.rowEls?(this.colWeekNumbersVisible&&(this.weekNumberWidth=t.matchCellWidths(t.findElements(this.el,".fc-week-number"))),this.scroller.clear(),a&&t.uncompensateScroll(a),s.removeSegPopover(),l&&"number"==typeof l&&s.limitRows(l),i=this.computeScrollerHeight(r),this.setGridHeight(i,n),l&&"number"!=typeof l&&s.limitRows(l),n||(this.scroller.setHeight(i),((o=this.scroller.getScrollbarWidths()).left||o.right)&&(a&&t.compensateScroll(a,o),i=this.computeScrollerHeight(r),this.scroller.setHeight(i)),this.scroller.lockOverflow(o))):n||(i=this.computeScrollerHeight(r),this.scroller.setHeight(i))},r.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},r.prototype.setGridHeight=function(e,r){this.context.options.monthMode?(r&&(e*=this.dayGrid.rowCnt/6),t.distributeHeight(this.dayGrid.rowEls,e,!r)):r?t.undistributeHeight(this.dayGrid.rowEls):t.distributeHeight(this.dayGrid.rowEls,e,!0)},r.prototype.computeDateScroll=function(e){return{top:0}},r.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},r.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},r}(t.View);w.prototype.dateProfileGeneratorClass=o;var C=function(e){function t(t){var r=e.call(this,t.el)||this;return r.slicer=new E,r.dayGrid=t,r}return n(t,e),t.prototype.firstContext=function(e){e.calendar.registerInteractiveComponent(this,{el:this.dayGrid.el})},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.context.calendar.unregisterInteractiveComponent(this)},t.prototype.render=function(e,t){var r=this.dayGrid,n=e.dateProfile,o=e.dayTable;r.receiveContext(t),r.receiveProps(i({},this.slicer.sliceProps(e,n,e.nextDayThreshold,t.calendar,r,o),{dateProfile:n,cells:o.cells,isRigid:e.isRigid}),t)},t.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},t.prototype.queryHit=function(e,t){var r=this.dayGrid.positionToHit(e,t);if(r)return{component:this.dayGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},t}(t.DateComponent),E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(t.Slicer),R=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.buildDayTable=t.memoize(H),r}return n(r,e),r.prototype.render=function(t,r){e.prototype.render.call(this,t,r);var n=this.props.dateProfile,i=this.dayTable=this.buildDayTable(n,t.dateProfileGenerator);this.header&&this.header.receiveProps({dateProfile:n,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt,renderIntroHtml:this.renderHeadIntroHtml},r),this.simpleDayGrid.receiveProps({dateProfile:n,dayTable:i,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.context.nextDayThreshold},r)},r.prototype._renderSkeleton=function(r){e.prototype._renderSkeleton.call(this,r),r.options.columnHeader&&(this.header=new t.DayHeader(this.el.querySelector(".fc-head-container"))),this.simpleDayGrid=new C(this.dayGrid)},r.prototype._unrenderSkeleton=function(){e.prototype._unrenderSkeleton.call(this),this.header&&this.header.destroy(),this.simpleDayGrid.destroy()},r}(w);function H(e,r){var n=new t.DaySeries(e.renderRange,r);return new t.DayTable(n,/year|month|week/.test(e.currentRangeUnit))}var k=t.createPlugin({defaultView:"dayGridMonth",views:{dayGrid:R,dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.AbstractDayGridView=w,e.DayBgRow=m,e.DayGrid=b,e.DayGridSlicer=E,e.DayGridView=R,e.SimpleDayGrid=C,e.buildBasicDayTable=H,e.default=k,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/daygrid/package.json b/library/fullcalendar/packages/daygrid/package.json
deleted file mode 100644
index 0db9794e5..000000000
--- a/library/fullcalendar/packages/daygrid/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/daygrid",
- "version": "4.4.2",
- "title": "FullCalendar Day Grid Plugin",
- "description": "Display events on Month view or DayGrid view",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/month-view",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/google-calendar/LICENSE.txt b/library/fullcalendar/packages/google-calendar/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/google-calendar/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/google-calendar/README.md b/library/fullcalendar/packages/google-calendar/README.md
deleted file mode 100644
index a4d6c5cc0..000000000
--- a/library/fullcalendar/packages/google-calendar/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Google Calendar Plugin
-
-Fetch events from a public Google Calendar feed
-
-[View the docs &raquo;](https://fullcalendar.io/docs/google-calendar)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/google-calendar/index.global.js b/library/fullcalendar/packages/google-calendar/index.global.js
new file mode 100644
index 000000000..4e091c1d6
--- /dev/null
+++ b/library/fullcalendar/packages/google-calendar/index.global.js
@@ -0,0 +1,150 @@
+/*!
+FullCalendar Google Calendar Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/google-calendar
+(c) 2022 Adam Shaw
+*/
+FullCalendar.GoogleCalendar = (function (exports, core, internal) {
+ 'use strict';
+
+ // TODO: expose somehow
+ const API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
+ const eventSourceDef = {
+ parseMeta(refined) {
+ let { googleCalendarId } = refined;
+ if (!googleCalendarId && refined.url) {
+ googleCalendarId = parseGoogleCalendarId(refined.url);
+ }
+ if (googleCalendarId) {
+ return {
+ googleCalendarId,
+ googleCalendarApiKey: refined.googleCalendarApiKey,
+ googleCalendarApiBase: refined.googleCalendarApiBase,
+ extraParams: refined.extraParams,
+ };
+ }
+ return null;
+ },
+ fetch(arg, successCallback, errorCallback) {
+ let { dateEnv, options } = arg.context;
+ let meta = arg.eventSource.meta;
+ let apiKey = meta.googleCalendarApiKey || options.googleCalendarApiKey;
+ if (!apiKey) {
+ errorCallback(new Error('Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar'));
+ }
+ else {
+ let url = buildUrl(meta);
+ // TODO: make DRY with json-feed-event-source
+ let { extraParams } = meta;
+ let extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams;
+ let requestParams = buildRequestParams(arg.range, apiKey, extraParamsObj, dateEnv);
+ return internal.requestJson('GET', url, requestParams).then(([body, response]) => {
+ if (body.error) {
+ errorCallback(new core.JsonRequestError('Google Calendar API: ' + body.error.message, response));
+ }
+ else {
+ successCallback({
+ rawEvents: gcalItemsToRawEventDefs(body.items, requestParams.timeZone),
+ response,
+ });
+ }
+ }, errorCallback);
+ }
+ },
+ };
+ function parseGoogleCalendarId(url) {
+ let match;
+ // detect if the ID was specified as a single string.
+ // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
+ if (/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
+ return url;
+ }
+ if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url)) ||
+ (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) {
+ return decodeURIComponent(match[1]);
+ }
+ return null;
+ }
+ function buildUrl(meta) {
+ let apiBase = meta.googleCalendarApiBase;
+ if (!apiBase) {
+ apiBase = API_BASE;
+ }
+ return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
+ }
+ function buildRequestParams(range, apiKey, extraParams, dateEnv) {
+ let params;
+ let startStr;
+ let endStr;
+ if (dateEnv.canComputeOffset) {
+ // strings will naturally have offsets, which GCal needs
+ startStr = dateEnv.formatIso(range.start);
+ endStr = dateEnv.formatIso(range.end);
+ }
+ else {
+ // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
+ // from the UTC day-start to guarantee we're getting all the events
+ // (start/end will be UTC-coerced dates, so toISOString is okay)
+ startStr = internal.addDays(range.start, -1).toISOString();
+ endStr = internal.addDays(range.end, 1).toISOString();
+ }
+ params = Object.assign(Object.assign({}, (extraParams || {})), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
+ if (dateEnv.timeZone !== 'local') {
+ params.timeZone = dateEnv.timeZone;
+ }
+ return params;
+ }
+ function gcalItemsToRawEventDefs(items, gcalTimezone) {
+ return items.map((item) => gcalItemToRawEventDef(item, gcalTimezone));
+ }
+ function gcalItemToRawEventDef(item, gcalTimezone) {
+ let url = item.htmlLink || null;
+ // make the URLs for each event show times in the correct timezone
+ if (url && gcalTimezone) {
+ url = injectQsComponent(url, 'ctz=' + gcalTimezone);
+ }
+ return {
+ id: item.id,
+ title: item.summary,
+ start: item.start.dateTime || item.start.date,
+ end: item.end.dateTime || item.end.date,
+ url,
+ location: item.location,
+ description: item.description,
+ attachments: item.attachments || [],
+ extendedProps: (item.extendedProperties || {}).shared || {},
+ };
+ }
+ // Injects a string like "arg=value" into the querystring of a URL
+ // TODO: move to a general util file?
+ function injectQsComponent(url, component) {
+ // inject it after the querystring but before the fragment
+ return url.replace(/(\?.*?)?(#|$)/, (whole, qs, hash) => (qs ? qs + '&' : '?') + component + hash);
+ }
+
+ const OPTION_REFINERS = {
+ googleCalendarApiKey: String,
+ };
+
+ const EVENT_SOURCE_REFINERS = {
+ googleCalendarApiKey: String,
+ googleCalendarId: String,
+ googleCalendarApiBase: String,
+ extraParams: internal.identity,
+ };
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/google-calendar',
+ eventSourceDefs: [eventSourceDef],
+ optionRefiners: OPTION_REFINERS,
+ eventSourceRefiners: EVENT_SOURCE_REFINERS,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/google-calendar/index.global.min.js b/library/fullcalendar/packages/google-calendar/index.global.min.js
new file mode 100644
index 000000000..7ed4c9ab0
--- /dev/null
+++ b/library/fullcalendar/packages/google-calendar/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Google Calendar Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/google-calendar
+(c) 2022 Adam Shaw
+*/
+FullCalendar.GoogleCalendar=function(e,a,t){"use strict";const n={parseMeta(e){let{googleCalendarId:a}=e;return!a&&e.url&&(a=function(e){let a;if(/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((a=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(e))||(a=/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(e)))return decodeURIComponent(a[1]);return null}(e.url)),a?{googleCalendarId:a,googleCalendarApiKey:e.googleCalendarApiKey,googleCalendarApiBase:e.googleCalendarApiBase,extraParams:e.extraParams}:null},fetch(e,n,r){let{dateEnv:o,options:l}=e.context,s=e.eventSource.meta,i=s.googleCalendarApiKey||l.googleCalendarApiKey;if(i){let l=function(e){let a=e.googleCalendarApiBase;a||(a="https://www.googleapis.com/calendar/v3/calendars");return a+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(s),{extraParams:d}=s,g="function"==typeof d?d():d,c=function(e,a,n,r){let o,l,s;r.canComputeOffset?(l=r.formatIso(e.start),s=r.formatIso(e.end)):(l=t.addDays(e.start,-1).toISOString(),s=t.addDays(e.end,1).toISOString());o=Object.assign(Object.assign({},n||{}),{key:a,timeMin:l,timeMax:s,singleEvents:!0,maxResults:9999}),"local"!==r.timeZone&&(o.timeZone=r.timeZone);return o}(e.range,i,g,o);return t.requestJson("GET",l,c).then(([e,t])=>{var o,l;e.error?r(new a.JsonRequestError("Google Calendar API: "+e.error.message,t)):n({rawEvents:(o=e.items,l=c.timeZone,o.map(e=>function(e,a){let t=e.htmlLink||null;t&&a&&(t=function(e,a){return e.replace(/(\?.*?)?(#|$)/,(e,t,n)=>(t?t+"&":"?")+a+n)}(t,"ctz="+a));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:t,location:e.location,description:e.description,attachments:e.attachments||[],extendedProps:(e.extendedProperties||{}).shared||{}}}(e,l))),response:t})},r)}r(new Error("Specify a googleCalendarApiKey. See https://fullcalendar.io/docs/google-calendar"))}};const r={googleCalendarApiKey:String},o={googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,extraParams:t.identity};var l=a.createPlugin({name:"@fullcalendar/google-calendar",eventSourceDefs:[n],optionRefiners:r,eventSourceRefiners:o});return a.globalPlugins.push(l),e.default=l,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/google-calendar/main.d.ts b/library/fullcalendar/packages/google-calendar/main.d.ts
deleted file mode 100644
index 1ed96f778..000000000
--- a/library/fullcalendar/packages/google-calendar/main.d.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// main.d.ts
-
-declare module '@fullcalendar/google-calendar' {
- module '@fullcalendar/core' {
- interface OptionsInput {
- googleCalendarApiKey?: string;
- }
- }
- module '@fullcalendar/core/structs/event-source' {
- interface ExtendedEventSourceInput {
- googleCalendarApiKey?: string;
- googleCalendarId?: string;
- googleCalendarApiBase?: string;
- }
- }
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/google-calendar/main.esm.js b/library/fullcalendar/packages/google-calendar/main.esm.js
deleted file mode 100644
index 58cb94106..000000000
--- a/library/fullcalendar/packages/google-calendar/main.esm.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { createPlugin, refineProps, requestJson, addDays } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-// TODO: expose somehow
-var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
-var STANDARD_PROPS = {
- url: String,
- googleCalendarApiKey: String,
- googleCalendarId: String,
- googleCalendarApiBase: String,
- data: null
-};
-var eventSourceDef = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') {
- raw = { url: raw };
- }
- if (typeof raw === 'object') {
- var standardProps = refineProps(raw, STANDARD_PROPS);
- if (!standardProps.googleCalendarId && standardProps.url) {
- standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
- }
- delete standardProps.url;
- if (standardProps.googleCalendarId) {
- return standardProps;
- }
- }
- return null;
- },
- fetch: function (arg, onSuccess, onFailure) {
- var calendar = arg.calendar;
- var meta = arg.eventSource.meta;
- var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
- if (!apiKey) {
- onFailure({
- message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
- });
- }
- else {
- var url = buildUrl(meta);
- var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
- requestJson('GET', url, requestParams_1, function (body, xhr) {
- if (body.error) {
- onFailure({
- message: 'Google Calendar API: ' + body.error.message,
- errors: body.error.errors,
- xhr: xhr
- });
- }
- else {
- onSuccess({
- rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
- xhr: xhr
- });
- }
- }, function (message, xhr) {
- onFailure({ message: message, xhr: xhr });
- });
- }
- }
-};
-function parseGoogleCalendarId(url) {
- var match;
- // detect if the ID was specified as a single string.
- // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
- if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
- return url;
- }
- else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
- (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
- return decodeURIComponent(match[1]);
- }
-}
-function buildUrl(meta) {
- var apiBase = meta.googleCalendarApiBase;
- if (!apiBase) {
- apiBase = API_BASE;
- }
- return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
-}
-function buildRequestParams(range, apiKey, extraParams, dateEnv) {
- var params;
- var startStr;
- var endStr;
- if (dateEnv.canComputeOffset) {
- // strings will naturally have offsets, which GCal needs
- startStr = dateEnv.formatIso(range.start);
- endStr = dateEnv.formatIso(range.end);
- }
- else {
- // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
- // from the UTC day-start to guarantee we're getting all the events
- // (start/end will be UTC-coerced dates, so toISOString is okay)
- startStr = addDays(range.start, -1).toISOString();
- endStr = addDays(range.end, 1).toISOString();
- }
- params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
- if (dateEnv.timeZone !== 'local') {
- params.timeZone = dateEnv.timeZone;
- }
- return params;
-}
-function gcalItemsToRawEventDefs(items, gcalTimezone) {
- return items.map(function (item) {
- return gcalItemToRawEventDef(item, gcalTimezone);
- });
-}
-function gcalItemToRawEventDef(item, gcalTimezone) {
- var url = item.htmlLink || null;
- // make the URLs for each event show times in the correct timezone
- if (url && gcalTimezone) {
- url = injectQsComponent(url, 'ctz=' + gcalTimezone);
- }
- return {
- id: item.id,
- title: item.summary,
- start: item.start.dateTime || item.start.date,
- end: item.end.dateTime || item.end.date,
- url: url,
- location: item.location,
- description: item.description
- };
-}
-// Injects a string like "arg=value" into the querystring of a URL
-// TODO: move to a general util file?
-function injectQsComponent(url, component) {
- // inject it after the querystring but before the fragment
- return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
- return (qs ? qs + '&' : '?') + component + hash;
- });
-}
-var main = createPlugin({
- eventSourceDefs: [eventSourceDef]
-});
-
-export default main;
diff --git a/library/fullcalendar/packages/google-calendar/main.js b/library/fullcalendar/packages/google-calendar/main.js
deleted file mode 100644
index adf80e6a7..000000000
--- a/library/fullcalendar/packages/google-calendar/main.js
+++ /dev/null
@@ -1,175 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- // TODO: expose somehow
- var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
- var STANDARD_PROPS = {
- url: String,
- googleCalendarApiKey: String,
- googleCalendarId: String,
- googleCalendarApiBase: String,
- data: null
- };
- var eventSourceDef = {
- parseMeta: function (raw) {
- if (typeof raw === 'string') {
- raw = { url: raw };
- }
- if (typeof raw === 'object') {
- var standardProps = core.refineProps(raw, STANDARD_PROPS);
- if (!standardProps.googleCalendarId && standardProps.url) {
- standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
- }
- delete standardProps.url;
- if (standardProps.googleCalendarId) {
- return standardProps;
- }
- }
- return null;
- },
- fetch: function (arg, onSuccess, onFailure) {
- var calendar = arg.calendar;
- var meta = arg.eventSource.meta;
- var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
- if (!apiKey) {
- onFailure({
- message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
- });
- }
- else {
- var url = buildUrl(meta);
- var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
- core.requestJson('GET', url, requestParams_1, function (body, xhr) {
- if (body.error) {
- onFailure({
- message: 'Google Calendar API: ' + body.error.message,
- errors: body.error.errors,
- xhr: xhr
- });
- }
- else {
- onSuccess({
- rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
- xhr: xhr
- });
- }
- }, function (message, xhr) {
- onFailure({ message: message, xhr: xhr });
- });
- }
- }
- };
- function parseGoogleCalendarId(url) {
- var match;
- // detect if the ID was specified as a single string.
- // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
- if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
- return url;
- }
- else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
- (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
- return decodeURIComponent(match[1]);
- }
- }
- function buildUrl(meta) {
- var apiBase = meta.googleCalendarApiBase;
- if (!apiBase) {
- apiBase = API_BASE;
- }
- return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
- }
- function buildRequestParams(range, apiKey, extraParams, dateEnv) {
- var params;
- var startStr;
- var endStr;
- if (dateEnv.canComputeOffset) {
- // strings will naturally have offsets, which GCal needs
- startStr = dateEnv.formatIso(range.start);
- endStr = dateEnv.formatIso(range.end);
- }
- else {
- // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
- // from the UTC day-start to guarantee we're getting all the events
- // (start/end will be UTC-coerced dates, so toISOString is okay)
- startStr = core.addDays(range.start, -1).toISOString();
- endStr = core.addDays(range.end, 1).toISOString();
- }
- params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
- if (dateEnv.timeZone !== 'local') {
- params.timeZone = dateEnv.timeZone;
- }
- return params;
- }
- function gcalItemsToRawEventDefs(items, gcalTimezone) {
- return items.map(function (item) {
- return gcalItemToRawEventDef(item, gcalTimezone);
- });
- }
- function gcalItemToRawEventDef(item, gcalTimezone) {
- var url = item.htmlLink || null;
- // make the URLs for each event show times in the correct timezone
- if (url && gcalTimezone) {
- url = injectQsComponent(url, 'ctz=' + gcalTimezone);
- }
- return {
- id: item.id,
- title: item.summary,
- start: item.start.dateTime || item.start.date,
- end: item.end.dateTime || item.end.date,
- url: url,
- location: item.location,
- description: item.description
- };
- }
- // Injects a string like "arg=value" into the querystring of a URL
- // TODO: move to a general util file?
- function injectQsComponent(url, component) {
- // inject it after the querystring but before the fragment
- return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
- return (qs ? qs + '&' : '?') + component + hash;
- });
- }
- var main = core.createPlugin({
- eventSourceDefs: [eventSourceDef]
- });
-
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/google-calendar/main.min.js b/library/fullcalendar/packages/google-calendar/main.min.js
deleted file mode 100644
index 63ee15585..000000000
--- a/library/fullcalendar/packages/google-calendar/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarGoogleCalendar={},e.FullCalendar)}(this,(function(e,r){"use strict";var n=function(){return(n=Object.assign||function(e){for(var r,n=1,t=arguments.length;n<t;n++)for(var a in r=arguments[n])Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a]);return e}).apply(this,arguments)},t={url:String,googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,data:null},a={parseMeta:function(e){if("string"==typeof e&&(e={url:e}),"object"==typeof e){var n=r.refineProps(e,t);if(!n.googleCalendarId&&n.url&&(n.googleCalendarId=function(e){var r;if(/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((r=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(e))||(r=/^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(e)))return decodeURIComponent(r[1])}(n.url)),delete n.url,n.googleCalendarId)return n}return null},fetch:function(e,t,a){var o=e.calendar,l=e.eventSource.meta,i=l.googleCalendarApiKey||o.opt("googleCalendarApiKey");if(i){var d=function(e){var r=e.googleCalendarApiBase;r||(r="https://www.googleapis.com/calendar/v3/calendars");return r+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(l),s=function(e,t,a,o){var l,i,d;o.canComputeOffset?(i=o.formatIso(e.start),d=o.formatIso(e.end)):(i=r.addDays(e.start,-1).toISOString(),d=r.addDays(e.end,1).toISOString());l=n({},a||{},{key:t,timeMin:i,timeMax:d,singleEvents:!0,maxResults:9999}),"local"!==o.timeZone&&(l.timeZone=o.timeZone);return l}(e.range,i,l.data,o.dateEnv);r.requestJson("GET",d,s,(function(e,r){var n,o;e.error?a({message:"Google Calendar API: "+e.error.message,errors:e.error.errors,xhr:r}):t({rawEvents:(n=e.items,o=s.timeZone,n.map((function(e){return function(e,r){var n=e.htmlLink||null;n&&r&&(n=function(e,r){return e.replace(/(\?.*?)?(#|$)/,(function(e,n,t){return(n?n+"&":"?")+r+t}))}(n,"ctz="+r));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:n,location:e.location,description:e.description}}(e,o)}))),xhr:r})}),(function(e,r){a({message:e,xhr:r})}))}else a({message:"Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"})}};var o=r.createPlugin({eventSourceDefs:[a]});e.default=o,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/google-calendar/package.json b/library/fullcalendar/packages/google-calendar/package.json
deleted file mode 100644
index e701b3802..000000000
--- a/library/fullcalendar/packages/google-calendar/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/google-calendar",
- "version": "4.4.2",
- "title": "FullCalendar Google Calendar Plugin",
- "description": "Fetch events from a public Google Calendar feed",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/google-calendar",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/icalendar/index.global.js b/library/fullcalendar/packages/icalendar/index.global.js
new file mode 100644
index 000000000..c92e09e54
--- /dev/null
+++ b/library/fullcalendar/packages/icalendar/index.global.js
@@ -0,0 +1,225 @@
+/*!
+FullCalendar iCalendar Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/icalendar
+(c) 2022 Adam Shaw
+*/
+FullCalendar.ICalendar = (function (exports, core, internal, ICAL) {
+ 'use strict';
+
+ function _interopNamespace(e) {
+ if (e && e.__esModule) return e;
+ var n = Object.create(null);
+ if (e) {
+ Object.keys(e).forEach(function (k) {
+ if (k !== 'default') {
+ var d = Object.getOwnPropertyDescriptor(e, k);
+ Object.defineProperty(n, k, d.get ? d : {
+ enumerable: true,
+ get: function () { return e[k]; }
+ });
+ }
+ });
+ }
+ n["default"] = e;
+ return n;
+ }
+
+ var ICAL__namespace = /*#__PURE__*/_interopNamespace(ICAL);
+
+ /* eslint-disable */
+ class IcalExpander {
+ constructor(opts) {
+ this.maxIterations = opts.maxIterations != null ? opts.maxIterations : 1000;
+ this.skipInvalidDates = opts.skipInvalidDates != null ? opts.skipInvalidDates : false;
+ this.jCalData = ICAL__namespace.parse(opts.ics);
+ this.component = new ICAL__namespace.Component(this.jCalData);
+ this.events = this.component.getAllSubcomponents('vevent').map(vevent => new ICAL__namespace.Event(vevent));
+ if (this.skipInvalidDates) {
+ this.events = this.events.filter((evt) => {
+ try {
+ evt.startDate.toJSDate();
+ evt.endDate.toJSDate();
+ return true;
+ }
+ catch (err) {
+ // skipping events with invalid time
+ return false;
+ }
+ });
+ }
+ }
+ between(after, before) {
+ function isEventWithinRange(startTime, endTime) {
+ return (!after || endTime >= after.getTime()) &&
+ (!before || startTime <= before.getTime());
+ }
+ function getTimes(eventOrOccurrence) {
+ const startTime = eventOrOccurrence.startDate.toJSDate().getTime();
+ let endTime = eventOrOccurrence.endDate.toJSDate().getTime();
+ // If it is an all day event, the end date is set to 00:00 of the next day
+ // So we need to make it be 23:59:59 to compare correctly with the given range
+ if (eventOrOccurrence.endDate.isDate && (endTime > startTime)) {
+ endTime -= 1;
+ }
+ return { startTime, endTime };
+ }
+ const exceptions = [];
+ this.events.forEach((event) => {
+ if (event.isRecurrenceException())
+ exceptions.push(event);
+ });
+ const ret = {
+ events: [],
+ occurrences: [],
+ };
+ this.events.filter(e => !e.isRecurrenceException()).forEach((event) => {
+ const exdates = [];
+ event.component.getAllProperties('exdate').forEach((exdateProp) => {
+ const exdate = exdateProp.getFirstValue();
+ exdates.push(exdate.toJSDate().getTime());
+ });
+ // Recurring event is handled differently
+ if (event.isRecurring()) {
+ const iterator = event.iterator();
+ let next;
+ let i = 0;
+ do {
+ i += 1;
+ next = iterator.next();
+ if (next) {
+ const occurrence = event.getOccurrenceDetails(next);
+ const { startTime, endTime } = getTimes(occurrence);
+ const isOccurrenceExcluded = exdates.indexOf(startTime) !== -1;
+ // TODO check that within same day?
+ const exception = exceptions.find(ex => ex.uid === event.uid && ex.recurrenceId.toJSDate().getTime() === occurrence.startDate.toJSDate().getTime());
+ // We have passed the max date, stop
+ if (before && startTime > before.getTime())
+ break;
+ // Check that we are within our range
+ if (isEventWithinRange(startTime, endTime)) {
+ if (exception) {
+ ret.events.push(exception);
+ }
+ else if (!isOccurrenceExcluded) {
+ ret.occurrences.push(occurrence);
+ }
+ }
+ }
+ } while (next && (!this.maxIterations || i < this.maxIterations));
+ return;
+ }
+ // Non-recurring event:
+ const { startTime, endTime } = getTimes(event);
+ if (isEventWithinRange(startTime, endTime))
+ ret.events.push(event);
+ });
+ return ret;
+ }
+ before(before) {
+ return this.between(undefined, before);
+ }
+ after(after) {
+ return this.between(after);
+ }
+ all() {
+ return this.between();
+ }
+ }
+
+ const eventSourceDef = {
+ parseMeta(refined) {
+ if (refined.url && refined.format === 'ics') {
+ return {
+ url: refined.url,
+ format: 'ics',
+ };
+ }
+ return null;
+ },
+ fetch(arg, successCallback, errorCallback) {
+ let meta = arg.eventSource.meta;
+ let { internalState } = meta;
+ /*
+ NOTE: isRefetch is a HACK. we would do the recurring-expanding in a separate plugin hook,
+ but we couldn't leverage built-in allDay-guessing, among other things.
+ */
+ if (!internalState || arg.isRefetch) {
+ internalState = meta.internalState = {
+ response: null,
+ iCalExpanderPromise: fetch(meta.url, { method: 'GET' }).then((response) => {
+ return response.text().then((icsText) => {
+ internalState.response = response;
+ return new IcalExpander({
+ ics: icsText,
+ skipInvalidDates: true,
+ });
+ });
+ }),
+ };
+ }
+ internalState.iCalExpanderPromise.then((iCalExpander) => {
+ successCallback({
+ rawEvents: expandICalEvents(iCalExpander, arg.range),
+ response: internalState.response,
+ });
+ }, errorCallback);
+ },
+ };
+ function expandICalEvents(iCalExpander, range) {
+ // expand the range. because our `range` is timeZone-agnostic UTC
+ // or maybe because ical.js always produces dates in local time? i forget
+ let rangeStart = internal.addDays(range.start, -1);
+ let rangeEnd = internal.addDays(range.end, 1);
+ let iCalRes = iCalExpander.between(rangeStart, rangeEnd); // end inclusive. will give extra results
+ let expanded = [];
+ // TODO: instead of using startDate/endDate.toString to communicate allDay,
+ // we can query startDate/endDate.isDate. More efficient to avoid formatting/reparsing.
+ // single events
+ for (let iCalEvent of iCalRes.events) {
+ expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalEvent.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalEvent.endDate)
+ ? iCalEvent.endDate.toString()
+ : null }));
+ }
+ // recurring event instances
+ for (let iCalOccurence of iCalRes.occurrences) {
+ let iCalEvent = iCalOccurence.item;
+ expanded.push(Object.assign(Object.assign({}, buildNonDateProps(iCalEvent)), { start: iCalOccurence.startDate.toString(), end: (specifiesEnd(iCalEvent) && iCalOccurence.endDate)
+ ? iCalOccurence.endDate.toString()
+ : null }));
+ }
+ return expanded;
+ }
+ function buildNonDateProps(iCalEvent) {
+ return {
+ title: iCalEvent.summary,
+ url: extractEventUrl(iCalEvent),
+ extendedProps: {
+ location: iCalEvent.location,
+ organizer: iCalEvent.organizer,
+ description: iCalEvent.description,
+ },
+ };
+ }
+ function extractEventUrl(iCalEvent) {
+ let urlProp = iCalEvent.component.getFirstProperty('url');
+ return urlProp ? urlProp.getFirstValue() : '';
+ }
+ function specifiesEnd(iCalEvent) {
+ return Boolean(iCalEvent.component.getFirstProperty('dtend')) ||
+ Boolean(iCalEvent.component.getFirstProperty('duration'));
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/icalendar',
+ eventSourceDefs: [eventSourceDef],
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal, ICAL);
diff --git a/library/fullcalendar/packages/icalendar/index.global.min.js b/library/fullcalendar/packages/icalendar/index.global.min.js
new file mode 100644
index 000000000..01d7e81ec
--- /dev/null
+++ b/library/fullcalendar/packages/icalendar/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar iCalendar Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/icalendar
+(c) 2022 Adam Shaw
+*/
+FullCalendar.ICalendar=function(e,t,n,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,t}var s=a(r);class i{constructor(e){this.maxIterations=null!=e.maxIterations?e.maxIterations:1e3,this.skipInvalidDates=null!=e.skipInvalidDates&&e.skipInvalidDates,this.jCalData=s.parse(e.ics),this.component=new s.Component(this.jCalData),this.events=this.component.getAllSubcomponents("vevent").map(e=>new s.Event(e)),this.skipInvalidDates&&(this.events=this.events.filter(e=>{try{return e.startDate.toJSDate(),e.endDate.toJSDate(),!0}catch(e){return!1}}))}between(e,t){function n(n,r){return(!e||r>=e.getTime())&&(!t||n<=t.getTime())}function r(e){const t=e.startDate.toJSDate().getTime();let n=e.endDate.toJSDate().getTime();return e.endDate.isDate&&n>t&&(n-=1),{startTime:t,endTime:n}}const a=[];this.events.forEach(e=>{e.isRecurrenceException()&&a.push(e)});const s={events:[],occurrences:[]};return this.events.filter(e=>!e.isRecurrenceException()).forEach(e=>{const i=[];if(e.component.getAllProperties("exdate").forEach(e=>{const t=e.getFirstValue();i.push(t.toJSDate().getTime())}),e.isRecurring()){const o=e.iterator();let c,l=0;do{if(l+=1,c=o.next(),c){const o=e.getOccurrenceDetails(c),{startTime:l,endTime:u}=r(o),d=-1!==i.indexOf(l),p=a.find(t=>t.uid===e.uid&&t.recurrenceId.toJSDate().getTime()===o.startDate.toJSDate().getTime());if(t&&l>t.getTime())break;n(l,u)&&(p?s.events.push(p):d||s.occurrences.push(o))}}while(c&&(!this.maxIterations||l<this.maxIterations));return}const{startTime:o,endTime:c}=r(e);n(o,c)&&s.events.push(e)}),s}before(e){return this.between(void 0,e)}after(e){return this.between(e)}all(){return this.between()}}const o={parseMeta:e=>e.url&&"ics"===e.format?{url:e.url,format:"ics"}:null,fetch(e,t,n){let r=e.eventSource.meta,{internalState:a}=r;a&&!e.isRefetch||(a=r.internalState={response:null,iCalExpanderPromise:fetch(r.url,{method:"GET"}).then(e=>e.text().then(t=>(a.response=e,new i({ics:t,skipInvalidDates:!0}))))}),a.iCalExpanderPromise.then(n=>{t({rawEvents:c(n,e.range),response:a.response})},n)}};function c(e,t){let r=n.addDays(t.start,-1),a=n.addDays(t.end,1),s=e.between(r,a),i=[];for(let e of s.events)i.push(Object.assign(Object.assign({},l(e)),{start:e.startDate.toString(),end:d(e)&&e.endDate?e.endDate.toString():null}));for(let e of s.occurrences){let t=e.item;i.push(Object.assign(Object.assign({},l(t)),{start:e.startDate.toString(),end:d(t)&&e.endDate?e.endDate.toString():null}))}return i}function l(e){return{title:e.summary,url:u(e),extendedProps:{location:e.location,organizer:e.organizer,description:e.description}}}function u(e){let t=e.component.getFirstProperty("url");return t?t.getFirstValue():""}function d(e){return Boolean(e.component.getFirstProperty("dtend"))||Boolean(e.component.getFirstProperty("duration"))}var p=t.createPlugin({name:"@fullcalendar/icalendar",eventSourceDefs:[o]});return t.globalPlugins.push(p),e.default=p,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,ICAL); \ No newline at end of file
diff --git a/library/fullcalendar/packages/interaction/LICENSE.txt b/library/fullcalendar/packages/interaction/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/interaction/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/interaction/README.md b/library/fullcalendar/packages/interaction/README.md
deleted file mode 100644
index ee5c738ab..000000000
--- a/library/fullcalendar/packages/interaction/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Interaction Plugin
-
-Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions
-
-[View the docs &raquo;](https://fullcalendar.io/docs/editable)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/interaction/index.global.js b/library/fullcalendar/packages/interaction/index.global.js
new file mode 100644
index 000000000..296460d0e
--- /dev/null
+++ b/library/fullcalendar/packages/interaction/index.global.js
@@ -0,0 +1,2114 @@
+/*!
+FullCalendar Interaction Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/editable
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Interaction = (function (exports, core, internal) {
+ 'use strict';
+
+ internal.config.touchMouseIgnoreWait = 500;
+ let ignoreMouseDepth = 0;
+ let listenerCnt = 0;
+ let isWindowTouchMoveCancelled = false;
+ /*
+ Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
+ Tracks when the pointer "drags" on a certain element, meaning down+move+up.
+
+ Also, tracks if there was touch-scrolling.
+ Also, can prevent touch-scrolling from happening.
+ Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
+
+ emits:
+ - pointerdown
+ - pointermove
+ - pointerup
+ */
+ class PointerDragging {
+ constructor(containerEl) {
+ this.subjectEl = null;
+ // options that can be directly assigned by caller
+ this.selector = ''; // will cause subjectEl in all emitted events to be this element
+ this.handleSelector = '';
+ this.shouldIgnoreMove = false;
+ this.shouldWatchScroll = true; // for simulating pointermove on scroll
+ // internal states
+ this.isDragging = false;
+ this.isTouchDragging = false;
+ this.wasTouchScroll = false;
+ // Mouse
+ // ----------------------------------------------------------------------------------------------------
+ this.handleMouseDown = (ev) => {
+ if (!this.shouldIgnoreMouse() &&
+ isPrimaryMouseButton(ev) &&
+ this.tryStart(ev)) {
+ let pev = this.createEventFromMouse(ev, true);
+ this.emitter.trigger('pointerdown', pev);
+ this.initScrollWatch(pev);
+ if (!this.shouldIgnoreMove) {
+ document.addEventListener('mousemove', this.handleMouseMove);
+ }
+ document.addEventListener('mouseup', this.handleMouseUp);
+ }
+ };
+ this.handleMouseMove = (ev) => {
+ let pev = this.createEventFromMouse(ev);
+ this.recordCoords(pev);
+ this.emitter.trigger('pointermove', pev);
+ };
+ this.handleMouseUp = (ev) => {
+ document.removeEventListener('mousemove', this.handleMouseMove);
+ document.removeEventListener('mouseup', this.handleMouseUp);
+ this.emitter.trigger('pointerup', this.createEventFromMouse(ev));
+ this.cleanup(); // call last so that pointerup has access to props
+ };
+ // Touch
+ // ----------------------------------------------------------------------------------------------------
+ this.handleTouchStart = (ev) => {
+ if (this.tryStart(ev)) {
+ this.isTouchDragging = true;
+ let pev = this.createEventFromTouch(ev, true);
+ this.emitter.trigger('pointerdown', pev);
+ this.initScrollWatch(pev);
+ // unlike mouse, need to attach to target, not document
+ // https://stackoverflow.com/a/45760014
+ let targetEl = ev.target;
+ if (!this.shouldIgnoreMove) {
+ targetEl.addEventListener('touchmove', this.handleTouchMove);
+ }
+ targetEl.addEventListener('touchend', this.handleTouchEnd);
+ targetEl.addEventListener('touchcancel', this.handleTouchEnd); // treat it as a touch end
+ // attach a handler to get called when ANY scroll action happens on the page.
+ // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
+ // http://stackoverflow.com/a/32954565/96342
+ window.addEventListener('scroll', this.handleTouchScroll, true);
+ }
+ };
+ this.handleTouchMove = (ev) => {
+ let pev = this.createEventFromTouch(ev);
+ this.recordCoords(pev);
+ this.emitter.trigger('pointermove', pev);
+ };
+ this.handleTouchEnd = (ev) => {
+ if (this.isDragging) { // done to guard against touchend followed by touchcancel
+ let targetEl = ev.target;
+ targetEl.removeEventListener('touchmove', this.handleTouchMove);
+ targetEl.removeEventListener('touchend', this.handleTouchEnd);
+ targetEl.removeEventListener('touchcancel', this.handleTouchEnd);
+ window.removeEventListener('scroll', this.handleTouchScroll, true); // useCaptured=true
+ this.emitter.trigger('pointerup', this.createEventFromTouch(ev));
+ this.cleanup(); // call last so that pointerup has access to props
+ this.isTouchDragging = false;
+ startIgnoringMouse();
+ }
+ };
+ this.handleTouchScroll = () => {
+ this.wasTouchScroll = true;
+ };
+ this.handleScroll = (ev) => {
+ if (!this.shouldIgnoreMove) {
+ let pageX = (window.pageXOffset - this.prevScrollX) + this.prevPageX;
+ let pageY = (window.pageYOffset - this.prevScrollY) + this.prevPageY;
+ this.emitter.trigger('pointermove', {
+ origEvent: ev,
+ isTouch: this.isTouchDragging,
+ subjectEl: this.subjectEl,
+ pageX,
+ pageY,
+ deltaX: pageX - this.origPageX,
+ deltaY: pageY - this.origPageY,
+ });
+ }
+ };
+ this.containerEl = containerEl;
+ this.emitter = new internal.Emitter();
+ containerEl.addEventListener('mousedown', this.handleMouseDown);
+ containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
+ listenerCreated();
+ }
+ destroy() {
+ this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
+ this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
+ listenerDestroyed();
+ }
+ tryStart(ev) {
+ let subjectEl = this.querySubjectEl(ev);
+ let downEl = ev.target;
+ if (subjectEl &&
+ (!this.handleSelector || internal.elementClosest(downEl, this.handleSelector))) {
+ this.subjectEl = subjectEl;
+ this.isDragging = true; // do this first so cancelTouchScroll will work
+ this.wasTouchScroll = false;
+ return true;
+ }
+ return false;
+ }
+ cleanup() {
+ isWindowTouchMoveCancelled = false;
+ this.isDragging = false;
+ this.subjectEl = null;
+ // keep wasTouchScroll around for later access
+ this.destroyScrollWatch();
+ }
+ querySubjectEl(ev) {
+ if (this.selector) {
+ return internal.elementClosest(ev.target, this.selector);
+ }
+ return this.containerEl;
+ }
+ shouldIgnoreMouse() {
+ return ignoreMouseDepth || this.isTouchDragging;
+ }
+ // can be called by user of this class, to cancel touch-based scrolling for the current drag
+ cancelTouchScroll() {
+ if (this.isDragging) {
+ isWindowTouchMoveCancelled = true;
+ }
+ }
+ // Scrolling that simulates pointermoves
+ // ----------------------------------------------------------------------------------------------------
+ initScrollWatch(ev) {
+ if (this.shouldWatchScroll) {
+ this.recordCoords(ev);
+ window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
+ }
+ }
+ recordCoords(ev) {
+ if (this.shouldWatchScroll) {
+ this.prevPageX = ev.pageX;
+ this.prevPageY = ev.pageY;
+ this.prevScrollX = window.pageXOffset;
+ this.prevScrollY = window.pageYOffset;
+ }
+ }
+ destroyScrollWatch() {
+ if (this.shouldWatchScroll) {
+ window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
+ }
+ }
+ // Event Normalization
+ // ----------------------------------------------------------------------------------------------------
+ createEventFromMouse(ev, isFirst) {
+ let deltaX = 0;
+ let deltaY = 0;
+ // TODO: repeat code
+ if (isFirst) {
+ this.origPageX = ev.pageX;
+ this.origPageY = ev.pageY;
+ }
+ else {
+ deltaX = ev.pageX - this.origPageX;
+ deltaY = ev.pageY - this.origPageY;
+ }
+ return {
+ origEvent: ev,
+ isTouch: false,
+ subjectEl: this.subjectEl,
+ pageX: ev.pageX,
+ pageY: ev.pageY,
+ deltaX,
+ deltaY,
+ };
+ }
+ createEventFromTouch(ev, isFirst) {
+ let touches = ev.touches;
+ let pageX;
+ let pageY;
+ let deltaX = 0;
+ let deltaY = 0;
+ // if touch coords available, prefer,
+ // because FF would give bad ev.pageX ev.pageY
+ if (touches && touches.length) {
+ pageX = touches[0].pageX;
+ pageY = touches[0].pageY;
+ }
+ else {
+ pageX = ev.pageX;
+ pageY = ev.pageY;
+ }
+ // TODO: repeat code
+ if (isFirst) {
+ this.origPageX = pageX;
+ this.origPageY = pageY;
+ }
+ else {
+ deltaX = pageX - this.origPageX;
+ deltaY = pageY - this.origPageY;
+ }
+ return {
+ origEvent: ev,
+ isTouch: true,
+ subjectEl: this.subjectEl,
+ pageX,
+ pageY,
+ deltaX,
+ deltaY,
+ };
+ }
+ }
+ // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
+ function isPrimaryMouseButton(ev) {
+ return ev.button === 0 && !ev.ctrlKey;
+ }
+ // Ignoring fake mouse events generated by touch
+ // ----------------------------------------------------------------------------------------------------
+ function startIgnoringMouse() {
+ ignoreMouseDepth += 1;
+ setTimeout(() => {
+ ignoreMouseDepth -= 1;
+ }, internal.config.touchMouseIgnoreWait);
+ }
+ // We want to attach touchmove as early as possible for Safari
+ // ----------------------------------------------------------------------------------------------------
+ function listenerCreated() {
+ listenerCnt += 1;
+ if (listenerCnt === 1) {
+ window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
+ }
+ }
+ function listenerDestroyed() {
+ listenerCnt -= 1;
+ if (!listenerCnt) {
+ window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
+ }
+ }
+ function onWindowTouchMove(ev) {
+ if (isWindowTouchMoveCancelled) {
+ ev.preventDefault();
+ }
+ }
+
+ /*
+ An effect in which an element follows the movement of a pointer across the screen.
+ The moving element is a clone of some other element.
+ Must call start + handleMove + stop.
+ */
+ class ElementMirror {
+ constructor() {
+ this.isVisible = false; // must be explicitly enabled
+ this.sourceEl = null;
+ this.mirrorEl = null;
+ this.sourceElRect = null; // screen coords relative to viewport
+ // options that can be set directly by caller
+ this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues
+ this.zIndex = 9999;
+ this.revertDuration = 0;
+ }
+ start(sourceEl, pageX, pageY) {
+ this.sourceEl = sourceEl;
+ this.sourceElRect = this.sourceEl.getBoundingClientRect();
+ this.origScreenX = pageX - window.pageXOffset;
+ this.origScreenY = pageY - window.pageYOffset;
+ this.deltaX = 0;
+ this.deltaY = 0;
+ this.updateElPosition();
+ }
+ handleMove(pageX, pageY) {
+ this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
+ this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
+ this.updateElPosition();
+ }
+ // can be called before start
+ setIsVisible(bool) {
+ if (bool) {
+ if (!this.isVisible) {
+ if (this.mirrorEl) {
+ this.mirrorEl.style.display = '';
+ }
+ this.isVisible = bool; // needs to happen before updateElPosition
+ this.updateElPosition(); // because was not updating the position while invisible
+ }
+ }
+ else if (this.isVisible) {
+ if (this.mirrorEl) {
+ this.mirrorEl.style.display = 'none';
+ }
+ this.isVisible = bool;
+ }
+ }
+ // always async
+ stop(needsRevertAnimation, callback) {
+ let done = () => {
+ this.cleanup();
+ callback();
+ };
+ if (needsRevertAnimation &&
+ this.mirrorEl &&
+ this.isVisible &&
+ this.revertDuration && // if 0, transition won't work
+ (this.deltaX || this.deltaY) // if same coords, transition won't work
+ ) {
+ this.doRevertAnimation(done, this.revertDuration);
+ }
+ else {
+ setTimeout(done, 0);
+ }
+ }
+ doRevertAnimation(callback, revertDuration) {
+ let mirrorEl = this.mirrorEl;
+ let finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
+ mirrorEl.style.transition =
+ 'top ' + revertDuration + 'ms,' +
+ 'left ' + revertDuration + 'ms';
+ internal.applyStyle(mirrorEl, {
+ left: finalSourceElRect.left,
+ top: finalSourceElRect.top,
+ });
+ internal.whenTransitionDone(mirrorEl, () => {
+ mirrorEl.style.transition = '';
+ callback();
+ });
+ }
+ cleanup() {
+ if (this.mirrorEl) {
+ internal.removeElement(this.mirrorEl);
+ this.mirrorEl = null;
+ }
+ this.sourceEl = null;
+ }
+ updateElPosition() {
+ if (this.sourceEl && this.isVisible) {
+ internal.applyStyle(this.getMirrorEl(), {
+ left: this.sourceElRect.left + this.deltaX,
+ top: this.sourceElRect.top + this.deltaY,
+ });
+ }
+ }
+ getMirrorEl() {
+ let sourceElRect = this.sourceElRect;
+ let mirrorEl = this.mirrorEl;
+ if (!mirrorEl) {
+ mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
+ // we don't want long taps or any mouse interaction causing selection/menus.
+ // would use preventSelection(), but that prevents selectstart, causing problems.
+ mirrorEl.classList.add('fc-unselectable');
+ mirrorEl.classList.add('fc-event-dragging');
+ internal.applyStyle(mirrorEl, {
+ position: 'fixed',
+ zIndex: this.zIndex,
+ visibility: '',
+ boxSizing: 'border-box',
+ width: sourceElRect.right - sourceElRect.left,
+ height: sourceElRect.bottom - sourceElRect.top,
+ right: 'auto',
+ bottom: 'auto',
+ margin: 0,
+ });
+ this.parentNode.appendChild(mirrorEl);
+ }
+ return mirrorEl;
+ }
+ }
+
+ /*
+ Is a cache for a given element's scroll information (all the info that ScrollController stores)
+ in addition the "client rectangle" of the element.. the area within the scrollbars.
+
+ The cache can be in one of two modes:
+ - doesListening:false - ignores when the container is scrolled by someone else
+ - doesListening:true - watch for scrolling and update the cache
+ */
+ class ScrollGeomCache extends internal.ScrollController {
+ constructor(scrollController, doesListening) {
+ super();
+ this.handleScroll = () => {
+ this.scrollTop = this.scrollController.getScrollTop();
+ this.scrollLeft = this.scrollController.getScrollLeft();
+ this.handleScrollChange();
+ };
+ this.scrollController = scrollController;
+ this.doesListening = doesListening;
+ this.scrollTop = this.origScrollTop = scrollController.getScrollTop();
+ this.scrollLeft = this.origScrollLeft = scrollController.getScrollLeft();
+ this.scrollWidth = scrollController.getScrollWidth();
+ this.scrollHeight = scrollController.getScrollHeight();
+ this.clientWidth = scrollController.getClientWidth();
+ this.clientHeight = scrollController.getClientHeight();
+ this.clientRect = this.computeClientRect(); // do last in case it needs cached values
+ if (this.doesListening) {
+ this.getEventTarget().addEventListener('scroll', this.handleScroll);
+ }
+ }
+ destroy() {
+ if (this.doesListening) {
+ this.getEventTarget().removeEventListener('scroll', this.handleScroll);
+ }
+ }
+ getScrollTop() {
+ return this.scrollTop;
+ }
+ getScrollLeft() {
+ return this.scrollLeft;
+ }
+ setScrollTop(top) {
+ this.scrollController.setScrollTop(top);
+ if (!this.doesListening) {
+ // we are not relying on the element to normalize out-of-bounds scroll values
+ // so we need to sanitize ourselves
+ this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
+ this.handleScrollChange();
+ }
+ }
+ setScrollLeft(top) {
+ this.scrollController.setScrollLeft(top);
+ if (!this.doesListening) {
+ // we are not relying on the element to normalize out-of-bounds scroll values
+ // so we need to sanitize ourselves
+ this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
+ this.handleScrollChange();
+ }
+ }
+ getClientWidth() {
+ return this.clientWidth;
+ }
+ getClientHeight() {
+ return this.clientHeight;
+ }
+ getScrollWidth() {
+ return this.scrollWidth;
+ }
+ getScrollHeight() {
+ return this.scrollHeight;
+ }
+ handleScrollChange() {
+ }
+ }
+
+ class ElementScrollGeomCache extends ScrollGeomCache {
+ constructor(el, doesListening) {
+ super(new internal.ElementScrollController(el), doesListening);
+ }
+ getEventTarget() {
+ return this.scrollController.el;
+ }
+ computeClientRect() {
+ return internal.computeInnerRect(this.scrollController.el);
+ }
+ }
+
+ class WindowScrollGeomCache extends ScrollGeomCache {
+ constructor(doesListening) {
+ super(new internal.WindowScrollController(), doesListening);
+ }
+ getEventTarget() {
+ return window;
+ }
+ computeClientRect() {
+ return {
+ left: this.scrollLeft,
+ right: this.scrollLeft + this.clientWidth,
+ top: this.scrollTop,
+ bottom: this.scrollTop + this.clientHeight,
+ };
+ }
+ // the window is the only scroll object that changes it's rectangle relative
+ // to the document's topleft as it scrolls
+ handleScrollChange() {
+ this.clientRect = this.computeClientRect();
+ }
+ }
+
+ // If available we are using native "performance" API instead of "Date"
+ // Read more about it on MDN:
+ // https://developer.mozilla.org/en-US/docs/Web/API/Performance
+ const getTime = typeof performance === 'function' ? performance.now : Date.now;
+ /*
+ For a pointer interaction, automatically scrolls certain scroll containers when the pointer
+ approaches the edge.
+
+ The caller must call start + handleMove + stop.
+ */
+ class AutoScroller {
+ constructor() {
+ // options that can be set by caller
+ this.isEnabled = true;
+ this.scrollQuery = [window, '.fc-scroller'];
+ this.edgeThreshold = 50; // pixels
+ this.maxVelocity = 300; // pixels per second
+ // internal state
+ this.pointerScreenX = null;
+ this.pointerScreenY = null;
+ this.isAnimating = false;
+ this.scrollCaches = null;
+ // protect against the initial pointerdown being too close to an edge and starting the scroll
+ this.everMovedUp = false;
+ this.everMovedDown = false;
+ this.everMovedLeft = false;
+ this.everMovedRight = false;
+ this.animate = () => {
+ if (this.isAnimating) { // wasn't cancelled between animation calls
+ let edge = this.computeBestEdge(this.pointerScreenX + window.pageXOffset, this.pointerScreenY + window.pageYOffset);
+ if (edge) {
+ let now = getTime();
+ this.handleSide(edge, (now - this.msSinceRequest) / 1000);
+ this.requestAnimation(now);
+ }
+ else {
+ this.isAnimating = false; // will stop animation
+ }
+ }
+ };
+ }
+ start(pageX, pageY, scrollStartEl) {
+ if (this.isEnabled) {
+ this.scrollCaches = this.buildCaches(scrollStartEl);
+ this.pointerScreenX = null;
+ this.pointerScreenY = null;
+ this.everMovedUp = false;
+ this.everMovedDown = false;
+ this.everMovedLeft = false;
+ this.everMovedRight = false;
+ this.handleMove(pageX, pageY);
+ }
+ }
+ handleMove(pageX, pageY) {
+ if (this.isEnabled) {
+ let pointerScreenX = pageX - window.pageXOffset;
+ let pointerScreenY = pageY - window.pageYOffset;
+ let yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
+ let xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
+ if (yDelta < 0) {
+ this.everMovedUp = true;
+ }
+ else if (yDelta > 0) {
+ this.everMovedDown = true;
+ }
+ if (xDelta < 0) {
+ this.everMovedLeft = true;
+ }
+ else if (xDelta > 0) {
+ this.everMovedRight = true;
+ }
+ this.pointerScreenX = pointerScreenX;
+ this.pointerScreenY = pointerScreenY;
+ if (!this.isAnimating) {
+ this.isAnimating = true;
+ this.requestAnimation(getTime());
+ }
+ }
+ }
+ stop() {
+ if (this.isEnabled) {
+ this.isAnimating = false; // will stop animation
+ for (let scrollCache of this.scrollCaches) {
+ scrollCache.destroy();
+ }
+ this.scrollCaches = null;
+ }
+ }
+ requestAnimation(now) {
+ this.msSinceRequest = now;
+ requestAnimationFrame(this.animate);
+ }
+ handleSide(edge, seconds) {
+ let { scrollCache } = edge;
+ let { edgeThreshold } = this;
+ let invDistance = edgeThreshold - edge.distance;
+ let velocity = // the closer to the edge, the faster we scroll
+ ((invDistance * invDistance) / (edgeThreshold * edgeThreshold)) * // quadratic
+ this.maxVelocity * seconds;
+ let sign = 1;
+ switch (edge.name) {
+ case 'left':
+ sign = -1;
+ // falls through
+ case 'right':
+ scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
+ break;
+ case 'top':
+ sign = -1;
+ // falls through
+ case 'bottom':
+ scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
+ break;
+ }
+ }
+ // left/top are relative to document topleft
+ computeBestEdge(left, top) {
+ let { edgeThreshold } = this;
+ let bestSide = null;
+ let scrollCaches = this.scrollCaches || [];
+ for (let scrollCache of scrollCaches) {
+ let rect = scrollCache.clientRect;
+ let leftDist = left - rect.left;
+ let rightDist = rect.right - left;
+ let topDist = top - rect.top;
+ let bottomDist = rect.bottom - top;
+ // completely within the rect?
+ if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
+ if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
+ (!bestSide || bestSide.distance > topDist)) {
+ bestSide = { scrollCache, name: 'top', distance: topDist };
+ }
+ if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
+ (!bestSide || bestSide.distance > bottomDist)) {
+ bestSide = { scrollCache, name: 'bottom', distance: bottomDist };
+ }
+ if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
+ (!bestSide || bestSide.distance > leftDist)) {
+ bestSide = { scrollCache, name: 'left', distance: leftDist };
+ }
+ if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
+ (!bestSide || bestSide.distance > rightDist)) {
+ bestSide = { scrollCache, name: 'right', distance: rightDist };
+ }
+ }
+ }
+ return bestSide;
+ }
+ buildCaches(scrollStartEl) {
+ return this.queryScrollEls(scrollStartEl).map((el) => {
+ if (el === window) {
+ return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
+ }
+ return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
+ });
+ }
+ queryScrollEls(scrollStartEl) {
+ let els = [];
+ for (let query of this.scrollQuery) {
+ if (typeof query === 'object') {
+ els.push(query);
+ }
+ else {
+ els.push(...Array.prototype.slice.call(internal.getElRoot(scrollStartEl).querySelectorAll(query)));
+ }
+ }
+ return els;
+ }
+ }
+
+ /*
+ Monitors dragging on an element. Has a number of high-level features:
+ - minimum distance required before dragging
+ - minimum wait time ("delay") before dragging
+ - a mirror element that follows the pointer
+ */
+ class FeaturefulElementDragging extends internal.ElementDragging {
+ constructor(containerEl, selector) {
+ super(containerEl);
+ this.containerEl = containerEl;
+ // options that can be directly set by caller
+ // the caller can also set the PointerDragging's options as well
+ this.delay = null;
+ this.minDistance = 0;
+ this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
+ this.mirrorNeedsRevert = false;
+ this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
+ this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
+ this.isDelayEnded = false;
+ this.isDistanceSurpassed = false;
+ this.delayTimeoutId = null;
+ this.onPointerDown = (ev) => {
+ if (!this.isDragging) { // so new drag doesn't happen while revert animation is going
+ this.isInteracting = true;
+ this.isDelayEnded = false;
+ this.isDistanceSurpassed = false;
+ internal.preventSelection(document.body);
+ internal.preventContextMenu(document.body);
+ // prevent links from being visited if there's an eventual drag.
+ // also prevents selection in older browsers (maybe?).
+ // not necessary for touch, besides, browser would complain about passiveness.
+ if (!ev.isTouch) {
+ ev.origEvent.preventDefault();
+ }
+ this.emitter.trigger('pointerdown', ev);
+ if (this.isInteracting && // not destroyed via pointerdown handler
+ !this.pointer.shouldIgnoreMove) {
+ // actions related to initiating dragstart+dragmove+dragend...
+ this.mirror.setIsVisible(false); // reset. caller must set-visible
+ this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
+ this.startDelay(ev);
+ if (!this.minDistance) {
+ this.handleDistanceSurpassed(ev);
+ }
+ }
+ }
+ };
+ this.onPointerMove = (ev) => {
+ if (this.isInteracting) {
+ this.emitter.trigger('pointermove', ev);
+ if (!this.isDistanceSurpassed) {
+ let minDistance = this.minDistance;
+ let distanceSq; // current distance from the origin, squared
+ let { deltaX, deltaY } = ev;
+ distanceSq = deltaX * deltaX + deltaY * deltaY;
+ if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
+ this.handleDistanceSurpassed(ev);
+ }
+ }
+ if (this.isDragging) {
+ // a real pointer move? (not one simulated by scrolling)
+ if (ev.origEvent.type !== 'scroll') {
+ this.mirror.handleMove(ev.pageX, ev.pageY);
+ this.autoScroller.handleMove(ev.pageX, ev.pageY);
+ }
+ this.emitter.trigger('dragmove', ev);
+ }
+ }
+ };
+ this.onPointerUp = (ev) => {
+ if (this.isInteracting) {
+ this.isInteracting = false;
+ internal.allowSelection(document.body);
+ internal.allowContextMenu(document.body);
+ this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
+ if (this.isDragging) {
+ this.autoScroller.stop();
+ this.tryStopDrag(ev); // which will stop the mirror
+ }
+ if (this.delayTimeoutId) {
+ clearTimeout(this.delayTimeoutId);
+ this.delayTimeoutId = null;
+ }
+ }
+ };
+ let pointer = this.pointer = new PointerDragging(containerEl);
+ pointer.emitter.on('pointerdown', this.onPointerDown);
+ pointer.emitter.on('pointermove', this.onPointerMove);
+ pointer.emitter.on('pointerup', this.onPointerUp);
+ if (selector) {
+ pointer.selector = selector;
+ }
+ this.mirror = new ElementMirror();
+ this.autoScroller = new AutoScroller();
+ }
+ destroy() {
+ this.pointer.destroy();
+ // HACK: simulate a pointer-up to end the current drag
+ // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire)
+ this.onPointerUp({});
+ }
+ startDelay(ev) {
+ if (typeof this.delay === 'number') {
+ this.delayTimeoutId = setTimeout(() => {
+ this.delayTimeoutId = null;
+ this.handleDelayEnd(ev);
+ }, this.delay); // not assignable to number!
+ }
+ else {
+ this.handleDelayEnd(ev);
+ }
+ }
+ handleDelayEnd(ev) {
+ this.isDelayEnded = true;
+ this.tryStartDrag(ev);
+ }
+ handleDistanceSurpassed(ev) {
+ this.isDistanceSurpassed = true;
+ this.tryStartDrag(ev);
+ }
+ tryStartDrag(ev) {
+ if (this.isDelayEnded && this.isDistanceSurpassed) {
+ if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
+ this.isDragging = true;
+ this.mirrorNeedsRevert = false;
+ this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl);
+ this.emitter.trigger('dragstart', ev);
+ if (this.touchScrollAllowed === false) {
+ this.pointer.cancelTouchScroll();
+ }
+ }
+ }
+ }
+ tryStopDrag(ev) {
+ // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
+ // that come from the document to fire beforehand. much more convenient this way.
+ this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev));
+ }
+ stopDrag(ev) {
+ this.isDragging = false;
+ this.emitter.trigger('dragend', ev);
+ }
+ // fill in the implementations...
+ setIgnoreMove(bool) {
+ this.pointer.shouldIgnoreMove = bool;
+ }
+ setMirrorIsVisible(bool) {
+ this.mirror.setIsVisible(bool);
+ }
+ setMirrorNeedsRevert(bool) {
+ this.mirrorNeedsRevert = bool;
+ }
+ setAutoScrollEnabled(bool) {
+ this.autoScroller.isEnabled = bool;
+ }
+ }
+
+ /*
+ When this class is instantiated, it records the offset of an element (relative to the document topleft),
+ and continues to monitor scrolling, updating the cached coordinates if it needs to.
+ Does not access the DOM after instantiation, so highly performant.
+
+ Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
+ and an determine if a given point is inside the combined clipping rectangle.
+ */
+ class OffsetTracker {
+ constructor(el) {
+ this.origRect = internal.computeRect(el);
+ // will work fine for divs that have overflow:hidden
+ this.scrollCaches = internal.getClippingParents(el).map((scrollEl) => new ElementScrollGeomCache(scrollEl, true));
+ }
+ destroy() {
+ for (let scrollCache of this.scrollCaches) {
+ scrollCache.destroy();
+ }
+ }
+ computeLeft() {
+ let left = this.origRect.left;
+ for (let scrollCache of this.scrollCaches) {
+ left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
+ }
+ return left;
+ }
+ computeTop() {
+ let top = this.origRect.top;
+ for (let scrollCache of this.scrollCaches) {
+ top += scrollCache.origScrollTop - scrollCache.getScrollTop();
+ }
+ return top;
+ }
+ isWithinClipping(pageX, pageY) {
+ let point = { left: pageX, top: pageY };
+ for (let scrollCache of this.scrollCaches) {
+ if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
+ !internal.pointInsideRect(point, scrollCache.clientRect)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ // certain clipping containers should never constrain interactions, like <html> and <body>
+ // https://github.com/fullcalendar/fullcalendar/issues/3615
+ function isIgnoredClipping(node) {
+ let tagName = node.tagName;
+ return tagName === 'HTML' || tagName === 'BODY';
+ }
+
+ /*
+ Tracks movement over multiple droppable areas (aka "hits")
+ that exist in one or more DateComponents.
+ Relies on an existing draggable.
+
+ emits:
+ - pointerdown
+ - dragstart
+ - hitchange - fires initially, even if not over a hit
+ - pointerup
+ - (hitchange - again, to null, if ended over a hit)
+ - dragend
+ */
+ class HitDragging {
+ constructor(dragging, droppableStore) {
+ // options that can be set by caller
+ this.useSubjectCenter = false;
+ this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
+ this.initialHit = null;
+ this.movingHit = null;
+ this.finalHit = null; // won't ever be populated if shouldIgnoreMove
+ this.handlePointerDown = (ev) => {
+ let { dragging } = this;
+ this.initialHit = null;
+ this.movingHit = null;
+ this.finalHit = null;
+ this.prepareHits();
+ this.processFirstCoord(ev);
+ if (this.initialHit || !this.requireInitial) {
+ dragging.setIgnoreMove(false);
+ // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
+ this.emitter.trigger('pointerdown', ev);
+ }
+ else {
+ dragging.setIgnoreMove(true);
+ }
+ };
+ this.handleDragStart = (ev) => {
+ this.emitter.trigger('dragstart', ev);
+ this.handleMove(ev, true); // force = fire even if initially null
+ };
+ this.handleDragMove = (ev) => {
+ this.emitter.trigger('dragmove', ev);
+ this.handleMove(ev);
+ };
+ this.handlePointerUp = (ev) => {
+ this.releaseHits();
+ this.emitter.trigger('pointerup', ev);
+ };
+ this.handleDragEnd = (ev) => {
+ if (this.movingHit) {
+ this.emitter.trigger('hitupdate', null, true, ev);
+ }
+ this.finalHit = this.movingHit;
+ this.movingHit = null;
+ this.emitter.trigger('dragend', ev);
+ };
+ this.droppableStore = droppableStore;
+ dragging.emitter.on('pointerdown', this.handlePointerDown);
+ dragging.emitter.on('dragstart', this.handleDragStart);
+ dragging.emitter.on('dragmove', this.handleDragMove);
+ dragging.emitter.on('pointerup', this.handlePointerUp);
+ dragging.emitter.on('dragend', this.handleDragEnd);
+ this.dragging = dragging;
+ this.emitter = new internal.Emitter();
+ }
+ // sets initialHit
+ // sets coordAdjust
+ processFirstCoord(ev) {
+ let origPoint = { left: ev.pageX, top: ev.pageY };
+ let adjustedPoint = origPoint;
+ let subjectEl = ev.subjectEl;
+ let subjectRect;
+ if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot
+ subjectRect = internal.computeRect(subjectEl);
+ adjustedPoint = internal.constrainPoint(adjustedPoint, subjectRect);
+ }
+ let initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
+ if (initialHit) {
+ if (this.useSubjectCenter && subjectRect) {
+ let slicedSubjectRect = internal.intersectRects(subjectRect, initialHit.rect);
+ if (slicedSubjectRect) {
+ adjustedPoint = internal.getRectCenter(slicedSubjectRect);
+ }
+ }
+ this.coordAdjust = internal.diffPoints(adjustedPoint, origPoint);
+ }
+ else {
+ this.coordAdjust = { left: 0, top: 0 };
+ }
+ }
+ handleMove(ev, forceHandle) {
+ let hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
+ if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
+ this.movingHit = hit;
+ this.emitter.trigger('hitupdate', hit, false, ev);
+ }
+ }
+ prepareHits() {
+ this.offsetTrackers = internal.mapHash(this.droppableStore, (interactionSettings) => {
+ interactionSettings.component.prepareHits();
+ return new OffsetTracker(interactionSettings.el);
+ });
+ }
+ releaseHits() {
+ let { offsetTrackers } = this;
+ for (let id in offsetTrackers) {
+ offsetTrackers[id].destroy();
+ }
+ this.offsetTrackers = {};
+ }
+ queryHitForOffset(offsetLeft, offsetTop) {
+ let { droppableStore, offsetTrackers } = this;
+ let bestHit = null;
+ for (let id in droppableStore) {
+ let component = droppableStore[id].component;
+ let offsetTracker = offsetTrackers[id];
+ if (offsetTracker && // wasn't destroyed mid-drag
+ offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
+ let originLeft = offsetTracker.computeLeft();
+ let originTop = offsetTracker.computeTop();
+ let positionLeft = offsetLeft - originLeft;
+ let positionTop = offsetTop - originTop;
+ let { origRect } = offsetTracker;
+ let width = origRect.right - origRect.left;
+ let height = origRect.bottom - origRect.top;
+ if (
+ // must be within the element's bounds
+ positionLeft >= 0 && positionLeft < width &&
+ positionTop >= 0 && positionTop < height) {
+ let hit = component.queryHit(positionLeft, positionTop, width, height);
+ if (hit && (
+ // make sure the hit is within activeRange, meaning it's not a dead cell
+ internal.rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range)) &&
+ (!bestHit || hit.layer > bestHit.layer)) {
+ hit.componentId = id;
+ hit.context = component.context;
+ // TODO: better way to re-orient rectangle
+ hit.rect.left += originLeft;
+ hit.rect.right += originLeft;
+ hit.rect.top += originTop;
+ hit.rect.bottom += originTop;
+ bestHit = hit;
+ }
+ }
+ }
+ }
+ return bestHit;
+ }
+ }
+ function isHitsEqual(hit0, hit1) {
+ if (!hit0 && !hit1) {
+ return true;
+ }
+ if (Boolean(hit0) !== Boolean(hit1)) {
+ return false;
+ }
+ return internal.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
+ }
+
+ function buildDatePointApiWithContext(dateSpan, context) {
+ let props = {};
+ for (let transform of context.pluginHooks.datePointTransforms) {
+ Object.assign(props, transform(dateSpan, context));
+ }
+ Object.assign(props, buildDatePointApi(dateSpan, context.dateEnv));
+ return props;
+ }
+ function buildDatePointApi(span, dateEnv) {
+ return {
+ date: dateEnv.toDate(span.range.start),
+ dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
+ allDay: span.allDay,
+ };
+ }
+
+ /*
+ Monitors when the user clicks on a specific date/time of a component.
+ A pointerdown+pointerup on the same "hit" constitutes a click.
+ */
+ class DateClicking extends internal.Interaction {
+ constructor(settings) {
+ super(settings);
+ this.handlePointerDown = (pev) => {
+ let { dragging } = this;
+ let downEl = pev.origEvent.target;
+ // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
+ dragging.setIgnoreMove(!this.component.isValidDateDownEl(downEl));
+ };
+ // won't even fire if moving was ignored
+ this.handleDragEnd = (ev) => {
+ let { component } = this;
+ let { pointer } = this.dragging;
+ if (!pointer.wasTouchScroll) {
+ let { initialHit, finalHit } = this.hitDragging;
+ if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
+ let { context } = component;
+ let arg = Object.assign(Object.assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view });
+ context.emitter.trigger('dateClick', arg);
+ }
+ }
+ };
+ // we DO want to watch pointer moves because otherwise finalHit won't get populated
+ this.dragging = new FeaturefulElementDragging(settings.el);
+ this.dragging.autoScroller.isEnabled = false;
+ let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings));
+ hitDragging.emitter.on('pointerdown', this.handlePointerDown);
+ hitDragging.emitter.on('dragend', this.handleDragEnd);
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ }
+
+ /*
+ Tracks when the user selects a portion of time of a component,
+ constituted by a drag over date cells, with a possible delay at the beginning of the drag.
+ */
+ class DateSelecting extends internal.Interaction {
+ constructor(settings) {
+ super(settings);
+ this.dragSelection = null;
+ this.handlePointerDown = (ev) => {
+ let { component, dragging } = this;
+ let { options } = component.context;
+ let canSelect = options.selectable &&
+ component.isValidDateDownEl(ev.origEvent.target);
+ // don't bother to watch expensive moves if component won't do selection
+ dragging.setIgnoreMove(!canSelect);
+ // if touch, require user to hold down
+ dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null;
+ };
+ this.handleDragStart = (ev) => {
+ this.component.context.calendarApi.unselect(ev); // unselect previous selections
+ };
+ this.handleHitUpdate = (hit, isFinal) => {
+ let { context } = this.component;
+ let dragSelection = null;
+ let isInvalid = false;
+ if (hit) {
+ let initialHit = this.hitDragging.initialHit;
+ let disallowed = hit.componentId === initialHit.componentId
+ && this.isHitComboAllowed
+ && !this.isHitComboAllowed(initialHit, hit);
+ if (!disallowed) {
+ dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers);
+ }
+ if (!dragSelection || !internal.isDateSelectionValid(dragSelection, hit.dateProfile, context)) {
+ isInvalid = true;
+ dragSelection = null;
+ }
+ }
+ if (dragSelection) {
+ context.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
+ }
+ else if (!isFinal) { // only unselect if moved away while dragging
+ context.dispatch({ type: 'UNSELECT_DATES' });
+ }
+ if (!isInvalid) {
+ internal.enableCursor();
+ }
+ else {
+ internal.disableCursor();
+ }
+ if (!isFinal) {
+ this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
+ }
+ };
+ this.handlePointerUp = (pev) => {
+ if (this.dragSelection) {
+ // selection is already rendered, so just need to report selection
+ internal.triggerDateSelect(this.dragSelection, pev, this.component.context);
+ this.dragSelection = null;
+ }
+ };
+ let { component } = settings;
+ let { options } = component.context;
+ let dragging = this.dragging = new FeaturefulElementDragging(settings.el);
+ dragging.touchScrollAllowed = false;
+ dragging.minDistance = options.selectMinDistance || 0;
+ dragging.autoScroller.isEnabled = options.dragScroll;
+ let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings));
+ hitDragging.emitter.on('pointerdown', this.handlePointerDown);
+ hitDragging.emitter.on('dragstart', this.handleDragStart);
+ hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+ hitDragging.emitter.on('pointerup', this.handlePointerUp);
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ }
+ function getComponentTouchDelay$1(component) {
+ let { options } = component.context;
+ let delay = options.selectLongPressDelay;
+ if (delay == null) {
+ delay = options.longPressDelay;
+ }
+ return delay;
+ }
+ function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
+ let dateSpan0 = hit0.dateSpan;
+ let dateSpan1 = hit1.dateSpan;
+ let ms = [
+ dateSpan0.range.start,
+ dateSpan0.range.end,
+ dateSpan1.range.start,
+ dateSpan1.range.end,
+ ];
+ ms.sort(internal.compareNumbers);
+ let props = {};
+ for (let transformer of dateSelectionTransformers) {
+ let res = transformer(hit0, hit1);
+ if (res === false) {
+ return null;
+ }
+ if (res) {
+ Object.assign(props, res);
+ }
+ }
+ props.range = { start: ms[0], end: ms[3] };
+ props.allDay = dateSpan0.allDay;
+ return props;
+ }
+
+ class EventDragging extends internal.Interaction {
+ constructor(settings) {
+ super(settings);
+ // internal state
+ this.subjectEl = null;
+ this.subjectSeg = null; // the seg being selected/dragged
+ this.isDragging = false;
+ this.eventRange = null;
+ this.relevantEvents = null; // the events being dragged
+ this.receivingContext = null;
+ this.validMutation = null;
+ this.mutatedRelevantEvents = null;
+ this.handlePointerDown = (ev) => {
+ let origTarget = ev.origEvent.target;
+ let { component, dragging } = this;
+ let { mirror } = dragging;
+ let { options } = component.context;
+ let initialContext = component.context;
+ this.subjectEl = ev.subjectEl;
+ let subjectSeg = this.subjectSeg = internal.getElSeg(ev.subjectEl);
+ let eventRange = this.eventRange = subjectSeg.eventRange;
+ let eventInstanceId = eventRange.instance.instanceId;
+ this.relevantEvents = internal.getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId);
+ dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
+ dragging.delay =
+ // only do a touch delay if touch and this event hasn't been selected yet
+ (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
+ getComponentTouchDelay(component) :
+ null;
+ if (options.fixedMirrorParent) {
+ mirror.parentNode = options.fixedMirrorParent;
+ }
+ else {
+ mirror.parentNode = internal.elementClosest(origTarget, '.fc');
+ }
+ mirror.revertDuration = options.dragRevertDuration;
+ let isValid = component.isValidSegDownEl(origTarget) &&
+ !internal.elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer
+ dragging.setIgnoreMove(!isValid);
+ // disable dragging for elements that are resizable (ie, selectable)
+ // but are not draggable
+ this.isDragging = isValid &&
+ ev.subjectEl.classList.contains('fc-event-draggable');
+ };
+ this.handleDragStart = (ev) => {
+ let initialContext = this.component.context;
+ let eventRange = this.eventRange;
+ let eventInstanceId = eventRange.instance.instanceId;
+ if (ev.isTouch) {
+ // need to select a different event?
+ if (eventInstanceId !== this.component.props.eventSelection) {
+ initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId });
+ }
+ }
+ else {
+ // if now using mouse, but was previous touch interaction, clear selected event
+ initialContext.dispatch({ type: 'UNSELECT_EVENT' });
+ }
+ if (this.isDragging) {
+ initialContext.calendarApi.unselect(ev); // unselect *date* selection
+ initialContext.emitter.trigger('eventDragStart', {
+ el: this.subjectEl,
+ event: new internal.EventImpl(initialContext, eventRange.def, eventRange.instance),
+ jsEvent: ev.origEvent,
+ view: initialContext.viewApi,
+ });
+ }
+ };
+ this.handleHitUpdate = (hit, isFinal) => {
+ if (!this.isDragging) {
+ return;
+ }
+ let relevantEvents = this.relevantEvents;
+ let initialHit = this.hitDragging.initialHit;
+ let initialContext = this.component.context;
+ // states based on new hit
+ let receivingContext = null;
+ let mutation = null;
+ let mutatedRelevantEvents = null;
+ let isInvalid = false;
+ let interaction = {
+ affectedEvents: relevantEvents,
+ mutatedEvents: internal.createEmptyEventStore(),
+ isEvent: true,
+ };
+ if (hit) {
+ receivingContext = hit.context;
+ let receivingOptions = receivingContext.options;
+ if (initialContext === receivingContext ||
+ (receivingOptions.editable && receivingOptions.droppable)) {
+ mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers);
+ if (mutation) {
+ mutatedRelevantEvents = internal.applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext);
+ interaction.mutatedEvents = mutatedRelevantEvents;
+ if (!internal.isInteractionValid(interaction, hit.dateProfile, receivingContext)) {
+ isInvalid = true;
+ mutation = null;
+ mutatedRelevantEvents = null;
+ interaction.mutatedEvents = internal.createEmptyEventStore();
+ }
+ }
+ }
+ else {
+ receivingContext = null;
+ }
+ }
+ this.displayDrag(receivingContext, interaction);
+ if (!isInvalid) {
+ internal.enableCursor();
+ }
+ else {
+ internal.disableCursor();
+ }
+ if (!isFinal) {
+ if (initialContext === receivingContext && // TODO: write test for this
+ isHitsEqual(initialHit, hit)) {
+ mutation = null;
+ }
+ this.dragging.setMirrorNeedsRevert(!mutation);
+ // render the mirror if no already-rendered mirror
+ // TODO: wish we could somehow wait for dispatch to guarantee render
+ this.dragging.setMirrorIsVisible(!hit || !internal.getElRoot(this.subjectEl).querySelector('.fc-event-mirror'));
+ // assign states based on new hit
+ this.receivingContext = receivingContext;
+ this.validMutation = mutation;
+ this.mutatedRelevantEvents = mutatedRelevantEvents;
+ }
+ };
+ this.handlePointerUp = () => {
+ if (!this.isDragging) {
+ this.cleanup(); // because handleDragEnd won't fire
+ }
+ };
+ this.handleDragEnd = (ev) => {
+ if (this.isDragging) {
+ let initialContext = this.component.context;
+ let initialView = initialContext.viewApi;
+ let { receivingContext, validMutation } = this;
+ let eventDef = this.eventRange.def;
+ let eventInstance = this.eventRange.instance;
+ let eventApi = new internal.EventImpl(initialContext, eventDef, eventInstance);
+ let relevantEvents = this.relevantEvents;
+ let mutatedRelevantEvents = this.mutatedRelevantEvents;
+ let { finalHit } = this.hitDragging;
+ this.clearDrag(); // must happen after revert animation
+ initialContext.emitter.trigger('eventDragStop', {
+ el: this.subjectEl,
+ event: eventApi,
+ jsEvent: ev.origEvent,
+ view: initialView,
+ });
+ if (validMutation) {
+ // dropped within same calendar
+ if (receivingContext === initialContext) {
+ let updatedEventApi = new internal.EventImpl(initialContext, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null);
+ initialContext.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: mutatedRelevantEvents,
+ });
+ let eventChangeArg = {
+ oldEvent: eventApi,
+ event: updatedEventApi,
+ relatedEvents: internal.buildEventApis(mutatedRelevantEvents, initialContext, eventInstance),
+ revert() {
+ initialContext.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: relevantEvents, // the pre-change data
+ });
+ },
+ };
+ let transformed = {};
+ for (let transformer of initialContext.getCurrentData().pluginHooks.eventDropTransformers) {
+ Object.assign(transformed, transformer(validMutation, initialContext));
+ }
+ initialContext.emitter.trigger('eventDrop', Object.assign(Object.assign(Object.assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView }));
+ initialContext.emitter.trigger('eventChange', eventChangeArg);
+ // dropped in different calendar
+ }
+ else if (receivingContext) {
+ let eventRemoveArg = {
+ event: eventApi,
+ relatedEvents: internal.buildEventApis(relevantEvents, initialContext, eventInstance),
+ revert() {
+ initialContext.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: relevantEvents,
+ });
+ },
+ };
+ initialContext.emitter.trigger('eventLeave', Object.assign(Object.assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView }));
+ initialContext.dispatch({
+ type: 'REMOVE_EVENTS',
+ eventStore: relevantEvents,
+ });
+ initialContext.emitter.trigger('eventRemove', eventRemoveArg);
+ let addedEventDef = mutatedRelevantEvents.defs[eventDef.defId];
+ let addedEventInstance = mutatedRelevantEvents.instances[eventInstance.instanceId];
+ let addedEventApi = new internal.EventImpl(receivingContext, addedEventDef, addedEventInstance);
+ receivingContext.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: mutatedRelevantEvents,
+ });
+ let eventAddArg = {
+ event: addedEventApi,
+ relatedEvents: internal.buildEventApis(mutatedRelevantEvents, receivingContext, addedEventInstance),
+ revert() {
+ receivingContext.dispatch({
+ type: 'REMOVE_EVENTS',
+ eventStore: mutatedRelevantEvents,
+ });
+ },
+ };
+ receivingContext.emitter.trigger('eventAdd', eventAddArg);
+ if (ev.isTouch) {
+ receivingContext.dispatch({
+ type: 'SELECT_EVENT',
+ eventInstanceId: eventInstance.instanceId,
+ });
+ }
+ receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi }));
+ receivingContext.emitter.trigger('eventReceive', Object.assign(Object.assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi }));
+ }
+ }
+ else {
+ initialContext.emitter.trigger('_noEventDrop');
+ }
+ }
+ this.cleanup();
+ };
+ let { component } = this;
+ let { options } = component.context;
+ let dragging = this.dragging = new FeaturefulElementDragging(settings.el);
+ dragging.pointer.selector = EventDragging.SELECTOR;
+ dragging.touchScrollAllowed = false;
+ dragging.autoScroller.isEnabled = options.dragScroll;
+ let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsStore);
+ hitDragging.useSubjectCenter = settings.useEventCenter;
+ hitDragging.emitter.on('pointerdown', this.handlePointerDown);
+ hitDragging.emitter.on('dragstart', this.handleDragStart);
+ hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+ hitDragging.emitter.on('pointerup', this.handlePointerUp);
+ hitDragging.emitter.on('dragend', this.handleDragEnd);
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ // render a drag state on the next receivingCalendar
+ displayDrag(nextContext, state) {
+ let initialContext = this.component.context;
+ let prevContext = this.receivingContext;
+ // does the previous calendar need to be cleared?
+ if (prevContext && prevContext !== nextContext) {
+ // does the initial calendar need to be cleared?
+ // if so, don't clear all the way. we still need to to hide the affectedEvents
+ if (prevContext === initialContext) {
+ prevContext.dispatch({
+ type: 'SET_EVENT_DRAG',
+ state: {
+ affectedEvents: state.affectedEvents,
+ mutatedEvents: internal.createEmptyEventStore(),
+ isEvent: true,
+ },
+ });
+ // completely clear the old calendar if it wasn't the initial
+ }
+ else {
+ prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+ }
+ }
+ if (nextContext) {
+ nextContext.dispatch({ type: 'SET_EVENT_DRAG', state });
+ }
+ }
+ clearDrag() {
+ let initialCalendar = this.component.context;
+ let { receivingContext } = this;
+ if (receivingContext) {
+ receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+ }
+ // the initial calendar might have an dummy drag state from displayDrag
+ if (initialCalendar !== receivingContext) {
+ initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+ }
+ }
+ cleanup() {
+ this.subjectSeg = null;
+ this.isDragging = false;
+ this.eventRange = null;
+ this.relevantEvents = null;
+ this.receivingContext = null;
+ this.validMutation = null;
+ this.mutatedRelevantEvents = null;
+ }
+ }
+ // TODO: test this in IE11
+ // QUESTION: why do we need it on the resizable???
+ EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable';
+ function computeEventMutation(hit0, hit1, massagers) {
+ let dateSpan0 = hit0.dateSpan;
+ let dateSpan1 = hit1.dateSpan;
+ let date0 = dateSpan0.range.start;
+ let date1 = dateSpan1.range.start;
+ let standardProps = {};
+ if (dateSpan0.allDay !== dateSpan1.allDay) {
+ standardProps.allDay = dateSpan1.allDay;
+ standardProps.hasEnd = hit1.context.options.allDayMaintainDuration;
+ if (dateSpan1.allDay) {
+ // means date1 is already start-of-day,
+ // but date0 needs to be converted
+ date0 = internal.startOfDay(date0);
+ }
+ }
+ let delta = internal.diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ?
+ hit0.largeUnit :
+ null);
+ if (delta.milliseconds) { // has hours/minutes/seconds
+ standardProps.allDay = false;
+ }
+ let mutation = {
+ datesDelta: delta,
+ standardProps,
+ };
+ for (let massager of massagers) {
+ massager(mutation, hit0, hit1);
+ }
+ return mutation;
+ }
+ function getComponentTouchDelay(component) {
+ let { options } = component.context;
+ let delay = options.eventLongPressDelay;
+ if (delay == null) {
+ delay = options.longPressDelay;
+ }
+ return delay;
+ }
+
+ class EventResizing extends internal.Interaction {
+ constructor(settings) {
+ super(settings);
+ // internal state
+ this.draggingSegEl = null;
+ this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
+ this.eventRange = null;
+ this.relevantEvents = null;
+ this.validMutation = null;
+ this.mutatedRelevantEvents = null;
+ this.handlePointerDown = (ev) => {
+ let { component } = this;
+ let segEl = this.querySegEl(ev);
+ let seg = internal.getElSeg(segEl);
+ let eventRange = this.eventRange = seg.eventRange;
+ this.dragging.minDistance = component.context.options.eventDragMinDistance;
+ // if touch, need to be working with a selected event
+ this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(ev.origEvent.target) ||
+ (ev.isTouch && this.component.props.eventSelection !== eventRange.instance.instanceId));
+ };
+ this.handleDragStart = (ev) => {
+ let { context } = this.component;
+ let eventRange = this.eventRange;
+ this.relevantEvents = internal.getRelevantEvents(context.getCurrentData().eventStore, this.eventRange.instance.instanceId);
+ let segEl = this.querySegEl(ev);
+ this.draggingSegEl = segEl;
+ this.draggingSeg = internal.getElSeg(segEl);
+ context.calendarApi.unselect();
+ context.emitter.trigger('eventResizeStart', {
+ el: segEl,
+ event: new internal.EventImpl(context, eventRange.def, eventRange.instance),
+ jsEvent: ev.origEvent,
+ view: context.viewApi,
+ });
+ };
+ this.handleHitUpdate = (hit, isFinal, ev) => {
+ let { context } = this.component;
+ let relevantEvents = this.relevantEvents;
+ let initialHit = this.hitDragging.initialHit;
+ let eventInstance = this.eventRange.instance;
+ let mutation = null;
+ let mutatedRelevantEvents = null;
+ let isInvalid = false;
+ let interaction = {
+ affectedEvents: relevantEvents,
+ mutatedEvents: internal.createEmptyEventStore(),
+ isEvent: true,
+ };
+ if (hit) {
+ let disallowed = hit.componentId === initialHit.componentId
+ && this.isHitComboAllowed
+ && !this.isHitComboAllowed(initialHit, hit);
+ if (!disallowed) {
+ mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range);
+ }
+ }
+ if (mutation) {
+ mutatedRelevantEvents = internal.applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context);
+ interaction.mutatedEvents = mutatedRelevantEvents;
+ if (!internal.isInteractionValid(interaction, hit.dateProfile, context)) {
+ isInvalid = true;
+ mutation = null;
+ mutatedRelevantEvents = null;
+ interaction.mutatedEvents = null;
+ }
+ }
+ if (mutatedRelevantEvents) {
+ context.dispatch({
+ type: 'SET_EVENT_RESIZE',
+ state: interaction,
+ });
+ }
+ else {
+ context.dispatch({ type: 'UNSET_EVENT_RESIZE' });
+ }
+ if (!isInvalid) {
+ internal.enableCursor();
+ }
+ else {
+ internal.disableCursor();
+ }
+ if (!isFinal) {
+ if (mutation && isHitsEqual(initialHit, hit)) {
+ mutation = null;
+ }
+ this.validMutation = mutation;
+ this.mutatedRelevantEvents = mutatedRelevantEvents;
+ }
+ };
+ this.handleDragEnd = (ev) => {
+ let { context } = this.component;
+ let eventDef = this.eventRange.def;
+ let eventInstance = this.eventRange.instance;
+ let eventApi = new internal.EventImpl(context, eventDef, eventInstance);
+ let relevantEvents = this.relevantEvents;
+ let mutatedRelevantEvents = this.mutatedRelevantEvents;
+ context.emitter.trigger('eventResizeStop', {
+ el: this.draggingSegEl,
+ event: eventApi,
+ jsEvent: ev.origEvent,
+ view: context.viewApi,
+ });
+ if (this.validMutation) {
+ let updatedEventApi = new internal.EventImpl(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null);
+ context.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: mutatedRelevantEvents,
+ });
+ let eventChangeArg = {
+ oldEvent: eventApi,
+ event: updatedEventApi,
+ relatedEvents: internal.buildEventApis(mutatedRelevantEvents, context, eventInstance),
+ revert() {
+ context.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: relevantEvents, // the pre-change events
+ });
+ },
+ };
+ context.emitter.trigger('eventResize', Object.assign(Object.assign({}, eventChangeArg), { el: this.draggingSegEl, startDelta: this.validMutation.startDelta || internal.createDuration(0), endDelta: this.validMutation.endDelta || internal.createDuration(0), jsEvent: ev.origEvent, view: context.viewApi }));
+ context.emitter.trigger('eventChange', eventChangeArg);
+ }
+ else {
+ context.emitter.trigger('_noEventResize');
+ }
+ // reset all internal state
+ this.draggingSeg = null;
+ this.relevantEvents = null;
+ this.validMutation = null;
+ // okay to keep eventInstance around. useful to set it in handlePointerDown
+ };
+ let { component } = settings;
+ let dragging = this.dragging = new FeaturefulElementDragging(settings.el);
+ dragging.pointer.selector = '.fc-event-resizer';
+ dragging.touchScrollAllowed = false;
+ dragging.autoScroller.isEnabled = component.context.options.dragScroll;
+ let hitDragging = this.hitDragging = new HitDragging(this.dragging, internal.interactionSettingsToStore(settings));
+ hitDragging.emitter.on('pointerdown', this.handlePointerDown);
+ hitDragging.emitter.on('dragstart', this.handleDragStart);
+ hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+ hitDragging.emitter.on('dragend', this.handleDragEnd);
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ querySegEl(ev) {
+ return internal.elementClosest(ev.subjectEl, '.fc-event');
+ }
+ }
+ function computeMutation(hit0, hit1, isFromStart, instanceRange) {
+ let dateEnv = hit0.context.dateEnv;
+ let date0 = hit0.dateSpan.range.start;
+ let date1 = hit1.dateSpan.range.start;
+ let delta = internal.diffDates(date0, date1, dateEnv, hit0.largeUnit);
+ if (isFromStart) {
+ if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
+ return { startDelta: delta };
+ }
+ }
+ else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
+ return { endDelta: delta };
+ }
+ return null;
+ }
+
+ class UnselectAuto {
+ constructor(context) {
+ this.context = context;
+ this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
+ this.matchesCancel = false;
+ this.matchesEvent = false;
+ this.onSelect = (selectInfo) => {
+ if (selectInfo.jsEvent) {
+ this.isRecentPointerDateSelect = true;
+ }
+ };
+ this.onDocumentPointerDown = (pev) => {
+ let unselectCancel = this.context.options.unselectCancel;
+ let downEl = internal.getEventTargetViaRoot(pev.origEvent);
+ this.matchesCancel = !!internal.elementClosest(downEl, unselectCancel);
+ this.matchesEvent = !!internal.elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event?
+ };
+ this.onDocumentPointerUp = (pev) => {
+ let { context } = this;
+ let { documentPointer } = this;
+ let calendarState = context.getCurrentData();
+ // touch-scrolling should never unfocus any type of selection
+ if (!documentPointer.wasTouchScroll) {
+ if (calendarState.dateSelection && // an existing date selection?
+ !this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
+ ) {
+ let unselectAuto = context.options.unselectAuto;
+ if (unselectAuto && (!unselectAuto || !this.matchesCancel)) {
+ context.calendarApi.unselect(pev);
+ }
+ }
+ if (calendarState.eventSelection && // an existing event selected?
+ !this.matchesEvent // interaction DIDN'T start on an event
+ ) {
+ context.dispatch({ type: 'UNSELECT_EVENT' });
+ }
+ }
+ this.isRecentPointerDateSelect = false;
+ };
+ let documentPointer = this.documentPointer = new PointerDragging(document);
+ documentPointer.shouldIgnoreMove = true;
+ documentPointer.shouldWatchScroll = false;
+ documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown);
+ documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
+ /*
+ TODO: better way to know about whether there was a selection with the pointer
+ */
+ context.emitter.on('select', this.onSelect);
+ }
+ destroy() {
+ this.context.emitter.off('select', this.onSelect);
+ this.documentPointer.destroy();
+ }
+ }
+
+ const OPTION_REFINERS = {
+ fixedMirrorParent: internal.identity,
+ };
+ const LISTENER_REFINERS = {
+ dateClick: internal.identity,
+ eventDragStart: internal.identity,
+ eventDragStop: internal.identity,
+ eventDrop: internal.identity,
+ eventResizeStart: internal.identity,
+ eventResizeStop: internal.identity,
+ eventResize: internal.identity,
+ drop: internal.identity,
+ eventReceive: internal.identity,
+ eventLeave: internal.identity,
+ };
+
+ /*
+ Given an already instantiated draggable object for one-or-more elements,
+ Interprets any dragging as an attempt to drag an events that lives outside
+ of a calendar onto a calendar.
+ */
+ class ExternalElementDragging {
+ constructor(dragging, suppliedDragMeta) {
+ this.receivingContext = null;
+ this.droppableEvent = null; // will exist for all drags, even if create:false
+ this.suppliedDragMeta = null;
+ this.dragMeta = null;
+ this.handleDragStart = (ev) => {
+ this.dragMeta = this.buildDragMeta(ev.subjectEl);
+ };
+ this.handleHitUpdate = (hit, isFinal, ev) => {
+ let { dragging } = this.hitDragging;
+ let receivingContext = null;
+ let droppableEvent = null;
+ let isInvalid = false;
+ let interaction = {
+ affectedEvents: internal.createEmptyEventStore(),
+ mutatedEvents: internal.createEmptyEventStore(),
+ isEvent: this.dragMeta.create,
+ };
+ if (hit) {
+ receivingContext = hit.context;
+ if (this.canDropElOnCalendar(ev.subjectEl, receivingContext)) {
+ droppableEvent = computeEventForDateSpan(hit.dateSpan, this.dragMeta, receivingContext);
+ interaction.mutatedEvents = internal.eventTupleToStore(droppableEvent);
+ isInvalid = !internal.isInteractionValid(interaction, hit.dateProfile, receivingContext);
+ if (isInvalid) {
+ interaction.mutatedEvents = internal.createEmptyEventStore();
+ droppableEvent = null;
+ }
+ }
+ }
+ this.displayDrag(receivingContext, interaction);
+ // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
+ // TODO: wish we could somehow wait for dispatch to guarantee render
+ dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror'));
+ if (!isInvalid) {
+ internal.enableCursor();
+ }
+ else {
+ internal.disableCursor();
+ }
+ if (!isFinal) {
+ dragging.setMirrorNeedsRevert(!droppableEvent);
+ this.receivingContext = receivingContext;
+ this.droppableEvent = droppableEvent;
+ }
+ };
+ this.handleDragEnd = (pev) => {
+ let { receivingContext, droppableEvent } = this;
+ this.clearDrag();
+ if (receivingContext && droppableEvent) {
+ let finalHit = this.hitDragging.finalHit;
+ let finalView = finalHit.context.viewApi;
+ let dragMeta = this.dragMeta;
+ receivingContext.emitter.trigger('drop', Object.assign(Object.assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView }));
+ if (dragMeta.create) {
+ let addingEvents = internal.eventTupleToStore(droppableEvent);
+ receivingContext.dispatch({
+ type: 'MERGE_EVENTS',
+ eventStore: addingEvents,
+ });
+ if (pev.isTouch) {
+ receivingContext.dispatch({
+ type: 'SELECT_EVENT',
+ eventInstanceId: droppableEvent.instance.instanceId,
+ });
+ }
+ // signal that an external event landed
+ receivingContext.emitter.trigger('eventReceive', {
+ event: new internal.EventImpl(receivingContext, droppableEvent.def, droppableEvent.instance),
+ relatedEvents: [],
+ revert() {
+ receivingContext.dispatch({
+ type: 'REMOVE_EVENTS',
+ eventStore: addingEvents,
+ });
+ },
+ draggedEl: pev.subjectEl,
+ view: finalView,
+ });
+ }
+ }
+ this.receivingContext = null;
+ this.droppableEvent = null;
+ };
+ let hitDragging = this.hitDragging = new HitDragging(dragging, internal.interactionSettingsStore);
+ hitDragging.requireInitial = false; // will start outside of a component
+ hitDragging.emitter.on('dragstart', this.handleDragStart);
+ hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+ hitDragging.emitter.on('dragend', this.handleDragEnd);
+ this.suppliedDragMeta = suppliedDragMeta;
+ }
+ buildDragMeta(subjectEl) {
+ if (typeof this.suppliedDragMeta === 'object') {
+ return internal.parseDragMeta(this.suppliedDragMeta);
+ }
+ if (typeof this.suppliedDragMeta === 'function') {
+ return internal.parseDragMeta(this.suppliedDragMeta(subjectEl));
+ }
+ return getDragMetaFromEl(subjectEl);
+ }
+ displayDrag(nextContext, state) {
+ let prevContext = this.receivingContext;
+ if (prevContext && prevContext !== nextContext) {
+ prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+ }
+ if (nextContext) {
+ nextContext.dispatch({ type: 'SET_EVENT_DRAG', state });
+ }
+ }
+ clearDrag() {
+ if (this.receivingContext) {
+ this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+ }
+ }
+ canDropElOnCalendar(el, receivingContext) {
+ let dropAccept = receivingContext.options.dropAccept;
+ if (typeof dropAccept === 'function') {
+ return dropAccept.call(receivingContext.calendarApi, el);
+ }
+ if (typeof dropAccept === 'string' && dropAccept) {
+ return Boolean(internal.elementMatches(el, dropAccept));
+ }
+ return true;
+ }
+ }
+ // Utils for computing event store from the DragMeta
+ // ----------------------------------------------------------------------------------------------------
+ function computeEventForDateSpan(dateSpan, dragMeta, context) {
+ let defProps = Object.assign({}, dragMeta.leftoverProps);
+ for (let transform of context.pluginHooks.externalDefTransforms) {
+ Object.assign(defProps, transform(dateSpan, dragMeta));
+ }
+ let { refined, extra } = internal.refineEventDef(defProps, context);
+ let def = internal.parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd
+ context);
+ let start = dateSpan.range.start;
+ // only rely on time info if drop zone is all-day,
+ // otherwise, we already know the time
+ if (dateSpan.allDay && dragMeta.startTime) {
+ start = context.dateEnv.add(start, dragMeta.startTime);
+ }
+ let end = dragMeta.duration ?
+ context.dateEnv.add(start, dragMeta.duration) :
+ internal.getDefaultEventEnd(dateSpan.allDay, start, context);
+ let instance = internal.createEventInstance(def.defId, { start, end });
+ return { def, instance };
+ }
+ // Utils for extracting data from element
+ // ----------------------------------------------------------------------------------------------------
+ function getDragMetaFromEl(el) {
+ let str = getEmbeddedElData(el, 'event');
+ let obj = str ?
+ JSON.parse(str) :
+ { create: false }; // if no embedded data, assume no event creation
+ return internal.parseDragMeta(obj);
+ }
+ internal.config.dataAttrPrefix = '';
+ function getEmbeddedElData(el, name) {
+ let prefix = internal.config.dataAttrPrefix;
+ let prefixedName = (prefix ? prefix + '-' : '') + name;
+ return el.getAttribute('data-' + prefixedName) || '';
+ }
+
+ /*
+ Makes an element (that is *external* to any calendar) draggable.
+ Can pass in data that determines how an event will be created when dropped onto a calendar.
+ Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
+ */
+ class ExternalDraggable {
+ constructor(el, settings = {}) {
+ this.handlePointerDown = (ev) => {
+ let { dragging } = this;
+ let { minDistance, longPressDelay } = this.settings;
+ dragging.minDistance =
+ minDistance != null ?
+ minDistance :
+ (ev.isTouch ? 0 : internal.BASE_OPTION_DEFAULTS.eventDragMinDistance);
+ dragging.delay =
+ ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
+ (longPressDelay != null ? longPressDelay : internal.BASE_OPTION_DEFAULTS.longPressDelay) :
+ 0;
+ };
+ this.handleDragStart = (ev) => {
+ if (ev.isTouch &&
+ this.dragging.delay &&
+ ev.subjectEl.classList.contains('fc-event')) {
+ this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected');
+ }
+ };
+ this.settings = settings;
+ let dragging = this.dragging = new FeaturefulElementDragging(el);
+ dragging.touchScrollAllowed = false;
+ if (settings.itemSelector != null) {
+ dragging.pointer.selector = settings.itemSelector;
+ }
+ if (settings.appendTo != null) {
+ dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
+ }
+ dragging.emitter.on('pointerdown', this.handlePointerDown);
+ dragging.emitter.on('dragstart', this.handleDragStart);
+ new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ }
+
+ /*
+ Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
+ The third-party system is responsible for drawing the visuals effects of the drag.
+ This class simply monitors for pointer movements and fires events.
+ It also has the ability to hide the moving element (the "mirror") during the drag.
+ */
+ class InferredElementDragging extends internal.ElementDragging {
+ constructor(containerEl) {
+ super(containerEl);
+ this.shouldIgnoreMove = false;
+ this.mirrorSelector = '';
+ this.currentMirrorEl = null;
+ this.handlePointerDown = (ev) => {
+ this.emitter.trigger('pointerdown', ev);
+ if (!this.shouldIgnoreMove) {
+ // fire dragstart right away. does not support delay or min-distance
+ this.emitter.trigger('dragstart', ev);
+ }
+ };
+ this.handlePointerMove = (ev) => {
+ if (!this.shouldIgnoreMove) {
+ this.emitter.trigger('dragmove', ev);
+ }
+ };
+ this.handlePointerUp = (ev) => {
+ this.emitter.trigger('pointerup', ev);
+ if (!this.shouldIgnoreMove) {
+ // fire dragend right away. does not support a revert animation
+ this.emitter.trigger('dragend', ev);
+ }
+ };
+ let pointer = this.pointer = new PointerDragging(containerEl);
+ pointer.emitter.on('pointerdown', this.handlePointerDown);
+ pointer.emitter.on('pointermove', this.handlePointerMove);
+ pointer.emitter.on('pointerup', this.handlePointerUp);
+ }
+ destroy() {
+ this.pointer.destroy();
+ }
+ setIgnoreMove(bool) {
+ this.shouldIgnoreMove = bool;
+ }
+ setMirrorIsVisible(bool) {
+ if (bool) {
+ // restore a previously hidden element.
+ // use the reference in case the selector class has already been removed.
+ if (this.currentMirrorEl) {
+ this.currentMirrorEl.style.visibility = '';
+ this.currentMirrorEl = null;
+ }
+ }
+ else {
+ let mirrorEl = this.mirrorSelector
+ // TODO: somehow query FullCalendars WITHIN shadow-roots
+ ? document.querySelector(this.mirrorSelector)
+ : null;
+ if (mirrorEl) {
+ this.currentMirrorEl = mirrorEl;
+ mirrorEl.style.visibility = 'hidden';
+ }
+ }
+ }
+ }
+
+ /*
+ Bridges third-party drag-n-drop systems with FullCalendar.
+ Must be instantiated and destroyed by caller.
+ */
+ class ThirdPartyDraggable {
+ constructor(containerOrSettings, settings) {
+ let containerEl = document;
+ if (
+ // wish we could just test instanceof EventTarget, but doesn't work in IE11
+ containerOrSettings === document ||
+ containerOrSettings instanceof Element) {
+ containerEl = containerOrSettings;
+ settings = settings || {};
+ }
+ else {
+ settings = (containerOrSettings || {});
+ }
+ let dragging = this.dragging = new InferredElementDragging(containerEl);
+ if (typeof settings.itemSelector === 'string') {
+ dragging.pointer.selector = settings.itemSelector;
+ }
+ else if (containerEl === document) {
+ dragging.pointer.selector = '[data-event]';
+ }
+ if (typeof settings.mirrorSelector === 'string') {
+ dragging.mirrorSelector = settings.mirrorSelector;
+ }
+ new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new
+ }
+ destroy() {
+ this.dragging.destroy();
+ }
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/interaction',
+ componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing],
+ calendarInteractions: [UnselectAuto],
+ elementDraggingImpl: FeaturefulElementDragging,
+ optionRefiners: OPTION_REFINERS,
+ listenerRefiners: LISTENER_REFINERS,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports.Draggable = ExternalDraggable;
+ exports.ThirdPartyDraggable = ThirdPartyDraggable;
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/interaction/index.global.min.js b/library/fullcalendar/packages/interaction/index.global.min.js
new file mode 100644
index 000000000..4c240143c
--- /dev/null
+++ b/library/fullcalendar/packages/interaction/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Interaction Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/editable
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Interaction=function(t,e,i){"use strict";i.config.touchMouseIgnoreWait=500;let n=0,s=0,r=!1;class o{constructor(t){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=t=>{if(!this.shouldIgnoreMouse()&&function(t){return 0===t.button&&!t.ctrlKey}(t)&&this.tryStart(t)){let e=this.createEventFromMouse(t,!0);this.emitter.trigger("pointerdown",e),this.initScrollWatch(e),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=t=>{let e=this.createEventFromMouse(t);this.recordCoords(e),this.emitter.trigger("pointermove",e)},this.handleMouseUp=t=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(t)),this.cleanup()},this.handleTouchStart=t=>{if(this.tryStart(t)){this.isTouchDragging=!0;let e=this.createEventFromTouch(t,!0);this.emitter.trigger("pointerdown",e),this.initScrollWatch(e);let i=t.target;this.shouldIgnoreMove||i.addEventListener("touchmove",this.handleTouchMove),i.addEventListener("touchend",this.handleTouchEnd),i.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=t=>{let e=this.createEventFromTouch(t);this.recordCoords(e),this.emitter.trigger("pointermove",e)},this.handleTouchEnd=t=>{if(this.isDragging){let e=t.target;e.removeEventListener("touchmove",this.handleTouchMove),e.removeEventListener("touchend",this.handleTouchEnd),e.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(t)),this.cleanup(),this.isTouchDragging=!1,n+=1,setTimeout(()=>{n-=1},i.config.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=t=>{if(!this.shouldIgnoreMove){let e=window.pageXOffset-this.prevScrollX+this.prevPageX,i=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:t,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:e,pageY:i,deltaX:e-this.origPageX,deltaY:i-this.origPageY})}},this.containerEl=t,this.emitter=new i.Emitter,t.addEventListener("mousedown",this.handleMouseDown),t.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),s+=1,1===s&&window.addEventListener("touchmove",l,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),s-=1,s||window.removeEventListener("touchmove",l,{passive:!1})}tryStart(t){let e=this.querySubjectEl(t),n=t.target;return!(!e||this.handleSelector&&!i.elementClosest(n,this.handleSelector))&&(this.subjectEl=e,this.isDragging=!0,this.wasTouchScroll=!1,!0)}cleanup(){r=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(t){return this.selector?i.elementClosest(t.target,this.selector):this.containerEl}shouldIgnoreMouse(){return n||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(r=!0)}initScrollWatch(t){this.shouldWatchScroll&&(this.recordCoords(t),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(t){this.shouldWatchScroll&&(this.prevPageX=t.pageX,this.prevPageY=t.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(t,e){let i=0,n=0;return e?(this.origPageX=t.pageX,this.origPageY=t.pageY):(i=t.pageX-this.origPageX,n=t.pageY-this.origPageY),{origEvent:t,isTouch:!1,subjectEl:this.subjectEl,pageX:t.pageX,pageY:t.pageY,deltaX:i,deltaY:n}}createEventFromTouch(t,e){let i,n,s=t.touches,r=0,o=0;return s&&s.length?(i=s[0].pageX,n=s[0].pageY):(i=t.pageX,n=t.pageY),e?(this.origPageX=i,this.origPageY=n):(r=i-this.origPageX,o=n-this.origPageY),{origEvent:t,isTouch:!0,subjectEl:this.subjectEl,pageX:i,pageY:n,deltaX:r,deltaY:o}}}function l(t){r&&t.preventDefault()}class a{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(t,e,i){this.sourceEl=t,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=e-window.pageXOffset,this.origScreenY=i-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(t,e){this.deltaX=t-window.pageXOffset-this.origScreenX,this.deltaY=e-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(t){t?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=t,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=t)}stop(t,e){let i=()=>{this.cleanup(),e()};t&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(i,this.revertDuration):setTimeout(i,0)}doRevertAnimation(t,e){let n=this.mirrorEl,s=this.sourceEl.getBoundingClientRect();n.style.transition="top "+e+"ms,left "+e+"ms",i.applyStyle(n,{left:s.left,top:s.top}),i.whenTransitionDone(n,()=>{n.style.transition="",t()})}cleanup(){this.mirrorEl&&(i.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&i.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let t=this.sourceElRect,e=this.mirrorEl;return e||(e=this.mirrorEl=this.sourceEl.cloneNode(!0),e.classList.add("fc-unselectable"),e.classList.add("fc-event-dragging"),i.applyStyle(e,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:t.right-t.left,height:t.bottom-t.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(e)),e}}class h extends i.ScrollController{constructor(t,e){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=t,this.doesListening=e,this.scrollTop=this.origScrollTop=t.getScrollTop(),this.scrollLeft=this.origScrollLeft=t.getScrollLeft(),this.scrollWidth=t.getScrollWidth(),this.scrollHeight=t.getScrollHeight(),this.clientWidth=t.getClientWidth(),this.clientHeight=t.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(t){this.scrollController.setScrollTop(t),this.doesListening||(this.scrollTop=Math.max(Math.min(t,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(t){this.scrollController.setScrollLeft(t),this.doesListening||(this.scrollLeft=Math.max(Math.min(t,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class c extends h{constructor(t,e){super(new i.ElementScrollController(t),e)}getEventTarget(){return this.scrollController.el}computeClientRect(){return i.computeInnerRect(this.scrollController.el)}}class d extends h{constructor(t){super(new i.WindowScrollController,t)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const g="function"==typeof performance?performance.now:Date.now;class u{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let t=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(t){let e=g();this.handleSide(t,(e-this.msSinceRequest)/1e3),this.requestAnimation(e)}else this.isAnimating=!1}}}start(t,e,i){this.isEnabled&&(this.scrollCaches=this.buildCaches(i),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(t,e))}handleMove(t,e){if(this.isEnabled){let i=t-window.pageXOffset,n=e-window.pageYOffset,s=null===this.pointerScreenY?0:n-this.pointerScreenY,r=null===this.pointerScreenX?0:i-this.pointerScreenX;s<0?this.everMovedUp=!0:s>0&&(this.everMovedDown=!0),r<0?this.everMovedLeft=!0:r>0&&(this.everMovedRight=!0),this.pointerScreenX=i,this.pointerScreenY=n,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(g()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let t of this.scrollCaches)t.destroy();this.scrollCaches=null}}requestAnimation(t){this.msSinceRequest=t,requestAnimationFrame(this.animate)}handleSide(t,e){let{scrollCache:i}=t,{edgeThreshold:n}=this,s=n-t.distance,r=s*s/(n*n)*this.maxVelocity*e,o=1;switch(t.name){case"left":o=-1;case"right":i.setScrollLeft(i.getScrollLeft()+r*o);break;case"top":o=-1;case"bottom":i.setScrollTop(i.getScrollTop()+r*o)}}computeBestEdge(t,e){let{edgeThreshold:i}=this,n=null,s=this.scrollCaches||[];for(let r of s){let s=r.clientRect,o=t-s.left,l=s.right-t,a=e-s.top,h=s.bottom-e;o>=0&&l>=0&&a>=0&&h>=0&&(a<=i&&this.everMovedUp&&r.canScrollUp()&&(!n||n.distance>a)&&(n={scrollCache:r,name:"top",distance:a}),h<=i&&this.everMovedDown&&r.canScrollDown()&&(!n||n.distance>h)&&(n={scrollCache:r,name:"bottom",distance:h}),o<=i&&this.everMovedLeft&&r.canScrollLeft()&&(!n||n.distance>o)&&(n={scrollCache:r,name:"left",distance:o}),l<=i&&this.everMovedRight&&r.canScrollRight()&&(!n||n.distance>l)&&(n={scrollCache:r,name:"right",distance:l}))}return n}buildCaches(t){return this.queryScrollEls(t).map(t=>t===window?new d(!1):new c(t,!1))}queryScrollEls(t){let e=[];for(let n of this.scrollQuery)"object"==typeof n?e.push(n):e.push(...Array.prototype.slice.call(i.getElRoot(t).querySelectorAll(n)));return e}}class p extends i.ElementDragging{constructor(t,e){super(t),this.containerEl=t,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=t=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,i.preventSelection(document.body),i.preventContextMenu(document.body),t.isTouch||t.origEvent.preventDefault(),this.emitter.trigger("pointerdown",t),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(t.subjectEl,t.pageX,t.pageY),this.startDelay(t),this.minDistance||this.handleDistanceSurpassed(t)))},this.onPointerMove=t=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",t),!this.isDistanceSurpassed){let e,i=this.minDistance,{deltaX:n,deltaY:s}=t;e=n*n+s*s,e>=i*i&&this.handleDistanceSurpassed(t)}this.isDragging&&("scroll"!==t.origEvent.type&&(this.mirror.handleMove(t.pageX,t.pageY),this.autoScroller.handleMove(t.pageX,t.pageY)),this.emitter.trigger("dragmove",t))}},this.onPointerUp=t=>{this.isInteracting&&(this.isInteracting=!1,i.allowSelection(document.body),i.allowContextMenu(document.body),this.emitter.trigger("pointerup",t),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(t)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new o(t);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),e&&(n.selector=e),this.mirror=new a,this.autoScroller=new u}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(t){"number"==typeof this.delay?this.delayTimeoutId=setTimeout(()=>{this.delayTimeoutId=null,this.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)}handleDelayEnd(t){this.isDelayEnded=!0,this.tryStartDrag(t)}handleDistanceSurpassed(t){this.isDistanceSurpassed=!0,this.tryStartDrag(t)}tryStartDrag(t){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(t.pageX,t.pageY,this.containerEl),this.emitter.trigger("dragstart",t),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(t){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,t))}stopDrag(t){this.isDragging=!1,this.emitter.trigger("dragend",t)}setIgnoreMove(t){this.pointer.shouldIgnoreMove=t}setMirrorIsVisible(t){this.mirror.setIsVisible(t)}setMirrorNeedsRevert(t){this.mirrorNeedsRevert=t}setAutoScrollEnabled(t){this.autoScroller.isEnabled=t}}class v{constructor(t){this.origRect=i.computeRect(t),this.scrollCaches=i.getClippingParents(t).map(t=>new c(t,!0))}destroy(){for(let t of this.scrollCaches)t.destroy()}computeLeft(){let t=this.origRect.left;for(let e of this.scrollCaches)t+=e.origScrollLeft-e.getScrollLeft();return t}computeTop(){let t=this.origRect.top;for(let e of this.scrollCaches)t+=e.origScrollTop-e.getScrollTop();return t}isWithinClipping(t,e){let n={left:t,top:e};for(let t of this.scrollCaches)if(!E(t.getEventTarget())&&!i.pointInsideRect(n,t.clientRect))return!1;return!0}}function E(t){let e=t.tagName;return"HTML"===e||"BODY"===e}class m{constructor(t,e){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=t=>{let{dragging:e}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(t),this.initialHit||!this.requireInitial?(e.setIgnoreMove(!1),this.emitter.trigger("pointerdown",t)):e.setIgnoreMove(!0)},this.handleDragStart=t=>{this.emitter.trigger("dragstart",t),this.handleMove(t,!0)},this.handleDragMove=t=>{this.emitter.trigger("dragmove",t),this.handleMove(t)},this.handlePointerUp=t=>{this.releaseHits(),this.emitter.trigger("pointerup",t)},this.handleDragEnd=t=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,t),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",t)},this.droppableStore=e,t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragstart",this.handleDragStart),t.emitter.on("dragmove",this.handleDragMove),t.emitter.on("pointerup",this.handlePointerUp),t.emitter.on("dragend",this.handleDragEnd),this.dragging=t,this.emitter=new i.Emitter}processFirstCoord(t){let e,n={left:t.pageX,top:t.pageY},s=n,r=t.subjectEl;r instanceof HTMLElement&&(e=i.computeRect(r),s=i.constrainPoint(s,e));let o=this.initialHit=this.queryHitForOffset(s.left,s.top);if(o){if(this.useSubjectCenter&&e){let t=i.intersectRects(e,o.rect);t&&(s=i.getRectCenter(t))}this.coordAdjust=i.diffPoints(s,n)}else this.coordAdjust={left:0,top:0}}handleMove(t,e){let i=this.queryHitForOffset(t.pageX+this.coordAdjust.left,t.pageY+this.coordAdjust.top);!e&&S(this.movingHit,i)||(this.movingHit=i,this.emitter.trigger("hitupdate",i,!1,t))}prepareHits(){this.offsetTrackers=i.mapHash(this.droppableStore,t=>(t.component.prepareHits(),new v(t.el)))}releaseHits(){let{offsetTrackers:t}=this;for(let e in t)t[e].destroy();this.offsetTrackers={}}queryHitForOffset(t,e){let{droppableStore:n,offsetTrackers:s}=this,r=null;for(let o in n){let l=n[o].component,a=s[o];if(a&&a.isWithinClipping(t,e)){let n=a.computeLeft(),s=a.computeTop(),h=t-n,c=e-s,{origRect:d}=a,g=d.right-d.left,u=d.bottom-d.top;if(h>=0&&h<g&&c>=0&&c<u){let t=l.queryHit(h,c,g,u);t&&i.rangeContainsRange(t.dateProfile.activeRange,t.dateSpan.range)&&(!r||t.layer>r.layer)&&(t.componentId=o,t.context=l.context,t.rect.left+=n,t.rect.right+=n,t.rect.top+=s,t.rect.bottom+=s,r=t)}}}return r}}function S(t,e){return!t&&!e||Boolean(t)===Boolean(e)&&i.isDateSpansEqual(t.dateSpan,e.dateSpan)}function f(t,e){let i={};for(let n of e.pluginHooks.datePointTransforms)Object.assign(i,n(t,e));var n,s;return Object.assign(i,(n=t,{date:(s=e.dateEnv).toDate(n.range.start),dateStr:s.formatIso(n.range.start,{omitTime:n.allDay}),allDay:n.allDay})),i}class D extends i.Interaction{constructor(t){super(t),this.handlePointerDown=t=>{let{dragging:e}=this,i=t.origEvent.target;e.setIgnoreMove(!this.component.isValidDateDownEl(i))},this.handleDragEnd=t=>{let{component:e}=this,{pointer:i}=this.dragging;if(!i.wasTouchScroll){let{initialHit:i,finalHit:n}=this.hitDragging;if(i&&n&&S(i,n)){let{context:n}=e,s=Object.assign(Object.assign({},f(i.dateSpan,n)),{dayEl:i.dayEl,jsEvent:t.origEvent,view:n.viewApi||n.calendarApi.view});n.emitter.trigger("dateClick",s)}}},this.dragging=new p(t.el),this.dragging.autoScroller.isEnabled=!1;let e=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}}class y extends i.Interaction{constructor(t){super(t),this.dragSelection=null,this.handlePointerDown=t=>{let{component:e,dragging:i}=this,{options:n}=e.context,s=n.selectable&&e.isValidDateDownEl(t.origEvent.target);i.setIgnoreMove(!s),i.delay=t.isTouch?function(t){let{options:e}=t.context,i=e.selectLongPressDelay;null==i&&(i=e.longPressDelay);return i}(e):null},this.handleDragStart=t=>{this.component.context.calendarApi.unselect(t)},this.handleHitUpdate=(t,e)=>{let{context:n}=this.component,s=null,r=!1;if(t){let e=this.hitDragging.initialHit;t.componentId===e.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(e,t)||(s=function(t,e,n){let s=t.dateSpan,r=e.dateSpan,o=[s.range.start,s.range.end,r.range.start,r.range.end];o.sort(i.compareNumbers);let l={};for(let i of n){let n=i(t,e);if(!1===n)return null;n&&Object.assign(l,n)}return l.range={start:o[0],end:o[3]},l.allDay=s.allDay,l}(e,t,n.pluginHooks.dateSelectionTransformers)),s&&i.isDateSelectionValid(s,t.dateProfile,n)||(r=!0,s=null)}s?n.dispatch({type:"SELECT_DATES",selection:s}):e||n.dispatch({type:"UNSELECT_DATES"}),r?i.disableCursor():i.enableCursor(),e||(this.dragSelection=s)},this.handlePointerUp=t=>{this.dragSelection&&(i.triggerDateSelect(this.dragSelection,t,this.component.context),this.dragSelection=null)};let{component:e}=t,{options:n}=e.context,s=this.dragging=new p(t.el);s.touchScrollAllowed=!1,s.minDistance=n.selectMinDistance||0,s.autoScroller.isEnabled=n.dragScroll;let r=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}}class w extends i.Interaction{constructor(t){super(t),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=t=>{let e=t.origEvent.target,{component:n,dragging:s}=this,{mirror:r}=s,{options:o}=n.context,l=n.context;this.subjectEl=t.subjectEl;let a=this.subjectSeg=i.getElSeg(t.subjectEl),h=(this.eventRange=a.eventRange).instance.instanceId;this.relevantEvents=i.getRelevantEvents(l.getCurrentData().eventStore,h),s.minDistance=t.isTouch?0:o.eventDragMinDistance,s.delay=t.isTouch&&h!==n.props.eventSelection?function(t){let{options:e}=t.context,i=e.eventLongPressDelay;null==i&&(i=e.longPressDelay);return i}(n):null,o.fixedMirrorParent?r.parentNode=o.fixedMirrorParent:r.parentNode=i.elementClosest(e,".fc"),r.revertDuration=o.dragRevertDuration;let c=n.isValidSegDownEl(e)&&!i.elementClosest(e,".fc-event-resizer");s.setIgnoreMove(!c),this.isDragging=c&&t.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=t=>{let e=this.component.context,n=this.eventRange,s=n.instance.instanceId;t.isTouch?s!==this.component.props.eventSelection&&e.dispatch({type:"SELECT_EVENT",eventInstanceId:s}):e.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(e.calendarApi.unselect(t),e.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new i.EventImpl(e,n.def,n.instance),jsEvent:t.origEvent,view:e.viewApi}))},this.handleHitUpdate=(t,e)=>{if(!this.isDragging)return;let n=this.relevantEvents,s=this.hitDragging.initialHit,r=this.component.context,o=null,l=null,a=null,h=!1,c={affectedEvents:n,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(t){o=t.context;let e=o.options;r===o||e.editable&&e.droppable?(l=function(t,e,n){let s=t.dateSpan,r=e.dateSpan,o=s.range.start,l=r.range.start,a={};s.allDay!==r.allDay&&(a.allDay=r.allDay,a.hasEnd=e.context.options.allDayMaintainDuration,r.allDay&&(o=i.startOfDay(o)));let h=i.diffDates(o,l,t.context.dateEnv,t.componentId===e.componentId?t.largeUnit:null);h.milliseconds&&(a.allDay=!1);let c={datesDelta:h,standardProps:a};for(let i of n)i(c,t,e);return c}(s,t,o.getCurrentData().pluginHooks.eventDragMutationMassagers),l&&(a=i.applyMutationToEventStore(n,o.getCurrentData().eventUiBases,l,o),c.mutatedEvents=a,i.isInteractionValid(c,t.dateProfile,o)||(h=!0,l=null,a=null,c.mutatedEvents=i.createEmptyEventStore()))):o=null}this.displayDrag(o,c),h?i.disableCursor():i.enableCursor(),e||(r===o&&S(s,t)&&(l=null),this.dragging.setMirrorNeedsRevert(!l),this.dragging.setMirrorIsVisible(!t||!i.getElRoot(this.subjectEl).querySelector(".fc-event-mirror")),this.receivingContext=o,this.validMutation=l,this.mutatedRelevantEvents=a)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=t=>{if(this.isDragging){let e=this.component.context,n=e.viewApi,{receivingContext:s,validMutation:r}=this,o=this.eventRange.def,l=this.eventRange.instance,a=new i.EventImpl(e,o,l),h=this.relevantEvents,c=this.mutatedRelevantEvents,{finalHit:d}=this.hitDragging;if(this.clearDrag(),e.emitter.trigger("eventDragStop",{el:this.subjectEl,event:a,jsEvent:t.origEvent,view:n}),r){if(s===e){let s=new i.EventImpl(e,c.defs[o.defId],l?c.instances[l.instanceId]:null);e.dispatch({type:"MERGE_EVENTS",eventStore:c});let d={oldEvent:a,event:s,relatedEvents:i.buildEventApis(c,e,l),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:h})}},g={};for(let t of e.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(g,t(r,e));e.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},d),g),{el:t.subjectEl,delta:r.datesDelta,jsEvent:t.origEvent,view:n})),e.emitter.trigger("eventChange",d)}else if(s){let r={event:a,relatedEvents:i.buildEventApis(h,e,l),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:h})}};e.emitter.trigger("eventLeave",Object.assign(Object.assign({},r),{draggedEl:t.subjectEl,view:n})),e.dispatch({type:"REMOVE_EVENTS",eventStore:h}),e.emitter.trigger("eventRemove",r);let g=c.defs[o.defId],u=c.instances[l.instanceId],p=new i.EventImpl(s,g,u);s.dispatch({type:"MERGE_EVENTS",eventStore:c});let v={event:p,relatedEvents:i.buildEventApis(c,s,u),revert(){s.dispatch({type:"REMOVE_EVENTS",eventStore:c})}};s.emitter.trigger("eventAdd",v),t.isTouch&&s.dispatch({type:"SELECT_EVENT",eventInstanceId:l.instanceId}),s.emitter.trigger("drop",Object.assign(Object.assign({},f(d.dateSpan,s)),{draggedEl:t.subjectEl,jsEvent:t.origEvent,view:d.context.viewApi})),s.emitter.trigger("eventReceive",Object.assign(Object.assign({},v),{draggedEl:t.subjectEl,view:d.context.viewApi}))}}else e.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:e}=this,{options:n}=e.context,s=this.dragging=new p(t.el);s.pointer.selector=w.SELECTOR,s.touchScrollAllowed=!1,s.autoScroller.isEnabled=n.dragScroll;let r=this.hitDragging=new m(this.dragging,i.interactionSettingsStore);r.useSubjectCenter=t.useEventCenter,r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("pointerup",this.handlePointerUp),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(t,e){let n=this.component.context,s=this.receivingContext;s&&s!==t&&(s===n?s.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:e.affectedEvents,mutatedEvents:i.createEmptyEventStore(),isEvent:!0}}):s.dispatch({type:"UNSET_EVENT_DRAG"})),t&&t.dispatch({type:"SET_EVENT_DRAG",state:e})}clearDrag(){let t=this.component.context,{receivingContext:e}=this;e&&e.dispatch({type:"UNSET_EVENT_DRAG"}),t!==e&&t.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}w.SELECTOR=".fc-event-draggable, .fc-event-resizable";class T extends i.Interaction{constructor(t){super(t),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=t=>{let{component:e}=this,n=this.querySegEl(t),s=i.getElSeg(n),r=this.eventRange=s.eventRange;this.dragging.minDistance=e.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(t.origEvent.target)||t.isTouch&&this.component.props.eventSelection!==r.instance.instanceId)},this.handleDragStart=t=>{let{context:e}=this.component,n=this.eventRange;this.relevantEvents=i.getRelevantEvents(e.getCurrentData().eventStore,this.eventRange.instance.instanceId);let s=this.querySegEl(t);this.draggingSegEl=s,this.draggingSeg=i.getElSeg(s),e.calendarApi.unselect(),e.emitter.trigger("eventResizeStart",{el:s,event:new i.EventImpl(e,n.def,n.instance),jsEvent:t.origEvent,view:e.viewApi})},this.handleHitUpdate=(t,e,n)=>{let{context:s}=this.component,r=this.relevantEvents,o=this.hitDragging.initialHit,l=this.eventRange.instance,a=null,h=null,c=!1,d={affectedEvents:r,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(t){t.componentId===o.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(o,t)||(a=function(t,e,n,s){let r=t.context.dateEnv,o=t.dateSpan.range.start,l=e.dateSpan.range.start,a=i.diffDates(o,l,r,t.largeUnit);if(n){if(r.add(s.start,a)<s.end)return{startDelta:a}}else if(r.add(s.end,a)>s.start)return{endDelta:a};return null}(o,t,n.subjectEl.classList.contains("fc-event-resizer-start"),l.range))}a&&(h=i.applyMutationToEventStore(r,s.getCurrentData().eventUiBases,a,s),d.mutatedEvents=h,i.isInteractionValid(d,t.dateProfile,s)||(c=!0,a=null,h=null,d.mutatedEvents=null)),h?s.dispatch({type:"SET_EVENT_RESIZE",state:d}):s.dispatch({type:"UNSET_EVENT_RESIZE"}),c?i.disableCursor():i.enableCursor(),e||(a&&S(o,t)&&(a=null),this.validMutation=a,this.mutatedRelevantEvents=h)},this.handleDragEnd=t=>{let{context:e}=this.component,n=this.eventRange.def,s=this.eventRange.instance,r=new i.EventImpl(e,n,s),o=this.relevantEvents,l=this.mutatedRelevantEvents;if(e.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:r,jsEvent:t.origEvent,view:e.viewApi}),this.validMutation){let a=new i.EventImpl(e,l.defs[n.defId],s?l.instances[s.instanceId]:null);e.dispatch({type:"MERGE_EVENTS",eventStore:l});let h={oldEvent:r,event:a,relatedEvents:i.buildEventApis(l,e,s),revert(){e.dispatch({type:"MERGE_EVENTS",eventStore:o})}};e.emitter.trigger("eventResize",Object.assign(Object.assign({},h),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||i.createDuration(0),endDelta:this.validMutation.endDelta||i.createDuration(0),jsEvent:t.origEvent,view:e.viewApi})),e.emitter.trigger("eventChange",h)}else e.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:e}=t,n=this.dragging=new p(t.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=e.context.options.dragScroll;let s=this.hitDragging=new m(this.dragging,i.interactionSettingsToStore(t));s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(t){return i.elementClosest(t.subjectEl,".fc-event")}}const b={fixedMirrorParent:i.identity},M={dateClick:i.identity,eventDragStart:i.identity,eventDragStop:i.identity,eventDrop:i.identity,eventResizeStart:i.identity,eventResizeStop:i.identity,eventResize:i.identity,drop:i.identity,eventReceive:i.identity,eventLeave:i.identity};class C{constructor(t,e){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=t=>{this.dragMeta=this.buildDragMeta(t.subjectEl)},this.handleHitUpdate=(t,e,n)=>{let{dragging:s}=this.hitDragging,r=null,o=null,l=!1,a={affectedEvents:i.createEmptyEventStore(),mutatedEvents:i.createEmptyEventStore(),isEvent:this.dragMeta.create};t&&(r=t.context,this.canDropElOnCalendar(n.subjectEl,r)&&(o=function(t,e,n){let s=Object.assign({},e.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(s,i(t,e));let{refined:r,extra:o}=i.refineEventDef(s,n),l=i.parseEventDef(r,o,e.sourceId,t.allDay,n.options.forceEventDuration||Boolean(e.duration),n),a=t.range.start;t.allDay&&e.startTime&&(a=n.dateEnv.add(a,e.startTime));let h=e.duration?n.dateEnv.add(a,e.duration):i.getDefaultEventEnd(t.allDay,a,n),c=i.createEventInstance(l.defId,{start:a,end:h});return{def:l,instance:c}}(t.dateSpan,this.dragMeta,r),a.mutatedEvents=i.eventTupleToStore(o),l=!i.isInteractionValid(a,t.dateProfile,r),l&&(a.mutatedEvents=i.createEmptyEventStore(),o=null))),this.displayDrag(r,a),s.setMirrorIsVisible(e||!o||!document.querySelector(".fc-event-mirror")),l?i.disableCursor():i.enableCursor(),e||(s.setMirrorNeedsRevert(!o),this.receivingContext=r,this.droppableEvent=o)},this.handleDragEnd=t=>{let{receivingContext:e,droppableEvent:n}=this;if(this.clearDrag(),e&&n){let s=this.hitDragging.finalHit,r=s.context.viewApi,o=this.dragMeta;if(e.emitter.trigger("drop",Object.assign(Object.assign({},f(s.dateSpan,e)),{draggedEl:t.subjectEl,jsEvent:t.origEvent,view:r})),o.create){let s=i.eventTupleToStore(n);e.dispatch({type:"MERGE_EVENTS",eventStore:s}),t.isTouch&&e.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),e.emitter.trigger("eventReceive",{event:new i.EventImpl(e,n.def,n.instance),relatedEvents:[],revert(){e.dispatch({type:"REMOVE_EVENTS",eventStore:s})},draggedEl:t.subjectEl,view:r})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new m(t,i.interactionSettingsStore);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=e}buildDragMeta(t){return"object"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta(t)):function(t){let e=function(t,e){let n=i.config.dataAttrPrefix,s=(n?n+"-":"")+e;return t.getAttribute("data-"+s)||""}(t,"event"),n=e?JSON.parse(e):{create:!1};return i.parseDragMeta(n)}(t)}displayDrag(t,e){let i=this.receivingContext;i&&i!==t&&i.dispatch({type:"UNSET_EVENT_DRAG"}),t&&t.dispatch({type:"SET_EVENT_DRAG",state:e})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(t,e){let n=e.options.dropAccept;return"function"==typeof n?n.call(e.calendarApi,t):"string"!=typeof n||!n||Boolean(i.elementMatches(t,n))}}i.config.dataAttrPrefix="";class R extends i.ElementDragging{constructor(t){super(t),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=t=>{this.emitter.trigger("pointerdown",t),this.shouldIgnoreMove||this.emitter.trigger("dragstart",t)},this.handlePointerMove=t=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",t)},this.handlePointerUp=t=>{this.emitter.trigger("pointerup",t),this.shouldIgnoreMove||this.emitter.trigger("dragend",t)};let e=this.pointer=new o(t);e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("pointermove",this.handlePointerMove),e.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(t){this.shouldIgnoreMove=t}setMirrorIsVisible(t){if(t)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}}}var I=e.createPlugin({name:"@fullcalendar/interaction",componentInteractions:[D,y,w,T],calendarInteractions:[class{constructor(t){this.context=t,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=t=>{t.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=t=>{let e=this.context.options.unselectCancel,n=i.getEventTargetViaRoot(t.origEvent);this.matchesCancel=!!i.elementClosest(n,e),this.matchesEvent=!!i.elementClosest(n,w.SELECTOR)},this.onDocumentPointerUp=t=>{let{context:e}=this,{documentPointer:i}=this,n=e.getCurrentData();if(!i.wasTouchScroll){if(n.dateSelection&&!this.isRecentPointerDateSelect){let i=e.options.unselectAuto;!i||i&&this.matchesCancel||e.calendarApi.unselect(t)}n.eventSelection&&!this.matchesEvent&&e.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let e=this.documentPointer=new o(document);e.shouldIgnoreMove=!0,e.shouldWatchScroll=!1,e.emitter.on("pointerdown",this.onDocumentPointerDown),e.emitter.on("pointerup",this.onDocumentPointerUp),t.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:p,optionRefiners:b,listenerRefiners:M});return e.globalPlugins.push(I),t.Draggable=class{constructor(t,e={}){this.handlePointerDown=t=>{let{dragging:e}=this,{minDistance:n,longPressDelay:s}=this.settings;e.minDistance=null!=n?n:t.isTouch?0:i.BASE_OPTION_DEFAULTS.eventDragMinDistance,e.delay=t.isTouch?null!=s?s:i.BASE_OPTION_DEFAULTS.longPressDelay:0},this.handleDragStart=t=>{t.isTouch&&this.dragging.delay&&t.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=e;let n=this.dragging=new p(t);n.touchScrollAllowed=!1,null!=e.itemSelector&&(n.pointer.selector=e.itemSelector),null!=e.appendTo&&(n.mirror.parentNode=e.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new C(n,e.eventData)}destroy(){this.dragging.destroy()}},t.ThirdPartyDraggable=class{constructor(t,e){let i=document;t===document||t instanceof Element?(i=t,e=e||{}):e=t||{};let n=this.dragging=new R(i);"string"==typeof e.itemSelector?n.pointer.selector=e.itemSelector:i===document&&(n.pointer.selector="[data-event]"),"string"==typeof e.mirrorSelector&&(n.mirrorSelector=e.mirrorSelector),new C(n,e.eventData)}destroy(){this.dragging.destroy()}},t.default=I,Object.defineProperty(t,"__esModule",{value:!0}),t}({},FullCalendar,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/interaction/main.d.ts b/library/fullcalendar/packages/interaction/main.d.ts
deleted file mode 100644
index b7398ba76..000000000
--- a/library/fullcalendar/packages/interaction/main.d.ts
+++ /dev/null
@@ -1,323 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/interaction' {
- import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
- export { FeaturefulElementDragging };
- export { default as PointerDragging } from '@fullcalendar/interaction/dnd/PointerDragging';
- export { default as Draggable } from '@fullcalendar/interaction/interactions-external/ExternalDraggable';
- export { default as ThirdPartyDraggable } from '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable';
-}
-
-declare module '@fullcalendar/interaction/dnd/FeaturefulElementDragging' {
- import { PointerDragEvent, ElementDragging } from '@fullcalendar/core';
- import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
- import ElementMirror from '@fullcalendar/interaction/dnd/ElementMirror';
- import AutoScroller from '@fullcalendar/interaction/dnd/AutoScroller';
- export { FeaturefulElementDragging as default, FeaturefulElementDragging };
- class FeaturefulElementDragging extends ElementDragging {
- pointer: PointerDragging;
- mirror: ElementMirror;
- autoScroller: AutoScroller;
- delay: number | null;
- minDistance: number;
- touchScrollAllowed: boolean;
- mirrorNeedsRevert: boolean;
- isInteracting: boolean;
- isDragging: boolean;
- isDelayEnded: boolean;
- isDistanceSurpassed: boolean;
- delayTimeoutId: number | null;
- constructor(containerEl: HTMLElement);
- destroy(): void;
- onPointerDown: (ev: PointerDragEvent) => void;
- onPointerMove: (ev: PointerDragEvent) => void;
- onPointerUp: (ev: PointerDragEvent) => void;
- startDelay(ev: PointerDragEvent): void;
- handleDelayEnd(ev: PointerDragEvent): void;
- handleDistanceSurpassed(ev: PointerDragEvent): void;
- tryStartDrag(ev: PointerDragEvent): void;
- tryStopDrag(ev: PointerDragEvent): void;
- stopDrag(ev: PointerDragEvent): void;
- setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- setMirrorNeedsRevert(bool: boolean): void;
- setAutoScrollEnabled(bool: boolean): void;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/PointerDragging' {
- import { EmitterMixin, PointerDragEvent } from '@fullcalendar/core';
- export { PointerDragging as default, PointerDragging };
- class PointerDragging {
- containerEl: EventTarget;
- subjectEl: HTMLElement | null;
- downEl: HTMLElement | null;
- emitter: EmitterMixin;
- selector: string;
- handleSelector: string;
- shouldIgnoreMove: boolean;
- shouldWatchScroll: boolean;
- isDragging: boolean;
- isTouchDragging: boolean;
- wasTouchScroll: boolean;
- origPageX: number;
- origPageY: number;
- prevPageX: number;
- prevPageY: number;
- prevScrollX: number;
- prevScrollY: number;
- constructor(containerEl: EventTarget);
- destroy(): void;
- tryStart(ev: UIEvent): boolean;
- cleanup(): void;
- querySubjectEl(ev: UIEvent): HTMLElement;
- handleMouseDown: (ev: MouseEvent) => void;
- handleMouseMove: (ev: MouseEvent) => void;
- handleMouseUp: (ev: MouseEvent) => void;
- shouldIgnoreMouse(): number | boolean;
- handleTouchStart: (ev: TouchEvent) => void;
- handleTouchMove: (ev: TouchEvent) => void;
- handleTouchEnd: (ev: TouchEvent) => void;
- handleTouchScroll: () => void;
- cancelTouchScroll(): void;
- initScrollWatch(ev: PointerDragEvent): void;
- recordCoords(ev: PointerDragEvent): void;
- handleScroll: (ev: UIEvent) => void;
- destroyScrollWatch(): void;
- createEventFromMouse(ev: MouseEvent, isFirst?: boolean): PointerDragEvent;
- createEventFromTouch(ev: TouchEvent, isFirst?: boolean): PointerDragEvent;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalDraggable' {
- import { PointerDragEvent } from '@fullcalendar/core';
- import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
- import { DragMetaGenerator } from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
- export interface ExternalDraggableSettings {
- eventData?: DragMetaGenerator;
- itemSelector?: string;
- minDistance?: number;
- longPressDelay?: number;
- appendTo?: HTMLElement;
- }
- export { ExternalDraggable as default, ExternalDraggable };
- class ExternalDraggable {
- dragging: FeaturefulElementDragging;
- settings: ExternalDraggableSettings;
- constructor(el: HTMLElement, settings?: ExternalDraggableSettings);
- handlePointerDown: (ev: PointerDragEvent) => void;
- handleDragStart: (ev: PointerDragEvent) => void;
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable' {
- import { DragMetaGenerator } from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
- import InferredElementDragging from '@fullcalendar/interaction/interactions-external/InferredElementDragging';
- export interface ThirdPartyDraggableSettings {
- eventData?: DragMetaGenerator;
- itemSelector?: string;
- mirrorSelector?: string;
- }
- export { ThirdPartyDraggable as default, ThirdPartyDraggable };
- class ThirdPartyDraggable {
- dragging: InferredElementDragging;
- constructor(containerOrSettings?: EventTarget | ThirdPartyDraggableSettings, settings?: ThirdPartyDraggableSettings);
- destroy(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/ElementMirror' {
- import { Rect } from '@fullcalendar/core';
- export { ElementMirror as default, ElementMirror };
- class ElementMirror {
- isVisible: boolean;
- origScreenX?: number;
- origScreenY?: number;
- deltaX?: number;
- deltaY?: number;
- sourceEl: HTMLElement | null;
- mirrorEl: HTMLElement | null;
- sourceElRect: Rect | null;
- parentNode: HTMLElement;
- zIndex: number;
- revertDuration: number;
- start(sourceEl: HTMLElement, pageX: number, pageY: number): void;
- handleMove(pageX: number, pageY: number): void;
- setIsVisible(bool: boolean): void;
- stop(needsRevertAnimation: boolean, callback: () => void): void;
- doRevertAnimation(callback: () => void, revertDuration: number): void;
- cleanup(): void;
- updateElPosition(): void;
- getMirrorEl(): HTMLElement;
- }
-}
-
-declare module '@fullcalendar/interaction/dnd/AutoScroller' {
- import { ScrollGeomCache } from '@fullcalendar/interaction/scroll-geom-cache';
- export { AutoScroller as default, AutoScroller };
- class AutoScroller {
- isEnabled: boolean;
- scrollQuery: (Window | string)[];
- edgeThreshold: number;
- maxVelocity: number;
- pointerScreenX: number | null;
- pointerScreenY: number | null;
- isAnimating: boolean;
- scrollCaches: ScrollGeomCache[] | null;
- msSinceRequest?: number;
- everMovedUp: boolean;
- everMovedDown: boolean;
- everMovedLeft: boolean;
- everMovedRight: boolean;
- start(pageX: number, pageY: number): void;
- handleMove(pageX: number, pageY: number): void;
- stop(): void;
- requestAnimation(now: number): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalElementDragging' {
- import { Hit, PointerDragEvent, EventTuple, DatePointApi, Calendar, EventInteractionState, DragMetaInput, DragMeta, View, ElementDragging } from '@fullcalendar/core';
- import HitDragging from '@fullcalendar/interaction/interactions/HitDragging';
- export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput);
- export interface ExternalDropApi extends DatePointApi {
- draggedEl: HTMLElement;
- jsEvent: UIEvent;
- view: View;
- }
- export { ExternalElementDragging as default, ExternalElementDragging };
- class ExternalElementDragging {
- hitDragging: HitDragging;
- receivingCalendar: Calendar | null;
- droppableEvent: EventTuple | null;
- suppliedDragMeta: DragMetaGenerator | null;
- dragMeta: DragMeta | null;
- constructor(dragging: ElementDragging, suppliedDragMeta?: DragMetaGenerator);
- handleDragStart: (ev: PointerDragEvent) => void;
- buildDragMeta(subjectEl: HTMLElement): DragMeta;
- handleHitUpdate: (hit: Hit, isFinal: boolean, ev: PointerDragEvent) => void;
- handleDragEnd: (pev: PointerDragEvent) => void;
- displayDrag(nextCalendar: Calendar | null, state: EventInteractionState): void;
- clearDrag(): void;
- canDropElOnCalendar(el: HTMLElement, receivingCalendar: Calendar): boolean;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/InferredElementDragging' {
- import { PointerDragEvent, ElementDragging } from '@fullcalendar/core';
- import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
- export { InferredElementDragging as default, InferredElementDragging };
- class InferredElementDragging extends ElementDragging {
- pointer: PointerDragging;
- shouldIgnoreMove: boolean;
- mirrorSelector: string;
- currentMirrorEl: HTMLElement | null;
- constructor(containerEl: HTMLElement);
- destroy(): void;
- handlePointerDown: (ev: PointerDragEvent) => void;
- handlePointerMove: (ev: PointerDragEvent) => void;
- handlePointerUp: (ev: PointerDragEvent) => void;
- setIgnoreMove(bool: boolean): void;
- setMirrorIsVisible(bool: boolean): void;
- }
-}
-
-declare module '@fullcalendar/interaction/scroll-geom-cache' {
- import { Rect, ScrollController } from '@fullcalendar/core';
- export abstract class ScrollGeomCache extends ScrollController {
- clientRect: Rect;
- origScrollTop: number;
- origScrollLeft: number;
- protected scrollController: ScrollController;
- protected doesListening: boolean;
- protected scrollTop: number;
- protected scrollLeft: number;
- protected scrollWidth: number;
- protected scrollHeight: number;
- protected clientWidth: number;
- protected clientHeight: number;
- constructor(scrollController: ScrollController, doesListening: boolean);
- abstract getEventTarget(): EventTarget;
- abstract computeClientRect(): Rect;
- destroy(): void;
- handleScroll: () => void;
- getScrollTop(): number;
- getScrollLeft(): number;
- setScrollTop(top: number): void;
- setScrollLeft(top: number): void;
- getClientWidth(): number;
- getClientHeight(): number;
- getScrollWidth(): number;
- getScrollHeight(): number;
- handleScrollChange(): void;
- }
- export class ElementScrollGeomCache extends ScrollGeomCache {
- constructor(el: HTMLElement, doesListening: boolean);
- getEventTarget(): EventTarget;
- computeClientRect(): {
- left: number;
- right: number;
- top: number;
- bottom: number;
- };
- }
- export class WindowScrollGeomCache extends ScrollGeomCache {
- constructor(doesListening: boolean);
- getEventTarget(): EventTarget;
- computeClientRect(): Rect;
- handleScrollChange(): void;
- }
-}
-
-declare module '@fullcalendar/interaction/interactions/HitDragging' {
- import { EmitterMixin, PointerDragEvent, Point, Hit, InteractionSettingsStore, ElementDragging } from '@fullcalendar/core';
- import OffsetTracker from '@fullcalendar/interaction/OffsetTracker';
- export { HitDragging as default, HitDragging };
- class HitDragging {
- droppableStore: InteractionSettingsStore;
- dragging: ElementDragging;
- emitter: EmitterMixin;
- useSubjectCenter: boolean;
- requireInitial: boolean;
- offsetTrackers: {
- [componentUid: string]: OffsetTracker;
- };
- initialHit: Hit | null;
- movingHit: Hit | null;
- finalHit: Hit | null;
- coordAdjust?: Point;
- constructor(dragging: ElementDragging, droppableStore: InteractionSettingsStore);
- handlePointerDown: (ev: PointerDragEvent) => void;
- processFirstCoord(ev: PointerDragEvent): void;
- handleDragStart: (ev: PointerDragEvent) => void;
- handleDragMove: (ev: PointerDragEvent) => void;
- handlePointerUp: (ev: PointerDragEvent) => void;
- handleDragEnd: (ev: PointerDragEvent) => void;
- handleMove(ev: PointerDragEvent, forceHandle?: boolean): void;
- prepareHits(): void;
- releaseHits(): void;
- queryHitForOffset(offsetLeft: number, offsetTop: number): Hit | null;
- }
- export function isHitsEqual(hit0: Hit | null, hit1: Hit | null): boolean;
-}
-
-declare module '@fullcalendar/interaction/OffsetTracker' {
- import { Rect } from '@fullcalendar/core';
- import { ElementScrollGeomCache } from '@fullcalendar/interaction/scroll-geom-cache';
- export { OffsetTracker as default, OffsetTracker };
- class OffsetTracker {
- scrollCaches: ElementScrollGeomCache[];
- origRect: Rect;
- constructor(el: HTMLElement);
- destroy(): void;
- computeLeft(): number;
- computeTop(): number;
- isWithinClipping(pageX: number, pageY: number): boolean;
- }
-}
-
diff --git a/library/fullcalendar/packages/interaction/main.esm.js b/library/fullcalendar/packages/interaction/main.esm.js
deleted file mode 100644
index af9ef4074..000000000
--- a/library/fullcalendar/packages/interaction/main.esm.js
+++ /dev/null
@@ -1,2141 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { config, elementClosest, EmitterMixin, applyStyle, whenTransitionDone, removeElement, ScrollController, ElementScrollController, computeInnerRect, WindowScrollController, preventSelection, preventContextMenu, allowSelection, allowContextMenu, ElementDragging, computeRect, getClippingParents, pointInsideRect, isDateSpansEqual, constrainPoint, intersectRects, getRectCenter, diffPoints, mapHash, rangeContainsRange, interactionSettingsToStore, Interaction, enableCursor, disableCursor, compareNumbers, getElSeg, getRelevantEvents, EventApi, createEmptyEventStore, applyMutationToEventStore, interactionSettingsStore, startOfDay, diffDates, createDuration, eventTupleToStore, isInteractionValid, parseDragMeta, elementMatches, parseEventDef, createEventInstance, globalDefaults, createPlugin } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-config.touchMouseIgnoreWait = 500;
-var ignoreMouseDepth = 0;
-var listenerCnt = 0;
-var isWindowTouchMoveCancelled = false;
-/*
-Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
-Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
-Also, tracks if there was touch-scrolling.
-Also, can prevent touch-scrolling from happening.
-Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
-emits:
-- pointerdown
-- pointermove
-- pointerup
-*/
-var PointerDragging = /** @class */ (function () {
- function PointerDragging(containerEl) {
- var _this = this;
- this.subjectEl = null;
- this.downEl = null;
- // options that can be directly assigned by caller
- this.selector = ''; // will cause subjectEl in all emitted events to be this element
- this.handleSelector = '';
- this.shouldIgnoreMove = false;
- this.shouldWatchScroll = true; // for simulating pointermove on scroll
- // internal states
- this.isDragging = false;
- this.isTouchDragging = false;
- this.wasTouchScroll = false;
- // Mouse
- // ----------------------------------------------------------------------------------------------------
- this.handleMouseDown = function (ev) {
- if (!_this.shouldIgnoreMouse() &&
- isPrimaryMouseButton(ev) &&
- _this.tryStart(ev)) {
- var pev = _this.createEventFromMouse(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- if (!_this.shouldIgnoreMove) {
- document.addEventListener('mousemove', _this.handleMouseMove);
- }
- document.addEventListener('mouseup', _this.handleMouseUp);
- }
- };
- this.handleMouseMove = function (ev) {
- var pev = _this.createEventFromMouse(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleMouseUp = function (ev) {
- document.removeEventListener('mousemove', _this.handleMouseMove);
- document.removeEventListener('mouseup', _this.handleMouseUp);
- _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- };
- // Touch
- // ----------------------------------------------------------------------------------------------------
- this.handleTouchStart = function (ev) {
- if (_this.tryStart(ev)) {
- _this.isTouchDragging = true;
- var pev = _this.createEventFromTouch(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- // unlike mouse, need to attach to target, not document
- // https://stackoverflow.com/a/45760014
- var target = ev.target;
- if (!_this.shouldIgnoreMove) {
- target.addEventListener('touchmove', _this.handleTouchMove);
- }
- target.addEventListener('touchend', _this.handleTouchEnd);
- target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
- // attach a handler to get called when ANY scroll action happens on the page.
- // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
- // http://stackoverflow.com/a/32954565/96342
- window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
- );
- }
- };
- this.handleTouchMove = function (ev) {
- var pev = _this.createEventFromTouch(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleTouchEnd = function (ev) {
- if (_this.isDragging) { // done to guard against touchend followed by touchcancel
- var target = ev.target;
- target.removeEventListener('touchmove', _this.handleTouchMove);
- target.removeEventListener('touchend', _this.handleTouchEnd);
- target.removeEventListener('touchcancel', _this.handleTouchEnd);
- window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
- _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- _this.isTouchDragging = false;
- startIgnoringMouse();
- }
- };
- this.handleTouchScroll = function () {
- _this.wasTouchScroll = true;
- };
- this.handleScroll = function (ev) {
- if (!_this.shouldIgnoreMove) {
- var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
- var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
- _this.emitter.trigger('pointermove', {
- origEvent: ev,
- isTouch: _this.isTouchDragging,
- subjectEl: _this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: pageX - _this.origPageX,
- deltaY: pageY - _this.origPageY
- });
- }
- };
- this.containerEl = containerEl;
- this.emitter = new EmitterMixin();
- containerEl.addEventListener('mousedown', this.handleMouseDown);
- containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerCreated();
- }
- PointerDragging.prototype.destroy = function () {
- this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
- this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerDestroyed();
- };
- PointerDragging.prototype.tryStart = function (ev) {
- var subjectEl = this.querySubjectEl(ev);
- var downEl = ev.target;
- if (subjectEl &&
- (!this.handleSelector || elementClosest(downEl, this.handleSelector))) {
- this.subjectEl = subjectEl;
- this.downEl = downEl;
- this.isDragging = true; // do this first so cancelTouchScroll will work
- this.wasTouchScroll = false;
- return true;
- }
- return false;
- };
- PointerDragging.prototype.cleanup = function () {
- isWindowTouchMoveCancelled = false;
- this.isDragging = false;
- this.subjectEl = null;
- this.downEl = null;
- // keep wasTouchScroll around for later access
- this.destroyScrollWatch();
- };
- PointerDragging.prototype.querySubjectEl = function (ev) {
- if (this.selector) {
- return elementClosest(ev.target, this.selector);
- }
- else {
- return this.containerEl;
- }
- };
- PointerDragging.prototype.shouldIgnoreMouse = function () {
- return ignoreMouseDepth || this.isTouchDragging;
- };
- // can be called by user of this class, to cancel touch-based scrolling for the current drag
- PointerDragging.prototype.cancelTouchScroll = function () {
- if (this.isDragging) {
- isWindowTouchMoveCancelled = true;
- }
- };
- // Scrolling that simulates pointermoves
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.initScrollWatch = function (ev) {
- if (this.shouldWatchScroll) {
- this.recordCoords(ev);
- window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
- }
- };
- PointerDragging.prototype.recordCoords = function (ev) {
- if (this.shouldWatchScroll) {
- this.prevPageX = ev.pageX;
- this.prevPageY = ev.pageY;
- this.prevScrollX = window.pageXOffset;
- this.prevScrollY = window.pageYOffset;
- }
- };
- PointerDragging.prototype.destroyScrollWatch = function () {
- if (this.shouldWatchScroll) {
- window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
- }
- };
- // Event Normalization
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
- var deltaX = 0;
- var deltaY = 0;
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = ev.pageX;
- this.origPageY = ev.pageY;
- }
- else {
- deltaX = ev.pageX - this.origPageX;
- deltaY = ev.pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: false,
- subjectEl: this.subjectEl,
- pageX: ev.pageX,
- pageY: ev.pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
- var touches = ev.touches;
- var pageX;
- var pageY;
- var deltaX = 0;
- var deltaY = 0;
- // if touch coords available, prefer,
- // because FF would give bad ev.pageX ev.pageY
- if (touches && touches.length) {
- pageX = touches[0].pageX;
- pageY = touches[0].pageY;
- }
- else {
- pageX = ev.pageX;
- pageY = ev.pageY;
- }
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = pageX;
- this.origPageY = pageY;
- }
- else {
- deltaX = pageX - this.origPageX;
- deltaY = pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: true,
- subjectEl: this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- return PointerDragging;
-}());
-// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
-function isPrimaryMouseButton(ev) {
- return ev.button === 0 && !ev.ctrlKey;
-}
-// Ignoring fake mouse events generated by touch
-// ----------------------------------------------------------------------------------------------------
-function startIgnoringMouse() {
- ignoreMouseDepth++;
- setTimeout(function () {
- ignoreMouseDepth--;
- }, config.touchMouseIgnoreWait);
-}
-// We want to attach touchmove as early as possible for Safari
-// ----------------------------------------------------------------------------------------------------
-function listenerCreated() {
- if (!(listenerCnt++)) {
- window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
-}
-function listenerDestroyed() {
- if (!(--listenerCnt)) {
- window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
-}
-function onWindowTouchMove(ev) {
- if (isWindowTouchMoveCancelled) {
- ev.preventDefault();
- }
-}
-
-/*
-An effect in which an element follows the movement of a pointer across the screen.
-The moving element is a clone of some other element.
-Must call start + handleMove + stop.
-*/
-var ElementMirror = /** @class */ (function () {
- function ElementMirror() {
- this.isVisible = false; // must be explicitly enabled
- this.sourceEl = null;
- this.mirrorEl = null;
- this.sourceElRect = null; // screen coords relative to viewport
- // options that can be set directly by caller
- this.parentNode = document.body;
- this.zIndex = 9999;
- this.revertDuration = 0;
- }
- ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
- this.sourceEl = sourceEl;
- this.sourceElRect = this.sourceEl.getBoundingClientRect();
- this.origScreenX = pageX - window.pageXOffset;
- this.origScreenY = pageY - window.pageYOffset;
- this.deltaX = 0;
- this.deltaY = 0;
- this.updateElPosition();
- };
- ElementMirror.prototype.handleMove = function (pageX, pageY) {
- this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
- this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
- this.updateElPosition();
- };
- // can be called before start
- ElementMirror.prototype.setIsVisible = function (bool) {
- if (bool) {
- if (!this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = '';
- }
- this.isVisible = bool; // needs to happen before updateElPosition
- this.updateElPosition(); // because was not updating the position while invisible
- }
- }
- else {
- if (this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = 'none';
- }
- this.isVisible = bool;
- }
- }
- };
- // always async
- ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
- var _this = this;
- var done = function () {
- _this.cleanup();
- callback();
- };
- if (needsRevertAnimation &&
- this.mirrorEl &&
- this.isVisible &&
- this.revertDuration && // if 0, transition won't work
- (this.deltaX || this.deltaY) // if same coords, transition won't work
- ) {
- this.doRevertAnimation(done, this.revertDuration);
- }
- else {
- setTimeout(done, 0);
- }
- };
- ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
- var mirrorEl = this.mirrorEl;
- var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
- mirrorEl.style.transition =
- 'top ' + revertDuration + 'ms,' +
- 'left ' + revertDuration + 'ms';
- applyStyle(mirrorEl, {
- left: finalSourceElRect.left,
- top: finalSourceElRect.top
- });
- whenTransitionDone(mirrorEl, function () {
- mirrorEl.style.transition = '';
- callback();
- });
- };
- ElementMirror.prototype.cleanup = function () {
- if (this.mirrorEl) {
- removeElement(this.mirrorEl);
- this.mirrorEl = null;
- }
- this.sourceEl = null;
- };
- ElementMirror.prototype.updateElPosition = function () {
- if (this.sourceEl && this.isVisible) {
- applyStyle(this.getMirrorEl(), {
- left: this.sourceElRect.left + this.deltaX,
- top: this.sourceElRect.top + this.deltaY
- });
- }
- };
- ElementMirror.prototype.getMirrorEl = function () {
- var sourceElRect = this.sourceElRect;
- var mirrorEl = this.mirrorEl;
- if (!mirrorEl) {
- mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
- // we don't want long taps or any mouse interaction causing selection/menus.
- // would use preventSelection(), but that prevents selectstart, causing problems.
- mirrorEl.classList.add('fc-unselectable');
- mirrorEl.classList.add('fc-dragging');
- applyStyle(mirrorEl, {
- position: 'fixed',
- zIndex: this.zIndex,
- visibility: '',
- boxSizing: 'border-box',
- width: sourceElRect.right - sourceElRect.left,
- height: sourceElRect.bottom - sourceElRect.top,
- right: 'auto',
- bottom: 'auto',
- margin: 0
- });
- this.parentNode.appendChild(mirrorEl);
- }
- return mirrorEl;
- };
- return ElementMirror;
-}());
-
-/*
-Is a cache for a given element's scroll information (all the info that ScrollController stores)
-in addition the "client rectangle" of the element.. the area within the scrollbars.
-
-The cache can be in one of two modes:
-- doesListening:false - ignores when the container is scrolled by someone else
-- doesListening:true - watch for scrolling and update the cache
-*/
-var ScrollGeomCache = /** @class */ (function (_super) {
- __extends(ScrollGeomCache, _super);
- function ScrollGeomCache(scrollController, doesListening) {
- var _this = _super.call(this) || this;
- _this.handleScroll = function () {
- _this.scrollTop = _this.scrollController.getScrollTop();
- _this.scrollLeft = _this.scrollController.getScrollLeft();
- _this.handleScrollChange();
- };
- _this.scrollController = scrollController;
- _this.doesListening = doesListening;
- _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
- _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
- _this.scrollWidth = scrollController.getScrollWidth();
- _this.scrollHeight = scrollController.getScrollHeight();
- _this.clientWidth = scrollController.getClientWidth();
- _this.clientHeight = scrollController.getClientHeight();
- _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
- if (_this.doesListening) {
- _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
- }
- return _this;
- }
- ScrollGeomCache.prototype.destroy = function () {
- if (this.doesListening) {
- this.getEventTarget().removeEventListener('scroll', this.handleScroll);
- }
- };
- ScrollGeomCache.prototype.getScrollTop = function () {
- return this.scrollTop;
- };
- ScrollGeomCache.prototype.getScrollLeft = function () {
- return this.scrollLeft;
- };
- ScrollGeomCache.prototype.setScrollTop = function (top) {
- this.scrollController.setScrollTop(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.setScrollLeft = function (top) {
- this.scrollController.setScrollLeft(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.getClientWidth = function () {
- return this.clientWidth;
- };
- ScrollGeomCache.prototype.getClientHeight = function () {
- return this.clientHeight;
- };
- ScrollGeomCache.prototype.getScrollWidth = function () {
- return this.scrollWidth;
- };
- ScrollGeomCache.prototype.getScrollHeight = function () {
- return this.scrollHeight;
- };
- ScrollGeomCache.prototype.handleScrollChange = function () {
- };
- return ScrollGeomCache;
-}(ScrollController));
-var ElementScrollGeomCache = /** @class */ (function (_super) {
- __extends(ElementScrollGeomCache, _super);
- function ElementScrollGeomCache(el, doesListening) {
- return _super.call(this, new ElementScrollController(el), doesListening) || this;
- }
- ElementScrollGeomCache.prototype.getEventTarget = function () {
- return this.scrollController.el;
- };
- ElementScrollGeomCache.prototype.computeClientRect = function () {
- return computeInnerRect(this.scrollController.el);
- };
- return ElementScrollGeomCache;
-}(ScrollGeomCache));
-var WindowScrollGeomCache = /** @class */ (function (_super) {
- __extends(WindowScrollGeomCache, _super);
- function WindowScrollGeomCache(doesListening) {
- return _super.call(this, new WindowScrollController(), doesListening) || this;
- }
- WindowScrollGeomCache.prototype.getEventTarget = function () {
- return window;
- };
- WindowScrollGeomCache.prototype.computeClientRect = function () {
- return {
- left: this.scrollLeft,
- right: this.scrollLeft + this.clientWidth,
- top: this.scrollTop,
- bottom: this.scrollTop + this.clientHeight
- };
- };
- // the window is the only scroll object that changes it's rectangle relative
- // to the document's topleft as it scrolls
- WindowScrollGeomCache.prototype.handleScrollChange = function () {
- this.clientRect = this.computeClientRect();
- };
- return WindowScrollGeomCache;
-}(ScrollGeomCache));
-
-// If available we are using native "performance" API instead of "Date"
-// Read more about it on MDN:
-// https://developer.mozilla.org/en-US/docs/Web/API/Performance
-var getTime = typeof performance === 'function' ? performance.now : Date.now;
-/*
-For a pointer interaction, automatically scrolls certain scroll containers when the pointer
-approaches the edge.
-
-The caller must call start + handleMove + stop.
-*/
-var AutoScroller = /** @class */ (function () {
- function AutoScroller() {
- var _this = this;
- // options that can be set by caller
- this.isEnabled = true;
- this.scrollQuery = [window, '.fc-scroller'];
- this.edgeThreshold = 50; // pixels
- this.maxVelocity = 300; // pixels per second
- // internal state
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.isAnimating = false;
- this.scrollCaches = null;
- // protect against the initial pointerdown being too close to an edge and starting the scroll
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.animate = function () {
- if (_this.isAnimating) { // wasn't cancelled between animation calls
- var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
- if (edge) {
- var now = getTime();
- _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
- _this.requestAnimation(now);
- }
- else {
- _this.isAnimating = false; // will stop animation
- }
- }
- };
- }
- AutoScroller.prototype.start = function (pageX, pageY) {
- if (this.isEnabled) {
- this.scrollCaches = this.buildCaches();
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.handleMove(pageX, pageY);
- }
- };
- AutoScroller.prototype.handleMove = function (pageX, pageY) {
- if (this.isEnabled) {
- var pointerScreenX = pageX - window.pageXOffset;
- var pointerScreenY = pageY - window.pageYOffset;
- var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
- var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
- if (yDelta < 0) {
- this.everMovedUp = true;
- }
- else if (yDelta > 0) {
- this.everMovedDown = true;
- }
- if (xDelta < 0) {
- this.everMovedLeft = true;
- }
- else if (xDelta > 0) {
- this.everMovedRight = true;
- }
- this.pointerScreenX = pointerScreenX;
- this.pointerScreenY = pointerScreenY;
- if (!this.isAnimating) {
- this.isAnimating = true;
- this.requestAnimation(getTime());
- }
- }
- };
- AutoScroller.prototype.stop = function () {
- if (this.isEnabled) {
- this.isAnimating = false; // will stop animation
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- this.scrollCaches = null;
- }
- };
- AutoScroller.prototype.requestAnimation = function (now) {
- this.msSinceRequest = now;
- requestAnimationFrame(this.animate);
- };
- AutoScroller.prototype.handleSide = function (edge, seconds) {
- var scrollCache = edge.scrollCache;
- var edgeThreshold = this.edgeThreshold;
- var invDistance = edgeThreshold - edge.distance;
- var velocity = // the closer to the edge, the faster we scroll
- (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
- this.maxVelocity * seconds;
- var sign = 1;
- switch (edge.name) {
- case 'left':
- sign = -1;
- // falls through
- case 'right':
- scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
- break;
- case 'top':
- sign = -1;
- // falls through
- case 'bottom':
- scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
- break;
- }
- };
- // left/top are relative to document topleft
- AutoScroller.prototype.computeBestEdge = function (left, top) {
- var edgeThreshold = this.edgeThreshold;
- var bestSide = null;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- var rect = scrollCache.clientRect;
- var leftDist = left - rect.left;
- var rightDist = rect.right - left;
- var topDist = top - rect.top;
- var bottomDist = rect.bottom - top;
- // completely within the rect?
- if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
- if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
- (!bestSide || bestSide.distance > topDist)) {
- bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
- }
- if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
- (!bestSide || bestSide.distance > bottomDist)) {
- bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
- }
- if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
- (!bestSide || bestSide.distance > leftDist)) {
- bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
- }
- if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
- (!bestSide || bestSide.distance > rightDist)) {
- bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
- }
- }
- }
- return bestSide;
- };
- AutoScroller.prototype.buildCaches = function () {
- return this.queryScrollEls().map(function (el) {
- if (el === window) {
- return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
- }
- else {
- return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
- }
- });
- };
- AutoScroller.prototype.queryScrollEls = function () {
- var els = [];
- for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
- var query = _a[_i];
- if (typeof query === 'object') {
- els.push(query);
- }
- else {
- els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
- }
- }
- return els;
- };
- return AutoScroller;
-}());
-
-/*
-Monitors dragging on an element. Has a number of high-level features:
-- minimum distance required before dragging
-- minimum wait time ("delay") before dragging
-- a mirror element that follows the pointer
-*/
-var FeaturefulElementDragging = /** @class */ (function (_super) {
- __extends(FeaturefulElementDragging, _super);
- function FeaturefulElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- // options that can be directly set by caller
- // the caller can also set the PointerDragging's options as well
- _this.delay = null;
- _this.minDistance = 0;
- _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
- _this.mirrorNeedsRevert = false;
- _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
- _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- _this.delayTimeoutId = null;
- _this.onPointerDown = function (ev) {
- if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
- _this.isInteracting = true;
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- preventSelection(document.body);
- preventContextMenu(document.body);
- // prevent links from being visited if there's an eventual drag.
- // also prevents selection in older browsers (maybe?).
- // not necessary for touch, besides, browser would complain about passiveness.
- if (!ev.isTouch) {
- ev.origEvent.preventDefault();
- }
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.pointer.shouldIgnoreMove) {
- // actions related to initiating dragstart+dragmove+dragend...
- _this.mirror.setIsVisible(false); // reset. caller must set-visible
- _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
- _this.startDelay(ev);
- if (!_this.minDistance) {
- _this.handleDistanceSurpassed(ev);
- }
- }
- }
- };
- _this.onPointerMove = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.emitter.trigger('pointermove', ev);
- if (!_this.isDistanceSurpassed) {
- var minDistance = _this.minDistance;
- var distanceSq = void 0; // current distance from the origin, squared
- var deltaX = ev.deltaX, deltaY = ev.deltaY;
- distanceSq = deltaX * deltaX + deltaY * deltaY;
- if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
- _this.handleDistanceSurpassed(ev);
- }
- }
- if (_this.isDragging) {
- // a real pointer move? (not one simulated by scrolling)
- if (ev.origEvent.type !== 'scroll') {
- _this.mirror.handleMove(ev.pageX, ev.pageY);
- _this.autoScroller.handleMove(ev.pageX, ev.pageY);
- }
- _this.emitter.trigger('dragmove', ev);
- }
- }
- };
- _this.onPointerUp = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.isInteracting = false;
- allowSelection(document.body);
- allowContextMenu(document.body);
- _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
- if (_this.isDragging) {
- _this.autoScroller.stop();
- _this.tryStopDrag(ev); // which will stop the mirror
- }
- if (_this.delayTimeoutId) {
- clearTimeout(_this.delayTimeoutId);
- _this.delayTimeoutId = null;
- }
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.onPointerDown);
- pointer.emitter.on('pointermove', _this.onPointerMove);
- pointer.emitter.on('pointerup', _this.onPointerUp);
- _this.mirror = new ElementMirror();
- _this.autoScroller = new AutoScroller();
- return _this;
- }
- FeaturefulElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- FeaturefulElementDragging.prototype.startDelay = function (ev) {
- var _this = this;
- if (typeof this.delay === 'number') {
- this.delayTimeoutId = setTimeout(function () {
- _this.delayTimeoutId = null;
- _this.handleDelayEnd(ev);
- }, this.delay); // not assignable to number!
- }
- else {
- this.handleDelayEnd(ev);
- }
- };
- FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
- this.isDelayEnded = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
- this.isDistanceSurpassed = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
- if (this.isDelayEnded && this.isDistanceSurpassed) {
- if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
- this.isDragging = true;
- this.mirrorNeedsRevert = false;
- this.autoScroller.start(ev.pageX, ev.pageY);
- this.emitter.trigger('dragstart', ev);
- if (this.touchScrollAllowed === false) {
- this.pointer.cancelTouchScroll();
- }
- }
- }
- };
- FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
- // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
- // that come from the document to fire beforehand. much more convenient this way.
- this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
- );
- };
- FeaturefulElementDragging.prototype.stopDrag = function (ev) {
- this.isDragging = false;
- this.emitter.trigger('dragend', ev);
- };
- // fill in the implementations...
- FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
- this.pointer.shouldIgnoreMove = bool;
- };
- FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
- this.mirror.setIsVisible(bool);
- };
- FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- this.mirrorNeedsRevert = bool;
- };
- FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- this.autoScroller.isEnabled = bool;
- };
- return FeaturefulElementDragging;
-}(ElementDragging));
-
-/*
-When this class is instantiated, it records the offset of an element (relative to the document topleft),
-and continues to monitor scrolling, updating the cached coordinates if it needs to.
-Does not access the DOM after instantiation, so highly performant.
-
-Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
-and an determine if a given point is inside the combined clipping rectangle.
-*/
-var OffsetTracker = /** @class */ (function () {
- function OffsetTracker(el) {
- this.origRect = computeRect(el);
- // will work fine for divs that have overflow:hidden
- this.scrollCaches = getClippingParents(el).map(function (el) {
- return new ElementScrollGeomCache(el, true); // listen=true
- });
- }
- OffsetTracker.prototype.destroy = function () {
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- };
- OffsetTracker.prototype.computeLeft = function () {
- var left = this.origRect.left;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
- }
- return left;
- };
- OffsetTracker.prototype.computeTop = function () {
- var top = this.origRect.top;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- top += scrollCache.origScrollTop - scrollCache.getScrollTop();
- }
- return top;
- };
- OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
- var point = { left: pageX, top: pageY };
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
- !pointInsideRect(point, scrollCache.clientRect)) {
- return false;
- }
- }
- return true;
- };
- return OffsetTracker;
-}());
-// certain clipping containers should never constrain interactions, like <html> and <body>
-// https://github.com/fullcalendar/fullcalendar/issues/3615
-function isIgnoredClipping(node) {
- var tagName = node.tagName;
- return tagName === 'HTML' || tagName === 'BODY';
-}
-
-/*
-Tracks movement over multiple droppable areas (aka "hits")
-that exist in one or more DateComponents.
-Relies on an existing draggable.
-
-emits:
-- pointerdown
-- dragstart
-- hitchange - fires initially, even if not over a hit
-- pointerup
-- (hitchange - again, to null, if ended over a hit)
-- dragend
-*/
-var HitDragging = /** @class */ (function () {
- function HitDragging(dragging, droppableStore) {
- var _this = this;
- // options that can be set by caller
- this.useSubjectCenter = false;
- this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
- this.initialHit = null;
- this.movingHit = null;
- this.finalHit = null; // won't ever be populated if shouldIgnoreMove
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- _this.initialHit = null;
- _this.movingHit = null;
- _this.finalHit = null;
- _this.prepareHits();
- _this.processFirstCoord(ev);
- if (_this.initialHit || !_this.requireInitial) {
- dragging.setIgnoreMove(false);
- _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
- }
- else {
- dragging.setIgnoreMove(true);
- }
- };
- this.handleDragStart = function (ev) {
- _this.emitter.trigger('dragstart', ev);
- _this.handleMove(ev, true); // force = fire even if initially null
- };
- this.handleDragMove = function (ev) {
- _this.emitter.trigger('dragmove', ev);
- _this.handleMove(ev);
- };
- this.handlePointerUp = function (ev) {
- _this.releaseHits();
- _this.emitter.trigger('pointerup', ev);
- };
- this.handleDragEnd = function (ev) {
- if (_this.movingHit) {
- _this.emitter.trigger('hitupdate', null, true, ev);
- }
- _this.finalHit = _this.movingHit;
- _this.movingHit = null;
- _this.emitter.trigger('dragend', ev);
- };
- this.droppableStore = droppableStore;
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- dragging.emitter.on('dragmove', this.handleDragMove);
- dragging.emitter.on('pointerup', this.handlePointerUp);
- dragging.emitter.on('dragend', this.handleDragEnd);
- this.dragging = dragging;
- this.emitter = new EmitterMixin();
- }
- // sets initialHit
- // sets coordAdjust
- HitDragging.prototype.processFirstCoord = function (ev) {
- var origPoint = { left: ev.pageX, top: ev.pageY };
- var adjustedPoint = origPoint;
- var subjectEl = ev.subjectEl;
- var subjectRect;
- if (subjectEl !== document) {
- subjectRect = computeRect(subjectEl);
- adjustedPoint = constrainPoint(adjustedPoint, subjectRect);
- }
- var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
- if (initialHit) {
- if (this.useSubjectCenter && subjectRect) {
- var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect);
- if (slicedSubjectRect) {
- adjustedPoint = getRectCenter(slicedSubjectRect);
- }
- }
- this.coordAdjust = diffPoints(adjustedPoint, origPoint);
- }
- else {
- this.coordAdjust = { left: 0, top: 0 };
- }
- };
- HitDragging.prototype.handleMove = function (ev, forceHandle) {
- var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
- if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
- this.movingHit = hit;
- this.emitter.trigger('hitupdate', hit, false, ev);
- }
- };
- HitDragging.prototype.prepareHits = function () {
- this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) {
- interactionSettings.component.buildPositionCaches();
- return new OffsetTracker(interactionSettings.el);
- });
- };
- HitDragging.prototype.releaseHits = function () {
- var offsetTrackers = this.offsetTrackers;
- for (var id in offsetTrackers) {
- offsetTrackers[id].destroy();
- }
- this.offsetTrackers = {};
- };
- HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
- var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
- var bestHit = null;
- for (var id in droppableStore) {
- var component = droppableStore[id].component;
- var offsetTracker = offsetTrackers[id];
- if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
- var originLeft = offsetTracker.computeLeft();
- var originTop = offsetTracker.computeTop();
- var positionLeft = offsetLeft - originLeft;
- var positionTop = offsetTop - originTop;
- var origRect = offsetTracker.origRect;
- var width = origRect.right - origRect.left;
- var height = origRect.bottom - origRect.top;
- if (
- // must be within the element's bounds
- positionLeft >= 0 && positionLeft < width &&
- positionTop >= 0 && positionTop < height) {
- var hit = component.queryHit(positionLeft, positionTop, width, height);
- if (hit &&
- (
- // make sure the hit is within activeRange, meaning it's not a deal cell
- !component.props.dateProfile || // hack for DayTile
- rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
- (!bestHit || hit.layer > bestHit.layer)) {
- // TODO: better way to re-orient rectangle
- hit.rect.left += originLeft;
- hit.rect.right += originLeft;
- hit.rect.top += originTop;
- hit.rect.bottom += originTop;
- bestHit = hit;
- }
- }
- }
- }
- return bestHit;
- };
- return HitDragging;
-}());
-function isHitsEqual(hit0, hit1) {
- if (!hit0 && !hit1) {
- return true;
- }
- if (Boolean(hit0) !== Boolean(hit1)) {
- return false;
- }
- return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
-}
-
-/*
-Monitors when the user clicks on a specific date/time of a component.
-A pointerdown+pointerup on the same "hit" constitutes a click.
-*/
-var DateClicking = /** @class */ (function (_super) {
- __extends(DateClicking, _super);
- function DateClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
- dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
- };
- // won't even fire if moving was ignored
- _this.handleDragEnd = function (ev) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var pointer = _this.dragging.pointer;
- if (!pointer.wasTouchScroll) {
- var _b = _this.hitDragging, initialHit = _b.initialHit, finalHit = _b.finalHit;
- if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
- calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, view, ev.origEvent);
- }
- }
- };
- var component = settings.component;
- // we DO want to watch pointer moves because otherwise finalHit won't get populated
- _this.dragging = new FeaturefulElementDragging(component.el);
- _this.dragging.autoScroller.isEnabled = false;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- DateClicking.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateClicking;
-}(Interaction));
-
-/*
-Tracks when the user selects a portion of time of a component,
-constituted by a drag over date cells, with a possible delay at the beginning of the drag.
-*/
-var DateSelecting = /** @class */ (function (_super) {
- __extends(DateSelecting, _super);
- function DateSelecting(settings) {
- var _this = _super.call(this, settings) || this;
- _this.dragSelection = null;
- _this.handlePointerDown = function (ev) {
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var options = component.context.options;
- var canSelect = options.selectable &&
- component.isValidDateDownEl(ev.origEvent.target);
- // don't bother to watch expensive moves if component won't do selection
- dragging.setIgnoreMove(!canSelect);
- // if touch, require user to hold down
- dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
- };
- _this.handleDragStart = function (ev) {
- _this.component.context.calendar.unselect(ev); // unselect previous selections
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- var calendar = _this.component.context.calendar;
- var dragSelection = null;
- var isInvalid = false;
- if (hit) {
- dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
- if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
- isInvalid = true;
- dragSelection = null;
- }
- }
- if (dragSelection) {
- calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
- }
- else if (!isFinal) { // only unselect if moved away while dragging
- calendar.dispatch({ type: 'UNSELECT_DATES' });
- }
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
- }
- };
- _this.handlePointerUp = function (pev) {
- if (_this.dragSelection) {
- // selection is already rendered, so just need to report selection
- _this.component.context.calendar.triggerDateSelect(_this.dragSelection, pev);
- _this.dragSelection = null;
- }
- };
- var component = settings.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.touchScrollAllowed = false;
- dragging.minDistance = options.selectMinDistance || 0;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- DateSelecting.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateSelecting;
-}(Interaction));
-function getComponentTouchDelay(component) {
- var options = component.context.options;
- var delay = options.selectLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
-}
-function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var ms = [
- dateSpan0.range.start,
- dateSpan0.range.end,
- dateSpan1.range.start,
- dateSpan1.range.end
- ];
- ms.sort(compareNumbers);
- var props = {};
- for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
- var transformer = dateSelectionTransformers_1[_i];
- var res = transformer(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- props.range = { start: ms[0], end: ms[3] };
- props.allDay = dateSpan0.allDay;
- return props;
-}
-
-var EventDragging = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.subjectSeg = null; // the seg being selected/dragged
- _this.isDragging = false;
- _this.eventRange = null;
- _this.relevantEvents = null; // the events being dragged
- _this.receivingCalendar = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var origTarget = ev.origEvent.target;
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var mirror = dragging.mirror;
- var options = component.context.options;
- var initialCalendar = component.context.calendar;
- var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);
- var eventRange = _this.eventRange = subjectSeg.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- _this.relevantEvents = getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
- dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
- dragging.delay =
- // only do a touch delay if touch and this event hasn't been selected yet
- (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
- getComponentTouchDelay$1(component) :
- null;
- mirror.parentNode = initialCalendar.el;
- mirror.revertDuration = options.dragRevertDuration;
- var isValid = component.isValidSegDownEl(origTarget) &&
- !elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
- dragging.setIgnoreMove(!isValid);
- // disable dragging for elements that are resizable (ie, selectable)
- // but are not draggable
- _this.isDragging = isValid &&
- ev.subjectEl.classList.contains('fc-draggable');
- };
- _this.handleDragStart = function (ev) {
- var context = _this.component.context;
- var initialCalendar = context.calendar;
- var eventRange = _this.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- if (ev.isTouch) {
- // need to select a different event?
- if (eventInstanceId !== _this.component.props.eventSelection) {
- initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
- }
- }
- else {
- // if now using mouse, but was previous touch interaction, clear selected event
- initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- if (_this.isDragging) {
- initialCalendar.unselect(ev); // unselect *date* selection
- initialCalendar.publiclyTrigger('eventDragStart', [
- {
- el: _this.subjectSeg.el,
- event: new EventApi(initialCalendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: context.view
- }
- ]);
- }
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- if (!_this.isDragging) {
- return;
- }
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var initialCalendar = _this.component.context.calendar;
- // states based on new hit
- var receivingCalendar = null;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.subjectSeg
- };
- if (hit) {
- var receivingComponent = hit.component;
- receivingCalendar = receivingComponent.context.calendar;
- var receivingOptions = receivingComponent.context.options;
- if (initialCalendar === receivingCalendar ||
- receivingOptions.editable && receivingOptions.droppable) {
- mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
- if (mutation) {
- mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!receivingComponent.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = createEmptyEventStore();
- }
- }
- }
- else {
- receivingCalendar = null;
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- if (initialCalendar === receivingCalendar && // TODO: write test for this
- isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.dragging.setMirrorNeedsRevert(!mutation);
- // render the mirror if no already-rendered mirror
- // TODO: wish we could somehow wait for dispatch to guarantee render
- _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
- // assign states based on new hit
- _this.receivingCalendar = receivingCalendar;
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handlePointerUp = function () {
- if (!_this.isDragging) {
- _this.cleanup(); // because handleDragEnd won't fire
- }
- };
- _this.handleDragEnd = function (ev) {
- if (_this.isDragging) {
- var context = _this.component.context;
- var initialCalendar_1 = context.calendar;
- var initialView = context.view;
- var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new EventApi(initialCalendar_1, eventDef, eventInstance);
- var relevantEvents_1 = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- var finalHit = _this.hitDragging.finalHit;
- _this.clearDrag(); // must happen after revert animation
- initialCalendar_1.publiclyTrigger('eventDragStop', [
- {
- el: _this.subjectSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: initialView
- }
- ]);
- if (validMutation) {
- // dropped within same calendar
- if (receivingCalendar === initialCalendar_1) {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- var transformed = {};
- for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
- var transformer = _b[_i];
- __assign(transformed, transformer(validMutation, initialCalendar_1));
- }
- var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new EventApi(// the data AFTER the mutation
- initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents_1
- });
- }, jsEvent: ev.origEvent, view: initialView });
- initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
- // dropped in different calendar
- }
- else if (receivingCalendar) {
- initialCalendar_1.publiclyTrigger('eventLeave', [
- {
- draggedEl: ev.subjectEl,
- event: eventApi,
- view: initialView
- }
- ]);
- initialCalendar_1.dispatch({
- type: 'REMOVE_EVENT_INSTANCES',
- instances: _this.mutatedRelevantEvents.instances
- });
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: _this.mutatedRelevantEvents
- });
- if (ev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: eventInstance.instanceId
- });
- }
- var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
- });
- receivingCalendar.publiclyTrigger('drop', [dropArg]);
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: ev.subjectEl,
- event: new EventApi(// the data AFTER the mutation
- receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
- view: finalHit.component // should this be finalHit.component.view? See #4644
- }
- ]);
- }
- }
- else {
- initialCalendar_1.publiclyTrigger('_noEventDrop');
- }
- }
- _this.cleanup();
- };
- var component = _this.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = EventDragging.SELECTOR;
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore);
- hitDragging.useSubjectCenter = settings.useEventCenter;
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- // render a drag state on the next receivingCalendar
- EventDragging.prototype.displayDrag = function (nextCalendar, state) {
- var initialCalendar = this.component.context.calendar;
- var prevCalendar = this.receivingCalendar;
- // does the previous calendar need to be cleared?
- if (prevCalendar && prevCalendar !== nextCalendar) {
- // does the initial calendar need to be cleared?
- // if so, don't clear all the way. we still need to to hide the affectedEvents
- if (prevCalendar === initialCalendar) {
- prevCalendar.dispatch({
- type: 'SET_EVENT_DRAG',
- state: {
- affectedEvents: state.affectedEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: state.origSeg
- }
- });
- // completely clear the old calendar if it wasn't the initial
- }
- else {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- EventDragging.prototype.clearDrag = function () {
- var initialCalendar = this.component.context.calendar;
- var receivingCalendar = this.receivingCalendar;
- if (receivingCalendar) {
- receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- // the initial calendar might have an dummy drag state from displayDrag
- if (initialCalendar !== receivingCalendar) {
- initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- EventDragging.prototype.cleanup = function () {
- this.subjectSeg = null;
- this.isDragging = false;
- this.eventRange = null;
- this.relevantEvents = null;
- this.receivingCalendar = null;
- this.validMutation = null;
- this.mutatedRelevantEvents = null;
- };
- EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
- return EventDragging;
-}(Interaction));
-function computeEventMutation(hit0, hit1, massagers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var date0 = dateSpan0.range.start;
- var date1 = dateSpan1.range.start;
- var standardProps = {};
- if (dateSpan0.allDay !== dateSpan1.allDay) {
- standardProps.allDay = dateSpan1.allDay;
- standardProps.hasEnd = hit1.component.context.options.allDayMaintainDuration;
- if (dateSpan1.allDay) {
- // means date1 is already start-of-day,
- // but date0 needs to be converted
- date0 = startOfDay(date0);
- }
- }
- var delta = diffDates(date0, date1, hit0.component.context.dateEnv, hit0.component === hit1.component ?
- hit0.component.largeUnit :
- null);
- if (delta.milliseconds) { // has hours/minutes/seconds
- standardProps.allDay = false;
- }
- var mutation = {
- datesDelta: delta,
- standardProps: standardProps
- };
- for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
- var massager = massagers_1[_i];
- massager(mutation, hit0, hit1);
- }
- return mutation;
-}
-function getComponentTouchDelay$1(component) {
- var options = component.context.options;
- var delay = options.eventLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
-}
-
-var EventDragging$1 = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
- _this.eventRange = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var component = _this.component;
- var seg = _this.querySeg(ev);
- var eventRange = _this.eventRange = seg.eventRange;
- _this.dragging.minDistance = component.context.options.eventDragMinDistance;
- // if touch, need to be working with a selected event
- _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
- (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
- };
- _this.handleDragStart = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventRange = _this.eventRange;
- _this.relevantEvents = getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
- _this.draggingSeg = _this.querySeg(ev);
- calendar.unselect();
- calendar.publiclyTrigger('eventResizeStart', [
- {
- el: _this.draggingSeg.el,
- event: new EventApi(calendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- };
- _this.handleHitUpdate = function (hit, isFinal, ev) {
- var calendar = _this.component.context.calendar;
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var eventInstance = _this.eventRange.instance;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.draggingSeg
- };
- if (hit) {
- mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
- }
- if (mutation) {
- mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!_this.component.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = null;
- }
- }
- if (mutatedRelevantEvents) {
- calendar.dispatch({
- type: 'SET_EVENT_RESIZE',
- state: interaction
- });
- }
- else {
- calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
- }
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- if (mutation && isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handleDragEnd = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new EventApi(calendar, eventDef, eventInstance);
- var relevantEvents = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- calendar.publiclyTrigger('eventResizeStop', [
- {
- el: _this.draggingSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- if (_this.validMutation) {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- calendar.publiclyTrigger('eventResize', [
- {
- el: _this.draggingSeg.el,
- startDelta: _this.validMutation.startDelta || createDuration(0),
- endDelta: _this.validMutation.endDelta || createDuration(0),
- prevEvent: eventApi,
- event: new EventApi(// the data AFTER the mutation
- calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
- revert: function () {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents
- });
- },
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- }
- else {
- calendar.publiclyTrigger('_noEventResize');
- }
- // reset all internal state
- _this.draggingSeg = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- // okay to keep eventInstance around. useful to set it in handlePointerDown
- };
- var component = settings.component;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = '.fc-resizer';
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = component.context.options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- EventDragging.prototype.querySeg = function (ev) {
- return getElSeg(elementClosest(ev.subjectEl, this.component.fgSegSelector));
- };
- return EventDragging;
-}(Interaction));
-function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
- var dateEnv = hit0.component.context.dateEnv;
- var date0 = hit0.dateSpan.range.start;
- var date1 = hit1.dateSpan.range.start;
- var delta = diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
- var props = {};
- for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
- var transform = transforms_1[_i];
- var res = transform(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- if (isFromStart) {
- if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
- props.startDelta = delta;
- return props;
- }
- }
- else {
- if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
- props.endDelta = delta;
- return props;
- }
- }
- return null;
-}
-
-var UnselectAuto = /** @class */ (function () {
- function UnselectAuto(calendar) {
- var _this = this;
- this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
- this.onSelect = function (selectInfo) {
- if (selectInfo.jsEvent) {
- _this.isRecentPointerDateSelect = true;
- }
- };
- this.onDocumentPointerUp = function (pev) {
- var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
- var state = calendar.state;
- // touch-scrolling should never unfocus any type of selection
- if (!documentPointer.wasTouchScroll) {
- if (state.dateSelection && // an existing date selection?
- !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
- ) {
- var unselectAuto = calendar.viewOpt('unselectAuto');
- var unselectCancel = calendar.viewOpt('unselectCancel');
- if (unselectAuto && (!unselectAuto || !elementClosest(documentPointer.downEl, unselectCancel))) {
- calendar.unselect(pev);
- }
- }
- if (state.eventSelection && // an existing event selected?
- !elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
- ) {
- calendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- }
- _this.isRecentPointerDateSelect = false;
- };
- this.calendar = calendar;
- var documentPointer = this.documentPointer = new PointerDragging(document);
- documentPointer.shouldIgnoreMove = true;
- documentPointer.shouldWatchScroll = false;
- documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
- /*
- TODO: better way to know about whether there was a selection with the pointer
- */
- calendar.on('select', this.onSelect);
- }
- UnselectAuto.prototype.destroy = function () {
- this.calendar.off('select', this.onSelect);
- this.documentPointer.destroy();
- };
- return UnselectAuto;
-}());
-
-/*
-Given an already instantiated draggable object for one-or-more elements,
-Interprets any dragging as an attempt to drag an events that lives outside
-of a calendar onto a calendar.
-*/
-var ExternalElementDragging = /** @class */ (function () {
- function ExternalElementDragging(dragging, suppliedDragMeta) {
- var _this = this;
- this.receivingCalendar = null;
- this.droppableEvent = null; // will exist for all drags, even if create:false
- this.suppliedDragMeta = null;
- this.dragMeta = null;
- this.handleDragStart = function (ev) {
- _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
- };
- this.handleHitUpdate = function (hit, isFinal, ev) {
- var dragging = _this.hitDragging.dragging;
- var receivingCalendar = null;
- var droppableEvent = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: createEmptyEventStore(),
- mutatedEvents: createEmptyEventStore(),
- isEvent: _this.dragMeta.create,
- origSeg: null
- };
- if (hit) {
- receivingCalendar = hit.component.context.calendar;
- if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
- droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
- interaction.mutatedEvents = eventTupleToStore(droppableEvent);
- isInvalid = !isInteractionValid(interaction, receivingCalendar);
- if (isInvalid) {
- interaction.mutatedEvents = createEmptyEventStore();
- droppableEvent = null;
- }
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
- // TODO: wish we could somehow wait for dispatch to guarantee render
- dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
- if (!isInvalid) {
- enableCursor();
- }
- else {
- disableCursor();
- }
- if (!isFinal) {
- dragging.setMirrorNeedsRevert(!droppableEvent);
- _this.receivingCalendar = receivingCalendar;
- _this.droppableEvent = droppableEvent;
- }
- };
- this.handleDragEnd = function (pev) {
- var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
- _this.clearDrag();
- if (receivingCalendar && droppableEvent) {
- var finalHit = _this.hitDragging.finalHit;
- var finalView = finalHit.component.context.view;
- var dragMeta = _this.dragMeta;
- var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
- receivingCalendar.publiclyTrigger('drop', [arg]);
- if (dragMeta.create) {
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: eventTupleToStore(droppableEvent)
- });
- if (pev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: droppableEvent.instance.instanceId
- });
- }
- // signal that an external event landed
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: pev.subjectEl,
- event: new EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
- view: finalView
- }
- ]);
- }
- }
- _this.receivingCalendar = null;
- _this.droppableEvent = null;
- };
- var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore);
- hitDragging.requireInitial = false; // will start outside of a component
- hitDragging.emitter.on('dragstart', this.handleDragStart);
- hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
- hitDragging.emitter.on('dragend', this.handleDragEnd);
- this.suppliedDragMeta = suppliedDragMeta;
- }
- ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
- if (typeof this.suppliedDragMeta === 'object') {
- return parseDragMeta(this.suppliedDragMeta);
- }
- else if (typeof this.suppliedDragMeta === 'function') {
- return parseDragMeta(this.suppliedDragMeta(subjectEl));
- }
- else {
- return getDragMetaFromEl(subjectEl);
- }
- };
- ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
- var prevCalendar = this.receivingCalendar;
- if (prevCalendar && prevCalendar !== nextCalendar) {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- ExternalElementDragging.prototype.clearDrag = function () {
- if (this.receivingCalendar) {
- this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
- var dropAccept = receivingCalendar.opt('dropAccept');
- if (typeof dropAccept === 'function') {
- return dropAccept(el);
- }
- else if (typeof dropAccept === 'string' && dropAccept) {
- return Boolean(elementMatches(el, dropAccept));
- }
- return true;
- };
- return ExternalElementDragging;
-}());
-// Utils for computing event store from the DragMeta
-// ----------------------------------------------------------------------------------------------------
-function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
- var defProps = __assign({}, dragMeta.leftoverProps);
- for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(defProps, transform(dateSpan, dragMeta));
- }
- var def = parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
- calendar);
- var start = dateSpan.range.start;
- // only rely on time info if drop zone is all-day,
- // otherwise, we already know the time
- if (dateSpan.allDay && dragMeta.startTime) {
- start = calendar.dateEnv.add(start, dragMeta.startTime);
- }
- var end = dragMeta.duration ?
- calendar.dateEnv.add(start, dragMeta.duration) :
- calendar.getDefaultEventEnd(dateSpan.allDay, start);
- var instance = createEventInstance(def.defId, { start: start, end: end });
- return { def: def, instance: instance };
-}
-// Utils for extracting data from element
-// ----------------------------------------------------------------------------------------------------
-function getDragMetaFromEl(el) {
- var str = getEmbeddedElData(el, 'event');
- var obj = str ?
- JSON.parse(str) :
- { create: false }; // if no embedded data, assume no event creation
- return parseDragMeta(obj);
-}
-config.dataAttrPrefix = '';
-function getEmbeddedElData(el, name) {
- var prefix = config.dataAttrPrefix;
- var prefixedName = (prefix ? prefix + '-' : '') + name;
- return el.getAttribute('data-' + prefixedName) || '';
-}
-
-/*
-Makes an element (that is *external* to any calendar) draggable.
-Can pass in data that determines how an event will be created when dropped onto a calendar.
-Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
-*/
-var ExternalDraggable = /** @class */ (function () {
- function ExternalDraggable(el, settings) {
- var _this = this;
- if (settings === void 0) { settings = {}; }
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
- dragging.minDistance =
- minDistance != null ?
- minDistance :
- (ev.isTouch ? 0 : globalDefaults.eventDragMinDistance);
- dragging.delay =
- ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
- (longPressDelay != null ? longPressDelay : globalDefaults.longPressDelay) :
- 0;
- };
- this.handleDragStart = function (ev) {
- if (ev.isTouch &&
- _this.dragging.delay &&
- ev.subjectEl.classList.contains('fc-event')) {
- _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
- }
- };
- this.settings = settings;
- var dragging = this.dragging = new FeaturefulElementDragging(el);
- dragging.touchScrollAllowed = false;
- if (settings.itemSelector != null) {
- dragging.pointer.selector = settings.itemSelector;
- }
- if (settings.appendTo != null) {
- dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
- }
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ExternalDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ExternalDraggable;
-}());
-
-/*
-Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
-The third-party system is responsible for drawing the visuals effects of the drag.
-This class simply monitors for pointer movements and fires events.
-It also has the ability to hide the moving element (the "mirror") during the drag.
-*/
-var InferredElementDragging = /** @class */ (function (_super) {
- __extends(InferredElementDragging, _super);
- function InferredElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- _this.shouldIgnoreMove = false;
- _this.mirrorSelector = '';
- _this.currentMirrorEl = null;
- _this.handlePointerDown = function (ev) {
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragstart right away. does not support delay or min-distance
- _this.emitter.trigger('dragstart', ev);
- }
- };
- _this.handlePointerMove = function (ev) {
- if (!_this.shouldIgnoreMove) {
- _this.emitter.trigger('dragmove', ev);
- }
- };
- _this.handlePointerUp = function (ev) {
- _this.emitter.trigger('pointerup', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragend right away. does not support a revert animation
- _this.emitter.trigger('dragend', ev);
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.handlePointerDown);
- pointer.emitter.on('pointermove', _this.handlePointerMove);
- pointer.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- InferredElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- InferredElementDragging.prototype.setIgnoreMove = function (bool) {
- this.shouldIgnoreMove = bool;
- };
- InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
- if (bool) {
- // restore a previously hidden element.
- // use the reference in case the selector class has already been removed.
- if (this.currentMirrorEl) {
- this.currentMirrorEl.style.visibility = '';
- this.currentMirrorEl = null;
- }
- }
- else {
- var mirrorEl = this.mirrorSelector ?
- document.querySelector(this.mirrorSelector) :
- null;
- if (mirrorEl) {
- this.currentMirrorEl = mirrorEl;
- mirrorEl.style.visibility = 'hidden';
- }
- }
- };
- return InferredElementDragging;
-}(ElementDragging));
-
-/*
-Bridges third-party drag-n-drop systems with FullCalendar.
-Must be instantiated and destroyed by caller.
-*/
-var ThirdPartyDraggable = /** @class */ (function () {
- function ThirdPartyDraggable(containerOrSettings, settings) {
- var containerEl = document;
- if (
- // wish we could just test instanceof EventTarget, but doesn't work in IE11
- containerOrSettings === document ||
- containerOrSettings instanceof Element) {
- containerEl = containerOrSettings;
- settings = settings || {};
- }
- else {
- settings = (containerOrSettings || {});
- }
- var dragging = this.dragging = new InferredElementDragging(containerEl);
- if (typeof settings.itemSelector === 'string') {
- dragging.pointer.selector = settings.itemSelector;
- }
- else if (containerEl === document) {
- dragging.pointer.selector = '[data-event]';
- }
- if (typeof settings.mirrorSelector === 'string') {
- dragging.mirrorSelector = settings.mirrorSelector;
- }
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ThirdPartyDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ThirdPartyDraggable;
-}());
-
-var main = createPlugin({
- componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
- calendarInteractions: [UnselectAuto],
- elementDraggingImpl: FeaturefulElementDragging
-});
-
-export default main;
-export { ExternalDraggable as Draggable, FeaturefulElementDragging, PointerDragging, ThirdPartyDraggable };
diff --git a/library/fullcalendar/packages/interaction/main.js b/library/fullcalendar/packages/interaction/main.js
deleted file mode 100644
index 4420650fb..000000000
--- a/library/fullcalendar/packages/interaction/main.js
+++ /dev/null
@@ -1,2152 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarInteraction = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- core.config.touchMouseIgnoreWait = 500;
- var ignoreMouseDepth = 0;
- var listenerCnt = 0;
- var isWindowTouchMoveCancelled = false;
- /*
- Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
- Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
- Also, tracks if there was touch-scrolling.
- Also, can prevent touch-scrolling from happening.
- Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
- emits:
- - pointerdown
- - pointermove
- - pointerup
- */
- var PointerDragging = /** @class */ (function () {
- function PointerDragging(containerEl) {
- var _this = this;
- this.subjectEl = null;
- this.downEl = null;
- // options that can be directly assigned by caller
- this.selector = ''; // will cause subjectEl in all emitted events to be this element
- this.handleSelector = '';
- this.shouldIgnoreMove = false;
- this.shouldWatchScroll = true; // for simulating pointermove on scroll
- // internal states
- this.isDragging = false;
- this.isTouchDragging = false;
- this.wasTouchScroll = false;
- // Mouse
- // ----------------------------------------------------------------------------------------------------
- this.handleMouseDown = function (ev) {
- if (!_this.shouldIgnoreMouse() &&
- isPrimaryMouseButton(ev) &&
- _this.tryStart(ev)) {
- var pev = _this.createEventFromMouse(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- if (!_this.shouldIgnoreMove) {
- document.addEventListener('mousemove', _this.handleMouseMove);
- }
- document.addEventListener('mouseup', _this.handleMouseUp);
- }
- };
- this.handleMouseMove = function (ev) {
- var pev = _this.createEventFromMouse(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleMouseUp = function (ev) {
- document.removeEventListener('mousemove', _this.handleMouseMove);
- document.removeEventListener('mouseup', _this.handleMouseUp);
- _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- };
- // Touch
- // ----------------------------------------------------------------------------------------------------
- this.handleTouchStart = function (ev) {
- if (_this.tryStart(ev)) {
- _this.isTouchDragging = true;
- var pev = _this.createEventFromTouch(ev, true);
- _this.emitter.trigger('pointerdown', pev);
- _this.initScrollWatch(pev);
- // unlike mouse, need to attach to target, not document
- // https://stackoverflow.com/a/45760014
- var target = ev.target;
- if (!_this.shouldIgnoreMove) {
- target.addEventListener('touchmove', _this.handleTouchMove);
- }
- target.addEventListener('touchend', _this.handleTouchEnd);
- target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
- // attach a handler to get called when ANY scroll action happens on the page.
- // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
- // http://stackoverflow.com/a/32954565/96342
- window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
- );
- }
- };
- this.handleTouchMove = function (ev) {
- var pev = _this.createEventFromTouch(ev);
- _this.recordCoords(pev);
- _this.emitter.trigger('pointermove', pev);
- };
- this.handleTouchEnd = function (ev) {
- if (_this.isDragging) { // done to guard against touchend followed by touchcancel
- var target = ev.target;
- target.removeEventListener('touchmove', _this.handleTouchMove);
- target.removeEventListener('touchend', _this.handleTouchEnd);
- target.removeEventListener('touchcancel', _this.handleTouchEnd);
- window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
- _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
- _this.cleanup(); // call last so that pointerup has access to props
- _this.isTouchDragging = false;
- startIgnoringMouse();
- }
- };
- this.handleTouchScroll = function () {
- _this.wasTouchScroll = true;
- };
- this.handleScroll = function (ev) {
- if (!_this.shouldIgnoreMove) {
- var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
- var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
- _this.emitter.trigger('pointermove', {
- origEvent: ev,
- isTouch: _this.isTouchDragging,
- subjectEl: _this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: pageX - _this.origPageX,
- deltaY: pageY - _this.origPageY
- });
- }
- };
- this.containerEl = containerEl;
- this.emitter = new core.EmitterMixin();
- containerEl.addEventListener('mousedown', this.handleMouseDown);
- containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerCreated();
- }
- PointerDragging.prototype.destroy = function () {
- this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
- this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
- listenerDestroyed();
- };
- PointerDragging.prototype.tryStart = function (ev) {
- var subjectEl = this.querySubjectEl(ev);
- var downEl = ev.target;
- if (subjectEl &&
- (!this.handleSelector || core.elementClosest(downEl, this.handleSelector))) {
- this.subjectEl = subjectEl;
- this.downEl = downEl;
- this.isDragging = true; // do this first so cancelTouchScroll will work
- this.wasTouchScroll = false;
- return true;
- }
- return false;
- };
- PointerDragging.prototype.cleanup = function () {
- isWindowTouchMoveCancelled = false;
- this.isDragging = false;
- this.subjectEl = null;
- this.downEl = null;
- // keep wasTouchScroll around for later access
- this.destroyScrollWatch();
- };
- PointerDragging.prototype.querySubjectEl = function (ev) {
- if (this.selector) {
- return core.elementClosest(ev.target, this.selector);
- }
- else {
- return this.containerEl;
- }
- };
- PointerDragging.prototype.shouldIgnoreMouse = function () {
- return ignoreMouseDepth || this.isTouchDragging;
- };
- // can be called by user of this class, to cancel touch-based scrolling for the current drag
- PointerDragging.prototype.cancelTouchScroll = function () {
- if (this.isDragging) {
- isWindowTouchMoveCancelled = true;
- }
- };
- // Scrolling that simulates pointermoves
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.initScrollWatch = function (ev) {
- if (this.shouldWatchScroll) {
- this.recordCoords(ev);
- window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
- }
- };
- PointerDragging.prototype.recordCoords = function (ev) {
- if (this.shouldWatchScroll) {
- this.prevPageX = ev.pageX;
- this.prevPageY = ev.pageY;
- this.prevScrollX = window.pageXOffset;
- this.prevScrollY = window.pageYOffset;
- }
- };
- PointerDragging.prototype.destroyScrollWatch = function () {
- if (this.shouldWatchScroll) {
- window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
- }
- };
- // Event Normalization
- // ----------------------------------------------------------------------------------------------------
- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
- var deltaX = 0;
- var deltaY = 0;
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = ev.pageX;
- this.origPageY = ev.pageY;
- }
- else {
- deltaX = ev.pageX - this.origPageX;
- deltaY = ev.pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: false,
- subjectEl: this.subjectEl,
- pageX: ev.pageX,
- pageY: ev.pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
- var touches = ev.touches;
- var pageX;
- var pageY;
- var deltaX = 0;
- var deltaY = 0;
- // if touch coords available, prefer,
- // because FF would give bad ev.pageX ev.pageY
- if (touches && touches.length) {
- pageX = touches[0].pageX;
- pageY = touches[0].pageY;
- }
- else {
- pageX = ev.pageX;
- pageY = ev.pageY;
- }
- // TODO: repeat code
- if (isFirst) {
- this.origPageX = pageX;
- this.origPageY = pageY;
- }
- else {
- deltaX = pageX - this.origPageX;
- deltaY = pageY - this.origPageY;
- }
- return {
- origEvent: ev,
- isTouch: true,
- subjectEl: this.subjectEl,
- pageX: pageX,
- pageY: pageY,
- deltaX: deltaX,
- deltaY: deltaY
- };
- };
- return PointerDragging;
- }());
- // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
- function isPrimaryMouseButton(ev) {
- return ev.button === 0 && !ev.ctrlKey;
- }
- // Ignoring fake mouse events generated by touch
- // ----------------------------------------------------------------------------------------------------
- function startIgnoringMouse() {
- ignoreMouseDepth++;
- setTimeout(function () {
- ignoreMouseDepth--;
- }, core.config.touchMouseIgnoreWait);
- }
- // We want to attach touchmove as early as possible for Safari
- // ----------------------------------------------------------------------------------------------------
- function listenerCreated() {
- if (!(listenerCnt++)) {
- window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
- }
- function listenerDestroyed() {
- if (!(--listenerCnt)) {
- window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
- }
- }
- function onWindowTouchMove(ev) {
- if (isWindowTouchMoveCancelled) {
- ev.preventDefault();
- }
- }
-
- /*
- An effect in which an element follows the movement of a pointer across the screen.
- The moving element is a clone of some other element.
- Must call start + handleMove + stop.
- */
- var ElementMirror = /** @class */ (function () {
- function ElementMirror() {
- this.isVisible = false; // must be explicitly enabled
- this.sourceEl = null;
- this.mirrorEl = null;
- this.sourceElRect = null; // screen coords relative to viewport
- // options that can be set directly by caller
- this.parentNode = document.body;
- this.zIndex = 9999;
- this.revertDuration = 0;
- }
- ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
- this.sourceEl = sourceEl;
- this.sourceElRect = this.sourceEl.getBoundingClientRect();
- this.origScreenX = pageX - window.pageXOffset;
- this.origScreenY = pageY - window.pageYOffset;
- this.deltaX = 0;
- this.deltaY = 0;
- this.updateElPosition();
- };
- ElementMirror.prototype.handleMove = function (pageX, pageY) {
- this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
- this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
- this.updateElPosition();
- };
- // can be called before start
- ElementMirror.prototype.setIsVisible = function (bool) {
- if (bool) {
- if (!this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = '';
- }
- this.isVisible = bool; // needs to happen before updateElPosition
- this.updateElPosition(); // because was not updating the position while invisible
- }
- }
- else {
- if (this.isVisible) {
- if (this.mirrorEl) {
- this.mirrorEl.style.display = 'none';
- }
- this.isVisible = bool;
- }
- }
- };
- // always async
- ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
- var _this = this;
- var done = function () {
- _this.cleanup();
- callback();
- };
- if (needsRevertAnimation &&
- this.mirrorEl &&
- this.isVisible &&
- this.revertDuration && // if 0, transition won't work
- (this.deltaX || this.deltaY) // if same coords, transition won't work
- ) {
- this.doRevertAnimation(done, this.revertDuration);
- }
- else {
- setTimeout(done, 0);
- }
- };
- ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
- var mirrorEl = this.mirrorEl;
- var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
- mirrorEl.style.transition =
- 'top ' + revertDuration + 'ms,' +
- 'left ' + revertDuration + 'ms';
- core.applyStyle(mirrorEl, {
- left: finalSourceElRect.left,
- top: finalSourceElRect.top
- });
- core.whenTransitionDone(mirrorEl, function () {
- mirrorEl.style.transition = '';
- callback();
- });
- };
- ElementMirror.prototype.cleanup = function () {
- if (this.mirrorEl) {
- core.removeElement(this.mirrorEl);
- this.mirrorEl = null;
- }
- this.sourceEl = null;
- };
- ElementMirror.prototype.updateElPosition = function () {
- if (this.sourceEl && this.isVisible) {
- core.applyStyle(this.getMirrorEl(), {
- left: this.sourceElRect.left + this.deltaX,
- top: this.sourceElRect.top + this.deltaY
- });
- }
- };
- ElementMirror.prototype.getMirrorEl = function () {
- var sourceElRect = this.sourceElRect;
- var mirrorEl = this.mirrorEl;
- if (!mirrorEl) {
- mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
- // we don't want long taps or any mouse interaction causing selection/menus.
- // would use preventSelection(), but that prevents selectstart, causing problems.
- mirrorEl.classList.add('fc-unselectable');
- mirrorEl.classList.add('fc-dragging');
- core.applyStyle(mirrorEl, {
- position: 'fixed',
- zIndex: this.zIndex,
- visibility: '',
- boxSizing: 'border-box',
- width: sourceElRect.right - sourceElRect.left,
- height: sourceElRect.bottom - sourceElRect.top,
- right: 'auto',
- bottom: 'auto',
- margin: 0
- });
- this.parentNode.appendChild(mirrorEl);
- }
- return mirrorEl;
- };
- return ElementMirror;
- }());
-
- /*
- Is a cache for a given element's scroll information (all the info that ScrollController stores)
- in addition the "client rectangle" of the element.. the area within the scrollbars.
-
- The cache can be in one of two modes:
- - doesListening:false - ignores when the container is scrolled by someone else
- - doesListening:true - watch for scrolling and update the cache
- */
- var ScrollGeomCache = /** @class */ (function (_super) {
- __extends(ScrollGeomCache, _super);
- function ScrollGeomCache(scrollController, doesListening) {
- var _this = _super.call(this) || this;
- _this.handleScroll = function () {
- _this.scrollTop = _this.scrollController.getScrollTop();
- _this.scrollLeft = _this.scrollController.getScrollLeft();
- _this.handleScrollChange();
- };
- _this.scrollController = scrollController;
- _this.doesListening = doesListening;
- _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
- _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
- _this.scrollWidth = scrollController.getScrollWidth();
- _this.scrollHeight = scrollController.getScrollHeight();
- _this.clientWidth = scrollController.getClientWidth();
- _this.clientHeight = scrollController.getClientHeight();
- _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
- if (_this.doesListening) {
- _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
- }
- return _this;
- }
- ScrollGeomCache.prototype.destroy = function () {
- if (this.doesListening) {
- this.getEventTarget().removeEventListener('scroll', this.handleScroll);
- }
- };
- ScrollGeomCache.prototype.getScrollTop = function () {
- return this.scrollTop;
- };
- ScrollGeomCache.prototype.getScrollLeft = function () {
- return this.scrollLeft;
- };
- ScrollGeomCache.prototype.setScrollTop = function (top) {
- this.scrollController.setScrollTop(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.setScrollLeft = function (top) {
- this.scrollController.setScrollLeft(top);
- if (!this.doesListening) {
- // we are not relying on the element to normalize out-of-bounds scroll values
- // so we need to sanitize ourselves
- this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
- this.handleScrollChange();
- }
- };
- ScrollGeomCache.prototype.getClientWidth = function () {
- return this.clientWidth;
- };
- ScrollGeomCache.prototype.getClientHeight = function () {
- return this.clientHeight;
- };
- ScrollGeomCache.prototype.getScrollWidth = function () {
- return this.scrollWidth;
- };
- ScrollGeomCache.prototype.getScrollHeight = function () {
- return this.scrollHeight;
- };
- ScrollGeomCache.prototype.handleScrollChange = function () {
- };
- return ScrollGeomCache;
- }(core.ScrollController));
- var ElementScrollGeomCache = /** @class */ (function (_super) {
- __extends(ElementScrollGeomCache, _super);
- function ElementScrollGeomCache(el, doesListening) {
- return _super.call(this, new core.ElementScrollController(el), doesListening) || this;
- }
- ElementScrollGeomCache.prototype.getEventTarget = function () {
- return this.scrollController.el;
- };
- ElementScrollGeomCache.prototype.computeClientRect = function () {
- return core.computeInnerRect(this.scrollController.el);
- };
- return ElementScrollGeomCache;
- }(ScrollGeomCache));
- var WindowScrollGeomCache = /** @class */ (function (_super) {
- __extends(WindowScrollGeomCache, _super);
- function WindowScrollGeomCache(doesListening) {
- return _super.call(this, new core.WindowScrollController(), doesListening) || this;
- }
- WindowScrollGeomCache.prototype.getEventTarget = function () {
- return window;
- };
- WindowScrollGeomCache.prototype.computeClientRect = function () {
- return {
- left: this.scrollLeft,
- right: this.scrollLeft + this.clientWidth,
- top: this.scrollTop,
- bottom: this.scrollTop + this.clientHeight
- };
- };
- // the window is the only scroll object that changes it's rectangle relative
- // to the document's topleft as it scrolls
- WindowScrollGeomCache.prototype.handleScrollChange = function () {
- this.clientRect = this.computeClientRect();
- };
- return WindowScrollGeomCache;
- }(ScrollGeomCache));
-
- // If available we are using native "performance" API instead of "Date"
- // Read more about it on MDN:
- // https://developer.mozilla.org/en-US/docs/Web/API/Performance
- var getTime = typeof performance === 'function' ? performance.now : Date.now;
- /*
- For a pointer interaction, automatically scrolls certain scroll containers when the pointer
- approaches the edge.
-
- The caller must call start + handleMove + stop.
- */
- var AutoScroller = /** @class */ (function () {
- function AutoScroller() {
- var _this = this;
- // options that can be set by caller
- this.isEnabled = true;
- this.scrollQuery = [window, '.fc-scroller'];
- this.edgeThreshold = 50; // pixels
- this.maxVelocity = 300; // pixels per second
- // internal state
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.isAnimating = false;
- this.scrollCaches = null;
- // protect against the initial pointerdown being too close to an edge and starting the scroll
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.animate = function () {
- if (_this.isAnimating) { // wasn't cancelled between animation calls
- var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
- if (edge) {
- var now = getTime();
- _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
- _this.requestAnimation(now);
- }
- else {
- _this.isAnimating = false; // will stop animation
- }
- }
- };
- }
- AutoScroller.prototype.start = function (pageX, pageY) {
- if (this.isEnabled) {
- this.scrollCaches = this.buildCaches();
- this.pointerScreenX = null;
- this.pointerScreenY = null;
- this.everMovedUp = false;
- this.everMovedDown = false;
- this.everMovedLeft = false;
- this.everMovedRight = false;
- this.handleMove(pageX, pageY);
- }
- };
- AutoScroller.prototype.handleMove = function (pageX, pageY) {
- if (this.isEnabled) {
- var pointerScreenX = pageX - window.pageXOffset;
- var pointerScreenY = pageY - window.pageYOffset;
- var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
- var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
- if (yDelta < 0) {
- this.everMovedUp = true;
- }
- else if (yDelta > 0) {
- this.everMovedDown = true;
- }
- if (xDelta < 0) {
- this.everMovedLeft = true;
- }
- else if (xDelta > 0) {
- this.everMovedRight = true;
- }
- this.pointerScreenX = pointerScreenX;
- this.pointerScreenY = pointerScreenY;
- if (!this.isAnimating) {
- this.isAnimating = true;
- this.requestAnimation(getTime());
- }
- }
- };
- AutoScroller.prototype.stop = function () {
- if (this.isEnabled) {
- this.isAnimating = false; // will stop animation
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- this.scrollCaches = null;
- }
- };
- AutoScroller.prototype.requestAnimation = function (now) {
- this.msSinceRequest = now;
- requestAnimationFrame(this.animate);
- };
- AutoScroller.prototype.handleSide = function (edge, seconds) {
- var scrollCache = edge.scrollCache;
- var edgeThreshold = this.edgeThreshold;
- var invDistance = edgeThreshold - edge.distance;
- var velocity = // the closer to the edge, the faster we scroll
- (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
- this.maxVelocity * seconds;
- var sign = 1;
- switch (edge.name) {
- case 'left':
- sign = -1;
- // falls through
- case 'right':
- scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
- break;
- case 'top':
- sign = -1;
- // falls through
- case 'bottom':
- scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
- break;
- }
- };
- // left/top are relative to document topleft
- AutoScroller.prototype.computeBestEdge = function (left, top) {
- var edgeThreshold = this.edgeThreshold;
- var bestSide = null;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- var rect = scrollCache.clientRect;
- var leftDist = left - rect.left;
- var rightDist = rect.right - left;
- var topDist = top - rect.top;
- var bottomDist = rect.bottom - top;
- // completely within the rect?
- if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
- if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
- (!bestSide || bestSide.distance > topDist)) {
- bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
- }
- if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
- (!bestSide || bestSide.distance > bottomDist)) {
- bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
- }
- if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
- (!bestSide || bestSide.distance > leftDist)) {
- bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
- }
- if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
- (!bestSide || bestSide.distance > rightDist)) {
- bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
- }
- }
- }
- return bestSide;
- };
- AutoScroller.prototype.buildCaches = function () {
- return this.queryScrollEls().map(function (el) {
- if (el === window) {
- return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
- }
- else {
- return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
- }
- });
- };
- AutoScroller.prototype.queryScrollEls = function () {
- var els = [];
- for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
- var query = _a[_i];
- if (typeof query === 'object') {
- els.push(query);
- }
- else {
- els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
- }
- }
- return els;
- };
- return AutoScroller;
- }());
-
- /*
- Monitors dragging on an element. Has a number of high-level features:
- - minimum distance required before dragging
- - minimum wait time ("delay") before dragging
- - a mirror element that follows the pointer
- */
- var FeaturefulElementDragging = /** @class */ (function (_super) {
- __extends(FeaturefulElementDragging, _super);
- function FeaturefulElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- // options that can be directly set by caller
- // the caller can also set the PointerDragging's options as well
- _this.delay = null;
- _this.minDistance = 0;
- _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
- _this.mirrorNeedsRevert = false;
- _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
- _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- _this.delayTimeoutId = null;
- _this.onPointerDown = function (ev) {
- if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
- _this.isInteracting = true;
- _this.isDelayEnded = false;
- _this.isDistanceSurpassed = false;
- core.preventSelection(document.body);
- core.preventContextMenu(document.body);
- // prevent links from being visited if there's an eventual drag.
- // also prevents selection in older browsers (maybe?).
- // not necessary for touch, besides, browser would complain about passiveness.
- if (!ev.isTouch) {
- ev.origEvent.preventDefault();
- }
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.pointer.shouldIgnoreMove) {
- // actions related to initiating dragstart+dragmove+dragend...
- _this.mirror.setIsVisible(false); // reset. caller must set-visible
- _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
- _this.startDelay(ev);
- if (!_this.minDistance) {
- _this.handleDistanceSurpassed(ev);
- }
- }
- }
- };
- _this.onPointerMove = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.emitter.trigger('pointermove', ev);
- if (!_this.isDistanceSurpassed) {
- var minDistance = _this.minDistance;
- var distanceSq = void 0; // current distance from the origin, squared
- var deltaX = ev.deltaX, deltaY = ev.deltaY;
- distanceSq = deltaX * deltaX + deltaY * deltaY;
- if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
- _this.handleDistanceSurpassed(ev);
- }
- }
- if (_this.isDragging) {
- // a real pointer move? (not one simulated by scrolling)
- if (ev.origEvent.type !== 'scroll') {
- _this.mirror.handleMove(ev.pageX, ev.pageY);
- _this.autoScroller.handleMove(ev.pageX, ev.pageY);
- }
- _this.emitter.trigger('dragmove', ev);
- }
- }
- };
- _this.onPointerUp = function (ev) {
- if (_this.isInteracting) { // if false, still waiting for previous drag's revert
- _this.isInteracting = false;
- core.allowSelection(document.body);
- core.allowContextMenu(document.body);
- _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
- if (_this.isDragging) {
- _this.autoScroller.stop();
- _this.tryStopDrag(ev); // which will stop the mirror
- }
- if (_this.delayTimeoutId) {
- clearTimeout(_this.delayTimeoutId);
- _this.delayTimeoutId = null;
- }
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.onPointerDown);
- pointer.emitter.on('pointermove', _this.onPointerMove);
- pointer.emitter.on('pointerup', _this.onPointerUp);
- _this.mirror = new ElementMirror();
- _this.autoScroller = new AutoScroller();
- return _this;
- }
- FeaturefulElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- FeaturefulElementDragging.prototype.startDelay = function (ev) {
- var _this = this;
- if (typeof this.delay === 'number') {
- this.delayTimeoutId = setTimeout(function () {
- _this.delayTimeoutId = null;
- _this.handleDelayEnd(ev);
- }, this.delay); // not assignable to number!
- }
- else {
- this.handleDelayEnd(ev);
- }
- };
- FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
- this.isDelayEnded = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
- this.isDistanceSurpassed = true;
- this.tryStartDrag(ev);
- };
- FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
- if (this.isDelayEnded && this.isDistanceSurpassed) {
- if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
- this.isDragging = true;
- this.mirrorNeedsRevert = false;
- this.autoScroller.start(ev.pageX, ev.pageY);
- this.emitter.trigger('dragstart', ev);
- if (this.touchScrollAllowed === false) {
- this.pointer.cancelTouchScroll();
- }
- }
- }
- };
- FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
- // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
- // that come from the document to fire beforehand. much more convenient this way.
- this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
- );
- };
- FeaturefulElementDragging.prototype.stopDrag = function (ev) {
- this.isDragging = false;
- this.emitter.trigger('dragend', ev);
- };
- // fill in the implementations...
- FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
- this.pointer.shouldIgnoreMove = bool;
- };
- FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
- this.mirror.setIsVisible(bool);
- };
- FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
- this.mirrorNeedsRevert = bool;
- };
- FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
- this.autoScroller.isEnabled = bool;
- };
- return FeaturefulElementDragging;
- }(core.ElementDragging));
-
- /*
- When this class is instantiated, it records the offset of an element (relative to the document topleft),
- and continues to monitor scrolling, updating the cached coordinates if it needs to.
- Does not access the DOM after instantiation, so highly performant.
-
- Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
- and an determine if a given point is inside the combined clipping rectangle.
- */
- var OffsetTracker = /** @class */ (function () {
- function OffsetTracker(el) {
- this.origRect = core.computeRect(el);
- // will work fine for divs that have overflow:hidden
- this.scrollCaches = core.getClippingParents(el).map(function (el) {
- return new ElementScrollGeomCache(el, true); // listen=true
- });
- }
- OffsetTracker.prototype.destroy = function () {
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- scrollCache.destroy();
- }
- };
- OffsetTracker.prototype.computeLeft = function () {
- var left = this.origRect.left;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
- }
- return left;
- };
- OffsetTracker.prototype.computeTop = function () {
- var top = this.origRect.top;
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- top += scrollCache.origScrollTop - scrollCache.getScrollTop();
- }
- return top;
- };
- OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
- var point = { left: pageX, top: pageY };
- for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
- var scrollCache = _a[_i];
- if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
- !core.pointInsideRect(point, scrollCache.clientRect)) {
- return false;
- }
- }
- return true;
- };
- return OffsetTracker;
- }());
- // certain clipping containers should never constrain interactions, like <html> and <body>
- // https://github.com/fullcalendar/fullcalendar/issues/3615
- function isIgnoredClipping(node) {
- var tagName = node.tagName;
- return tagName === 'HTML' || tagName === 'BODY';
- }
-
- /*
- Tracks movement over multiple droppable areas (aka "hits")
- that exist in one or more DateComponents.
- Relies on an existing draggable.
-
- emits:
- - pointerdown
- - dragstart
- - hitchange - fires initially, even if not over a hit
- - pointerup
- - (hitchange - again, to null, if ended over a hit)
- - dragend
- */
- var HitDragging = /** @class */ (function () {
- function HitDragging(dragging, droppableStore) {
- var _this = this;
- // options that can be set by caller
- this.useSubjectCenter = false;
- this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
- this.initialHit = null;
- this.movingHit = null;
- this.finalHit = null; // won't ever be populated if shouldIgnoreMove
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- _this.initialHit = null;
- _this.movingHit = null;
- _this.finalHit = null;
- _this.prepareHits();
- _this.processFirstCoord(ev);
- if (_this.initialHit || !_this.requireInitial) {
- dragging.setIgnoreMove(false);
- _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
- }
- else {
- dragging.setIgnoreMove(true);
- }
- };
- this.handleDragStart = function (ev) {
- _this.emitter.trigger('dragstart', ev);
- _this.handleMove(ev, true); // force = fire even if initially null
- };
- this.handleDragMove = function (ev) {
- _this.emitter.trigger('dragmove', ev);
- _this.handleMove(ev);
- };
- this.handlePointerUp = function (ev) {
- _this.releaseHits();
- _this.emitter.trigger('pointerup', ev);
- };
- this.handleDragEnd = function (ev) {
- if (_this.movingHit) {
- _this.emitter.trigger('hitupdate', null, true, ev);
- }
- _this.finalHit = _this.movingHit;
- _this.movingHit = null;
- _this.emitter.trigger('dragend', ev);
- };
- this.droppableStore = droppableStore;
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- dragging.emitter.on('dragmove', this.handleDragMove);
- dragging.emitter.on('pointerup', this.handlePointerUp);
- dragging.emitter.on('dragend', this.handleDragEnd);
- this.dragging = dragging;
- this.emitter = new core.EmitterMixin();
- }
- // sets initialHit
- // sets coordAdjust
- HitDragging.prototype.processFirstCoord = function (ev) {
- var origPoint = { left: ev.pageX, top: ev.pageY };
- var adjustedPoint = origPoint;
- var subjectEl = ev.subjectEl;
- var subjectRect;
- if (subjectEl !== document) {
- subjectRect = core.computeRect(subjectEl);
- adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect);
- }
- var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
- if (initialHit) {
- if (this.useSubjectCenter && subjectRect) {
- var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect);
- if (slicedSubjectRect) {
- adjustedPoint = core.getRectCenter(slicedSubjectRect);
- }
- }
- this.coordAdjust = core.diffPoints(adjustedPoint, origPoint);
- }
- else {
- this.coordAdjust = { left: 0, top: 0 };
- }
- };
- HitDragging.prototype.handleMove = function (ev, forceHandle) {
- var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
- if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
- this.movingHit = hit;
- this.emitter.trigger('hitupdate', hit, false, ev);
- }
- };
- HitDragging.prototype.prepareHits = function () {
- this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) {
- interactionSettings.component.buildPositionCaches();
- return new OffsetTracker(interactionSettings.el);
- });
- };
- HitDragging.prototype.releaseHits = function () {
- var offsetTrackers = this.offsetTrackers;
- for (var id in offsetTrackers) {
- offsetTrackers[id].destroy();
- }
- this.offsetTrackers = {};
- };
- HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
- var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
- var bestHit = null;
- for (var id in droppableStore) {
- var component = droppableStore[id].component;
- var offsetTracker = offsetTrackers[id];
- if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
- var originLeft = offsetTracker.computeLeft();
- var originTop = offsetTracker.computeTop();
- var positionLeft = offsetLeft - originLeft;
- var positionTop = offsetTop - originTop;
- var origRect = offsetTracker.origRect;
- var width = origRect.right - origRect.left;
- var height = origRect.bottom - origRect.top;
- if (
- // must be within the element's bounds
- positionLeft >= 0 && positionLeft < width &&
- positionTop >= 0 && positionTop < height) {
- var hit = component.queryHit(positionLeft, positionTop, width, height);
- if (hit &&
- (
- // make sure the hit is within activeRange, meaning it's not a deal cell
- !component.props.dateProfile || // hack for DayTile
- core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
- (!bestHit || hit.layer > bestHit.layer)) {
- // TODO: better way to re-orient rectangle
- hit.rect.left += originLeft;
- hit.rect.right += originLeft;
- hit.rect.top += originTop;
- hit.rect.bottom += originTop;
- bestHit = hit;
- }
- }
- }
- }
- return bestHit;
- };
- return HitDragging;
- }());
- function isHitsEqual(hit0, hit1) {
- if (!hit0 && !hit1) {
- return true;
- }
- if (Boolean(hit0) !== Boolean(hit1)) {
- return false;
- }
- return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
- }
-
- /*
- Monitors when the user clicks on a specific date/time of a component.
- A pointerdown+pointerup on the same "hit" constitutes a click.
- */
- var DateClicking = /** @class */ (function (_super) {
- __extends(DateClicking, _super);
- function DateClicking(settings) {
- var _this = _super.call(this, settings) || this;
- _this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
- dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
- };
- // won't even fire if moving was ignored
- _this.handleDragEnd = function (ev) {
- var component = _this.component;
- var _a = component.context, calendar = _a.calendar, view = _a.view;
- var pointer = _this.dragging.pointer;
- if (!pointer.wasTouchScroll) {
- var _b = _this.hitDragging, initialHit = _b.initialHit, finalHit = _b.finalHit;
- if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
- calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, view, ev.origEvent);
- }
- }
- };
- var component = settings.component;
- // we DO want to watch pointer moves because otherwise finalHit won't get populated
- _this.dragging = new FeaturefulElementDragging(component.el);
- _this.dragging.autoScroller.isEnabled = false;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- DateClicking.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateClicking;
- }(core.Interaction));
-
- /*
- Tracks when the user selects a portion of time of a component,
- constituted by a drag over date cells, with a possible delay at the beginning of the drag.
- */
- var DateSelecting = /** @class */ (function (_super) {
- __extends(DateSelecting, _super);
- function DateSelecting(settings) {
- var _this = _super.call(this, settings) || this;
- _this.dragSelection = null;
- _this.handlePointerDown = function (ev) {
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var options = component.context.options;
- var canSelect = options.selectable &&
- component.isValidDateDownEl(ev.origEvent.target);
- // don't bother to watch expensive moves if component won't do selection
- dragging.setIgnoreMove(!canSelect);
- // if touch, require user to hold down
- dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
- };
- _this.handleDragStart = function (ev) {
- _this.component.context.calendar.unselect(ev); // unselect previous selections
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- var calendar = _this.component.context.calendar;
- var dragSelection = null;
- var isInvalid = false;
- if (hit) {
- dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
- if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
- isInvalid = true;
- dragSelection = null;
- }
- }
- if (dragSelection) {
- calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
- }
- else if (!isFinal) { // only unselect if moved away while dragging
- calendar.dispatch({ type: 'UNSELECT_DATES' });
- }
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
- }
- };
- _this.handlePointerUp = function (pev) {
- if (_this.dragSelection) {
- // selection is already rendered, so just need to report selection
- _this.component.context.calendar.triggerDateSelect(_this.dragSelection, pev);
- _this.dragSelection = null;
- }
- };
- var component = settings.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.touchScrollAllowed = false;
- dragging.minDistance = options.selectMinDistance || 0;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- DateSelecting.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return DateSelecting;
- }(core.Interaction));
- function getComponentTouchDelay(component) {
- var options = component.context.options;
- var delay = options.selectLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
- }
- function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var ms = [
- dateSpan0.range.start,
- dateSpan0.range.end,
- dateSpan1.range.start,
- dateSpan1.range.end
- ];
- ms.sort(core.compareNumbers);
- var props = {};
- for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
- var transformer = dateSelectionTransformers_1[_i];
- var res = transformer(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- props.range = { start: ms[0], end: ms[3] };
- props.allDay = dateSpan0.allDay;
- return props;
- }
-
- var EventDragging = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.subjectSeg = null; // the seg being selected/dragged
- _this.isDragging = false;
- _this.eventRange = null;
- _this.relevantEvents = null; // the events being dragged
- _this.receivingCalendar = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var origTarget = ev.origEvent.target;
- var _a = _this, component = _a.component, dragging = _a.dragging;
- var mirror = dragging.mirror;
- var options = component.context.options;
- var initialCalendar = component.context.calendar;
- var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl);
- var eventRange = _this.eventRange = subjectSeg.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
- dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
- dragging.delay =
- // only do a touch delay if touch and this event hasn't been selected yet
- (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
- getComponentTouchDelay$1(component) :
- null;
- mirror.parentNode = initialCalendar.el;
- mirror.revertDuration = options.dragRevertDuration;
- var isValid = component.isValidSegDownEl(origTarget) &&
- !core.elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
- dragging.setIgnoreMove(!isValid);
- // disable dragging for elements that are resizable (ie, selectable)
- // but are not draggable
- _this.isDragging = isValid &&
- ev.subjectEl.classList.contains('fc-draggable');
- };
- _this.handleDragStart = function (ev) {
- var context = _this.component.context;
- var initialCalendar = context.calendar;
- var eventRange = _this.eventRange;
- var eventInstanceId = eventRange.instance.instanceId;
- if (ev.isTouch) {
- // need to select a different event?
- if (eventInstanceId !== _this.component.props.eventSelection) {
- initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
- }
- }
- else {
- // if now using mouse, but was previous touch interaction, clear selected event
- initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- if (_this.isDragging) {
- initialCalendar.unselect(ev); // unselect *date* selection
- initialCalendar.publiclyTrigger('eventDragStart', [
- {
- el: _this.subjectSeg.el,
- event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: context.view
- }
- ]);
- }
- };
- _this.handleHitUpdate = function (hit, isFinal) {
- if (!_this.isDragging) {
- return;
- }
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var initialCalendar = _this.component.context.calendar;
- // states based on new hit
- var receivingCalendar = null;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.subjectSeg
- };
- if (hit) {
- var receivingComponent = hit.component;
- receivingCalendar = receivingComponent.context.calendar;
- var receivingOptions = receivingComponent.context.options;
- if (initialCalendar === receivingCalendar ||
- receivingOptions.editable && receivingOptions.droppable) {
- mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
- if (mutation) {
- mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!receivingComponent.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = core.createEmptyEventStore();
- }
- }
- }
- else {
- receivingCalendar = null;
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- if (initialCalendar === receivingCalendar && // TODO: write test for this
- isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.dragging.setMirrorNeedsRevert(!mutation);
- // render the mirror if no already-rendered mirror
- // TODO: wish we could somehow wait for dispatch to guarantee render
- _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
- // assign states based on new hit
- _this.receivingCalendar = receivingCalendar;
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handlePointerUp = function () {
- if (!_this.isDragging) {
- _this.cleanup(); // because handleDragEnd won't fire
- }
- };
- _this.handleDragEnd = function (ev) {
- if (_this.isDragging) {
- var context = _this.component.context;
- var initialCalendar_1 = context.calendar;
- var initialView = context.view;
- var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance);
- var relevantEvents_1 = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- var finalHit = _this.hitDragging.finalHit;
- _this.clearDrag(); // must happen after revert animation
- initialCalendar_1.publiclyTrigger('eventDragStop', [
- {
- el: _this.subjectSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: initialView
- }
- ]);
- if (validMutation) {
- // dropped within same calendar
- if (receivingCalendar === initialCalendar_1) {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- var transformed = {};
- for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
- var transformer = _b[_i];
- __assign(transformed, transformer(validMutation, initialCalendar_1));
- }
- var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new core.EventApi(// the data AFTER the mutation
- initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
- initialCalendar_1.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents_1
- });
- }, jsEvent: ev.origEvent, view: initialView });
- initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
- // dropped in different calendar
- }
- else if (receivingCalendar) {
- initialCalendar_1.publiclyTrigger('eventLeave', [
- {
- draggedEl: ev.subjectEl,
- event: eventApi,
- view: initialView
- }
- ]);
- initialCalendar_1.dispatch({
- type: 'REMOVE_EVENT_INSTANCES',
- instances: _this.mutatedRelevantEvents.instances
- });
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: _this.mutatedRelevantEvents
- });
- if (ev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: eventInstance.instanceId
- });
- }
- var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
- });
- receivingCalendar.publiclyTrigger('drop', [dropArg]);
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: ev.subjectEl,
- event: new core.EventApi(// the data AFTER the mutation
- receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
- view: finalHit.component // should this be finalHit.component.view? See #4644
- }
- ]);
- }
- }
- else {
- initialCalendar_1.publiclyTrigger('_noEventDrop');
- }
- }
- _this.cleanup();
- };
- var component = _this.component;
- var options = component.context.options;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = EventDragging.SELECTOR;
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore);
- hitDragging.useSubjectCenter = settings.useEventCenter;
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('pointerup', _this.handlePointerUp);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- // render a drag state on the next receivingCalendar
- EventDragging.prototype.displayDrag = function (nextCalendar, state) {
- var initialCalendar = this.component.context.calendar;
- var prevCalendar = this.receivingCalendar;
- // does the previous calendar need to be cleared?
- if (prevCalendar && prevCalendar !== nextCalendar) {
- // does the initial calendar need to be cleared?
- // if so, don't clear all the way. we still need to to hide the affectedEvents
- if (prevCalendar === initialCalendar) {
- prevCalendar.dispatch({
- type: 'SET_EVENT_DRAG',
- state: {
- affectedEvents: state.affectedEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: state.origSeg
- }
- });
- // completely clear the old calendar if it wasn't the initial
- }
- else {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- EventDragging.prototype.clearDrag = function () {
- var initialCalendar = this.component.context.calendar;
- var receivingCalendar = this.receivingCalendar;
- if (receivingCalendar) {
- receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- // the initial calendar might have an dummy drag state from displayDrag
- if (initialCalendar !== receivingCalendar) {
- initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- EventDragging.prototype.cleanup = function () {
- this.subjectSeg = null;
- this.isDragging = false;
- this.eventRange = null;
- this.relevantEvents = null;
- this.receivingCalendar = null;
- this.validMutation = null;
- this.mutatedRelevantEvents = null;
- };
- EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
- return EventDragging;
- }(core.Interaction));
- function computeEventMutation(hit0, hit1, massagers) {
- var dateSpan0 = hit0.dateSpan;
- var dateSpan1 = hit1.dateSpan;
- var date0 = dateSpan0.range.start;
- var date1 = dateSpan1.range.start;
- var standardProps = {};
- if (dateSpan0.allDay !== dateSpan1.allDay) {
- standardProps.allDay = dateSpan1.allDay;
- standardProps.hasEnd = hit1.component.context.options.allDayMaintainDuration;
- if (dateSpan1.allDay) {
- // means date1 is already start-of-day,
- // but date0 needs to be converted
- date0 = core.startOfDay(date0);
- }
- }
- var delta = core.diffDates(date0, date1, hit0.component.context.dateEnv, hit0.component === hit1.component ?
- hit0.component.largeUnit :
- null);
- if (delta.milliseconds) { // has hours/minutes/seconds
- standardProps.allDay = false;
- }
- var mutation = {
- datesDelta: delta,
- standardProps: standardProps
- };
- for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
- var massager = massagers_1[_i];
- massager(mutation, hit0, hit1);
- }
- return mutation;
- }
- function getComponentTouchDelay$1(component) {
- var options = component.context.options;
- var delay = options.eventLongPressDelay;
- if (delay == null) {
- delay = options.longPressDelay;
- }
- return delay;
- }
-
- var EventDragging$1 = /** @class */ (function (_super) {
- __extends(EventDragging, _super);
- function EventDragging(settings) {
- var _this = _super.call(this, settings) || this;
- // internal state
- _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
- _this.eventRange = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- _this.mutatedRelevantEvents = null;
- _this.handlePointerDown = function (ev) {
- var component = _this.component;
- var seg = _this.querySeg(ev);
- var eventRange = _this.eventRange = seg.eventRange;
- _this.dragging.minDistance = component.context.options.eventDragMinDistance;
- // if touch, need to be working with a selected event
- _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
- (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
- };
- _this.handleDragStart = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventRange = _this.eventRange;
- _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
- _this.draggingSeg = _this.querySeg(ev);
- calendar.unselect();
- calendar.publiclyTrigger('eventResizeStart', [
- {
- el: _this.draggingSeg.el,
- event: new core.EventApi(calendar, eventRange.def, eventRange.instance),
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- };
- _this.handleHitUpdate = function (hit, isFinal, ev) {
- var calendar = _this.component.context.calendar;
- var relevantEvents = _this.relevantEvents;
- var initialHit = _this.hitDragging.initialHit;
- var eventInstance = _this.eventRange.instance;
- var mutation = null;
- var mutatedRelevantEvents = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: relevantEvents,
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: true,
- origSeg: _this.draggingSeg
- };
- if (hit) {
- mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
- }
- if (mutation) {
- mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
- interaction.mutatedEvents = mutatedRelevantEvents;
- if (!_this.component.isInteractionValid(interaction)) {
- isInvalid = true;
- mutation = null;
- mutatedRelevantEvents = null;
- interaction.mutatedEvents = null;
- }
- }
- if (mutatedRelevantEvents) {
- calendar.dispatch({
- type: 'SET_EVENT_RESIZE',
- state: interaction
- });
- }
- else {
- calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
- }
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- if (mutation && isHitsEqual(initialHit, hit)) {
- mutation = null;
- }
- _this.validMutation = mutation;
- _this.mutatedRelevantEvents = mutatedRelevantEvents;
- }
- };
- _this.handleDragEnd = function (ev) {
- var _a = _this.component.context, calendar = _a.calendar, view = _a.view;
- var eventDef = _this.eventRange.def;
- var eventInstance = _this.eventRange.instance;
- var eventApi = new core.EventApi(calendar, eventDef, eventInstance);
- var relevantEvents = _this.relevantEvents;
- var mutatedRelevantEvents = _this.mutatedRelevantEvents;
- calendar.publiclyTrigger('eventResizeStop', [
- {
- el: _this.draggingSeg.el,
- event: eventApi,
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- if (_this.validMutation) {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: mutatedRelevantEvents
- });
- calendar.publiclyTrigger('eventResize', [
- {
- el: _this.draggingSeg.el,
- startDelta: _this.validMutation.startDelta || core.createDuration(0),
- endDelta: _this.validMutation.endDelta || core.createDuration(0),
- prevEvent: eventApi,
- event: new core.EventApi(// the data AFTER the mutation
- calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
- revert: function () {
- calendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: relevantEvents
- });
- },
- jsEvent: ev.origEvent,
- view: view
- }
- ]);
- }
- else {
- calendar.publiclyTrigger('_noEventResize');
- }
- // reset all internal state
- _this.draggingSeg = null;
- _this.relevantEvents = null;
- _this.validMutation = null;
- // okay to keep eventInstance around. useful to set it in handlePointerDown
- };
- var component = settings.component;
- var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
- dragging.pointer.selector = '.fc-resizer';
- dragging.touchScrollAllowed = false;
- dragging.autoScroller.isEnabled = component.context.options.dragScroll;
- var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
- hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
- hitDragging.emitter.on('dragstart', _this.handleDragStart);
- hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
- hitDragging.emitter.on('dragend', _this.handleDragEnd);
- return _this;
- }
- EventDragging.prototype.destroy = function () {
- this.dragging.destroy();
- };
- EventDragging.prototype.querySeg = function (ev) {
- return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector));
- };
- return EventDragging;
- }(core.Interaction));
- function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
- var dateEnv = hit0.component.context.dateEnv;
- var date0 = hit0.dateSpan.range.start;
- var date1 = hit1.dateSpan.range.start;
- var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
- var props = {};
- for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
- var transform = transforms_1[_i];
- var res = transform(hit0, hit1);
- if (res === false) {
- return null;
- }
- else if (res) {
- __assign(props, res);
- }
- }
- if (isFromStart) {
- if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
- props.startDelta = delta;
- return props;
- }
- }
- else {
- if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
- props.endDelta = delta;
- return props;
- }
- }
- return null;
- }
-
- var UnselectAuto = /** @class */ (function () {
- function UnselectAuto(calendar) {
- var _this = this;
- this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
- this.onSelect = function (selectInfo) {
- if (selectInfo.jsEvent) {
- _this.isRecentPointerDateSelect = true;
- }
- };
- this.onDocumentPointerUp = function (pev) {
- var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
- var state = calendar.state;
- // touch-scrolling should never unfocus any type of selection
- if (!documentPointer.wasTouchScroll) {
- if (state.dateSelection && // an existing date selection?
- !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
- ) {
- var unselectAuto = calendar.viewOpt('unselectAuto');
- var unselectCancel = calendar.viewOpt('unselectCancel');
- if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) {
- calendar.unselect(pev);
- }
- }
- if (state.eventSelection && // an existing event selected?
- !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
- ) {
- calendar.dispatch({ type: 'UNSELECT_EVENT' });
- }
- }
- _this.isRecentPointerDateSelect = false;
- };
- this.calendar = calendar;
- var documentPointer = this.documentPointer = new PointerDragging(document);
- documentPointer.shouldIgnoreMove = true;
- documentPointer.shouldWatchScroll = false;
- documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
- /*
- TODO: better way to know about whether there was a selection with the pointer
- */
- calendar.on('select', this.onSelect);
- }
- UnselectAuto.prototype.destroy = function () {
- this.calendar.off('select', this.onSelect);
- this.documentPointer.destroy();
- };
- return UnselectAuto;
- }());
-
- /*
- Given an already instantiated draggable object for one-or-more elements,
- Interprets any dragging as an attempt to drag an events that lives outside
- of a calendar onto a calendar.
- */
- var ExternalElementDragging = /** @class */ (function () {
- function ExternalElementDragging(dragging, suppliedDragMeta) {
- var _this = this;
- this.receivingCalendar = null;
- this.droppableEvent = null; // will exist for all drags, even if create:false
- this.suppliedDragMeta = null;
- this.dragMeta = null;
- this.handleDragStart = function (ev) {
- _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
- };
- this.handleHitUpdate = function (hit, isFinal, ev) {
- var dragging = _this.hitDragging.dragging;
- var receivingCalendar = null;
- var droppableEvent = null;
- var isInvalid = false;
- var interaction = {
- affectedEvents: core.createEmptyEventStore(),
- mutatedEvents: core.createEmptyEventStore(),
- isEvent: _this.dragMeta.create,
- origSeg: null
- };
- if (hit) {
- receivingCalendar = hit.component.context.calendar;
- if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
- droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
- interaction.mutatedEvents = core.eventTupleToStore(droppableEvent);
- isInvalid = !core.isInteractionValid(interaction, receivingCalendar);
- if (isInvalid) {
- interaction.mutatedEvents = core.createEmptyEventStore();
- droppableEvent = null;
- }
- }
- }
- _this.displayDrag(receivingCalendar, interaction);
- // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
- // TODO: wish we could somehow wait for dispatch to guarantee render
- dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
- if (!isInvalid) {
- core.enableCursor();
- }
- else {
- core.disableCursor();
- }
- if (!isFinal) {
- dragging.setMirrorNeedsRevert(!droppableEvent);
- _this.receivingCalendar = receivingCalendar;
- _this.droppableEvent = droppableEvent;
- }
- };
- this.handleDragEnd = function (pev) {
- var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
- _this.clearDrag();
- if (receivingCalendar && droppableEvent) {
- var finalHit = _this.hitDragging.finalHit;
- var finalView = finalHit.component.context.view;
- var dragMeta = _this.dragMeta;
- var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
- receivingCalendar.publiclyTrigger('drop', [arg]);
- if (dragMeta.create) {
- receivingCalendar.dispatch({
- type: 'MERGE_EVENTS',
- eventStore: core.eventTupleToStore(droppableEvent)
- });
- if (pev.isTouch) {
- receivingCalendar.dispatch({
- type: 'SELECT_EVENT',
- eventInstanceId: droppableEvent.instance.instanceId
- });
- }
- // signal that an external event landed
- receivingCalendar.publiclyTrigger('eventReceive', [
- {
- draggedEl: pev.subjectEl,
- event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
- view: finalView
- }
- ]);
- }
- }
- _this.receivingCalendar = null;
- _this.droppableEvent = null;
- };
- var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore);
- hitDragging.requireInitial = false; // will start outside of a component
- hitDragging.emitter.on('dragstart', this.handleDragStart);
- hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
- hitDragging.emitter.on('dragend', this.handleDragEnd);
- this.suppliedDragMeta = suppliedDragMeta;
- }
- ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
- if (typeof this.suppliedDragMeta === 'object') {
- return core.parseDragMeta(this.suppliedDragMeta);
- }
- else if (typeof this.suppliedDragMeta === 'function') {
- return core.parseDragMeta(this.suppliedDragMeta(subjectEl));
- }
- else {
- return getDragMetaFromEl(subjectEl);
- }
- };
- ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
- var prevCalendar = this.receivingCalendar;
- if (prevCalendar && prevCalendar !== nextCalendar) {
- prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- if (nextCalendar) {
- nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
- }
- };
- ExternalElementDragging.prototype.clearDrag = function () {
- if (this.receivingCalendar) {
- this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
- }
- };
- ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
- var dropAccept = receivingCalendar.opt('dropAccept');
- if (typeof dropAccept === 'function') {
- return dropAccept(el);
- }
- else if (typeof dropAccept === 'string' && dropAccept) {
- return Boolean(core.elementMatches(el, dropAccept));
- }
- return true;
- };
- return ExternalElementDragging;
- }());
- // Utils for computing event store from the DragMeta
- // ----------------------------------------------------------------------------------------------------
- function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
- var defProps = __assign({}, dragMeta.leftoverProps);
- for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
- var transform = _a[_i];
- __assign(defProps, transform(dateSpan, dragMeta));
- }
- var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
- calendar);
- var start = dateSpan.range.start;
- // only rely on time info if drop zone is all-day,
- // otherwise, we already know the time
- if (dateSpan.allDay && dragMeta.startTime) {
- start = calendar.dateEnv.add(start, dragMeta.startTime);
- }
- var end = dragMeta.duration ?
- calendar.dateEnv.add(start, dragMeta.duration) :
- calendar.getDefaultEventEnd(dateSpan.allDay, start);
- var instance = core.createEventInstance(def.defId, { start: start, end: end });
- return { def: def, instance: instance };
- }
- // Utils for extracting data from element
- // ----------------------------------------------------------------------------------------------------
- function getDragMetaFromEl(el) {
- var str = getEmbeddedElData(el, 'event');
- var obj = str ?
- JSON.parse(str) :
- { create: false }; // if no embedded data, assume no event creation
- return core.parseDragMeta(obj);
- }
- core.config.dataAttrPrefix = '';
- function getEmbeddedElData(el, name) {
- var prefix = core.config.dataAttrPrefix;
- var prefixedName = (prefix ? prefix + '-' : '') + name;
- return el.getAttribute('data-' + prefixedName) || '';
- }
-
- /*
- Makes an element (that is *external* to any calendar) draggable.
- Can pass in data that determines how an event will be created when dropped onto a calendar.
- Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
- */
- var ExternalDraggable = /** @class */ (function () {
- function ExternalDraggable(el, settings) {
- var _this = this;
- if (settings === void 0) { settings = {}; }
- this.handlePointerDown = function (ev) {
- var dragging = _this.dragging;
- var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
- dragging.minDistance =
- minDistance != null ?
- minDistance :
- (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance);
- dragging.delay =
- ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
- (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) :
- 0;
- };
- this.handleDragStart = function (ev) {
- if (ev.isTouch &&
- _this.dragging.delay &&
- ev.subjectEl.classList.contains('fc-event')) {
- _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
- }
- };
- this.settings = settings;
- var dragging = this.dragging = new FeaturefulElementDragging(el);
- dragging.touchScrollAllowed = false;
- if (settings.itemSelector != null) {
- dragging.pointer.selector = settings.itemSelector;
- }
- if (settings.appendTo != null) {
- dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
- }
- dragging.emitter.on('pointerdown', this.handlePointerDown);
- dragging.emitter.on('dragstart', this.handleDragStart);
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ExternalDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ExternalDraggable;
- }());
-
- /*
- Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
- The third-party system is responsible for drawing the visuals effects of the drag.
- This class simply monitors for pointer movements and fires events.
- It also has the ability to hide the moving element (the "mirror") during the drag.
- */
- var InferredElementDragging = /** @class */ (function (_super) {
- __extends(InferredElementDragging, _super);
- function InferredElementDragging(containerEl) {
- var _this = _super.call(this, containerEl) || this;
- _this.shouldIgnoreMove = false;
- _this.mirrorSelector = '';
- _this.currentMirrorEl = null;
- _this.handlePointerDown = function (ev) {
- _this.emitter.trigger('pointerdown', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragstart right away. does not support delay or min-distance
- _this.emitter.trigger('dragstart', ev);
- }
- };
- _this.handlePointerMove = function (ev) {
- if (!_this.shouldIgnoreMove) {
- _this.emitter.trigger('dragmove', ev);
- }
- };
- _this.handlePointerUp = function (ev) {
- _this.emitter.trigger('pointerup', ev);
- if (!_this.shouldIgnoreMove) {
- // fire dragend right away. does not support a revert animation
- _this.emitter.trigger('dragend', ev);
- }
- };
- var pointer = _this.pointer = new PointerDragging(containerEl);
- pointer.emitter.on('pointerdown', _this.handlePointerDown);
- pointer.emitter.on('pointermove', _this.handlePointerMove);
- pointer.emitter.on('pointerup', _this.handlePointerUp);
- return _this;
- }
- InferredElementDragging.prototype.destroy = function () {
- this.pointer.destroy();
- };
- InferredElementDragging.prototype.setIgnoreMove = function (bool) {
- this.shouldIgnoreMove = bool;
- };
- InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
- if (bool) {
- // restore a previously hidden element.
- // use the reference in case the selector class has already been removed.
- if (this.currentMirrorEl) {
- this.currentMirrorEl.style.visibility = '';
- this.currentMirrorEl = null;
- }
- }
- else {
- var mirrorEl = this.mirrorSelector ?
- document.querySelector(this.mirrorSelector) :
- null;
- if (mirrorEl) {
- this.currentMirrorEl = mirrorEl;
- mirrorEl.style.visibility = 'hidden';
- }
- }
- };
- return InferredElementDragging;
- }(core.ElementDragging));
-
- /*
- Bridges third-party drag-n-drop systems with FullCalendar.
- Must be instantiated and destroyed by caller.
- */
- var ThirdPartyDraggable = /** @class */ (function () {
- function ThirdPartyDraggable(containerOrSettings, settings) {
- var containerEl = document;
- if (
- // wish we could just test instanceof EventTarget, but doesn't work in IE11
- containerOrSettings === document ||
- containerOrSettings instanceof Element) {
- containerEl = containerOrSettings;
- settings = settings || {};
- }
- else {
- settings = (containerOrSettings || {});
- }
- var dragging = this.dragging = new InferredElementDragging(containerEl);
- if (typeof settings.itemSelector === 'string') {
- dragging.pointer.selector = settings.itemSelector;
- }
- else if (containerEl === document) {
- dragging.pointer.selector = '[data-event]';
- }
- if (typeof settings.mirrorSelector === 'string') {
- dragging.mirrorSelector = settings.mirrorSelector;
- }
- new ExternalElementDragging(dragging, settings.eventData);
- }
- ThirdPartyDraggable.prototype.destroy = function () {
- this.dragging.destroy();
- };
- return ThirdPartyDraggable;
- }());
-
- var main = core.createPlugin({
- componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
- calendarInteractions: [UnselectAuto],
- elementDraggingImpl: FeaturefulElementDragging
- });
-
- exports.Draggable = ExternalDraggable;
- exports.FeaturefulElementDragging = FeaturefulElementDragging;
- exports.PointerDragging = PointerDragging;
- exports.ThirdPartyDraggable = ThirdPartyDraggable;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/interaction/main.min.js b/library/fullcalendar/packages/interaction/main.min.js
deleted file mode 100644
index 6f0cdcc63..000000000
--- a/library/fullcalendar/packages/interaction/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarInteraction={},e.FullCalendar)}(this,(function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};t.config.touchMouseIgnoreWait=500;var o=0,a=0,l=!1,s=function(){function e(e){var n=this;this.subjectEl=null,this.downEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!n.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&n.tryStart(e)){var t=n.createEventFromMouse(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t),n.shouldIgnoreMove||document.addEventListener("mousemove",n.handleMouseMove),document.addEventListener("mouseup",n.handleMouseUp)}},this.handleMouseMove=function(e){var t=n.createEventFromMouse(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",n.handleMouseMove),document.removeEventListener("mouseup",n.handleMouseUp),n.emitter.trigger("pointerup",n.createEventFromMouse(e)),n.cleanup()},this.handleTouchStart=function(e){if(n.tryStart(e)){n.isTouchDragging=!0;var t=n.createEventFromTouch(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t);var r=e.target;n.shouldIgnoreMove||r.addEventListener("touchmove",n.handleTouchMove),r.addEventListener("touchend",n.handleTouchEnd),r.addEventListener("touchcancel",n.handleTouchEnd),window.addEventListener("scroll",n.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var t=n.createEventFromTouch(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleTouchEnd=function(e){if(n.isDragging){var r=e.target;r.removeEventListener("touchmove",n.handleTouchMove),r.removeEventListener("touchend",n.handleTouchEnd),r.removeEventListener("touchcancel",n.handleTouchEnd),window.removeEventListener("scroll",n.handleTouchScroll,!0),n.emitter.trigger("pointerup",n.createEventFromTouch(e)),n.cleanup(),n.isTouchDragging=!1,o++,setTimeout((function(){o--}),t.config.touchMouseIgnoreWait)}},this.handleTouchScroll=function(){n.wasTouchScroll=!0},this.handleScroll=function(e){if(!n.shouldIgnoreMove){var t=window.pageXOffset-n.prevScrollX+n.prevPageX,r=window.pageYOffset-n.prevScrollY+n.prevPageY;n.emitter.trigger("pointermove",{origEvent:e,isTouch:n.isTouchDragging,subjectEl:n.subjectEl,pageX:t,pageY:r,deltaX:t-n.origPageX,deltaY:r-n.origPageY})}},this.containerEl=e,this.emitter=new t.EmitterMixin,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),a++||window.addEventListener("touchmove",c,{passive:!1})}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),--a||window.removeEventListener("touchmove",c,{passive:!1})},e.prototype.tryStart=function(e){var n=this.querySubjectEl(e),r=e.target;return!(!n||this.handleSelector&&!t.elementClosest(r,this.handleSelector))&&(this.subjectEl=n,this.downEl=r,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){l=!1,this.isDragging=!1,this.subjectEl=null,this.downEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?t.elementClosest(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return o||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(l=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,i=e.touches,o=0,a=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(o=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:o,deltaY:a}},e}();function c(e){l&&e.preventDefault()}var d=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,n){var r=this.mirrorEl,i=this.sourceEl.getBoundingClientRect();r.style.transition="top "+n+"ms,left "+n+"ms",t.applyStyle(r,{left:i.left,top:i.top}),t.whenTransitionDone(r,(function(){r.style.transition="",e()}))},e.prototype.cleanup=function(){this.mirrorEl&&(t.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&t.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,n=this.mirrorEl;return n||((n=this.mirrorEl=this.sourceEl.cloneNode(!0)).classList.add("fc-unselectable"),n.classList.add("fc-dragging"),t.applyStyle(n,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(n)),n},e}(),g=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return r(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(t.ScrollController),u=function(e){function n(n,r){return e.call(this,new t.ElementScrollController(n),r)||this}return r(n,e),n.prototype.getEventTarget=function(){return this.scrollController.el},n.prototype.computeClientRect=function(){return t.computeInnerRect(this.scrollController.el)},n}(g),h=function(e){function n(n){return e.call(this,new t.WindowScrollController,n)||this}return r(n,e),n.prototype.getEventTarget=function(){return window},n.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},n.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},n}(g),p="function"==typeof performance?performance.now:Date.now,v=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=p();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t){this.isEnabled&&(this.scrollCaches=this.buildCaches(),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,o=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,i=r-e.distance,o=i*i/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+o*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+o*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,i=0,o=this.scrollCaches;i<o.length;i++){var a=o[i],l=a.clientRect,s=e-l.left,c=l.right-e,d=t-l.top,g=l.bottom-t;s>=0&&c>=0&&d>=0&&g>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),g<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>g)&&(r={scrollCache:a,name:"bottom",distance:g}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map((function(e){return e===window?new h(!1):new u(e,!1)}))},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t<n.length;t++){var r=n[t];"object"==typeof r?e.push(r):e.push.apply(e,Array.prototype.slice.call(document.querySelectorAll(r)))}return e},e}(),f=function(e){function n(n){var r=e.call(this,n)||this;r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,t.preventSelection(document.body),t.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.pointer.shouldIgnoreMove||(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=e.deltaX,i=e.deltaY;n*n+i*i>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new s(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new d,r.autoScroller=new v,r}return r(n,e),n.prototype.destroy=function(){this.pointer.destroy()},n.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},n.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},n.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},n.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},n.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},n.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},n.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},n.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},n.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},n.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},n}(t.ElementDragging),E=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map((function(e){return new u(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,n){for(var r,i,o={left:e,top:n},a=0,l=this.scrollCaches;a<l.length;a++){var s=l[a];if(r=s.getEventTarget(),i=void 0,"HTML"!==(i=r.tagName)&&"BODY"!==i&&!t.pointInsideRect(o,s.clientRect))return!1}return!0},e}();var m=function(){function e(e,n){var r=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=r.dragging;r.initialHit=null,r.movingHit=null,r.finalHit=null,r.prepareHits(),r.processFirstCoord(e),r.initialHit||!r.requireInitial?(t.setIgnoreMove(!1),r.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){r.emitter.trigger("dragstart",e),r.handleMove(e,!0)},this.handleDragMove=function(e){r.emitter.trigger("dragmove",e),r.handleMove(e)},this.handlePointerUp=function(e){r.releaseHits(),r.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){r.movingHit&&r.emitter.trigger("hitupdate",null,!0,e),r.finalHit=r.movingHit,r.movingHit=null,r.emitter.trigger("dragend",e)},this.droppableStore=n,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new t.EmitterMixin}return e.prototype.processFirstCoord=function(e){var n,r={left:e.pageX,top:e.pageY},i=r,o=e.subjectEl;o!==document&&(n=t.computeRect(o),i=t.constrainPoint(i,n));var a=this.initialHit=this.queryHitForOffset(i.left,i.top);if(a){if(this.useSubjectCenter&&n){var l=t.intersectRects(n,a.rect);l&&(i=t.getRectCenter(l))}this.coordAdjust=t.diffPoints(i,r)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&S(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=t.mapHash(this.droppableStore,(function(e){return e.component.buildPositionCaches(),new E(e.el)}))},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,n){var r=this.droppableStore,i=this.offsetTrackers,o=null;for(var a in r){var l=r[a].component,s=i[a];if(s.isWithinClipping(e,n)){var c=s.computeLeft(),d=s.computeTop(),g=e-c,u=n-d,h=s.origRect,p=h.right-h.left,v=h.bottom-h.top;if(g>=0&&g<p&&u>=0&&u<v){var f=l.queryHit(g,u,p,v);!f||l.props.dateProfile&&!t.rangeContainsRange(l.props.dateProfile.activeRange,f.dateSpan.range)||o&&!(f.layer>o.layer)||(f.rect.left+=c,f.rect.right+=c,f.rect.top+=d,f.rect.bottom+=d,o=f)}}}return o},e}();function S(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}var y=function(e){function n(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component.context,n=t.calendar,i=t.view;if(!r.dragging.pointer.wasTouchScroll){var o=r.hitDragging,a=o.initialHit,l=o.finalHit;a&&l&&S(a,l)&&n.triggerDateClick(a.dateSpan,a.dayEl,i,e.origEvent)}};var i=n.component;r.dragging=new f(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction),D=function(e){function n(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.context.options.selectable&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?function(e){var t=e.context.options,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(n):null},r.handleDragStart=function(e){r.component.context.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var o=r.component.context.calendar,a=null,l=!1;e&&((a=function(e,n,r){var o=e.dateSpan,a=n.dateSpan,l=[o.range.start,o.range.end,a.range.start,a.range.end];l.sort(t.compareNumbers);for(var s={},c=0,d=r;c<d.length;c++){var g=(0,d[c])(e,n);if(!1===g)return null;g&&i(s,g)}return s.range={start:l[0],end:l[3]},s.allDay=o.allDay,s}(r.hitDragging.initialHit,e,o.pluginSystem.hooks.dateSelectionTransformers))&&r.component.isDateSelectionValid(a)||(l=!0,a=null)),a?o.dispatch({type:"SELECT_DATES",selection:a}):n||o.dispatch({type:"UNSELECT_DATES"}),l?t.disableCursor():t.enableCursor(),n||(r.dragSelection=a)},r.handlePointerUp=function(e){r.dragSelection&&(r.component.context.calendar.triggerDateSelect(r.dragSelection,e),r.dragSelection=null)};var o=n.component,a=o.context.options,l=r.dragging=new f(o.el);l.touchScrollAllowed=!1,l.minDistance=a.selectMinDistance||0,l.autoScroller.isEnabled=a.dragScroll;var s=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return s.emitter.on("pointerdown",r.handlePointerDown),s.emitter.on("dragstart",r.handleDragStart),s.emitter.on("hitupdate",r.handleHitUpdate),s.emitter.on("pointerup",r.handlePointerUp),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction);var w=function(e){function n(r){var o=e.call(this,r)||this;o.subjectSeg=null,o.isDragging=!1,o.eventRange=null,o.relevantEvents=null,o.receivingCalendar=null,o.validMutation=null,o.mutatedRelevantEvents=null,o.handlePointerDown=function(e){var n=e.origEvent.target,r=o,i=r.component,a=r.dragging,l=a.mirror,s=i.context.options,c=i.context.calendar,d=o.subjectSeg=t.getElSeg(e.subjectEl),g=(o.eventRange=d.eventRange).instance.instanceId;o.relevantEvents=t.getRelevantEvents(c.state.eventStore,g),a.minDistance=e.isTouch?0:s.eventDragMinDistance,a.delay=e.isTouch&&g!==i.props.eventSelection?function(e){var t=e.context.options,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(i):null,l.parentNode=c.el,l.revertDuration=s.dragRevertDuration;var u=i.isValidSegDownEl(n)&&!t.elementClosest(n,".fc-resizer");a.setIgnoreMove(!u),o.isDragging=u&&e.subjectEl.classList.contains("fc-draggable")},o.handleDragStart=function(e){var n=o.component.context,r=n.calendar,i=o.eventRange,a=i.instance.instanceId;e.isTouch?a!==o.component.props.eventSelection&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:a}):r.dispatch({type:"UNSELECT_EVENT"}),o.isDragging&&(r.unselect(e),r.publiclyTrigger("eventDragStart",[{el:o.subjectSeg.el,event:new t.EventApi(r,i.def,i.instance),jsEvent:e.origEvent,view:n.view}]))},o.handleHitUpdate=function(e,n){if(o.isDragging){var r=o.relevantEvents,i=o.hitDragging.initialHit,a=o.component.context.calendar,l=null,s=null,c=null,d=!1,g={affectedEvents:r,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:o.subjectSeg};if(e){var u=e.component;l=u.context.calendar;var h=u.context.options;a===l||h.editable&&h.droppable?(s=function(e,n,r){var i=e.dateSpan,o=n.dateSpan,a=i.range.start,l=o.range.start,s={};i.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=n.component.context.options.allDayMaintainDuration,o.allDay&&(a=t.startOfDay(a)));var c=t.diffDates(a,l,e.component.context.dateEnv,e.component===n.component?e.component.largeUnit:null);c.milliseconds&&(s.allDay=!1);for(var d={datesDelta:c,standardProps:s},g=0,u=r;g<u.length;g++){(0,u[g])(d,e,n)}return d}(i,e,l.pluginSystem.hooks.eventDragMutationMassagers))&&(c=t.applyMutationToEventStore(r,l.eventUiBases,s,l),g.mutatedEvents=c,u.isInteractionValid(g)||(d=!0,s=null,c=null,g.mutatedEvents=t.createEmptyEventStore())):l=null}o.displayDrag(l,g),d?t.disableCursor():t.enableCursor(),n||(a===l&&S(i,e)&&(s=null),o.dragging.setMirrorNeedsRevert(!s),o.dragging.setMirrorIsVisible(!e||!document.querySelector(".fc-mirror")),o.receivingCalendar=l,o.validMutation=s,o.mutatedRelevantEvents=c)}},o.handlePointerUp=function(){o.isDragging||o.cleanup()},o.handleDragEnd=function(e){if(o.isDragging){var n=o.component.context,r=n.calendar,a=n.view,l=o,s=l.receivingCalendar,c=l.validMutation,d=o.eventRange.def,g=o.eventRange.instance,u=new t.EventApi(r,d,g),h=o.relevantEvents,p=o.mutatedRelevantEvents,v=o.hitDragging.finalHit;if(o.clearDrag(),r.publiclyTrigger("eventDragStop",[{el:o.subjectSeg.el,event:u,jsEvent:e.origEvent,view:a}]),c){if(s===r){r.dispatch({type:"MERGE_EVENTS",eventStore:p});for(var f={},E=0,m=r.pluginSystem.hooks.eventDropTransformers;E<m.length;E++){var S=m[E];i(f,S(c,r))}var y=i({},f,{el:e.subjectEl,delta:c.datesDelta,oldEvent:u,event:new t.EventApi(r,p.defs[d.defId],g?p.instances[g.instanceId]:null),revert:function(){r.dispatch({type:"MERGE_EVENTS",eventStore:h})},jsEvent:e.origEvent,view:a});r.publiclyTrigger("eventDrop",[y])}else if(s){r.publiclyTrigger("eventLeave",[{draggedEl:e.subjectEl,event:u,view:a}]),r.dispatch({type:"REMOVE_EVENT_INSTANCES",instances:o.mutatedRelevantEvents.instances}),s.dispatch({type:"MERGE_EVENTS",eventStore:o.mutatedRelevantEvents}),e.isTouch&&s.dispatch({type:"SELECT_EVENT",eventInstanceId:g.instanceId});var D=i({},s.buildDatePointApi(v.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:v.component});s.publiclyTrigger("drop",[D]),s.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(s,p.defs[d.defId],p.instances[g.instanceId]),view:v.component}])}}else r.publiclyTrigger("_noEventDrop")}o.cleanup()};var a=o.component,l=a.context.options,s=o.dragging=new f(a.el);s.pointer.selector=n.SELECTOR,s.touchScrollAllowed=!1,s.autoScroller.isEnabled=l.dragScroll;var c=o.hitDragging=new m(o.dragging,t.interactionSettingsStore);return c.useSubjectCenter=r.useEventCenter,c.emitter.on("pointerdown",o.handlePointerDown),c.emitter.on("dragstart",o.handleDragStart),c.emitter.on("hitupdate",o.handleHitUpdate),c.emitter.on("pointerup",o.handlePointerUp),c.emitter.on("dragend",o.handleDragEnd),o}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.displayDrag=function(e,n){var r=this.component.context.calendar,i=this.receivingCalendar;i&&i!==e&&(i===r?i.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:n.affectedEvents,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:n.origSeg}}):i.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:n})},n.prototype.clearDrag=function(){var e=this.component.context.calendar,t=this.receivingCalendar;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},n.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingCalendar=null,this.validMutation=null,this.mutatedRelevantEvents=null},n.SELECTOR=".fc-draggable, .fc-resizable",n}(t.Interaction);var T=function(e){function n(n){var r=e.call(this,n)||this;r.draggingSeg=null,r.eventRange=null,r.relevantEvents=null,r.validMutation=null,r.mutatedRelevantEvents=null,r.handlePointerDown=function(e){var t=r.component,n=r.querySeg(e),i=r.eventRange=n.eventRange;r.dragging.minDistance=t.context.options.eventDragMinDistance,r.dragging.setIgnoreMove(!r.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&r.component.props.eventSelection!==i.instance.instanceId)},r.handleDragStart=function(e){var n=r.component.context,i=n.calendar,o=n.view,a=r.eventRange;r.relevantEvents=t.getRelevantEvents(i.state.eventStore,r.eventRange.instance.instanceId),r.draggingSeg=r.querySeg(e),i.unselect(),i.publiclyTrigger("eventResizeStart",[{el:r.draggingSeg.el,event:new t.EventApi(i,a.def,a.instance),jsEvent:e.origEvent,view:o}])},r.handleHitUpdate=function(e,n,o){var a=r.component.context.calendar,l=r.relevantEvents,s=r.hitDragging.initialHit,c=r.eventRange.instance,d=null,g=null,u=!1,h={affectedEvents:l,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:r.draggingSeg};e&&(d=function(e,n,r,o,a){for(var l=e.component.context.dateEnv,s=e.dateSpan.range.start,c=n.dateSpan.range.start,d=t.diffDates(s,c,l,e.component.largeUnit),g={},u=0,h=a;u<h.length;u++){var p=(0,h[u])(e,n);if(!1===p)return null;p&&i(g,p)}if(r){if(l.add(o.start,d)<o.end)return g.startDelta=d,g}else if(l.add(o.end,d)>o.start)return g.endDelta=d,g;return null}(s,e,o.subjectEl.classList.contains("fc-start-resizer"),c.range,a.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(g=t.applyMutationToEventStore(l,a.eventUiBases,d,a),h.mutatedEvents=g,r.component.isInteractionValid(h)||(u=!0,d=null,g=null,h.mutatedEvents=null)),g?a.dispatch({type:"SET_EVENT_RESIZE",state:h}):a.dispatch({type:"UNSET_EVENT_RESIZE"}),u?t.disableCursor():t.enableCursor(),n||(d&&S(s,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=g)},r.handleDragEnd=function(e){var n=r.component.context,i=n.calendar,o=n.view,a=r.eventRange.def,l=r.eventRange.instance,s=new t.EventApi(i,a,l),c=r.relevantEvents,d=r.mutatedRelevantEvents;i.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:s,jsEvent:e.origEvent,view:o}]),r.validMutation?(i.dispatch({type:"MERGE_EVENTS",eventStore:d}),i.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:s,event:new t.EventApi(i,d.defs[a.defId],l?d.instances[l.instanceId]:null),revert:function(){i.dispatch({type:"MERGE_EVENTS",eventStore:c})},jsEvent:e.origEvent,view:o}])):i.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var o=n.component,a=r.dragging=new f(o.el);a.pointer.selector=".fc-resizer",a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.context.options.dragScroll;var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},n}(t.Interaction);var M=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,w.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new s(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),b=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,o){var a=r.hitDragging.dragging,l=null,s=null,c=!1,d={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(l=e.component.context.calendar,r.canDropElOnCalendar(o.subjectEl,l)&&(s=function(e,n,r){for(var o=i({},n.leftoverProps),a=0,l=r.pluginSystem.hooks.externalDefTransforms;a<l.length;a++){var s=l[a];i(o,s(e,n))}var c=t.parseEventDef(o,n.sourceId,e.allDay,r.opt("forceEventDuration")||Boolean(n.duration),r),d=e.range.start;e.allDay&&n.startTime&&(d=r.dateEnv.add(d,n.startTime));var g=n.duration?r.dateEnv.add(d,n.duration):r.getDefaultEventEnd(e.allDay,d),u=t.createEventInstance(c.defId,{start:d,end:g});return{def:c,instance:u}}(e.dateSpan,r.dragMeta,l),d.mutatedEvents=t.eventTupleToStore(s),(c=!t.isInteractionValid(d,l))&&(d.mutatedEvents=t.createEmptyEventStore(),s=null))),r.displayDrag(l,d),a.setMirrorIsVisible(n||!s||!document.querySelector(".fc-mirror")),c?t.disableCursor():t.enableCursor(),n||(a.setMirrorNeedsRevert(!s),r.receivingCalendar=l,r.droppableEvent=s)},this.handleDragEnd=function(e){var n=r,o=n.receivingCalendar,a=n.droppableEvent;if(r.clearDrag(),o&&a){var l=r.hitDragging.finalHit,s=l.component.context.view,c=r.dragMeta,d=i({},o.buildDatePointApi(l.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s});o.publiclyTrigger("drop",[d]),c.create&&(o.dispatch({type:"MERGE_EVENTS",eventStore:t.eventTupleToStore(a)}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instance.instanceId}),o.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(o,a.def,a.instance),view:s}]))}r.receivingCalendar=null,r.droppableEvent=null};var o=this.hitDragging=new m(e,t.interactionSettingsStore);o.requireInitial=!1,o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=n}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta(e)):(n=function(e,n){var r=t.config.dataAttrPrefix,i=(r?r+"-":"")+n;return e.getAttribute("data-"+i)||""}(e,"event"),r=n?JSON.parse(n):{create:!1},t.parseDragMeta(r));var n,r},e.prototype.displayDrag=function(e,t){var n=this.receivingCalendar;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingCalendar&&this.receivingCalendar.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,n){var r=n.opt("dropAccept");return"function"==typeof r?r(e):"string"!=typeof r||!r||Boolean(t.elementMatches(e,r))},e}();t.config.dataAttrPrefix="";var C=function(){function e(e,n){var r=this;void 0===n&&(n={}),this.handlePointerDown=function(e){var n=r.dragging,i=r.settings,o=i.minDistance,a=i.longPressDelay;n.minDistance=null!=o?o:e.isTouch?0:t.globalDefaults.eventDragMinDistance,n.delay=e.isTouch?null!=a?a:t.globalDefaults.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&r.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&r.dragging.mirror.getMirrorEl().classList.add("fc-selected")},this.settings=n;var i=this.dragging=new f(e);i.touchScrollAllowed=!1,null!=n.itemSelector&&(i.pointer.selector=n.itemSelector),null!=n.appendTo&&(i.mirror.parentNode=n.appendTo),i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),new b(i,n.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),R=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new s(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return r(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(t.ElementDragging),I=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new R(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new b(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),P=t.createPlugin({componentInteractions:[y,D,w,T],calendarInteractions:[M],elementDraggingImpl:f});e.Draggable=C,e.FeaturefulElementDragging=f,e.PointerDragging=s,e.ThirdPartyDraggable=I,e.default=P,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/interaction/package.json b/library/fullcalendar/packages/interaction/package.json
deleted file mode 100644
index b3dc22110..000000000
--- a/library/fullcalendar/packages/interaction/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/interaction",
- "version": "4.4.2",
- "title": "FullCalendar Interaction Plugin",
- "description": "Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/editable",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/list/LICENSE.txt b/library/fullcalendar/packages/list/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/list/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/list/README.md b/library/fullcalendar/packages/list/README.md
deleted file mode 100644
index 1122d7f9d..000000000
--- a/library/fullcalendar/packages/list/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar List View Plugin
-
-View your events as a bulleted list
-
-[View the docs &raquo;](https://fullcalendar.io/docs/list-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/list/index.global.js b/library/fullcalendar/packages/list/index.global.js
new file mode 100644
index 000000000..1922e7d93
--- /dev/null
+++ b/library/fullcalendar/packages/list/index.global.js
@@ -0,0 +1,332 @@
+/*!
+FullCalendar List View Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/list-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.List = (function (exports, core, internal$1, preact) {
+ 'use strict';
+
+ class ListViewHeaderRow extends internal$1.BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.state = {
+ textId: internal$1.getUniqueDomId(),
+ };
+ }
+ render() {
+ let { theme, dateEnv, options, viewApi } = this.context;
+ let { cellId, dayDate, todayRange } = this.props;
+ let { textId } = this.state;
+ let dayMeta = internal$1.getDateMeta(dayDate, todayRange);
+ // will ever be falsy?
+ let text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : '';
+ // will ever be falsy? also, BAD NAME "alt"
+ let sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : '';
+ let renderProps = Object.assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId,
+ text,
+ sideText, navLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: internal$1.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta);
+ // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
+ return (preact.createElement(internal$1.ContentContainer, { elTag: "tr", elClasses: [
+ 'fc-list-day',
+ ...internal$1.getDayClassNames(dayMeta, theme),
+ ], elAttrs: {
+ 'data-date': internal$1.formatDayString(dayDate),
+ }, renderProps: renderProps, generatorName: "dayHeaderContent", generator: options.dayHeaderContent || renderInnerContent, classNameGenerator: options.dayHeaderClassNames, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, (InnerContent) => ( // TODO: force-hide top border based on :first-child
+ preact.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId },
+ preact.createElement(InnerContent, { elTag: "div", elClasses: [
+ 'fc-list-day-cushion',
+ theme.getClass('tableCellShaded'),
+ ] })))));
+ }
+ }
+ function renderInnerContent(props) {
+ return (preact.createElement(preact.Fragment, null,
+ props.text && (preact.createElement("a", Object.assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text)),
+ props.sideText && ( /* not keyboard tabbable */preact.createElement("a", Object.assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText))));
+ }
+
+ const DEFAULT_TIME_FORMAT = internal$1.createFormatter({
+ hour: 'numeric',
+ minute: '2-digit',
+ meridiem: 'short',
+ });
+ class ListViewEventRow extends internal$1.BaseComponent {
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let { seg, timeHeaderId, eventHeaderId, dateHeaderId } = props;
+ let timeFormat = options.eventTimeFormat || DEFAULT_TIME_FORMAT;
+ return (preact.createElement(internal$1.EventContainer, Object.assign({}, props, { elTag: "tr", elClasses: [
+ 'fc-list-event',
+ seg.eventRange.def.url && 'fc-event-forced-url',
+ ], defaultGenerator: () => renderEventInnerContent(seg, context) /* weird */, seg: seg, timeText: "", disableDragging: true, disableResizing: true }), (InnerContent, eventContentArg) => (preact.createElement(preact.Fragment, null,
+ buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId),
+ preact.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" },
+ preact.createElement("span", { className: "fc-list-event-dot", style: {
+ borderColor: eventContentArg.borderColor || eventContentArg.backgroundColor,
+ } })),
+ preact.createElement(InnerContent, { elTag: "td", elClasses: ['fc-list-event-title'], elAttrs: { headers: `${eventHeaderId} ${dateHeaderId}` } })))));
+ }
+ }
+ function renderEventInnerContent(seg, context) {
+ let interactiveAttrs = internal$1.getSegAnchorAttrs(seg, context);
+ return (preact.createElement("a", Object.assign({}, interactiveAttrs), seg.eventRange.def.title));
+ }
+ function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) {
+ let { options } = context;
+ if (options.displayEventTime !== false) {
+ let eventDef = seg.eventRange.def;
+ let eventInstance = seg.eventRange.instance;
+ let doAllDay = false;
+ let timeText;
+ if (eventDef.allDay) {
+ doAllDay = true;
+ }
+ else if (internal$1.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
+ if (seg.isStart) {
+ timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
+ }
+ else if (seg.isEnd) {
+ timeText = internal$1.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
+ }
+ else {
+ doAllDay = true;
+ }
+ }
+ else {
+ timeText = internal$1.buildSegTimeText(seg, timeFormat, context);
+ }
+ if (doAllDay) {
+ let renderProps = {
+ text: context.options.allDayText,
+ view: context.viewApi,
+ };
+ return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: ['fc-list-event-time'], elAttrs: {
+ headers: `${timeHeaderId} ${dateHeaderId}`,
+ }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }));
+ }
+ return (preact.createElement("td", { className: "fc-list-event-time" }, timeText));
+ }
+ return null;
+ }
+ function renderAllDayInner(renderProps) {
+ return renderProps.text;
+ }
+
+ /*
+ Responsible for the scroller, and forwarding event-related actions into the "grid".
+ */
+ class ListView extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.computeDateVars = internal$1.memoize(computeDateVars);
+ this.eventStoreToSegs = internal$1.memoize(this._eventStoreToSegs);
+ this.state = {
+ timeHeaderId: internal$1.getUniqueDomId(),
+ eventHeaderId: internal$1.getUniqueDomId(),
+ dateHeaderIdRoot: internal$1.getUniqueDomId(),
+ };
+ this.setRootEl = (rootEl) => {
+ if (rootEl) {
+ this.context.registerInteractiveComponent(this, {
+ el: rootEl,
+ });
+ }
+ else {
+ this.context.unregisterInteractiveComponent(this);
+ }
+ };
+ }
+ render() {
+ let { props, context } = this;
+ let { dayDates, dayRanges } = this.computeDateVars(props.dateProfile);
+ let eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
+ return (preact.createElement(internal$1.ViewContainer, { elRef: this.setRootEl, elClasses: [
+ 'fc-list',
+ context.theme.getClass('table'),
+ context.options.stickyHeaderDates !== false ?
+ 'fc-list-sticky' :
+ '',
+ ], viewSpec: context.viewSpec },
+ preact.createElement(internal$1.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
+ this.renderSegList(eventSegs, dayDates) :
+ this.renderEmptyMessage())));
+ }
+ renderEmptyMessage() {
+ let { options, viewApi } = this.context;
+ let renderProps = {
+ text: options.noEventsText,
+ view: viewApi,
+ };
+ return (preact.createElement(internal$1.ContentContainer, { elTag: "div", elClasses: ['fc-list-empty'], renderProps: renderProps, generatorName: "noEventsContent", generator: options.noEventsContent || renderNoEventsInner, classNameGenerator: options.noEventsClassNames, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-list-empty-cushion'] }))));
+ }
+ renderSegList(allSegs, dayDates) {
+ let { theme, options } = this.context;
+ let { timeHeaderId, eventHeaderId, dateHeaderIdRoot } = this.state;
+ let segsByDay = groupSegsByDay(allSegs); // sparse array
+ return (preact.createElement(internal$1.NowTimer, { unit: "day" }, (nowDate, todayRange) => {
+ let innerNodes = [];
+ for (let dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) {
+ let daySegs = segsByDay[dayIndex];
+ if (daySegs) { // sparse array, so might be undefined
+ let dayStr = internal$1.formatDayString(dayDates[dayIndex]);
+ let dateHeaderId = dateHeaderIdRoot + '-' + dayStr;
+ // append a day header
+ innerNodes.push(preact.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange }));
+ daySegs = internal$1.sortEventSegs(daySegs, options.eventOrder);
+ for (let seg of daySegs) {
+ innerNodes.push(preact.createElement(ListViewEventRow, Object.assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, internal$1.getSegMeta(seg, todayRange, nowDate))));
+ }
+ }
+ }
+ return (preact.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
+ preact.createElement("thead", null,
+ preact.createElement("tr", null,
+ preact.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint),
+ preact.createElement("th", { scope: "col", "aria-hidden": true }),
+ preact.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))),
+ preact.createElement("tbody", null, innerNodes)));
+ }));
+ }
+ _eventStoreToSegs(eventStore, eventUiBases, dayRanges) {
+ return this.eventRangesToSegs(internal$1.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
+ }
+ eventRangesToSegs(eventRanges, dayRanges) {
+ let segs = [];
+ for (let eventRange of eventRanges) {
+ segs.push(...this.eventRangeToSegs(eventRange, dayRanges));
+ }
+ return segs;
+ }
+ eventRangeToSegs(eventRange, dayRanges) {
+ let { dateEnv } = this.context;
+ let { nextDayThreshold } = this.context.options;
+ let range = eventRange.range;
+ let allDay = eventRange.def.allDay;
+ let dayIndex;
+ let segRange;
+ let seg;
+ let segs = [];
+ for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) {
+ segRange = internal$1.intersectRanges(range, dayRanges[dayIndex]);
+ if (segRange) {
+ seg = {
+ component: this,
+ eventRange,
+ start: segRange.start,
+ end: segRange.end,
+ isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
+ isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
+ dayIndex,
+ };
+ segs.push(seg);
+ // detect when range won't go fully into the next day,
+ // and mutate the latest seg to the be the end.
+ if (!seg.isEnd && !allDay &&
+ dayIndex + 1 < dayRanges.length &&
+ range.end <
+ dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
+ seg.end = range.end;
+ seg.isEnd = true;
+ break;
+ }
+ }
+ }
+ return segs;
+ }
+ }
+ function renderNoEventsInner(renderProps) {
+ return renderProps.text;
+ }
+ function computeDateVars(dateProfile) {
+ let dayStart = internal$1.startOfDay(dateProfile.renderRange.start);
+ let viewEnd = dateProfile.renderRange.end;
+ let dayDates = [];
+ let dayRanges = [];
+ while (dayStart < viewEnd) {
+ dayDates.push(dayStart);
+ dayRanges.push({
+ start: dayStart,
+ end: internal$1.addDays(dayStart, 1),
+ });
+ dayStart = internal$1.addDays(dayStart, 1);
+ }
+ return { dayDates, dayRanges };
+ }
+ // Returns a sparse array of arrays, segs grouped by their dayIndex
+ function groupSegsByDay(segs) {
+ let segsByDay = []; // sparse array
+ let i;
+ let seg;
+ for (i = 0; i < segs.length; i += 1) {
+ seg = segs[i];
+ (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
+ .push(seg);
+ }
+ return segsByDay;
+ }
+
+ const OPTION_REFINERS = {
+ listDayFormat: createFalsableFormatter,
+ listDaySideFormat: createFalsableFormatter,
+ noEventsClassNames: internal$1.identity,
+ noEventsContent: internal$1.identity,
+ noEventsDidMount: internal$1.identity,
+ noEventsWillUnmount: internal$1.identity,
+ // noEventsText is defined in base options
+ };
+ function createFalsableFormatter(input) {
+ return input === false ? null : internal$1.createFormatter(input);
+ }
+
+ var css_248z = ":root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:\"\";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}";
+ internal$1.injectStyles(css_248z);
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/list',
+ optionRefiners: OPTION_REFINERS,
+ views: {
+ list: {
+ component: ListView,
+ buttonTextKey: 'list',
+ listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' }, // like "January 1, 2016"
+ },
+ listDay: {
+ type: 'list',
+ duration: { days: 1 },
+ listDayFormat: { weekday: 'long' }, // day-of-week is all we need. full date is probably in headerToolbar
+ },
+ listWeek: {
+ type: 'list',
+ duration: { weeks: 1 },
+ listDayFormat: { weekday: 'long' },
+ listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' },
+ },
+ listMonth: {
+ type: 'list',
+ duration: { month: 1 },
+ listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
+ },
+ listYear: {
+ type: 'list',
+ duration: { year: 1 },
+ listDaySideFormat: { weekday: 'long' }, // day-of-week is nice-to-have
+ },
+ },
+ });
+
+ var internal = {
+ __proto__: null,
+ ListView: ListView
+ };
+
+ core.globalPlugins.push(plugin);
+
+ exports.Internal = internal;
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact);
diff --git a/library/fullcalendar/packages/list/index.global.min.js b/library/fullcalendar/packages/list/index.global.min.js
new file mode 100644
index 000000000..3fbd91434
--- /dev/null
+++ b/library/fullcalendar/packages/list/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar List View Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/list-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.List=function(e,t,n,a){"use strict";class i extends n.BaseComponent{constructor(){super(...arguments),this.state={textId:n.getUniqueDomId()}}render(){let{theme:e,dateEnv:t,options:i,viewApi:s}=this.context,{cellId:l,dayDate:o,todayRange:d}=this.props,{textId:c}=this.state,f=n.getDateMeta(o,d),g=i.listDayFormat?t.format(o,i.listDayFormat):"",u=i.listDaySideFormat?t.format(o,i.listDaySideFormat):"",m=Object.assign({date:t.toDate(o),view:s,textId:c,text:g,sideText:u,navLinkAttrs:n.buildNavLinkAttrs(this.context,o),sideNavLinkAttrs:n.buildNavLinkAttrs(this.context,o,"day",!1)},f);return a.createElement(n.ContentContainer,{elTag:"tr",elClasses:["fc-list-day",...n.getDayClassNames(f,e)],elAttrs:{"data-date":n.formatDayString(o)},renderProps:m,generatorName:"dayHeaderContent",generator:i.dayHeaderContent||r,classNameGenerator:i.dayHeaderClassNames,didMount:i.dayHeaderDidMount,willUnmount:i.dayHeaderWillUnmount},t=>a.createElement("th",{scope:"colgroup",colSpan:3,id:l,"aria-labelledby":c},a.createElement(t,{elTag:"div",elClasses:["fc-list-day-cushion",e.getClass("tableCellShaded")]})))}}function r(e){return a.createElement(a.Fragment,null,e.text&&a.createElement("a",Object.assign({id:e.textId,className:"fc-list-day-text"},e.navLinkAttrs),e.text),e.sideText&&a.createElement("a",Object.assign({"aria-hidden":!0,className:"fc-list-day-side-text"},e.sideNavLinkAttrs),e.sideText))}const s=n.createFormatter({hour:"numeric",minute:"2-digit",meridiem:"short"});class l extends n.BaseComponent{render(){let{props:e,context:t}=this,{options:i}=t,{seg:r,timeHeaderId:l,eventHeaderId:d,dateHeaderId:c}=e,f=i.eventTimeFormat||s;return a.createElement(n.EventContainer,Object.assign({},e,{elTag:"tr",elClasses:["fc-list-event",r.eventRange.def.url&&"fc-event-forced-url"],defaultGenerator:()=>function(e,t){let i=n.getSegAnchorAttrs(e,t);return a.createElement("a",Object.assign({},i),e.eventRange.def.title)}(r,t),seg:r,timeText:"",disableDragging:!0,disableResizing:!0}),(e,i)=>a.createElement(a.Fragment,null,function(e,t,i,r,s){let{options:l}=i;if(!1!==l.displayEventTime){let d,c=e.eventRange.def,f=e.eventRange.instance,g=!1;if(c.allDay?g=!0:n.isMultiDayRange(e.eventRange.range)?e.isStart?d=n.buildSegTimeText(e,t,i,null,null,f.range.start,e.end):e.isEnd?d=n.buildSegTimeText(e,t,i,null,null,e.start,f.range.end):g=!0:d=n.buildSegTimeText(e,t,i),g){let e={text:i.options.allDayText,view:i.viewApi};return a.createElement(n.ContentContainer,{elTag:"td",elClasses:["fc-list-event-time"],elAttrs:{headers:`${r} ${s}`},renderProps:e,generatorName:"allDayContent",generator:l.allDayContent||o,classNameGenerator:l.allDayClassNames,didMount:l.allDayDidMount,willUnmount:l.allDayWillUnmount})}return a.createElement("td",{className:"fc-list-event-time"},d)}return null}(r,f,t,l,c),a.createElement("td",{"aria-hidden":!0,className:"fc-list-event-graphic"},a.createElement("span",{className:"fc-list-event-dot",style:{borderColor:i.borderColor||i.backgroundColor}})),a.createElement(e,{elTag:"td",elClasses:["fc-list-event-title"],elAttrs:{headers:`${d} ${c}`}})))}}function o(e){return e.text}class d extends n.DateComponent{constructor(){super(...arguments),this.computeDateVars=n.memoize(f),this.eventStoreToSegs=n.memoize(this._eventStoreToSegs),this.state={timeHeaderId:n.getUniqueDomId(),eventHeaderId:n.getUniqueDomId(),dateHeaderIdRoot:n.getUniqueDomId()},this.setRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e}):this.context.unregisterInteractiveComponent(this)}}render(){let{props:e,context:t}=this,{dayDates:i,dayRanges:r}=this.computeDateVars(e.dateProfile),s=this.eventStoreToSegs(e.eventStore,e.eventUiBases,r);return a.createElement(n.ViewContainer,{elRef:this.setRootEl,elClasses:["fc-list",t.theme.getClass("table"),!1!==t.options.stickyHeaderDates?"fc-list-sticky":""],viewSpec:t.viewSpec},a.createElement(n.Scroller,{liquid:!e.isHeightAuto,overflowX:e.isHeightAuto?"visible":"hidden",overflowY:e.isHeightAuto?"visible":"auto"},s.length>0?this.renderSegList(s,i):this.renderEmptyMessage()))}renderEmptyMessage(){let{options:e,viewApi:t}=this.context,i={text:e.noEventsText,view:t};return a.createElement(n.ContentContainer,{elTag:"div",elClasses:["fc-list-empty"],renderProps:i,generatorName:"noEventsContent",generator:e.noEventsContent||c,classNameGenerator:e.noEventsClassNames,didMount:e.noEventsDidMount,willUnmount:e.noEventsWillUnmount},e=>a.createElement(e,{elTag:"div",elClasses:["fc-list-empty-cushion"]}))}renderSegList(e,t){let{theme:r,options:s}=this.context,{timeHeaderId:o,eventHeaderId:d,dateHeaderIdRoot:c}=this.state,f=function(e){let t,n,a=[];for(t=0;t<e.length;t+=1)n=e[t],(a[n.dayIndex]||(a[n.dayIndex]=[])).push(n);return a}(e);return a.createElement(n.NowTimer,{unit:"day"},(e,g)=>{let u=[];for(let r=0;r<f.length;r+=1){let m=f[r];if(m){let f=n.formatDayString(t[r]),h=c+"-"+f;u.push(a.createElement(i,{key:f,cellId:h,dayDate:t[r],todayRange:g})),m=n.sortEventSegs(m,s.eventOrder);for(let t of m)u.push(a.createElement(l,Object.assign({key:f+":"+t.eventRange.instance.instanceId,seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,timeHeaderId:o,eventHeaderId:d,dateHeaderId:h},n.getSegMeta(t,g,e))))}}return a.createElement("table",{className:"fc-list-table "+r.getClass("table")},a.createElement("thead",null,a.createElement("tr",null,a.createElement("th",{scope:"col",id:o},s.timeHint),a.createElement("th",{scope:"col","aria-hidden":!0}),a.createElement("th",{scope:"col",id:d},s.eventHint))),a.createElement("tbody",null,u))})}_eventStoreToSegs(e,t,a){return this.eventRangesToSegs(n.sliceEventStore(e,t,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,a)}eventRangesToSegs(e,t){let n=[];for(let a of e)n.push(...this.eventRangeToSegs(a,t));return n}eventRangeToSegs(e,t){let a,i,r,{dateEnv:s}=this.context,{nextDayThreshold:l}=this.context.options,o=e.range,d=e.def.allDay,c=[];for(a=0;a<t.length;a+=1)if(i=n.intersectRanges(o,t[a]),i&&(r={component:this,eventRange:e,start:i.start,end:i.end,isStart:e.isStart&&i.start.valueOf()===o.start.valueOf(),isEnd:e.isEnd&&i.end.valueOf()===o.end.valueOf(),dayIndex:a},c.push(r),!r.isEnd&&!d&&a+1<t.length&&o.end<s.add(t[a+1].start,l))){r.end=o.end,r.isEnd=!0;break}return c}}function c(e){return e.text}function f(e){let t=n.startOfDay(e.renderRange.start),a=e.renderRange.end,i=[],r=[];for(;t<a;)i.push(t),r.push({start:t,end:n.addDays(t,1)}),t=n.addDays(t,1);return{dayDates:i,dayRanges:r}}const g={listDayFormat:u,listDaySideFormat:u,noEventsClassNames:n.identity,noEventsContent:n.identity,noEventsDidMount:n.identity,noEventsWillUnmount:n.identity};function u(e){return!1===e?null:n.createFormatter(e)}n.injectStyles(':root{--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-theme-standard .fc-list{border:1px solid var(--fc-border-color)}.fc .fc-list-empty{align-items:center;background-color:var(--fc-neutral-bg-color);display:flex;height:100%;justify-content:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{border-style:hidden;width:100%}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{background:var(--fc-page-bg-color);position:sticky;top:0}.fc .fc-list-table thead{left:-10000px;position:absolute}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{clear:both;content:"";display:table}.fc-theme-standard .fc-list-day-cushion{background-color:var(--fc-neutral-bg-color)}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:var(--fc-list-event-hover-bg-color)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{border:calc(var(--fc-list-event-dot-width)/2) solid var(--fc-event-border-color);border-radius:calc(var(--fc-list-event-dot-width)/2);box-sizing:content-box;display:inline-block;height:0;width:0}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}');var m=t.createPlugin({name:"@fullcalendar/list",optionRefiners:g,views:{list:{component:d,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}}),h={__proto__:null,ListView:d};return t.globalPlugins.push(m),e.Internal=h,e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact); \ No newline at end of file
diff --git a/library/fullcalendar/packages/list/main.css b/library/fullcalendar/packages/list/main.css
deleted file mode 100644
index 6af9bb70c..000000000
--- a/library/fullcalendar/packages/list/main.css
+++ /dev/null
@@ -1,118 +0,0 @@
-/* List View
---------------------------------------------------------------------------------------------------*/
-/* possibly reusable */
-.fc-event-dot {
- display: inline-block;
- width: 10px;
- height: 10px;
- border-radius: 5px;
-}
-
-/* view wrapper */
-.fc-rtl .fc-list-view {
- direction: rtl;
- /* unlike core views, leverage browser RTL */
-}
-
-.fc-list-view {
- border-width: 1px;
- border-style: solid;
-}
-
-/* table resets */
-.fc .fc-list-table {
- table-layout: auto;
- /* for shrinkwrapping cell content */
-}
-
-.fc-list-table td {
- border-width: 1px 0 0;
- padding: 8px 14px;
-}
-
-.fc-list-table tr:first-child td {
- border-top-width: 0;
-}
-
-/* day headings with the list */
-.fc-list-heading {
- border-bottom-width: 1px;
-}
-
-.fc-list-heading td {
- font-weight: bold;
-}
-
-.fc-ltr .fc-list-heading-main {
- float: left;
-}
-
-.fc-ltr .fc-list-heading-alt {
- float: right;
-}
-
-.fc-rtl .fc-list-heading-main {
- float: right;
-}
-
-.fc-rtl .fc-list-heading-alt {
- float: left;
-}
-
-/* event list items */
-.fc-list-item.fc-has-url {
- cursor: pointer;
- /* whole row will be clickable */
-}
-
-.fc-list-item-marker,
-.fc-list-item-time {
- white-space: nowrap;
- width: 1px;
-}
-
-/* make the dot closer to the event title */
-.fc-ltr .fc-list-item-marker {
- padding-right: 0;
-}
-
-.fc-rtl .fc-list-item-marker {
- padding-left: 0;
-}
-
-.fc-list-item-title a {
- /* every event title cell has an <a> tag */
- text-decoration: none;
- color: inherit;
-}
-
-.fc-list-item-title a[href]:hover {
- /* hover effect only on titles with hrefs */
- text-decoration: underline;
-}
-
-/* message when no events */
-.fc-list-empty-wrap2 {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
-}
-
-.fc-list-empty-wrap1 {
- width: 100%;
- height: 100%;
- display: table;
-}
-
-.fc-list-empty {
- display: table-cell;
- vertical-align: middle;
- text-align: center;
-}
-
-.fc-unthemed .fc-list-empty {
- /* theme will provide own background */
- background-color: #eee;
-}
diff --git a/library/fullcalendar/packages/list/main.d.ts b/library/fullcalendar/packages/list/main.d.ts
deleted file mode 100644
index ecbb49679..000000000
--- a/library/fullcalendar/packages/list/main.d.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/list' {
- import ListView from '@fullcalendar/list/ListView';
- export { ListView };
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
-declare module '@fullcalendar/list/ListView' {
- import { View, ViewProps, ScrollComponent, DateMarker, DateRange, ComponentContext, EventUiHash, EventRenderRange, EventStore, Seg, ViewSpec } from '@fullcalendar/core';
- export { ListView as default, ListView };
- class ListView extends View {
- scroller: ScrollComponent;
- contentEl: HTMLElement;
- dayDates: DateMarker[];
- constructor(viewSpec: ViewSpec, parentEl: HTMLElement);
- firstContext(context: ComponentContext): void;
- render(props: ViewProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- updateSize(isResize: any, viewHeight: any, isAuto: any): void;
- computeScrollerHeight(viewHeight: any): number;
- _eventStoreToSegs(eventStore: EventStore, eventUiBases: EventUiHash, dayRanges: DateRange[]): Seg[];
- eventRangesToSegs(eventRanges: EventRenderRange[], dayRanges: DateRange[]): any[];
- eventRangeToSegs(eventRange: EventRenderRange, dayRanges: DateRange[]): any[];
- renderEmptyMessage(): void;
- renderSegList(allSegs: any): void;
- groupSegsByDay(segs: any): any[];
- buildDayHeaderRow(dayDate: any): HTMLTableRowElement;
- }
-}
-
diff --git a/library/fullcalendar/packages/list/main.esm.js b/library/fullcalendar/packages/list/main.esm.js
deleted file mode 100644
index a03226977..000000000
--- a/library/fullcalendar/packages/list/main.esm.js
+++ /dev/null
@@ -1,348 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { getAllDayHtml, isMultiDayRange, htmlEscape, FgEventRenderer, memoize, memoizeRendering, ScrollComponent, subtractInnerElHeight, sliceEventStore, intersectRanges, htmlToElement, createFormatter, createElement, buildGotoAnchorHtml, View, startOfDay, addDays, createPlugin } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var ListEventRenderer = /** @class */ (function (_super) {
- __extends(ListEventRenderer, _super);
- function ListEventRenderer(listView) {
- var _this = _super.call(this) || this;
- _this.listView = listView;
- return _this;
- }
- ListEventRenderer.prototype.attachSegs = function (segs) {
- if (!segs.length) {
- this.listView.renderEmptyMessage();
- }
- else {
- this.listView.renderSegList(segs);
- }
- };
- ListEventRenderer.prototype.detachSegs = function () {
- };
- // generates the HTML for a single event row
- ListEventRenderer.prototype.renderSegHtml = function (seg) {
- var _a = this.context, theme = _a.theme, options = _a.options;
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventInstance = eventRange.instance;
- var eventUi = eventRange.ui;
- var url = eventDef.url;
- var classes = ['fc-list-item'].concat(eventUi.classNames);
- var bgColor = eventUi.backgroundColor;
- var timeHtml;
- if (eventDef.allDay) {
- timeHtml = getAllDayHtml(options);
- }
- else if (isMultiDayRange(eventRange.range)) {
- if (seg.isStart) {
- timeHtml = htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
- ));
- }
- else if (seg.isEnd) {
- timeHtml = htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
- ));
- }
- else { // inner segment that lasts the whole day
- timeHtml = getAllDayHtml(options);
- }
- }
- else {
- // Display the normal time text for the *event's* times
- timeHtml = htmlEscape(this.getTimeText(eventRange));
- }
- if (url) {
- classes.push('fc-has-url');
- }
- return '<tr class="' + classes.join(' ') + '">' +
- (this.displayEventTime ?
- '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
- (timeHtml || '') +
- '</td>' :
- '') +
- '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
- '<span class="fc-event-dot"' +
- (bgColor ?
- ' style="background-color:' + bgColor + '"' :
- '') +
- '></span>' +
- '</td>' +
- '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
- '<a' + (url ? ' href="' + htmlEscape(url) + '"' : '') + '>' +
- htmlEscape(eventDef.title || '') +
- '</a>' +
- '</td>' +
- '</tr>';
- };
- // like "4:00am"
- ListEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- meridiem: 'short'
- };
- };
- return ListEventRenderer;
-}(FgEventRenderer));
-
-/*
-Responsible for the scroller, and forwarding event-related actions into the "grid".
-*/
-var ListView = /** @class */ (function (_super) {
- __extends(ListView, _super);
- function ListView(viewSpec, parentEl) {
- var _this = _super.call(this, viewSpec, parentEl) || this;
- _this.computeDateVars = memoize(computeDateVars);
- _this.eventStoreToSegs = memoize(_this._eventStoreToSegs);
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
- _this.renderContent = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [_this.renderSkeleton]);
- return _this;
- }
- ListView.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.el
- // TODO: make aware that it doesn't do Hits
- });
- };
- ListView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
- this.dayDates = dayDates;
- this.renderSkeleton(context);
- this.renderContent(context, this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
- };
- ListView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- this.renderContent.unrender();
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- ListView.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- this.el.classList.add('fc-list-view');
- var listViewClassNames = (theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
- for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
- var listViewClassName = listViewClassNames_1[_i];
- if (listViewClassName) { // in case input was empty string
- this.el.classList.add(listViewClassName);
- }
- }
- this.scroller = new ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- this.el.appendChild(this.scroller.el);
- this.contentEl = this.scroller.el; // shortcut
- };
- ListView.prototype._unrenderSkeleton = function () {
- // TODO: remove classNames
- this.scroller.destroy(); // will remove the Grid too
- };
- ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
- this.eventRenderer.computeSizes(isResize);
- this.eventRenderer.assignSizes(isResize);
- this.scroller.clear(); // sets height to 'auto' and clears overflow
- if (!isAuto) {
- this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
- }
- };
- ListView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
- return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.nextDayThreshold).fg, dayRanges);
- };
- ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
- }
- return segs;
- };
- ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
- var _a = this.context, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
- var range = eventRange.range;
- var allDay = eventRange.def.allDay;
- var dayIndex;
- var segRange;
- var seg;
- var segs = [];
- for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
- segRange = intersectRanges(range, dayRanges[dayIndex]);
- if (segRange) {
- seg = {
- component: this,
- eventRange: eventRange,
- start: segRange.start,
- end: segRange.end,
- isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
- isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
- dayIndex: dayIndex
- };
- segs.push(seg);
- // detect when range won't go fully into the next day,
- // and mutate the latest seg to the be the end.
- if (!seg.isEnd && !allDay &&
- dayIndex + 1 < dayRanges.length &&
- range.end <
- dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
- seg.end = range.end;
- seg.isEnd = true;
- break;
- }
- }
- }
- return segs;
- };
- ListView.prototype.renderEmptyMessage = function () {
- this.contentEl.innerHTML =
- '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
- '<div class="fc-list-empty-wrap1">' +
- '<div class="fc-list-empty">' +
- htmlEscape(this.context.options.noEventsMessage) +
- '</div>' +
- '</div>' +
- '</div>';
- };
- // called by ListEventRenderer
- ListView.prototype.renderSegList = function (allSegs) {
- var theme = this.context.theme;
- var segsByDay = this.groupSegsByDay(allSegs); // sparse array
- var dayIndex;
- var daySegs;
- var i;
- var tableEl = htmlToElement('<table class="fc-list-table ' + theme.getClass('tableList') + '"><tbody></tbody></table>');
- var tbodyEl = tableEl.querySelector('tbody');
- for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
- daySegs = segsByDay[dayIndex];
- if (daySegs) { // sparse array, so might be undefined
- // append a day header
- tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
- daySegs = this.eventRenderer.sortEventSegs(daySegs);
- for (i = 0; i < daySegs.length; i++) {
- tbodyEl.appendChild(daySegs[i].el); // append event row
- }
- }
- }
- this.contentEl.innerHTML = '';
- this.contentEl.appendChild(tableEl);
- };
- // Returns a sparse array of arrays, segs grouped by their dayIndex
- ListView.prototype.groupSegsByDay = function (segs) {
- var segsByDay = []; // sparse array
- var i;
- var seg;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
- .push(seg);
- }
- return segsByDay;
- };
- // generates the HTML for the day headers that live amongst the event rows
- ListView.prototype.buildDayHeaderRow = function (dayDate) {
- var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var mainFormat = createFormatter(options.listDayFormat); // TODO: cache
- var altFormat = createFormatter(options.listDayAltFormat); // TODO: cache
- return createElement('tr', {
- className: 'fc-list-heading',
- 'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
- }, '<td class="' + (theme.getClass('tableListHeading') ||
- theme.getClass('widgetHeader')) + '" colspan="3">' +
- (mainFormat ?
- buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-main' }, htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
- ) :
- '') +
- (altFormat ?
- buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-alt' }, htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
- ) :
- '') +
- '</td>');
- };
- return ListView;
-}(View));
-ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
-function computeDateVars(dateProfile) {
- var dayStart = startOfDay(dateProfile.renderRange.start);
- var viewEnd = dateProfile.renderRange.end;
- var dayDates = [];
- var dayRanges = [];
- while (dayStart < viewEnd) {
- dayDates.push(dayStart);
- dayRanges.push({
- start: dayStart,
- end: addDays(dayStart, 1)
- });
- dayStart = addDays(dayStart, 1);
- }
- return { dayDates: dayDates, dayRanges: dayRanges };
-}
-
-var main = createPlugin({
- views: {
- list: {
- class: ListView,
- buttonTextKey: 'list',
- listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
- },
- listDay: {
- type: 'list',
- duration: { days: 1 },
- listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
- },
- listWeek: {
- type: 'list',
- duration: { weeks: 1 },
- listDayFormat: { weekday: 'long' },
- listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
- },
- listMonth: {
- type: 'list',
- duration: { month: 1 },
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
- },
- listYear: {
- type: 'list',
- duration: { year: 1 },
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
- }
- }
-});
-
-export default main;
-export { ListView };
diff --git a/library/fullcalendar/packages/list/main.js b/library/fullcalendar/packages/list/main.js
deleted file mode 100644
index 84b12341e..000000000
--- a/library/fullcalendar/packages/list/main.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var ListEventRenderer = /** @class */ (function (_super) {
- __extends(ListEventRenderer, _super);
- function ListEventRenderer(listView) {
- var _this = _super.call(this) || this;
- _this.listView = listView;
- return _this;
- }
- ListEventRenderer.prototype.attachSegs = function (segs) {
- if (!segs.length) {
- this.listView.renderEmptyMessage();
- }
- else {
- this.listView.renderSegList(segs);
- }
- };
- ListEventRenderer.prototype.detachSegs = function () {
- };
- // generates the HTML for a single event row
- ListEventRenderer.prototype.renderSegHtml = function (seg) {
- var _a = this.context, theme = _a.theme, options = _a.options;
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventInstance = eventRange.instance;
- var eventUi = eventRange.ui;
- var url = eventDef.url;
- var classes = ['fc-list-item'].concat(eventUi.classNames);
- var bgColor = eventUi.backgroundColor;
- var timeHtml;
- if (eventDef.allDay) {
- timeHtml = core.getAllDayHtml(options);
- }
- else if (core.isMultiDayRange(eventRange.range)) {
- if (seg.isStart) {
- timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
- ));
- }
- else if (seg.isEnd) {
- timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
- ));
- }
- else { // inner segment that lasts the whole day
- timeHtml = core.getAllDayHtml(options);
- }
- }
- else {
- // Display the normal time text for the *event's* times
- timeHtml = core.htmlEscape(this.getTimeText(eventRange));
- }
- if (url) {
- classes.push('fc-has-url');
- }
- return '<tr class="' + classes.join(' ') + '">' +
- (this.displayEventTime ?
- '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
- (timeHtml || '') +
- '</td>' :
- '') +
- '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
- '<span class="fc-event-dot"' +
- (bgColor ?
- ' style="background-color:' + bgColor + '"' :
- '') +
- '></span>' +
- '</td>' +
- '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
- '<a' + (url ? ' href="' + core.htmlEscape(url) + '"' : '') + '>' +
- core.htmlEscape(eventDef.title || '') +
- '</a>' +
- '</td>' +
- '</tr>';
- };
- // like "4:00am"
- ListEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- meridiem: 'short'
- };
- };
- return ListEventRenderer;
- }(core.FgEventRenderer));
-
- /*
- Responsible for the scroller, and forwarding event-related actions into the "grid".
- */
- var ListView = /** @class */ (function (_super) {
- __extends(ListView, _super);
- function ListView(viewSpec, parentEl) {
- var _this = _super.call(this, viewSpec, parentEl) || this;
- _this.computeDateVars = core.memoize(computeDateVars);
- _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs);
- _this.renderSkeleton = core.memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
- _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [_this.renderSkeleton]);
- return _this;
- }
- ListView.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.el
- // TODO: make aware that it doesn't do Hits
- });
- };
- ListView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
- this.dayDates = dayDates;
- this.renderSkeleton(context);
- this.renderContent(context, this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
- };
- ListView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- this.renderContent.unrender();
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- ListView.prototype._renderSkeleton = function (context) {
- var theme = context.theme;
- this.el.classList.add('fc-list-view');
- var listViewClassNames = (theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
- for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
- var listViewClassName = listViewClassNames_1[_i];
- if (listViewClassName) { // in case input was empty string
- this.el.classList.add(listViewClassName);
- }
- }
- this.scroller = new core.ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- this.el.appendChild(this.scroller.el);
- this.contentEl = this.scroller.el; // shortcut
- };
- ListView.prototype._unrenderSkeleton = function () {
- // TODO: remove classNames
- this.scroller.destroy(); // will remove the Grid too
- };
- ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
- this.eventRenderer.computeSizes(isResize);
- this.eventRenderer.assignSizes(isResize);
- this.scroller.clear(); // sets height to 'auto' and clears overflow
- if (!isAuto) {
- this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
- }
- };
- ListView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
- return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.nextDayThreshold).fg, dayRanges);
- };
- ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
- var segs = [];
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
- var eventRange = eventRanges_1[_i];
- segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
- }
- return segs;
- };
- ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
- var _a = this.context, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
- var range = eventRange.range;
- var allDay = eventRange.def.allDay;
- var dayIndex;
- var segRange;
- var seg;
- var segs = [];
- for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
- segRange = core.intersectRanges(range, dayRanges[dayIndex]);
- if (segRange) {
- seg = {
- component: this,
- eventRange: eventRange,
- start: segRange.start,
- end: segRange.end,
- isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
- isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
- dayIndex: dayIndex
- };
- segs.push(seg);
- // detect when range won't go fully into the next day,
- // and mutate the latest seg to the be the end.
- if (!seg.isEnd && !allDay &&
- dayIndex + 1 < dayRanges.length &&
- range.end <
- dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
- seg.end = range.end;
- seg.isEnd = true;
- break;
- }
- }
- }
- return segs;
- };
- ListView.prototype.renderEmptyMessage = function () {
- this.contentEl.innerHTML =
- '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
- '<div class="fc-list-empty-wrap1">' +
- '<div class="fc-list-empty">' +
- core.htmlEscape(this.context.options.noEventsMessage) +
- '</div>' +
- '</div>' +
- '</div>';
- };
- // called by ListEventRenderer
- ListView.prototype.renderSegList = function (allSegs) {
- var theme = this.context.theme;
- var segsByDay = this.groupSegsByDay(allSegs); // sparse array
- var dayIndex;
- var daySegs;
- var i;
- var tableEl = core.htmlToElement('<table class="fc-list-table ' + theme.getClass('tableList') + '"><tbody></tbody></table>');
- var tbodyEl = tableEl.querySelector('tbody');
- for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
- daySegs = segsByDay[dayIndex];
- if (daySegs) { // sparse array, so might be undefined
- // append a day header
- tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
- daySegs = this.eventRenderer.sortEventSegs(daySegs);
- for (i = 0; i < daySegs.length; i++) {
- tbodyEl.appendChild(daySegs[i].el); // append event row
- }
- }
- }
- this.contentEl.innerHTML = '';
- this.contentEl.appendChild(tableEl);
- };
- // Returns a sparse array of arrays, segs grouped by their dayIndex
- ListView.prototype.groupSegsByDay = function (segs) {
- var segsByDay = []; // sparse array
- var i;
- var seg;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
- .push(seg);
- }
- return segsByDay;
- };
- // generates the HTML for the day headers that live amongst the event rows
- ListView.prototype.buildDayHeaderRow = function (dayDate) {
- var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var mainFormat = core.createFormatter(options.listDayFormat); // TODO: cache
- var altFormat = core.createFormatter(options.listDayAltFormat); // TODO: cache
- return core.createElement('tr', {
- className: 'fc-list-heading',
- 'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
- }, '<td class="' + (theme.getClass('tableListHeading') ||
- theme.getClass('widgetHeader')) + '" colspan="3">' +
- (mainFormat ?
- core.buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
- ) :
- '') +
- (altFormat ?
- core.buildGotoAnchorHtml(options, dateEnv, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
- ) :
- '') +
- '</td>');
- };
- return ListView;
- }(core.View));
- ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
- function computeDateVars(dateProfile) {
- var dayStart = core.startOfDay(dateProfile.renderRange.start);
- var viewEnd = dateProfile.renderRange.end;
- var dayDates = [];
- var dayRanges = [];
- while (dayStart < viewEnd) {
- dayDates.push(dayStart);
- dayRanges.push({
- start: dayStart,
- end: core.addDays(dayStart, 1)
- });
- dayStart = core.addDays(dayStart, 1);
- }
- return { dayDates: dayDates, dayRanges: dayRanges };
- }
-
- var main = core.createPlugin({
- views: {
- list: {
- class: ListView,
- buttonTextKey: 'list',
- listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
- },
- listDay: {
- type: 'list',
- duration: { days: 1 },
- listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
- },
- listWeek: {
- type: 'list',
- duration: { weeks: 1 },
- listDayFormat: { weekday: 'long' },
- listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
- },
- listMonth: {
- type: 'list',
- duration: { month: 1 },
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
- },
- listYear: {
- type: 'list',
- duration: { year: 1 },
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
- }
- }
- });
-
- exports.ListView = ListView;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/list/main.min.css b/library/fullcalendar/packages/list/main.min.css
deleted file mode 100644
index 18446f442..000000000
--- a/library/fullcalendar/packages/list/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee} \ No newline at end of file
diff --git a/library/fullcalendar/packages/list/main.min.js b/library/fullcalendar/packages/list/main.min.js
deleted file mode 100644
index a765dd139..000000000
--- a/library/fullcalendar/packages/list/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarList={},e.FullCalendar)}(this,(function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var s=function(e){function n(t){var n=e.call(this)||this;return n.listView=t,n}return r(n,e),n.prototype.attachSegs=function(e){e.length?this.listView.renderSegList(e):this.listView.renderEmptyMessage()},n.prototype.detachSegs=function(){},n.prototype.renderSegHtml=function(e){var n,r=this.context,s=r.theme,o=r.options,i=e.eventRange,a=i.def,l=i.instance,d=i.ui,c=a.url,p=["fc-list-item"].concat(d.classNames),h=d.backgroundColor;return n=a.allDay?t.getAllDayHtml(o):t.isMultiDayRange(i.range)?e.isStart?t.htmlEscape(this._getTimeText(l.range.start,e.end,!1)):e.isEnd?t.htmlEscape(this._getTimeText(e.start,l.range.end,!1)):t.getAllDayHtml(o):t.htmlEscape(this.getTimeText(i)),c&&p.push("fc-has-url"),'<tr class="'+p.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+s.getClass("widgetContent")+'">'+(n||"")+"</td>":"")+'<td class="fc-list-item-marker '+s.getClass("widgetContent")+'"><span class="fc-event-dot"'+(h?' style="background-color:'+h+'"':"")+'></span></td><td class="fc-list-item-title '+s.getClass("widgetContent")+'"><a'+(c?' href="'+t.htmlEscape(c)+'"':"")+">"+t.htmlEscape(a.title||"")+"</a></td></tr>"},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},n}(t.FgEventRenderer),o=function(e){function n(n,r){var o=e.call(this,n,r)||this;o.computeDateVars=t.memoize(i),o.eventStoreToSegs=t.memoize(o._eventStoreToSegs),o.renderSkeleton=t.memoizeRendering(o._renderSkeleton,o._unrenderSkeleton);var a=o.eventRenderer=new s(o);return o.renderContent=t.memoizeRendering(a.renderSegs.bind(a),a.unrender.bind(a),[o.renderSkeleton]),o}return r(n,e),n.prototype.firstContext=function(e){e.calendar.registerInteractiveComponent(this,{el:this.el})},n.prototype.render=function(t,n){e.prototype.render.call(this,t,n);var r=this.computeDateVars(t.dateProfile),s=r.dayDates,o=r.dayRanges;this.dayDates=s,this.renderSkeleton(n),this.renderContent(n,this.eventStoreToSegs(t.eventStore,t.eventUiBases,o))},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSkeleton.unrender(),this.renderContent.unrender(),this.context.calendar.unregisterInteractiveComponent(this)},n.prototype._renderSkeleton=function(e){var n=e.theme;this.el.classList.add("fc-list-view");for(var r=0,s=(n.getClass("listView")||"").split(" ");r<s.length;r++){var o=s[r];o&&this.el.classList.add(o)}this.scroller=new t.ScrollComponent("hidden","auto"),this.el.appendChild(this.scroller.el),this.contentEl=this.scroller.el},n.prototype._unrenderSkeleton=function(){this.scroller.destroy()},n.prototype.updateSize=function(t,n,r){e.prototype.updateSize.call(this,t,n,r),this.eventRenderer.computeSizes(t),this.eventRenderer.assignSizes(t),this.scroller.clear(),r||this.scroller.setHeight(this.computeScrollerHeight(n))},n.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},n.prototype._eventStoreToSegs=function(e,n,r){return this.eventRangesToSegs(t.sliceEventStore(e,n,this.props.dateProfile.activeRange,this.context.nextDayThreshold).fg,r)},n.prototype.eventRangesToSegs=function(e,t){for(var n=[],r=0,s=e;r<s.length;r++){var o=s[r];n.push.apply(n,this.eventRangeToSegs(o,t))}return n},n.prototype.eventRangeToSegs=function(e,n){var r,s,o,i=this.context,a=i.dateEnv,l=i.nextDayThreshold,d=e.range,c=e.def.allDay,p=[];for(r=0;r<n.length;r++)if((s=t.intersectRanges(d,n[r]))&&(o={component:this,eventRange:e,start:s.start,end:s.end,isStart:e.isStart&&s.start.valueOf()===d.start.valueOf(),isEnd:e.isEnd&&s.end.valueOf()===d.end.valueOf(),dayIndex:r},p.push(o),!o.isEnd&&!c&&r+1<n.length&&d.end<a.add(n[r+1].start,l))){o.end=d.end,o.isEnd=!0;break}return p},n.prototype.renderEmptyMessage=function(){this.contentEl.innerHTML='<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+t.htmlEscape(this.context.options.noEventsMessage)+"</div></div></div>"},n.prototype.renderSegList=function(e){var n,r,s,o=this.context.theme,i=this.groupSegsByDay(e),a=t.htmlToElement('<table class="fc-list-table '+o.getClass("tableList")+'"><tbody></tbody></table>'),l=a.querySelector("tbody");for(n=0;n<i.length;n++)if(r=i[n])for(l.appendChild(this.buildDayHeaderRow(this.dayDates[n])),r=this.eventRenderer.sortEventSegs(r),s=0;s<r.length;s++)l.appendChild(r[s].el);this.contentEl.innerHTML="",this.contentEl.appendChild(a)},n.prototype.groupSegsByDay=function(e){var t,n,r=[];for(t=0;t<e.length;t++)(r[(n=e[t]).dayIndex]||(r[n.dayIndex]=[])).push(n);return r},n.prototype.buildDayHeaderRow=function(e){var n=this.context,r=n.theme,s=n.dateEnv,o=n.options,i=t.createFormatter(o.listDayFormat),a=t.createFormatter(o.listDayAltFormat);return t.createElement("tr",{className:"fc-list-heading","data-date":s.formatIso(e,{omitTime:!0})},'<td class="'+(r.getClass("tableListHeading")||r.getClass("widgetHeader"))+'" colspan="3">'+(i?t.buildGotoAnchorHtml(o,s,e,{class:"fc-list-heading-main"},t.htmlEscape(s.format(e,i))):"")+(a?t.buildGotoAnchorHtml(o,s,e,{class:"fc-list-heading-alt"},t.htmlEscape(s.format(e,a))):"")+"</td>")},n}(t.View);function i(e){for(var n=t.startOfDay(e.renderRange.start),r=e.renderRange.end,s=[],o=[];n<r;)s.push(n),o.push({start:n,end:t.addDays(n,1)}),n=t.addDays(n,1);return{dayDates:s,dayRanges:o}}o.prototype.fgSegSelector=".fc-list-item";var a=t.createPlugin({views:{list:{class:o,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDayAltFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDayAltFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDayAltFormat:{weekday:"long"}}}});e.ListView=o,e.default=a,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/list/package.json b/library/fullcalendar/packages/list/package.json
deleted file mode 100644
index 90b0dcde1..000000000
--- a/library/fullcalendar/packages/list/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "@fullcalendar/list",
- "version": "4.4.2",
- "title": "FullCalendar List View Plugin",
- "description": "View your events as a bulleted list",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/list-view",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/luxon/LICENSE.txt b/library/fullcalendar/packages/luxon/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/luxon/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/luxon/README.md b/library/fullcalendar/packages/luxon/README.md
deleted file mode 100644
index 4c42b505e..000000000
--- a/library/fullcalendar/packages/luxon/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Luxon Plugin
-
-A connector to the Luxon date library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/luxon-plugin)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/luxon/main.d.ts b/library/fullcalendar/packages/luxon/main.d.ts
deleted file mode 100644
index 54f016ddd..000000000
--- a/library/fullcalendar/packages/luxon/main.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../luxon
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/luxon' {
- import { DateTime as LuxonDateTime, Duration as LuxonDuration } from 'luxon';
- import { Calendar, Duration } from '@fullcalendar/core';
- export function toDateTime(date: Date, calendar: Calendar): LuxonDateTime;
- export function toDuration(duration: Duration, calendar: Calendar): LuxonDuration;
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/luxon/main.esm.js b/library/fullcalendar/packages/luxon/main.esm.js
deleted file mode 100644
index 43eea0f96..000000000
--- a/library/fullcalendar/packages/luxon/main.esm.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { DateTime, Duration } from 'luxon';
-import { createPlugin, Calendar, NamedTimeZoneImpl } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-function toDateTime(date, calendar) {
- if (!(calendar instanceof Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return DateTime.fromJSDate(date, {
- zone: calendar.dateEnv.timeZone,
- locale: calendar.dateEnv.locale.codes[0]
- });
-}
-function toDuration(duration, calendar) {
- if (!(calendar instanceof Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
-}
-var LuxonNamedTimeZone = /** @class */ (function (_super) {
- __extends(LuxonNamedTimeZone, _super);
- function LuxonNamedTimeZone() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
- return arrayToLuxon(a, this.timeZoneName).offset;
- };
- LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
- return luxonToArray(DateTime.fromMillis(ms, {
- zone: this.timeZoneName
- }));
- };
- return LuxonNamedTimeZone;
-}(NamedTimeZoneImpl));
-function formatWithCmdStr(cmdStr, arg) {
- var cmd = parseCmdStr(cmdStr);
- if (arg.end) {
- var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
- var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
- return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
- }
- return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
-}
-var main = createPlugin({
- cmdFormatter: formatWithCmdStr,
- namedTimeZonedImpl: LuxonNamedTimeZone
-});
-function luxonToArray(datetime) {
- return [
- datetime.year,
- datetime.month - 1,
- datetime.day,
- datetime.hour,
- datetime.minute,
- datetime.second,
- datetime.millisecond
- ];
-}
-function arrayToLuxon(arr, timeZone, locale) {
- return DateTime.fromObject({
- zone: timeZone,
- locale: locale,
- year: arr[0],
- month: arr[1] + 1,
- day: arr[2],
- hour: arr[3],
- minute: arr[4],
- second: arr[5],
- millisecond: arr[6]
- });
-}
-function parseCmdStr(cmdStr) {
- var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
- if (parts) {
- var middle = parseCmdStr(parts[2]);
- return {
- head: parts[1],
- middle: middle,
- tail: parts[3],
- whole: parts[1] + middle.whole + parts[3]
- };
- }
- else {
- return {
- head: null,
- middle: null,
- tail: null,
- whole: cmdStr
- };
- }
-}
-function formatRange(cmd, formatStart, formatEnd, separator) {
- if (cmd.middle) {
- var startHead = formatStart(cmd.head);
- var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var startTail = formatStart(cmd.tail);
- var endHead = formatEnd(cmd.head);
- var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var endTail = formatEnd(cmd.tail);
- if (startHead === endHead && startTail === endTail) {
- return startHead +
- (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
- startTail;
- }
- }
- var startWhole = formatStart(cmd.whole);
- var endWhole = formatEnd(cmd.whole);
- if (startWhole === endWhole) {
- return startWhole;
- }
- else {
- return startWhole + separator + endWhole;
- }
-}
-
-export default main;
-export { toDateTime, toDuration };
diff --git a/library/fullcalendar/packages/luxon/main.js b/library/fullcalendar/packages/luxon/main.js
deleted file mode 100644
index ade582b2b..000000000
--- a/library/fullcalendar/packages/luxon/main.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon'), require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', 'luxon', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarLuxon = {}, global.luxon, global.FullCalendar));
-}(this, function (exports, luxon, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- function toDateTime(date, calendar) {
- if (!(calendar instanceof core.Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return luxon.DateTime.fromJSDate(date, {
- zone: calendar.dateEnv.timeZone,
- locale: calendar.dateEnv.locale.codes[0]
- });
- }
- function toDuration(duration, calendar) {
- if (!(calendar instanceof core.Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return luxon.Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
- }
- var LuxonNamedTimeZone = /** @class */ (function (_super) {
- __extends(LuxonNamedTimeZone, _super);
- function LuxonNamedTimeZone() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
- return arrayToLuxon(a, this.timeZoneName).offset;
- };
- LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
- return luxonToArray(luxon.DateTime.fromMillis(ms, {
- zone: this.timeZoneName
- }));
- };
- return LuxonNamedTimeZone;
- }(core.NamedTimeZoneImpl));
- function formatWithCmdStr(cmdStr, arg) {
- var cmd = parseCmdStr(cmdStr);
- if (arg.end) {
- var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
- var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
- return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
- }
- return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
- }
- var main = core.createPlugin({
- cmdFormatter: formatWithCmdStr,
- namedTimeZonedImpl: LuxonNamedTimeZone
- });
- function luxonToArray(datetime) {
- return [
- datetime.year,
- datetime.month - 1,
- datetime.day,
- datetime.hour,
- datetime.minute,
- datetime.second,
- datetime.millisecond
- ];
- }
- function arrayToLuxon(arr, timeZone, locale) {
- return luxon.DateTime.fromObject({
- zone: timeZone,
- locale: locale,
- year: arr[0],
- month: arr[1] + 1,
- day: arr[2],
- hour: arr[3],
- minute: arr[4],
- second: arr[5],
- millisecond: arr[6]
- });
- }
- function parseCmdStr(cmdStr) {
- var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
- if (parts) {
- var middle = parseCmdStr(parts[2]);
- return {
- head: parts[1],
- middle: middle,
- tail: parts[3],
- whole: parts[1] + middle.whole + parts[3]
- };
- }
- else {
- return {
- head: null,
- middle: null,
- tail: null,
- whole: cmdStr
- };
- }
- }
- function formatRange(cmd, formatStart, formatEnd, separator) {
- if (cmd.middle) {
- var startHead = formatStart(cmd.head);
- var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var startTail = formatStart(cmd.tail);
- var endHead = formatEnd(cmd.head);
- var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var endTail = formatEnd(cmd.tail);
- if (startHead === endHead && startTail === endTail) {
- return startHead +
- (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
- startTail;
- }
- }
- var startWhole = formatStart(cmd.whole);
- var endWhole = formatEnd(cmd.whole);
- if (startWhole === endWhole) {
- return startWhole;
- }
- else {
- return startWhole + separator + endWhole;
- }
- }
-
- exports.default = main;
- exports.toDateTime = toDateTime;
- exports.toDuration = toDuration;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/luxon/main.min.js b/library/fullcalendar/packages/luxon/main.min.js
deleted file mode 100644
index 111695f30..000000000
--- a/library/fullcalendar/packages/luxon/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("luxon"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","luxon","@fullcalendar/core"],t):t((e=e||self).FullCalendarLuxon={},e.luxon,e.FullCalendar)}(this,(function(e,t,n){"use strict";var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};var r=function(){return(r=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)};var a=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(n,e),n.prototype.offsetForArray=function(e){return l(e,this.timeZoneName).offset},n.prototype.timestampToArray=function(e){return[(n=t.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,n.month-1,n.day,n.hour,n.minute,n.second,n.millisecond];var n},n}(n.NamedTimeZoneImpl);var i=n.createPlugin({cmdFormatter:function(e,t){var n=function e(t){var n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){var o=e(n[2]);return{head:n[1],middle:o,tail:n[3],whole:n[1]+o.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){var o=l(t.start.array,t.timeZone,t.localeCodes[0]),r=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,o,r){if(t.middle){var a=n(t.head),i=e(t.middle,n,o,r),l=n(t.tail),u=o(t.head),c=e(t.middle,n,o,r),d=o(t.tail);if(a===u&&l===d)return a+(i===c?i:i+r+c)+l}var f=n(t.whole),m=o(t.whole);return f===m?f:f+r+m}(n,o.toFormat.bind(o),r.toFormat.bind(r),t.separator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:a});function l(e,n,o){return t.DateTime.fromObject({zone:n,locale:o,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}e.default=i,e.toDateTime=function(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.DateTime.fromJSDate(e,{zone:o.dateEnv.timeZone,locale:o.dateEnv.locale.codes[0]})},e.toDuration=function(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.Duration.fromObject(r({},e,{locale:o.dateEnv.locale.codes[0]}))},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/luxon/package.json b/library/fullcalendar/packages/luxon/package.json
deleted file mode 100644
index a7e2bbfcb..000000000
--- a/library/fullcalendar/packages/luxon/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "@fullcalendar/luxon",
- "version": "4.4.2",
- "title": "FullCalendar Luxon Plugin",
- "description": "A connector to the Luxon date library",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/luxon-plugin",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0",
- "luxon": "^1.12.1"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/luxon1/index.global.js b/library/fullcalendar/packages/luxon1/index.global.js
new file mode 100644
index 000000000..b5ecd339b
--- /dev/null
+++ b/library/fullcalendar/packages/luxon1/index.global.js
@@ -0,0 +1,128 @@
+/*!
+FullCalendar Luxon 1 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/luxon1
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Luxon = (function (exports, core, luxon, internal) {
+ 'use strict';
+
+ function toLuxonDateTime(date, calendar) {
+ if (!(calendar instanceof internal.CalendarImpl)) {
+ throw new Error('must supply a CalendarApi instance');
+ }
+ let { dateEnv } = calendar.getCurrentData();
+ return luxon.DateTime.fromJSDate(date, {
+ zone: dateEnv.timeZone,
+ locale: dateEnv.locale.codes[0],
+ });
+ }
+ function toLuxonDuration(duration, calendar) {
+ if (!(calendar instanceof internal.CalendarImpl)) {
+ throw new Error('must supply a CalendarApi instance');
+ }
+ let { dateEnv } = calendar.getCurrentData();
+ return luxon.Duration.fromObject(Object.assign(Object.assign({}, duration), { locale: dateEnv.locale.codes[0] }));
+ }
+ // Internal Utils
+ function luxonToArray(datetime) {
+ return [
+ datetime.year,
+ datetime.month - 1,
+ datetime.day,
+ datetime.hour,
+ datetime.minute,
+ datetime.second,
+ datetime.millisecond,
+ ];
+ }
+ function arrayToLuxon(arr, timeZone, locale) {
+ return luxon.DateTime.fromObject({
+ zone: timeZone,
+ locale,
+ year: arr[0],
+ month: arr[1] + 1,
+ day: arr[2],
+ hour: arr[3],
+ minute: arr[4],
+ second: arr[5],
+ millisecond: arr[6],
+ });
+ }
+
+ class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl {
+ offsetForArray(a) {
+ return arrayToLuxon(a, this.timeZoneName).offset;
+ }
+ timestampToArray(ms) {
+ return luxonToArray(luxon.DateTime.fromMillis(ms, {
+ zone: this.timeZoneName,
+ }));
+ }
+ }
+
+ function formatWithCmdStr(cmdStr, arg) {
+ let cmd = parseCmdStr(cmdStr);
+ if (arg.end) {
+ let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
+ let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
+ return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator);
+ }
+ return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
+ }
+ function parseCmdStr(cmdStr) {
+ let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
+ if (parts) {
+ let middle = parseCmdStr(parts[2]);
+ return {
+ head: parts[1],
+ middle,
+ tail: parts[3],
+ whole: parts[1] + middle.whole + parts[3],
+ };
+ }
+ return {
+ head: null,
+ middle: null,
+ tail: null,
+ whole: cmdStr,
+ };
+ }
+ function formatRange(cmd, formatStart, formatEnd, separator) {
+ if (cmd.middle) {
+ let startHead = formatStart(cmd.head);
+ let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let startTail = formatStart(cmd.tail);
+ let endHead = formatEnd(cmd.head);
+ let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let endTail = formatEnd(cmd.tail);
+ if (startHead === endHead && startTail === endTail) {
+ return startHead +
+ (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+ startTail;
+ }
+ }
+ let startWhole = formatStart(cmd.whole);
+ let endWhole = formatEnd(cmd.whole);
+ if (startWhole === endWhole) {
+ return startWhole;
+ }
+ return startWhole + separator + endWhole;
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/luxon',
+ cmdFormatter: formatWithCmdStr,
+ namedTimeZonedImpl: LuxonNamedTimeZone,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+ exports.toLuxonDateTime = toLuxonDateTime;
+ exports.toLuxonDuration = toLuxonDuration;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, luxon, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/luxon1/index.global.min.js b/library/fullcalendar/packages/luxon1/index.global.min.js
new file mode 100644
index 000000000..90903b544
--- /dev/null
+++ b/library/fullcalendar/packages/luxon1/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Luxon 1 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/luxon1
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Luxon=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({zone:t,locale:a,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(Object.assign(Object.assign({},e),{locale:l.locale.codes[0]}))},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/luxon2/index.global.js b/library/fullcalendar/packages/luxon2/index.global.js
new file mode 100644
index 000000000..01b55f85a
--- /dev/null
+++ b/library/fullcalendar/packages/luxon2/index.global.js
@@ -0,0 +1,131 @@
+/*!
+FullCalendar Luxon 2 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/luxon2
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Luxon2 = (function (exports, core, luxon, internal) {
+ 'use strict';
+
+ function toLuxonDateTime(date, calendar) {
+ if (!(calendar instanceof internal.CalendarImpl)) {
+ throw new Error('must supply a CalendarApi instance');
+ }
+ let { dateEnv } = calendar.getCurrentData();
+ return luxon.DateTime.fromJSDate(date, {
+ zone: dateEnv.timeZone,
+ locale: dateEnv.locale.codes[0],
+ });
+ }
+ function toLuxonDuration(duration, calendar) {
+ if (!(calendar instanceof internal.CalendarImpl)) {
+ throw new Error('must supply a CalendarApi instance');
+ }
+ let { dateEnv } = calendar.getCurrentData();
+ return luxon.Duration.fromObject(duration, {
+ locale: dateEnv.locale.codes[0],
+ });
+ }
+ // Internal Utils
+ function luxonToArray(datetime) {
+ return [
+ datetime.year,
+ datetime.month - 1,
+ datetime.day,
+ datetime.hour,
+ datetime.minute,
+ datetime.second,
+ datetime.millisecond,
+ ];
+ }
+ function arrayToLuxon(arr, timeZone, locale) {
+ return luxon.DateTime.fromObject({
+ year: arr[0],
+ month: arr[1] + 1,
+ day: arr[2],
+ hour: arr[3],
+ minute: arr[4],
+ second: arr[5],
+ millisecond: arr[6],
+ }, {
+ locale,
+ zone: timeZone,
+ });
+ }
+
+ class LuxonNamedTimeZone extends internal.NamedTimeZoneImpl {
+ offsetForArray(a) {
+ return arrayToLuxon(a, this.timeZoneName).offset;
+ }
+ timestampToArray(ms) {
+ return luxonToArray(luxon.DateTime.fromMillis(ms, {
+ zone: this.timeZoneName,
+ }));
+ }
+ }
+
+ function formatWithCmdStr(cmdStr, arg) {
+ let cmd = parseCmdStr(cmdStr);
+ if (arg.end) {
+ let start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
+ let end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
+ return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.defaultSeparator);
+ }
+ return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
+ }
+ function parseCmdStr(cmdStr) {
+ let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
+ if (parts) {
+ let middle = parseCmdStr(parts[2]);
+ return {
+ head: parts[1],
+ middle,
+ tail: parts[3],
+ whole: parts[1] + middle.whole + parts[3],
+ };
+ }
+ return {
+ head: null,
+ middle: null,
+ tail: null,
+ whole: cmdStr,
+ };
+ }
+ function formatRange(cmd, formatStart, formatEnd, separator) {
+ if (cmd.middle) {
+ let startHead = formatStart(cmd.head);
+ let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let startTail = formatStart(cmd.tail);
+ let endHead = formatEnd(cmd.head);
+ let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let endTail = formatEnd(cmd.tail);
+ if (startHead === endHead && startTail === endTail) {
+ return startHead +
+ (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+ startTail;
+ }
+ }
+ let startWhole = formatStart(cmd.whole);
+ let endWhole = formatEnd(cmd.whole);
+ if (startWhole === endWhole) {
+ return startWhole;
+ }
+ return startWhole + separator + endWhole;
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/luxon2',
+ cmdFormatter: formatWithCmdStr,
+ namedTimeZonedImpl: LuxonNamedTimeZone,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+ exports.toLuxonDateTime = toLuxonDateTime;
+ exports.toLuxonDuration = toLuxonDuration;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, luxon, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/luxon2/index.global.min.js b/library/fullcalendar/packages/luxon2/index.global.min.js
new file mode 100644
index 000000000..c639271a8
--- /dev/null
+++ b/library/fullcalendar/packages/luxon2/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Luxon 2 Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/luxon2
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Luxon2=function(e,t,n,a){"use strict";function l(e,t,a){return n.DateTime.fromObject({year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]},{locale:a,zone:t})}class r extends a.NamedTimeZoneImpl{offsetForArray(e){return l(e,this.timeZoneName).offset}timestampToArray(e){return[(t=n.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,t.month-1,t.day,t.hour,t.minute,t.second,t.millisecond];var t}}var o=t.createPlugin({name:"@fullcalendar/luxon2",cmdFormatter:function(e,t){let n=function e(t){let n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){let t=e(n[2]);return{head:n[1],middle:t,tail:n[3],whole:n[1]+t.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=l(t.start.array,t.timeZone,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,a,l){if(t.middle){let r=n(t.head),o=e(t.middle,n,a,l),i=n(t.tail),u=a(t.head),d=e(t.middle,n,a,l),m=a(t.tail);if(r===u&&i===m)return r+(o===d?o:o+l+d)+i}let r=n(t.whole),o=a(t.whole);if(r===o)return r;return r+l+o}(n,e.toFormat.bind(e),a.toFormat.bind(a),t.defaultSeparator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:r});return t.globalPlugins.push(o),e.default=o,e.toLuxonDateTime=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.DateTime.fromJSDate(e,{zone:l.timeZone,locale:l.locale.codes[0]})},e.toLuxonDuration=function(e,t){if(!(t instanceof a.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return n.Duration.fromObject(e,{locale:l.locale.codes[0]})},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,luxon,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/moment-timezone/LICENSE.txt b/library/fullcalendar/packages/moment-timezone/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/moment-timezone/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/moment-timezone/README.md b/library/fullcalendar/packages/moment-timezone/README.md
deleted file mode 100644
index e84412a2a..000000000
--- a/library/fullcalendar/packages/moment-timezone/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Moment Timezone Plugin
-
-A connector to the moment-timezone library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins#moment-timezone)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/moment-timezone/index.global.js b/library/fullcalendar/packages/moment-timezone/index.global.js
new file mode 100644
index 000000000..dd736679d
--- /dev/null
+++ b/library/fullcalendar/packages/moment-timezone/index.global.js
@@ -0,0 +1,35 @@
+/*!
+FullCalendar Moment Timezone Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.MomentTimezone = (function (exports, core, moment, internal) {
+ 'use strict';
+
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
+
+ var moment__default = /*#__PURE__*/_interopDefault(moment);
+
+ class MomentNamedTimeZone extends internal.NamedTimeZoneImpl {
+ offsetForArray(a) {
+ return moment__default["default"].tz(a, this.timeZoneName).utcOffset();
+ }
+ timestampToArray(ms) {
+ return moment__default["default"].tz(ms, this.timeZoneName).toArray();
+ }
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/moment-timezone',
+ namedTimeZonedImpl: MomentNamedTimeZone,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, moment, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/moment-timezone/index.global.min.js b/library/fullcalendar/packages/moment-timezone/index.global.min.js
new file mode 100644
index 000000000..0cd5ac444
--- /dev/null
+++ b/library/fullcalendar/packages/moment-timezone/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Moment Timezone Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/moment-timezone-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.MomentTimezone=function(e,t,n,a){"use strict";function l(e){return e&&e.__esModule?e:{default:e}}var r=l(n);class u extends a.NamedTimeZoneImpl{offsetForArray(e){return r.default.tz(e,this.timeZoneName).utcOffset()}timestampToArray(e){return r.default.tz(e,this.timeZoneName).toArray()}}var m=t.createPlugin({name:"@fullcalendar/moment-timezone",namedTimeZonedImpl:u});return t.globalPlugins.push(m),e.default=m,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/moment-timezone/main.d.ts b/library/fullcalendar/packages/moment-timezone/main.d.ts
deleted file mode 100644
index eb0a165b1..000000000
--- a/library/fullcalendar/packages/moment-timezone/main.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../moment-timezone/builds/moment-timezone-with-data
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/moment-timezone' {
- import 'moment-timezone/builds/moment-timezone-with-data';
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/moment-timezone/main.esm.js b/library/fullcalendar/packages/moment-timezone/main.esm.js
deleted file mode 100644
index df11b1f46..000000000
--- a/library/fullcalendar/packages/moment-timezone/main.esm.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import * as momentNs from 'moment';
-import 'moment-timezone/builds/moment-timezone-with-data';
-import { createPlugin, NamedTimeZoneImpl } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var moment = momentNs; // the directly callable function
-var MomentNamedTimeZone = /** @class */ (function (_super) {
- __extends(MomentNamedTimeZone, _super);
- function MomentNamedTimeZone() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- MomentNamedTimeZone.prototype.offsetForArray = function (a) {
- return moment.tz(a, this.timeZoneName).utcOffset();
- };
- MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
- return moment.tz(ms, this.timeZoneName).toArray();
- };
- return MomentNamedTimeZone;
-}(NamedTimeZoneImpl));
-var main = createPlugin({
- namedTimeZonedImpl: MomentNamedTimeZone
-});
-
-export default main;
diff --git a/library/fullcalendar/packages/moment-timezone/main.js b/library/fullcalendar/packages/moment-timezone/main.js
deleted file mode 100644
index 4d9e2df13..000000000
--- a/library/fullcalendar/packages/moment-timezone/main.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('moment-timezone/builds/moment-timezone-with-data'), require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', 'moment', 'moment-timezone/builds/moment-timezone-with-data', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarMomentTimezone = {}, global.moment, global.moment, global.FullCalendar));
-}(this, function (exports, momentNs, momentTimezoneWithData, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var moment = momentNs; // the directly callable function
- var MomentNamedTimeZone = /** @class */ (function (_super) {
- __extends(MomentNamedTimeZone, _super);
- function MomentNamedTimeZone() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- MomentNamedTimeZone.prototype.offsetForArray = function (a) {
- return moment.tz(a, this.timeZoneName).utcOffset();
- };
- MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
- return moment.tz(ms, this.timeZoneName).toArray();
- };
- return MomentNamedTimeZone;
- }(core.NamedTimeZoneImpl));
- var main = core.createPlugin({
- namedTimeZonedImpl: MomentNamedTimeZone
- });
-
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/moment-timezone/main.min.js b/library/fullcalendar/packages/moment-timezone/main.min.js
deleted file mode 100644
index 11f30fdec..000000000
--- a/library/fullcalendar/packages/moment-timezone/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("moment-timezone/builds/moment-timezone-with-data"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","moment-timezone/builds/moment-timezone-with-data","@fullcalendar/core"],t):t((e=e||self).FullCalendarMomentTimezone={},e.moment,e.moment,e.FullCalendar)}(this,(function(e,t,n,o){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};var i=t,u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t.prototype.offsetForArray=function(e){return i.tz(e,this.timeZoneName).utcOffset()},t.prototype.timestampToArray=function(e){return i.tz(e,this.timeZoneName).toArray()},t}(o.NamedTimeZoneImpl),m=o.createPlugin({namedTimeZonedImpl:u});e.default=m,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/moment-timezone/package.json b/library/fullcalendar/packages/moment-timezone/package.json
deleted file mode 100644
index 8bc56ec09..000000000
--- a/library/fullcalendar/packages/moment-timezone/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "@fullcalendar/moment-timezone",
- "version": "4.4.2",
- "title": "FullCalendar Moment Timezone Plugin",
- "description": "A connector to the moment-timezone library",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/moment-plugins#moment-timezone",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0",
- "moment": "^2.24.0",
- "moment-timezone": "^0.5.25"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/moment/LICENSE.txt b/library/fullcalendar/packages/moment/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/moment/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/moment/README.md b/library/fullcalendar/packages/moment/README.md
deleted file mode 100644
index 854e4367f..000000000
--- a/library/fullcalendar/packages/moment/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Moment Plugin
-
-A connector to the MomentJS date library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/moment/index.global.js b/library/fullcalendar/packages/moment/index.global.js
new file mode 100644
index 000000000..f06c85200
--- /dev/null
+++ b/library/fullcalendar/packages/moment/index.global.js
@@ -0,0 +1,113 @@
+/*!
+FullCalendar Moment Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/moment-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Moment = (function (exports, core, moment, internal) {
+ 'use strict';
+
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
+
+ var moment__default = /*#__PURE__*/_interopDefault(moment);
+
+ function toMoment(date, calendar) {
+ if (!(calendar instanceof internal.CalendarImpl)) {
+ throw new Error('must supply a CalendarApi instance');
+ }
+ let { dateEnv } = calendar.getCurrentData();
+ return convertToMoment(date, dateEnv.timeZone, null, dateEnv.locale.codes[0]);
+ }
+ function toMomentDuration(fcDuration) {
+ return moment__default["default"].duration(fcDuration); // moment accepts all the props that fc.Duration already has!
+ }
+ // Internal Utils
+ function convertToMoment(input, timeZone, timeZoneOffset, locale) {
+ let mom;
+ if (timeZone === 'local') {
+ mom = moment__default["default"](input);
+ }
+ else if (timeZone === 'UTC') {
+ mom = moment__default["default"].utc(input);
+ }
+ else if (moment__default["default"].tz) {
+ mom = moment__default["default"].tz(input, timeZone);
+ }
+ else {
+ mom = moment__default["default"].utc(input);
+ if (timeZoneOffset != null) {
+ mom.utcOffset(timeZoneOffset);
+ }
+ }
+ mom.locale(locale);
+ return mom;
+ }
+
+ function formatWithCmdStr(cmdStr, arg) {
+ let cmd = parseCmdStr(cmdStr);
+ if (arg.end) {
+ let startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
+ let endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
+ return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.defaultSeparator);
+ }
+ return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
+ }
+ function createMomentFormatFunc(mom) {
+ return (cmdStr) => (cmdStr ? mom.format(cmdStr) : '' // because calling with blank string results in ISO8601 :(
+ );
+ }
+ function parseCmdStr(cmdStr) {
+ let parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
+ if (parts) {
+ let middle = parseCmdStr(parts[2]);
+ return {
+ head: parts[1],
+ middle,
+ tail: parts[3],
+ whole: parts[1] + middle.whole + parts[3],
+ };
+ }
+ return {
+ head: null,
+ middle: null,
+ tail: null,
+ whole: cmdStr,
+ };
+ }
+ function formatRange(cmd, formatStart, formatEnd, separator) {
+ if (cmd.middle) {
+ let startHead = formatStart(cmd.head);
+ let startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let startTail = formatStart(cmd.tail);
+ let endHead = formatEnd(cmd.head);
+ let endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+ let endTail = formatEnd(cmd.tail);
+ if (startHead === endHead && startTail === endTail) {
+ return startHead +
+ (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+ startTail;
+ }
+ }
+ let startWhole = formatStart(cmd.whole);
+ let endWhole = formatEnd(cmd.whole);
+ if (startWhole === endWhole) {
+ return startWhole;
+ }
+ return startWhole + separator + endWhole;
+ }
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/moment',
+ cmdFormatter: formatWithCmdStr,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+ exports.toMoment = toMoment;
+ exports.toMomentDuration = toMomentDuration;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, moment, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/moment/index.global.min.js b/library/fullcalendar/packages/moment/index.global.min.js
new file mode 100644
index 000000000..438c642f3
--- /dev/null
+++ b/library/fullcalendar/packages/moment/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Moment Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/moment-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.Moment=function(e,t,l,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var r=a(l);function u(e,t,l,n){let a;return"local"===t?a=r.default(e):"UTC"===t?a=r.default.utc(e):r.default.tz?a=r.default.tz(e,t):(a=r.default.utc(e),null!=l&&a.utcOffset(l)),a.locale(n),a}function o(e){return t=>t?e.format(t):""}var d=t.createPlugin({name:"@fullcalendar/moment",cmdFormatter:function(e,t){let l=function e(t){let l=t.match(/^(.*?)\{(.*)\}(.*)$/);if(l){let t=e(l[2]);return{head:l[1],middle:t,tail:l[3],whole:l[1]+t.whole+l[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){let e=u(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),n=u(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,l,n,a){if(t.middle){let r=l(t.head),u=e(t.middle,l,n,a),o=l(t.tail),d=n(t.head),i=e(t.middle,l,n,a),f=n(t.tail);if(r===d&&o===f)return r+(u===i?u:u+a+i)+o}let r=l(t.whole),u=n(t.whole);if(r===u)return r;return r+a+u}(l,o(e),o(n),t.defaultSeparator)}return u(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(l.whole)}});return t.globalPlugins.push(d),e.default=d,e.toMoment=function(e,t){if(!(t instanceof n.CalendarImpl))throw new Error("must supply a CalendarApi instance");let{dateEnv:l}=t.getCurrentData();return u(e,l.timeZone,null,l.locale.codes[0])},e.toMomentDuration=function(e){return r.default.duration(e)},Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,moment,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/moment/main.d.ts b/library/fullcalendar/packages/moment/main.d.ts
deleted file mode 100644
index cc81dab62..000000000
--- a/library/fullcalendar/packages/moment/main.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../moment
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/moment' {
- import * as momentNs from 'moment';
- import { Calendar, Duration } from '@fullcalendar/core';
- export function toMoment(date: Date, calendar: Calendar): momentNs.Moment;
- export function toDuration(fcDuration: Duration): momentNs.Duration;
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/moment/main.esm.js b/library/fullcalendar/packages/moment/main.esm.js
deleted file mode 100644
index fb97563f3..000000000
--- a/library/fullcalendar/packages/moment/main.esm.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import * as momentNs from 'moment';
-import { createPlugin, Calendar } from '@fullcalendar/core';
-
-var moment = momentNs; // the directly callable function
-function toMoment(date, calendar) {
- if (!(calendar instanceof Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
-}
-function toDuration(fcDuration) {
- return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
-}
-function formatWithCmdStr(cmdStr, arg) {
- var cmd = parseCmdStr(cmdStr);
- if (arg.end) {
- var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
- var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
- return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
- }
- return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
-}
-var main = createPlugin({
- cmdFormatter: formatWithCmdStr
-});
-function createMomentFormatFunc(mom) {
- return function (cmdStr) {
- return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
- };
-}
-function convertToMoment(input, timeZone, timeZoneOffset, locale) {
- var mom;
- if (timeZone === 'local') {
- mom = moment(input);
- }
- else if (timeZone === 'UTC') {
- mom = moment.utc(input);
- }
- else if (moment.tz) {
- mom = moment.tz(input, timeZone);
- }
- else {
- mom = moment.utc(input);
- if (timeZoneOffset != null) {
- mom.utcOffset(timeZoneOffset);
- }
- }
- mom.locale(locale);
- return mom;
-}
-function parseCmdStr(cmdStr) {
- var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
- if (parts) {
- var middle = parseCmdStr(parts[2]);
- return {
- head: parts[1],
- middle: middle,
- tail: parts[3],
- whole: parts[1] + middle.whole + parts[3]
- };
- }
- else {
- return {
- head: null,
- middle: null,
- tail: null,
- whole: cmdStr
- };
- }
-}
-function formatRange(cmd, formatStart, formatEnd, separator) {
- if (cmd.middle) {
- var startHead = formatStart(cmd.head);
- var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var startTail = formatStart(cmd.tail);
- var endHead = formatEnd(cmd.head);
- var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var endTail = formatEnd(cmd.tail);
- if (startHead === endHead && startTail === endTail) {
- return startHead +
- (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
- startTail;
- }
- }
- var startWhole = formatStart(cmd.whole);
- var endWhole = formatEnd(cmd.whole);
- if (startWhole === endWhole) {
- return startWhole;
- }
- else {
- return startWhole + separator + endWhole;
- }
-}
-
-export default main;
-export { toDuration, toMoment };
diff --git a/library/fullcalendar/packages/moment/main.js b/library/fullcalendar/packages/moment/main.js
deleted file mode 100644
index 794bee900..000000000
--- a/library/fullcalendar/packages/moment/main.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', 'moment', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarMoment = {}, global.moment, global.FullCalendar));
-}(this, function (exports, momentNs, core) { 'use strict';
-
- var moment = momentNs; // the directly callable function
- function toMoment(date, calendar) {
- if (!(calendar instanceof core.Calendar)) {
- throw new Error('must supply a Calendar instance');
- }
- return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
- }
- function toDuration(fcDuration) {
- return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
- }
- function formatWithCmdStr(cmdStr, arg) {
- var cmd = parseCmdStr(cmdStr);
- if (arg.end) {
- var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
- var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
- return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
- }
- return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
- }
- var main = core.createPlugin({
- cmdFormatter: formatWithCmdStr
- });
- function createMomentFormatFunc(mom) {
- return function (cmdStr) {
- return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
- };
- }
- function convertToMoment(input, timeZone, timeZoneOffset, locale) {
- var mom;
- if (timeZone === 'local') {
- mom = moment(input);
- }
- else if (timeZone === 'UTC') {
- mom = moment.utc(input);
- }
- else if (moment.tz) {
- mom = moment.tz(input, timeZone);
- }
- else {
- mom = moment.utc(input);
- if (timeZoneOffset != null) {
- mom.utcOffset(timeZoneOffset);
- }
- }
- mom.locale(locale);
- return mom;
- }
- function parseCmdStr(cmdStr) {
- var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
- if (parts) {
- var middle = parseCmdStr(parts[2]);
- return {
- head: parts[1],
- middle: middle,
- tail: parts[3],
- whole: parts[1] + middle.whole + parts[3]
- };
- }
- else {
- return {
- head: null,
- middle: null,
- tail: null,
- whole: cmdStr
- };
- }
- }
- function formatRange(cmd, formatStart, formatEnd, separator) {
- if (cmd.middle) {
- var startHead = formatStart(cmd.head);
- var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var startTail = formatStart(cmd.tail);
- var endHead = formatEnd(cmd.head);
- var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
- var endTail = formatEnd(cmd.tail);
- if (startHead === endHead && startTail === endTail) {
- return startHead +
- (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
- startTail;
- }
- }
- var startWhole = formatStart(cmd.whole);
- var endWhole = formatEnd(cmd.whole);
- if (startWhole === endWhole) {
- return startWhole;
- }
- else {
- return startWhole + separator + endWhole;
- }
- }
-
- exports.default = main;
- exports.toDuration = toDuration;
- exports.toMoment = toMoment;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/moment/main.min.js b/library/fullcalendar/packages/moment/main.min.js
deleted file mode 100644
index 39552c279..000000000
--- a/library/fullcalendar/packages/moment/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","@fullcalendar/core"],t):t((e=e||self).FullCalendarMoment={},e.moment,e.FullCalendar)}(this,(function(e,t,n){"use strict";var r=t;var a=n.createPlugin({cmdFormatter:function(e,t){var n=function e(t){var n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){var r=e(n[2]);return{head:n[1],middle:r,tail:n[3],whole:n[1]+r.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){var r=l(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,n,r,a){if(t.middle){var o=n(t.head),l=e(t.middle,n,r,a),u=n(t.tail),i=r(t.head),d=e(t.middle,n,r,a),f=r(t.tail);if(o===i&&u===f)return o+(l===d?l:l+a+d)+u}var c=n(t.whole),m=r(t.whole);return c===m?c:c+a+m}(n,o(r),o(a),t.separator)}return l(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(n.whole)}});function o(e){return function(t){return t?e.format(t):""}}function l(e,t,n,a){var o;return"local"===t?o=r(e):"UTC"===t?o=r.utc(e):r.tz?o=r.tz(e,t):(o=r.utc(e),null!=n&&o.utcOffset(n)),o.locale(a),o}e.default=a,e.toDuration=function(e){return r.duration(e)},e.toMoment=function(e,t){if(!(t instanceof n.Calendar))throw new Error("must supply a Calendar instance");return l(e,t.dateEnv.timeZone,null,t.dateEnv.locale.codes[0])},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/moment/package.json b/library/fullcalendar/packages/moment/package.json
deleted file mode 100644
index d7571f312..000000000
--- a/library/fullcalendar/packages/moment/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "@fullcalendar/moment",
- "version": "4.4.2",
- "title": "FullCalendar Moment Plugin",
- "description": "A connector to the MomentJS date library",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/moment-plugins",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0",
- "moment": "^2.24.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/rrule/LICENSE.txt b/library/fullcalendar/packages/rrule/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/rrule/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/rrule/README.md b/library/fullcalendar/packages/rrule/README.md
deleted file mode 100644
index 7b56bed78..000000000
--- a/library/fullcalendar/packages/rrule/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar RRule Plugin
-
-A connector to the RRule library, for recurring events
-
-[View the docs &raquo;](https://fullcalendar.io/docs/rrule-plugin)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/rrule/index.global.js b/library/fullcalendar/packages/rrule/index.global.js
new file mode 100644
index 000000000..795d352b5
--- /dev/null
+++ b/library/fullcalendar/packages/rrule/index.global.js
@@ -0,0 +1,145 @@
+/*!
+FullCalendar RRule Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/rrule-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.RRule = (function (exports, core, rrule, internal) {
+ 'use strict';
+
+ const recurringType = {
+ parse(eventProps, dateEnv) {
+ if (eventProps.rrule != null) {
+ let eventRRuleData = parseEventRRule(eventProps, dateEnv);
+ if (eventRRuleData) {
+ return {
+ typeData: { rruleSet: eventRRuleData.rruleSet, isTimeZoneSpecified: eventRRuleData.isTimeZoneSpecified },
+ allDayGuess: !eventRRuleData.isTimeSpecified,
+ duration: eventProps.duration,
+ };
+ }
+ }
+ return null;
+ },
+ expand(eventRRuleData, framingRange, dateEnv) {
+ let dates;
+ if (eventRRuleData.isTimeZoneSpecified) {
+ dates = eventRRuleData.rruleSet.between(dateEnv.toDate(framingRange.start), // rrule lib will treat as UTC-zoned
+ dateEnv.toDate(framingRange.end), // (same)
+ true).map((date) => dateEnv.createMarker(date)); // convert UTC-zoned-date to locale datemarker
+ }
+ else {
+ // when no timezone in given start/end, the rrule lib will assume UTC,
+ // which is same as our DateMarkers. no need to manipulate
+ dates = eventRRuleData.rruleSet.between(framingRange.start, framingRange.end, true);
+ }
+ return dates;
+ },
+ };
+ function parseEventRRule(eventProps, dateEnv) {
+ let rruleSet;
+ let isTimeSpecified = false;
+ let isTimeZoneSpecified = false;
+ if (typeof eventProps.rrule === 'string') {
+ let res = parseRRuleString(eventProps.rrule);
+ rruleSet = res.rruleSet;
+ isTimeSpecified = res.isTimeSpecified;
+ isTimeZoneSpecified = res.isTimeZoneSpecified;
+ }
+ if (typeof eventProps.rrule === 'object' && eventProps.rrule) { // non-null object
+ let res = parseRRuleObject(eventProps.rrule, dateEnv);
+ rruleSet = new rrule.RRuleSet();
+ rruleSet.rrule(res.rrule);
+ isTimeSpecified = res.isTimeSpecified;
+ isTimeZoneSpecified = res.isTimeZoneSpecified;
+ }
+ // convery to arrays. TODO: general util?
+ let exdateInputs = [].concat(eventProps.exdate || []);
+ let exruleInputs = [].concat(eventProps.exrule || []);
+ for (let exdateInput of exdateInputs) {
+ let res = internal.parseMarker(exdateInput);
+ isTimeSpecified = isTimeSpecified || !res.isTimeUnspecified;
+ isTimeZoneSpecified = isTimeZoneSpecified || res.timeZoneOffset !== null;
+ rruleSet.exdate(new Date(res.marker.valueOf() - (res.timeZoneOffset || 0) * 60 * 1000));
+ }
+ // TODO: exrule is deprecated. what to do? (https://icalendar.org/iCalendar-RFC-5545/a-3-deprecated-features.html)
+ for (let exruleInput of exruleInputs) {
+ let res = parseRRuleObject(exruleInput, dateEnv);
+ isTimeSpecified = isTimeSpecified || res.isTimeSpecified;
+ isTimeZoneSpecified = isTimeZoneSpecified || res.isTimeZoneSpecified;
+ rruleSet.exrule(res.rrule);
+ }
+ return { rruleSet, isTimeSpecified, isTimeZoneSpecified };
+ }
+ function parseRRuleObject(rruleInput, dateEnv) {
+ let isTimeSpecified = false;
+ let isTimeZoneSpecified = false;
+ function processDateInput(dateInput) {
+ if (typeof dateInput === 'string') {
+ let markerData = internal.parseMarker(dateInput);
+ if (markerData) {
+ isTimeSpecified = isTimeSpecified || !markerData.isTimeUnspecified;
+ isTimeZoneSpecified = isTimeZoneSpecified || markerData.timeZoneOffset !== null;
+ return new Date(markerData.marker.valueOf() - (markerData.timeZoneOffset || 0) * 60 * 1000); // NOT DRY
+ }
+ return null;
+ }
+ return dateInput; // TODO: what about number timestamps?
+ }
+ let rruleOptions = Object.assign(Object.assign({}, rruleInput), { dtstart: processDateInput(rruleInput.dtstart), until: processDateInput(rruleInput.until), freq: convertConstant(rruleInput.freq), wkst: rruleInput.wkst == null
+ ? (dateEnv.weekDow - 1 + 7) % 7 // convert Sunday-first to Monday-first
+ : convertConstant(rruleInput.wkst), byweekday: convertConstants(rruleInput.byweekday) });
+ return { rrule: new rrule.RRule(rruleOptions), isTimeSpecified, isTimeZoneSpecified };
+ }
+ function parseRRuleString(str) {
+ let rruleSet = rrule.rrulestr(str, { forceset: true });
+ let analysis = analyzeRRuleString(str);
+ return Object.assign({ rruleSet }, analysis);
+ }
+ function analyzeRRuleString(str) {
+ let isTimeSpecified = false;
+ let isTimeZoneSpecified = false;
+ function processMatch(whole, introPart, datePart) {
+ let result = internal.parseMarker(datePart);
+ isTimeSpecified = isTimeSpecified || !result.isTimeUnspecified;
+ isTimeZoneSpecified = isTimeZoneSpecified || result.timeZoneOffset !== null;
+ }
+ str.replace(/\b(DTSTART:)([^\n]*)/, processMatch);
+ str.replace(/\b(EXDATE:)([^\n]*)/, processMatch);
+ str.replace(/\b(UNTIL=)([^;\n]*)/, processMatch);
+ return { isTimeSpecified, isTimeZoneSpecified };
+ }
+ function convertConstants(input) {
+ if (Array.isArray(input)) {
+ return input.map(convertConstant);
+ }
+ return convertConstant(input);
+ }
+ function convertConstant(input) {
+ if (typeof input === 'string') {
+ return rrule.RRule[input.toUpperCase()];
+ }
+ return input;
+ }
+
+ const RRULE_EVENT_REFINERS = {
+ rrule: internal.identity,
+ exrule: internal.identity,
+ exdate: internal.identity,
+ duration: internal.createDuration,
+ };
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/rrule',
+ recurringTypes: [recurringType],
+ eventRefiners: RRULE_EVENT_REFINERS,
+ });
+
+ core.globalPlugins.push(plugin);
+
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, rrule, FullCalendar.Internal);
diff --git a/library/fullcalendar/packages/rrule/index.global.min.js b/library/fullcalendar/packages/rrule/index.global.min.js
new file mode 100644
index 000000000..4197cedb2
--- /dev/null
+++ b/library/fullcalendar/packages/rrule/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar RRule Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/rrule-plugin
+(c) 2022 Adam Shaw
+*/
+FullCalendar.RRule=function(e,r,t,i){"use strict";const n={parse(e,r){if(null!=e.rrule){let n=function(e,r){let n,u=!1,a=!1;if("string"==typeof e.rrule){let r=function(e){let r=t.rrulestr(e,{forceset:!0}),n=function(e){let r=!1,t=!1;function n(e,n,l){let u=i.parseMarker(l);r=r||!u.isTimeUnspecified,t=t||null!==u.timeZoneOffset}return e.replace(/\b(DTSTART:)([^\n]*)/,n),e.replace(/\b(EXDATE:)([^\n]*)/,n),e.replace(/\b(UNTIL=)([^;\n]*)/,n),{isTimeSpecified:r,isTimeZoneSpecified:t}}(e);return Object.assign({rruleSet:r},n)}(e.rrule);n=r.rruleSet,u=r.isTimeSpecified,a=r.isTimeZoneSpecified}if("object"==typeof e.rrule&&e.rrule){let i=l(e.rrule,r);n=new t.RRuleSet,n.rrule(i.rrule),u=i.isTimeSpecified,a=i.isTimeZoneSpecified}let s=[].concat(e.exdate||[]),f=[].concat(e.exrule||[]);for(let e of s){let r=i.parseMarker(e);u=u||!r.isTimeUnspecified,a=a||null!==r.timeZoneOffset,n.exdate(new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3))}for(let e of f){let t=l(e,r);u=u||t.isTimeSpecified,a=a||t.isTimeZoneSpecified,n.exrule(t.rrule)}return{rruleSet:n,isTimeSpecified:u,isTimeZoneSpecified:a}}(e,r);if(n)return{typeData:{rruleSet:n.rruleSet,isTimeZoneSpecified:n.isTimeZoneSpecified},allDayGuess:!n.isTimeSpecified,duration:e.duration}}return null},expand(e,r,t){let i;return i=e.isTimeZoneSpecified?e.rruleSet.between(t.toDate(r.start),t.toDate(r.end),!0).map(e=>t.createMarker(e)):e.rruleSet.between(r.start,r.end,!0),i}};function l(e,r){let n=!1,l=!1;function s(e){if("string"==typeof e){let r=i.parseMarker(e);return r?(n=n||!r.isTimeUnspecified,l=l||null!==r.timeZoneOffset,new Date(r.marker.valueOf()-60*(r.timeZoneOffset||0)*1e3)):null}return e}let f=Object.assign(Object.assign({},e),{dtstart:s(e.dtstart),until:s(e.until),freq:a(e.freq),wkst:null==e.wkst?(r.weekDow-1+7)%7:a(e.wkst),byweekday:u(e.byweekday)});return{rrule:new t.RRule(f),isTimeSpecified:n,isTimeZoneSpecified:l}}function u(e){return Array.isArray(e)?e.map(a):a(e)}function a(e){return"string"==typeof e?t.RRule[e.toUpperCase()]:e}const s={rrule:i.identity,exrule:i.identity,exdate:i.identity,duration:i.createDuration};var f=r.createPlugin({name:"@fullcalendar/rrule",recurringTypes:[n],eventRefiners:s});return r.globalPlugins.push(f),e.default=f,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,rrule,FullCalendar.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/rrule/main.d.ts b/library/fullcalendar/packages/rrule/main.d.ts
deleted file mode 100644
index 8ce74e975..000000000
--- a/library/fullcalendar/packages/rrule/main.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/rrule' {
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
diff --git a/library/fullcalendar/packages/rrule/main.esm.js b/library/fullcalendar/packages/rrule/main.esm.js
deleted file mode 100644
index e4b92e95c..000000000
--- a/library/fullcalendar/packages/rrule/main.esm.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { rrulestr, RRule } from 'rrule';
-import { createPlugin, refineProps, createDuration } from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-var EVENT_DEF_PROPS = {
- rrule: null,
- duration: createDuration
-};
-var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- if (rawEvent.rrule != null) {
- var props = refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
- var parsed = parseRRule(props.rrule, dateEnv);
- if (parsed) {
- return {
- typeData: parsed.rrule,
- allDayGuess: parsed.allDayGuess,
- duration: props.duration
- };
- }
- }
- return null;
- },
- expand: function (rrule, framingRange) {
- // we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
- // inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
- // Workaround: make inclusive, which will generate extra occurences, and then trim.
- return rrule.between(framingRange.start, framingRange.end, true)
- .filter(function (date) {
- return date.valueOf() < framingRange.end.valueOf();
- });
- }
-};
-var main = createPlugin({
- recurringTypes: [recurring]
-});
-function parseRRule(input, dateEnv) {
- var allDayGuess = null;
- var rrule;
- if (typeof input === 'string') {
- rrule = rrulestr(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- var refined = __assign({}, input); // copy
- if (typeof refined.dtstart === 'string') {
- var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
- if (dtstartMeta) {
- refined.dtstart = dtstartMeta.marker;
- allDayGuess = dtstartMeta.isTimeUnspecified;
- }
- else {
- delete refined.dtstart;
- }
- }
- if (typeof refined.until === 'string') {
- refined.until = dateEnv.createMarker(refined.until);
- }
- if (refined.freq != null) {
- refined.freq = convertConstant(refined.freq);
- }
- if (refined.wkst != null) {
- refined.wkst = convertConstant(refined.wkst);
- }
- else {
- refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
- }
- if (refined.byweekday != null) {
- refined.byweekday = convertConstants(refined.byweekday); // the plural version
- }
- rrule = new RRule(refined);
- }
- if (rrule) {
- return { rrule: rrule, allDayGuess: allDayGuess };
- }
- return null;
-}
-function convertConstants(input) {
- if (Array.isArray(input)) {
- return input.map(convertConstant);
- }
- return convertConstant(input);
-}
-function convertConstant(input) {
- if (typeof input === 'string') {
- return RRule[input.toUpperCase()];
- }
- return input;
-}
-
-export default main;
diff --git a/library/fullcalendar/packages/rrule/main.js b/library/fullcalendar/packages/rrule/main.js
deleted file mode 100644
index 29e6130ac..000000000
--- a/library/fullcalendar/packages/rrule/main.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rrule'), require('@fullcalendar/core')) :
- typeof define === 'function' && define.amd ? define(['exports', 'rrule', '@fullcalendar/core'], factory) :
- (global = global || self, factory(global.FullCalendarRrule = {}, global.rrule, global.FullCalendar));
-}(this, function (exports, rrule, core) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- var EVENT_DEF_PROPS = {
- rrule: null,
- duration: core.createDuration
- };
- var recurring = {
- parse: function (rawEvent, leftoverProps, dateEnv) {
- if (rawEvent.rrule != null) {
- var props = core.refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
- var parsed = parseRRule(props.rrule, dateEnv);
- if (parsed) {
- return {
- typeData: parsed.rrule,
- allDayGuess: parsed.allDayGuess,
- duration: props.duration
- };
- }
- }
- return null;
- },
- expand: function (rrule, framingRange) {
- // we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
- // inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
- // Workaround: make inclusive, which will generate extra occurences, and then trim.
- return rrule.between(framingRange.start, framingRange.end, true)
- .filter(function (date) {
- return date.valueOf() < framingRange.end.valueOf();
- });
- }
- };
- var main = core.createPlugin({
- recurringTypes: [recurring]
- });
- function parseRRule(input, dateEnv) {
- var allDayGuess = null;
- var rrule$1;
- if (typeof input === 'string') {
- rrule$1 = rrule.rrulestr(input);
- }
- else if (typeof input === 'object' && input) { // non-null object
- var refined = __assign({}, input); // copy
- if (typeof refined.dtstart === 'string') {
- var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
- if (dtstartMeta) {
- refined.dtstart = dtstartMeta.marker;
- allDayGuess = dtstartMeta.isTimeUnspecified;
- }
- else {
- delete refined.dtstart;
- }
- }
- if (typeof refined.until === 'string') {
- refined.until = dateEnv.createMarker(refined.until);
- }
- if (refined.freq != null) {
- refined.freq = convertConstant(refined.freq);
- }
- if (refined.wkst != null) {
- refined.wkst = convertConstant(refined.wkst);
- }
- else {
- refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
- }
- if (refined.byweekday != null) {
- refined.byweekday = convertConstants(refined.byweekday); // the plural version
- }
- rrule$1 = new rrule.RRule(refined);
- }
- if (rrule$1) {
- return { rrule: rrule$1, allDayGuess: allDayGuess };
- }
- return null;
- }
- function convertConstants(input) {
- if (Array.isArray(input)) {
- return input.map(convertConstant);
- }
- return convertConstant(input);
- }
- function convertConstant(input) {
- if (typeof input === 'string') {
- return rrule.RRule[input.toUpperCase()];
- }
- return input;
- }
-
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/rrule/main.min.js b/library/fullcalendar/packages/rrule/main.min.js
deleted file mode 100644
index 68addc2bd..000000000
--- a/library/fullcalendar/packages/rrule/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("rrule"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","rrule","@fullcalendar/core"],r):r((e=e||self).FullCalendarRrule={},e.rrule,e.FullCalendar)}(this,(function(e,r,t){"use strict";var n=function(){return(n=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var u in r=arguments[t])Object.prototype.hasOwnProperty.call(r,u)&&(e[u]=r[u]);return e}).apply(this,arguments)},u={rrule:null,duration:t.createDuration},l={parse:function(e,l,a){if(null!=e.rrule){var f=t.refineProps(e,u,{},l),o=function(e,t){var u,l=null;if("string"==typeof e)u=r.rrulestr(e);else if("object"==typeof e&&e){var a=n({},e);if("string"==typeof a.dtstart){var f=t.createMarkerMeta(a.dtstart);f?(a.dtstart=f.marker,l=f.isTimeUnspecified):delete a.dtstart}"string"==typeof a.until&&(a.until=t.createMarker(a.until)),null!=a.freq&&(a.freq=i(a.freq)),null!=a.wkst?a.wkst=i(a.wkst):a.wkst=(t.weekDow-1+7)%7,null!=a.byweekday&&(a.byweekday=function(e){if(Array.isArray(e))return e.map(i);return i(e)}(a.byweekday)),u=new r.RRule(a)}if(u)return{rrule:u,allDayGuess:l};return null}(f.rrule,a);if(o)return{typeData:o.rrule,allDayGuess:o.allDayGuess,duration:f.duration}}return null},expand:function(e,r){return e.between(r.start,r.end,!0).filter((function(e){return e.valueOf()<r.end.valueOf()}))}},a=t.createPlugin({recurringTypes:[l]});function i(e){return"string"==typeof e?r.RRule[e.toUpperCase()]:e}e.default=a,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/rrule/package.json b/library/fullcalendar/packages/rrule/package.json
deleted file mode 100644
index 4cd35d029..000000000
--- a/library/fullcalendar/packages/rrule/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "@fullcalendar/rrule",
- "version": "4.4.2",
- "title": "FullCalendar RRule Plugin",
- "description": "A connector to the RRule library, for recurring events",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/rrule-plugin",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0",
- "rrule": "^2.6.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/timegrid/LICENSE.txt b/library/fullcalendar/packages/timegrid/LICENSE.txt
deleted file mode 100644
index 2149cfbef..000000000
--- a/library/fullcalendar/packages/timegrid/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 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/library/fullcalendar/packages/timegrid/README.md b/library/fullcalendar/packages/timegrid/README.md
deleted file mode 100644
index ac13676c8..000000000
--- a/library/fullcalendar/packages/timegrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Time Grid Plugin
-
-Display your events on a grid of time slots
-
-[View the docs &raquo;](https://fullcalendar.io/docs/timegrid-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/library/fullcalendar/packages/timegrid/index.global.js b/library/fullcalendar/packages/timegrid/index.global.js
new file mode 100644
index 000000000..830c7ee2c
--- /dev/null
+++ b/library/fullcalendar/packages/timegrid/index.global.js
@@ -0,0 +1,1198 @@
+/*!
+FullCalendar Time Grid Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/timegrid-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.TimeGrid = (function (exports, core, internal$1, preact, internal$2) {
+ 'use strict';
+
+ class AllDaySplitter extends internal$1.Splitter {
+ getKeyInfo() {
+ return {
+ allDay: {},
+ timed: {},
+ };
+ }
+ getKeysForDateSpan(dateSpan) {
+ if (dateSpan.allDay) {
+ return ['allDay'];
+ }
+ return ['timed'];
+ }
+ getKeysForEventDef(eventDef) {
+ if (!eventDef.allDay) {
+ return ['timed'];
+ }
+ if (internal$1.hasBgRendering(eventDef)) {
+ return ['timed', 'allDay'];
+ }
+ return ['allDay'];
+ }
+ }
+
+ const DEFAULT_SLAT_LABEL_FORMAT = internal$1.createFormatter({
+ hour: 'numeric',
+ minute: '2-digit',
+ omitZeroMinute: true,
+ meridiem: 'short',
+ });
+ function TimeColsAxisCell(props) {
+ let classNames = [
+ 'fc-timegrid-slot',
+ 'fc-timegrid-slot-label',
+ props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor',
+ ];
+ return (preact.createElement(internal$1.ViewContextType.Consumer, null, (context) => {
+ if (!props.isLabeled) {
+ return (preact.createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr }));
+ }
+ let { dateEnv, options, viewApi } = context;
+ let labelFormat = // TODO: fully pre-parse
+ options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT :
+ Array.isArray(options.slotLabelFormat) ? internal$1.createFormatter(options.slotLabelFormat[0]) :
+ internal$1.createFormatter(options.slotLabelFormat);
+ let renderProps = {
+ level: 0,
+ time: props.time,
+ date: dateEnv.toDate(props.date),
+ view: viewApi,
+ text: dateEnv.format(props.date, labelFormat),
+ };
+ return (preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: classNames, elAttrs: {
+ 'data-time': props.isoTimeStr,
+ }, renderProps: renderProps, generatorName: "slotLabelContent", generator: options.slotLabelContent || renderInnerContent, classNameGenerator: options.slotLabelClassNames, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, (InnerContent) => (preact.createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" },
+ preact.createElement(InnerContent, { elTag: "div", elClasses: [
+ 'fc-timegrid-slot-label-cushion',
+ 'fc-scrollgrid-shrink-cushion',
+ ] })))));
+ }));
+ }
+ function renderInnerContent(props) {
+ return props.text;
+ }
+
+ class TimeBodyAxis extends internal$1.BaseComponent {
+ render() {
+ return this.props.slatMetas.map((slatMeta) => (preact.createElement("tr", { key: slatMeta.key },
+ preact.createElement(TimeColsAxisCell, Object.assign({}, slatMeta)))));
+ }
+ }
+
+ const DEFAULT_WEEK_NUM_FORMAT = internal$1.createFormatter({ week: 'short' });
+ const AUTO_ALL_DAY_MAX_EVENT_ROWS = 5;
+ class TimeColsView extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.allDaySplitter = new AllDaySplitter(); // for use by subclasses
+ this.headerElRef = preact.createRef();
+ this.rootElRef = preact.createRef();
+ this.scrollerElRef = preact.createRef();
+ this.state = {
+ slatCoords: null,
+ };
+ this.handleScrollTopRequest = (scrollTop) => {
+ let scrollerEl = this.scrollerElRef.current;
+ if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer
+ scrollerEl.scrollTop = scrollTop;
+ }
+ };
+ /* Header Render Methods
+ ------------------------------------------------------------------------------------------------------------------*/
+ this.renderHeadAxis = (rowKey, frameHeight = '') => {
+ let { options } = this.context;
+ let { dateProfile } = this.props;
+ let range = dateProfile.renderRange;
+ let dayCnt = internal$1.diffDays(range.start, range.end);
+ // only do in day views (to avoid doing in week views that dont need it)
+ let navLinkAttrs = (dayCnt === 1)
+ ? internal$1.buildNavLinkAttrs(this.context, range.start, 'week')
+ : {};
+ if (options.weekNumbers && rowKey === 'day') {
+ return (preact.createElement(internal$1.WeekNumberContainer, { elTag: "th", elClasses: [
+ 'fc-timegrid-axis',
+ 'fc-scrollgrid-shrink',
+ ], elAttrs: {
+ 'aria-hidden': true,
+ }, date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, (InnerContent) => (preact.createElement("div", { className: [
+ 'fc-timegrid-axis-frame',
+ 'fc-scrollgrid-shrink-frame',
+ 'fc-timegrid-axis-frame-liquid',
+ ].join(' '), style: { height: frameHeight } },
+ preact.createElement(InnerContent, { elTag: "a", elClasses: [
+ 'fc-timegrid-axis-cushion',
+ 'fc-scrollgrid-shrink-cushion',
+ 'fc-scrollgrid-sync-inner',
+ ], elAttrs: navLinkAttrs })))));
+ }
+ return (preact.createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" },
+ preact.createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } })));
+ };
+ /* Table Component Render Methods
+ ------------------------------------------------------------------------------------------------------------------*/
+ // only a one-way height sync. we don't send the axis inner-content height to the DayGrid,
+ // but DayGrid still needs to have classNames on inner elements in order to measure.
+ this.renderTableRowAxis = (rowHeight) => {
+ let { options, viewApi } = this.context;
+ let renderProps = {
+ text: options.allDayText,
+ view: viewApi,
+ };
+ return (
+ // TODO: make reusable hook. used in list view too
+ preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: [
+ 'fc-timegrid-axis',
+ 'fc-scrollgrid-shrink',
+ ], elAttrs: {
+ 'aria-hidden': true,
+ }, renderProps: renderProps, generatorName: "allDayContent", generator: options.allDayContent || renderAllDayInner, classNameGenerator: options.allDayClassNames, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, (InnerContent) => (preact.createElement("div", { className: [
+ 'fc-timegrid-axis-frame',
+ 'fc-scrollgrid-shrink-frame',
+ rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : '',
+ ].join(' '), style: { height: rowHeight } },
+ preact.createElement(InnerContent, { elTag: "span", elClasses: [
+ 'fc-timegrid-axis-cushion',
+ 'fc-scrollgrid-shrink-cushion',
+ 'fc-scrollgrid-sync-inner',
+ ] })))));
+ };
+ this.handleSlatCoords = (slatCoords) => {
+ this.setState({ slatCoords });
+ };
+ }
+ // rendering
+ // ----------------------------------------------------------------------------------------------------
+ renderSimpleLayout(headerRowContent, allDayContent, timeContent) {
+ let { context, props } = this;
+ let sections = [];
+ let stickyHeaderDates = internal$1.getStickyHeaderDates(context.options);
+ if (headerRowContent) {
+ sections.push({
+ type: 'header',
+ key: 'header',
+ isSticky: stickyHeaderDates,
+ chunk: {
+ elRef: this.headerElRef,
+ tableClassName: 'fc-col-header',
+ rowContent: headerRowContent,
+ },
+ });
+ }
+ if (allDayContent) {
+ sections.push({
+ type: 'body',
+ key: 'all-day',
+ chunk: { content: allDayContent },
+ });
+ sections.push({
+ type: 'body',
+ key: 'all-day-divider',
+ outerContent: ( // TODO: rename to cellContent so don't need to define <tr>?
+ preact.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" },
+ preact.createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))),
+ });
+ }
+ sections.push({
+ type: 'body',
+ key: 'body',
+ liquid: true,
+ expandRows: Boolean(context.options.expandRows),
+ chunk: {
+ scrollerElRef: this.scrollerElRef,
+ content: timeContent,
+ },
+ });
+ return (preact.createElement(internal$1.ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec },
+ preact.createElement(internal$1.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections })));
+ }
+ renderHScrollLayout(headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) {
+ let ScrollGrid = this.context.pluginHooks.scrollGridImpl;
+ if (!ScrollGrid) {
+ throw new Error('No ScrollGrid implementation');
+ }
+ let { context, props } = this;
+ let stickyHeaderDates = !props.forPrint && internal$1.getStickyHeaderDates(context.options);
+ let stickyFooterScrollbar = !props.forPrint && internal$1.getStickyFooterScrollbar(context.options);
+ let sections = [];
+ if (headerRowContent) {
+ sections.push({
+ type: 'header',
+ key: 'header',
+ isSticky: stickyHeaderDates,
+ syncRowHeights: true,
+ chunks: [
+ {
+ key: 'axis',
+ rowContent: (arg) => (preact.createElement("tr", { role: "presentation" }, this.renderHeadAxis('day', arg.rowSyncHeights[0]))),
+ },
+ {
+ key: 'cols',
+ elRef: this.headerElRef,
+ tableClassName: 'fc-col-header',
+ rowContent: headerRowContent,
+ },
+ ],
+ });
+ }
+ if (allDayContent) {
+ sections.push({
+ type: 'body',
+ key: 'all-day',
+ syncRowHeights: true,
+ chunks: [
+ {
+ key: 'axis',
+ rowContent: (contentArg) => (preact.createElement("tr", { role: "presentation" }, this.renderTableRowAxis(contentArg.rowSyncHeights[0]))),
+ },
+ {
+ key: 'cols',
+ content: allDayContent,
+ },
+ ],
+ });
+ sections.push({
+ key: 'all-day-divider',
+ type: 'body',
+ outerContent: ( // TODO: rename to cellContent so don't need to define <tr>?
+ preact.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" },
+ preact.createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') }))),
+ });
+ }
+ let isNowIndicator = context.options.nowIndicator;
+ sections.push({
+ type: 'body',
+ key: 'body',
+ liquid: true,
+ expandRows: Boolean(context.options.expandRows),
+ chunks: [
+ {
+ key: 'axis',
+ content: (arg) => (
+ // TODO: make this now-indicator arrow more DRY with TimeColsContent
+ preact.createElement("div", { className: "fc-timegrid-axis-chunk" },
+ preact.createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } },
+ arg.tableColGroupNode,
+ preact.createElement("tbody", null,
+ preact.createElement(TimeBodyAxis, { slatMetas: slatMetas }))),
+ preact.createElement("div", { className: "fc-timegrid-now-indicator-container" },
+ preact.createElement(internal$1.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, (nowDate) => {
+ let nowIndicatorTop = isNowIndicator &&
+ slatCoords &&
+ slatCoords.safeComputeTop(nowDate); // might return void
+ if (typeof nowIndicatorTop === 'number') {
+ return (preact.createElement(internal$1.NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: nowDate }));
+ }
+ return null;
+ })))),
+ },
+ {
+ key: 'cols',
+ scrollerElRef: this.scrollerElRef,
+ content: timeContent,
+ },
+ ],
+ });
+ if (stickyFooterScrollbar) {
+ sections.push({
+ key: 'footer',
+ type: 'footer',
+ isSticky: true,
+ chunks: [
+ {
+ key: 'axis',
+ content: internal$1.renderScrollShim,
+ },
+ {
+ key: 'cols',
+ content: internal$1.renderScrollShim,
+ },
+ ],
+ });
+ }
+ return (preact.createElement(internal$1.ViewContainer, { elRef: this.rootElRef, elClasses: ['fc-timegrid'], viewSpec: context.viewSpec },
+ preact.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [
+ { width: 'shrink', cols: [{ width: 'shrink' }] },
+ { cols: [{ span: colCnt, minWidth: dayMinWidth }] },
+ ], sections: sections })));
+ }
+ /* Dimensions
+ ------------------------------------------------------------------------------------------------------------------*/
+ getAllDayMaxEventProps() {
+ let { dayMaxEvents, dayMaxEventRows } = this.context.options;
+ if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto?
+ dayMaxEvents = undefined;
+ dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number
+ }
+ return { dayMaxEvents, dayMaxEventRows };
+ }
+ }
+ function renderAllDayInner(renderProps) {
+ return renderProps.text;
+ }
+
+ class TimeColsSlatsCoords {
+ constructor(positions, dateProfile, slotDuration) {
+ this.positions = positions;
+ this.dateProfile = dateProfile;
+ this.slotDuration = slotDuration;
+ }
+ safeComputeTop(date) {
+ let { dateProfile } = this;
+ if (internal$1.rangeContainsMarker(dateProfile.currentRange, date)) {
+ let startOfDayDate = internal$1.startOfDay(date);
+ let timeMs = date.valueOf() - startOfDayDate.valueOf();
+ if (timeMs >= internal$1.asRoughMs(dateProfile.slotMinTime) &&
+ timeMs < internal$1.asRoughMs(dateProfile.slotMaxTime)) {
+ return this.computeTimeTop(internal$1.createDuration(timeMs));
+ }
+ }
+ return null;
+ }
+ // Computes the top coordinate, relative to the bounds of the grid, of the given date.
+ // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
+ computeDateTop(when, startOfDayDate) {
+ if (!startOfDayDate) {
+ startOfDayDate = internal$1.startOfDay(when);
+ }
+ return this.computeTimeTop(internal$1.createDuration(when.valueOf() - startOfDayDate.valueOf()));
+ }
+ // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
+ // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform.
+ // Eventually allow computation with arbirary slat dates.
+ computeTimeTop(duration) {
+ let { positions, dateProfile } = this;
+ let len = positions.els.length;
+ // floating-point value of # of slots covered
+ let slatCoverage = (duration.milliseconds - internal$1.asRoughMs(dateProfile.slotMinTime)) / internal$1.asRoughMs(this.slotDuration);
+ let slatIndex;
+ let slatRemainder;
+ // compute a floating-point number for how many slats should be progressed through.
+ // from 0 to number of slats (inclusive)
+ // constrained because slotMinTime/slotMaxTime might be customized.
+ slatCoverage = Math.max(0, slatCoverage);
+ slatCoverage = Math.min(len, slatCoverage);
+ // an integer index of the furthest whole slat
+ // from 0 to number slats (*exclusive*, so len-1)
+ slatIndex = Math.floor(slatCoverage);
+ slatIndex = Math.min(slatIndex, len - 1);
+ // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
+ // could be 1.0 if slatCoverage is covering *all* the slots
+ slatRemainder = slatCoverage - slatIndex;
+ return positions.tops[slatIndex] +
+ positions.getHeight(slatIndex) * slatRemainder;
+ }
+ }
+
+ class TimeColsSlatsBody extends internal$1.BaseComponent {
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let { slatElRefs } = props;
+ return (preact.createElement("tbody", null, props.slatMetas.map((slatMeta, i) => {
+ let renderProps = {
+ time: slatMeta.time,
+ date: context.dateEnv.toDate(slatMeta.date),
+ view: context.viewApi,
+ };
+ return (preact.createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) },
+ props.axis && (preact.createElement(TimeColsAxisCell, Object.assign({}, slatMeta))),
+ preact.createElement(internal$1.ContentContainer, { elTag: "td", elClasses: [
+ 'fc-timegrid-slot',
+ 'fc-timegrid-slot-lane',
+ !slatMeta.isLabeled && 'fc-timegrid-slot-minor',
+ ], elAttrs: {
+ 'data-time': slatMeta.isoTimeStr,
+ }, renderProps: renderProps, generatorName: "slotLaneContent", generator: options.slotLaneContent, classNameGenerator: options.slotLaneClassNames, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount })));
+ })));
+ }
+ }
+
+ /*
+ for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
+ */
+ class TimeColsSlats extends internal$1.BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.rootElRef = preact.createRef();
+ this.slatElRefs = new internal$1.RefMap();
+ }
+ render() {
+ let { props, context } = this;
+ return (preact.createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" },
+ preact.createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: {
+ minWidth: props.tableMinWidth,
+ width: props.clientWidth,
+ height: props.minHeight,
+ } },
+ props.tableColGroupNode /* relies on there only being a single <col> for the axis */,
+ preact.createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }))));
+ }
+ componentDidMount() {
+ this.updateSizing();
+ }
+ componentDidUpdate() {
+ this.updateSizing();
+ }
+ componentWillUnmount() {
+ if (this.props.onCoords) {
+ this.props.onCoords(null);
+ }
+ }
+ updateSizing() {
+ let { context, props } = this;
+ if (props.onCoords &&
+ props.clientWidth !== null // means sizing has stabilized
+ ) {
+ let rootEl = this.rootElRef.current;
+ if (rootEl.offsetHeight) { // not hidden by css
+ props.onCoords(new TimeColsSlatsCoords(new internal$1.PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration));
+ }
+ }
+ }
+ }
+ function collectSlatEls(elMap, slatMetas) {
+ return slatMetas.map((slatMeta) => elMap[slatMeta.key]);
+ }
+
+ function splitSegsByCol(segs, colCnt) {
+ let segsByCol = [];
+ let i;
+ for (i = 0; i < colCnt; i += 1) {
+ segsByCol.push([]);
+ }
+ if (segs) {
+ for (i = 0; i < segs.length; i += 1) {
+ segsByCol[segs[i].col].push(segs[i]);
+ }
+ }
+ return segsByCol;
+ }
+ function splitInteractionByCol(ui, colCnt) {
+ let byRow = [];
+ if (!ui) {
+ for (let i = 0; i < colCnt; i += 1) {
+ byRow[i] = null;
+ }
+ }
+ else {
+ for (let i = 0; i < colCnt; i += 1) {
+ byRow[i] = {
+ affectedInstances: ui.affectedInstances,
+ isEvent: ui.isEvent,
+ segs: [],
+ };
+ }
+ for (let seg of ui.segs) {
+ byRow[seg.col].segs.push(seg);
+ }
+ }
+ return byRow;
+ }
+
+ class TimeColMoreLink extends internal$1.BaseComponent {
+ render() {
+ let { props } = this;
+ return (preact.createElement(internal$1.MoreLinkContainer, { elClasses: ['fc-timegrid-more-link'], elStyle: {
+ top: props.top,
+ bottom: props.bottom,
+ }, allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: () => renderPlainFgSegs(props.hiddenSegs, props), defaultGenerator: renderMoreLinkInner }, (InnerContent) => (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-more-link-inner', 'fc-sticky'] }))));
+ }
+ }
+ function renderMoreLinkInner(props) {
+ return props.shortText;
+ }
+
+ // segInputs assumed sorted
+ function buildPositioning(segInputs, strictOrder, maxStackCnt) {
+ let hierarchy = new internal$1.SegHierarchy();
+ if (strictOrder != null) {
+ hierarchy.strictOrder = strictOrder;
+ }
+ if (maxStackCnt != null) {
+ hierarchy.maxStackCnt = maxStackCnt;
+ }
+ let hiddenEntries = hierarchy.addSegs(segInputs);
+ let hiddenGroups = internal$1.groupIntersectingEntries(hiddenEntries);
+ let web = buildWeb(hierarchy);
+ web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0
+ let segRects = webToRects(web);
+ return { segRects, hiddenGroups };
+ }
+ function buildWeb(hierarchy) {
+ const { entriesByLevel } = hierarchy;
+ const buildNode = cacheable((level, lateral) => level + ':' + lateral, (level, lateral) => {
+ let siblingRange = findNextLevelSegs(hierarchy, level, lateral);
+ let nextLevelRes = buildNodes(siblingRange, buildNode);
+ let entry = entriesByLevel[level][lateral];
+ return [
+ Object.assign(Object.assign({}, entry), { nextLevelNodes: nextLevelRes[0] }),
+ entry.thickness + nextLevelRes[1], // the pressure builds
+ ];
+ });
+ return buildNodes(entriesByLevel.length
+ ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length }
+ : null, buildNode)[0];
+ }
+ function buildNodes(siblingRange, buildNode) {
+ if (!siblingRange) {
+ return [[], 0];
+ }
+ let { level, lateralStart, lateralEnd } = siblingRange;
+ let lateral = lateralStart;
+ let pairs = [];
+ while (lateral < lateralEnd) {
+ pairs.push(buildNode(level, lateral));
+ lateral += 1;
+ }
+ pairs.sort(cmpDescPressures);
+ return [
+ pairs.map(extractNode),
+ pairs[0][1], // first item's pressure
+ ];
+ }
+ function cmpDescPressures(a, b) {
+ return b[1] - a[1];
+ }
+ function extractNode(a) {
+ return a[0];
+ }
+ function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) {
+ let { levelCoords, entriesByLevel } = hierarchy;
+ let subjectEntry = entriesByLevel[subjectLevel][subjectLateral];
+ let afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness;
+ let levelCnt = levelCoords.length;
+ let level = subjectLevel;
+ // skip past levels that are too high up
+ for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1)
+ ; // do nothing
+ for (; level < levelCnt; level += 1) {
+ let entries = entriesByLevel[level];
+ let entry;
+ let searchIndex = internal$1.binarySearch(entries, subjectEntry.span.start, internal$1.getEntrySpanEnd);
+ let lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one
+ let lateralEnd = lateralStart;
+ while ( // loop through entries that horizontally intersect
+ (entry = entries[lateralEnd]) && // but not past the whole seg list
+ entry.span.start < subjectEntry.span.end) {
+ lateralEnd += 1;
+ }
+ if (lateralStart < lateralEnd) {
+ return { level, lateralStart, lateralEnd };
+ }
+ }
+ return null;
+ }
+ function stretchWeb(topLevelNodes, totalThickness) {
+ const stretchNode = cacheable((node, startCoord, prevThickness) => internal$1.buildEntryKey(node), (node, startCoord, prevThickness) => {
+ let { nextLevelNodes, thickness } = node;
+ let allThickness = thickness + prevThickness;
+ let thicknessFraction = thickness / allThickness;
+ let endCoord;
+ let newChildren = [];
+ if (!nextLevelNodes.length) {
+ endCoord = totalThickness;
+ }
+ else {
+ for (let childNode of nextLevelNodes) {
+ if (endCoord === undefined) {
+ let res = stretchNode(childNode, startCoord, allThickness);
+ endCoord = res[0];
+ newChildren.push(res[1]);
+ }
+ else {
+ let res = stretchNode(childNode, endCoord, 0);
+ newChildren.push(res[1]);
+ }
+ }
+ }
+ let newThickness = (endCoord - startCoord) * thicknessFraction;
+ return [endCoord - newThickness, Object.assign(Object.assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })];
+ });
+ return topLevelNodes.map((node) => stretchNode(node, 0, 0)[1]);
+ }
+ // not sorted in any particular order
+ function webToRects(topLevelNodes) {
+ let rects = [];
+ const processNode = cacheable((node, levelCoord, stackDepth) => internal$1.buildEntryKey(node), (node, levelCoord, stackDepth) => {
+ let rect = Object.assign(Object.assign({}, node), { levelCoord,
+ stackDepth, stackForward: 0 });
+ rects.push(rect);
+ return (rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1);
+ });
+ function processNodes(nodes, levelCoord, stackDepth) {
+ let stackForward = 0;
+ for (let node of nodes) {
+ stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward);
+ }
+ return stackForward;
+ }
+ processNodes(topLevelNodes, 0, 0);
+ return rects; // TODO: sort rects by levelCoord to be consistent with toRects?
+ }
+ // TODO: move to general util
+ function cacheable(keyFunc, workFunc) {
+ const cache = {};
+ return (...args) => {
+ let key = keyFunc(...args);
+ return (key in cache)
+ ? cache[key]
+ : (cache[key] = workFunc(...args));
+ };
+ }
+
+ function computeSegVCoords(segs, colDate, slatCoords = null, eventMinHeight = 0) {
+ let vcoords = [];
+ if (slatCoords) {
+ for (let i = 0; i < segs.length; i += 1) {
+ let seg = segs[i];
+ let spanStart = slatCoords.computeDateTop(seg.start, colDate);
+ let spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :(
+ slatCoords.computeDateTop(seg.end, colDate));
+ vcoords.push({
+ start: Math.round(spanStart),
+ end: Math.round(spanEnd), //
+ });
+ }
+ }
+ return vcoords;
+ }
+ function computeFgSegPlacements(segs, segVCoords, // might not have for every seg
+ eventOrderStrict, eventMaxStack) {
+ let segInputs = [];
+ let dumbSegs = []; // segs without coords
+ for (let i = 0; i < segs.length; i += 1) {
+ let vcoords = segVCoords[i];
+ if (vcoords) {
+ segInputs.push({
+ index: i,
+ thickness: 1,
+ span: vcoords,
+ });
+ }
+ else {
+ dumbSegs.push(segs[i]);
+ }
+ }
+ let { segRects, hiddenGroups } = buildPositioning(segInputs, eventOrderStrict, eventMaxStack);
+ let segPlacements = [];
+ for (let segRect of segRects) {
+ segPlacements.push({
+ seg: segs[segRect.index],
+ rect: segRect,
+ });
+ }
+ for (let dumbSeg of dumbSegs) {
+ segPlacements.push({ seg: dumbSeg, rect: null });
+ }
+ return { segPlacements, hiddenGroups };
+ }
+
+ const DEFAULT_TIME_FORMAT = internal$1.createFormatter({
+ hour: 'numeric',
+ minute: '2-digit',
+ meridiem: false,
+ });
+ class TimeColEvent extends internal$1.BaseComponent {
+ render() {
+ return (preact.createElement(internal$1.StandardEvent, Object.assign({}, this.props, { elClasses: [
+ 'fc-timegrid-event',
+ 'fc-v-event',
+ this.props.isShort && 'fc-timegrid-event-short',
+ ], defaultTimeFormat: DEFAULT_TIME_FORMAT })));
+ }
+ }
+
+ class TimeCol extends internal$1.BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.sortEventSegs = internal$1.memoize(internal$1.sortEventSegs);
+ }
+ // TODO: memoize event-placement?
+ render() {
+ let { props, context } = this;
+ let { options } = context;
+ let isSelectMirror = options.selectMirror;
+ let mirrorSegs = // yuck
+ (props.eventDrag && props.eventDrag.segs) ||
+ (props.eventResize && props.eventResize.segs) ||
+ (isSelectMirror && props.dateSelectionSegs) ||
+ [];
+ let interactionAffectedInstances = // TODO: messy way to compute this
+ (props.eventDrag && props.eventDrag.affectedInstances) ||
+ (props.eventResize && props.eventResize.affectedInstances) ||
+ {};
+ let sortedFgSegs = this.sortEventSegs(props.fgEventSegs, options.eventOrder);
+ return (preact.createElement(internal$1.DayCellContainer, { elTag: "td", elRef: props.elRef, elClasses: [
+ 'fc-timegrid-col',
+ ...(props.extraClassNames || []),
+ ], elAttrs: Object.assign({ role: 'gridcell' }, props.extraDataAttrs), date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraRenderProps: props.extraRenderProps }, (InnerContent) => (preact.createElement("div", { className: "fc-timegrid-col-frame" },
+ preact.createElement("div", { className: "fc-timegrid-col-bg" },
+ this.renderFillSegs(props.businessHourSegs, 'non-business'),
+ this.renderFillSegs(props.bgEventSegs, 'bg-event'),
+ this.renderFillSegs(props.dateSelectionSegs, 'highlight')),
+ preact.createElement("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)),
+ preact.createElement("div", { className: "fc-timegrid-col-events" }, this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))),
+ preact.createElement("div", { className: "fc-timegrid-now-indicator-container" }, this.renderNowIndicator(props.nowIndicatorSegs)),
+ internal$1.hasCustomDayCellContent(options) && (preact.createElement(InnerContent, { elTag: "div", elClasses: ['fc-timegrid-col-misc'] }))))));
+ }
+ renderFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) {
+ let { props } = this;
+ if (props.forPrint) {
+ return renderPlainFgSegs(sortedFgSegs, props);
+ }
+ return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting);
+ }
+ renderPositionedFgSegs(segs, // if not mirror, needs to be sorted
+ segIsInvisible, isDragging, isResizing, isDateSelecting) {
+ let { eventMaxStack, eventShortHeight, eventOrderStrict, eventMinHeight } = this.context.options;
+ let { date, slatCoords, eventSelection, todayRange, nowDate } = this.props;
+ let isMirror = isDragging || isResizing || isDateSelecting;
+ let segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight);
+ let { segPlacements, hiddenGroups } = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack);
+ return (preact.createElement(preact.Fragment, null,
+ this.renderHiddenGroups(hiddenGroups, segs),
+ segPlacements.map((segPlacement) => {
+ let { seg, rect } = segPlacement;
+ let instanceId = seg.eventRange.instance.instanceId;
+ let isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect);
+ let vStyle = computeSegVStyle(rect && rect.span);
+ let hStyle = (!isMirror && rect) ? this.computeSegHStyle(rect) : { left: 0, right: 0 };
+ let isInset = Boolean(rect) && rect.stackForward > 0;
+ let isShort = Boolean(rect) && (rect.span.end - rect.span.start) < eventShortHeight; // look at other places for this problem
+ return (preact.createElement("div", { className: 'fc-timegrid-event-harness' +
+ (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: Object.assign(Object.assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) },
+ preact.createElement(TimeColEvent, Object.assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, internal$1.getSegMeta(seg, todayRange, nowDate)))));
+ })));
+ }
+ // will already have eventMinHeight applied because segInputs already had it
+ renderHiddenGroups(hiddenGroups, segs) {
+ let { extraDateSpan, dateProfile, todayRange, nowDate, eventSelection, eventDrag, eventResize } = this.props;
+ return (preact.createElement(preact.Fragment, null, hiddenGroups.map((hiddenGroup) => {
+ let positionCss = computeSegVStyle(hiddenGroup.span);
+ let hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs);
+ return (preact.createElement(TimeColMoreLink, { key: internal$1.buildIsoString(internal$1.computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize }));
+ })));
+ }
+ renderFillSegs(segs, fillType) {
+ let { props, context } = this;
+ let segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated
+ let children = segVCoords.map((vcoords, i) => {
+ let seg = segs[i];
+ return (preact.createElement("div", { key: internal$1.buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ?
+ preact.createElement(internal$1.BgEvent, Object.assign({ seg: seg }, internal$1.getSegMeta(seg, props.todayRange, props.nowDate))) :
+ internal$1.renderFill(fillType)));
+ });
+ return preact.createElement(preact.Fragment, null, children);
+ }
+ renderNowIndicator(segs) {
+ let { slatCoords, date } = this.props;
+ if (!slatCoords) {
+ return null;
+ }
+ return segs.map((seg, i) => (preact.createElement(internal$1.NowIndicatorContainer
+ // key doesn't matter. will only ever be one
+ , {
+ // key doesn't matter. will only ever be one
+ key: i, elClasses: ['fc-timegrid-now-indicator-line'], elStyle: {
+ top: slatCoords.computeDateTop(seg.start, date),
+ }, isAxis: false, date: date })));
+ }
+ computeSegHStyle(segHCoords) {
+ let { isRtl, options } = this.context;
+ let shouldOverlap = options.slotEventOverlap;
+ let nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point
+ let farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point
+ let left; // amount of space from left edge, a fraction of the total width
+ let right; // amount of space from right edge, a fraction of the total width
+ if (shouldOverlap) {
+ // double the width, but don't go beyond the maximum forward coordinate (1.0)
+ farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2);
+ }
+ if (isRtl) {
+ left = 1 - farCoord;
+ right = nearCoord;
+ }
+ else {
+ left = nearCoord;
+ right = 1 - farCoord;
+ }
+ let props = {
+ zIndex: segHCoords.stackDepth + 1,
+ left: left * 100 + '%',
+ right: right * 100 + '%',
+ };
+ if (shouldOverlap && !segHCoords.stackForward) {
+ // add padding to the edge so that forward stacked events don't cover the resizer's icon
+ props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
+ }
+ return props;
+ }
+ }
+ function renderPlainFgSegs(sortedFgSegs, { todayRange, nowDate, eventSelection, eventDrag, eventResize }) {
+ let hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) ||
+ (eventResize ? eventResize.affectedInstances : null) ||
+ {};
+ return (preact.createElement(preact.Fragment, null, sortedFgSegs.map((seg) => {
+ let instanceId = seg.eventRange.instance.instanceId;
+ return (preact.createElement("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } },
+ preact.createElement(TimeColEvent, Object.assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, internal$1.getSegMeta(seg, todayRange, nowDate)))));
+ })));
+ }
+ function computeSegVStyle(segVCoords) {
+ if (!segVCoords) {
+ return { top: '', bottom: '' };
+ }
+ return {
+ top: segVCoords.start,
+ bottom: -segVCoords.end,
+ };
+ }
+ function compileSegsFromEntries(segEntries, allSegs) {
+ return segEntries.map((segEntry) => allSegs[segEntry.index]);
+ }
+
+ class TimeColsContent extends internal$1.BaseComponent {
+ constructor() {
+ super(...arguments);
+ this.splitFgEventSegs = internal$1.memoize(splitSegsByCol);
+ this.splitBgEventSegs = internal$1.memoize(splitSegsByCol);
+ this.splitBusinessHourSegs = internal$1.memoize(splitSegsByCol);
+ this.splitNowIndicatorSegs = internal$1.memoize(splitSegsByCol);
+ this.splitDateSelectionSegs = internal$1.memoize(splitSegsByCol);
+ this.splitEventDrag = internal$1.memoize(splitInteractionByCol);
+ this.splitEventResize = internal$1.memoize(splitInteractionByCol);
+ this.rootElRef = preact.createRef();
+ this.cellElRefs = new internal$1.RefMap();
+ }
+ render() {
+ let { props, context } = this;
+ let nowIndicatorTop = context.options.nowIndicator &&
+ props.slatCoords &&
+ props.slatCoords.safeComputeTop(props.nowDate); // might return void
+ let colCnt = props.cells.length;
+ let fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt);
+ let bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt);
+ let businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt);
+ let nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt);
+ let dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt);
+ let eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt);
+ let eventResizeByRow = this.splitEventResize(props.eventResize, colCnt);
+ return (preact.createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef },
+ preact.createElement("table", { role: "presentation", style: {
+ minWidth: props.tableMinWidth,
+ width: props.clientWidth,
+ } },
+ props.tableColGroupNode,
+ preact.createElement("tbody", { role: "presentation" },
+ preact.createElement("tr", { role: "row" },
+ props.axis && (preact.createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" },
+ preact.createElement("div", { className: "fc-timegrid-col-frame" },
+ preact.createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && (preact.createElement(internal$1.NowIndicatorContainer, { elClasses: ['fc-timegrid-now-indicator-arrow'], elStyle: { top: nowIndicatorTop }, isAxis: true, date: props.nowDate })))))),
+ props.cells.map((cell, i) => (preact.createElement(TimeCol, { key: cell.key, elRef: this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraRenderProps: cell.extraRenderProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint }))))))));
+ }
+ componentDidMount() {
+ this.updateCoords();
+ }
+ componentDidUpdate() {
+ this.updateCoords();
+ }
+ updateCoords() {
+ let { props } = this;
+ if (props.onColCoords &&
+ props.clientWidth !== null // means sizing has stabilized
+ ) {
+ props.onColCoords(new internal$1.PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal
+ false));
+ }
+ }
+ }
+ function collectCellEls(elMap, cells) {
+ return cells.map((cell) => elMap[cell.key]);
+ }
+
+ /* A component that renders one or more columns of vertical time slots
+ ----------------------------------------------------------------------------------------------------------------------*/
+ class TimeCols extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.processSlotOptions = internal$1.memoize(processSlotOptions);
+ this.state = {
+ slatCoords: null,
+ };
+ this.handleRootEl = (el) => {
+ if (el) {
+ this.context.registerInteractiveComponent(this, {
+ el,
+ isHitComboAllowed: this.props.isHitComboAllowed,
+ });
+ }
+ else {
+ this.context.unregisterInteractiveComponent(this);
+ }
+ };
+ this.handleScrollRequest = (request) => {
+ let { onScrollTopRequest } = this.props;
+ let { slatCoords } = this.state;
+ if (onScrollTopRequest && slatCoords) {
+ if (request.time) {
+ let top = slatCoords.computeTimeTop(request.time);
+ top = Math.ceil(top); // zoom can give weird floating-point values. rather scroll a little bit further
+ if (top) {
+ top += 1; // to overcome top border that slots beyond the first have. looks better
+ }
+ onScrollTopRequest(top);
+ }
+ return true;
+ }
+ return false;
+ };
+ this.handleColCoords = (colCoords) => {
+ this.colCoords = colCoords;
+ };
+ this.handleSlatCoords = (slatCoords) => {
+ this.setState({ slatCoords });
+ if (this.props.onSlatCoords) {
+ this.props.onSlatCoords(slatCoords);
+ }
+ };
+ }
+ render() {
+ let { props, state } = this;
+ return (preact.createElement("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: {
+ // these props are important to give this wrapper correct dimensions for interactions
+ // TODO: if we set it here, can we avoid giving to inner tables?
+ width: props.clientWidth,
+ minWidth: props.tableMinWidth,
+ } },
+ preact.createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }),
+ preact.createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint })));
+ }
+ componentDidMount() {
+ this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest);
+ }
+ componentDidUpdate(prevProps) {
+ this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile);
+ }
+ componentWillUnmount() {
+ this.scrollResponder.detach();
+ }
+ queryHit(positionLeft, positionTop) {
+ let { dateEnv, options } = this.context;
+ let { colCoords } = this;
+ let { dateProfile } = this.props;
+ let { slatCoords } = this.state;
+ let { snapDuration, snapsPerSlot } = this.processSlotOptions(this.props.slotDuration, options.snapDuration);
+ let colIndex = colCoords.leftToIndex(positionLeft);
+ let slatIndex = slatCoords.positions.topToIndex(positionTop);
+ if (colIndex != null && slatIndex != null) {
+ let cell = this.props.cells[colIndex];
+ let slatTop = slatCoords.positions.tops[slatIndex];
+ let slatHeight = slatCoords.positions.getHeight(slatIndex);
+ let partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
+ let localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
+ let snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
+ let dayDate = this.props.cells[colIndex].date;
+ let time = internal$1.addDurations(dateProfile.slotMinTime, internal$1.multiplyDuration(snapDuration, snapIndex));
+ let start = dateEnv.add(dayDate, time);
+ let end = dateEnv.add(start, snapDuration);
+ return {
+ dateProfile,
+ dateSpan: Object.assign({ range: { start, end }, allDay: false }, cell.extraDateSpan),
+ dayEl: colCoords.els[colIndex],
+ rect: {
+ left: colCoords.lefts[colIndex],
+ right: colCoords.rights[colIndex],
+ top: slatTop,
+ bottom: slatTop + slatHeight,
+ },
+ layer: 0,
+ };
+ }
+ return null;
+ }
+ }
+ function processSlotOptions(slotDuration, snapDurationOverride) {
+ let snapDuration = snapDurationOverride || slotDuration;
+ let snapsPerSlot = internal$1.wholeDivideDurations(slotDuration, snapDuration);
+ if (snapsPerSlot === null) {
+ snapDuration = slotDuration;
+ snapsPerSlot = 1;
+ // TODO: say warning?
+ }
+ return { snapDuration, snapsPerSlot };
+ }
+
+ class DayTimeColsSlicer extends internal$1.Slicer {
+ sliceRange(range, dayRanges) {
+ let segs = [];
+ for (let col = 0; col < dayRanges.length; col += 1) {
+ let segRange = internal$1.intersectRanges(range, dayRanges[col]);
+ if (segRange) {
+ segs.push({
+ start: segRange.start,
+ end: segRange.end,
+ isStart: segRange.start.valueOf() === range.start.valueOf(),
+ isEnd: segRange.end.valueOf() === range.end.valueOf(),
+ col,
+ });
+ }
+ }
+ return segs;
+ }
+ }
+
+ class DayTimeCols extends internal$1.DateComponent {
+ constructor() {
+ super(...arguments);
+ this.buildDayRanges = internal$1.memoize(buildDayRanges);
+ this.slicer = new DayTimeColsSlicer();
+ this.timeColsRef = preact.createRef();
+ }
+ render() {
+ let { props, context } = this;
+ let { dateProfile, dayTableModel } = props;
+ let isNowIndicator = context.options.nowIndicator;
+ let dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv);
+ // give it the first row of cells
+ // TODO: would move this further down hierarchy, but sliceNowDate needs it
+ return (preact.createElement(internal$1.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, (nowDate, todayRange) => (preact.createElement(TimeCols, Object.assign({ ref: this.timeColsRef }, this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords })))));
+ }
+ }
+ function buildDayRanges(dayTableModel, dateProfile, dateEnv) {
+ let ranges = [];
+ for (let date of dayTableModel.headerDates) {
+ ranges.push({
+ start: dateEnv.add(date, dateProfile.slotMinTime),
+ end: dateEnv.add(date, dateProfile.slotMaxTime),
+ });
+ }
+ return ranges;
+ }
+
+ // potential nice values for the slot-duration and interval-duration
+ // from largest to smallest
+ const STOCK_SUB_DURATIONS = [
+ { hours: 1 },
+ { minutes: 30 },
+ { minutes: 15 },
+ { seconds: 30 },
+ { seconds: 15 },
+ ];
+ function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) {
+ let dayStart = new Date(0);
+ let slatTime = slotMinTime;
+ let slatIterator = internal$1.createDuration(0);
+ let labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration);
+ let metas = [];
+ while (internal$1.asRoughMs(slatTime) < internal$1.asRoughMs(slotMaxTime)) {
+ let date = dateEnv.add(dayStart, slatTime);
+ let isLabeled = internal$1.wholeDivideDurations(slatIterator, labelInterval) !== null;
+ metas.push({
+ date,
+ time: slatTime,
+ key: date.toISOString(),
+ isoTimeStr: internal$1.formatIsoTimeString(date),
+ isLabeled,
+ });
+ slatTime = internal$1.addDurations(slatTime, slotDuration);
+ slatIterator = internal$1.addDurations(slatIterator, slotDuration);
+ }
+ return metas;
+ }
+ // Computes an automatic value for slotLabelInterval
+ function computeLabelInterval(slotDuration) {
+ let i;
+ let labelInterval;
+ let slotsPerLabel;
+ // find the smallest stock label interval that results in more than one slots-per-label
+ for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) {
+ labelInterval = internal$1.createDuration(STOCK_SUB_DURATIONS[i]);
+ slotsPerLabel = internal$1.wholeDivideDurations(labelInterval, slotDuration);
+ if (slotsPerLabel !== null && slotsPerLabel > 1) {
+ return labelInterval;
+ }
+ }
+ return slotDuration; // fall back
+ }
+
+ class DayTimeColsView extends TimeColsView {
+ constructor() {
+ super(...arguments);
+ this.buildTimeColsModel = internal$1.memoize(buildTimeColsModel);
+ this.buildSlatMetas = internal$1.memoize(buildSlatMetas);
+ }
+ render() {
+ let { options, dateEnv, dateProfileGenerator } = this.context;
+ let { props } = this;
+ let { dateProfile } = props;
+ let dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator);
+ let splitProps = this.allDaySplitter.splitProps(props);
+ let slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv);
+ let { dayMinWidth } = options;
+ let hasAttachedAxis = !dayMinWidth;
+ let hasDetachedAxis = dayMinWidth;
+ let headerContent = options.dayHeaders && (preact.createElement(internal$1.DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null }));
+ let allDayContent = (options.allDaySlot !== false) && ((contentArg) => (preact.createElement(internal$2.DayTable, Object.assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, this.getAllDayMaxEventProps()))));
+ let timeGridContent = (contentArg) => (preact.createElement(DayTimeCols, Object.assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: this.handleScrollTopRequest })));
+ return hasDetachedAxis
+ ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords)
+ : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent);
+ }
+ }
+ function buildTimeColsModel(dateProfile, dateProfileGenerator) {
+ let daySeries = new internal$1.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
+ return new internal$1.DayTableModel(daySeries, false);
+ }
+
+ const OPTION_REFINERS = {
+ allDaySlot: Boolean,
+ };
+
+ var css_248z = ".fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:\"\\00a0\"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:\"\\00a0-\\00a0\"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}";
+ internal$1.injectStyles(css_248z);
+
+ var plugin = core.createPlugin({
+ name: '@fullcalendar/timegrid',
+ initialView: 'timeGridWeek',
+ optionRefiners: OPTION_REFINERS,
+ views: {
+ timeGrid: {
+ component: DayTimeColsView,
+ usesMinMaxTime: true,
+ allDaySlot: true,
+ slotDuration: '00:30:00',
+ slotEventOverlap: true, // a bad name. confused with overlap/constraint system
+ },
+ timeGridDay: {
+ type: 'timeGrid',
+ duration: { days: 1 },
+ },
+ timeGridWeek: {
+ type: 'timeGrid',
+ duration: { weeks: 1 },
+ },
+ },
+ });
+
+ var internal = {
+ __proto__: null,
+ TimeColsView: TimeColsView,
+ DayTimeColsView: DayTimeColsView,
+ buildTimeColsModel: buildTimeColsModel,
+ DayTimeCols: DayTimeCols,
+ buildDayRanges: buildDayRanges,
+ DayTimeColsSlicer: DayTimeColsSlicer,
+ TimeCols: TimeCols,
+ buildSlatMetas: buildSlatMetas,
+ TimeColsSlatsCoords: TimeColsSlatsCoords
+ };
+
+ core.globalPlugins.push(plugin);
+
+ exports.Internal = internal;
+ exports["default"] = plugin;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+
+})({}, FullCalendar, FullCalendar.Internal, FullCalendar.Preact, FullCalendar.DayGrid.Internal);
diff --git a/library/fullcalendar/packages/timegrid/index.global.min.js b/library/fullcalendar/packages/timegrid/index.global.min.js
new file mode 100644
index 000000000..3d05a9b1e
--- /dev/null
+++ b/library/fullcalendar/packages/timegrid/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Time Grid Plugin v6.0.3
+Docs & License: https://fullcalendar.io/docs/timegrid-view
+(c) 2022 Adam Shaw
+*/
+FullCalendar.TimeGrid=function(e,t,i,r,n){"use strict";class o extends i.Splitter{getKeyInfo(){return{allDay:{},timed:{}}}getKeysForDateSpan(e){return e.allDay?["allDay"]:["timed"]}getKeysForEventDef(e){return e.allDay?i.hasBgRendering(e)?["timed","allDay"]:["allDay"]:["timed"]}}const s=i.createFormatter({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function l(e){let t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return r.createElement(i.ViewContextType.Consumer,null,n=>{if(!e.isLabeled)return r.createElement("td",{className:t.join(" "),"data-time":e.isoTimeStr});let{dateEnv:o,options:l,viewApi:c}=n,d=null==l.slotLabelFormat?s:Array.isArray(l.slotLabelFormat)?i.createFormatter(l.slotLabelFormat[0]):i.createFormatter(l.slotLabelFormat),m={level:0,time:e.time,date:o.toDate(e.date),view:c,text:o.format(e.date,d)};return r.createElement(i.ContentContainer,{elTag:"td",elClasses:t,elAttrs:{"data-time":e.isoTimeStr},renderProps:m,generatorName:"slotLabelContent",generator:l.slotLabelContent||a,classNameGenerator:l.slotLabelClassNames,didMount:l.slotLabelDidMount,willUnmount:l.slotLabelWillUnmount},e=>r.createElement("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},r.createElement(e,{elTag:"div",elClasses:["fc-timegrid-slot-label-cushion","fc-scrollgrid-shrink-cushion"]})))})}function a(e){return e.text}class c extends i.BaseComponent{render(){return this.props.slatMetas.map(e=>r.createElement("tr",{key:e.key},r.createElement(l,Object.assign({},e))))}}const d=i.createFormatter({week:"short"});class m extends i.DateComponent{constructor(){super(...arguments),this.allDaySplitter=new o,this.headerElRef=r.createRef(),this.rootElRef=r.createRef(),this.scrollerElRef=r.createRef(),this.state={slatCoords:null},this.handleScrollTopRequest=e=>{let t=this.scrollerElRef.current;t&&(t.scrollTop=e)},this.renderHeadAxis=(e,t="")=>{let{options:n}=this.context,{dateProfile:o}=this.props,s=o.renderRange,l=1===i.diffDays(s.start,s.end)?i.buildNavLinkAttrs(this.context,s.start,"week"):{};return n.weekNumbers&&"day"===e?r.createElement(i.WeekNumberContainer,{elTag:"th",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},date:s.start,defaultFormat:d},e=>r.createElement("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame","fc-timegrid-axis-frame-liquid"].join(" "),style:{height:t}},r.createElement(e,{elTag:"a",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"],elAttrs:l}))):r.createElement("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},r.createElement("div",{className:"fc-timegrid-axis-frame",style:{height:t}}))},this.renderTableRowAxis=e=>{let{options:t,viewApi:n}=this.context,o={text:t.allDayText,view:n};return r.createElement(i.ContentContainer,{elTag:"td",elClasses:["fc-timegrid-axis","fc-scrollgrid-shrink"],elAttrs:{"aria-hidden":!0},renderProps:o,generatorName:"allDayContent",generator:t.allDayContent||f,classNameGenerator:t.allDayClassNames,didMount:t.allDayDidMount,willUnmount:t.allDayWillUnmount},t=>r.createElement("div",{className:["fc-timegrid-axis-frame","fc-scrollgrid-shrink-frame",null==e?" fc-timegrid-axis-frame-liquid":""].join(" "),style:{height:e}},r.createElement(t,{elTag:"span",elClasses:["fc-timegrid-axis-cushion","fc-scrollgrid-shrink-cushion","fc-scrollgrid-sync-inner"]})))},this.handleSlatCoords=e=>{this.setState({slatCoords:e})}}renderSimpleLayout(e,t,n){let{context:o,props:s}=this,l=[],a=i.getStickyHeaderDates(o.options);return e&&l.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(l.push({type:"body",key:"all-day",chunk:{content:t}}),l.push({type:"body",key:"all-day-divider",outerContent:r.createElement("tr",{role:"presentation",className:"fc-scrollgrid-section"},r.createElement("td",{className:"fc-timegrid-divider "+o.theme.getClass("tableCellShaded")}))})),l.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(o.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),r.createElement(i.ViewContainer,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:o.viewSpec},r.createElement(i.SimpleScrollGrid,{liquid:!s.isHeightAuto&&!s.forPrint,collapsibleWidth:s.forPrint,cols:[{width:"shrink"}],sections:l}))}renderHScrollLayout(e,t,n,o,s,l,a){let d=this.context.pluginHooks.scrollGridImpl;if(!d)throw new Error("No ScrollGrid implementation");let{context:m,props:f}=this,h=!f.forPrint&&i.getStickyHeaderDates(m.options),g=!f.forPrint&&i.getStickyFooterScrollbar(m.options),p=[];e&&p.push({type:"header",key:"header",isSticky:h,syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>r.createElement("tr",{role:"presentation"},this.renderHeadAxis("day",e.rowSyncHeights[0]))},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(p.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:e=>r.createElement("tr",{role:"presentation"},this.renderTableRowAxis(e.rowSyncHeights[0]))},{key:"cols",content:t}]}),p.push({key:"all-day-divider",type:"body",outerContent:r.createElement("tr",{role:"presentation",className:"fc-scrollgrid-section"},r.createElement("td",{colSpan:2,className:"fc-timegrid-divider "+m.theme.getClass("tableCellShaded")}))}));let u=m.options.nowIndicator;return p.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(m.options.expandRows),chunks:[{key:"axis",content:e=>r.createElement("div",{className:"fc-timegrid-axis-chunk"},r.createElement("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,r.createElement("tbody",null,r.createElement(c,{slatMetas:l}))),r.createElement("div",{className:"fc-timegrid-now-indicator-container"},r.createElement(i.NowTimer,{unit:u?"minute":"day"},e=>{let t=u&&a&&a.safeComputeTop(e);return"number"==typeof t?r.createElement(i.NowIndicatorContainer,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:t},isAxis:!0,date:e}):null})))},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),g&&p.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:i.renderScrollShim},{key:"cols",content:i.renderScrollShim}]}),r.createElement(i.ViewContainer,{elRef:this.rootElRef,elClasses:["fc-timegrid"],viewSpec:m.viewSpec},r.createElement(d,{liquid:!f.isHeightAuto&&!f.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:o,minWidth:s}]}],sections:p}))}getAllDayMaxEventProps(){let{dayMaxEvents:e,dayMaxEventRows:t}=this.context.options;return!0!==e&&!0!==t||(e=void 0,t=5),{dayMaxEvents:e,dayMaxEventRows:t}}}function f(e){return e.text}class h{constructor(e,t,i){this.positions=e,this.dateProfile=t,this.slotDuration=i}safeComputeTop(e){let{dateProfile:t}=this;if(i.rangeContainsMarker(t.currentRange,e)){let r=i.startOfDay(e),n=e.valueOf()-r.valueOf();if(n>=i.asRoughMs(t.slotMinTime)&&n<i.asRoughMs(t.slotMaxTime))return this.computeTimeTop(i.createDuration(n))}return null}computeDateTop(e,t){return t||(t=i.startOfDay(e)),this.computeTimeTop(i.createDuration(e.valueOf()-t.valueOf()))}computeTimeTop(e){let t,r,{positions:n,dateProfile:o}=this,s=n.els.length,l=(e.milliseconds-i.asRoughMs(o.slotMinTime))/i.asRoughMs(this.slotDuration);return l=Math.max(0,l),l=Math.min(s,l),t=Math.floor(l),t=Math.min(t,s-1),r=l-t,n.tops[t]+n.getHeight(t)*r}}class g extends i.BaseComponent{render(){let{props:e,context:t}=this,{options:n}=t,{slatElRefs:o}=e;return r.createElement("tbody",null,e.slatMetas.map((s,a)=>{let c={time:s.time,date:t.dateEnv.toDate(s.date),view:t.viewApi};return r.createElement("tr",{key:s.key,ref:o.createRef(s.key)},e.axis&&r.createElement(l,Object.assign({},s)),r.createElement(i.ContentContainer,{elTag:"td",elClasses:["fc-timegrid-slot","fc-timegrid-slot-lane",!s.isLabeled&&"fc-timegrid-slot-minor"],elAttrs:{"data-time":s.isoTimeStr},renderProps:c,generatorName:"slotLaneContent",generator:n.slotLaneContent,classNameGenerator:n.slotLaneClassNames,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount}))}))}}class p extends i.BaseComponent{constructor(){super(...arguments),this.rootElRef=r.createRef(),this.slatElRefs=new i.RefMap}render(){let{props:e,context:t}=this;return r.createElement("div",{ref:this.rootElRef,className:"fc-timegrid-slots"},r.createElement("table",{"aria-hidden":!0,className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,r.createElement(g,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))}componentDidMount(){this.updateSizing()}componentDidUpdate(){this.updateSizing()}componentWillUnmount(){this.props.onCoords&&this.props.onCoords(null)}updateSizing(){let{context:e,props:t}=this;if(t.onCoords&&null!==t.clientWidth){this.rootElRef.current.offsetHeight&&t.onCoords(new h(new i.PositionCache(this.rootElRef.current,(r=this.slatElRefs.currentMap,t.slatMetas.map(e=>r[e.key])),!1,!0),this.props.dateProfile,e.options.slotDuration))}var r}}function u(e,t){let i,r=[];for(i=0;i<t;i+=1)r.push([]);if(e)for(i=0;i<e.length;i+=1)r[e[i].col].push(e[i]);return r}function v(e,t){let i=[];if(e){for(let r=0;r<t;r+=1)i[r]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(let t of e.segs)i[t.col].segs.push(t)}else for(let e=0;e<t;e+=1)i[e]=null;return i}class b extends i.BaseComponent{render(){let{props:e}=this;return r.createElement(i.MoreLinkContainer,{elClasses:["fc-timegrid-more-link"],elStyle:{top:e.top,bottom:e.bottom},allDayDate:null,moreCnt:e.hiddenSegs.length,allSegs:e.hiddenSegs,hiddenSegs:e.hiddenSegs,extraDateSpan:e.extraDateSpan,dateProfile:e.dateProfile,todayRange:e.todayRange,popoverContent:()=>T(e.hiddenSegs,e),defaultGenerator:y},e=>r.createElement(e,{elTag:"div",elClasses:["fc-timegrid-more-link-inner","fc-sticky"]}))}}function y(e){return e.shortText}function x(e,t,r){let n=new i.SegHierarchy;null!=t&&(n.strictOrder=t),null!=r&&(n.maxStackCnt=r);let o=n.addSegs(e),s=i.groupIntersectingEntries(o),l=function(e){const{entriesByLevel:t}=e,r=w((e,t)=>e+":"+t,(n,o)=>{let s=S(function(e,t,r){let{levelCoords:n,entriesByLevel:o}=e,s=o[t][r],l=n[t]+s.thickness,a=n.length,c=t;for(;c<a&&n[c]<l;c+=1);for(;c<a;c+=1){let e,t=o[c],r=i.binarySearch(t,s.span.start,i.getEntrySpanEnd),n=r[0]+r[1],l=n;for(;(e=t[l])&&e.span.start<s.span.end;)l+=1;if(n<l)return{level:c,lateralStart:n,lateralEnd:l}}return null}(e,n,o),r),l=t[n][o];return[Object.assign(Object.assign({},l),{nextLevelNodes:s[0]}),l.thickness+s[1]]});return S(t.length?{level:0,lateralStart:0,lateralEnd:t[0].length}:null,r)[0]}(n);return l=function(e,t){const r=w((e,t,r)=>i.buildEntryKey(e),(e,i,n)=>{let o,{nextLevelNodes:s,thickness:l}=e,a=l+n,c=l/a,d=[];if(s.length)for(let e of s)if(void 0===o){let t=r(e,i,a);o=t[0],d.push(t[1])}else{let t=r(e,o,0);d.push(t[1])}else o=t;let m=(o-i)*c;return[o-m,Object.assign(Object.assign({},e),{thickness:m,nextLevelNodes:d})]});return e.map(e=>r(e,0,0)[1])}(l,1),{segRects:function(e){let t=[];const r=w((e,t,r)=>i.buildEntryKey(e),(e,i,r)=>{let o=Object.assign(Object.assign({},e),{levelCoord:i,stackDepth:r,stackForward:0});return t.push(o),o.stackForward=n(e.nextLevelNodes,i+e.thickness,r+1)+1});function n(e,t,i){let n=0;for(let o of e)n=Math.max(r(o,t,i),n);return n}return n(e,0,0),t}(l),hiddenGroups:s}}function S(e,t){if(!e)return[[],0];let{level:i,lateralStart:r,lateralEnd:n}=e,o=r,s=[];for(;o<n;)s.push(t(i,o)),o+=1;return s.sort(C),[s.map(E),s[0][1]]}function C(e,t){return t[1]-e[1]}function E(e){return e[0]}function w(e,t){const i={};return(...r)=>{let n=e(...r);return n in i?i[n]:i[n]=t(...r)}}function D(e,t,i=null,r=0){let n=[];if(i)for(let o=0;o<e.length;o+=1){let s=e[o],l=i.computeDateTop(s.start,t),a=Math.max(l+(r||0),i.computeDateTop(s.end,t));n.push({start:Math.round(l),end:Math.round(a)})}return n}const R=i.createFormatter({hour:"numeric",minute:"2-digit",meridiem:!1});class k extends i.BaseComponent{render(){return r.createElement(i.StandardEvent,Object.assign({},this.props,{elClasses:["fc-timegrid-event","fc-v-event",this.props.isShort&&"fc-timegrid-event-short"],defaultTimeFormat:R}))}}class M extends i.BaseComponent{constructor(){super(...arguments),this.sortEventSegs=i.memoize(i.sortEventSegs)}render(){let{props:e,context:t}=this,{options:n}=t,o=n.selectMirror,s=e.eventDrag&&e.eventDrag.segs||e.eventResize&&e.eventResize.segs||o&&e.dateSelectionSegs||[],l=e.eventDrag&&e.eventDrag.affectedInstances||e.eventResize&&e.eventResize.affectedInstances||{},a=this.sortEventSegs(e.fgEventSegs,n.eventOrder);return r.createElement(i.DayCellContainer,{elTag:"td",elRef:e.elRef,elClasses:["fc-timegrid-col",...e.extraClassNames||[]],elAttrs:Object.assign({role:"gridcell"},e.extraDataAttrs),date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,extraRenderProps:e.extraRenderProps},t=>r.createElement("div",{className:"fc-timegrid-col-frame"},r.createElement("div",{className:"fc-timegrid-col-bg"},this.renderFillSegs(e.businessHourSegs,"non-business"),this.renderFillSegs(e.bgEventSegs,"bg-event"),this.renderFillSegs(e.dateSelectionSegs,"highlight")),r.createElement("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(a,l,!1,!1,!1)),r.createElement("div",{className:"fc-timegrid-col-events"},this.renderFgSegs(s,{},Boolean(e.eventDrag),Boolean(e.eventResize),Boolean(o))),r.createElement("div",{className:"fc-timegrid-now-indicator-container"},this.renderNowIndicator(e.nowIndicatorSegs)),i.hasCustomDayCellContent(n)&&r.createElement(t,{elTag:"div",elClasses:["fc-timegrid-col-misc"]})))}renderFgSegs(e,t,i,r,n){let{props:o}=this;return o.forPrint?T(e,o):this.renderPositionedFgSegs(e,t,i,r,n)}renderPositionedFgSegs(e,t,n,o,s){let{eventMaxStack:l,eventShortHeight:a,eventOrderStrict:c,eventMinHeight:d}=this.context.options,{date:m,slatCoords:f,eventSelection:h,todayRange:g,nowDate:p}=this.props,u=n||o||s,v=D(e,m,f,d),{segPlacements:b,hiddenGroups:y}=function(e,t,i,r){let n=[],o=[];for(let i=0;i<e.length;i+=1){let r=t[i];r?n.push({index:i,thickness:1,span:r}):o.push(e[i])}let{segRects:s,hiddenGroups:l}=x(n,i,r),a=[];for(let t of s)a.push({seg:e[t.index],rect:t});for(let e of o)a.push({seg:e,rect:null});return{segPlacements:a,hiddenGroups:l}}(e,v,c,l);return r.createElement(r.Fragment,null,this.renderHiddenGroups(y,e),b.map(e=>{let{seg:l,rect:c}=e,d=l.eventRange.instance.instanceId,m=u||Boolean(!t[d]&&c),f=N(c&&c.span),v=!u&&c?this.computeSegHStyle(c):{left:0,right:0},b=Boolean(c)&&c.stackForward>0,y=Boolean(c)&&c.span.end-c.span.start<a;return r.createElement("div",{className:"fc-timegrid-event-harness"+(b?" fc-timegrid-event-harness-inset":""),key:d,style:Object.assign(Object.assign({visibility:m?"":"hidden"},f),v)},r.createElement(k,Object.assign({seg:l,isDragging:n,isResizing:o,isDateSelecting:s,isSelected:d===h,isShort:y},i.getSegMeta(l,g,p))))}))}renderHiddenGroups(e,t){let{extraDateSpan:n,dateProfile:o,todayRange:s,nowDate:l,eventSelection:a,eventDrag:c,eventResize:d}=this.props;return r.createElement(r.Fragment,null,e.map(e=>{let m=N(e.span),f=(h=e.entries,g=t,h.map(e=>g[e.index]));var h,g;return r.createElement(b,{key:i.buildIsoString(i.computeEarliestSegStart(f)),hiddenSegs:f,top:m.top,bottom:m.bottom,extraDateSpan:n,dateProfile:o,todayRange:s,nowDate:l,eventSelection:a,eventDrag:c,eventResize:d})}))}renderFillSegs(e,t){let{props:n,context:o}=this,s=D(e,n.date,n.slatCoords,o.options.eventMinHeight).map((o,s)=>{let l=e[s];return r.createElement("div",{key:i.buildEventRangeKey(l.eventRange),className:"fc-timegrid-bg-harness",style:N(o)},"bg-event"===t?r.createElement(i.BgEvent,Object.assign({seg:l},i.getSegMeta(l,n.todayRange,n.nowDate))):i.renderFill(t))});return r.createElement(r.Fragment,null,s)}renderNowIndicator(e){let{slatCoords:t,date:n}=this.props;return t?e.map((e,o)=>r.createElement(i.NowIndicatorContainer,{key:o,elClasses:["fc-timegrid-now-indicator-line"],elStyle:{top:t.computeDateTop(e.start,n)},isAxis:!1,date:n})):null}computeSegHStyle(e){let t,i,{isRtl:r,options:n}=this.context,o=n.slotEventOverlap,s=e.levelCoord,l=e.levelCoord+e.thickness;o&&(l=Math.min(1,s+2*(l-s))),r?(t=1-l,i=s):(t=s,i=1-l);let a={zIndex:e.stackDepth+1,left:100*t+"%",right:100*i+"%"};return o&&!e.stackForward&&(a[r?"marginLeft":"marginRight"]=20),a}}function T(e,{todayRange:t,nowDate:n,eventSelection:o,eventDrag:s,eventResize:l}){let a=(s?s.affectedInstances:null)||(l?l.affectedInstances:null)||{};return r.createElement(r.Fragment,null,e.map(e=>{let s=e.eventRange.instance.instanceId;return r.createElement("div",{key:s,style:{visibility:a[s]?"hidden":""}},r.createElement(k,Object.assign({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:s===o,isShort:!1},i.getSegMeta(e,t,n))))}))}function N(e){return e?{top:e.start,bottom:-e.end}:{top:"",bottom:""}}class P extends i.BaseComponent{constructor(){super(...arguments),this.splitFgEventSegs=i.memoize(u),this.splitBgEventSegs=i.memoize(u),this.splitBusinessHourSegs=i.memoize(u),this.splitNowIndicatorSegs=i.memoize(u),this.splitDateSelectionSegs=i.memoize(u),this.splitEventDrag=i.memoize(v),this.splitEventResize=i.memoize(v),this.rootElRef=r.createRef(),this.cellElRefs=new i.RefMap}render(){let{props:e,context:t}=this,n=t.options.nowIndicator&&e.slatCoords&&e.slatCoords.safeComputeTop(e.nowDate),o=e.cells.length,s=this.splitFgEventSegs(e.fgEventSegs,o),l=this.splitBgEventSegs(e.bgEventSegs,o),a=this.splitBusinessHourSegs(e.businessHourSegs,o),c=this.splitNowIndicatorSegs(e.nowIndicatorSegs,o),d=this.splitDateSelectionSegs(e.dateSelectionSegs,o),m=this.splitEventDrag(e.eventDrag,o),f=this.splitEventResize(e.eventResize,o);return r.createElement("div",{className:"fc-timegrid-cols",ref:this.rootElRef},r.createElement("table",{role:"presentation",style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,r.createElement("tbody",{role:"presentation"},r.createElement("tr",{role:"row"},e.axis&&r.createElement("td",{"aria-hidden":!0,className:"fc-timegrid-col fc-timegrid-axis"},r.createElement("div",{className:"fc-timegrid-col-frame"},r.createElement("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&r.createElement(i.NowIndicatorContainer,{elClasses:["fc-timegrid-now-indicator-arrow"],elStyle:{top:n},isAxis:!0,date:e.nowDate})))),e.cells.map((t,i)=>r.createElement(M,{key:t.key,elRef:this.cellElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,nowDate:e.nowDate,todayRange:e.todayRange,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,fgEventSegs:s[i],bgEventSegs:l[i],businessHourSegs:a[i],nowIndicatorSegs:c[i],dateSelectionSegs:d[i],eventDrag:m[i],eventResize:f[i],slatCoords:e.slatCoords,eventSelection:e.eventSelection,forPrint:e.forPrint}))))))}componentDidMount(){this.updateCoords()}componentDidUpdate(){this.updateCoords()}updateCoords(){let{props:e}=this;var t;e.onColCoords&&null!==e.clientWidth&&e.onColCoords(new i.PositionCache(this.rootElRef.current,(t=this.cellElRefs.currentMap,e.cells.map(e=>t[e.key])),!0,!1))}}class z extends i.DateComponent{constructor(){super(...arguments),this.processSlotOptions=i.memoize(H),this.state={slatCoords:null},this.handleRootEl=e=>{e?this.context.registerInteractiveComponent(this,{el:e,isHitComboAllowed:this.props.isHitComboAllowed}):this.context.unregisterInteractiveComponent(this)},this.handleScrollRequest=e=>{let{onScrollTopRequest:t}=this.props,{slatCoords:i}=this.state;if(t&&i){if(e.time){let r=i.computeTimeTop(e.time);r=Math.ceil(r),r&&(r+=1),t(r)}return!0}return!1},this.handleColCoords=e=>{this.colCoords=e},this.handleSlatCoords=e=>{this.setState({slatCoords:e}),this.props.onSlatCoords&&this.props.onSlatCoords(e)}}render(){let{props:e,state:t}=this;return r.createElement("div",{className:"fc-timegrid-body",ref:this.handleRootEl,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},r.createElement(p,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),r.createElement(P,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))}componentDidMount(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)}componentDidUpdate(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)}componentWillUnmount(){this.scrollResponder.detach()}queryHit(e,t){let{dateEnv:r,options:n}=this.context,{colCoords:o}=this,{dateProfile:s}=this.props,{slatCoords:l}=this.state,{snapDuration:a,snapsPerSlot:c}=this.processSlotOptions(this.props.slotDuration,n.snapDuration),d=o.leftToIndex(e),m=l.positions.topToIndex(t);if(null!=d&&null!=m){let e=this.props.cells[d],n=l.positions.tops[m],f=l.positions.getHeight(m),h=(t-n)/f,g=m*c+Math.floor(h*c),p=this.props.cells[d].date,u=i.addDurations(s.slotMinTime,i.multiplyDuration(a,g)),v=r.add(p,u),b=r.add(v,a);return{dateProfile:s,dateSpan:Object.assign({range:{start:v,end:b},allDay:!1},e.extraDateSpan),dayEl:o.els[d],rect:{left:o.lefts[d],right:o.rights[d],top:n,bottom:n+f},layer:0}}return null}}function H(e,t){let r=t||e,n=i.wholeDivideDurations(e,r);return null===n&&(r=e,n=1),{snapDuration:r,snapsPerSlot:n}}class W extends i.Slicer{sliceRange(e,t){let r=[];for(let n=0;n<t.length;n+=1){let o=i.intersectRanges(e,t[n]);o&&r.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:n})}return r}}class I extends i.DateComponent{constructor(){super(...arguments),this.buildDayRanges=i.memoize(F),this.slicer=new W,this.timeColsRef=r.createRef()}render(){let{props:e,context:t}=this,{dateProfile:n,dayTableModel:o}=e,s=t.options.nowIndicator,l=this.buildDayRanges(o,n,t.dateEnv);return r.createElement(i.NowTimer,{unit:s?"minute":"day"},(i,a)=>r.createElement(z,Object.assign({ref:this.timeColsRef},this.slicer.sliceProps(e,n,null,t,l),{forPrint:e.forPrint,axis:e.axis,dateProfile:n,slatMetas:e.slatMetas,slotDuration:e.slotDuration,cells:o.cells[0],tableColGroupNode:e.tableColGroupNode,tableMinWidth:e.tableMinWidth,clientWidth:e.clientWidth,clientHeight:e.clientHeight,expandRows:e.expandRows,nowDate:i,nowIndicatorSegs:s&&this.slicer.sliceNowDate(i,t,l),todayRange:a,onScrollTopRequest:e.onScrollTopRequest,onSlatCoords:e.onSlatCoords})))}}function F(e,t,i){let r=[];for(let n of e.headerDates)r.push({start:i.add(n,t.slotMinTime),end:i.add(n,t.slotMaxTime)});return r}const O=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];function G(e,t,r,n,o){let s=new Date(0),l=e,a=i.createDuration(0),c=r||function(e){let t,r,n;for(t=O.length-1;t>=0;t-=1)if(r=i.createDuration(O[t]),n=i.wholeDivideDurations(r,e),null!==n&&n>1)return r;return e}(n),d=[];for(;i.asRoughMs(l)<i.asRoughMs(t);){let e=o.add(s,l),t=null!==i.wholeDivideDurations(a,c);d.push({date:e,time:l,key:e.toISOString(),isoTimeStr:i.formatIsoTimeString(e),isLabeled:t}),l=i.addDurations(l,n),a=i.addDurations(a,n)}return d}class L extends m{constructor(){super(...arguments),this.buildTimeColsModel=i.memoize(A),this.buildSlatMetas=i.memoize(G)}render(){let{options:e,dateEnv:t,dateProfileGenerator:o}=this.context,{props:s}=this,{dateProfile:l}=s,a=this.buildTimeColsModel(l,o),c=this.allDaySplitter.splitProps(s),d=this.buildSlatMetas(l.slotMinTime,l.slotMaxTime,e.slotLabelInterval,e.slotDuration,t),{dayMinWidth:m}=e,f=!m,h=m,g=e.dayHeaders&&r.createElement(i.DayHeader,{dates:a.headerDates,dateProfile:l,datesRepDistinctDays:!0,renderIntro:f?this.renderHeadAxis:null}),p=!1!==e.allDaySlot&&(t=>r.createElement(n.DayTable,Object.assign({},c.allDay,{dateProfile:l,dayTableModel:a,nextDayThreshold:e.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:f?this.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:s.forPrint},this.getAllDayMaxEventProps()))),u=t=>r.createElement(I,Object.assign({},c.timed,{dayTableModel:a,dateProfile:l,axis:f,slotDuration:e.slotDuration,slatMetas:d,forPrint:s.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:this.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:this.handleScrollTopRequest}));return h?this.renderHScrollLayout(g,p,u,a.colCnt,m,d,this.state.slatCoords):this.renderSimpleLayout(g,p,u)}}function A(e,t){let r=new i.DaySeriesModel(e.renderRange,t);return new i.DayTableModel(r,!1)}const j={allDaySlot:Boolean};i.injectStyles('.fc-v-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-v-event .fc-event-main{color:var(--fc-event-text-color);height:100%}.fc-v-event .fc-event-main-frame{display:flex;flex-direction:column;height:100%}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{bottom:0;max-height:100%;overflow:hidden;top:0}.fc-v-event:not(.fc-event-start){border-top-left-radius:0;border-top-right-radius:0;border-top-width:0}.fc-v-event:not(.fc-event-end){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:var(--fc-event-resizer-thickness);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-thickness)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:calc(var(--fc-event-resizer-dot-total-width)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%;position:relative;z-index:1}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{border-bottom:0;height:1.5em}.fc .fc-timegrid-slot:empty:before{content:"\\00a0"}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{align-items:center;display:flex;justify-content:flex-end;overflow:hidden}.fc .fc-timegrid-axis-cushion{flex-shrink:0;max-width:60px}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col.fc-day-today{background-color:var(--fc-today-bg-color)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{bottom:0;height:auto;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols{bottom:0;left:0;position:absolute;right:0;top:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{left:0;position:absolute;right:0;top:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{left:0;position:absolute;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{bottom:0;left:0;position:absolute;right:0;top:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px var(--fc-page-bg-color)}.fc-timegrid-event,.fc-timegrid-more-link{border-radius:3px;font-size:var(--fc-small-font-size)}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{font-size:var(--fc-small-font-size);margin-bottom:1px;white-space:nowrap}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:"\\00a0-\\00a0"}.fc-timegrid-event-short .fc-event-title{font-size:var(--fc-small-font-size)}.fc-timegrid-more-link{background:var(--fc-more-link-bg-color);color:var(--fc-more-link-text-color);cursor:pointer;margin-bottom:1px;position:absolute;z-index:9999}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{border-color:var(--fc-now-indicator-color);border-style:solid;border-width:1px 0 0;left:0;position:absolute;right:0;z-index:4}.fc .fc-timegrid-now-indicator-arrow{border-color:var(--fc-now-indicator-color);border-style:solid;margin-top:-5px;position:absolute;z-index:4}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 0 5px 6px;left:0}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{border-bottom-color:transparent;border-top-color:transparent;border-width:5px 6px 5px 0;right:0}');var B=t.createPlugin({name:"@fullcalendar/timegrid",initialView:"timeGridWeek",optionRefiners:j,views:{timeGrid:{component:L,usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}}),q={__proto__:null,TimeColsView:m,DayTimeColsView:L,buildTimeColsModel:A,DayTimeCols:I,buildDayRanges:F,DayTimeColsSlicer:W,TimeCols:z,buildSlatMetas:G,TimeColsSlatsCoords:h};return t.globalPlugins.push(B),e.Internal=q,e.default=B,Object.defineProperty(e,"__esModule",{value:!0}),e}({},FullCalendar,FullCalendar.Internal,FullCalendar.Preact,FullCalendar.DayGrid.Internal); \ No newline at end of file
diff --git a/library/fullcalendar/packages/timegrid/main.css b/library/fullcalendar/packages/timegrid/main.css
deleted file mode 100644
index b8ee6448a..000000000
--- a/library/fullcalendar/packages/timegrid/main.css
+++ /dev/null
@@ -1,309 +0,0 @@
-@charset "UTF-8";
-/* TimeGridView all-day area
---------------------------------------------------------------------------------------------------*/
-.fc-timeGrid-view .fc-day-grid {
- position: relative;
- z-index: 2;
- /* so the "more.." popover will be over the time grid */
-}
-
-.fc-timeGrid-view .fc-day-grid .fc-row {
- min-height: 3em;
- /* all-day section will never get shorter than this */
-}
-
-.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton {
- padding-bottom: 1em;
- /* give space underneath events for clicking/selecting days */
-}
-
-/* TimeGrid axis running down the side (for both the all-day area and the slot area)
---------------------------------------------------------------------------------------------------*/
-.fc .fc-axis {
- /* .fc to overcome default cell styles */
- vertical-align: middle;
- padding: 0 4px;
- white-space: nowrap;
-}
-
-.fc-ltr .fc-axis {
- text-align: right;
-}
-
-.fc-rtl .fc-axis {
- text-align: left;
-}
-
-/* TimeGrid Structure
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid-container,
-.fc-time-grid {
- /* so slats/bg/content/etc positions get scoped within here */
- position: relative;
- z-index: 1;
-}
-
-.fc-time-grid {
- min-height: 100%;
- /* so if height setting is 'auto', .fc-bg stretches to fill height */
-}
-
-.fc-time-grid table {
- /* don't put outer borders on slats/bg/content/etc */
- border: 0 hidden transparent;
-}
-
-.fc-time-grid > .fc-bg {
- z-index: 1;
-}
-
-.fc-time-grid .fc-slats,
-.fc-time-grid > hr {
- /* the <hr> TimeGridView injects when grid is shorter than scroller */
- position: relative;
- z-index: 2;
-}
-
-.fc-time-grid .fc-content-col {
- position: relative;
- /* because now-indicator lives directly inside */
-}
-
-.fc-time-grid .fc-content-skeleton {
- position: absolute;
- z-index: 3;
- top: 0;
- left: 0;
- right: 0;
-}
-
-/* divs within a cell within the fc-content-skeleton */
-.fc-time-grid .fc-business-container {
- position: relative;
- z-index: 1;
-}
-
-.fc-time-grid .fc-bgevent-container {
- position: relative;
- z-index: 2;
-}
-
-.fc-time-grid .fc-highlight-container {
- position: relative;
- z-index: 3;
-}
-
-.fc-time-grid .fc-event-container {
- position: relative;
- z-index: 4;
-}
-
-.fc-time-grid .fc-now-indicator-line {
- z-index: 5;
-}
-
-.fc-time-grid .fc-mirror-container {
- /* also is fc-event-container */
- position: relative;
- z-index: 6;
-}
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-slats td {
- height: 1.5em;
- border-bottom: 0;
- /* each cell is responsible for its top border */
-}
-
-.fc-time-grid .fc-slats .fc-minor td {
- border-top-style: dotted;
-}
-
-/* TimeGrid Highlighting Slots
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-highlight-container {
- /* a div within a cell within the fc-highlight-skeleton */
- position: relative;
- /* scopes the left/right of the fc-highlight to be in the column */
-}
-
-.fc-time-grid .fc-highlight {
- position: absolute;
- left: 0;
- right: 0;
- /* top and bottom will be in by JS */
-}
-
-/* TimeGrid Event Containment
---------------------------------------------------------------------------------------------------*/
-.fc-ltr .fc-time-grid .fc-event-container {
- /* space on the sides of events for LTR (default) */
- margin: 0 2.5% 0 2px;
-}
-
-.fc-rtl .fc-time-grid .fc-event-container {
- /* space on the sides of events for RTL */
- margin: 0 2px 0 2.5%;
-}
-
-.fc-time-grid .fc-event,
-.fc-time-grid .fc-bgevent {
- position: absolute;
- z-index: 1;
- /* scope inner z-index's */
-}
-
-.fc-time-grid .fc-bgevent {
- /* background events always span full width */
- left: 0;
- right: 0;
-}
-
-/* TimeGrid Event Styling
-----------------------------------------------------------------------------------------------------
-We use the full "fc-time-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-time-grid-event {
- margin-bottom: 1px;
-}
-
-.fc-time-grid-event-inset {
- -webkit-box-shadow: 0px 0px 0px 1px #fff;
- box-shadow: 0px 0px 0px 1px #fff;
-}
-
-.fc-time-grid-event.fc-not-start {
- /* events that are continuing from another day */
- /* replace space made by the top border with padding */
- border-top-width: 0;
- padding-top: 1px;
- /* remove top rounded corners */
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-
-.fc-time-grid-event.fc-not-end {
- /* replace space made by the top border with padding */
- border-bottom-width: 0;
- padding-bottom: 1px;
- /* remove bottom rounded corners */
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
-}
-
-.fc-time-grid-event .fc-content {
- overflow: hidden;
- max-height: 100%;
-}
-
-.fc-time-grid-event .fc-time,
-.fc-time-grid-event .fc-title {
- padding: 0 1px;
-}
-
-.fc-time-grid-event .fc-time {
- font-size: 0.85em;
- white-space: nowrap;
-}
-
-/* short mode, where time and title are on the same line */
-.fc-time-grid-event.fc-short .fc-content {
- /* don't wrap to second line (now that contents will be inline) */
- white-space: nowrap;
-}
-
-.fc-time-grid-event.fc-short .fc-time,
-.fc-time-grid-event.fc-short .fc-title {
- /* put the time and title on the same line */
- display: inline-block;
- vertical-align: top;
-}
-
-.fc-time-grid-event.fc-short .fc-time span {
- display: none;
- /* don't display the full time text... */
-}
-
-.fc-time-grid-event.fc-short .fc-time:before {
- content: attr(data-start);
- /* ...instead, display only the start time */
-}
-
-.fc-time-grid-event.fc-short .fc-time:after {
- content: " - ";
- /* seperate with a dash, wrapped in nbsp's */
-}
-
-.fc-time-grid-event.fc-short .fc-title {
- font-size: 0.85em;
- /* make the title text the same size as the time */
- padding: 0;
- /* undo padding from above */
-}
-
-/* resizer (cursor device) */
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
- left: 0;
- right: 0;
- bottom: 0;
- height: 8px;
- overflow: hidden;
- line-height: 8px;
- font-size: 11px;
- font-family: monospace;
- text-align: center;
- cursor: s-resize;
-}
-
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
- content: "=";
-}
-
-/* resizer (touch device) */
-.fc-time-grid-event.fc-selected .fc-resizer {
- /* 10x10 dot */
- border-radius: 5px;
- border-width: 1px;
- width: 8px;
- height: 8px;
- border-style: solid;
- border-color: inherit;
- background: #fff;
- /* horizontally center */
- left: 50%;
- margin-left: -5px;
- /* center on the bottom edge */
- bottom: -5px;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-now-indicator-line {
- border-top-width: 1px;
- left: 0;
- right: 0;
-}
-
-/* arrow on axis */
-.fc-time-grid .fc-now-indicator-arrow {
- margin-top: -5px;
- /* vertically center on top coordinate */
-}
-
-.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
- left: 0;
- /* triangle pointing right... */
- border-width: 5px 0 5px 6px;
- border-top-color: transparent;
- border-bottom-color: transparent;
-}
-
-.fc-rtl .fc-time-grid .fc-now-indicator-arrow {
- right: 0;
- /* triangle pointing left... */
- border-width: 5px 6px 5px 0;
- border-top-color: transparent;
- border-bottom-color: transparent;
-}
diff --git a/library/fullcalendar/packages/timegrid/main.d.ts b/library/fullcalendar/packages/timegrid/main.d.ts
deleted file mode 100644
index 303b51672..000000000
--- a/library/fullcalendar/packages/timegrid/main.d.ts
+++ /dev/null
@@ -1,224 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-// ../../../../../@fullcalendar/core
-// ../../../../../@fullcalendar/daygrid
-
-declare module '@fullcalendar/timegrid' {
- import AbstractTimeGridView from '@fullcalendar/timegrid/AbstractTimeGridView';
- import TimeGridView, { buildDayTable } from '@fullcalendar/timegrid/TimeGridView';
- import { TimeGridSeg } from '@fullcalendar/timegrid/TimeGrid';
- import { TimeGridSlicer, buildDayRanges } from '@fullcalendar/timegrid/SimpleTimeGrid';
- export { TimeGridView, AbstractTimeGridView, buildDayTable, buildDayRanges, TimeGridSlicer, TimeGridSeg };
- export { default as TimeGrid } from '@fullcalendar/timegrid/TimeGrid';
- const _default: import("@fullcalendar/core").PluginDef;
- export default _default;
-}
-
-declare module '@fullcalendar/timegrid/AbstractTimeGridView' {
- import { ScrollComponent, View, ComponentContext, Duration, ViewProps } from '@fullcalendar/core';
- import { DayGrid } from '@fullcalendar/daygrid';
- import TimeGrid from '@fullcalendar/timegrid/TimeGrid';
- import AllDaySplitter from '@fullcalendar/timegrid/AllDaySplitter';
- export { AbstractTimeGridView as default, AbstractTimeGridView };
- abstract class AbstractTimeGridView extends View {
- timeGrid: TimeGrid;
- dayGrid: DayGrid;
- scroller: ScrollComponent;
- axisWidth: any;
- protected splitter: AllDaySplitter;
- render(props: ViewProps, context: ComponentContext): void;
- destroy(): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- renderSkeletonHtml(): string;
- getNowIndicatorUnit(): string;
- unrenderNowIndicator(): void;
- updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
- updateBaseSize(isResize: any, viewHeight: any, isAuto: any): void;
- computeScrollerHeight(viewHeight: any): number;
- computeDateScroll(duration: Duration): {
- top: any;
- };
- queryDateScroll(): {
- top: number;
- };
- applyDateScroll(scroll: any): void;
- renderHeadIntroHtml: () => string;
- axisStyleAttr(): string;
- renderTimeGridBgIntroHtml: () => string;
- renderTimeGridIntroHtml: () => string;
- renderDayGridBgIntroHtml: () => string;
- renderDayGridIntroHtml: () => string;
- }
-}
-
-declare module '@fullcalendar/timegrid/TimeGridView' {
- import { DateProfileGenerator, DateProfile, ComponentContext, DayHeader, DayTable, ViewProps } from '@fullcalendar/core';
- import { SimpleDayGrid } from '@fullcalendar/daygrid';
- import SimpleTimeGrid from '@fullcalendar/timegrid/SimpleTimeGrid';
- import AbstractTimeGridView from '@fullcalendar/timegrid/AbstractTimeGridView';
- export { TimeGridView as default, TimeGridView };
- class TimeGridView extends AbstractTimeGridView {
- header: DayHeader;
- simpleDayGrid: SimpleDayGrid;
- simpleTimeGrid: SimpleTimeGrid;
- render(props: ViewProps, context: ComponentContext): void;
- _renderSkeleton(context: ComponentContext): void;
- _unrenderSkeleton(): void;
- renderNowIndicator(date: any): void;
- }
- export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
-}
-
-declare module '@fullcalendar/timegrid/TimeGrid' {
- import { PositionCache, Duration, DateMarker, DateFormatter, ComponentContext, DateComponent, Seg, EventSegUiInteractionState, DateProfile, Theme } from '@fullcalendar/core';
- export interface RenderProps {
- renderBgIntroHtml: () => string;
- renderIntroHtml: () => string;
- }
- export interface TimeGridSeg extends Seg {
- col: number;
- start: DateMarker;
- end: DateMarker;
- }
- export interface TimeGridCell {
- date: DateMarker;
- htmlAttrs?: string;
- }
- export interface TimeGridProps {
- dateProfile: DateProfile;
- cells: TimeGridCell[];
- businessHourSegs: TimeGridSeg[];
- bgEventSegs: TimeGridSeg[];
- fgEventSegs: TimeGridSeg[];
- dateSelectionSegs: TimeGridSeg[];
- eventSelection: string;
- eventDrag: EventSegUiInteractionState | null;
- eventResize: EventSegUiInteractionState | null;
- }
- export { TimeGrid as default, TimeGrid };
- class TimeGrid extends DateComponent<TimeGridProps> {
- renderProps: RenderProps;
- slotDuration: Duration;
- snapDuration: Duration;
- snapsPerSlot: any;
- labelFormat: DateFormatter;
- labelInterval: Duration;
- colCnt: number;
- colEls: HTMLElement[];
- slatContainerEl: HTMLElement;
- slatEls: HTMLElement[];
- nowIndicatorEls: HTMLElement[];
- colPositions: PositionCache;
- slatPositions: PositionCache;
- isSlatSizesDirty: boolean;
- isColSizesDirty: boolean;
- rootBgContainerEl: HTMLElement;
- bottomRuleEl: HTMLElement;
- contentSkeletonEl: HTMLElement;
- colContainerEls: HTMLElement[];
- fgContainerEls: HTMLElement[];
- bgContainerEls: HTMLElement[];
- mirrorContainerEls: HTMLElement[];
- highlightContainerEls: HTMLElement[];
- businessContainerEls: HTMLElement[];
- constructor(el: HTMLElement, renderProps: RenderProps);
- _processOptions(options: any): void;
- computeLabelInterval(slotDuration: any): any;
- render(props: TimeGridProps, context: ComponentContext): void;
- destroy(): void;
- updateSize(isResize: boolean): void;
- _renderSkeleton(theme: Theme): void;
- _renderSlats(dateProfile: DateProfile): void;
- renderSlatRowHtml(dateProfile: DateProfile): string;
- _renderColumns(cells: TimeGridCell[], dateProfile: DateProfile): void;
- _unrenderColumns(): void;
- renderContentSkeleton(): void;
- unrenderContentSkeleton(): void;
- groupSegsByCol(segs: any): any[];
- attachSegsByCol(segsByCol: any, containerEls: HTMLElement[]): void;
- getNowIndicatorUnit(): string;
- renderNowIndicator(segs: TimeGridSeg[], date: any): void;
- unrenderNowIndicator(): void;
- getTotalSlatHeight(): number;
- computeDateTop(when: DateMarker, startOfDayDate?: DateMarker): any;
- computeTimeTop(duration: Duration): any;
- computeSegVerticals(segs: any): void;
- assignSegVerticals(segs: any): void;
- generateSegVerticalCss(seg: any): {
- top: any;
- bottom: number;
- };
- buildPositionCaches(): void;
- buildColPositions(): void;
- buildSlatPositions(): void;
- positionToHit(positionLeft: any, positionTop: any): {
- col: any;
- dateSpan: {
- range: {
- start: Date;
- end: Date;
- };
- allDay: boolean;
- };
- dayEl: HTMLElement;
- relativeRect: {
- left: any;
- right: any;
- top: any;
- bottom: any;
- };
- };
- _renderEventDrag(state: EventSegUiInteractionState): void;
- _unrenderEventDrag(state: EventSegUiInteractionState): void;
- _renderEventResize(state: EventSegUiInteractionState): void;
- _unrenderEventResize(state: EventSegUiInteractionState): void;
- _renderDateSelection(segs: Seg[]): void;
- _unrenderDateSelection(segs: Seg[]): void;
- }
-}
-
-declare module '@fullcalendar/timegrid/SimpleTimeGrid' {
- import { DateComponent, DateProfile, EventStore, EventUiHash, EventInteractionState, DateSpan, DateRange, DayTable, DateEnv, DateMarker, Slicer, Hit, ComponentContext } from '@fullcalendar/core';
- import TimeGrid, { TimeGridSeg } from '@fullcalendar/timegrid/TimeGrid';
- export interface SimpleTimeGridProps {
- dateProfile: DateProfile | null;
- dayTable: DayTable;
- businessHours: EventStore;
- eventStore: EventStore;
- eventUiBases: EventUiHash;
- dateSelection: DateSpan | null;
- eventSelection: string;
- eventDrag: EventInteractionState | null;
- eventResize: EventInteractionState | null;
- }
- export { SimpleTimeGrid as default, SimpleTimeGrid };
- class SimpleTimeGrid extends DateComponent<SimpleTimeGridProps> {
- timeGrid: TimeGrid;
- constructor(timeGrid: TimeGrid);
- firstContext(context: ComponentContext): void;
- destroy(): void;
- render(props: SimpleTimeGridProps, context: ComponentContext): void;
- renderNowIndicator(date: DateMarker): void;
- buildPositionCaches(): void;
- queryHit(positionLeft: number, positionTop: number): Hit;
- }
- export function buildDayRanges(dayTable: DayTable, dateProfile: DateProfile, dateEnv: DateEnv): DateRange[];
- export class TimeGridSlicer extends Slicer<TimeGridSeg, [DateRange[]]> {
- sliceRange(range: DateRange, dayRanges: DateRange[]): TimeGridSeg[];
- }
-}
-
-declare module '@fullcalendar/timegrid/AllDaySplitter' {
- import { Splitter, EventDef, DateSpan } from '@fullcalendar/core';
- export { AllDaySplitter as default, AllDaySplitter };
- class AllDaySplitter extends Splitter {
- getKeyInfo(): {
- allDay: {};
- timed: {};
- };
- getKeysForDateSpan(dateSpan: DateSpan): string[];
- getKeysForEventDef(eventDef: EventDef): string[];
- }
-}
-
diff --git a/library/fullcalendar/packages/timegrid/main.esm.js b/library/fullcalendar/packages/timegrid/main.esm.js
deleted file mode 100644
index 7038488f4..000000000
--- a/library/fullcalendar/packages/timegrid/main.esm.js
+++ /dev/null
@@ -1,1391 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import { createFormatter, removeElement, computeEventDraggable, computeEventStartResizable, computeEventEndResizable, cssToStr, isMultiDayRange, htmlEscape, compareByFieldSpecs, applyStyle, FgEventRenderer, buildSegCompareObj, FillRenderer, memoize, memoizeRendering, createDuration, wholeDivideDurations, findElements, PositionCache, startOfDay, asRoughMs, formatIsoTimeString, addDurations, htmlToElement, createElement, multiplyDuration, DateComponent, hasBgRendering, Splitter, diffDays, buildGotoAnchorHtml, getAllDayHtml, ScrollComponent, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, View, intersectRanges, Slicer, DayHeader, DaySeries, DayTable, createPlugin } from '@fullcalendar/core';
-import { DayBgRow, DayGrid, SimpleDayGrid } from '@fullcalendar/daygrid';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
-};
-
-function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
-};
-
-/*
-Only handles foreground segs.
-Does not own rendering. Use for low-level util methods by TimeGrid.
-*/
-var TimeGridEventRenderer = /** @class */ (function (_super) {
- __extends(TimeGridEventRenderer, _super);
- function TimeGridEventRenderer(timeGrid) {
- var _this = _super.call(this) || this;
- _this.timeGrid = timeGrid;
- return _this;
- }
- TimeGridEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- _super.prototype.renderSegs.call(this, context, segs, mirrorInfo);
- // TODO: dont do every time. memoize
- this.fullTimeFormat = createFormatter({
- hour: 'numeric',
- minute: '2-digit',
- separator: this.context.options.defaultRangeSeparator
- });
- };
- // Given an array of foreground segments, render a DOM element for each, computes position,
- // and attaches to the column inner-container elements.
- TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var segsByCol = this.timeGrid.groupSegsByCol(segs);
- // order the segs within each column
- // TODO: have groupSegsByCol do this?
- for (var col = 0; col < segsByCol.length; col++) {
- segsByCol[col] = this.sortEventSegs(segsByCol[col]);
- }
- this.segsByCol = segsByCol;
- this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
- };
- TimeGridEventRenderer.prototype.detachSegs = function (segs) {
- segs.forEach(function (seg) {
- removeElement(seg.el);
- });
- this.segsByCol = null;
- };
- TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
- var colCnt = timeGrid.colCnt;
- timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
- if (segsByCol) {
- for (var col = 0; col < colCnt; col++) {
- this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
- }
- }
- };
- TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
- var colCnt = timeGrid.colCnt;
- timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
- if (segsByCol) {
- for (var col = 0; col < colCnt; col++) {
- this.assignSegCss(segsByCol[col]);
- }
- }
- };
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
- TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- meridiem: false
- };
- };
- // Computes a default `displayEventEnd` value if one is not expliclty defined
- TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Renders the HTML for a single event segment's default rendering
- TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventUi = eventRange.ui;
- var allDay = eventDef.allDay;
- var isDraggable = computeEventDraggable(this.context, eventDef, eventUi);
- var isResizableFromStart = seg.isStart && computeEventStartResizable(this.context, eventDef, eventUi);
- var isResizableFromEnd = seg.isEnd && computeEventEndResizable(this.context, eventDef, eventUi);
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
- var skinCss = cssToStr(this.getSkinCss(eventUi));
- var timeText;
- var fullTimeText; // more verbose time text. for the print stylesheet
- var startTimeText; // just the start time text
- classes.unshift('fc-time-grid-event');
- // if the event appears to span more than one day...
- if (isMultiDayRange(eventRange.range)) {
- // Don't display time text on segments that run entirely through a day.
- // That would appear as midnight-midnight and would look dumb.
- // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
- if (seg.isStart || seg.isEnd) {
- var unzonedStart = seg.start;
- var unzonedEnd = seg.end;
- timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
- fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
- startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
- }
- }
- else {
- // Display the normal time text for the *event's* times
- timeText = this.getTimeText(eventRange);
- fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
- startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
- }
- return '<a class="' + classes.join(' ') + '"' +
- (eventDef.url ?
- ' href="' + htmlEscape(eventDef.url) + '"' :
- '') +
- (skinCss ?
- ' style="' + skinCss + '"' :
- '') +
- '>' +
- '<div class="fc-content">' +
- (timeText ?
- '<div class="fc-time"' +
- ' data-start="' + htmlEscape(startTimeText) + '"' +
- ' data-full="' + htmlEscape(fullTimeText) + '"' +
- '>' +
- '<span>' + htmlEscape(timeText) + '</span>' +
- '</div>' :
- '') +
- (eventDef.title ?
- '<div class="fc-title">' +
- htmlEscape(eventDef.title) +
- '</div>' :
- '') +
- '</div>' +
- /* TODO: write CSS for this
- (isResizableFromStart ?
- '<div class="fc-resizer fc-start-resizer"></div>' :
- ''
- ) +
- */
- (isResizableFromEnd ?
- '<div class="fc-resizer fc-end-resizer"></div>' :
- '') +
- '</a>';
- };
- // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
- // Assumed the segs are already ordered.
- // NOTE: Also reorders the given array by date!
- TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
- var levels;
- var level0;
- var i;
- levels = buildSlotSegLevels(segs);
- computeForwardSlotSegs(levels);
- if ((level0 = levels[0])) {
- for (i = 0; i < level0.length; i++) {
- computeSlotSegPressures(level0[i]);
- }
- for (i = 0; i < level0.length; i++) {
- this.computeSegForwardBack(level0[i], 0, 0);
- }
- }
- };
- // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
- // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
- // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
- //
- // The segment might be part of a "series", which means consecutive segments with the same pressure
- // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
- // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
- // coordinate of the first segment in the series.
- TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
- var forwardSegs = seg.forwardSegs;
- var i;
- if (seg.forwardCoord === undefined) { // not already computed
- if (!forwardSegs.length) {
- // if there are no forward segments, this segment should butt up against the edge
- seg.forwardCoord = 1;
- }
- else {
- // sort highest pressure first
- this.sortForwardSegs(forwardSegs);
- // this segment's forwardCoord will be calculated from the backwardCoord of the
- // highest-pressure forward segment.
- this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
- seg.forwardCoord = forwardSegs[0].backwardCoord;
- }
- // calculate the backwardCoord from the forwardCoord. consider the series
- seg.backwardCoord = seg.forwardCoord -
- (seg.forwardCoord - seriesBackwardCoord) / // available width for series
- (seriesBackwardPressure + 1); // # of segments in the series
- // use this segment's coordinates to computed the coordinates of the less-pressurized
- // forward segments
- for (i = 0; i < forwardSegs.length; i++) {
- this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
- }
- }
- };
- TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
- var objs = forwardSegs.map(buildTimeGridSegCompareObj);
- var specs = [
- // put higher-pressure first
- { field: 'forwardPressure', order: -1 },
- // put segments that are closer to initial edge first (and favor ones with no coords yet)
- { field: 'backwardCoord', order: 1 }
- ].concat(this.context.eventOrderSpecs);
- objs.sort(function (obj0, obj1) {
- return compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- // Given foreground event segments that have already had their position coordinates computed,
- // assigns position-related CSS values to their elements.
- TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- applyStyle(seg.el, this.generateSegCss(seg));
- if (seg.level > 0) {
- seg.el.classList.add('fc-time-grid-event-inset');
- }
- // if the event is short that the title will be cut off,
- // attach a className that condenses the title into the time area.
- if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
- seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
- }
- }
- };
- // Generates an object with CSS properties/values that should be applied to an event segment element.
- // Contains important positioning-related properties that should be applied to any event element, customized or not.
- TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
- var shouldOverlap = this.context.options.slotEventOverlap;
- var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
- var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
- var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
- var isRtl = this.context.isRtl;
- var left; // amount of space from left edge, a fraction of the total width
- var right; // amount of space from right edge, a fraction of the total width
- if (shouldOverlap) {
- // double the width, but don't go beyond the maximum forward coordinate (1.0)
- forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
- }
- if (isRtl) {
- left = 1 - forwardCoord;
- right = backwardCoord;
- }
- else {
- left = backwardCoord;
- right = 1 - forwardCoord;
- }
- props.zIndex = seg.level + 1; // convert from 0-base to 1-based
- props.left = left * 100 + '%';
- props.right = right * 100 + '%';
- if (shouldOverlap && seg.forwardPressure) {
- // add padding to the edge so that forward stacked events don't cover the resizer's icon
- props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
- }
- return props;
- };
- return TimeGridEventRenderer;
-}(FgEventRenderer));
-// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
-// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
-function buildSlotSegLevels(segs) {
- var levels = [];
- var i;
- var seg;
- var j;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- // go through all the levels and stop on the first level where there are no collisions
- for (j = 0; j < levels.length; j++) {
- if (!computeSlotSegCollisions(seg, levels[j]).length) {
- break;
- }
- }
- seg.level = j;
- (levels[j] || (levels[j] = [])).push(seg);
- }
- return levels;
-}
-// For every segment, figure out the other segments that are in subsequent
-// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
-function computeForwardSlotSegs(levels) {
- var i;
- var level;
- var j;
- var seg;
- var k;
- for (i = 0; i < levels.length; i++) {
- level = levels[i];
- for (j = 0; j < level.length; j++) {
- seg = level[j];
- seg.forwardSegs = [];
- for (k = i + 1; k < levels.length; k++) {
- computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
- }
- }
- }
-}
-// Figure out which path forward (via seg.forwardSegs) results in the longest path until
-// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
-function computeSlotSegPressures(seg) {
- var forwardSegs = seg.forwardSegs;
- var forwardPressure = 0;
- var i;
- var forwardSeg;
- if (seg.forwardPressure === undefined) { // not already computed
- for (i = 0; i < forwardSegs.length; i++) {
- forwardSeg = forwardSegs[i];
- // figure out the child's maximum forward path
- computeSlotSegPressures(forwardSeg);
- // either use the existing maximum, or use the child's forward pressure
- // plus one (for the forwardSeg itself)
- forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
- }
- seg.forwardPressure = forwardPressure;
- }
-}
-// Find all the segments in `otherSegs` that vertically collide with `seg`.
-// Append into an optionally-supplied `results` array and return.
-function computeSlotSegCollisions(seg, otherSegs, results) {
- if (results === void 0) { results = []; }
- for (var i = 0; i < otherSegs.length; i++) {
- if (isSlotSegCollision(seg, otherSegs[i])) {
- results.push(otherSegs[i]);
- }
- }
- return results;
-}
-// Do these segments occupy the same vertical space?
-function isSlotSegCollision(seg1, seg2) {
- return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
-}
-function buildTimeGridSegCompareObj(seg) {
- var obj = buildSegCompareObj(seg);
- obj.forwardPressure = seg.forwardPressure;
- obj.backwardCoord = seg.backwardCoord;
- return obj;
-}
-
-var TimeGridMirrorRenderer = /** @class */ (function (_super) {
- __extends(TimeGridMirrorRenderer, _super);
- function TimeGridMirrorRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- this.segsByCol = this.timeGrid.groupSegsByCol(segs);
- this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
- this.sourceSeg = mirrorInfo.sourceSeg;
- };
- TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
- var props = _super.prototype.generateSegCss.call(this, seg);
- var sourceSeg = this.sourceSeg;
- if (sourceSeg && sourceSeg.col === seg.col) {
- var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
- props.left = sourceSegProps.left;
- props.right = sourceSegProps.right;
- props.marginLeft = sourceSegProps.marginLeft;
- props.marginRight = sourceSegProps.marginRight;
- }
- return props;
- };
- return TimeGridMirrorRenderer;
-}(TimeGridEventRenderer));
-
-var TimeGridFillRenderer = /** @class */ (function (_super) {
- __extends(TimeGridFillRenderer, _super);
- function TimeGridFillRenderer(timeGrid) {
- var _this = _super.call(this) || this;
- _this.timeGrid = timeGrid;
- return _this;
- }
- TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
- var timeGrid = this.timeGrid;
- var containerEls;
- // TODO: more efficient lookup
- if (type === 'bgEvent') {
- containerEls = timeGrid.bgContainerEls;
- }
- else if (type === 'businessHours') {
- containerEls = timeGrid.businessContainerEls;
- }
- else if (type === 'highlight') {
- containerEls = timeGrid.highlightContainerEls;
- }
- timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
- return segs.map(function (seg) {
- return seg.el;
- });
- };
- TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
- this.timeGrid.computeSegVerticals(segs);
- };
- TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
- this.timeGrid.assignSegVerticals(segs);
- };
- return TimeGridFillRenderer;
-}(FillRenderer));
-
-/* A component that renders one or more columns of vertical time slots
-----------------------------------------------------------------------------------------------------------------------*/
-// potential nice values for the slot-duration and interval-duration
-// from largest to smallest
-var AGENDA_STOCK_SUB_DURATIONS = [
- { hours: 1 },
- { minutes: 30 },
- { minutes: 15 },
- { seconds: 30 },
- { seconds: 15 }
-];
-var TimeGrid = /** @class */ (function (_super) {
- __extends(TimeGrid, _super);
- function TimeGrid(el, renderProps) {
- var _this = _super.call(this, el) || this;
- _this.isSlatSizesDirty = false;
- _this.isColSizesDirty = false;
- _this.processOptions = memoize(_this._processOptions);
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton);
- _this.renderSlats = memoizeRendering(_this._renderSlats, null, [_this.renderSkeleton]);
- _this.renderColumns = memoizeRendering(_this._renderColumns, _this._unrenderColumns, [_this.renderSkeleton]);
- _this.renderProps = renderProps;
- var renderColumns = _this.renderColumns;
- var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
- var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
- _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
- _this.renderBusinessHours = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
- _this.renderDateSelection = memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
- _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
- _this.renderBgEvents = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
- _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
- _this.renderEventResize = memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
- return _this;
- }
- /* Options
- ------------------------------------------------------------------------------------------------------------------*/
- // Parses various options into properties of this object
- // MUST have context already set
- TimeGrid.prototype._processOptions = function (options) {
- var slotDuration = options.slotDuration, snapDuration = options.snapDuration;
- var snapsPerSlot;
- var input;
- slotDuration = createDuration(slotDuration);
- snapDuration = snapDuration ? createDuration(snapDuration) : slotDuration;
- snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration);
- if (snapsPerSlot === null) {
- snapDuration = slotDuration;
- snapsPerSlot = 1;
- // TODO: say warning?
- }
- this.slotDuration = slotDuration;
- this.snapDuration = snapDuration;
- this.snapsPerSlot = snapsPerSlot;
- // might be an array value (for TimelineView).
- // if so, getting the most granular entry (the last one probably).
- input = options.slotLabelFormat;
- if (Array.isArray(input)) {
- input = input[input.length - 1];
- }
- this.labelFormat = createFormatter(input || {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true,
- meridiem: 'short'
- });
- input = options.slotLabelInterval;
- this.labelInterval = input ?
- createDuration(input) :
- this.computeLabelInterval(slotDuration);
- };
- // Computes an automatic value for slotLabelInterval
- TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
- var i;
- var labelInterval;
- var slotsPerLabel;
- // find the smallest stock label interval that results in more than one slots-per-label
- for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
- labelInterval = createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
- slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration);
- if (slotsPerLabel !== null && slotsPerLabel > 1) {
- return labelInterval;
- }
- }
- return slotDuration; // fall back
- };
- /* Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.render = function (props, context) {
- this.processOptions(context.options);
- var cells = props.cells;
- this.colCnt = cells.length;
- this.renderSkeleton(context.theme);
- this.renderSlats(props.dateProfile);
- this.renderColumns(props.cells, props.dateProfile);
- this.renderBusinessHours(context, props.businessHourSegs);
- this.renderDateSelection(props.dateSelectionSegs);
- this.renderFgEvents(context, props.fgEventSegs);
- this.renderBgEvents(context, props.bgEventSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDrag);
- this.renderEventResize(props.eventResize);
- };
- TimeGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- // should unrender everything else too
- this.renderSlats.unrender();
- this.renderColumns.unrender();
- this.renderSkeleton.unrender();
- };
- TimeGrid.prototype.updateSize = function (isResize) {
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
- if (isResize || this.isSlatSizesDirty) {
- this.buildSlatPositions();
- this.isSlatSizesDirty = false;
- }
- if (isResize || this.isColSizesDirty) {
- this.buildColPositions();
- this.isColSizesDirty = false;
- }
- fillRenderer.computeSizes(isResize);
- eventRenderer.computeSizes(isResize);
- mirrorRenderer.computeSizes(isResize);
- fillRenderer.assignSizes(isResize);
- eventRenderer.assignSizes(isResize);
- mirrorRenderer.assignSizes(isResize);
- };
- TimeGrid.prototype._renderSkeleton = function (theme) {
- var el = this.el;
- el.innerHTML =
- '<div class="fc-bg"></div>' +
- '<div class="fc-slats"></div>' +
- '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" style="display:none" />';
- this.rootBgContainerEl = el.querySelector('.fc-bg');
- this.slatContainerEl = el.querySelector('.fc-slats');
- this.bottomRuleEl = el.querySelector('.fc-divider');
- };
- TimeGrid.prototype._renderSlats = function (dateProfile) {
- var theme = this.context.theme;
- this.slatContainerEl.innerHTML =
- '<table class="' + theme.getClass('tableGrid') + '">' +
- this.renderSlatRowHtml(dateProfile) +
- '</table>';
- this.slatEls = findElements(this.slatContainerEl, 'tr');
- this.slatPositions = new PositionCache(this.el, this.slatEls, false, true // vertical
- );
- this.isSlatSizesDirty = true;
- };
- // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
- TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
- var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
- var html = '';
- var dayStart = startOfDay(dateProfile.renderRange.start);
- var slotTime = dateProfile.minTime;
- var slotIterator = createDuration(0);
- var slotDate; // will be on the view's first day, but we only care about its time
- var isLabeled;
- var axisHtml;
- // Calculate the time for each slot
- while (asRoughMs(slotTime) < asRoughMs(dateProfile.maxTime)) {
- slotDate = dateEnv.add(dayStart, slotTime);
- isLabeled = wholeDivideDurations(slotIterator, this.labelInterval) !== null;
- axisHtml =
- '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
- (isLabeled ?
- '<span>' + // for matchCellWidths
- htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
- '</span>' :
- '') +
- '</td>';
- html +=
- '<tr data-time="' + formatIsoTimeString(slotDate) + '"' +
- (isLabeled ? '' : ' class="fc-minor"') +
- '>' +
- (!isRtl ? axisHtml : '') +
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
- (isRtl ? axisHtml : '') +
- '</tr>';
- slotTime = addDurations(slotTime, this.slotDuration);
- slotIterator = addDurations(slotIterator, this.slotDuration);
- }
- return html;
- };
- TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
- var _a = this.context, calendar = _a.calendar, view = _a.view, isRtl = _a.isRtl, theme = _a.theme, dateEnv = _a.dateEnv;
- var bgRow = new DayBgRow(this.context);
- this.rootBgContainerEl.innerHTML =
- '<table class="' + theme.getClass('tableGrid') + '">' +
- bgRow.renderHtml({
- cells: cells,
- dateProfile: dateProfile,
- renderIntroHtml: this.renderProps.renderBgIntroHtml
- }) +
- '</table>';
- this.colEls = findElements(this.el, '.fc-day, .fc-disabled-day');
- for (var col = 0; col < this.colCnt; col++) {
- calendar.publiclyTrigger('dayRender', [
- {
- date: dateEnv.toDate(cells[col].date),
- el: this.colEls[col],
- view: view
- }
- ]);
- }
- if (isRtl) {
- this.colEls.reverse();
- }
- this.colPositions = new PositionCache(this.el, this.colEls, true, // horizontal
- false);
- this.renderContentSkeleton();
- this.isColSizesDirty = true;
- };
- TimeGrid.prototype._unrenderColumns = function () {
- this.unrenderContentSkeleton();
- };
- /* Content Skeleton
- ------------------------------------------------------------------------------------------------------------------*/
- // Renders the DOM that the view's content will live in
- TimeGrid.prototype.renderContentSkeleton = function () {
- var isRtl = this.context.isRtl;
- var parts = [];
- var skeletonEl;
- parts.push(this.renderProps.renderIntroHtml());
- for (var i = 0; i < this.colCnt; i++) {
- parts.push('<td>' +
- '<div class="fc-content-col">' +
- '<div class="fc-event-container fc-mirror-container"></div>' +
- '<div class="fc-event-container"></div>' +
- '<div class="fc-highlight-container"></div>' +
- '<div class="fc-bgevent-container"></div>' +
- '<div class="fc-business-container"></div>' +
- '</div>' +
- '</td>');
- }
- if (isRtl) {
- parts.reverse();
- }
- skeletonEl = this.contentSkeletonEl = htmlToElement('<div class="fc-content-skeleton">' +
- '<table>' +
- '<tr>' + parts.join('') + '</tr>' +
- '</table>' +
- '</div>');
- this.colContainerEls = findElements(skeletonEl, '.fc-content-col');
- this.mirrorContainerEls = findElements(skeletonEl, '.fc-mirror-container');
- this.fgContainerEls = findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
- this.bgContainerEls = findElements(skeletonEl, '.fc-bgevent-container');
- this.highlightContainerEls = findElements(skeletonEl, '.fc-highlight-container');
- this.businessContainerEls = findElements(skeletonEl, '.fc-business-container');
- if (isRtl) {
- this.colContainerEls.reverse();
- this.mirrorContainerEls.reverse();
- this.fgContainerEls.reverse();
- this.bgContainerEls.reverse();
- this.highlightContainerEls.reverse();
- this.businessContainerEls.reverse();
- }
- this.el.appendChild(skeletonEl);
- };
- TimeGrid.prototype.unrenderContentSkeleton = function () {
- removeElement(this.contentSkeletonEl);
- };
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
- TimeGrid.prototype.groupSegsByCol = function (segs) {
- var segsByCol = [];
- var i;
- for (i = 0; i < this.colCnt; i++) {
- segsByCol.push([]);
- }
- for (i = 0; i < segs.length; i++) {
- segsByCol[segs[i].col].push(segs[i]);
- }
- return segsByCol;
- };
- // Given segments grouped by column, insert the segments' elements into a parallel array of container
- // elements, each living within a column.
- TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
- var col;
- var segs;
- var i;
- for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
- segs = segsByCol[col];
- for (i = 0; i < segs.length; i++) {
- containerEls[col].appendChild(segs[i].el);
- }
- }
- };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.getNowIndicatorUnit = function () {
- return 'minute'; // will refresh on the minute
- };
- TimeGrid.prototype.renderNowIndicator = function (segs, date) {
- // HACK: if date columns not ready for some reason (scheduler)
- if (!this.colContainerEls) {
- return;
- }
- var top = this.computeDateTop(date);
- var nodes = [];
- var i;
- // render lines within the columns
- for (i = 0; i < segs.length; i++) {
- var lineEl = createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
- lineEl.style.top = top + 'px';
- this.colContainerEls[segs[i].col].appendChild(lineEl);
- nodes.push(lineEl);
- }
- // render an arrow over the axis
- if (segs.length > 0) { // is the current time in view?
- var arrowEl = createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
- arrowEl.style.top = top + 'px';
- this.contentSkeletonEl.appendChild(arrowEl);
- nodes.push(arrowEl);
- }
- this.nowIndicatorEls = nodes;
- };
- TimeGrid.prototype.unrenderNowIndicator = function () {
- if (this.nowIndicatorEls) {
- this.nowIndicatorEls.forEach(removeElement);
- this.nowIndicatorEls = null;
- }
- };
- /* Coordinates
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.getTotalSlatHeight = function () {
- return this.slatContainerEl.getBoundingClientRect().height;
- };
- // Computes the top coordinate, relative to the bounds of the grid, of the given date.
- // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
- TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
- if (!startOfDayDate) {
- startOfDayDate = startOfDay(when);
- }
- return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf()));
- };
- // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
- TimeGrid.prototype.computeTimeTop = function (duration) {
- var len = this.slatEls.length;
- var dateProfile = this.props.dateProfile;
- var slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.minTime)) / asRoughMs(this.slotDuration); // floating-point value of # of slots covered
- var slatIndex;
- var slatRemainder;
- // compute a floating-point number for how many slats should be progressed through.
- // from 0 to number of slats (inclusive)
- // constrained because minTime/maxTime might be customized.
- slatCoverage = Math.max(0, slatCoverage);
- slatCoverage = Math.min(len, slatCoverage);
- // an integer index of the furthest whole slat
- // from 0 to number slats (*exclusive*, so len-1)
- slatIndex = Math.floor(slatCoverage);
- slatIndex = Math.min(slatIndex, len - 1);
- // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
- // could be 1.0 if slatCoverage is covering *all* the slots
- slatRemainder = slatCoverage - slatIndex;
- return this.slatPositions.tops[slatIndex] +
- this.slatPositions.getHeight(slatIndex) * slatRemainder;
- };
- // For each segment in an array, computes and assigns its top and bottom properties
- TimeGrid.prototype.computeSegVerticals = function (segs) {
- var options = this.context.options;
- var eventMinHeight = options.timeGridEventMinHeight;
- var i;
- var seg;
- var dayDate;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- dayDate = this.props.cells[seg.col].date;
- seg.top = this.computeDateTop(seg.start, dayDate);
- seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
- }
- };
- // Given segments that already have their top/bottom properties computed, applies those values to
- // the segments' elements.
- TimeGrid.prototype.assignSegVerticals = function (segs) {
- var i;
- var seg;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- applyStyle(seg.el, this.generateSegVerticalCss(seg));
- }
- };
- // Generates an object with CSS properties for the top/bottom coordinates of a segment element
- TimeGrid.prototype.generateSegVerticalCss = function (seg) {
- return {
- top: seg.top,
- bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
- };
- };
- /* Sizing
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.buildPositionCaches = function () {
- this.buildColPositions();
- this.buildSlatPositions();
- };
- TimeGrid.prototype.buildColPositions = function () {
- this.colPositions.build();
- };
- TimeGrid.prototype.buildSlatPositions = function () {
- this.slatPositions.build();
- };
- /* Hit System
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
- var dateEnv = this.context.dateEnv;
- var _a = this, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
- var colIndex = colPositions.leftToIndex(positionLeft);
- var slatIndex = slatPositions.topToIndex(positionTop);
- if (colIndex != null && slatIndex != null) {
- var slatTop = slatPositions.tops[slatIndex];
- var slatHeight = slatPositions.getHeight(slatIndex);
- var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
- var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
- var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
- var dayDate = this.props.cells[colIndex].date;
- var time = addDurations(this.props.dateProfile.minTime, multiplyDuration(this.snapDuration, snapIndex));
- var start = dateEnv.add(dayDate, time);
- var end = dateEnv.add(start, this.snapDuration);
- return {
- col: colIndex,
- dateSpan: {
- range: { start: start, end: end },
- allDay: false
- },
- dayEl: this.colEls[colIndex],
- relativeRect: {
- left: colPositions.lefts[colIndex],
- right: colPositions.rights[colIndex],
- top: slatTop,
- bottom: slatTop + slatHeight
- }
- };
- }
- };
- /* Event Drag Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype._renderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- if (state.isEvent) {
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
- }
- else {
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- }
- }
- };
- TimeGrid.prototype._unrenderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- if (state.isEvent) {
- this.mirrorRenderer.unrender(this.context, state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
- }
- else {
- this.fillRenderer.unrender('highlight', this.context);
- }
- }
- };
- /* Event Resize Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype._renderEventResize = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- TimeGrid.prototype._unrenderEventResize = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.mirrorRenderer.unrender(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- /* Selection
- ------------------------------------------------------------------------------------------------------------------*/
- // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
- TimeGrid.prototype._renderDateSelection = function (segs) {
- if (segs) {
- if (this.context.options.selectMirror) {
- this.mirrorRenderer.renderSegs(this.context, segs, { isSelecting: true });
- }
- else {
- this.fillRenderer.renderSegs('highlight', this.context, segs);
- }
- }
- };
- TimeGrid.prototype._unrenderDateSelection = function (segs) {
- if (segs) {
- if (this.context.options.selectMirror) {
- this.mirrorRenderer.unrender(this.context, segs, { isSelecting: true });
- }
- else {
- this.fillRenderer.unrender('highlight', this.context);
- }
- }
- };
- return TimeGrid;
-}(DateComponent));
-
-var AllDaySplitter = /** @class */ (function (_super) {
- __extends(AllDaySplitter, _super);
- function AllDaySplitter() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- AllDaySplitter.prototype.getKeyInfo = function () {
- return {
- allDay: {},
- timed: {}
- };
- };
- AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
- if (dateSpan.allDay) {
- return ['allDay'];
- }
- else {
- return ['timed'];
- }
- };
- AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
- if (!eventDef.allDay) {
- return ['timed'];
- }
- else if (hasBgRendering(eventDef)) {
- return ['timed', 'allDay'];
- }
- else {
- return ['allDay'];
- }
- };
- return AllDaySplitter;
-}(Splitter));
-
-var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
-var WEEK_HEADER_FORMAT = createFormatter({ week: 'short' });
-/* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
-----------------------------------------------------------------------------------------------------------------------*/
-// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
-// Responsible for managing width/height.
-var AbstractTimeGridView = /** @class */ (function (_super) {
- __extends(AbstractTimeGridView, _super);
- function AbstractTimeGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.splitter = new AllDaySplitter();
- _this.renderSkeleton = memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- /* Header Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before the day-of week header cells
- _this.renderHeadIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var range = _this.props.dateProfile.renderRange;
- var dayCnt = diffDays(range.start, range.end);
- var weekText;
- if (options.weekNumbers) {
- weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
- return '' +
- '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
- buildGotoAnchorHtml(// aside from link, important for matchCellWidths
- options, dateEnv, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, htmlEscape(weekText) // inner HTML
- ) +
- '</th>';
- }
- else {
- return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
- }
- };
- /* Time Grid Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
- _this.renderTimeGridBgIntroHtml = function () {
- var theme = _this.context.theme;
- return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
- };
- // Generates the HTML that goes before all other types of cells.
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
- _this.renderTimeGridIntroHtml = function () {
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
- };
- /* Day Grid Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that goes before the all-day cells
- _this.renderDayGridBgIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
- '<span>' + // needed for matchCellWidths
- getAllDayHtml(options) +
- '</span>' +
- '</td>';
- };
- // Generates the HTML that goes before all other types of cells.
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
- _this.renderDayGridIntroHtml = function () {
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
- };
- return _this;
- }
- AbstractTimeGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- this.renderSkeleton(context);
- };
- AbstractTimeGridView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- AbstractTimeGridView.prototype._renderSkeleton = function (context) {
- this.el.classList.add('fc-timeGrid-view');
- this.el.innerHTML = this.renderSkeletonHtml();
- this.scroller = new ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- var timeGridWrapEl = this.scroller.el;
- this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
- timeGridWrapEl.classList.add('fc-time-grid-container');
- var timeGridEl = createElement('div', { className: 'fc-time-grid' });
- timeGridWrapEl.appendChild(timeGridEl);
- this.timeGrid = new TimeGrid(timeGridEl, {
- renderBgIntroHtml: this.renderTimeGridBgIntroHtml,
- renderIntroHtml: this.renderTimeGridIntroHtml
- });
- if (context.options.allDaySlot) { // should we display the "all-day" area?
- this.dayGrid = new DayGrid(// the all-day subcomponent of this view
- this.el.querySelector('.fc-day-grid'), {
- renderNumberIntroHtml: this.renderDayGridIntroHtml,
- renderBgIntroHtml: this.renderDayGridBgIntroHtml,
- renderIntroHtml: this.renderDayGridIntroHtml,
- colWeekNumbersVisible: false,
- cellWeekNumbersVisible: false
- });
- // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
- var dividerEl = this.el.querySelector('.fc-divider');
- this.dayGrid.bottomCoordPadding = dividerEl.getBoundingClientRect().height;
- }
- };
- AbstractTimeGridView.prototype._unrenderSkeleton = function () {
- this.el.classList.remove('fc-timeGrid-view');
- this.timeGrid.destroy();
- if (this.dayGrid) {
- this.dayGrid.destroy();
- }
- this.scroller.destroy();
- };
- /* Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds the HTML skeleton for the view.
- // The day-grid and time-grid components will render inside containers defined by this HTML.
- AbstractTimeGridView.prototype.renderSkeletonHtml = function () {
- var _a = this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- (options.columnHeader ?
- '<thead class="fc-head">' +
- '<tr>' +
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
- '</tr>' +
- '</thead>' :
- '') +
- '<tbody class="fc-body">' +
- '<tr>' +
- '<td class="' + theme.getClass('widgetContent') + '">' +
- (options.allDaySlot ?
- '<div class="fc-day-grid"></div>' +
- '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
- '') +
- '</td>' +
- '</tr>' +
- '</tbody>' +
- '</table>';
- };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractTimeGridView.prototype.getNowIndicatorUnit = function () {
- return this.timeGrid.getNowIndicatorUnit();
- };
- // subclasses should implement
- // renderNowIndicator(date: DateMarker) {
- // }
- AbstractTimeGridView.prototype.unrenderNowIndicator = function () {
- this.timeGrid.unrenderNowIndicator();
- };
- /* Dimensions
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractTimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
- this.timeGrid.updateSize(isResize);
- if (this.dayGrid) {
- this.dayGrid.updateSize(isResize);
- }
- };
- // Adjusts the vertical dimensions of the view to the specified values
- AbstractTimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- var _this = this;
- var eventLimit;
- var scrollerHeight;
- var scrollbarWidths;
- // make all axis cells line up
- this.axisWidth = matchCellWidths(findElements(this.el, '.fc-axis'));
- // hack to give the view some height prior to timeGrid's columns being rendered
- // TODO: separate setting height from scroller VS timeGrid.
- if (!this.timeGrid.colEls) {
- if (!isAuto) {
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- return;
- }
- // set of fake row elements that must compensate when scroller has scrollbars
- var noScrollRowEls = findElements(this.el, '.fc-row').filter(function (node) {
- return !_this.scroller.el.contains(node);
- });
- // reset all dimensions back to the original state
- this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
- this.scroller.clear(); // sets height to 'auto' and clears overflow
- noScrollRowEls.forEach(uncompensateScroll);
- // limit number of events in the all-day area
- if (this.dayGrid) {
- this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
- eventLimit = this.context.options.eventLimit;
- if (eventLimit && typeof eventLimit !== 'number') {
- eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
- }
- if (eventLimit) {
- this.dayGrid.limitRows(eventLimit);
- }
- }
- if (!isAuto) { // should we force dimensions of the scroll container?
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- scrollbarWidths = this.scroller.getScrollbarWidths();
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
- // make the all-day and header rows lines up
- noScrollRowEls.forEach(function (rowEl) {
- compensateScroll(rowEl, scrollbarWidths);
- });
- // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
- // and reapply the desired height to the scroller.
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- // guarantees the same scrollbar widths
- this.scroller.lockOverflow(scrollbarWidths);
- // if there's any space below the slats, show the horizontal rule.
- // this won't cause any new overflow, because lockOverflow already called.
- if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
- this.timeGrid.bottomRuleEl.style.display = '';
- }
- }
- };
- // given a desired total height of the view, returns what the height of the scroller should be
- AbstractTimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- /* Scroll
- ------------------------------------------------------------------------------------------------------------------*/
- // Computes the initial pre-configured scroll state prior to allowing the user to change it
- AbstractTimeGridView.prototype.computeDateScroll = function (duration) {
- var top = this.timeGrid.computeTimeTop(duration);
- // zoom can give weird floating-point values. rather scroll a little bit further
- top = Math.ceil(top);
- if (top) {
- top++; // to overcome top border that slots beyond the first have. looks better
- }
- return { top: top };
- };
- AbstractTimeGridView.prototype.queryDateScroll = function () {
- return { top: this.scroller.getScrollTop() };
- };
- AbstractTimeGridView.prototype.applyDateScroll = function (scroll) {
- if (scroll.top !== undefined) {
- this.scroller.setScrollTop(scroll.top);
- }
- };
- // Generates an HTML attribute string for setting the width of the axis, if it is known
- AbstractTimeGridView.prototype.axisStyleAttr = function () {
- if (this.axisWidth != null) {
- return 'style="width:' + this.axisWidth + 'px"';
- }
- return '';
- };
- return AbstractTimeGridView;
-}(View));
-AbstractTimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
-
-var SimpleTimeGrid = /** @class */ (function (_super) {
- __extends(SimpleTimeGrid, _super);
- function SimpleTimeGrid(timeGrid) {
- var _this = _super.call(this, timeGrid.el) || this;
- _this.buildDayRanges = memoize(buildDayRanges);
- _this.slicer = new TimeGridSlicer();
- _this.timeGrid = timeGrid;
- return _this;
- }
- SimpleTimeGrid.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.timeGrid.el
- });
- };
- SimpleTimeGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- SimpleTimeGrid.prototype.render = function (props, context) {
- var dateEnv = this.context.dateEnv;
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
- var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, dateEnv);
- var timeGrid = this.timeGrid;
- timeGrid.receiveContext(context); // hack because context is used in sliceProps
- timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, context.calendar, timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }), context);
- };
- SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
- this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
- };
- SimpleTimeGrid.prototype.buildPositionCaches = function () {
- this.timeGrid.buildPositionCaches();
- };
- SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
- var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
- if (rawHit) {
- return {
- component: this.timeGrid,
- dateSpan: rawHit.dateSpan,
- dayEl: rawHit.dayEl,
- rect: {
- left: rawHit.relativeRect.left,
- right: rawHit.relativeRect.right,
- top: rawHit.relativeRect.top,
- bottom: rawHit.relativeRect.bottom
- },
- layer: 0
- };
- }
- };
- return SimpleTimeGrid;
-}(DateComponent));
-function buildDayRanges(dayTable, dateProfile, dateEnv) {
- var ranges = [];
- for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
- var date = _a[_i];
- ranges.push({
- start: dateEnv.add(date, dateProfile.minTime),
- end: dateEnv.add(date, dateProfile.maxTime)
- });
- }
- return ranges;
-}
-var TimeGridSlicer = /** @class */ (function (_super) {
- __extends(TimeGridSlicer, _super);
- function TimeGridSlicer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
- var segs = [];
- for (var col = 0; col < dayRanges.length; col++) {
- var segRange = intersectRanges(range, dayRanges[col]);
- if (segRange) {
- segs.push({
- start: segRange.start,
- end: segRange.end,
- isStart: segRange.start.valueOf() === range.start.valueOf(),
- isEnd: segRange.end.valueOf() === range.end.valueOf(),
- col: col
- });
- }
- }
- return segs;
- };
- return TimeGridSlicer;
-}(Slicer));
-
-var TimeGridView = /** @class */ (function (_super) {
- __extends(TimeGridView, _super);
- function TimeGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.buildDayTable = memoize(buildDayTable);
- return _this;
- }
- TimeGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context); // for flags for updateSize. also _renderSkeleton/_unrenderSkeleton
- var _a = this.props, dateProfile = _a.dateProfile, dateProfileGenerator = _a.dateProfileGenerator;
- var nextDayThreshold = context.nextDayThreshold;
- var dayTable = this.buildDayTable(dateProfile, dateProfileGenerator);
- var splitProps = this.splitter.splitProps(props);
- if (this.header) {
- this.header.receiveProps({
- dateProfile: dateProfile,
- dates: dayTable.headerDates,
- datesRepDistinctDays: true,
- renderIntroHtml: this.renderHeadIntroHtml
- }, context);
- }
- this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
- dayTable: dayTable }), context);
- if (this.simpleDayGrid) {
- this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
- dayTable: dayTable,
- nextDayThreshold: nextDayThreshold, isRigid: false }), context);
- }
- this.startNowIndicator(dateProfile, dateProfileGenerator);
- };
- TimeGridView.prototype._renderSkeleton = function (context) {
- _super.prototype._renderSkeleton.call(this, context);
- if (context.options.columnHeader) {
- this.header = new DayHeader(this.el.querySelector('.fc-head-container'));
- }
- this.simpleTimeGrid = new SimpleTimeGrid(this.timeGrid);
- if (this.dayGrid) {
- this.simpleDayGrid = new SimpleDayGrid(this.dayGrid);
- }
- };
- TimeGridView.prototype._unrenderSkeleton = function () {
- _super.prototype._unrenderSkeleton.call(this);
- if (this.header) {
- this.header.destroy();
- }
- this.simpleTimeGrid.destroy();
- if (this.simpleDayGrid) {
- this.simpleDayGrid.destroy();
- }
- };
- TimeGridView.prototype.renderNowIndicator = function (date) {
- this.simpleTimeGrid.renderNowIndicator(date);
- };
- return TimeGridView;
-}(AbstractTimeGridView));
-function buildDayTable(dateProfile, dateProfileGenerator) {
- var daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator);
- return new DayTable(daySeries, false);
-}
-
-var main = createPlugin({
- defaultView: 'timeGridWeek',
- views: {
- timeGrid: {
- class: TimeGridView,
- allDaySlot: true,
- slotDuration: '00:30:00',
- slotEventOverlap: true // a bad name. confused with overlap/constraint system
- },
- timeGridDay: {
- type: 'timeGrid',
- duration: { days: 1 }
- },
- timeGridWeek: {
- type: 'timeGrid',
- duration: { weeks: 1 }
- }
- }
-});
-
-export default main;
-export { AbstractTimeGridView, TimeGrid, TimeGridSlicer, TimeGridView, buildDayRanges, buildDayTable };
diff --git a/library/fullcalendar/packages/timegrid/main.js b/library/fullcalendar/packages/timegrid/main.js
deleted file mode 100644
index d64a8a2ea..000000000
--- a/library/fullcalendar/packages/timegrid/main.js
+++ /dev/null
@@ -1,1403 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/daygrid')) :
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/daygrid'], factory) :
- (global = global || self, factory(global.FullCalendarTimeGrid = {}, global.FullCalendar, global.FullCalendarDayGrid));
-}(this, function (exports, core, daygrid) { 'use strict';
-
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
-
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
-
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
-
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
-
- /*
- Only handles foreground segs.
- Does not own rendering. Use for low-level util methods by TimeGrid.
- */
- var TimeGridEventRenderer = /** @class */ (function (_super) {
- __extends(TimeGridEventRenderer, _super);
- function TimeGridEventRenderer(timeGrid) {
- var _this = _super.call(this) || this;
- _this.timeGrid = timeGrid;
- return _this;
- }
- TimeGridEventRenderer.prototype.renderSegs = function (context, segs, mirrorInfo) {
- _super.prototype.renderSegs.call(this, context, segs, mirrorInfo);
- // TODO: dont do every time. memoize
- this.fullTimeFormat = core.createFormatter({
- hour: 'numeric',
- minute: '2-digit',
- separator: this.context.options.defaultRangeSeparator
- });
- };
- // Given an array of foreground segments, render a DOM element for each, computes position,
- // and attaches to the column inner-container elements.
- TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- var segsByCol = this.timeGrid.groupSegsByCol(segs);
- // order the segs within each column
- // TODO: have groupSegsByCol do this?
- for (var col = 0; col < segsByCol.length; col++) {
- segsByCol[col] = this.sortEventSegs(segsByCol[col]);
- }
- this.segsByCol = segsByCol;
- this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
- };
- TimeGridEventRenderer.prototype.detachSegs = function (segs) {
- segs.forEach(function (seg) {
- core.removeElement(seg.el);
- });
- this.segsByCol = null;
- };
- TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
- var colCnt = timeGrid.colCnt;
- timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
- if (segsByCol) {
- for (var col = 0; col < colCnt; col++) {
- this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
- }
- }
- };
- TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
- var colCnt = timeGrid.colCnt;
- timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
- if (segsByCol) {
- for (var col = 0; col < colCnt; col++) {
- this.assignSegCss(segsByCol[col]);
- }
- }
- };
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
- TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
- return {
- hour: 'numeric',
- minute: '2-digit',
- meridiem: false
- };
- };
- // Computes a default `displayEventEnd` value if one is not expliclty defined
- TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
- return true;
- };
- // Renders the HTML for a single event segment's default rendering
- TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
- var eventRange = seg.eventRange;
- var eventDef = eventRange.def;
- var eventUi = eventRange.ui;
- var allDay = eventDef.allDay;
- var isDraggable = core.computeEventDraggable(this.context, eventDef, eventUi);
- var isResizableFromStart = seg.isStart && core.computeEventStartResizable(this.context, eventDef, eventUi);
- var isResizableFromEnd = seg.isEnd && core.computeEventEndResizable(this.context, eventDef, eventUi);
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
- var skinCss = core.cssToStr(this.getSkinCss(eventUi));
- var timeText;
- var fullTimeText; // more verbose time text. for the print stylesheet
- var startTimeText; // just the start time text
- classes.unshift('fc-time-grid-event');
- // if the event appears to span more than one day...
- if (core.isMultiDayRange(eventRange.range)) {
- // Don't display time text on segments that run entirely through a day.
- // That would appear as midnight-midnight and would look dumb.
- // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
- if (seg.isStart || seg.isEnd) {
- var unzonedStart = seg.start;
- var unzonedEnd = seg.end;
- timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
- fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
- startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
- }
- }
- else {
- // Display the normal time text for the *event's* times
- timeText = this.getTimeText(eventRange);
- fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
- startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
- }
- return '<a class="' + classes.join(' ') + '"' +
- (eventDef.url ?
- ' href="' + core.htmlEscape(eventDef.url) + '"' :
- '') +
- (skinCss ?
- ' style="' + skinCss + '"' :
- '') +
- '>' +
- '<div class="fc-content">' +
- (timeText ?
- '<div class="fc-time"' +
- ' data-start="' + core.htmlEscape(startTimeText) + '"' +
- ' data-full="' + core.htmlEscape(fullTimeText) + '"' +
- '>' +
- '<span>' + core.htmlEscape(timeText) + '</span>' +
- '</div>' :
- '') +
- (eventDef.title ?
- '<div class="fc-title">' +
- core.htmlEscape(eventDef.title) +
- '</div>' :
- '') +
- '</div>' +
- /* TODO: write CSS for this
- (isResizableFromStart ?
- '<div class="fc-resizer fc-start-resizer"></div>' :
- ''
- ) +
- */
- (isResizableFromEnd ?
- '<div class="fc-resizer fc-end-resizer"></div>' :
- '') +
- '</a>';
- };
- // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
- // Assumed the segs are already ordered.
- // NOTE: Also reorders the given array by date!
- TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
- var levels;
- var level0;
- var i;
- levels = buildSlotSegLevels(segs);
- computeForwardSlotSegs(levels);
- if ((level0 = levels[0])) {
- for (i = 0; i < level0.length; i++) {
- computeSlotSegPressures(level0[i]);
- }
- for (i = 0; i < level0.length; i++) {
- this.computeSegForwardBack(level0[i], 0, 0);
- }
- }
- };
- // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
- // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
- // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
- //
- // The segment might be part of a "series", which means consecutive segments with the same pressure
- // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
- // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
- // coordinate of the first segment in the series.
- TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
- var forwardSegs = seg.forwardSegs;
- var i;
- if (seg.forwardCoord === undefined) { // not already computed
- if (!forwardSegs.length) {
- // if there are no forward segments, this segment should butt up against the edge
- seg.forwardCoord = 1;
- }
- else {
- // sort highest pressure first
- this.sortForwardSegs(forwardSegs);
- // this segment's forwardCoord will be calculated from the backwardCoord of the
- // highest-pressure forward segment.
- this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
- seg.forwardCoord = forwardSegs[0].backwardCoord;
- }
- // calculate the backwardCoord from the forwardCoord. consider the series
- seg.backwardCoord = seg.forwardCoord -
- (seg.forwardCoord - seriesBackwardCoord) / // available width for series
- (seriesBackwardPressure + 1); // # of segments in the series
- // use this segment's coordinates to computed the coordinates of the less-pressurized
- // forward segments
- for (i = 0; i < forwardSegs.length; i++) {
- this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
- }
- }
- };
- TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
- var objs = forwardSegs.map(buildTimeGridSegCompareObj);
- var specs = [
- // put higher-pressure first
- { field: 'forwardPressure', order: -1 },
- // put segments that are closer to initial edge first (and favor ones with no coords yet)
- { field: 'backwardCoord', order: 1 }
- ].concat(this.context.eventOrderSpecs);
- objs.sort(function (obj0, obj1) {
- return core.compareByFieldSpecs(obj0, obj1, specs);
- });
- return objs.map(function (c) {
- return c._seg;
- });
- };
- // Given foreground event segments that have already had their position coordinates computed,
- // assigns position-related CSS values to their elements.
- TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
- var seg = segs_1[_i];
- core.applyStyle(seg.el, this.generateSegCss(seg));
- if (seg.level > 0) {
- seg.el.classList.add('fc-time-grid-event-inset');
- }
- // if the event is short that the title will be cut off,
- // attach a className that condenses the title into the time area.
- if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
- seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
- }
- }
- };
- // Generates an object with CSS properties/values that should be applied to an event segment element.
- // Contains important positioning-related properties that should be applied to any event element, customized or not.
- TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
- var shouldOverlap = this.context.options.slotEventOverlap;
- var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
- var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
- var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
- var isRtl = this.context.isRtl;
- var left; // amount of space from left edge, a fraction of the total width
- var right; // amount of space from right edge, a fraction of the total width
- if (shouldOverlap) {
- // double the width, but don't go beyond the maximum forward coordinate (1.0)
- forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
- }
- if (isRtl) {
- left = 1 - forwardCoord;
- right = backwardCoord;
- }
- else {
- left = backwardCoord;
- right = 1 - forwardCoord;
- }
- props.zIndex = seg.level + 1; // convert from 0-base to 1-based
- props.left = left * 100 + '%';
- props.right = right * 100 + '%';
- if (shouldOverlap && seg.forwardPressure) {
- // add padding to the edge so that forward stacked events don't cover the resizer's icon
- props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
- }
- return props;
- };
- return TimeGridEventRenderer;
- }(core.FgEventRenderer));
- // Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
- // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
- function buildSlotSegLevels(segs) {
- var levels = [];
- var i;
- var seg;
- var j;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- // go through all the levels and stop on the first level where there are no collisions
- for (j = 0; j < levels.length; j++) {
- if (!computeSlotSegCollisions(seg, levels[j]).length) {
- break;
- }
- }
- seg.level = j;
- (levels[j] || (levels[j] = [])).push(seg);
- }
- return levels;
- }
- // For every segment, figure out the other segments that are in subsequent
- // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
- function computeForwardSlotSegs(levels) {
- var i;
- var level;
- var j;
- var seg;
- var k;
- for (i = 0; i < levels.length; i++) {
- level = levels[i];
- for (j = 0; j < level.length; j++) {
- seg = level[j];
- seg.forwardSegs = [];
- for (k = i + 1; k < levels.length; k++) {
- computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
- }
- }
- }
- }
- // Figure out which path forward (via seg.forwardSegs) results in the longest path until
- // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
- function computeSlotSegPressures(seg) {
- var forwardSegs = seg.forwardSegs;
- var forwardPressure = 0;
- var i;
- var forwardSeg;
- if (seg.forwardPressure === undefined) { // not already computed
- for (i = 0; i < forwardSegs.length; i++) {
- forwardSeg = forwardSegs[i];
- // figure out the child's maximum forward path
- computeSlotSegPressures(forwardSeg);
- // either use the existing maximum, or use the child's forward pressure
- // plus one (for the forwardSeg itself)
- forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
- }
- seg.forwardPressure = forwardPressure;
- }
- }
- // Find all the segments in `otherSegs` that vertically collide with `seg`.
- // Append into an optionally-supplied `results` array and return.
- function computeSlotSegCollisions(seg, otherSegs, results) {
- if (results === void 0) { results = []; }
- for (var i = 0; i < otherSegs.length; i++) {
- if (isSlotSegCollision(seg, otherSegs[i])) {
- results.push(otherSegs[i]);
- }
- }
- return results;
- }
- // Do these segments occupy the same vertical space?
- function isSlotSegCollision(seg1, seg2) {
- return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
- }
- function buildTimeGridSegCompareObj(seg) {
- var obj = core.buildSegCompareObj(seg);
- obj.forwardPressure = seg.forwardPressure;
- obj.backwardCoord = seg.backwardCoord;
- return obj;
- }
-
- var TimeGridMirrorRenderer = /** @class */ (function (_super) {
- __extends(TimeGridMirrorRenderer, _super);
- function TimeGridMirrorRenderer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
- this.segsByCol = this.timeGrid.groupSegsByCol(segs);
- this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
- this.sourceSeg = mirrorInfo.sourceSeg;
- };
- TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
- var props = _super.prototype.generateSegCss.call(this, seg);
- var sourceSeg = this.sourceSeg;
- if (sourceSeg && sourceSeg.col === seg.col) {
- var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
- props.left = sourceSegProps.left;
- props.right = sourceSegProps.right;
- props.marginLeft = sourceSegProps.marginLeft;
- props.marginRight = sourceSegProps.marginRight;
- }
- return props;
- };
- return TimeGridMirrorRenderer;
- }(TimeGridEventRenderer));
-
- var TimeGridFillRenderer = /** @class */ (function (_super) {
- __extends(TimeGridFillRenderer, _super);
- function TimeGridFillRenderer(timeGrid) {
- var _this = _super.call(this) || this;
- _this.timeGrid = timeGrid;
- return _this;
- }
- TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
- var timeGrid = this.timeGrid;
- var containerEls;
- // TODO: more efficient lookup
- if (type === 'bgEvent') {
- containerEls = timeGrid.bgContainerEls;
- }
- else if (type === 'businessHours') {
- containerEls = timeGrid.businessContainerEls;
- }
- else if (type === 'highlight') {
- containerEls = timeGrid.highlightContainerEls;
- }
- timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
- return segs.map(function (seg) {
- return seg.el;
- });
- };
- TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
- this.timeGrid.computeSegVerticals(segs);
- };
- TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
- this.timeGrid.assignSegVerticals(segs);
- };
- return TimeGridFillRenderer;
- }(core.FillRenderer));
-
- /* A component that renders one or more columns of vertical time slots
- ----------------------------------------------------------------------------------------------------------------------*/
- // potential nice values for the slot-duration and interval-duration
- // from largest to smallest
- var AGENDA_STOCK_SUB_DURATIONS = [
- { hours: 1 },
- { minutes: 30 },
- { minutes: 15 },
- { seconds: 30 },
- { seconds: 15 }
- ];
- var TimeGrid = /** @class */ (function (_super) {
- __extends(TimeGrid, _super);
- function TimeGrid(el, renderProps) {
- var _this = _super.call(this, el) || this;
- _this.isSlatSizesDirty = false;
- _this.isColSizesDirty = false;
- _this.processOptions = core.memoize(_this._processOptions);
- _this.renderSkeleton = core.memoizeRendering(_this._renderSkeleton);
- _this.renderSlats = core.memoizeRendering(_this._renderSlats, null, [_this.renderSkeleton]);
- _this.renderColumns = core.memoizeRendering(_this._renderColumns, _this._unrenderColumns, [_this.renderSkeleton]);
- _this.renderProps = renderProps;
- var renderColumns = _this.renderColumns;
- var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
- var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
- _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
- _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
- _this.renderDateSelection = core.memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
- _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
- _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
- _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
- return _this;
- }
- /* Options
- ------------------------------------------------------------------------------------------------------------------*/
- // Parses various options into properties of this object
- // MUST have context already set
- TimeGrid.prototype._processOptions = function (options) {
- var slotDuration = options.slotDuration, snapDuration = options.snapDuration;
- var snapsPerSlot;
- var input;
- slotDuration = core.createDuration(slotDuration);
- snapDuration = snapDuration ? core.createDuration(snapDuration) : slotDuration;
- snapsPerSlot = core.wholeDivideDurations(slotDuration, snapDuration);
- if (snapsPerSlot === null) {
- snapDuration = slotDuration;
- snapsPerSlot = 1;
- // TODO: say warning?
- }
- this.slotDuration = slotDuration;
- this.snapDuration = snapDuration;
- this.snapsPerSlot = snapsPerSlot;
- // might be an array value (for TimelineView).
- // if so, getting the most granular entry (the last one probably).
- input = options.slotLabelFormat;
- if (Array.isArray(input)) {
- input = input[input.length - 1];
- }
- this.labelFormat = core.createFormatter(input || {
- hour: 'numeric',
- minute: '2-digit',
- omitZeroMinute: true,
- meridiem: 'short'
- });
- input = options.slotLabelInterval;
- this.labelInterval = input ?
- core.createDuration(input) :
- this.computeLabelInterval(slotDuration);
- };
- // Computes an automatic value for slotLabelInterval
- TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
- var i;
- var labelInterval;
- var slotsPerLabel;
- // find the smallest stock label interval that results in more than one slots-per-label
- for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
- labelInterval = core.createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
- slotsPerLabel = core.wholeDivideDurations(labelInterval, slotDuration);
- if (slotsPerLabel !== null && slotsPerLabel > 1) {
- return labelInterval;
- }
- }
- return slotDuration; // fall back
- };
- /* Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.render = function (props, context) {
- this.processOptions(context.options);
- var cells = props.cells;
- this.colCnt = cells.length;
- this.renderSkeleton(context.theme);
- this.renderSlats(props.dateProfile);
- this.renderColumns(props.cells, props.dateProfile);
- this.renderBusinessHours(context, props.businessHourSegs);
- this.renderDateSelection(props.dateSelectionSegs);
- this.renderFgEvents(context, props.fgEventSegs);
- this.renderBgEvents(context, props.bgEventSegs);
- this.renderEventSelection(props.eventSelection);
- this.renderEventDrag(props.eventDrag);
- this.renderEventResize(props.eventResize);
- };
- TimeGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- // should unrender everything else too
- this.renderSlats.unrender();
- this.renderColumns.unrender();
- this.renderSkeleton.unrender();
- };
- TimeGrid.prototype.updateSize = function (isResize) {
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
- if (isResize || this.isSlatSizesDirty) {
- this.buildSlatPositions();
- this.isSlatSizesDirty = false;
- }
- if (isResize || this.isColSizesDirty) {
- this.buildColPositions();
- this.isColSizesDirty = false;
- }
- fillRenderer.computeSizes(isResize);
- eventRenderer.computeSizes(isResize);
- mirrorRenderer.computeSizes(isResize);
- fillRenderer.assignSizes(isResize);
- eventRenderer.assignSizes(isResize);
- mirrorRenderer.assignSizes(isResize);
- };
- TimeGrid.prototype._renderSkeleton = function (theme) {
- var el = this.el;
- el.innerHTML =
- '<div class="fc-bg"></div>' +
- '<div class="fc-slats"></div>' +
- '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" style="display:none" />';
- this.rootBgContainerEl = el.querySelector('.fc-bg');
- this.slatContainerEl = el.querySelector('.fc-slats');
- this.bottomRuleEl = el.querySelector('.fc-divider');
- };
- TimeGrid.prototype._renderSlats = function (dateProfile) {
- var theme = this.context.theme;
- this.slatContainerEl.innerHTML =
- '<table class="' + theme.getClass('tableGrid') + '">' +
- this.renderSlatRowHtml(dateProfile) +
- '</table>';
- this.slatEls = core.findElements(this.slatContainerEl, 'tr');
- this.slatPositions = new core.PositionCache(this.el, this.slatEls, false, true // vertical
- );
- this.isSlatSizesDirty = true;
- };
- // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
- TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
- var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
- var html = '';
- var dayStart = core.startOfDay(dateProfile.renderRange.start);
- var slotTime = dateProfile.minTime;
- var slotIterator = core.createDuration(0);
- var slotDate; // will be on the view's first day, but we only care about its time
- var isLabeled;
- var axisHtml;
- // Calculate the time for each slot
- while (core.asRoughMs(slotTime) < core.asRoughMs(dateProfile.maxTime)) {
- slotDate = dateEnv.add(dayStart, slotTime);
- isLabeled = core.wholeDivideDurations(slotIterator, this.labelInterval) !== null;
- axisHtml =
- '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
- (isLabeled ?
- '<span>' + // for matchCellWidths
- core.htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
- '</span>' :
- '') +
- '</td>';
- html +=
- '<tr data-time="' + core.formatIsoTimeString(slotDate) + '"' +
- (isLabeled ? '' : ' class="fc-minor"') +
- '>' +
- (!isRtl ? axisHtml : '') +
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
- (isRtl ? axisHtml : '') +
- '</tr>';
- slotTime = core.addDurations(slotTime, this.slotDuration);
- slotIterator = core.addDurations(slotIterator, this.slotDuration);
- }
- return html;
- };
- TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
- var _a = this.context, calendar = _a.calendar, view = _a.view, isRtl = _a.isRtl, theme = _a.theme, dateEnv = _a.dateEnv;
- var bgRow = new daygrid.DayBgRow(this.context);
- this.rootBgContainerEl.innerHTML =
- '<table class="' + theme.getClass('tableGrid') + '">' +
- bgRow.renderHtml({
- cells: cells,
- dateProfile: dateProfile,
- renderIntroHtml: this.renderProps.renderBgIntroHtml
- }) +
- '</table>';
- this.colEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
- for (var col = 0; col < this.colCnt; col++) {
- calendar.publiclyTrigger('dayRender', [
- {
- date: dateEnv.toDate(cells[col].date),
- el: this.colEls[col],
- view: view
- }
- ]);
- }
- if (isRtl) {
- this.colEls.reverse();
- }
- this.colPositions = new core.PositionCache(this.el, this.colEls, true, // horizontal
- false);
- this.renderContentSkeleton();
- this.isColSizesDirty = true;
- };
- TimeGrid.prototype._unrenderColumns = function () {
- this.unrenderContentSkeleton();
- };
- /* Content Skeleton
- ------------------------------------------------------------------------------------------------------------------*/
- // Renders the DOM that the view's content will live in
- TimeGrid.prototype.renderContentSkeleton = function () {
- var isRtl = this.context.isRtl;
- var parts = [];
- var skeletonEl;
- parts.push(this.renderProps.renderIntroHtml());
- for (var i = 0; i < this.colCnt; i++) {
- parts.push('<td>' +
- '<div class="fc-content-col">' +
- '<div class="fc-event-container fc-mirror-container"></div>' +
- '<div class="fc-event-container"></div>' +
- '<div class="fc-highlight-container"></div>' +
- '<div class="fc-bgevent-container"></div>' +
- '<div class="fc-business-container"></div>' +
- '</div>' +
- '</td>');
- }
- if (isRtl) {
- parts.reverse();
- }
- skeletonEl = this.contentSkeletonEl = core.htmlToElement('<div class="fc-content-skeleton">' +
- '<table>' +
- '<tr>' + parts.join('') + '</tr>' +
- '</table>' +
- '</div>');
- this.colContainerEls = core.findElements(skeletonEl, '.fc-content-col');
- this.mirrorContainerEls = core.findElements(skeletonEl, '.fc-mirror-container');
- this.fgContainerEls = core.findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
- this.bgContainerEls = core.findElements(skeletonEl, '.fc-bgevent-container');
- this.highlightContainerEls = core.findElements(skeletonEl, '.fc-highlight-container');
- this.businessContainerEls = core.findElements(skeletonEl, '.fc-business-container');
- if (isRtl) {
- this.colContainerEls.reverse();
- this.mirrorContainerEls.reverse();
- this.fgContainerEls.reverse();
- this.bgContainerEls.reverse();
- this.highlightContainerEls.reverse();
- this.businessContainerEls.reverse();
- }
- this.el.appendChild(skeletonEl);
- };
- TimeGrid.prototype.unrenderContentSkeleton = function () {
- core.removeElement(this.contentSkeletonEl);
- };
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
- TimeGrid.prototype.groupSegsByCol = function (segs) {
- var segsByCol = [];
- var i;
- for (i = 0; i < this.colCnt; i++) {
- segsByCol.push([]);
- }
- for (i = 0; i < segs.length; i++) {
- segsByCol[segs[i].col].push(segs[i]);
- }
- return segsByCol;
- };
- // Given segments grouped by column, insert the segments' elements into a parallel array of container
- // elements, each living within a column.
- TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
- var col;
- var segs;
- var i;
- for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
- segs = segsByCol[col];
- for (i = 0; i < segs.length; i++) {
- containerEls[col].appendChild(segs[i].el);
- }
- }
- };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.getNowIndicatorUnit = function () {
- return 'minute'; // will refresh on the minute
- };
- TimeGrid.prototype.renderNowIndicator = function (segs, date) {
- // HACK: if date columns not ready for some reason (scheduler)
- if (!this.colContainerEls) {
- return;
- }
- var top = this.computeDateTop(date);
- var nodes = [];
- var i;
- // render lines within the columns
- for (i = 0; i < segs.length; i++) {
- var lineEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
- lineEl.style.top = top + 'px';
- this.colContainerEls[segs[i].col].appendChild(lineEl);
- nodes.push(lineEl);
- }
- // render an arrow over the axis
- if (segs.length > 0) { // is the current time in view?
- var arrowEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
- arrowEl.style.top = top + 'px';
- this.contentSkeletonEl.appendChild(arrowEl);
- nodes.push(arrowEl);
- }
- this.nowIndicatorEls = nodes;
- };
- TimeGrid.prototype.unrenderNowIndicator = function () {
- if (this.nowIndicatorEls) {
- this.nowIndicatorEls.forEach(core.removeElement);
- this.nowIndicatorEls = null;
- }
- };
- /* Coordinates
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.getTotalSlatHeight = function () {
- return this.slatContainerEl.getBoundingClientRect().height;
- };
- // Computes the top coordinate, relative to the bounds of the grid, of the given date.
- // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
- TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
- if (!startOfDayDate) {
- startOfDayDate = core.startOfDay(when);
- }
- return this.computeTimeTop(core.createDuration(when.valueOf() - startOfDayDate.valueOf()));
- };
- // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
- TimeGrid.prototype.computeTimeTop = function (duration) {
- var len = this.slatEls.length;
- var dateProfile = this.props.dateProfile;
- var slatCoverage = (duration.milliseconds - core.asRoughMs(dateProfile.minTime)) / core.asRoughMs(this.slotDuration); // floating-point value of # of slots covered
- var slatIndex;
- var slatRemainder;
- // compute a floating-point number for how many slats should be progressed through.
- // from 0 to number of slats (inclusive)
- // constrained because minTime/maxTime might be customized.
- slatCoverage = Math.max(0, slatCoverage);
- slatCoverage = Math.min(len, slatCoverage);
- // an integer index of the furthest whole slat
- // from 0 to number slats (*exclusive*, so len-1)
- slatIndex = Math.floor(slatCoverage);
- slatIndex = Math.min(slatIndex, len - 1);
- // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
- // could be 1.0 if slatCoverage is covering *all* the slots
- slatRemainder = slatCoverage - slatIndex;
- return this.slatPositions.tops[slatIndex] +
- this.slatPositions.getHeight(slatIndex) * slatRemainder;
- };
- // For each segment in an array, computes and assigns its top and bottom properties
- TimeGrid.prototype.computeSegVerticals = function (segs) {
- var options = this.context.options;
- var eventMinHeight = options.timeGridEventMinHeight;
- var i;
- var seg;
- var dayDate;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- dayDate = this.props.cells[seg.col].date;
- seg.top = this.computeDateTop(seg.start, dayDate);
- seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
- }
- };
- // Given segments that already have their top/bottom properties computed, applies those values to
- // the segments' elements.
- TimeGrid.prototype.assignSegVerticals = function (segs) {
- var i;
- var seg;
- for (i = 0; i < segs.length; i++) {
- seg = segs[i];
- core.applyStyle(seg.el, this.generateSegVerticalCss(seg));
- }
- };
- // Generates an object with CSS properties for the top/bottom coordinates of a segment element
- TimeGrid.prototype.generateSegVerticalCss = function (seg) {
- return {
- top: seg.top,
- bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
- };
- };
- /* Sizing
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.buildPositionCaches = function () {
- this.buildColPositions();
- this.buildSlatPositions();
- };
- TimeGrid.prototype.buildColPositions = function () {
- this.colPositions.build();
- };
- TimeGrid.prototype.buildSlatPositions = function () {
- this.slatPositions.build();
- };
- /* Hit System
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
- var dateEnv = this.context.dateEnv;
- var _a = this, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
- var colIndex = colPositions.leftToIndex(positionLeft);
- var slatIndex = slatPositions.topToIndex(positionTop);
- if (colIndex != null && slatIndex != null) {
- var slatTop = slatPositions.tops[slatIndex];
- var slatHeight = slatPositions.getHeight(slatIndex);
- var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
- var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
- var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
- var dayDate = this.props.cells[colIndex].date;
- var time = core.addDurations(this.props.dateProfile.minTime, core.multiplyDuration(this.snapDuration, snapIndex));
- var start = dateEnv.add(dayDate, time);
- var end = dateEnv.add(start, this.snapDuration);
- return {
- col: colIndex,
- dateSpan: {
- range: { start: start, end: end },
- allDay: false
- },
- dayEl: this.colEls[colIndex],
- relativeRect: {
- left: colPositions.lefts[colIndex],
- right: colPositions.rights[colIndex],
- top: slatTop,
- bottom: slatTop + slatHeight
- }
- };
- }
- };
- /* Event Drag Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype._renderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- if (state.isEvent) {
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
- }
- else {
- this.fillRenderer.renderSegs('highlight', this.context, state.segs);
- }
- }
- };
- TimeGrid.prototype._unrenderEventDrag = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- if (state.isEvent) {
- this.mirrorRenderer.unrender(this.context, state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
- }
- else {
- this.fillRenderer.unrender('highlight', this.context);
- }
- }
- };
- /* Event Resize Visualization
- ------------------------------------------------------------------------------------------------------------------*/
- TimeGrid.prototype._renderEventResize = function (state) {
- if (state) {
- this.eventRenderer.hideByHash(state.affectedInstances);
- this.mirrorRenderer.renderSegs(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- TimeGrid.prototype._unrenderEventResize = function (state) {
- if (state) {
- this.eventRenderer.showByHash(state.affectedInstances);
- this.mirrorRenderer.unrender(this.context, state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
- }
- };
- /* Selection
- ------------------------------------------------------------------------------------------------------------------*/
- // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
- TimeGrid.prototype._renderDateSelection = function (segs) {
- if (segs) {
- if (this.context.options.selectMirror) {
- this.mirrorRenderer.renderSegs(this.context, segs, { isSelecting: true });
- }
- else {
- this.fillRenderer.renderSegs('highlight', this.context, segs);
- }
- }
- };
- TimeGrid.prototype._unrenderDateSelection = function (segs) {
- if (segs) {
- if (this.context.options.selectMirror) {
- this.mirrorRenderer.unrender(this.context, segs, { isSelecting: true });
- }
- else {
- this.fillRenderer.unrender('highlight', this.context);
- }
- }
- };
- return TimeGrid;
- }(core.DateComponent));
-
- var AllDaySplitter = /** @class */ (function (_super) {
- __extends(AllDaySplitter, _super);
- function AllDaySplitter() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- AllDaySplitter.prototype.getKeyInfo = function () {
- return {
- allDay: {},
- timed: {}
- };
- };
- AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
- if (dateSpan.allDay) {
- return ['allDay'];
- }
- else {
- return ['timed'];
- }
- };
- AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
- if (!eventDef.allDay) {
- return ['timed'];
- }
- else if (core.hasBgRendering(eventDef)) {
- return ['timed', 'allDay'];
- }
- else {
- return ['allDay'];
- }
- };
- return AllDaySplitter;
- }(core.Splitter));
-
- var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
- var WEEK_HEADER_FORMAT = core.createFormatter({ week: 'short' });
- /* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
- ----------------------------------------------------------------------------------------------------------------------*/
- // Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
- // Responsible for managing width/height.
- var AbstractTimeGridView = /** @class */ (function (_super) {
- __extends(AbstractTimeGridView, _super);
- function AbstractTimeGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.splitter = new AllDaySplitter();
- _this.renderSkeleton = core.memoizeRendering(_this._renderSkeleton, _this._unrenderSkeleton);
- /* Header Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that will go before the day-of week header cells
- _this.renderHeadIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options;
- var range = _this.props.dateProfile.renderRange;
- var dayCnt = core.diffDays(range.start, range.end);
- var weekText;
- if (options.weekNumbers) {
- weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
- return '' +
- '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
- core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
- options, dateEnv, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, core.htmlEscape(weekText) // inner HTML
- ) +
- '</th>';
- }
- else {
- return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
- }
- };
- /* Time Grid Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
- _this.renderTimeGridBgIntroHtml = function () {
- var theme = _this.context.theme;
- return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
- };
- // Generates the HTML that goes before all other types of cells.
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
- _this.renderTimeGridIntroHtml = function () {
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
- };
- /* Day Grid Render Methods
- ------------------------------------------------------------------------------------------------------------------*/
- // Generates the HTML that goes before the all-day cells
- _this.renderDayGridBgIntroHtml = function () {
- var _a = _this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
- '<span>' + // needed for matchCellWidths
- core.getAllDayHtml(options) +
- '</span>' +
- '</td>';
- };
- // Generates the HTML that goes before all other types of cells.
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
- _this.renderDayGridIntroHtml = function () {
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
- };
- return _this;
- }
- AbstractTimeGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context);
- this.renderSkeleton(context);
- };
- AbstractTimeGridView.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.renderSkeleton.unrender();
- };
- AbstractTimeGridView.prototype._renderSkeleton = function (context) {
- this.el.classList.add('fc-timeGrid-view');
- this.el.innerHTML = this.renderSkeletonHtml();
- this.scroller = new core.ScrollComponent('hidden', // overflow x
- 'auto' // overflow y
- );
- var timeGridWrapEl = this.scroller.el;
- this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
- timeGridWrapEl.classList.add('fc-time-grid-container');
- var timeGridEl = core.createElement('div', { className: 'fc-time-grid' });
- timeGridWrapEl.appendChild(timeGridEl);
- this.timeGrid = new TimeGrid(timeGridEl, {
- renderBgIntroHtml: this.renderTimeGridBgIntroHtml,
- renderIntroHtml: this.renderTimeGridIntroHtml
- });
- if (context.options.allDaySlot) { // should we display the "all-day" area?
- this.dayGrid = new daygrid.DayGrid(// the all-day subcomponent of this view
- this.el.querySelector('.fc-day-grid'), {
- renderNumberIntroHtml: this.renderDayGridIntroHtml,
- renderBgIntroHtml: this.renderDayGridBgIntroHtml,
- renderIntroHtml: this.renderDayGridIntroHtml,
- colWeekNumbersVisible: false,
- cellWeekNumbersVisible: false
- });
- // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
- var dividerEl = this.el.querySelector('.fc-divider');
- this.dayGrid.bottomCoordPadding = dividerEl.getBoundingClientRect().height;
- }
- };
- AbstractTimeGridView.prototype._unrenderSkeleton = function () {
- this.el.classList.remove('fc-timeGrid-view');
- this.timeGrid.destroy();
- if (this.dayGrid) {
- this.dayGrid.destroy();
- }
- this.scroller.destroy();
- };
- /* Rendering
- ------------------------------------------------------------------------------------------------------------------*/
- // Builds the HTML skeleton for the view.
- // The day-grid and time-grid components will render inside containers defined by this HTML.
- AbstractTimeGridView.prototype.renderSkeletonHtml = function () {
- var _a = this.context, theme = _a.theme, options = _a.options;
- return '' +
- '<table class="' + theme.getClass('tableGrid') + '">' +
- (options.columnHeader ?
- '<thead class="fc-head">' +
- '<tr>' +
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
- '</tr>' +
- '</thead>' :
- '') +
- '<tbody class="fc-body">' +
- '<tr>' +
- '<td class="' + theme.getClass('widgetContent') + '">' +
- (options.allDaySlot ?
- '<div class="fc-day-grid"></div>' +
- '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
- '') +
- '</td>' +
- '</tr>' +
- '</tbody>' +
- '</table>';
- };
- /* Now Indicator
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractTimeGridView.prototype.getNowIndicatorUnit = function () {
- return this.timeGrid.getNowIndicatorUnit();
- };
- // subclasses should implement
- // renderNowIndicator(date: DateMarker) {
- // }
- AbstractTimeGridView.prototype.unrenderNowIndicator = function () {
- this.timeGrid.unrenderNowIndicator();
- };
- /* Dimensions
- ------------------------------------------------------------------------------------------------------------------*/
- AbstractTimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
- this.timeGrid.updateSize(isResize);
- if (this.dayGrid) {
- this.dayGrid.updateSize(isResize);
- }
- };
- // Adjusts the vertical dimensions of the view to the specified values
- AbstractTimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
- var _this = this;
- var eventLimit;
- var scrollerHeight;
- var scrollbarWidths;
- // make all axis cells line up
- this.axisWidth = core.matchCellWidths(core.findElements(this.el, '.fc-axis'));
- // hack to give the view some height prior to timeGrid's columns being rendered
- // TODO: separate setting height from scroller VS timeGrid.
- if (!this.timeGrid.colEls) {
- if (!isAuto) {
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- return;
- }
- // set of fake row elements that must compensate when scroller has scrollbars
- var noScrollRowEls = core.findElements(this.el, '.fc-row').filter(function (node) {
- return !_this.scroller.el.contains(node);
- });
- // reset all dimensions back to the original state
- this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
- this.scroller.clear(); // sets height to 'auto' and clears overflow
- noScrollRowEls.forEach(core.uncompensateScroll);
- // limit number of events in the all-day area
- if (this.dayGrid) {
- this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
- eventLimit = this.context.options.eventLimit;
- if (eventLimit && typeof eventLimit !== 'number') {
- eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
- }
- if (eventLimit) {
- this.dayGrid.limitRows(eventLimit);
- }
- }
- if (!isAuto) { // should we force dimensions of the scroll container?
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- scrollbarWidths = this.scroller.getScrollbarWidths();
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
- // make the all-day and header rows lines up
- noScrollRowEls.forEach(function (rowEl) {
- core.compensateScroll(rowEl, scrollbarWidths);
- });
- // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
- // and reapply the desired height to the scroller.
- scrollerHeight = this.computeScrollerHeight(viewHeight);
- this.scroller.setHeight(scrollerHeight);
- }
- // guarantees the same scrollbar widths
- this.scroller.lockOverflow(scrollbarWidths);
- // if there's any space below the slats, show the horizontal rule.
- // this won't cause any new overflow, because lockOverflow already called.
- if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
- this.timeGrid.bottomRuleEl.style.display = '';
- }
- }
- };
- // given a desired total height of the view, returns what the height of the scroller should be
- AbstractTimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
- return viewHeight -
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
- };
- /* Scroll
- ------------------------------------------------------------------------------------------------------------------*/
- // Computes the initial pre-configured scroll state prior to allowing the user to change it
- AbstractTimeGridView.prototype.computeDateScroll = function (duration) {
- var top = this.timeGrid.computeTimeTop(duration);
- // zoom can give weird floating-point values. rather scroll a little bit further
- top = Math.ceil(top);
- if (top) {
- top++; // to overcome top border that slots beyond the first have. looks better
- }
- return { top: top };
- };
- AbstractTimeGridView.prototype.queryDateScroll = function () {
- return { top: this.scroller.getScrollTop() };
- };
- AbstractTimeGridView.prototype.applyDateScroll = function (scroll) {
- if (scroll.top !== undefined) {
- this.scroller.setScrollTop(scroll.top);
- }
- };
- // Generates an HTML attribute string for setting the width of the axis, if it is known
- AbstractTimeGridView.prototype.axisStyleAttr = function () {
- if (this.axisWidth != null) {
- return 'style="width:' + this.axisWidth + 'px"';
- }
- return '';
- };
- return AbstractTimeGridView;
- }(core.View));
- AbstractTimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
-
- var SimpleTimeGrid = /** @class */ (function (_super) {
- __extends(SimpleTimeGrid, _super);
- function SimpleTimeGrid(timeGrid) {
- var _this = _super.call(this, timeGrid.el) || this;
- _this.buildDayRanges = core.memoize(buildDayRanges);
- _this.slicer = new TimeGridSlicer();
- _this.timeGrid = timeGrid;
- return _this;
- }
- SimpleTimeGrid.prototype.firstContext = function (context) {
- context.calendar.registerInteractiveComponent(this, {
- el: this.timeGrid.el
- });
- };
- SimpleTimeGrid.prototype.destroy = function () {
- _super.prototype.destroy.call(this);
- this.context.calendar.unregisterInteractiveComponent(this);
- };
- SimpleTimeGrid.prototype.render = function (props, context) {
- var dateEnv = this.context.dateEnv;
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
- var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, dateEnv);
- var timeGrid = this.timeGrid;
- timeGrid.receiveContext(context); // hack because context is used in sliceProps
- timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, context.calendar, timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }), context);
- };
- SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
- this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
- };
- SimpleTimeGrid.prototype.buildPositionCaches = function () {
- this.timeGrid.buildPositionCaches();
- };
- SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
- var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
- if (rawHit) {
- return {
- component: this.timeGrid,
- dateSpan: rawHit.dateSpan,
- dayEl: rawHit.dayEl,
- rect: {
- left: rawHit.relativeRect.left,
- right: rawHit.relativeRect.right,
- top: rawHit.relativeRect.top,
- bottom: rawHit.relativeRect.bottom
- },
- layer: 0
- };
- }
- };
- return SimpleTimeGrid;
- }(core.DateComponent));
- function buildDayRanges(dayTable, dateProfile, dateEnv) {
- var ranges = [];
- for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
- var date = _a[_i];
- ranges.push({
- start: dateEnv.add(date, dateProfile.minTime),
- end: dateEnv.add(date, dateProfile.maxTime)
- });
- }
- return ranges;
- }
- var TimeGridSlicer = /** @class */ (function (_super) {
- __extends(TimeGridSlicer, _super);
- function TimeGridSlicer() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
- var segs = [];
- for (var col = 0; col < dayRanges.length; col++) {
- var segRange = core.intersectRanges(range, dayRanges[col]);
- if (segRange) {
- segs.push({
- start: segRange.start,
- end: segRange.end,
- isStart: segRange.start.valueOf() === range.start.valueOf(),
- isEnd: segRange.end.valueOf() === range.end.valueOf(),
- col: col
- });
- }
- }
- return segs;
- };
- return TimeGridSlicer;
- }(core.Slicer));
-
- var TimeGridView = /** @class */ (function (_super) {
- __extends(TimeGridView, _super);
- function TimeGridView() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- _this.buildDayTable = core.memoize(buildDayTable);
- return _this;
- }
- TimeGridView.prototype.render = function (props, context) {
- _super.prototype.render.call(this, props, context); // for flags for updateSize. also _renderSkeleton/_unrenderSkeleton
- var _a = this.props, dateProfile = _a.dateProfile, dateProfileGenerator = _a.dateProfileGenerator;
- var nextDayThreshold = context.nextDayThreshold;
- var dayTable = this.buildDayTable(dateProfile, dateProfileGenerator);
- var splitProps = this.splitter.splitProps(props);
- if (this.header) {
- this.header.receiveProps({
- dateProfile: dateProfile,
- dates: dayTable.headerDates,
- datesRepDistinctDays: true,
- renderIntroHtml: this.renderHeadIntroHtml
- }, context);
- }
- this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
- dayTable: dayTable }), context);
- if (this.simpleDayGrid) {
- this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
- dayTable: dayTable,
- nextDayThreshold: nextDayThreshold, isRigid: false }), context);
- }
- this.startNowIndicator(dateProfile, dateProfileGenerator);
- };
- TimeGridView.prototype._renderSkeleton = function (context) {
- _super.prototype._renderSkeleton.call(this, context);
- if (context.options.columnHeader) {
- this.header = new core.DayHeader(this.el.querySelector('.fc-head-container'));
- }
- this.simpleTimeGrid = new SimpleTimeGrid(this.timeGrid);
- if (this.dayGrid) {
- this.simpleDayGrid = new daygrid.SimpleDayGrid(this.dayGrid);
- }
- };
- TimeGridView.prototype._unrenderSkeleton = function () {
- _super.prototype._unrenderSkeleton.call(this);
- if (this.header) {
- this.header.destroy();
- }
- this.simpleTimeGrid.destroy();
- if (this.simpleDayGrid) {
- this.simpleDayGrid.destroy();
- }
- };
- TimeGridView.prototype.renderNowIndicator = function (date) {
- this.simpleTimeGrid.renderNowIndicator(date);
- };
- return TimeGridView;
- }(AbstractTimeGridView));
- function buildDayTable(dateProfile, dateProfileGenerator) {
- var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
- return new core.DayTable(daySeries, false);
- }
-
- var main = core.createPlugin({
- defaultView: 'timeGridWeek',
- views: {
- timeGrid: {
- class: TimeGridView,
- allDaySlot: true,
- slotDuration: '00:30:00',
- slotEventOverlap: true // a bad name. confused with overlap/constraint system
- },
- timeGridDay: {
- type: 'timeGrid',
- duration: { days: 1 }
- },
- timeGridWeek: {
- type: 'timeGrid',
- duration: { weeks: 1 }
- }
- }
- });
-
- exports.AbstractTimeGridView = AbstractTimeGridView;
- exports.TimeGrid = TimeGrid;
- exports.TimeGridSlicer = TimeGridSlicer;
- exports.TimeGridView = TimeGridView;
- exports.buildDayRanges = buildDayRanges;
- exports.buildDayTable = buildDayTable;
- exports.default = main;
-
- Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/library/fullcalendar/packages/timegrid/main.min.css b/library/fullcalendar/packages/timegrid/main.min.css
deleted file mode 100644
index a1abf91f5..000000000
--- a/library/fullcalendar/packages/timegrid/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:" - "}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent} \ No newline at end of file
diff --git a/library/fullcalendar/packages/timegrid/main.min.js b/library/fullcalendar/packages/timegrid/main.min.js
deleted file mode 100644
index 106940ffa..000000000
--- a/library/fullcalendar/packages/timegrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.4.2
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/daygrid"],t):t((e=e||self).FullCalendarTimeGrid={},e.FullCalendar,e.FullCalendarDayGrid)}(this,(function(e,t,r){"use strict";var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var o=function(){return(o=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},s=function(e){function r(t){var r=e.call(this)||this;return r.timeGrid=t,r}return n(r,e),r.prototype.renderSegs=function(r,i,n){e.prototype.renderSegs.call(this,r,i,n),this.fullTimeFormat=t.createFormatter({hour:"numeric",minute:"2-digit",separator:this.context.options.defaultRangeSeparator})},r.prototype.attachSegs=function(e,t){for(var r=this.timeGrid.groupSegsByCol(e),i=0;i<r.length;i++)r[i]=this.sortEventSegs(r[i]);this.segsByCol=r,this.timeGrid.attachSegsByCol(r,this.timeGrid.fgContainerEls)},r.prototype.detachSegs=function(e){e.forEach((function(e){t.removeElement(e.el)})),this.segsByCol=null},r.prototype.computeSegSizes=function(e){var t=this.timeGrid,r=this.segsByCol,i=t.colCnt;if(t.computeSegVerticals(e),r)for(var n=0;n<i;n++)this.computeSegHorizontals(r[n])},r.prototype.assignSegSizes=function(e){var t=this.timeGrid,r=this.segsByCol,i=t.colCnt;if(t.assignSegVerticals(e),r)for(var n=0;n<i;n++)this.assignSegCss(r[n])},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:!1}},r.prototype.computeDisplayEventEnd=function(){return!0},r.prototype.renderSegHtml=function(e,r){var i,n,o,s=e.eventRange,a=s.def,l=s.ui,d=a.allDay,c=t.computeEventDraggable(this.context,a,l),h=e.isStart&&t.computeEventStartResizable(this.context,a,l),u=e.isEnd&&t.computeEventEndResizable(this.context,a,l),p=this.getSegClasses(e,c,h||u,r),f=t.cssToStr(this.getSkinCss(l));if(p.unshift("fc-time-grid-event"),t.isMultiDayRange(s.range)){if(e.isStart||e.isEnd){var g=e.start,m=e.end;i=this._getTimeText(g,m,d),n=this._getTimeText(g,m,d,this.fullTimeFormat),o=this._getTimeText(g,m,d,null,!1)}}else i=this.getTimeText(s),n=this.getTimeText(s,this.fullTimeFormat),o=this.getTimeText(s,null,!1);return'<a class="'+p.join(" ")+'"'+(a.url?' href="'+t.htmlEscape(a.url)+'"':"")+(f?' style="'+f+'"':"")+'><div class="fc-content">'+(i?'<div class="fc-time" data-start="'+t.htmlEscape(o)+'" data-full="'+t.htmlEscape(n)+'"><span>'+t.htmlEscape(i)+"</span></div>":"")+(a.title?'<div class="fc-title">'+t.htmlEscape(a.title)+"</div>":"")+"</div>"+(u?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeSegHorizontals=function(e){var t,r,i;if(function(e){var t,r,i,n,o;for(t=0;t<e.length;t++)for(r=e[t],i=0;i<r.length;i++)for((n=r[i]).forwardSegs=[],o=t+1;o<e.length;o++)l(n,e[o],n.forwardSegs)}(t=function(e){var t,r,i,n=[];for(t=0;t<e.length;t++){for(r=e[t],i=0;i<n.length&&l(r,n[i]).length;i++);r.level=i,(n[i]||(n[i]=[])).push(r)}return n}(e)),r=t[0]){for(i=0;i<r.length;i++)a(r[i]);for(i=0;i<r.length;i++)this.computeSegForwardBack(r[i],0,0)}},r.prototype.computeSegForwardBack=function(e,t,r){var i,n=e.forwardSegs;if(void 0===e.forwardCoord)for(n.length?(this.sortForwardSegs(n),this.computeSegForwardBack(n[0],t+1,r),e.forwardCoord=n[0].backwardCoord):e.forwardCoord=1,e.backwardCoord=e.forwardCoord-(e.forwardCoord-r)/(t+1),i=0;i<n.length;i++)this.computeSegForwardBack(n[i],0,e.forwardCoord)},r.prototype.sortForwardSegs=function(e){var r=e.map(d),i=[{field:"forwardPressure",order:-1},{field:"backwardCoord",order:1}].concat(this.context.eventOrderSpecs);return r.sort((function(e,r){return t.compareByFieldSpecs(e,r,i)})),r.map((function(e){return e._seg}))},r.prototype.assignSegCss=function(e){for(var r=0,i=e;r<i.length;r++){var n=i[r];t.applyStyle(n.el,this.generateSegCss(n)),n.level>0&&n.el.classList.add("fc-time-grid-event-inset"),n.eventRange.def.title&&n.bottom-n.top<30&&n.el.classList.add("fc-short")}},r.prototype.generateSegCss=function(e){var t,r,i=this.context.options.slotEventOverlap,n=e.backwardCoord,o=e.forwardCoord,s=this.timeGrid.generateSegVerticalCss(e),a=this.context.isRtl;return i&&(o=Math.min(1,n+2*(o-n))),a?(t=1-o,r=n):(t=n,r=1-o),s.zIndex=e.level+1,s.left=100*t+"%",s.right=100*r+"%",i&&e.forwardPressure&&(s[a?"marginLeft":"marginRight"]=20),s},r}(t.FgEventRenderer);function a(e){var t,r,i=e.forwardSegs,n=0;if(void 0===e.forwardPressure){for(t=0;t<i.length;t++)a(r=i[t]),n=Math.max(n,1+r.forwardPressure);e.forwardPressure=n}}function l(e,t,r){void 0===r&&(r=[]);for(var i=0;i<t.length;i++)n=e,o=t[i],n.bottom>o.top&&n.top<o.bottom&&r.push(t[i]);var n,o;return r}function d(e){var r=t.buildSegCompareObj(e);return r.forwardPressure=e.forwardPressure,r.backwardCoord=e.backwardCoord,r}var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.attachSegs=function(e,t){this.segsByCol=this.timeGrid.groupSegsByCol(e),this.timeGrid.attachSegsByCol(this.segsByCol,this.timeGrid.mirrorContainerEls),this.sourceSeg=t.sourceSeg},t.prototype.generateSegCss=function(t){var r=e.prototype.generateSegCss.call(this,t),i=this.sourceSeg;if(i&&i.col===t.col){var n=e.prototype.generateSegCss.call(this,i);r.left=n.left,r.right=n.right,r.marginLeft=n.marginLeft,r.marginRight=n.marginRight}return r},t}(s),h=function(e){function t(t){var r=e.call(this)||this;return r.timeGrid=t,r}return n(t,e),t.prototype.attachSegs=function(e,t){var r,i=this.timeGrid;return"bgEvent"===e?r=i.bgContainerEls:"businessHours"===e?r=i.businessContainerEls:"highlight"===e&&(r=i.highlightContainerEls),i.attachSegsByCol(i.groupSegsByCol(t),r),t.map((function(e){return e.el}))},t.prototype.computeSegSizes=function(e){this.timeGrid.computeSegVerticals(e)},t.prototype.assignSegSizes=function(e){this.timeGrid.assignSegVerticals(e)},t}(t.FillRenderer),u=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],p=function(e){function i(r,i){var n=e.call(this,r)||this;n.isSlatSizesDirty=!1,n.isColSizesDirty=!1,n.processOptions=t.memoize(n._processOptions),n.renderSkeleton=t.memoizeRendering(n._renderSkeleton),n.renderSlats=t.memoizeRendering(n._renderSlats,null,[n.renderSkeleton]),n.renderColumns=t.memoizeRendering(n._renderColumns,n._unrenderColumns,[n.renderSkeleton]),n.renderProps=i;var o=n.renderColumns,a=n.eventRenderer=new s(n),l=n.fillRenderer=new h(n);return n.mirrorRenderer=new c(n),n.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[o]),n.renderDateSelection=t.memoizeRendering(n._renderDateSelection,n._unrenderDateSelection,[o]),n.renderFgEvents=t.memoizeRendering(a.renderSegs.bind(a),a.unrender.bind(a),[o]),n.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[o]),n.renderEventSelection=t.memoizeRendering(a.selectByInstanceId.bind(a),a.unselectByInstanceId.bind(a),[n.renderFgEvents]),n.renderEventDrag=t.memoizeRendering(n._renderEventDrag,n._unrenderEventDrag,[o]),n.renderEventResize=t.memoizeRendering(n._renderEventResize,n._unrenderEventResize,[o]),n}return n(i,e),i.prototype._processOptions=function(e){var r,i,n=e.slotDuration,o=e.snapDuration;n=t.createDuration(n),o=o?t.createDuration(o):n,null===(r=t.wholeDivideDurations(n,o))&&(o=n,r=1),this.slotDuration=n,this.snapDuration=o,this.snapsPerSlot=r,i=e.slotLabelFormat,Array.isArray(i)&&(i=i[i.length-1]),this.labelFormat=t.createFormatter(i||{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"}),i=e.slotLabelInterval,this.labelInterval=i?t.createDuration(i):this.computeLabelInterval(n)},i.prototype.computeLabelInterval=function(e){var r,i,n;for(r=u.length-1;r>=0;r--)if(i=t.createDuration(u[r]),null!==(n=t.wholeDivideDurations(i,e))&&n>1)return i;return e},i.prototype.render=function(e,t){this.processOptions(t.options);var r=e.cells;this.colCnt=r.length,this.renderSkeleton(t.theme),this.renderSlats(e.dateProfile),this.renderColumns(e.cells,e.dateProfile),this.renderBusinessHours(t,e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderFgEvents(t,e.fgEventSegs),this.renderBgEvents(t,e.bgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize)},i.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSlats.unrender(),this.renderColumns.unrender(),this.renderSkeleton.unrender()},i.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,i=this.mirrorRenderer;(e||this.isSlatSizesDirty)&&(this.buildSlatPositions(),this.isSlatSizesDirty=!1),(e||this.isColSizesDirty)&&(this.buildColPositions(),this.isColSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),i.computeSizes(e),t.assignSizes(e),r.assignSizes(e),i.assignSizes(e)},i.prototype._renderSkeleton=function(e){var t=this.el;t.innerHTML='<div class="fc-bg"></div><div class="fc-slats"></div><hr class="fc-divider '+e.getClass("widgetHeader")+'" style="display:none" />',this.rootBgContainerEl=t.querySelector(".fc-bg"),this.slatContainerEl=t.querySelector(".fc-slats"),this.bottomRuleEl=t.querySelector(".fc-divider")},i.prototype._renderSlats=function(e){var r=this.context.theme;this.slatContainerEl.innerHTML='<table class="'+r.getClass("tableGrid")+'">'+this.renderSlatRowHtml(e)+"</table>",this.slatEls=t.findElements(this.slatContainerEl,"tr"),this.slatPositions=new t.PositionCache(this.el,this.slatEls,!1,!0),this.isSlatSizesDirty=!0},i.prototype.renderSlatRowHtml=function(e){for(var r,i,n,o=this.context,s=o.dateEnv,a=o.theme,l=o.isRtl,d="",c=t.startOfDay(e.renderRange.start),h=e.minTime,u=t.createDuration(0);t.asRoughMs(h)<t.asRoughMs(e.maxTime);)r=s.add(c,h),i=null!==t.wholeDivideDurations(u,this.labelInterval),n='<td class="fc-axis fc-time '+a.getClass("widgetContent")+'">'+(i?"<span>"+t.htmlEscape(s.format(r,this.labelFormat))+"</span>":"")+"</td>",d+='<tr data-time="'+t.formatIsoTimeString(r)+'"'+(i?"":' class="fc-minor"')+">"+(l?"":n)+'<td class="'+a.getClass("widgetContent")+'"></td>'+(l?n:"")+"</tr>",h=t.addDurations(h,this.slotDuration),u=t.addDurations(u,this.slotDuration);return d},i.prototype._renderColumns=function(e,i){var n=this.context,o=n.calendar,s=n.view,a=n.isRtl,l=n.theme,d=n.dateEnv,c=new r.DayBgRow(this.context);this.rootBgContainerEl.innerHTML='<table class="'+l.getClass("tableGrid")+'">'+c.renderHtml({cells:e,dateProfile:i,renderIntroHtml:this.renderProps.renderBgIntroHtml})+"</table>",this.colEls=t.findElements(this.el,".fc-day, .fc-disabled-day");for(var h=0;h<this.colCnt;h++)o.publiclyTrigger("dayRender",[{date:d.toDate(e[h].date),el:this.colEls[h],view:s}]);a&&this.colEls.reverse(),this.colPositions=new t.PositionCache(this.el,this.colEls,!0,!1),this.renderContentSkeleton(),this.isColSizesDirty=!0},i.prototype._unrenderColumns=function(){this.unrenderContentSkeleton()},i.prototype.renderContentSkeleton=function(){var e,r=this.context.isRtl,i=[];i.push(this.renderProps.renderIntroHtml());for(var n=0;n<this.colCnt;n++)i.push('<td><div class="fc-content-col"><div class="fc-event-container fc-mirror-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>');r&&i.reverse(),e=this.contentSkeletonEl=t.htmlToElement('<div class="fc-content-skeleton"><table><tr>'+i.join("")+"</tr></table></div>"),this.colContainerEls=t.findElements(e,".fc-content-col"),this.mirrorContainerEls=t.findElements(e,".fc-mirror-container"),this.fgContainerEls=t.findElements(e,".fc-event-container:not(.fc-mirror-container)"),this.bgContainerEls=t.findElements(e,".fc-bgevent-container"),this.highlightContainerEls=t.findElements(e,".fc-highlight-container"),this.businessContainerEls=t.findElements(e,".fc-business-container"),r&&(this.colContainerEls.reverse(),this.mirrorContainerEls.reverse(),this.fgContainerEls.reverse(),this.bgContainerEls.reverse(),this.highlightContainerEls.reverse(),this.businessContainerEls.reverse()),this.el.appendChild(e)},i.prototype.unrenderContentSkeleton=function(){t.removeElement(this.contentSkeletonEl)},i.prototype.groupSegsByCol=function(e){var t,r=[];for(t=0;t<this.colCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].col].push(e[t]);return r},i.prototype.attachSegsByCol=function(e,t){var r,i,n;for(r=0;r<this.colCnt;r++)for(i=e[r],n=0;n<i.length;n++)t[r].appendChild(i[n].el)},i.prototype.getNowIndicatorUnit=function(){return"minute"},i.prototype.renderNowIndicator=function(e,r){if(this.colContainerEls){var i,n=this.computeDateTop(r),o=[];for(i=0;i<e.length;i++){var s=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-line"});s.style.top=n+"px",this.colContainerEls[e[i].col].appendChild(s),o.push(s)}if(e.length>0){var a=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow"});a.style.top=n+"px",this.contentSkeletonEl.appendChild(a),o.push(a)}this.nowIndicatorEls=o}},i.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.forEach(t.removeElement),this.nowIndicatorEls=null)},i.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.getBoundingClientRect().height},i.prototype.computeDateTop=function(e,r){return r||(r=t.startOfDay(e)),this.computeTimeTop(t.createDuration(e.valueOf()-r.valueOf()))},i.prototype.computeTimeTop=function(e){var r,i,n=this.slatEls.length,o=this.props.dateProfile,s=(e.milliseconds-t.asRoughMs(o.minTime))/t.asRoughMs(this.slotDuration);return s=Math.max(0,s),s=Math.min(n,s),r=Math.floor(s),i=s-(r=Math.min(r,n-1)),this.slatPositions.tops[r]+this.slatPositions.getHeight(r)*i},i.prototype.computeSegVerticals=function(e){var t,r,i,n=this.context.options.timeGridEventMinHeight;for(t=0;t<e.length;t++)r=e[t],i=this.props.cells[r.col].date,r.top=this.computeDateTop(r.start,i),r.bottom=Math.max(r.top+n,this.computeDateTop(r.end,i))},i.prototype.assignSegVerticals=function(e){var r,i;for(r=0;r<e.length;r++)i=e[r],t.applyStyle(i.el,this.generateSegVerticalCss(i))},i.prototype.generateSegVerticalCss=function(e){return{top:e.top,bottom:-e.bottom}},i.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildSlatPositions()},i.prototype.buildColPositions=function(){this.colPositions.build()},i.prototype.buildSlatPositions=function(){this.slatPositions.build()},i.prototype.positionToHit=function(e,r){var i=this.context.dateEnv,n=this.snapsPerSlot,o=this.slatPositions,s=this.colPositions,a=s.leftToIndex(e),l=o.topToIndex(r);if(null!=a&&null!=l){var d=o.tops[l],c=o.getHeight(l),h=(r-d)/c,u=l*n+Math.floor(h*n),p=this.props.cells[a].date,f=t.addDurations(this.props.dateProfile.minTime,t.multiplyDuration(this.snapDuration,u)),g=i.add(p,f);return{col:a,dateSpan:{range:{start:g,end:i.add(g,this.snapDuration)},allDay:!1},dayEl:this.colEls[a],relativeRect:{left:s.lefts[a],right:s.rights[a],top:d,bottom:d+c}}}},i.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),e.isEvent?this.mirrorRenderer.renderSegs(this.context,e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}):this.fillRenderer.renderSegs("highlight",this.context,e.segs))},i.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),e.isEvent?this.mirrorRenderer.unrender(this.context,e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}):this.fillRenderer.unrender("highlight",this.context))},i.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.mirrorRenderer.renderSegs(this.context,e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},i.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(this.context,e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},i.prototype._renderDateSelection=function(e){e&&(this.context.options.selectMirror?this.mirrorRenderer.renderSegs(this.context,e,{isSelecting:!0}):this.fillRenderer.renderSegs("highlight",this.context,e))},i.prototype._unrenderDateSelection=function(e){e&&(this.context.options.selectMirror?this.mirrorRenderer.unrender(this.context,e,{isSelecting:!0}):this.fillRenderer.unrender("highlight",this.context))},i}(t.DateComponent),f=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},r.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},r.prototype.getKeysForEventDef=function(e){return e.allDay?t.hasBgRendering(e)?["timed","allDay"]:["allDay"]:["timed"]},r}(t.Splitter),g=t.createFormatter({week:"short"}),m=function(e){function i(){var r=null!==e&&e.apply(this,arguments)||this;return r.splitter=new f,r.renderSkeleton=t.memoizeRendering(r._renderSkeleton,r._unrenderSkeleton),r.renderHeadIntroHtml=function(){var e,i=r.context,n=i.theme,o=i.dateEnv,s=i.options,a=r.props.dateProfile.renderRange,l=t.diffDays(a.start,a.end);return s.weekNumbers?(e=o.format(a.start,g),'<th class="fc-axis fc-week-number '+n.getClass("widgetHeader")+'" '+r.axisStyleAttr()+">"+t.buildGotoAnchorHtml(s,o,{date:a.start,type:"week",forceOff:l>1},t.htmlEscape(e))+"</th>"):'<th class="fc-axis '+n.getClass("widgetHeader")+'" '+r.axisStyleAttr()+"></th>"},r.renderTimeGridBgIntroHtml=function(){return'<td class="fc-axis '+r.context.theme.getClass("widgetContent")+'" '+r.axisStyleAttr()+"></td>"},r.renderTimeGridIntroHtml=function(){return'<td class="fc-axis" '+r.axisStyleAttr()+"></td>"},r.renderDayGridBgIntroHtml=function(){var e=r.context,i=e.theme,n=e.options;return'<td class="fc-axis '+i.getClass("widgetContent")+'" '+r.axisStyleAttr()+"><span>"+t.getAllDayHtml(n)+"</span></td>"},r.renderDayGridIntroHtml=function(){return'<td class="fc-axis" '+r.axisStyleAttr()+"></td>"},r}return n(i,e),i.prototype.render=function(t,r){e.prototype.render.call(this,t,r),this.renderSkeleton(r)},i.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSkeleton.unrender()},i.prototype._renderSkeleton=function(e){this.el.classList.add("fc-timeGrid-view"),this.el.innerHTML=this.renderSkeletonHtml(),this.scroller=new t.ScrollComponent("hidden","auto");var i=this.scroller.el;this.el.querySelector(".fc-body > tr > td").appendChild(i),i.classList.add("fc-time-grid-container");var n=t.createElement("div",{className:"fc-time-grid"});if(i.appendChild(n),this.timeGrid=new p(n,{renderBgIntroHtml:this.renderTimeGridBgIntroHtml,renderIntroHtml:this.renderTimeGridIntroHtml}),e.options.allDaySlot){this.dayGrid=new r.DayGrid(this.el.querySelector(".fc-day-grid"),{renderNumberIntroHtml:this.renderDayGridIntroHtml,renderBgIntroHtml:this.renderDayGridBgIntroHtml,renderIntroHtml:this.renderDayGridIntroHtml,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1});var o=this.el.querySelector(".fc-divider");this.dayGrid.bottomCoordPadding=o.getBoundingClientRect().height}},i.prototype._unrenderSkeleton=function(){this.el.classList.remove("fc-timeGrid-view"),this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),this.scroller.destroy()},i.prototype.renderSkeletonHtml=function(){var e=this.context,t=e.theme,r=e.options;return'<table class="'+t.getClass("tableGrid")+'">'+(r.columnHeader?'<thead class="fc-head"><tr><td class="fc-head-container '+t.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+t.getClass("widgetContent")+'">'+(r.allDaySlot?'<div class="fc-day-grid"></div><hr class="fc-divider '+t.getClass("widgetHeader")+'" />':"")+"</td></tr></tbody></table>"},i.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},i.prototype.unrenderNowIndicator=function(){this.timeGrid.unrenderNowIndicator()},i.prototype.updateSize=function(t,r,i){e.prototype.updateSize.call(this,t,r,i),this.timeGrid.updateSize(t),this.dayGrid&&this.dayGrid.updateSize(t)},i.prototype.updateBaseSize=function(e,r,i){var n,o,s,a=this;if(this.axisWidth=t.matchCellWidths(t.findElements(this.el,".fc-axis")),this.timeGrid.colEls){var l=t.findElements(this.el,".fc-row").filter((function(e){return!a.scroller.el.contains(e)}));this.timeGrid.bottomRuleEl.style.display="none",this.scroller.clear(),l.forEach(t.uncompensateScroll),this.dayGrid&&(this.dayGrid.removeSegPopover(),(n=this.context.options.eventLimit)&&"number"!=typeof n&&(n=5),n&&this.dayGrid.limitRows(n)),i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o),((s=this.scroller.getScrollbarWidths()).left||s.right)&&(l.forEach((function(e){t.compensateScroll(e,s)})),o=this.computeScrollerHeight(r),this.scroller.setHeight(o)),this.scroller.lockOverflow(s),this.timeGrid.getTotalSlatHeight()<o&&(this.timeGrid.bottomRuleEl.style.display=""))}else i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o))},i.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},i.prototype.computeDateScroll=function(e){var t=this.timeGrid.computeTimeTop(e);return(t=Math.ceil(t))&&t++,{top:t}},i.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},i.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},i.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},i}(t.View);m.prototype.usesMinMaxTime=!0;var y=function(e){function r(r){var i=e.call(this,r.el)||this;return i.buildDayRanges=t.memoize(v),i.slicer=new S,i.timeGrid=r,i}return n(r,e),r.prototype.firstContext=function(e){e.calendar.registerInteractiveComponent(this,{el:this.timeGrid.el})},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.context.calendar.unregisterInteractiveComponent(this)},r.prototype.render=function(e,t){var r=this.context.dateEnv,i=e.dateProfile,n=e.dayTable,s=this.dayRanges=this.buildDayRanges(n,i,r),a=this.timeGrid;a.receiveContext(t),a.receiveProps(o({},this.slicer.sliceProps(e,i,null,t.calendar,a,s),{dateProfile:i,cells:n.cells[0]}),t)},r.prototype.renderNowIndicator=function(e){this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(e,this.timeGrid,this.dayRanges),e)},r.prototype.buildPositionCaches=function(){this.timeGrid.buildPositionCaches()},r.prototype.queryHit=function(e,t){var r=this.timeGrid.positionToHit(e,t);if(r)return{component:this.timeGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},r}(t.DateComponent);function v(e,t,r){for(var i=[],n=0,o=e.headerDates;n<o.length;n++){var s=o[n];i.push({start:r.add(s,t.minTime),end:r.add(s,t.maxTime)})}return i}var S=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.sliceRange=function(e,r){for(var i=[],n=0;n<r.length;n++){var o=t.intersectRanges(e,r[n]);o&&i.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:n})}return i},r}(t.Slicer),C=function(e){function i(){var r=null!==e&&e.apply(this,arguments)||this;return r.buildDayTable=t.memoize(E),r}return n(i,e),i.prototype.render=function(t,r){e.prototype.render.call(this,t,r);var i=this.props,n=i.dateProfile,s=i.dateProfileGenerator,a=r.nextDayThreshold,l=this.buildDayTable(n,s),d=this.splitter.splitProps(t);this.header&&this.header.receiveProps({dateProfile:n,dates:l.headerDates,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml},r),this.simpleTimeGrid.receiveProps(o({},d.timed,{dateProfile:n,dayTable:l}),r),this.simpleDayGrid&&this.simpleDayGrid.receiveProps(o({},d.allDay,{dateProfile:n,dayTable:l,nextDayThreshold:a,isRigid:!1}),r),this.startNowIndicator(n,s)},i.prototype._renderSkeleton=function(i){e.prototype._renderSkeleton.call(this,i),i.options.columnHeader&&(this.header=new t.DayHeader(this.el.querySelector(".fc-head-container"))),this.simpleTimeGrid=new y(this.timeGrid),this.dayGrid&&(this.simpleDayGrid=new r.SimpleDayGrid(this.dayGrid))},i.prototype._unrenderSkeleton=function(){e.prototype._unrenderSkeleton.call(this),this.header&&this.header.destroy(),this.simpleTimeGrid.destroy(),this.simpleDayGrid&&this.simpleDayGrid.destroy()},i.prototype.renderNowIndicator=function(e){this.simpleTimeGrid.renderNowIndicator(e)},i}(m);function E(e,r){var i=new t.DaySeries(e.renderRange,r);return new t.DayTable(i,!1)}var b=t.createPlugin({defaultView:"timeGridWeek",views:{timeGrid:{class:C,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});e.AbstractTimeGridView=m,e.TimeGrid=p,e.TimeGridSlicer=S,e.TimeGridView=C,e.buildDayRanges=v,e.buildDayTable=E,e.default=b,Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file
diff --git a/library/fullcalendar/packages/timegrid/package.json b/library/fullcalendar/packages/timegrid/package.json
deleted file mode 100644
index 3d92bcf78..000000000
--- a/library/fullcalendar/packages/timegrid/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "@fullcalendar/timegrid",
- "version": "4.4.2",
- "title": "FullCalendar Time Grid Plugin",
- "description": "Display your events on a grid of time slots",
- "keywords": [
- "calendar",
- "event",
- "full-sized"
- ],
- "homepage": "https://fullcalendar.io/",
- "docs": "https://fullcalendar.io/docs/timegrid-view",
- "bugs": "https://fullcalendar.io/reporting-bugs",
- "repository": {
- "type": "git",
- "url": "https://github.com/fullcalendar/fullcalendar.git",
- "homepage": "https://github.com/fullcalendar/fullcalendar"
- },
- "license": "MIT",
- "author": {
- "name": "Adam Shaw",
- "email": "arshaw@arshaw.com",
- "url": "http://arshaw.com/"
- },
- "copyright": "2019 Adam Shaw",
- "dependencies": {
- "@fullcalendar/daygrid": "~4.4.0"
- },
- "peerDependencies": {
- "@fullcalendar/core": "~4.4.0"
- },
- "main": "main.js",
- "module": "main.esm.js",
- "unpkg": "main.min.js",
- "types": "main.d.ts"
-}
diff --git a/library/fullcalendar/packages/web-component/index.global.js b/library/fullcalendar/packages/web-component/index.global.js
new file mode 100644
index 000000000..aa22a52a3
--- /dev/null
+++ b/library/fullcalendar/packages/web-component/index.global.js
@@ -0,0 +1,70 @@
+/*!
+FullCalendar Web Component v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+(function (core) {
+ 'use strict';
+
+ class FullCalendarElement extends HTMLElement {
+ constructor() {
+ super(...arguments);
+ this._calendar = null;
+ this._options = null;
+ }
+ connectedCallback() {
+ this._handleOptionsStr(this.getAttribute('options'));
+ }
+ disconnectedCallback() {
+ this._handleOptionsStr(null);
+ }
+ attributeChangedCallback(name, oldVal, newVal) {
+ if (name === 'options' &&
+ this._calendar // initial render happened
+ ) {
+ this._handleOptionsStr(newVal);
+ }
+ }
+ get options() {
+ return this._options;
+ }
+ set options(options) {
+ this._handleOptions(options);
+ }
+ getApi() {
+ return this._calendar;
+ }
+ _handleOptionsStr(optionsStr) {
+ this._handleOptions(optionsStr ? JSON.parse(optionsStr) : null);
+ }
+ _handleOptions(options) {
+ if (options) {
+ if (this._calendar) {
+ this._calendar.resetOptions(options);
+ }
+ else {
+ this.innerHTML = '<div></div>';
+ let calendarEl = this.querySelector('div');
+ let calendar = new core.Calendar(calendarEl, options);
+ calendar.render();
+ this._calendar = calendar;
+ }
+ this._options = options;
+ }
+ else {
+ if (this._calendar) {
+ this._calendar.destroy();
+ this._calendar = null;
+ }
+ this._options = null;
+ }
+ }
+ static get observedAttributes() {
+ return ['options'];
+ }
+ }
+
+ globalThis.FullCalendarElement = FullCalendarElement;
+ customElements.define('full-calendar', FullCalendarElement);
+
+})(FullCalendar);
diff --git a/library/fullcalendar/packages/web-component/index.global.min.js b/library/fullcalendar/packages/web-component/index.global.min.js
new file mode 100644
index 000000000..9a3a78173
--- /dev/null
+++ b/library/fullcalendar/packages/web-component/index.global.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Web Component v6.0.3
+Docs & License: https://fullcalendar.io
+(c) 2022 Adam Shaw
+*/
+!function(t){"use strict";class e extends HTMLElement{constructor(){super(...arguments),this._calendar=null,this._options=null}connectedCallback(){this._handleOptionsStr(this.getAttribute("options"))}disconnectedCallback(){this._handleOptionsStr(null)}attributeChangedCallback(t,e,n){"options"===t&&this._calendar&&this._handleOptionsStr(n)}get options(){return this._options}set options(t){this._handleOptions(t)}getApi(){return this._calendar}_handleOptionsStr(t){this._handleOptions(t?JSON.parse(t):null)}_handleOptions(e){if(e){if(this._calendar)this._calendar.resetOptions(e);else{this.innerHTML="<div></div>";let n=this.querySelector("div"),s=new t.Calendar(n,e);s.render(),this._calendar=s}this._options=e}else this._calendar&&(this._calendar.destroy(),this._calendar=null),this._options=null}static get observedAttributes(){return["options"]}}globalThis.FullCalendarElement=e,customElements.define("full-calendar",e)}(FullCalendar); \ No newline at end of file