@clickview/streamable-learning 0.48.0-rc.0 → 0.48.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/.vite/manifest.json +646 -646
  2. package/dist/bundles.json +1 -1
  3. package/dist/css/DU3tPCD_.chunk.css +12 -0
  4. package/dist/en.json +1 -1
  5. package/dist/scripts/{m9QbGES0.chunk.js → ACTQklJQ.chunk.js} +2 -2
  6. package/dist/scripts/{m9QbGES0.chunk.js.map → ACTQklJQ.chunk.js.map} +1 -1
  7. package/dist/scripts/{B7if0Lk52.chunk.js → B-qOny0I2.chunk.js} +2 -2
  8. package/dist/scripts/{B7if0Lk52.chunk.js.map → B-qOny0I2.chunk.js.map} +1 -1
  9. package/dist/scripts/{BSjm_rCE.chunk.js → B5jBIPaP.chunk.js} +2 -2
  10. package/dist/scripts/{BSjm_rCE.chunk.js.map → B5jBIPaP.chunk.js.map} +1 -1
  11. package/dist/scripts/{CPkKuTSK2.chunk.js → B703cBe72.chunk.js} +2 -2
  12. package/dist/scripts/{CPkKuTSK2.chunk.js.map → B703cBe72.chunk.js.map} +1 -1
  13. package/dist/scripts/{DNNNPLMp.chunk.js → B7iwtSij.chunk.js} +2 -2
  14. package/dist/scripts/{DNNNPLMp.chunk.js.map → B7iwtSij.chunk.js.map} +1 -1
  15. package/dist/scripts/{CXNve4Wq2.chunk.js → BCBfXCYM2.chunk.js} +2 -2
  16. package/dist/scripts/{CXNve4Wq2.chunk.js.map → BCBfXCYM2.chunk.js.map} +1 -1
  17. package/dist/scripts/{CoYNU7We2.chunk.js → BKnxYKDu2.chunk.js} +2 -2
  18. package/dist/scripts/{CoYNU7We2.chunk.js.map → BKnxYKDu2.chunk.js.map} +1 -1
  19. package/dist/scripts/{BoxedFO8.chunk.js → BLrjbrp8.chunk.js} +2 -2
  20. package/dist/scripts/{BoxedFO8.chunk.js.map → BLrjbrp8.chunk.js.map} +1 -1
  21. package/dist/scripts/{CibcLNJP2.chunk.js → BTYwcYPL2.chunk.js} +2 -2
  22. package/dist/scripts/{CibcLNJP2.chunk.js.map → BTYwcYPL2.chunk.js.map} +1 -1
  23. package/dist/scripts/{CwI-7tep2.chunk.js → BXJetawx2.chunk.js} +2 -2
  24. package/dist/scripts/{CwI-7tep2.chunk.js.map → BXJetawx2.chunk.js.map} +1 -1
  25. package/dist/scripts/{BV74ZRR22.chunk.js → BZOcEcTA2.chunk.js} +2 -2
  26. package/dist/scripts/{BV74ZRR22.chunk.js.map → BZOcEcTA2.chunk.js.map} +1 -1
  27. package/dist/scripts/{DxsW8K0n2.chunk.js → BaMNOAYj2.chunk.js} +2 -2
  28. package/dist/scripts/{DxsW8K0n2.chunk.js.map → BaMNOAYj2.chunk.js.map} +1 -1
  29. package/dist/scripts/{DrDQfaFN2.chunk.js → BihZ4r0z2.chunk.js} +3 -3
  30. package/dist/scripts/{DrDQfaFN2.chunk.js.map → BihZ4r0z2.chunk.js.map} +1 -1
  31. package/dist/scripts/{CK6c6uHp2.chunk.js → BpgHKWR52.chunk.js} +2 -2
  32. package/dist/scripts/{CK6c6uHp2.chunk.js.map → BpgHKWR52.chunk.js.map} +1 -1
  33. package/dist/scripts/{JtFbyaXc.chunk.js → Br0Uc4GG.chunk.js} +2 -2
  34. package/dist/scripts/{JtFbyaXc.chunk.js.map → Br0Uc4GG.chunk.js.map} +1 -1
  35. package/dist/scripts/{Dd8r1SE32.chunk.js → BsAo7Lri2.chunk.js} +2 -2
  36. package/dist/scripts/{Dd8r1SE32.chunk.js.map → BsAo7Lri2.chunk.js.map} +1 -1
  37. package/dist/scripts/{BMjES83N2.chunk.js → BvJXPFoz2.chunk.js} +2 -2
  38. package/dist/scripts/{BMjES83N2.chunk.js.map → BvJXPFoz2.chunk.js.map} +1 -1
  39. package/dist/scripts/{CpFOQcL7.chunk.js → BxypZGPK.chunk.js} +2 -2
  40. package/dist/scripts/{CpFOQcL7.chunk.js.map → BxypZGPK.chunk.js.map} +1 -1
  41. package/dist/scripts/C4MLxDS-.chunk.js +1 -0
  42. package/dist/scripts/{DLp7yHzT2.chunk.js → C5i1HsPp2.chunk.js} +2 -2
  43. package/dist/scripts/{DLp7yHzT2.chunk.js.map → C5i1HsPp2.chunk.js.map} +1 -1
  44. package/dist/scripts/{Bkv1Tbyu.chunk.js → CCoZQmgX.chunk.js} +2 -2
  45. package/dist/scripts/{Bkv1Tbyu.chunk.js.map → CCoZQmgX.chunk.js.map} +1 -1
  46. package/dist/scripts/{Clh6wBrg.chunk.js → CGxa1Jzq.chunk.js} +2 -2
  47. package/dist/scripts/{Clh6wBrg.chunk.js.map → CGxa1Jzq.chunk.js.map} +1 -1
  48. package/dist/scripts/{DAvXFgC62.chunk.js → CKdklY2o2.chunk.js} +2 -2
  49. package/dist/scripts/{DAvXFgC62.chunk.js.map → CKdklY2o2.chunk.js.map} +1 -1
  50. package/dist/scripts/{CeWjJPIz.chunk.js → CN8PeBwg.chunk.js} +2 -2
  51. package/dist/scripts/{CeWjJPIz.chunk.js.map → CN8PeBwg.chunk.js.map} +1 -1
  52. package/dist/scripts/{B1jitqYS2.chunk.js → CNJrD44-2.chunk.js} +2 -2
  53. package/dist/scripts/{B1jitqYS2.chunk.js.map → CNJrD44-2.chunk.js.map} +1 -1
  54. package/dist/scripts/{DIHDe4Sg.chunk.js → CNmmq34f.chunk.js} +2 -2
  55. package/dist/scripts/{DIHDe4Sg.chunk.js.map → CNmmq34f.chunk.js.map} +1 -1
  56. package/dist/scripts/{CikSQKH-.chunk.js → CUUUI6pl.chunk.js} +2 -2
  57. package/dist/scripts/{CikSQKH-.chunk.js.map → CUUUI6pl.chunk.js.map} +1 -1
  58. package/dist/scripts/{DNO0KpY72.chunk.js → CWFInhB82.chunk.js} +2 -2
  59. package/dist/scripts/{DNO0KpY72.chunk.js.map → CWFInhB82.chunk.js.map} +1 -1
  60. package/dist/scripts/{i2-k6ULv2.chunk.js → CbLL7dIz2.chunk.js} +2 -2
  61. package/dist/scripts/{i2-k6ULv2.chunk.js.map → CbLL7dIz2.chunk.js.map} +1 -1
  62. package/dist/scripts/{KCdpQ8qv2.chunk.js → Ce1TZZdV2.chunk.js} +2 -2
  63. package/dist/scripts/{KCdpQ8qv2.chunk.js.map → Ce1TZZdV2.chunk.js.map} +1 -1
  64. package/dist/scripts/{NV4_mMU8.chunk.js → Ces-KTwe.chunk.js} +2 -2
  65. package/dist/scripts/{NV4_mMU8.chunk.js.map → Ces-KTwe.chunk.js.map} +1 -1
  66. package/dist/scripts/{0xQRFMBY.chunk.js → CkYqp83j.chunk.js} +2 -2
  67. package/dist/scripts/{0xQRFMBY.chunk.js.map → CkYqp83j.chunk.js.map} +1 -1
  68. package/dist/scripts/{DvL3J2BU.chunk.js → CrCAJmt6.chunk.js} +2 -2
  69. package/dist/scripts/{DvL3J2BU.chunk.js.map → CrCAJmt6.chunk.js.map} +1 -1
  70. package/dist/scripts/{CcDgbmw52.chunk.js → CsC3VVvE2.chunk.js} +2 -2
  71. package/dist/scripts/{CcDgbmw52.chunk.js.map → CsC3VVvE2.chunk.js.map} +1 -1
  72. package/dist/scripts/{C9UjF0q6.chunk.js → D0SYGnyF.chunk.js} +2 -2
  73. package/dist/scripts/{C9UjF0q6.chunk.js.map → D0SYGnyF.chunk.js.map} +1 -1
  74. package/dist/scripts/{BqO6i89w2.chunk.js → D7tastET2.chunk.js} +2 -2
  75. package/dist/scripts/{BqO6i89w2.chunk.js.map → D7tastET2.chunk.js.map} +1 -1
  76. package/dist/scripts/{CeI-LCE-.chunk.js → DIavEegC.chunk.js} +2 -2
  77. package/dist/scripts/{CeI-LCE-.chunk.js.map → DIavEegC.chunk.js.map} +1 -1
  78. package/dist/scripts/{BKbKu9Rp.chunk.js → DK3xia1t.chunk.js} +2 -2
  79. package/dist/scripts/{BKbKu9Rp.chunk.js.map → DK3xia1t.chunk.js.map} +1 -1
  80. package/dist/scripts/{BCdnm1Nn.chunk.js → DKnZ8BaN.chunk.js} +2 -2
  81. package/dist/scripts/{BCdnm1Nn.chunk.js.map → DKnZ8BaN.chunk.js.map} +1 -1
  82. package/dist/scripts/{awemA_vU2.chunk.js → DO8_mR5i2.chunk.js} +2 -2
  83. package/dist/scripts/{awemA_vU2.chunk.js.map → DO8_mR5i2.chunk.js.map} +1 -1
  84. package/dist/scripts/{DlQrdOls.chunk.js → DR80oZtZ.chunk.js} +2 -2
  85. package/dist/scripts/{DlQrdOls.chunk.js.map → DR80oZtZ.chunk.js.map} +1 -1
  86. package/dist/scripts/{DMq5Gp-U2.chunk.js → DU1SE31v2.chunk.js} +2 -2
  87. package/dist/scripts/{DMq5Gp-U2.chunk.js.map → DU1SE31v2.chunk.js.map} +1 -1
  88. package/dist/scripts/{XnBhLH-02.chunk.js → Dj4AeYQQ2.chunk.js} +2 -2
  89. package/dist/scripts/{XnBhLH-02.chunk.js.map → Dj4AeYQQ2.chunk.js.map} +1 -1
  90. package/dist/scripts/{CmrPRojb.chunk.js → DnSy_Myx.chunk.js} +2 -2
  91. package/dist/scripts/{CmrPRojb.chunk.js.map → DnSy_Myx.chunk.js.map} +1 -1
  92. package/dist/scripts/{D0vsmyva.chunk.js → Dr1flAez.chunk.js} +2 -2
  93. package/dist/scripts/{D0vsmyva.chunk.js.map → Dr1flAez.chunk.js.map} +1 -1
  94. package/dist/scripts/{BXT8nHry2.chunk.js → DwzBzBlI2.chunk.js} +2 -2
  95. package/dist/scripts/{BXT8nHry2.chunk.js.map → DwzBzBlI2.chunk.js.map} +1 -1
  96. package/dist/scripts/{CvqqZmNo2.chunk.js → DyT1OGvP2.chunk.js} +2 -2
  97. package/dist/scripts/{CvqqZmNo2.chunk.js.map → DyT1OGvP2.chunk.js.map} +1 -1
  98. package/dist/scripts/{E9tNds1l.chunk.js → Llxar-VU.chunk.js} +2 -2
  99. package/dist/scripts/{E9tNds1l.chunk.js.map → Llxar-VU.chunk.js.map} +1 -1
  100. package/dist/scripts/{app-B1XBsz23.js → app-BIigh9wv.js} +4 -4
  101. package/dist/scripts/{app-B1XBsz23.js.map → app-BIigh9wv.js.map} +1 -1
  102. package/dist/scripts/{BMl02f_62.chunk.js → bycmewy72.chunk.js} +2 -2
  103. package/dist/scripts/{BMl02f_62.chunk.js.map → bycmewy72.chunk.js.map} +1 -1
  104. package/dist/scripts/{DmfbtOlu.chunk.js → jWpq99N3.chunk.js} +2 -2
  105. package/dist/scripts/{DmfbtOlu.chunk.js.map → jWpq99N3.chunk.js.map} +1 -1
  106. package/dist/scripts/{BDliRFoa.chunk.js → oTYyWWB-.chunk.js} +2 -2
  107. package/dist/scripts/{BDliRFoa.chunk.js.map → oTYyWWB-.chunk.js.map} +1 -1
  108. package/dist/scripts/{lokG7Sha2.chunk.js → qcrBN1zR2.chunk.js} +2 -2
  109. package/dist/scripts/{lokG7Sha2.chunk.js.map → qcrBN1zR2.chunk.js.map} +1 -1
  110. package/dist/scripts/{UAcFqQzZ.chunk.js → smdLElLq.chunk.js} +2 -2
  111. package/dist/scripts/{UAcFqQzZ.chunk.js.map → smdLElLq.chunk.js.map} +1 -1
  112. package/dist/scripts/{D8_5yfHY2.chunk.js → tYi-sUb22.chunk.js} +2 -2
  113. package/dist/scripts/{D8_5yfHY2.chunk.js.map → tYi-sUb22.chunk.js.map} +1 -1
  114. package/package.json +1 -1
  115. package/dist/scripts/D5Jnyjf8.chunk.js +0 -1
@@ -1,2 +1,2 @@
1
- import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{n,t as r}from"./BJvPfCvt.chunk.js";import{t as i}from"./ImQRQGZr.chunk.js";import{C as a,M as o,dt as s,l as c,lt as l,m as u,s as d,ut as f}from"./Dun43GrB.chunk.js";import{t as p}from"./CFXUbsBS.chunk.js";import{l as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{n as ee}from"./C9ET3pjZ.chunk.js";import{t as g}from"./BVWg3YHX.chunk.js";import{i as te}from"./CEsevkum.chunk.js";import{t as _}from"./B20k2DA32.chunk.js";import{t as v}from"./Ca1QPe-q2.chunk.js";import{t as y}from"./Cz6swPXe2.chunk.js";import{n as b,t as x}from"./D7d5XFW82.chunk.js";import{n as ne,t as re}from"./DjIdG9LL2.chunk.js";import{n as S}from"./CL1ST5J62.chunk.js";import{r as C,t as w}from"./D2om474U2.chunk.js";import{t as T}from"./iTHYgnO8.chunk.js";import{$ as ie,F as E,I as ae,M as oe,N as D,q as se}from"./app-B1XBsz23.js";import{t as ce}from"./BRiYVLuz.chunk.js";import{t as O}from"./DlFudnBx.chunk.js";import{t as k}from"./DXfGdqxs.chunk.js";import{r as A}from"./B-6uVsUw2.chunk.js";import{t as j}from"./awemA_vU2.chunk.js";import{a as le,i as M,n as ue,o as de,r as fe,s as pe,t as N}from"./Dd8r1SE32.chunk.js";import{t as P}from"./DLp7yHzT2.chunk.js";import{a as me,i as he,n as F,r as I,t as L}from"./DAvXFgC62.chunk.js";import{t as R}from"./BEYV13jP2.chunk.js";import{t as ge}from"./BTqtjOL02.chunk.js";import{t as _e}from"./DxsW8K0n2.chunk.js";import{n as z,r as ve}from"./NV4_mMU8.chunk.js";import{t as ye}from"./BlBCp_pE.chunk.js";var B=e(f()),V={wrapper:`_wrapper_gw22e_1`,weekend:`_weekend_gw22e_4`},H=l();function be(e){return p.getWeekday(e)===0||p.getWeekday(e)===6}function xe(e){let{date:t,notCurrentMonth:n}=e,[r,i]=B.useState(0),a=`position-relative border ${e.theme.border} ${V.wrapper}`;be(t)&&(a+=` ${V.weekend}`),n&&(a+=`opacity-50`);let o=N.getEventsForDay(t,e.events||[],e.crossMonthEvents||[],e.viewingMonth),s={...e,eventsOnDay:o,sliderStep:r,setSliderStep:i};return(0,H.jsx)(`td`,{className:a,children:o?.length>0?(0,H.jsx)(E,{hoverableComponent:j,componentProps:s,hoverScale:1.35}):(0,H.jsx)(j,{...s,isHovering:!1})})}var U=`specialEvent.eventsEmptyState`,W=i.encloseNamespace(U);function Se(e){return(0,H.jsx)(x.Provider,{value:U,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl,altText:W(`info`)}),(0,H.jsx)(T.Heading,{children:e.heading||(0,H.jsx)(b,{phrase:`heading`})}),e.appLink&&(0,H.jsx)(T.Info,{children:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(b,{namespace:U,phrase:`info`}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:W(`link`)})})]})})]})})}var G={date:`_date_ez4o2_1`,first:`_first_ez4o2_4`};function Ce(e){let t={};e.events.forEach(e=>{let n=e.startDate;t[n]?t[n].push(e):t[n]=[e]});let n=Object.keys(t);return n.sort((e,t)=>p.isBefore(e,t)?-1:0),(0,H.jsx)(`div`,{className:`py-1`,children:n.map((n,r)=>{let i=``,a=``;return(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`h4 mt-4 ${G.date} ${r===0?G.first:``}`,children:N.getOrdinalDate(n)}),t[n].map(t=>(i=a,a=e.getStartTime?.(t.content),(0,H.jsx)(me,{getAppLink:(t,n)=>e.appLink(t,s.slugify(n)),event:t,presentationId:e.presentationId,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:()=>e.getActionLabel(t.content),getStartTime:e.getStartTime&&i!==a?e.getStartTime:null,isPastEvent:e.isPastEvent},t.content.id)))]},n)})})}var K={header:`_header_dbicu_1`,thead:`_thead_dbicu_4`};q.defaultProps={theme:{border:`border-light-blue`,background:`bg-light-blue`}};function q(e){let{appLinks:t,imageUrls:n}=e,r=D(),i=N.getEventsInMonth(e.events||[],e.viewingMonth),a=B.useMemo(()=>{let t=new Set(e.weekDays.reduce((e,t)=>e.concat(t),[]).map(e=>p.format(e,`YYYY-MM-DD`)));return(e.events||[]).filter(n=>{if(!n.startDate)return!1;let r=N.isEventFromPreviousMonth(n,e.viewingMonth),i=t.has(p.format(n.startDate,`YYYY-MM-DD`));return r&&!i})},[e.weekDays,e.events]),[o,s]=B.useState(!1),[c,l]=B.useState(null);return e.eventsLoaded&&!i?.length?(0,H.jsx)(Se,{imageUrl:n.emptyState,appLink:t.emptyStateRedirect?.(),heading:e.emptyStateHeading}):e.viewMode===`list`||r.xs||r.sm||r.md?e.eventsLoaded?(0,H.jsx)(Ce,{events:i,presentationId:e.presentationId,appLink:e.appLinks.event,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:e.getActionLabel,getStartTime:e.getStartTime,isPastEvent:e.isPastEvent}):(0,H.jsx)(`div`,{className:`d-flex justify-content-center align-items-center mb-4`,children:(0,H.jsx)(_,{as:`div`,animation:`border`,role:`status`})}):(0,H.jsxs)(`table`,{className:`user-select-none w-100 mt-3 overflow-hidden rounded-top-lg`,children:[(0,H.jsx)(`thead`,{className:`border ${e.theme.border} ${K.thead}`,children:(0,H.jsx)(`tr`,{className:`fw-semibold ${e.theme.background} ${K.header}`,children:e.weekDaysHeader.map(e=>(0,H.jsx)(`th`,{className:`px-2 h4`,scope:`col`,children:e},e))})}),(0,H.jsx)(`tbody`,{children:e.weekDays.map(t=>(0,H.jsx)(`tr`,{children:t.map(t=>(0,H.jsx)(xe,{date:t,notCurrentMonth:!!t.notCurrentMonth,events:e.events,crossMonthEvents:a,viewingMonth:e.viewingMonth,monthQuery:e.monthQuery,hasInitialized:o,setHasInitialized:s,presentationId:e.presentationId,hoveredEvent:c,theme:e.theme,setHoveredEvent:l,getEventsListAppLink:()=>e.appLinks.eventList(e.monthQuery,t,e.presentationId),getTopicAppLink:(t,n)=>e.appLinks.event(t,n),getIconUrl:e.getIconUrl,getBackgroundColor:e.getBackgroundColor,getCoverUrl:e.getCoverUrl,getHardCodedEvent:e.getHardCodedEvent,fadePastEvents:e.fadePastEvents,timezone:e.timezone},t.toString()))},t[0].toString()))})]})}var J={chevron:`_chevron_d411m_1`,left:`_left_d411m_4`,right:`_right_d411m_10`,viewModeContainer:`_viewModeContainer_d411m_16`},we=`specialEventCalendar.calendarNav`;function Te(e){return(0,H.jsxs)(`div`,{className:`${J.viewModeContainer} d-none d-lg-block`,children:[(0,H.jsx)(y,{svg:R,className:`${e.viewMode===`calendar`?`bg-dark text-white`:``} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`,onClick:()=>e.setViewMode(`calendar`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.Calendar,location:u.CalendarNav}}),(0,H.jsx)(y,{svg:ge,className:`${e.viewMode===`list`?`bg-dark text-white`:``} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`,onClick:()=>e.setViewMode(`list`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.List,location:u.CalendarNav}})]})}function Y(e){let i=e.action===`previous`?k:A,a=e.action===`previous`?J.left:J.right;function o(){t.trigger(e.appLink),e.onClick()}return(0,H.jsx)(v,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:`${J.chevron} ${a} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`,onClick:o,children:(0,H.jsx)(r,{svg:i,size:n.Medium,className:`svg-container d-inline-block ${J.svg}`})})}var X=new Date;function Ee(e){let{appLinks:t}=e,n=D();function r(n){let r=p.format(n,`MMMM`).toLocaleLowerCase(),i=t.month(r),a={};if(n){let e=new Date().getFullYear(),t=n.getFullYear();e!==t&&(a.year=t)}return e.queryParams?.classification&&(a.classification=e.queryParams.classification),e.queryParams?.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i.params=a,i}function o(){let t=p.add(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function s(){let t=p.subtract(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function l(){p.format(X,`M YY`)!==p.format(e.monthDate,`M YY`)&&e.setViewingMonthDate()}let{showPrev:d,showNext:f}=fe(e.monthDate),m={actionType:a.Click,entity:c.SpecialEvent,location:u.CalendarNav};function h(e){return p.format(e,`YYYY-MM-DD`)}return(0,H.jsxs)(`div`,{className:`d-flex flex-wrap gap-3 justify-content-end align-items-center`,children:[(0,H.jsx)(`h1`,{className:`mb-0 h2 me-auto`,children:p.format(e.monthDate,n.xs?`MMM YYYY`:`MMMM YYYY`)}),e.children,e.setViewMode&&(0,H.jsx)(Te,{viewMode:e.viewMode,setViewMode:e.setViewMode}),(0,H.jsxs)(`div`,{className:`d-flex gap-3`,children:[d&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.subtract(e.monthDate,1,`month`),`month`)),action:`previous`,onClick:s,analyticsOptions:m,analyticsData:{action:`previous`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))}}),(0,H.jsx)(v,{appLink:r(),className:`${J.todayWrapper} btn btn-outline-dark fw-semibold`,onClick:l,analyticsOptions:m,analyticsData:{action:`today`,date:h(p.startOf(X,`month`))},children:i.getPhrase(we,`today`)}),f&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.add(e.monthDate,1,`month`),`month`)),analyticsOptions:m,analyticsData:{action:`next`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))},action:`next`,onClick:o})]})]})}var Z=`specialEvent.eventsErrorState`,De=i.encloseNamespace(Z);function Oe(e){return(0,H.jsx)(x.Provider,{value:Z,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl}),(0,H.jsx)(T.Heading,{children:(0,H.jsx)(b,{phrase:`heading`})}),(0,H.jsxs)(T.Info,{children:[(0,H.jsx)(b,{namespace:Z,phrase:`info`}),(0,H.jsx)(`br`,{}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:De(`link`)})})]})]})})}var ke=new Date;function Ae(e=ke,n,r=!0){let i=de(r),a=B.useRef({}),o=p.format(e,`YYYY-MM`),s=B.useMemo(()=>{let t=a.current[o];if(!t){let{weeksTable:t,datePositionMap:n}=ue(e,r);return a.current[o]={weeksTable:t,datePositionMap:n},t}return t.weeksTable},[o,r]);function c(r){if(!r){t.trigger(n.calendar());return}if(o!==p.format(r,`YYYY-MM`)){let i=p.format(r,`MMMM`).toLocaleLowerCase(),a=new Date().getFullYear(),o=e.getFullYear(),s=n.month(i);a!==o&&(s.params={year:o}),t.trigger(s)}}return{weekDaysHeader:i,weekDays:s,monthDate:e,setMonthDate:c,startDate:h.first(h.first(s)),endDate:h.last(h.last(s))}}function je(e,t){let[n,r]=M(e),[i,a]=M(p.add(e,1,`month`)),[o,s]=M(p.subtract(e,1,`month`)),c={};t.yearGroup&&(c.audienceId=t.yearGroup),t.classification&&(c.topicId=t.classification,c.includeChildrenTopics=!0);let l=m(n&&r&&P.calendarLivestreams({from:p.format(n,`YYYY-MM-DD`),to:p.format(r,`YYYY-MM-DD`),...c})),u=m(i&&a&&P.calendarLivestreams({from:p.format(i,`YYYY-MM-DD`),to:p.format(a,`YYYY-MM-DD`),...c})),d=m(o&&s&&P.calendarLivestreams({from:p.format(o,`YYYY-MM-DD`),to:p.format(s,`YYYY-MM-DD`),...c}));return{events:h.uniq([...d.data||[],...l.data||[],...u.data||[]],e=>e.id),loaded:l.hasCompleted}}var Q=i.encloseNamespace(`livestreamCalendar.calendarView`);function Me(e){return e?o.pick(e,[`year`,`classification`,`yearGroup`]):{}}$.defaultProps={queryParams:{}};function $(e){let[{viewMode:t},n]=S(`calendar:mode`,{viewMode:`calendar`},{storage:te.LocalStorage}),{hasPermissions:r}=oe(),i=r(ee.StudentExperience),a=m(se.streamablePresentation()),s=m(a.data&&ce.presentationAudiences(g.StreamableLearning,a.data.id)),c=m(a.data&&O.topicsFromAllAvailablePresentations([a.data.id])),l=le(e.month),u=pe(e.month),{monthDate:d,setMonthDate:f,weekDays:h,weekDaysHeader:_,startDate:v,endDate:y}=Ae(u,L()),{events:b,loaded:x}=je(u,e.queryParams),T=p.format(d,`MMMM YYYY`);if(re(ne.getDefaultMetadata({title:T,phraseContext:{phraseHandler:Q,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:ye.getCanonicalLink({allowedParams:[`year`]}),allowIndexing:!0,product:ae.PRODUCT_NAME})),e.month!==null&&!l)return(0,H.jsx)(Oe,{imageUrl:F().errorState,appLink:z().calendar});let E=[{id:`classification`,name:Q(`subjectFilter`),options:c.data?.topics.map(e=>({name:e.name,id:e.topicIds.join(`:`)})),type:`checkbox`,compatibleIndices:[]},{id:`yearGroup`,name:Q(`gradeFilter`),type:`checkbox`,options:s.data?.map(e=>({name:e.name,id:e.masterId})),compatibleIndices:[]}];function D(){let t=p.format(d,`MMMM`).toLocaleLowerCase(),n=new Date().getFullYear(),r=d.getFullYear(),i=L().month(t),a={};return n!==r&&(a.year=r),e.queryParams.classification&&(a.classification=e.queryParams.classification),e.queryParams.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i}function k(e){return i||p.isBefore(e.endDateTime,new Date)?`pastActionLabel`:`actionLabel`}function A(){if(!N.getEventsInMonth(b||[],u).length&&(e.queryParams.yearGroup||e.queryParams.classification))return Q(`emptyStateText`)}function j(e){return w.createUrl(e.company.logo?.url,{size:C.Small})}function M(e){return w.createUrl(e.company.banner?.url,{size:C.Large})}return(0,H.jsxs)(`div`,{className:`bg-white px-4`,children:[(0,H.jsx)(ve,{appLinks:z(),active:`calendar`}),(0,H.jsx)(Ee,{monthDate:d,setViewingMonthDate:f,appLinks:L(),queryParams:e.queryParams,viewMode:t,setViewMode:e=>n({viewMode:e}),children:(0,H.jsx)(`div`,{className:`mx-n1 order-1 order-sm-0`,children:(0,H.jsx)(_e,{queryParams:o.omit(e.queryParams,[`year`]),mainFilters:E,appLink:D(),isFetchingOptions:!c.data||!a.data||!s.data,alignResetButtonLeft:!0,hideDivider:!0,hideHeading:!0,hideCaret:!1})})}),(0,H.jsxs)(`div`,{className:`position-relative mt-3 ${t===`list`?``:`mt-lg-0`}`,children:[(0,H.jsx)(`div`,{className:`d-block ${t===`list`?``:`d-lg-none`} position-absolute top-0 end-0 mt-2`,children:(0,H.jsx)(he,{})}),(0,H.jsx)(q,{weekDays:h,weekDaysHeader:_,events:b,monthQuery:{from:v?.toString(),to:y?.toString()},viewingMonth:u,eventsLoaded:x,presentationId:a.data?.id,appLinks:L(),imageUrls:F(),viewMode:t,getActionLabel:e=>Q(k(e)),getBackgroundColor:e=>e.company.metadata?.colour,getBannerUrl:M,getIconUrl:j,getStartTime:I.getStartTime,theme:{background:`bg-light-green`,border:`border-light-green`},emptyStateHeading:A(),fadePastEvents:!0,timezone:ie.ET,isPastEvent:I.isPastEvent})]})]})}export{$ as CalendarView,Me as sanitizeCalendarViewParams};
2
- //# sourceMappingURL=JtFbyaXc.chunk.js.map
1
+ import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{n,t as r}from"./BJvPfCvt.chunk.js";import{t as i}from"./ImQRQGZr.chunk.js";import{C as a,M as o,dt as s,l as c,lt as l,m as u,s as d,ut as f}from"./Dun43GrB.chunk.js";import{t as p}from"./CFXUbsBS.chunk.js";import{l as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{n as ee}from"./C9ET3pjZ.chunk.js";import{t as g}from"./BVWg3YHX.chunk.js";import{i as te}from"./CEsevkum.chunk.js";import{t as _}from"./B20k2DA32.chunk.js";import{t as v}from"./Ca1QPe-q2.chunk.js";import{t as y}from"./Cz6swPXe2.chunk.js";import{n as b,t as x}from"./D7d5XFW82.chunk.js";import{n as ne,t as re}from"./DjIdG9LL2.chunk.js";import{n as S}from"./CL1ST5J62.chunk.js";import{r as C,t as w}from"./D2om474U2.chunk.js";import{t as T}from"./iTHYgnO8.chunk.js";import{$ as ie,F as E,I as ae,M as oe,N as D,q as se}from"./app-BIigh9wv.js";import{t as ce}from"./BRiYVLuz.chunk.js";import{t as O}from"./DlFudnBx.chunk.js";import{t as k}from"./DXfGdqxs.chunk.js";import{r as A}from"./B-6uVsUw2.chunk.js";import{t as j}from"./DO8_mR5i2.chunk.js";import{a as le,i as M,n as ue,o as de,r as fe,s as pe,t as N}from"./BsAo7Lri2.chunk.js";import{t as P}from"./C5i1HsPp2.chunk.js";import{a as me,i as he,n as F,r as I,t as L}from"./CKdklY2o2.chunk.js";import{t as R}from"./BEYV13jP2.chunk.js";import{t as ge}from"./BTqtjOL02.chunk.js";import{t as _e}from"./BaMNOAYj2.chunk.js";import{n as z,r as ve}from"./Ces-KTwe.chunk.js";import{t as ye}from"./BlBCp_pE.chunk.js";var B=e(f()),V={wrapper:`_wrapper_gw22e_1`,weekend:`_weekend_gw22e_4`},H=l();function be(e){return p.getWeekday(e)===0||p.getWeekday(e)===6}function xe(e){let{date:t,notCurrentMonth:n}=e,[r,i]=B.useState(0),a=`position-relative border ${e.theme.border} ${V.wrapper}`;be(t)&&(a+=` ${V.weekend}`),n&&(a+=`opacity-50`);let o=N.getEventsForDay(t,e.events||[],e.crossMonthEvents||[],e.viewingMonth),s={...e,eventsOnDay:o,sliderStep:r,setSliderStep:i};return(0,H.jsx)(`td`,{className:a,children:o?.length>0?(0,H.jsx)(E,{hoverableComponent:j,componentProps:s,hoverScale:1.35}):(0,H.jsx)(j,{...s,isHovering:!1})})}var U=`specialEvent.eventsEmptyState`,W=i.encloseNamespace(U);function Se(e){return(0,H.jsx)(x.Provider,{value:U,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl,altText:W(`info`)}),(0,H.jsx)(T.Heading,{children:e.heading||(0,H.jsx)(b,{phrase:`heading`})}),e.appLink&&(0,H.jsx)(T.Info,{children:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(b,{namespace:U,phrase:`info`}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:W(`link`)})})]})})]})})}var G={date:`_date_ez4o2_1`,first:`_first_ez4o2_4`};function Ce(e){let t={};e.events.forEach(e=>{let n=e.startDate;t[n]?t[n].push(e):t[n]=[e]});let n=Object.keys(t);return n.sort((e,t)=>p.isBefore(e,t)?-1:0),(0,H.jsx)(`div`,{className:`py-1`,children:n.map((n,r)=>{let i=``,a=``;return(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`h4 mt-4 ${G.date} ${r===0?G.first:``}`,children:N.getOrdinalDate(n)}),t[n].map(t=>(i=a,a=e.getStartTime?.(t.content),(0,H.jsx)(me,{getAppLink:(t,n)=>e.appLink(t,s.slugify(n)),event:t,presentationId:e.presentationId,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:()=>e.getActionLabel(t.content),getStartTime:e.getStartTime&&i!==a?e.getStartTime:null,isPastEvent:e.isPastEvent},t.content.id)))]},n)})})}var K={header:`_header_dbicu_1`,thead:`_thead_dbicu_4`};q.defaultProps={theme:{border:`border-light-blue`,background:`bg-light-blue`}};function q(e){let{appLinks:t,imageUrls:n}=e,r=D(),i=N.getEventsInMonth(e.events||[],e.viewingMonth),a=B.useMemo(()=>{let t=new Set(e.weekDays.reduce((e,t)=>e.concat(t),[]).map(e=>p.format(e,`YYYY-MM-DD`)));return(e.events||[]).filter(n=>{if(!n.startDate)return!1;let r=N.isEventFromPreviousMonth(n,e.viewingMonth),i=t.has(p.format(n.startDate,`YYYY-MM-DD`));return r&&!i})},[e.weekDays,e.events]),[o,s]=B.useState(!1),[c,l]=B.useState(null);return e.eventsLoaded&&!i?.length?(0,H.jsx)(Se,{imageUrl:n.emptyState,appLink:t.emptyStateRedirect?.(),heading:e.emptyStateHeading}):e.viewMode===`list`||r.xs||r.sm||r.md?e.eventsLoaded?(0,H.jsx)(Ce,{events:i,presentationId:e.presentationId,appLink:e.appLinks.event,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:e.getActionLabel,getStartTime:e.getStartTime,isPastEvent:e.isPastEvent}):(0,H.jsx)(`div`,{className:`d-flex justify-content-center align-items-center mb-4`,children:(0,H.jsx)(_,{as:`div`,animation:`border`,role:`status`})}):(0,H.jsxs)(`table`,{className:`user-select-none w-100 mt-3 overflow-hidden rounded-top-lg`,children:[(0,H.jsx)(`thead`,{className:`border ${e.theme.border} ${K.thead}`,children:(0,H.jsx)(`tr`,{className:`fw-semibold ${e.theme.background} ${K.header}`,children:e.weekDaysHeader.map(e=>(0,H.jsx)(`th`,{className:`px-2 h4`,scope:`col`,children:e},e))})}),(0,H.jsx)(`tbody`,{children:e.weekDays.map(t=>(0,H.jsx)(`tr`,{children:t.map(t=>(0,H.jsx)(xe,{date:t,notCurrentMonth:!!t.notCurrentMonth,events:e.events,crossMonthEvents:a,viewingMonth:e.viewingMonth,monthQuery:e.monthQuery,hasInitialized:o,setHasInitialized:s,presentationId:e.presentationId,hoveredEvent:c,theme:e.theme,setHoveredEvent:l,getEventsListAppLink:()=>e.appLinks.eventList(e.monthQuery,t,e.presentationId),getTopicAppLink:(t,n)=>e.appLinks.event(t,n),getIconUrl:e.getIconUrl,getBackgroundColor:e.getBackgroundColor,getCoverUrl:e.getCoverUrl,getHardCodedEvent:e.getHardCodedEvent,fadePastEvents:e.fadePastEvents,timezone:e.timezone},t.toString()))},t[0].toString()))})]})}var J={chevron:`_chevron_d411m_1`,left:`_left_d411m_4`,right:`_right_d411m_10`,viewModeContainer:`_viewModeContainer_d411m_16`},we=`specialEventCalendar.calendarNav`;function Te(e){return(0,H.jsxs)(`div`,{className:`${J.viewModeContainer} d-none d-lg-block`,children:[(0,H.jsx)(y,{svg:R,className:`${e.viewMode===`calendar`?`bg-dark text-white`:``} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`,onClick:()=>e.setViewMode(`calendar`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.Calendar,location:u.CalendarNav}}),(0,H.jsx)(y,{svg:ge,className:`${e.viewMode===`list`?`bg-dark text-white`:``} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`,onClick:()=>e.setViewMode(`list`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.List,location:u.CalendarNav}})]})}function Y(e){let i=e.action===`previous`?k:A,a=e.action===`previous`?J.left:J.right;function o(){t.trigger(e.appLink),e.onClick()}return(0,H.jsx)(v,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:`${J.chevron} ${a} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`,onClick:o,children:(0,H.jsx)(r,{svg:i,size:n.Medium,className:`svg-container d-inline-block ${J.svg}`})})}var X=new Date;function Ee(e){let{appLinks:t}=e,n=D();function r(n){let r=p.format(n,`MMMM`).toLocaleLowerCase(),i=t.month(r),a={};if(n){let e=new Date().getFullYear(),t=n.getFullYear();e!==t&&(a.year=t)}return e.queryParams?.classification&&(a.classification=e.queryParams.classification),e.queryParams?.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i.params=a,i}function o(){let t=p.add(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function s(){let t=p.subtract(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function l(){p.format(X,`M YY`)!==p.format(e.monthDate,`M YY`)&&e.setViewingMonthDate()}let{showPrev:d,showNext:f}=fe(e.monthDate),m={actionType:a.Click,entity:c.SpecialEvent,location:u.CalendarNav};function h(e){return p.format(e,`YYYY-MM-DD`)}return(0,H.jsxs)(`div`,{className:`d-flex flex-wrap gap-3 justify-content-end align-items-center`,children:[(0,H.jsx)(`h1`,{className:`mb-0 h2 me-auto`,children:p.format(e.monthDate,n.xs?`MMM YYYY`:`MMMM YYYY`)}),e.children,e.setViewMode&&(0,H.jsx)(Te,{viewMode:e.viewMode,setViewMode:e.setViewMode}),(0,H.jsxs)(`div`,{className:`d-flex gap-3`,children:[d&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.subtract(e.monthDate,1,`month`),`month`)),action:`previous`,onClick:s,analyticsOptions:m,analyticsData:{action:`previous`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))}}),(0,H.jsx)(v,{appLink:r(),className:`${J.todayWrapper} btn btn-outline-dark fw-semibold`,onClick:l,analyticsOptions:m,analyticsData:{action:`today`,date:h(p.startOf(X,`month`))},children:i.getPhrase(we,`today`)}),f&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.add(e.monthDate,1,`month`),`month`)),analyticsOptions:m,analyticsData:{action:`next`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))},action:`next`,onClick:o})]})]})}var Z=`specialEvent.eventsErrorState`,De=i.encloseNamespace(Z);function Oe(e){return(0,H.jsx)(x.Provider,{value:Z,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl}),(0,H.jsx)(T.Heading,{children:(0,H.jsx)(b,{phrase:`heading`})}),(0,H.jsxs)(T.Info,{children:[(0,H.jsx)(b,{namespace:Z,phrase:`info`}),(0,H.jsx)(`br`,{}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:De(`link`)})})]})]})})}var ke=new Date;function Ae(e=ke,n,r=!0){let i=de(r),a=B.useRef({}),o=p.format(e,`YYYY-MM`),s=B.useMemo(()=>{let t=a.current[o];if(!t){let{weeksTable:t,datePositionMap:n}=ue(e,r);return a.current[o]={weeksTable:t,datePositionMap:n},t}return t.weeksTable},[o,r]);function c(r){if(!r){t.trigger(n.calendar());return}if(o!==p.format(r,`YYYY-MM`)){let i=p.format(r,`MMMM`).toLocaleLowerCase(),a=new Date().getFullYear(),o=e.getFullYear(),s=n.month(i);a!==o&&(s.params={year:o}),t.trigger(s)}}return{weekDaysHeader:i,weekDays:s,monthDate:e,setMonthDate:c,startDate:h.first(h.first(s)),endDate:h.last(h.last(s))}}function je(e,t){let[n,r]=M(e),[i,a]=M(p.add(e,1,`month`)),[o,s]=M(p.subtract(e,1,`month`)),c={};t.yearGroup&&(c.audienceId=t.yearGroup),t.classification&&(c.topicId=t.classification,c.includeChildrenTopics=!0);let l=m(n&&r&&P.calendarLivestreams({from:p.format(n,`YYYY-MM-DD`),to:p.format(r,`YYYY-MM-DD`),...c})),u=m(i&&a&&P.calendarLivestreams({from:p.format(i,`YYYY-MM-DD`),to:p.format(a,`YYYY-MM-DD`),...c})),d=m(o&&s&&P.calendarLivestreams({from:p.format(o,`YYYY-MM-DD`),to:p.format(s,`YYYY-MM-DD`),...c}));return{events:h.uniq([...d.data||[],...l.data||[],...u.data||[]],e=>e.id),loaded:l.hasCompleted}}var Q=i.encloseNamespace(`livestreamCalendar.calendarView`);function Me(e){return e?o.pick(e,[`year`,`classification`,`yearGroup`]):{}}$.defaultProps={queryParams:{}};function $(e){let[{viewMode:t},n]=S(`calendar:mode`,{viewMode:`calendar`},{storage:te.LocalStorage}),{hasPermissions:r}=oe(),i=r(ee.StudentExperience),a=m(se.streamablePresentation()),s=m(a.data&&ce.presentationAudiences(g.StreamableLearning,a.data.id)),c=m(a.data&&O.topicsFromAllAvailablePresentations([a.data.id])),l=le(e.month),u=pe(e.month),{monthDate:d,setMonthDate:f,weekDays:h,weekDaysHeader:_,startDate:v,endDate:y}=Ae(u,L()),{events:b,loaded:x}=je(u,e.queryParams),T=p.format(d,`MMMM YYYY`);if(re(ne.getDefaultMetadata({title:T,phraseContext:{phraseHandler:Q,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:ye.getCanonicalLink({allowedParams:[`year`]}),allowIndexing:!0,product:ae.PRODUCT_NAME})),e.month!==null&&!l)return(0,H.jsx)(Oe,{imageUrl:F().errorState,appLink:z().calendar});let E=[{id:`classification`,name:Q(`subjectFilter`),options:c.data?.topics.map(e=>({name:e.name,id:e.topicIds.join(`:`)})),type:`checkbox`,compatibleIndices:[]},{id:`yearGroup`,name:Q(`gradeFilter`),type:`checkbox`,options:s.data?.map(e=>({name:e.name,id:e.masterId})),compatibleIndices:[]}];function D(){let t=p.format(d,`MMMM`).toLocaleLowerCase(),n=new Date().getFullYear(),r=d.getFullYear(),i=L().month(t),a={};return n!==r&&(a.year=r),e.queryParams.classification&&(a.classification=e.queryParams.classification),e.queryParams.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i}function k(e){return i||p.isBefore(e.endDateTime,new Date)?`pastActionLabel`:`actionLabel`}function A(){if(!N.getEventsInMonth(b||[],u).length&&(e.queryParams.yearGroup||e.queryParams.classification))return Q(`emptyStateText`)}function j(e){return w.createUrl(e.company.logo?.url,{size:C.Small})}function M(e){return w.createUrl(e.company.banner?.url,{size:C.Large})}return(0,H.jsxs)(`div`,{className:`bg-white px-4`,children:[(0,H.jsx)(ve,{appLinks:z(),active:`calendar`}),(0,H.jsx)(Ee,{monthDate:d,setViewingMonthDate:f,appLinks:L(),queryParams:e.queryParams,viewMode:t,setViewMode:e=>n({viewMode:e}),children:(0,H.jsx)(`div`,{className:`mx-n1 order-1 order-sm-0`,children:(0,H.jsx)(_e,{queryParams:o.omit(e.queryParams,[`year`]),mainFilters:E,appLink:D(),isFetchingOptions:!c.data||!a.data||!s.data,alignResetButtonLeft:!0,hideDivider:!0,hideHeading:!0,hideCaret:!1})})}),(0,H.jsxs)(`div`,{className:`position-relative mt-3 ${t===`list`?``:`mt-lg-0`}`,children:[(0,H.jsx)(`div`,{className:`d-block ${t===`list`?``:`d-lg-none`} position-absolute top-0 end-0 mt-2`,children:(0,H.jsx)(he,{})}),(0,H.jsx)(q,{weekDays:h,weekDaysHeader:_,events:b,monthQuery:{from:v?.toString(),to:y?.toString()},viewingMonth:u,eventsLoaded:x,presentationId:a.data?.id,appLinks:L(),imageUrls:F(),viewMode:t,getActionLabel:e=>Q(k(e)),getBackgroundColor:e=>e.company.metadata?.colour,getBannerUrl:M,getIconUrl:j,getStartTime:I.getStartTime,theme:{background:`bg-light-green`,border:`border-light-green`},emptyStateHeading:A(),fadePastEvents:!0,timezone:ie.ET,isPastEvent:I.isPastEvent})]})]})}export{$ as CalendarView,Me as sanitizeCalendarViewParams};
2
+ //# sourceMappingURL=Br0Uc4GG.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JtFbyaXc.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/components/calendar-cell/calendar-cell.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-cell/CalendarCell.tsx","../../../../libs/shared/src/apps/calendar/components/empty-state/SpecialEventEmptyState.tsx","../../../../libs/shared/src/apps/calendar/components/special-event-list/special-event-list.module.scss","../../../../libs/shared/src/apps/calendar/components/special-event-list/SpecialEventList.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-body/calendar-body.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-body/CalendarBody.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-nav/calendar-nav.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-nav/CalendarNav.tsx","../../../../libs/shared/src/apps/calendar/components/error-state/SpecialEventErrorState.tsx","../../../../libs/shared/src/apps/calendar/hooks/useCalendarWeeksTable.ts","../../src/apps/calendar/hooks/useCalendarEventsData.ts","../../src/apps/calendar/views/calendar-view/CalendarView.tsx"],"sourcesContent":[":local {\n .wrapper {\n border-width: 0.125rem !important;\n }\n\n .weekend {\n background-color: $gray-100;\n }\n}","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarDay } from 'libs/shared/apps/calendar/components/calendar-day/CalendarDay';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\n\nimport styles from './calendar-cell.module.scss';\n\nfunction getIsWeekend(date: Date): boolean {\n return DateHelper.getWeekday(date) === 0 || DateHelper.getWeekday(date) === 6;\n}\n\nexport function CalendarCell(props: CalendarCellProps): JSX.Element {\n const { date, notCurrentMonth } = props;\n const [ sliderStep, setSliderStep ] = React.useState<number>(0);\n\n let wrapperClassname = `position-relative border ${props.theme.border} ${styles.wrapper}`;\n if (getIsWeekend(date)) wrapperClassname += ` ${styles.weekend}`;\n if (notCurrentMonth) wrapperClassname += `opacity-50`;\n\n const eventsOnDay = SpecialEventHelper.getEventsForDay(\n date,\n props.events || [],\n props.crossMonthEvents || [],\n props.viewingMonth\n );\n\n const updatedProps = { ...props, eventsOnDay, sliderStep, setSliderStep };\n return (\n <td className={wrapperClassname}>\n {eventsOnDay?.length > 0 ? (\n <HoverToPortalContainer<CalendarCellProps>\n hoverableComponent={CalendarDay}\n componentProps={updatedProps}\n hoverScale={1.35}\n />\n ) : <CalendarDay {...updatedProps} isHovering={false} />}\n </td>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventEmptyStateProps {\n appLink: Core.AppLink;\n imageUrl: string;\n heading?: string;\n}\n\nexport function SpecialEventEmptyState(props: SpecialEventEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('info')} />\n <EmptyState.Heading>{props.heading || <Text phrase='heading' />}</EmptyState.Heading>\n {props.appLink &&\n <EmptyState.Info>\n <>\n <Text namespace={namespace} phrase='info' />\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </>\n </EmptyState.Info>\n }\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .date {\n margin-bottom: 1rem;\n }\n .first {\n margin-top: map-get($spacers, 1) !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SpecialEventListItem } from 'libs/shared/apps/calendar/components/special-event-list-item/SpecialEventListItem';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport styles from './special-event-list.module.scss';\n\ninterface SpecialEventListProps {\n events: CalendarEvent[];\n presentationId: string;\n appLink: (content: CalendarEventContent, slug?: string) => Core.AppLink;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function SpecialEventList(props: SpecialEventListProps): JSX.Element {\n const eventsInMonth: Record<string, CalendarEvent<CalendarEventContent>[]> = {};\n\n props.events.forEach(e => {\n const startDate = e.startDate;\n if (eventsInMonth[startDate]) {\n eventsInMonth[startDate].push(e);\n } else {\n eventsInMonth[startDate] = [e];\n }\n });\n\n const keys = Object.keys(eventsInMonth);\n keys.sort((a, b) => DateHelper.isBefore(a, b) ? -1 : 0);\n\n return (\n <div className='py-1'>\n {keys.map((k, idx) => {\n let prevTime = '';\n let currentTime = '';\n return (\n <div key={k}>\n <div className={`h4 mt-4 ${styles.date} ${idx === 0 ? styles.first : ''}`}>{SpecialEventHelper.getOrdinalDate(k)}</div>\n {eventsInMonth[k].map(e => {\n prevTime = currentTime;\n currentTime = props.getStartTime?.(e.content);\n\n return (\n <SpecialEventListItem\n key={e.content.id}\n getAppLink={(id, name) => {\n return props.appLink(id, TextHelper.slugify(name));\n }}\n event={e}\n presentationId={props.presentationId}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={() => props.getActionLabel(e.content)}\n getStartTime={props.getStartTime && prevTime !== currentTime ?\n props.getStartTime :\n null\n }\n isPastEvent={props.isPastEvent}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n",":local {\n .header {\n height: map-get($spacers, 5);\n }\n .thead {\n border-width: 0.125rem !important;\n }\n td {\n width: 14.285%; // 100% / 7\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarCell } from 'libs/shared/apps/calendar/components/calendar-cell/CalendarCell';\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarImageUrls } from 'libs/shared/apps/calendar/interfaces/CalendarImageUrls';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { MonthQuery } from 'libs/shared/apps/calendar/interfaces/MonthQuery';\nimport { PatchedDate } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport { SpecialEventEmptyState } from '../empty-state/SpecialEventEmptyState';\nimport { SpecialEventList } from '../special-event-list/SpecialEventList';\n\nimport styles from './calendar-body.module.scss';\n\nCalendarBody.defaultProps = {\n theme: {\n border: 'border-light-blue',\n background: 'bg-light-blue'\n }\n};\n\ninterface CalendarBodyProps {\n weekDays: PatchedDate[][];\n weekDaysHeader: string[];\n events?: CalendarEvent[];\n monthQuery: MonthQuery;\n viewingMonth: Date;\n eventsLoaded: boolean;\n presentationId: string;\n appLinks: CalendarAppLinks;\n imageUrls: CalendarImageUrls;\n viewMode?: string;\n theme?: CalendarTheme;\n emptyStateHeading?: string;\n fadePastEvents?: boolean;\n timezone?: Timezone;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getCoverUrl?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n getHardCodedEvent?: (content: CalendarEventContent) => HashObject;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function CalendarBody(props: CalendarBodyProps): JSX.Element {\n const { appLinks, imageUrls } = props;\n\n const breakpoints = useBreakpoints();\n\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(props.events || [], props.viewingMonth);\n\n // cross-month events that should be shown on the first cell of the month\n const crossMonthEventsForFirstDay = React.useMemo(() => {\n const allDatesInView = new Set(\n props.weekDays.reduce((acc, week) => acc.concat(week), [])\n .map(d => DateHelper.format(d, 'YYYY-MM-DD'))\n );\n\n const crossMonthEvents = (props.events || []).filter(e => {\n if (!e.startDate) return false;\n const isFromPreviousMonth = SpecialEventHelper.isEventFromPreviousMonth(e, props.viewingMonth);\n // Only include if the event's start date is NOT already visible in the current view\n const startDateVisible = allDatesInView.has(DateHelper.format(e.startDate, 'YYYY-MM-DD'));\n return isFromPreviousMonth && !startDateVisible;\n });\n\n return crossMonthEvents;\n }, [ props.weekDays, props.events ]);\n\n const [ hasInitialized, setHasInitialized ] = React.useState(false);\n const [ hoveredEvent, setHoveredEvent ] = React.useState<CalendarEvent<CalendarEventContent>>(null);\n\n if (props.eventsLoaded && !eventsInMonth?.length) {\n return (\n <SpecialEventEmptyState\n imageUrl={imageUrls.emptyState}\n appLink={appLinks.emptyStateRedirect?.()}\n heading={props.emptyStateHeading}\n />\n );\n }\n\n if (props.viewMode === 'list' || breakpoints.xs || breakpoints.sm || breakpoints.md) {\n if (!props.eventsLoaded) {\n return (\n <div className='d-flex justify-content-center align-items-center mb-4'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n );\n }\n\n return (\n <SpecialEventList\n events={eventsInMonth}\n presentationId={props.presentationId}\n appLink={props.appLinks.event}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={props.getActionLabel}\n getStartTime={props.getStartTime}\n isPastEvent={props.isPastEvent}\n />\n );\n }\n\n return (\n <table className='user-select-none w-100 mt-3 overflow-hidden rounded-top-lg'>\n <thead className={`border ${props.theme.border} ${styles.thead}`}>\n <tr className={`fw-semibold ${props.theme.background} ${styles.header}`}>\n {props.weekDaysHeader.map(w => <th key={w} className='px-2 h4' scope='col'>{w}</th>)}\n </tr>\n </thead>\n\n <tbody>\n {props.weekDays.map(w => (\n <tr key={w[0].toString()}>\n {w.map(d => {\n return (\n <CalendarCell\n key={d.toString()}\n date={d}\n notCurrentMonth={!!d.notCurrentMonth}\n events={props.events}\n crossMonthEvents={crossMonthEventsForFirstDay}\n viewingMonth={props.viewingMonth}\n monthQuery={props.monthQuery}\n hasInitialized={hasInitialized}\n setHasInitialized={setHasInitialized}\n presentationId={props.presentationId}\n hoveredEvent={hoveredEvent}\n theme={props.theme}\n setHoveredEvent={setHoveredEvent}\n getEventsListAppLink={() => props.appLinks.eventList(props.monthQuery, d, props.presentationId)}\n getTopicAppLink={(calendarEventContent, slug) =>\n props.appLinks.event(calendarEventContent, slug)}\n getIconUrl={props.getIconUrl}\n getBackgroundColor={props.getBackgroundColor}\n getCoverUrl={props.getCoverUrl}\n getHardCodedEvent={props.getHardCodedEvent}\n fadePastEvents={props.fadePastEvents}\n timezone={props.timezone}\n />\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n",":local {\n $svg-shift: 0.1rem; // Even though the element is centered, the chevron SVGs appear slightly off-center. This corrects that.\n\n .chevron {\n min-width: $cv-svg-size-xlg;\n }\n\n .left {\n left: -1rem;\n\n svg {\n transform: translateX(-$svg-shift);\n }\n }\n\n .right {\n right: -1rem;\n\n svg {\n transform: translateX($svg-shift);\n }\n }\n\n .viewModeContainer {\n height: 2.5rem;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, CalendarDisplayModeDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { canNavToOtherMonths } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\nimport { CalendarSvg } from 'libs/shared/images/svg/objects/CalendarSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\n\nimport styles from './calendar-nav.module.scss';\n\nconst namespace = 'specialEventCalendar.calendarNav';\n\ninterface CalendarNavProps extends React.PropsWithChildren {\n monthDate: Date;\n appLinks: CalendarAppLinks;\n viewMode?: CalendarViewMode;\n queryParams?: HashObject;\n setViewingMonthDate: (date?: Date) => void;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\ninterface ViewModeSwitcherProps {\n viewMode: CalendarViewMode;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\nfunction ViewModeSwitcher(props: ViewModeSwitcherProps): JSX.Element {\n return (\n <div className={`${styles.viewModeContainer} d-none d-lg-block`}>\n <IconButton\n svg={CalendarSvg}\n className={`${props.viewMode === 'calendar' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`}\n onClick={() => props.setViewMode('calendar')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.Calendar,\n location: LocationContext.CalendarNav\n }}\n />\n <IconButton\n svg={TableOfContentsSvg}\n className={`${props.viewMode === 'list' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`}\n onClick={() => props.setViewMode('list')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.List,\n location: LocationContext.CalendarNav\n }}\n />\n </div>\n );\n}\n\ninterface NavigateButtonProps {\n action: 'next' | 'previous';\n appLink?: Core.AppLink;\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n onClick: () => void;\n}\n\nfunction NavigateButton(props: NavigateButtonProps): JSX.Element {\n const arrowSvg = props.action === 'previous' ? ChevronLeftSvg : ChevronRightSvg;\n const className = props.action === 'previous' ? styles.left : styles.right;\n\n function onClick() {\n Core.AppLinkHelper.trigger(props.appLink);\n\n props.onClick();\n }\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n className={`${styles.chevron} ${className} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`}\n onClick={onClick}\n >\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.svg}`}\n />\n </AppLink>\n );\n}\n\nconst CUR_DATE = new Date();\n\nexport function CalendarNav(props: CalendarNavProps): JSX.Element {\n const { appLinks } = props;\n\n const breakpoints = useBreakpoints();\n \n function getAppLink(monthDate?: Date): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n const params: HashObject = {};\n\n if (monthDate) {\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n \n if (currentYear !== year)\n params.year = year;\n }\n\n if (props.queryParams?.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams?.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n appLink.params = params;\n\n return appLink;\n }\n\n function onClickNext () {\n const nextMonth = DateHelper.add(props.monthDate, 1, 'month');\n props.setViewingMonthDate(nextMonth);\n }\n\n function onClickPrevious() {\n const prevMonth = DateHelper.subtract(props.monthDate, 1, 'month');\n props.setViewingMonthDate(prevMonth);\n }\n\n function onClickToday() {\n if (DateHelper.format(CUR_DATE, 'M YY') === DateHelper.format(props.monthDate, 'M YY')) return;\n \n props.setViewingMonthDate();\n }\n \n const { showPrev, showNext } = canNavToOtherMonths(props.monthDate);\n\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.SpecialEvent,\n location: LocationContext.CalendarNav\n };\n\n function formatAnalyticDataDate(date: Date) {\n return DateHelper.format(date, 'YYYY-MM-DD');\n }\n return (\n <div className='d-flex flex-wrap gap-3 justify-content-end align-items-center'>\n <h1 className='mb-0 h2 me-auto'>{DateHelper.format(props.monthDate, breakpoints.xs ? 'MMM YYYY' : 'MMMM YYYY')}</h1>\n\n {props.children}\n\n {props.setViewMode && (\n <ViewModeSwitcher viewMode={props.viewMode} setViewMode={props.setViewMode} />\n )}\n <div className='d-flex gap-3'>\n {showPrev && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.subtract(props.monthDate, 1, 'month'), 'month'))}\n action='previous'\n onClick={onClickPrevious}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'previous', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n />\n )}\n <AppLink\n appLink={getAppLink()}className={`${styles.todayWrapper} btn btn-outline-dark fw-semibold`}\n onClick={onClickToday}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'today', date: formatAnalyticDataDate(DateHelper.startOf(CUR_DATE, 'month')) }}\n >\n {LanguageService.getPhrase(namespace, 'today')}\n </AppLink>\n {showNext && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month'))}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'next', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n action='next'\n onClick={onClickNext}\n />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsErrorState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventErrorStateProps {\n imageUrl: string;\n appLink: Core.AppLink;\n}\n\nexport function SpecialEventErrorState(props: SpecialEventErrorStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n <br/>\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\n\nimport { buildWeeksTable, DatePositionMap, initWeekDays, WeeksTable } from '../utils/CalendarHelper';\n\ntype Cache = Record<string, {\n datePositionMap: DatePositionMap,\n weeksTable: WeeksTable\n}>;\n\nconst TODAY_DATE = new Date();\n\nexport function useCalendarWeeksTable(date: Date = TODAY_DATE, appLinks: CalendarAppLinks, startAtMon: boolean = true) {\n const weekDaysHeader = initWeekDays(startAtMon);\n const cacheRef = React.useRef<Cache>({});\n\n const monthDateString = DateHelper.format(date, 'YYYY-MM');\n const weekDays = React.useMemo(() => {\n const cached = cacheRef.current[monthDateString];\n if (!cached) {\n const { weeksTable, datePositionMap } = buildWeeksTable(date, startAtMon);\n\n cacheRef.current[monthDateString] = { weeksTable, datePositionMap };\n return weeksTable;\n }\n\n return cached.weeksTable;\n }, [ monthDateString, startAtMon ]);\n\n function setViewingMonthDate(nextMonthDate?: Date) {\n if (!nextMonthDate) {\n Core.AppLinkHelper.trigger(appLinks.calendar());\n\n return;\n }\n\n if (monthDateString !== DateHelper.format(nextMonthDate, 'YYYY-MM')) {\n const month = DateHelper.format(nextMonthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = date.getFullYear();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n if (currentYear !== year)\n appLink.params = { year };\n\n Core.AppLinkHelper.trigger(appLink);\n }\n }\n\n const startDate = ArrayHelper.first(ArrayHelper.first(weekDays));\n const endDate = ArrayHelper.last(ArrayHelper.last(weekDays));\n\n return { weekDaysHeader, weekDays, monthDate: date, setMonthDate: setViewingMonthDate, startDate, endDate };\n}\n","import { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { getCalendarRange } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { CalendarEvent } from 'libs/shared/interfaces';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\n\nexport function useCalendarEventsData(viewMonth: Date, queryParams?: HashObject) {\n const [ startDate, endDate ] = getCalendarRange(viewMonth);\n\n const nextMonth = DateHelper.add(viewMonth, 1, 'month');\n const [ nextStartDate, nextEndDate ] = getCalendarRange(nextMonth);\n\n const prevMonth = DateHelper.subtract(viewMonth, 1, 'month');\n const [ prevStartDate, prevEndDate ] = getCalendarRange(prevMonth);\n\n const filters: HashObject = {};\n\n if (queryParams.yearGroup)\n filters.audienceId = queryParams.yearGroup;\n\n if (queryParams.classification) {\n filters.topicId = queryParams.classification;\n filters.includeChildrenTopics = true;\n }\n\n const events = Flight.useBasicFetch<CalendarEvent[]>((startDate && endDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(startDate, 'YYYY-MM-DD'),\n to: DateHelper.format(endDate, 'YYYY-MM-DD'),\n ...filters\n }));\n \n const nextEvents = Flight.useBasicFetch<CalendarEvent[]>((nextStartDate && nextEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(nextStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(nextEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const prevEvents = Flight.useBasicFetch<CalendarEvent[]>((prevStartDate && prevEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(prevStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(prevEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const uniqueEventList = ArrayHelper.uniq(\n [ ...prevEvents.data || [], ...events.data || [], ...nextEvents.data || [] ],\n e => e.id\n );\n\n return { events: uniqueEventList, loaded: events.hasCompleted };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { CalendarBody } from 'libs/shared/apps/calendar/components/calendar-body/CalendarBody';\nimport { CalendarNav } from 'libs/shared/apps/calendar/components/calendar-nav/CalendarNav';\nimport { SpecialEventErrorState } from 'libs/shared/apps/calendar/components/error-state/SpecialEventErrorState';\nimport { useCalendarWeeksTable } from 'libs/shared/apps/calendar/hooks/useCalendarWeeksTable';\nimport { CalendarQueryParams } from 'libs/shared/apps/calendar/interfaces/CalendarQueryParams';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { getIsValidMonth, parseMonthString } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchFilter, TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { StreamableHeader } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\nimport { TimezoneIndicator } from 'libs/shared/apps/streamable-learning/components/timezone-indicator/TimezoneIndicator';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Livestream, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { useCalendarEventsData } from 'apps/calendar/hooks/useCalendarEventsData';\nimport { CalendarUtils } from 'apps/calendar/utils/CalendarUtils';\nimport { getCalendarAppLinks, getCalendarImageUrls } from 'apps/calendar/views/calendar-view/CalendarViewUtils';\nimport { getStreamableHeaderAppLinks } from 'apps/dashboard/views/dashboard/DiscoverViewUtils';\n\nconst namespace = 'livestreamCalendar.calendarView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViewModelViewModel {\n viewMode: CalendarViewMode;\n}\n\n/**\n * NOTE: Ensure any keys added here are also added\n * to sanitizePlayViewParams below.\n */\ninterface StreamableCalendarQueryParams extends CalendarQueryParams {\n classification?: string;\n yearGroup?: string;\n}\n\nexport function sanitizeCalendarViewParams(queryParams: StreamableCalendarQueryParams): StreamableCalendarQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [\n 'year',\n 'classification',\n 'yearGroup'\n ]);\n}\n\nCalendarView.defaultProps = {\n queryParams: {}\n};\n\nexport interface CalendarViewProps {\n month?: string;\n queryParams?: StreamableCalendarQueryParams;\n}\n\nexport function CalendarView(props: CalendarViewProps): JSX.Element {\n const [{ viewMode }, setMode ] = useViewModel<ViewModelViewModel>('calendar:mode', { viewMode: 'calendar' }, {\n storage: StorageType.LocalStorage\n });\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const availableTopics = Flight.useBasicFetch<TopicResults>(presentation.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations([presentation.data.id]));\n\n const isValidMonth = getIsValidMonth(props.month);\n\n const viewingMonth = parseMonthString(props.month);\n \n const {\n monthDate,\n setMonthDate,\n weekDays,\n weekDaysHeader,\n startDate,\n endDate\n } = useCalendarWeeksTable(viewingMonth, getCalendarAppLinks());\n\n const { events, loaded } = useCalendarEventsData(viewingMonth, props.queryParams);\n const currentMonthYear = DateHelper.format(monthDate, 'MMMM YYYY');\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: currentMonthYear,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink<keyof CalendarQueryParams>({ allowedParams: ['year']}),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n if (props.month !== null && !isValidMonth) {\n return (\n <SpecialEventErrorState\n imageUrl={getCalendarImageUrls().errorState}\n appLink={getStreamableHeaderAppLinks().calendar}\n />\n );\n }\n\n const mainFilters: SearchFilter<string>[] = [\n {\n id: 'classification',\n name: getPhrase('subjectFilter'),\n options: availableTopics.data?.topics.map(t => ({ name: t.name, id: t.topicIds.join(':') })),\n type: 'checkbox',\n compatibleIndices: []\n },\n {\n id: 'yearGroup',\n name: getPhrase('gradeFilter'),\n type: 'checkbox',\n options: audiences.data?.map(a => ({ name: a.name, id: a.masterId })),\n compatibleIndices: []\n }\n ];\n\n function getAppLink(): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n\n const appLink: Core.AppLink = getCalendarAppLinks().month(month);\n\n const params: HashObject = {};\n\n if (currentYear !== year)\n params.year = year;\n\n if (props.queryParams.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n return appLink;\n }\n\n function getActionLabel(livestream: Livestream): string {\n return isStudent || DateHelper.isBefore(livestream.endDateTime, new Date()) ? 'pastActionLabel' : 'actionLabel';\n }\n\n function getEmptyStateHeading(): string {\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(events || [], viewingMonth);\n\n if (!eventsInMonth.length && (props.queryParams.yearGroup || props.queryParams.classification))\n return getPhrase('emptyStateText');\n }\n\n function getIconUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.logo?.url, { size: ImageSize.Small });\n }\n\n function getBannerUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.banner?.url, { size: ImageSize.Large });\n }\n\n return (\n <div className='bg-white px-4'>\n <StreamableHeader\n appLinks={getStreamableHeaderAppLinks()}\n active='calendar'\n />\n\n <CalendarNav\n monthDate={monthDate}\n setViewingMonthDate={setMonthDate}\n appLinks={getCalendarAppLinks()}\n queryParams={props.queryParams}\n viewMode={viewMode}\n setViewMode={(viewMode: CalendarViewMode) => setMode({ viewMode })}\n >\n <div className='mx-n1 order-1 order-sm-0'>\n <SearchFilters\n queryParams={ObjectHelper.omit(props.queryParams, ['year'])}\n mainFilters={mainFilters}\n appLink={getAppLink()}\n isFetchingOptions={!availableTopics.data || !presentation.data || !audiences.data}\n alignResetButtonLeft\n hideDivider\n hideHeading\n hideCaret={false}\n />\n </div>\n </CalendarNav>\n <div className={`position-relative mt-3 ${viewMode === 'list' ? '' : 'mt-lg-0'}`}>\n <div className={`d-block ${viewMode === 'list' ? '' : 'd-lg-none'} position-absolute top-0 end-0 mt-2`}>\n <TimezoneIndicator />\n </div>\n <CalendarBody\n weekDays={weekDays}\n weekDaysHeader={weekDaysHeader}\n events={events}\n monthQuery={{ from: startDate?.toString(), to: endDate?.toString() }}\n viewingMonth={viewingMonth}\n eventsLoaded={loaded}\n presentationId={presentation.data?.id}\n appLinks={getCalendarAppLinks()}\n imageUrls={getCalendarImageUrls()}\n viewMode={viewMode}\n getActionLabel={livestream => getPhrase(getActionLabel(livestream as Livestream))}\n getBackgroundColor={(content: Livestream) => content.company.metadata?.colour}\n getBannerUrl={getBannerUrl}\n getIconUrl={getIconUrl}\n getStartTime={CalendarUtils.getStartTime}\n theme={{\n background: 'bg-light-green',\n border: 'border-light-green'\n }}\n emptyStateHeading={getEmptyStateHeading()}\n fadePastEvents\n timezone={Timezone.ET}\n isPastEvent={CalendarUtils.isPastEvent}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Br0Uc4GG.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/components/calendar-cell/calendar-cell.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-cell/CalendarCell.tsx","../../../../libs/shared/src/apps/calendar/components/empty-state/SpecialEventEmptyState.tsx","../../../../libs/shared/src/apps/calendar/components/special-event-list/special-event-list.module.scss","../../../../libs/shared/src/apps/calendar/components/special-event-list/SpecialEventList.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-body/calendar-body.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-body/CalendarBody.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-nav/calendar-nav.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-nav/CalendarNav.tsx","../../../../libs/shared/src/apps/calendar/components/error-state/SpecialEventErrorState.tsx","../../../../libs/shared/src/apps/calendar/hooks/useCalendarWeeksTable.ts","../../src/apps/calendar/hooks/useCalendarEventsData.ts","../../src/apps/calendar/views/calendar-view/CalendarView.tsx"],"sourcesContent":[":local {\n .wrapper {\n border-width: 0.125rem !important;\n }\n\n .weekend {\n background-color: $gray-100;\n }\n}","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarDay } from 'libs/shared/apps/calendar/components/calendar-day/CalendarDay';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\n\nimport styles from './calendar-cell.module.scss';\n\nfunction getIsWeekend(date: Date): boolean {\n return DateHelper.getWeekday(date) === 0 || DateHelper.getWeekday(date) === 6;\n}\n\nexport function CalendarCell(props: CalendarCellProps): JSX.Element {\n const { date, notCurrentMonth } = props;\n const [ sliderStep, setSliderStep ] = React.useState<number>(0);\n\n let wrapperClassname = `position-relative border ${props.theme.border} ${styles.wrapper}`;\n if (getIsWeekend(date)) wrapperClassname += ` ${styles.weekend}`;\n if (notCurrentMonth) wrapperClassname += `opacity-50`;\n\n const eventsOnDay = SpecialEventHelper.getEventsForDay(\n date,\n props.events || [],\n props.crossMonthEvents || [],\n props.viewingMonth\n );\n\n const updatedProps = { ...props, eventsOnDay, sliderStep, setSliderStep };\n return (\n <td className={wrapperClassname}>\n {eventsOnDay?.length > 0 ? (\n <HoverToPortalContainer<CalendarCellProps>\n hoverableComponent={CalendarDay}\n componentProps={updatedProps}\n hoverScale={1.35}\n />\n ) : <CalendarDay {...updatedProps} isHovering={false} />}\n </td>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventEmptyStateProps {\n appLink: Core.AppLink;\n imageUrl: string;\n heading?: string;\n}\n\nexport function SpecialEventEmptyState(props: SpecialEventEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('info')} />\n <EmptyState.Heading>{props.heading || <Text phrase='heading' />}</EmptyState.Heading>\n {props.appLink &&\n <EmptyState.Info>\n <>\n <Text namespace={namespace} phrase='info' />\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </>\n </EmptyState.Info>\n }\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .date {\n margin-bottom: 1rem;\n }\n .first {\n margin-top: map-get($spacers, 1) !important;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { SpecialEventListItem } from 'libs/shared/apps/calendar/components/special-event-list-item/SpecialEventListItem';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport styles from './special-event-list.module.scss';\n\ninterface SpecialEventListProps {\n events: CalendarEvent[];\n presentationId: string;\n appLink: (content: CalendarEventContent, slug?: string) => Core.AppLink;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function SpecialEventList(props: SpecialEventListProps): JSX.Element {\n const eventsInMonth: Record<string, CalendarEvent<CalendarEventContent>[]> = {};\n\n props.events.forEach(e => {\n const startDate = e.startDate;\n if (eventsInMonth[startDate]) {\n eventsInMonth[startDate].push(e);\n } else {\n eventsInMonth[startDate] = [e];\n }\n });\n\n const keys = Object.keys(eventsInMonth);\n keys.sort((a, b) => DateHelper.isBefore(a, b) ? -1 : 0);\n\n return (\n <div className='py-1'>\n {keys.map((k, idx) => {\n let prevTime = '';\n let currentTime = '';\n return (\n <div key={k}>\n <div className={`h4 mt-4 ${styles.date} ${idx === 0 ? styles.first : ''}`}>{SpecialEventHelper.getOrdinalDate(k)}</div>\n {eventsInMonth[k].map(e => {\n prevTime = currentTime;\n currentTime = props.getStartTime?.(e.content);\n\n return (\n <SpecialEventListItem\n key={e.content.id}\n getAppLink={(id, name) => {\n return props.appLink(id, TextHelper.slugify(name));\n }}\n event={e}\n presentationId={props.presentationId}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={() => props.getActionLabel(e.content)}\n getStartTime={props.getStartTime && prevTime !== currentTime ?\n props.getStartTime :\n null\n }\n isPastEvent={props.isPastEvent}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\n",":local {\n .header {\n height: map-get($spacers, 5);\n }\n .thead {\n border-width: 0.125rem !important;\n }\n td {\n width: 14.285%; // 100% / 7\n }\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarCell } from 'libs/shared/apps/calendar/components/calendar-cell/CalendarCell';\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarImageUrls } from 'libs/shared/apps/calendar/interfaces/CalendarImageUrls';\nimport { CalendarTheme } from 'libs/shared/apps/calendar/interfaces/CalendarTheme';\nimport { MonthQuery } from 'libs/shared/apps/calendar/interfaces/MonthQuery';\nimport { PatchedDate } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport { SpecialEventEmptyState } from '../empty-state/SpecialEventEmptyState';\nimport { SpecialEventList } from '../special-event-list/SpecialEventList';\n\nimport styles from './calendar-body.module.scss';\n\nCalendarBody.defaultProps = {\n theme: {\n border: 'border-light-blue',\n background: 'bg-light-blue'\n }\n};\n\ninterface CalendarBodyProps {\n weekDays: PatchedDate[][];\n weekDaysHeader: string[];\n events?: CalendarEvent[];\n monthQuery: MonthQuery;\n viewingMonth: Date;\n eventsLoaded: boolean;\n presentationId: string;\n appLinks: CalendarAppLinks;\n imageUrls: CalendarImageUrls;\n viewMode?: string;\n theme?: CalendarTheme;\n emptyStateHeading?: string;\n fadePastEvents?: boolean;\n timezone?: Timezone;\n getIconUrl?: (content: CalendarEventContent) => string;\n getBackgroundColor?: (content: CalendarEventContent) => string;\n getBannerUrl?: (content: CalendarEventContent) => string;\n getCoverUrl?: (content: CalendarEventContent) => string;\n getActionLabel?: (content?: CalendarEventContent) => string;\n getStartTime?: (content: CalendarEventContent) => string;\n getHardCodedEvent?: (content: CalendarEventContent) => HashObject;\n isPastEvent?: (content: CalendarEventContent) => boolean;\n}\n\nexport function CalendarBody(props: CalendarBodyProps): JSX.Element {\n const { appLinks, imageUrls } = props;\n\n const breakpoints = useBreakpoints();\n\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(props.events || [], props.viewingMonth);\n\n // cross-month events that should be shown on the first cell of the month\n const crossMonthEventsForFirstDay = React.useMemo(() => {\n const allDatesInView = new Set(\n props.weekDays.reduce((acc, week) => acc.concat(week), [])\n .map(d => DateHelper.format(d, 'YYYY-MM-DD'))\n );\n\n const crossMonthEvents = (props.events || []).filter(e => {\n if (!e.startDate) return false;\n const isFromPreviousMonth = SpecialEventHelper.isEventFromPreviousMonth(e, props.viewingMonth);\n // Only include if the event's start date is NOT already visible in the current view\n const startDateVisible = allDatesInView.has(DateHelper.format(e.startDate, 'YYYY-MM-DD'));\n return isFromPreviousMonth && !startDateVisible;\n });\n\n return crossMonthEvents;\n }, [ props.weekDays, props.events ]);\n\n const [ hasInitialized, setHasInitialized ] = React.useState(false);\n const [ hoveredEvent, setHoveredEvent ] = React.useState<CalendarEvent<CalendarEventContent>>(null);\n\n if (props.eventsLoaded && !eventsInMonth?.length) {\n return (\n <SpecialEventEmptyState\n imageUrl={imageUrls.emptyState}\n appLink={appLinks.emptyStateRedirect?.()}\n heading={props.emptyStateHeading}\n />\n );\n }\n\n if (props.viewMode === 'list' || breakpoints.xs || breakpoints.sm || breakpoints.md) {\n if (!props.eventsLoaded) {\n return (\n <div className='d-flex justify-content-center align-items-center mb-4'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n );\n }\n\n return (\n <SpecialEventList\n events={eventsInMonth}\n presentationId={props.presentationId}\n appLink={props.appLinks.event}\n getIconUrl={props.getIconUrl}\n getBannerUrl={props.getBannerUrl}\n getBackgroundColor={props.getBackgroundColor}\n getActionLabel={props.getActionLabel}\n getStartTime={props.getStartTime}\n isPastEvent={props.isPastEvent}\n />\n );\n }\n\n return (\n <table className='user-select-none w-100 mt-3 overflow-hidden rounded-top-lg'>\n <thead className={`border ${props.theme.border} ${styles.thead}`}>\n <tr className={`fw-semibold ${props.theme.background} ${styles.header}`}>\n {props.weekDaysHeader.map(w => <th key={w} className='px-2 h4' scope='col'>{w}</th>)}\n </tr>\n </thead>\n\n <tbody>\n {props.weekDays.map(w => (\n <tr key={w[0].toString()}>\n {w.map(d => {\n return (\n <CalendarCell\n key={d.toString()}\n date={d}\n notCurrentMonth={!!d.notCurrentMonth}\n events={props.events}\n crossMonthEvents={crossMonthEventsForFirstDay}\n viewingMonth={props.viewingMonth}\n monthQuery={props.monthQuery}\n hasInitialized={hasInitialized}\n setHasInitialized={setHasInitialized}\n presentationId={props.presentationId}\n hoveredEvent={hoveredEvent}\n theme={props.theme}\n setHoveredEvent={setHoveredEvent}\n getEventsListAppLink={() => props.appLinks.eventList(props.monthQuery, d, props.presentationId)}\n getTopicAppLink={(calendarEventContent, slug) =>\n props.appLinks.event(calendarEventContent, slug)}\n getIconUrl={props.getIconUrl}\n getBackgroundColor={props.getBackgroundColor}\n getCoverUrl={props.getCoverUrl}\n getHardCodedEvent={props.getHardCodedEvent}\n fadePastEvents={props.fadePastEvents}\n timezone={props.timezone}\n />\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n",":local {\n $svg-shift: 0.1rem; // Even though the element is centered, the chevron SVGs appear slightly off-center. This corrects that.\n\n .chevron {\n min-width: $cv-svg-size-xlg;\n }\n\n .left {\n left: -1rem;\n\n svg {\n transform: translateX(-$svg-shift);\n }\n }\n\n .right {\n right: -1rem;\n\n svg {\n transform: translateX($svg-shift);\n }\n }\n\n .viewModeContainer {\n height: 2.5rem;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, CalendarDisplayModeDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { canNavToOtherMonths } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\nimport { CalendarSvg } from 'libs/shared/images/svg/objects/CalendarSvg';\nimport { TableOfContentsSvg } from 'libs/shared/images/svg/objects/TableOfContentsSvg';\n\nimport styles from './calendar-nav.module.scss';\n\nconst namespace = 'specialEventCalendar.calendarNav';\n\ninterface CalendarNavProps extends React.PropsWithChildren {\n monthDate: Date;\n appLinks: CalendarAppLinks;\n viewMode?: CalendarViewMode;\n queryParams?: HashObject;\n setViewingMonthDate: (date?: Date) => void;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\ninterface ViewModeSwitcherProps {\n viewMode: CalendarViewMode;\n setViewMode?: (viewMode: CalendarViewMode) => void;\n}\n\nfunction ViewModeSwitcher(props: ViewModeSwitcherProps): JSX.Element {\n return (\n <div className={`${styles.viewModeContainer} d-none d-lg-block`}>\n <IconButton\n svg={CalendarSvg}\n className={`${props.viewMode === 'calendar' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`}\n onClick={() => props.setViewMode('calendar')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.Calendar,\n location: LocationContext.CalendarNav\n }}\n />\n <IconButton\n svg={TableOfContentsSvg}\n className={`${props.viewMode === 'list' ? 'bg-dark text-white' : ''} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`}\n onClick={() => props.setViewMode('list')}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.AppLink,\n actionType: UserAction.Click,\n descriptor: CalendarDisplayModeDescriptor.List,\n location: LocationContext.CalendarNav\n }}\n />\n </div>\n );\n}\n\ninterface NavigateButtonProps {\n action: 'next' | 'previous';\n appLink?: Core.AppLink;\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n onClick: () => void;\n}\n\nfunction NavigateButton(props: NavigateButtonProps): JSX.Element {\n const arrowSvg = props.action === 'previous' ? ChevronLeftSvg : ChevronRightSvg;\n const className = props.action === 'previous' ? styles.left : styles.right;\n\n function onClick() {\n Core.AppLinkHelper.trigger(props.appLink);\n\n props.onClick();\n }\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n className={`${styles.chevron} ${className} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`}\n onClick={onClick}\n >\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.svg}`}\n />\n </AppLink>\n );\n}\n\nconst CUR_DATE = new Date();\n\nexport function CalendarNav(props: CalendarNavProps): JSX.Element {\n const { appLinks } = props;\n\n const breakpoints = useBreakpoints();\n \n function getAppLink(monthDate?: Date): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n const params: HashObject = {};\n\n if (monthDate) {\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n \n if (currentYear !== year)\n params.year = year;\n }\n\n if (props.queryParams?.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams?.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n appLink.params = params;\n\n return appLink;\n }\n\n function onClickNext () {\n const nextMonth = DateHelper.add(props.monthDate, 1, 'month');\n props.setViewingMonthDate(nextMonth);\n }\n\n function onClickPrevious() {\n const prevMonth = DateHelper.subtract(props.monthDate, 1, 'month');\n props.setViewingMonthDate(prevMonth);\n }\n\n function onClickToday() {\n if (DateHelper.format(CUR_DATE, 'M YY') === DateHelper.format(props.monthDate, 'M YY')) return;\n \n props.setViewingMonthDate();\n }\n \n const { showPrev, showNext } = canNavToOtherMonths(props.monthDate);\n\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.SpecialEvent,\n location: LocationContext.CalendarNav\n };\n\n function formatAnalyticDataDate(date: Date) {\n return DateHelper.format(date, 'YYYY-MM-DD');\n }\n return (\n <div className='d-flex flex-wrap gap-3 justify-content-end align-items-center'>\n <h1 className='mb-0 h2 me-auto'>{DateHelper.format(props.monthDate, breakpoints.xs ? 'MMM YYYY' : 'MMMM YYYY')}</h1>\n\n {props.children}\n\n {props.setViewMode && (\n <ViewModeSwitcher viewMode={props.viewMode} setViewMode={props.setViewMode} />\n )}\n <div className='d-flex gap-3'>\n {showPrev && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.subtract(props.monthDate, 1, 'month'), 'month'))}\n action='previous'\n onClick={onClickPrevious}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'previous', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n />\n )}\n <AppLink\n appLink={getAppLink()}className={`${styles.todayWrapper} btn btn-outline-dark fw-semibold`}\n onClick={onClickToday}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'today', date: formatAnalyticDataDate(DateHelper.startOf(CUR_DATE, 'month')) }}\n >\n {LanguageService.getPhrase(namespace, 'today')}\n </AppLink>\n {showNext && (\n <NavigateButton\n appLink={getAppLink(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month'))}\n analyticsOptions={analyticsOptions}\n analyticsData={{ action: 'next', date: formatAnalyticDataDate(DateHelper.startOf(DateHelper.add(props.monthDate, 1, 'month'), 'month')) }}\n action='next'\n onClick={onClickNext}\n />\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'specialEvent.eventsErrorState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SpecialEventErrorStateProps {\n imageUrl: string;\n appLink: Core.AppLink;\n}\n\nexport function SpecialEventErrorState(props: SpecialEventErrorStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n <br/>\n <AppLink appLink={props.appLink}>\n <span className='text-info'>{getPhrase('link')}</span>\n </AppLink>\n </EmptyState.Info>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarAppLinks } from 'libs/shared/apps/calendar/interfaces/CalendarAppLinks';\n\nimport { buildWeeksTable, DatePositionMap, initWeekDays, WeeksTable } from '../utils/CalendarHelper';\n\ntype Cache = Record<string, {\n datePositionMap: DatePositionMap,\n weeksTable: WeeksTable\n}>;\n\nconst TODAY_DATE = new Date();\n\nexport function useCalendarWeeksTable(date: Date = TODAY_DATE, appLinks: CalendarAppLinks, startAtMon: boolean = true) {\n const weekDaysHeader = initWeekDays(startAtMon);\n const cacheRef = React.useRef<Cache>({});\n\n const monthDateString = DateHelper.format(date, 'YYYY-MM');\n const weekDays = React.useMemo(() => {\n const cached = cacheRef.current[monthDateString];\n if (!cached) {\n const { weeksTable, datePositionMap } = buildWeeksTable(date, startAtMon);\n\n cacheRef.current[monthDateString] = { weeksTable, datePositionMap };\n return weeksTable;\n }\n\n return cached.weeksTable;\n }, [ monthDateString, startAtMon ]);\n\n function setViewingMonthDate(nextMonthDate?: Date) {\n if (!nextMonthDate) {\n Core.AppLinkHelper.trigger(appLinks.calendar());\n\n return;\n }\n\n if (monthDateString !== DateHelper.format(nextMonthDate, 'YYYY-MM')) {\n const month = DateHelper.format(nextMonthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = date.getFullYear();\n\n const appLink: Core.AppLink = appLinks.month(month);\n\n if (currentYear !== year)\n appLink.params = { year };\n\n Core.AppLinkHelper.trigger(appLink);\n }\n }\n\n const startDate = ArrayHelper.first(ArrayHelper.first(weekDays));\n const endDate = ArrayHelper.last(ArrayHelper.last(weekDays));\n\n return { weekDaysHeader, weekDays, monthDate: date, setMonthDate: setViewingMonthDate, startDate, endDate };\n}\n","import { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { getCalendarRange } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { CalendarEvent } from 'libs/shared/interfaces';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\n\nexport function useCalendarEventsData(viewMonth: Date, queryParams?: HashObject) {\n const [ startDate, endDate ] = getCalendarRange(viewMonth);\n\n const nextMonth = DateHelper.add(viewMonth, 1, 'month');\n const [ nextStartDate, nextEndDate ] = getCalendarRange(nextMonth);\n\n const prevMonth = DateHelper.subtract(viewMonth, 1, 'month');\n const [ prevStartDate, prevEndDate ] = getCalendarRange(prevMonth);\n\n const filters: HashObject = {};\n\n if (queryParams.yearGroup)\n filters.audienceId = queryParams.yearGroup;\n\n if (queryParams.classification) {\n filters.topicId = queryParams.classification;\n filters.includeChildrenTopics = true;\n }\n\n const events = Flight.useBasicFetch<CalendarEvent[]>((startDate && endDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(startDate, 'YYYY-MM-DD'),\n to: DateHelper.format(endDate, 'YYYY-MM-DD'),\n ...filters\n }));\n \n const nextEvents = Flight.useBasicFetch<CalendarEvent[]>((nextStartDate && nextEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(nextStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(nextEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const prevEvents = Flight.useBasicFetch<CalendarEvent[]>((prevStartDate && prevEndDate)\n && LivestreamRequests.calendarLivestreams({\n from: DateHelper.format(prevStartDate, 'YYYY-MM-DD'),\n to: DateHelper.format(prevEndDate, 'YYYY-MM-DD'),\n ...filters\n }));\n\n const uniqueEventList = ArrayHelper.uniq(\n [ ...prevEvents.data || [], ...events.data || [], ...nextEvents.data || [] ],\n e => e.id\n );\n\n return { events: uniqueEventList, loaded: events.hasCompleted };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { CalendarBody } from 'libs/shared/apps/calendar/components/calendar-body/CalendarBody';\nimport { CalendarNav } from 'libs/shared/apps/calendar/components/calendar-nav/CalendarNav';\nimport { SpecialEventErrorState } from 'libs/shared/apps/calendar/components/error-state/SpecialEventErrorState';\nimport { useCalendarWeeksTable } from 'libs/shared/apps/calendar/hooks/useCalendarWeeksTable';\nimport { CalendarQueryParams } from 'libs/shared/apps/calendar/interfaces/CalendarQueryParams';\nimport { CalendarViewMode } from 'libs/shared/apps/calendar/interfaces/CalendarViewMode';\nimport { getIsValidMonth, parseMonthString } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchFilter, TopicResults } from 'libs/shared/apps/search/interfaces';\nimport { StreamableHeader } from 'libs/shared/apps/streamable-learning/components/header/StreamableHeader';\nimport { TimezoneIndicator } from 'libs/shared/apps/streamable-learning/components/timezone-indicator/TimezoneIndicator';\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Livestream, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { useCalendarEventsData } from 'apps/calendar/hooks/useCalendarEventsData';\nimport { CalendarUtils } from 'apps/calendar/utils/CalendarUtils';\nimport { getCalendarAppLinks, getCalendarImageUrls } from 'apps/calendar/views/calendar-view/CalendarViewUtils';\nimport { getStreamableHeaderAppLinks } from 'apps/dashboard/views/dashboard/DiscoverViewUtils';\n\nconst namespace = 'livestreamCalendar.calendarView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ViewModelViewModel {\n viewMode: CalendarViewMode;\n}\n\n/**\n * NOTE: Ensure any keys added here are also added\n * to sanitizePlayViewParams below.\n */\ninterface StreamableCalendarQueryParams extends CalendarQueryParams {\n classification?: string;\n yearGroup?: string;\n}\n\nexport function sanitizeCalendarViewParams(queryParams: StreamableCalendarQueryParams): StreamableCalendarQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [\n 'year',\n 'classification',\n 'yearGroup'\n ]);\n}\n\nCalendarView.defaultProps = {\n queryParams: {}\n};\n\nexport interface CalendarViewProps {\n month?: string;\n queryParams?: StreamableCalendarQueryParams;\n}\n\nexport function CalendarView(props: CalendarViewProps): JSX.Element {\n const [{ viewMode }, setMode ] = useViewModel<ViewModelViewModel>('calendar:mode', { viewMode: 'calendar' }, {\n storage: StorageType.LocalStorage\n });\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const availableTopics = Flight.useBasicFetch<TopicResults>(presentation.data &&\n ClassificationRequests.topicsFromAllAvailablePresentations([presentation.data.id]));\n\n const isValidMonth = getIsValidMonth(props.month);\n\n const viewingMonth = parseMonthString(props.month);\n \n const {\n monthDate,\n setMonthDate,\n weekDays,\n weekDaysHeader,\n startDate,\n endDate\n } = useCalendarWeeksTable(viewingMonth, getCalendarAppLinks());\n\n const { events, loaded } = useCalendarEventsData(viewingMonth, props.queryParams);\n const currentMonthYear = DateHelper.format(monthDate, 'MMMM YYYY');\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: currentMonthYear,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink<keyof CalendarQueryParams>({ allowedParams: ['year']}),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n if (props.month !== null && !isValidMonth) {\n return (\n <SpecialEventErrorState\n imageUrl={getCalendarImageUrls().errorState}\n appLink={getStreamableHeaderAppLinks().calendar}\n />\n );\n }\n\n const mainFilters: SearchFilter<string>[] = [\n {\n id: 'classification',\n name: getPhrase('subjectFilter'),\n options: availableTopics.data?.topics.map(t => ({ name: t.name, id: t.topicIds.join(':') })),\n type: 'checkbox',\n compatibleIndices: []\n },\n {\n id: 'yearGroup',\n name: getPhrase('gradeFilter'),\n type: 'checkbox',\n options: audiences.data?.map(a => ({ name: a.name, id: a.masterId })),\n compatibleIndices: []\n }\n ];\n\n function getAppLink(): Core.AppLink {\n const month = DateHelper.format(monthDate, 'MMMM').toLocaleLowerCase();\n\n const currentYear = new Date().getFullYear();\n const year = monthDate.getFullYear();\n\n const appLink: Core.AppLink = getCalendarAppLinks().month(month);\n\n const params: HashObject = {};\n\n if (currentYear !== year)\n params.year = year;\n\n if (props.queryParams.classification)\n params.classification = props.queryParams.classification;\n\n if (props.queryParams.yearGroup)\n params.yearGroup = props.queryParams.yearGroup;\n\n return appLink;\n }\n\n function getActionLabel(livestream: Livestream): string {\n return isStudent || DateHelper.isBefore(livestream.endDateTime, new Date()) ? 'pastActionLabel' : 'actionLabel';\n }\n\n function getEmptyStateHeading(): string {\n const eventsInMonth = SpecialEventHelper.getEventsInMonth(events || [], viewingMonth);\n\n if (!eventsInMonth.length && (props.queryParams.yearGroup || props.queryParams.classification))\n return getPhrase('emptyStateText');\n }\n\n function getIconUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.logo?.url, { size: ImageSize.Small });\n }\n\n function getBannerUrl(content: Livestream) {\n return ImageHelper.createUrl(content.company.banner?.url, { size: ImageSize.Large });\n }\n\n return (\n <div className='bg-white px-4'>\n <StreamableHeader\n appLinks={getStreamableHeaderAppLinks()}\n active='calendar'\n />\n\n <CalendarNav\n monthDate={monthDate}\n setViewingMonthDate={setMonthDate}\n appLinks={getCalendarAppLinks()}\n queryParams={props.queryParams}\n viewMode={viewMode}\n setViewMode={(viewMode: CalendarViewMode) => setMode({ viewMode })}\n >\n <div className='mx-n1 order-1 order-sm-0'>\n <SearchFilters\n queryParams={ObjectHelper.omit(props.queryParams, ['year'])}\n mainFilters={mainFilters}\n appLink={getAppLink()}\n isFetchingOptions={!availableTopics.data || !presentation.data || !audiences.data}\n alignResetButtonLeft\n hideDivider\n hideHeading\n hideCaret={false}\n />\n </div>\n </CalendarNav>\n <div className={`position-relative mt-3 ${viewMode === 'list' ? '' : 'mt-lg-0'}`}>\n <div className={`d-block ${viewMode === 'list' ? '' : 'd-lg-none'} position-absolute top-0 end-0 mt-2`}>\n <TimezoneIndicator />\n </div>\n <CalendarBody\n weekDays={weekDays}\n weekDaysHeader={weekDaysHeader}\n events={events}\n monthQuery={{ from: startDate?.toString(), to: endDate?.toString() }}\n viewingMonth={viewingMonth}\n eventsLoaded={loaded}\n presentationId={presentation.data?.id}\n appLinks={getCalendarAppLinks()}\n imageUrls={getCalendarImageUrls()}\n viewMode={viewMode}\n getActionLabel={livestream => getPhrase(getActionLabel(livestream as Livestream))}\n getBackgroundColor={(content: Livestream) => content.company.metadata?.colour}\n getBannerUrl={getBannerUrl}\n getIconUrl={getIconUrl}\n getStartTime={CalendarUtils.getStartTime}\n theme={{\n background: 'bg-light-green',\n border: 'border-light-green'\n }}\n emptyStateHeading={getEmptyStateHeading()}\n fadePastEvents\n timezone={Timezone.ET}\n isPastEvent={CalendarUtils.isPastEvent}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{n as e,t}from"./CFXUbsBS.chunk.js";import{t as n}from"./B7tm2CBz.chunk.js";import{t as r}from"./XBXkyvJG.chunk.js";import{d as i}from"./app-B1XBsz23.js";var a=new Date(`2023-01-01`),o=12;function s(e){let n=t.daysInMonth(e),r=[];for(let i=1;i<=n;i++){let n=t.set(e,`date`,i);r.push(Object.assign(n,{notCurrentMonth:!1}))}return r}function c(e,n){let r=t.startOf(e,`month`),i=t.getWeekday(r),a=[],o=n?i===0?6:i-1:i;for(let e=n?1:0;e<=o;e++){let n=r,o=t.weekday(n,i-e);a.push(Object.assign(o,{notCurrentMonth:!0}))}return a.reverse()}function l(e,n){let r=t.endOf(e,`month`),i=t.getWeekday(r),a=[],o=n?7-(i===0?7:i):7-i;for(let e=1;e<=o;e+=1){let n=t.add(r,e,`days`);a.push(Object.assign(n,{notCurrentMonth:!0}))}return a}function u(e){let n=e?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6],r=new Date;return n.map(e=>t.format(t.weekday(r,e),`ddd`))}function d(e,n){let r=[],i={},a=c(e,n).concat(s(e)).concat(l(e,n));for(let e=0,n=0;e<a.length;e+=7){let o=a.slice(e,e+7);o.forEach((e,r)=>{i[t.format(e,`YYYY-MM-DD`)]={row:n,col:r}}),r.push(o),n++}return{datePositionMap:i,weeksTable:r}}function f(e){let r=t.startOf(e,`month`);return t.getWeekday(r)===1?r:n.first(c(e,!0))}function p(e){let r=t.endOf(e,`month`);return t.getWeekday(r)===0?r:n.last(l(e,!0))}function m(e){return[f(e),p(e)]}function h(e){return e.charAt(0).toUpperCase()+e.slice(1)}function g(e){if(!e)return!0;let n=h(e);if(!t.formatIsValid(n,`MMMM-YYYY`,!0))return!1;let r=t.parseDateString(n,`MMMM-YYYY`);return t.isSame(r,a,`month`)||t.isAfter(r,a,`month`)}var _=new Date;function v(e){let n=t.diffBetween(t.startOf(e,`month`),t.startOf(_,`month`),`months`);return{showPrev:t.isAfter(e,a,`month`),showNext:n<o}}function y(e){if(!e)return t.parseDateString();let n=h(e);return t.parseDateString(n,`MMMM-YYYY`)}function b(e){let t=new Set;return e.filter(e=>t.has(e.specialEventId)?!1:(t.add(e.specialEventId),!0))}var x={getDisplayDate(n,a){return a?n.slice(5,7)===a.slice(5,7)?e.getCurrentRegion()===i[r.US]?`${t.format(n,`MMM`)} ${t.format(n,`D`)} - ${t.format(a,`D`)}`:`${t.format(n,`D`)} - ${t.format(a,`D`)} ${t.format(n,`MMM`)}`:`${t.format(n,`D MMM`)} - ${t.format(a,`D MMM`)}`:t.format(n,`D MMM`)},getEventsInMonth(e,n){return e.filter(e=>t.format(e.startDate,`YYYY-MM`)===t.format(n,`YYYY-MM`))},getOrdinalDate(e){return`${t.getLocalDateOrdinal(t.get(e,`date`))} ${t.format(e,`MMMM`)}`},isEventFromPreviousMonth(e,n){return e.endDate?t.format(e.startDate,`YYYY-MM`)<t.format(n,`YYYY-MM`)&&e.endDate>=t.format(n,`YYYY-MM-DD`):!1},getEventsForDay(e,n,r=[],i){let a=n.filter(n=>t.isSame(e,n.startDate))||[];return t.isSame(f(i),e,`day`)?b([...a,...r]):a},getCrossMonthEventsForDate(e,n,r){return t.isSame(f(r),e,`day`)?n.filter(n=>{let r=x.isEventFromPreviousMonth(n,e),i=t.isSame(e,n.startDate);return r&&!i}):[]},getAllEventsForDate(e,n,r){let i=t.format(e,`YYYY-MM-DD`),a=n.filter(e=>e.startDate===i),o=x.getCrossMonthEventsForDate(e,n,r);return b([...a,...o])}};export{g as a,m as i,d as n,u as o,v as r,y as s,x as t};
2
- //# sourceMappingURL=Dd8r1SE32.chunk.js.map
1
+ import{n as e,t}from"./CFXUbsBS.chunk.js";import{t as n}from"./B7tm2CBz.chunk.js";import{t as r}from"./XBXkyvJG.chunk.js";import{d as i}from"./app-BIigh9wv.js";var a=new Date(`2023-01-01`),o=12;function s(e){let n=t.daysInMonth(e),r=[];for(let i=1;i<=n;i++){let n=t.set(e,`date`,i);r.push(Object.assign(n,{notCurrentMonth:!1}))}return r}function c(e,n){let r=t.startOf(e,`month`),i=t.getWeekday(r),a=[],o=n?i===0?6:i-1:i;for(let e=n?1:0;e<=o;e++){let n=r,o=t.weekday(n,i-e);a.push(Object.assign(o,{notCurrentMonth:!0}))}return a.reverse()}function l(e,n){let r=t.endOf(e,`month`),i=t.getWeekday(r),a=[],o=n?7-(i===0?7:i):7-i;for(let e=1;e<=o;e+=1){let n=t.add(r,e,`days`);a.push(Object.assign(n,{notCurrentMonth:!0}))}return a}function u(e){let n=e?[1,2,3,4,5,6,0]:[0,1,2,3,4,5,6],r=new Date;return n.map(e=>t.format(t.weekday(r,e),`ddd`))}function d(e,n){let r=[],i={},a=c(e,n).concat(s(e)).concat(l(e,n));for(let e=0,n=0;e<a.length;e+=7){let o=a.slice(e,e+7);o.forEach((e,r)=>{i[t.format(e,`YYYY-MM-DD`)]={row:n,col:r}}),r.push(o),n++}return{datePositionMap:i,weeksTable:r}}function f(e){let r=t.startOf(e,`month`);return t.getWeekday(r)===1?r:n.first(c(e,!0))}function p(e){let r=t.endOf(e,`month`);return t.getWeekday(r)===0?r:n.last(l(e,!0))}function m(e){return[f(e),p(e)]}function h(e){return e.charAt(0).toUpperCase()+e.slice(1)}function g(e){if(!e)return!0;let n=h(e);if(!t.formatIsValid(n,`MMMM-YYYY`,!0))return!1;let r=t.parseDateString(n,`MMMM-YYYY`);return t.isSame(r,a,`month`)||t.isAfter(r,a,`month`)}var _=new Date;function v(e){let n=t.diffBetween(t.startOf(e,`month`),t.startOf(_,`month`),`months`);return{showPrev:t.isAfter(e,a,`month`),showNext:n<o}}function y(e){if(!e)return t.parseDateString();let n=h(e);return t.parseDateString(n,`MMMM-YYYY`)}function b(e){let t=new Set;return e.filter(e=>t.has(e.specialEventId)?!1:(t.add(e.specialEventId),!0))}var x={getDisplayDate(n,a){return a?n.slice(5,7)===a.slice(5,7)?e.getCurrentRegion()===i[r.US]?`${t.format(n,`MMM`)} ${t.format(n,`D`)} - ${t.format(a,`D`)}`:`${t.format(n,`D`)} - ${t.format(a,`D`)} ${t.format(n,`MMM`)}`:`${t.format(n,`D MMM`)} - ${t.format(a,`D MMM`)}`:t.format(n,`D MMM`)},getEventsInMonth(e,n){return e.filter(e=>t.format(e.startDate,`YYYY-MM`)===t.format(n,`YYYY-MM`))},getOrdinalDate(e){return`${t.getLocalDateOrdinal(t.get(e,`date`))} ${t.format(e,`MMMM`)}`},isEventFromPreviousMonth(e,n){return e.endDate?t.format(e.startDate,`YYYY-MM`)<t.format(n,`YYYY-MM`)&&e.endDate>=t.format(n,`YYYY-MM-DD`):!1},getEventsForDay(e,n,r=[],i){let a=n.filter(n=>t.isSame(e,n.startDate))||[];return t.isSame(f(i),e,`day`)?b([...a,...r]):a},getCrossMonthEventsForDate(e,n,r){return t.isSame(f(r),e,`day`)?n.filter(n=>{let r=x.isEventFromPreviousMonth(n,e),i=t.isSame(e,n.startDate);return r&&!i}):[]},getAllEventsForDate(e,n,r){let i=t.format(e,`YYYY-MM-DD`),a=n.filter(e=>e.startDate===i),o=x.getCrossMonthEventsForDate(e,n,r);return b([...a,...o])}};export{g as a,m as i,d as n,u as o,v as r,y as s,x as t};
2
+ //# sourceMappingURL=BsAo7Lri2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dd8r1SE32.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/utils/CalendarHelper.ts","../../../../libs/shared/src/apps/calendar/utils/SpecialEventHelper.ts"],"sourcesContent":["/**\n * Inspired by nghilevi/moment-calendar-2\n */\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nexport type PatchedDate = Date & { notCurrentMonth: boolean };\nexport type WeeksTable = PatchedDate[][];\nexport type DatePositionMap = Record<string, { row: number, col: number }>;\n\nconst CALENDAR_START_DATE = new Date('2023-01-01');\nconst NEXT_MONTH_LIMIT = 12; // in month\n\nfunction getDaysOfMonth(date: Date): PatchedDate[] {\n const numberOfDays = DateHelper.daysInMonth(date);\n\n const daysArray = [];\n\n for (let i = 1; i <= numberOfDays; i++) {\n const day = DateHelper.set(date, 'date', i);\n daysArray.push(Object.assign(day, { notCurrentMonth: false }));\n }\n\n return daysArray;\n}\n\n// Get days from previous month overlapping current month\nfunction getPreviousMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const firstDay = DateHelper.startOf(date, 'month');\n const firstWeekDay = DateHelper.getWeekday(firstDay);\n const prevMonthDays = [];\n const prevMonthDaysCount = startAtMon ? firstWeekDay === 0 ? 6 : firstWeekDay - 1 : firstWeekDay;\n\n for (let i = startAtMon ? 1 : 0; i <= prevMonthDaysCount; i++) {\n const originalDay = firstDay;\n const preDay = DateHelper.weekday(originalDay, firstWeekDay - i);\n prevMonthDays.push(Object.assign(preDay, { notCurrentMonth: true }));\n }\n\n return prevMonthDays.reverse();\n}\n\n// Get days from previous month overlapping current month\nfunction getNextMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const lastDay = DateHelper.endOf(date, 'month');\n const lastWeekDay = DateHelper.getWeekday(lastDay);\n const nextMonthDays = [];\n const nextMonthDaysCount = startAtMon ? 7 - (lastWeekDay === 0 ? 7 : lastWeekDay) : 7 - lastWeekDay;\n\n for (let i = 1; i <= nextMonthDaysCount; i += 1) {\n const nextDay = DateHelper.add(lastDay, i, 'days');\n nextMonthDays.push(Object.assign(nextDay, { notCurrentMonth: true }));\n }\n\n return nextMonthDays;\n}\n\nexport function initWeekDays(startAtMon: boolean): string[] {\n const weekdays = startAtMon ? [ 1, 2, 3, 4, 5, 6, 0 ] : [ 0, 1, 2, 3, 4, 5, 6 ];\n const date = new Date();\n return weekdays.map(w => DateHelper.format(DateHelper.weekday(date, w), 'ddd'));\n}\n\nexport function buildWeeksTable(date: Date, startAtMon: boolean) {\n const weeksTable: WeeksTable = [];\n const datePositionMap: DatePositionMap = {};\n\n const monthDays = getPreviousMonthOverlappingDays(date, startAtMon)\n .concat(getDaysOfMonth(date))\n .concat(getNextMonthOverlappingDays(date, startAtMon));\n\n for (let j = 0, rowId = 0; j < monthDays.length; j = j + 7) {\n const week = monthDays.slice(j, j + 7);\n week.forEach((day, colId) => {\n datePositionMap[DateHelper.format(day, 'YYYY-MM-DD')] = { row: rowId, col: colId };\n });\n\n weeksTable.push(week);\n rowId++;\n }\n\n return {\n datePositionMap,\n weeksTable\n };\n}\n\nexport function getFirstCellInCalendar(monthDate: Date) {\n const firstDayOfMonth = DateHelper.startOf(monthDate, 'month');\n if (DateHelper.getWeekday(firstDayOfMonth) === 1) {\n return firstDayOfMonth;\n }\n return ArrayHelper.first(getPreviousMonthOverlappingDays(monthDate, true));\n}\n\nfunction getLastCellInCalendar(monthDate: Date) {\n const lastDayOfMonth = DateHelper.endOf(monthDate, 'month');\n if (DateHelper.getWeekday(lastDayOfMonth) === 0) {\n return lastDayOfMonth;\n }\n return ArrayHelper.last(getNextMonthOverlappingDays(monthDate, true));\n}\n\nexport function getCalendarRange(monthDate: Date) {\n return [ getFirstCellInCalendar(monthDate), getLastCellInCalendar(monthDate) ];\n}\n\nfunction capitalizeMonthString(monthStr: string) {\n return monthStr.charAt(0).toUpperCase() + monthStr.slice(1);\n}\n\nexport function getIsValidMonth(monthDateString: string) {\n if (!monthDateString)\n return true;\n const capitalized = capitalizeMonthString(monthDateString);\n const isValidMonthString = DateHelper.formatIsValid(capitalized, 'MMMM-YYYY', true);\n\n if (!isValidMonthString)\n return false;\n\n const monthDate = DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n\n return DateHelper.isSame(monthDate, CALENDAR_START_DATE, 'month') || DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n}\n\nconst CUR_DATE = new Date();\nexport function canNavToOtherMonths(monthDate: Date) {\n const monthDiff = DateHelper.diffBetween(DateHelper.startOf(monthDate, 'month'), DateHelper.startOf(CUR_DATE, 'month'), 'months');\n const showPrev = DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n const showNext = monthDiff < NEXT_MONTH_LIMIT;\n return { showPrev, showNext };\n}\n\nexport function parseMonthString(monthStr: string) {\n if (!monthStr)\n return DateHelper.parseDateString();\n\n const capitalized = capitalizeMonthString(monthStr);\n return DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n}\n","import { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { RegionDateFormatHelper } from 'libs/common/react/utils/RegionDateFormatHelper';\n\nimport { getFirstCellInCalendar } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { COMMON_REGION_MAP } from 'libs/shared/constants/CommonRegionMap';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nfunction deduplicateEvents(events: CalendarEvent<CalendarEventContent>[]): CalendarEvent<CalendarEventContent>[] {\n const seen = new Set<string>();\n return events.filter(event => {\n if (seen.has(event.specialEventId)) {\n return false;\n }\n seen.add(event.specialEventId);\n return true;\n });\n}\n\nexport const SpecialEventHelper = {\n getDisplayDate(startDate: string, endDate: string): string {\n if (!endDate)\n // one day event\n return DateHelper.format(startDate, 'D MMM');\n\n if (startDate.slice(5, 7) !== endDate.slice(5, 7))\n // span across months\n return `${DateHelper.format(startDate, 'D MMM')} - ${DateHelper.format(endDate, 'D MMM')}`;\n // same month event\n\n if (RegionDateFormatHelper.getCurrentRegion() === COMMON_REGION_MAP[InstanceRegion.US])\n return `${DateHelper.format(startDate, 'MMM')} ${DateHelper.format(startDate, 'D')} - ${DateHelper.format(endDate, 'D')}`;\n\n return `${DateHelper.format(startDate, 'D')} - ${DateHelper.format(endDate, 'D')} ${DateHelper.format(startDate, 'MMM')}`;\n },\n\n getEventsInMonth(calendarEvents: CalendarEvent[], month: Date) {\n return calendarEvents.filter(e => DateHelper.format(e.startDate, 'YYYY-MM') === DateHelper.format(month, 'YYYY-MM'));\n },\n\n getOrdinalDate(date: string): string {\n return `${DateHelper.getLocalDateOrdinal(DateHelper.get(date, 'date'))} ${DateHelper.format(date, 'MMMM')}`;\n },\n\n isEventFromPreviousMonth(event: CalendarEvent<CalendarEventContent>, month: Date): boolean {\n if (!event.endDate) return false;\n\n const eventStartMonth = DateHelper.format(event.startDate, 'YYYY-MM');\n const targetMonth = DateHelper.format(month, 'YYYY-MM');\n\n return eventStartMonth < targetMonth && event.endDate >= DateHelper.format(month, 'YYYY-MM-DD');\n },\n\n getEventsForDay(\n date: Date,\n allEvents: CalendarEvent<CalendarEventContent>[],\n crossMonthEventsForFirstDay: CalendarEvent<CalendarEventContent>[] = [],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const eventsStartingOnDay = allEvents.filter(e => DateHelper.isSame(date, e.startDate)) || [];\n const isFirstCellOfCalendar = DateHelper.isSame(getFirstCellInCalendar(monthDate), date, 'day');\n\n if (isFirstCellOfCalendar) {\n return deduplicateEvents([ ...eventsStartingOnDay, ...crossMonthEventsForFirstDay ]);\n }\n\n return eventsStartingOnDay;\n },\n\n getCrossMonthEventsForDate(\n date: Date,\n allEvents: CalendarEvent<CalendarEventContent>[],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const isFirstCellOfCalendar = DateHelper.isSame(getFirstCellInCalendar(monthDate), date, 'day');\n if (!isFirstCellOfCalendar) return [];\n\n return allEvents.filter(e => {\n const isFromPreviousMonth = SpecialEventHelper.isEventFromPreviousMonth(e, date);\n // Only include if the event's start date is not the same as the target date\n const startDateIsSameDay = DateHelper.isSame(date, e.startDate);\n return isFromPreviousMonth && !startDateIsSameDay;\n });\n },\n\n getAllEventsForDate(\n date: Date,\n allEvents: CalendarEvent[],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const dateStr = DateHelper.format(date, 'YYYY-MM-DD');\n const eventsStartingOnDay = allEvents.filter(e => e.startDate === dateStr);\n const crossMonthEvents = SpecialEventHelper.getCrossMonthEventsForDate(date, allEvents, monthDate);\n\n return deduplicateEvents([ ...eventsStartingOnDay, ...crossMonthEvents ]);\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BsAo7Lri2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/utils/CalendarHelper.ts","../../../../libs/shared/src/apps/calendar/utils/SpecialEventHelper.ts"],"sourcesContent":["/**\n * Inspired by nghilevi/moment-calendar-2\n */\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nexport type PatchedDate = Date & { notCurrentMonth: boolean };\nexport type WeeksTable = PatchedDate[][];\nexport type DatePositionMap = Record<string, { row: number, col: number }>;\n\nconst CALENDAR_START_DATE = new Date('2023-01-01');\nconst NEXT_MONTH_LIMIT = 12; // in month\n\nfunction getDaysOfMonth(date: Date): PatchedDate[] {\n const numberOfDays = DateHelper.daysInMonth(date);\n\n const daysArray = [];\n\n for (let i = 1; i <= numberOfDays; i++) {\n const day = DateHelper.set(date, 'date', i);\n daysArray.push(Object.assign(day, { notCurrentMonth: false }));\n }\n\n return daysArray;\n}\n\n// Get days from previous month overlapping current month\nfunction getPreviousMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const firstDay = DateHelper.startOf(date, 'month');\n const firstWeekDay = DateHelper.getWeekday(firstDay);\n const prevMonthDays = [];\n const prevMonthDaysCount = startAtMon ? firstWeekDay === 0 ? 6 : firstWeekDay - 1 : firstWeekDay;\n\n for (let i = startAtMon ? 1 : 0; i <= prevMonthDaysCount; i++) {\n const originalDay = firstDay;\n const preDay = DateHelper.weekday(originalDay, firstWeekDay - i);\n prevMonthDays.push(Object.assign(preDay, { notCurrentMonth: true }));\n }\n\n return prevMonthDays.reverse();\n}\n\n// Get days from previous month overlapping current month\nfunction getNextMonthOverlappingDays(date: Date, startAtMon: boolean): PatchedDate[] {\n const lastDay = DateHelper.endOf(date, 'month');\n const lastWeekDay = DateHelper.getWeekday(lastDay);\n const nextMonthDays = [];\n const nextMonthDaysCount = startAtMon ? 7 - (lastWeekDay === 0 ? 7 : lastWeekDay) : 7 - lastWeekDay;\n\n for (let i = 1; i <= nextMonthDaysCount; i += 1) {\n const nextDay = DateHelper.add(lastDay, i, 'days');\n nextMonthDays.push(Object.assign(nextDay, { notCurrentMonth: true }));\n }\n\n return nextMonthDays;\n}\n\nexport function initWeekDays(startAtMon: boolean): string[] {\n const weekdays = startAtMon ? [ 1, 2, 3, 4, 5, 6, 0 ] : [ 0, 1, 2, 3, 4, 5, 6 ];\n const date = new Date();\n return weekdays.map(w => DateHelper.format(DateHelper.weekday(date, w), 'ddd'));\n}\n\nexport function buildWeeksTable(date: Date, startAtMon: boolean) {\n const weeksTable: WeeksTable = [];\n const datePositionMap: DatePositionMap = {};\n\n const monthDays = getPreviousMonthOverlappingDays(date, startAtMon)\n .concat(getDaysOfMonth(date))\n .concat(getNextMonthOverlappingDays(date, startAtMon));\n\n for (let j = 0, rowId = 0; j < monthDays.length; j = j + 7) {\n const week = monthDays.slice(j, j + 7);\n week.forEach((day, colId) => {\n datePositionMap[DateHelper.format(day, 'YYYY-MM-DD')] = { row: rowId, col: colId };\n });\n\n weeksTable.push(week);\n rowId++;\n }\n\n return {\n datePositionMap,\n weeksTable\n };\n}\n\nexport function getFirstCellInCalendar(monthDate: Date) {\n const firstDayOfMonth = DateHelper.startOf(monthDate, 'month');\n if (DateHelper.getWeekday(firstDayOfMonth) === 1) {\n return firstDayOfMonth;\n }\n return ArrayHelper.first(getPreviousMonthOverlappingDays(monthDate, true));\n}\n\nfunction getLastCellInCalendar(monthDate: Date) {\n const lastDayOfMonth = DateHelper.endOf(monthDate, 'month');\n if (DateHelper.getWeekday(lastDayOfMonth) === 0) {\n return lastDayOfMonth;\n }\n return ArrayHelper.last(getNextMonthOverlappingDays(monthDate, true));\n}\n\nexport function getCalendarRange(monthDate: Date) {\n return [ getFirstCellInCalendar(monthDate), getLastCellInCalendar(monthDate) ];\n}\n\nfunction capitalizeMonthString(monthStr: string) {\n return monthStr.charAt(0).toUpperCase() + monthStr.slice(1);\n}\n\nexport function getIsValidMonth(monthDateString: string) {\n if (!monthDateString)\n return true;\n const capitalized = capitalizeMonthString(monthDateString);\n const isValidMonthString = DateHelper.formatIsValid(capitalized, 'MMMM-YYYY', true);\n\n if (!isValidMonthString)\n return false;\n\n const monthDate = DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n\n return DateHelper.isSame(monthDate, CALENDAR_START_DATE, 'month') || DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n}\n\nconst CUR_DATE = new Date();\nexport function canNavToOtherMonths(monthDate: Date) {\n const monthDiff = DateHelper.diffBetween(DateHelper.startOf(monthDate, 'month'), DateHelper.startOf(CUR_DATE, 'month'), 'months');\n const showPrev = DateHelper.isAfter(monthDate, CALENDAR_START_DATE, 'month');\n const showNext = monthDiff < NEXT_MONTH_LIMIT;\n return { showPrev, showNext };\n}\n\nexport function parseMonthString(monthStr: string) {\n if (!monthStr)\n return DateHelper.parseDateString();\n\n const capitalized = capitalizeMonthString(monthStr);\n return DateHelper.parseDateString(capitalized, 'MMMM-YYYY');\n}\n","import { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { RegionDateFormatHelper } from 'libs/common/react/utils/RegionDateFormatHelper';\n\nimport { getFirstCellInCalendar } from 'libs/shared/apps/calendar/utils/CalendarHelper';\nimport { COMMON_REGION_MAP } from 'libs/shared/constants/CommonRegionMap';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nfunction deduplicateEvents(events: CalendarEvent<CalendarEventContent>[]): CalendarEvent<CalendarEventContent>[] {\n const seen = new Set<string>();\n return events.filter(event => {\n if (seen.has(event.specialEventId)) {\n return false;\n }\n seen.add(event.specialEventId);\n return true;\n });\n}\n\nexport const SpecialEventHelper = {\n getDisplayDate(startDate: string, endDate: string): string {\n if (!endDate)\n // one day event\n return DateHelper.format(startDate, 'D MMM');\n\n if (startDate.slice(5, 7) !== endDate.slice(5, 7))\n // span across months\n return `${DateHelper.format(startDate, 'D MMM')} - ${DateHelper.format(endDate, 'D MMM')}`;\n // same month event\n\n if (RegionDateFormatHelper.getCurrentRegion() === COMMON_REGION_MAP[InstanceRegion.US])\n return `${DateHelper.format(startDate, 'MMM')} ${DateHelper.format(startDate, 'D')} - ${DateHelper.format(endDate, 'D')}`;\n\n return `${DateHelper.format(startDate, 'D')} - ${DateHelper.format(endDate, 'D')} ${DateHelper.format(startDate, 'MMM')}`;\n },\n\n getEventsInMonth(calendarEvents: CalendarEvent[], month: Date) {\n return calendarEvents.filter(e => DateHelper.format(e.startDate, 'YYYY-MM') === DateHelper.format(month, 'YYYY-MM'));\n },\n\n getOrdinalDate(date: string): string {\n return `${DateHelper.getLocalDateOrdinal(DateHelper.get(date, 'date'))} ${DateHelper.format(date, 'MMMM')}`;\n },\n\n isEventFromPreviousMonth(event: CalendarEvent<CalendarEventContent>, month: Date): boolean {\n if (!event.endDate) return false;\n\n const eventStartMonth = DateHelper.format(event.startDate, 'YYYY-MM');\n const targetMonth = DateHelper.format(month, 'YYYY-MM');\n\n return eventStartMonth < targetMonth && event.endDate >= DateHelper.format(month, 'YYYY-MM-DD');\n },\n\n getEventsForDay(\n date: Date,\n allEvents: CalendarEvent<CalendarEventContent>[],\n crossMonthEventsForFirstDay: CalendarEvent<CalendarEventContent>[] = [],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const eventsStartingOnDay = allEvents.filter(e => DateHelper.isSame(date, e.startDate)) || [];\n const isFirstCellOfCalendar = DateHelper.isSame(getFirstCellInCalendar(monthDate), date, 'day');\n\n if (isFirstCellOfCalendar) {\n return deduplicateEvents([ ...eventsStartingOnDay, ...crossMonthEventsForFirstDay ]);\n }\n\n return eventsStartingOnDay;\n },\n\n getCrossMonthEventsForDate(\n date: Date,\n allEvents: CalendarEvent<CalendarEventContent>[],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const isFirstCellOfCalendar = DateHelper.isSame(getFirstCellInCalendar(monthDate), date, 'day');\n if (!isFirstCellOfCalendar) return [];\n\n return allEvents.filter(e => {\n const isFromPreviousMonth = SpecialEventHelper.isEventFromPreviousMonth(e, date);\n // Only include if the event's start date is not the same as the target date\n const startDateIsSameDay = DateHelper.isSame(date, e.startDate);\n return isFromPreviousMonth && !startDateIsSameDay;\n });\n },\n\n getAllEventsForDate(\n date: Date,\n allEvents: CalendarEvent[],\n monthDate: Date\n ): CalendarEvent<CalendarEventContent>[] {\n const dateStr = DateHelper.format(date, 'YYYY-MM-DD');\n const eventsStartingOnDay = allEvents.filter(e => e.startDate === dateStr);\n const crossMonthEvents = SpecialEventHelper.getCrossMonthEventsForDate(date, allEvents, monthDate);\n\n return deduplicateEvents([ ...eventsStartingOnDay, ...crossMonthEvents ]);\n }\n};\n"],"mappings":"gKAUA,IAAM,EAAsB,IAAI,KAAK,aAAa,CAC5C,EAAmB,GAEzB,SAAS,EAAe,EAA2B,CACjD,IAAM,EAAe,EAAW,YAAY,EAAK,CAE3C,EAAY,EAAE,CAEpB,IAAK,IAAI,EAAI,EAAG,GAAK,EAAc,IAAK,CACtC,IAAM,EAAM,EAAW,IAAI,EAAM,OAAQ,EAAE,CAC3C,EAAU,KAAK,OAAO,OAAO,EAAK,CAAE,gBAAiB,GAAO,CAAC,CAAC,CAGhE,OAAO,EAIT,SAAS,EAAgC,EAAY,EAAoC,CACvF,IAAM,EAAW,EAAW,QAAQ,EAAM,QAAQ,CAC5C,EAAe,EAAW,WAAW,EAAS,CAC9C,EAAgB,EAAE,CAClB,EAAqB,EAAa,IAAiB,EAAI,EAAI,EAAe,EAAI,EAEpF,IAAK,IAAI,EAAI,EAAa,EAAI,EAAG,GAAK,EAAoB,IAAK,CAC7D,IAAM,EAAc,EACd,EAAS,EAAW,QAAQ,EAAa,EAAe,EAAE,CAChE,EAAc,KAAK,OAAO,OAAO,EAAQ,CAAE,gBAAiB,GAAM,CAAC,CAAC,CAGtE,OAAO,EAAc,SAAS,CAIhC,SAAS,EAA4B,EAAY,EAAoC,CACnF,IAAM,EAAU,EAAW,MAAM,EAAM,QAAQ,CACzC,EAAc,EAAW,WAAW,EAAQ,CAC5C,EAAgB,EAAE,CAClB,EAAqB,EAAa,GAAK,IAAgB,EAAI,EAAI,GAAe,EAAI,EAExF,IAAK,IAAI,EAAI,EAAG,GAAK,EAAoB,GAAK,EAAG,CAC/C,IAAM,EAAU,EAAW,IAAI,EAAS,EAAG,OAAO,CAClD,EAAc,KAAK,OAAO,OAAO,EAAS,CAAE,gBAAiB,GAAM,CAAC,CAAC,CAGvE,OAAO,EAGT,SAAgB,EAAa,EAA+B,CAC1D,IAAM,EAAW,EAAa,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACzE,EAAO,IAAI,KACjB,OAAO,EAAS,IAAI,GAAK,EAAW,OAAO,EAAW,QAAQ,EAAM,EAAE,CAAE,MAAM,CAAC,CAGjF,SAAgB,EAAgB,EAAY,EAAqB,CAC/D,IAAM,EAAyB,EAAE,CAC3B,EAAmC,EAAE,CAErC,EAAY,EAAgC,EAAM,EAAW,CAChE,OAAO,EAAe,EAAK,CAAC,CAC5B,OAAO,EAA4B,EAAM,EAAW,CAAC,CAExD,IAAK,IAAI,EAAI,EAAG,EAAQ,EAAG,EAAI,EAAU,OAAQ,GAAQ,EAAG,CAC1D,IAAM,EAAO,EAAU,MAAM,EAAG,EAAI,EAAE,CACtC,EAAK,SAAS,EAAK,IAAU,CAC3B,EAAgB,EAAW,OAAO,EAAK,aAAa,EAAI,CAAE,IAAK,EAAO,IAAK,EAAO,EAClF,CAEF,EAAW,KAAK,EAAK,CACrB,IAGF,MAAO,CACL,kBACA,aACD,CAGH,SAAgB,EAAuB,EAAiB,CACtD,IAAM,EAAkB,EAAW,QAAQ,EAAW,QAAQ,CAI9D,OAHI,EAAW,WAAW,EAAgB,GAAK,EACtC,EAEF,EAAY,MAAM,EAAgC,EAAW,GAAK,CAAC,CAG5E,SAAS,EAAsB,EAAiB,CAC9C,IAAM,EAAiB,EAAW,MAAM,EAAW,QAAQ,CAI3D,OAHI,EAAW,WAAW,EAAe,GAAK,EACrC,EAEF,EAAY,KAAK,EAA4B,EAAW,GAAK,CAAC,CAGvE,SAAgB,EAAiB,EAAiB,CAChD,MAAO,CAAE,EAAuB,EAAU,CAAE,EAAsB,EAAU,CAAE,CAGhF,SAAS,EAAsB,EAAkB,CAC/C,OAAO,EAAS,OAAO,EAAE,CAAC,aAAa,CAAG,EAAS,MAAM,EAAE,CAG7D,SAAgB,EAAgB,EAAyB,CACvD,GAAI,CAAC,EACH,MAAO,GACT,IAAM,EAAc,EAAsB,EAAgB,CAG1D,GAAI,CAFuB,EAAW,cAAc,EAAa,YAAa,GAAK,CAGjF,MAAO,GAET,IAAM,EAAY,EAAW,gBAAgB,EAAa,YAAY,CAEtE,OAAO,EAAW,OAAO,EAAW,EAAqB,QAAQ,EAAI,EAAW,QAAQ,EAAW,EAAqB,QAAQ,CAGlI,IAAM,EAAW,IAAI,KACrB,SAAgB,EAAoB,EAAiB,CACnD,IAAM,EAAY,EAAW,YAAY,EAAW,QAAQ,EAAW,QAAQ,CAAE,EAAW,QAAQ,EAAU,QAAQ,CAAE,SAAS,CAGjI,MAAO,CAAE,SAFQ,EAAW,QAAQ,EAAW,EAAqB,QAAQ,CAEzD,SADF,EAAY,EACA,CAG/B,SAAgB,EAAiB,EAAkB,CACjD,GAAI,CAAC,EACH,OAAO,EAAW,iBAAiB,CAErC,IAAM,EAAc,EAAsB,EAAS,CACnD,OAAO,EAAW,gBAAgB,EAAa,YAAY,CClI7D,SAAS,EAAkB,EAAsF,CAC/G,IAAM,EAAO,IAAI,IACjB,OAAO,EAAO,OAAO,GACf,EAAK,IAAI,EAAM,eAAe,CACzB,IAET,EAAK,IAAI,EAAM,eAAe,CACvB,IACP,CAGJ,IAAa,EAAqB,CAChC,eAAe,EAAmB,EAAyB,CAazD,OAZK,EAID,EAAU,MAAM,EAAG,EAAE,GAAK,EAAQ,MAAM,EAAG,EAAE,CAK7C,EAAuB,kBAAkB,GAAK,EAAkB,EAAe,IAC1E,GAAG,EAAW,OAAO,EAAW,MAAM,CAAC,GAAG,EAAW,OAAO,EAAW,IAAI,CAAC,KAAK,EAAW,OAAO,EAAS,IAAI,GAElH,GAAG,EAAW,OAAO,EAAW,IAAI,CAAC,KAAK,EAAW,OAAO,EAAS,IAAI,CAAC,GAAG,EAAW,OAAO,EAAW,MAAM,GAN9G,GAAG,EAAW,OAAO,EAAW,QAAQ,CAAC,KAAK,EAAW,OAAO,EAAS,QAAQ,GAJjF,EAAW,OAAO,EAAW,QAAQ,EAahD,iBAAiB,EAAiC,EAAa,CAC7D,OAAO,EAAe,OAAO,GAAK,EAAW,OAAO,EAAE,UAAW,UAAU,GAAK,EAAW,OAAO,EAAO,UAAU,CAAC,EAGtH,eAAe,EAAsB,CACnC,MAAO,GAAG,EAAW,oBAAoB,EAAW,IAAI,EAAM,OAAO,CAAC,CAAC,GAAG,EAAW,OAAO,EAAM,OAAO,IAG3G,yBAAyB,EAA4C,EAAsB,CAMzF,OALK,EAAM,QAEa,EAAW,OAAO,EAAM,UAAW,UAAU,CACjD,EAAW,OAAO,EAAO,UAAU,EAEf,EAAM,SAAW,EAAW,OAAO,EAAO,aAAa,CALpE,IAQ7B,gBACE,EACA,EACA,EAAqE,EAAE,CACvE,EACuC,CACvC,IAAM,EAAsB,EAAU,OAAO,GAAK,EAAW,OAAO,EAAM,EAAE,UAAU,CAAC,EAAI,EAAE,CAO7F,OAN8B,EAAW,OAAO,EAAuB,EAAU,CAAE,EAAM,MAAM,CAGtF,EAAkB,CAAE,GAAG,EAAqB,GAAG,EAA6B,CAAC,CAG/E,GAGT,2BACE,EACA,EACA,EACuC,CAIvC,OAH8B,EAAW,OAAO,EAAuB,EAAU,CAAE,EAAM,MAAM,CAGxF,EAAU,OAAO,GAAK,CAC3B,IAAM,EAAsB,EAAmB,yBAAyB,EAAG,EAAK,CAE1E,EAAqB,EAAW,OAAO,EAAM,EAAE,UAAU,CAC/D,OAAO,GAAuB,CAAC,GAC/B,CAPiC,EAAE,EAUvC,oBACE,EACA,EACA,EACuC,CACvC,IAAM,EAAU,EAAW,OAAO,EAAM,aAAa,CAC/C,EAAsB,EAAU,OAAO,GAAK,EAAE,YAAc,EAAQ,CACpE,EAAmB,EAAmB,2BAA2B,EAAM,EAAW,EAAU,CAElG,OAAO,EAAkB,CAAE,GAAG,EAAqB,GAAG,EAAkB,CAAC,EAE5E"}