@clickview/lite 0.82.3 → 0.83.0-rc.0

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 (143) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/languages/en.json +1 -1
  3. package/dist/scripts/1074-fdce06d863-lite.chunk.js +2 -0
  4. package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +1 -0
  5. package/dist/scripts/{1199-da55d69853-lite.chunk.js → 1199-01cc084886-lite.chunk.js} +1 -1
  6. package/dist/scripts/{1199-da55d69853-lite.chunk.js.map → 1199-01cc084886-lite.chunk.js.map} +1 -1
  7. package/dist/scripts/{2664-87c8cbfa7f-lite.chunk.js → 2664-907153c03b-lite.chunk.js} +2 -2
  8. package/dist/scripts/2664-907153c03b-lite.chunk.js.map +1 -0
  9. package/dist/scripts/2970-024b1dd55d-lite.chunk.js +2 -0
  10. package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +1 -0
  11. package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 3392-f7f8cb65e5-lite.chunk.js} +3 -3
  12. package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/3840-59e5e53cda-lite.chunk.js +2 -0
  14. package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{4177-285ddf9ae3-lite.chunk.js → 4177-2d876c7b14-lite.chunk.js} +2 -2
  16. package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +1 -0
  17. package/dist/scripts/{1336-1826f6e582-lite.chunk.js → 4208-0706461da6-lite.chunk.js} +2 -2
  18. package/dist/scripts/4208-0706461da6-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{4578-7578bcf17a-lite.chunk.js → 4578-27028d26eb-lite.chunk.js} +2 -2
  20. package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +1 -0
  21. package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +2 -0
  22. package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{4621-1f79d94416-lite.chunk.js → 4621-7fb0a05bcb-lite.chunk.js} +2 -2
  24. package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +1 -0
  25. package/dist/scripts/4806-a6f31d703c-lite.chunk.js +2 -0
  26. package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +1 -0
  27. package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js → 4948-ba684e5f4f-lite.chunk.js} +1 -1
  28. package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js.map → 4948-ba684e5f4f-lite.chunk.js.map} +1 -1
  29. package/dist/scripts/4985-7e02d5df40-lite.chunk.js +2 -0
  30. package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +1 -0
  31. package/dist/scripts/{5554-17bb3b86fc-lite.chunk.js → 5554-f1f3baf822-lite.chunk.js} +2 -2
  32. package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +1 -0
  33. package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +2 -0
  34. package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +2 -0
  36. package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +1 -0
  37. package/dist/scripts/{6909-a9b8930e37-lite.chunk.js → 6909-ba75701156-lite.chunk.js} +2 -2
  38. package/dist/scripts/6909-ba75701156-lite.chunk.js.map +1 -0
  39. package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +2 -0
  40. package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +1 -0
  41. package/dist/scripts/7568-55e9b01367-lite.chunk.js +3 -0
  42. package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +1 -0
  43. package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-211f084b70-lite.chunk.js} +2 -2
  44. package/dist/scripts/7617-211f084b70-lite.chunk.js.map +1 -0
  45. package/dist/scripts/7742-514844bd1a-lite.chunk.js +2 -0
  46. package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +1 -0
  47. package/dist/scripts/7843-cbebf1a786-lite.chunk.js +2 -0
  48. package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +1 -0
  49. package/dist/scripts/8077-870bd8e245-lite.chunk.js +3 -0
  50. package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +1 -0
  51. package/dist/scripts/843-4dbc5df109-lite.chunk.js +3 -0
  52. package/dist/scripts/843-4dbc5df109-lite.chunk.js.LICENSE.txt +1 -0
  53. package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +1 -0
  54. package/dist/scripts/8735-e74a148502-lite.chunk.js +2 -0
  55. package/dist/scripts/8735-e74a148502-lite.chunk.js.map +1 -0
  56. package/dist/scripts/8856-2d332952ae-lite.chunk.js +2 -0
  57. package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +1 -0
  58. package/dist/scripts/904-2784e45cfc-lite.chunk.js +2 -0
  59. package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +1 -0
  60. package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js → 9042-fd7e79b891-lite.chunk.js} +1 -1
  61. package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js.map → 9042-fd7e79b891-lite.chunk.js.map} +1 -1
  62. package/dist/scripts/9295-eb130a0b17-lite.chunk.js +2 -0
  63. package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +1 -0
  64. package/dist/scripts/9528-4e954d9dff-lite.chunk.js +2 -0
  65. package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{9742-5f99d74bb0-lite.chunk.js → 9742-3f6b75484a-lite.chunk.js} +2 -2
  67. package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +1 -0
  68. package/dist/scripts/979-6a70a0e616-lite.chunk.js +2 -0
  69. package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{3612-8c6423bd51-lite.chunk.js → 9911-8892b6dbfe-lite.chunk.js} +2 -2
  71. package/dist/scripts/{3612-8c6423bd51-lite.chunk.js.map → 9911-8892b6dbfe-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/bundle-f926852f33.min.js +3 -0
  73. package/dist/scripts/{bundle-610971c0fb.min.js.map → bundle-f926852f33.min.js.map} +1 -1
  74. package/package.json +1 -1
  75. package/dist/css/2074-lite-ac8da6c78b.chunk.css +0 -4
  76. package/dist/scripts/1202-d96ad80884-lite.chunk.js +0 -2
  77. package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +0 -1
  78. package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +0 -1
  79. package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
  80. package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
  81. package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +0 -1
  82. package/dist/scripts/2888-2596e106a5-lite.chunk.js +0 -2
  83. package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +0 -1
  84. package/dist/scripts/289-669c0c8222-lite.chunk.js +0 -2
  85. package/dist/scripts/289-669c0c8222-lite.chunk.js.map +0 -1
  86. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
  87. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
  88. package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
  89. package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
  90. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
  91. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
  92. package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +0 -1
  93. package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +0 -1
  94. package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +0 -1
  95. package/dist/scripts/4806-f36469abb7-lite.chunk.js +0 -2
  96. package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +0 -1
  97. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
  98. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
  99. package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +0 -1
  100. package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
  101. package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +0 -1
  102. package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
  103. package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
  104. package/dist/scripts/6070-a390fdce21-lite.chunk.js +0 -2
  105. package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +0 -1
  106. package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
  107. package/dist/scripts/7401-833bc4a088-lite.chunk.js +0 -2
  108. package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +0 -1
  109. package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
  110. package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
  111. package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
  112. package/dist/scripts/7843-f6033528ce-lite.chunk.js +0 -2
  113. package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
  114. package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +0 -2
  115. package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +0 -1
  116. package/dist/scripts/8077-9fdb522d7e-lite.chunk.js +0 -2
  117. package/dist/scripts/8077-9fdb522d7e-lite.chunk.js.map +0 -1
  118. package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
  119. package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
  120. package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
  121. package/dist/scripts/8672-6967ce8a23-lite.chunk.js +0 -2
  122. package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +0 -1
  123. package/dist/scripts/9295-4242401e60-lite.chunk.js +0 -2
  124. package/dist/scripts/9295-4242401e60-lite.chunk.js.map +0 -1
  125. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
  126. package/dist/scripts/979-4b893e5603-lite.chunk.js +0 -2
  127. package/dist/scripts/979-4b893e5603-lite.chunk.js.map +0 -1
  128. package/dist/scripts/9911-9272b96e46-lite.chunk.js +0 -2
  129. package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +0 -1
  130. package/dist/scripts/bundle-610971c0fb.min.js +0 -3
  131. /package/dist/css/{787-lite-5a317efacd.chunk.css → 2970-lite-5a317efacd.chunk.css} +0 -0
  132. /package/dist/css/{6070-lite-45dc286aab.chunk.css → 6550-lite-45dc286aab.chunk.css} +0 -0
  133. /package/dist/css/{2888-lite-856c02f000.chunk.css → 7148-lite-856c02f000.chunk.css} +0 -0
  134. /package/dist/css/{8364-lite-db31e36b79.chunk.css → 843-lite-db31e36b79.chunk.css} +0 -0
  135. /package/dist/css/{9911-lite-856c02f000.chunk.css → 8735-lite-856c02f000.chunk.css} +0 -0
  136. /package/dist/css/{5579-lite-f8e496136d.chunk.css → 8856-lite-f8e496136d.chunk.css} +0 -0
  137. /package/dist/css/{289-lite-2435a34b13.chunk.css → 904-lite-2435a34b13.chunk.css} +0 -0
  138. /package/dist/css/{1202-lite-4a892bdbf2.chunk.css → 9528-lite-4a892bdbf2.chunk.css} +0 -0
  139. /package/dist/css/{3612-lite-2b4142796a.chunk.css → 9911-lite-2b4142796a.chunk.css} +0 -0
  140. /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt} +0 -0
  141. /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7568-55e9b01367-lite.chunk.js.LICENSE.txt} +0 -0
  142. /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 8077-870bd8e245-lite.chunk.js.LICENSE.txt} +0 -0
  143. /package/dist/scripts/{bundle-610971c0fb.min.js.LICENSE.txt → bundle-f926852f33.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7843],{33518:(e,a,t)=>{var s;t.d(a,{e:()=>s}),function(e){e.Public="Public",e.PinCode="PinCode",e.PasswordProtected="PasswordProtected",e.ProtectedOverrideRestriction="ProtectedOverrideRestriction",e.JustMySchoolOverrideRestriction="JustMySchoolOverrideRestriction",e.Protected="Protected",e.JustMySchool="JustMySchool",e.Direct="Direct"}(s||(s={}))},54405:(e,a,t)=>{t.d(a,{X:()=>s});var s={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},35599:(e,a,t)=>{t.d(a,{k:()=>m});var s=t(32735),n=t(87801),r=t(16714),i=t(67467),l=t(5056),o=t(28001),c=t(69003);function m(e){var a,t,m=e.hasShareFlowV2&&e.hasPermissions(r.C.ViewInsights),d=(0,c.cl)([]),u=null!==(a=e.loadingState)&&void 0!==a?a:o.L,p=null!==(t=e.emptyState)&&void 0!==t?t:i.o;return e.loading||e.shareData.showPartialLoading?s.createElement(u,null):e.shareData.sentShares.length?s.createElement("div",{className:e.className},s.createElement(l.R,{sentShares:e.shareData.sentShares,sharedObjects:e.shareData.sharedObjects.items,shareRecipients:e.shareData.shareRecipients.items,interactivesPendingReview:e.shareData.interactivesPendingReview.itemsArr,getObjectActions:function(a){return(0,c.sD)({share:a.share,sharedObject:a.sharedObject,audienceParams:d.audienceAppLinkParams,hasInsights:m,isPlugin:e.isPlugin,breakpoints:e.breakpoints})},groupByDateShared:!0,breakpoints:e.breakpoints,imageCdnUrl:e.imageCdnUrl,yearGroups:e.yearGroups,hasDemoInsights:e.hasDemoInsight}),(e.shareData.hasMore||e.shareData.isFetching)&&s.createElement(n._,{isFetching:e.shareData.isFetching,fetchNext:e.shareData.fetchNext,nextCursor:e.shareData.nextCursor})):s.createElement(p,null)}},49221:(e,a,t)=>{t.r(a),t.d(a,{ClassroomsView:()=>oe});var s=t(32735),n=t(81886),r=t(67058),i=t(37802),l=t(99998),o=t(23481),c=t(20354),m=t(65858),d=t(2510),u=t(15611),p=t(83345),h=t(39151),g=t(1666),v=t(54405),E=t(44538),y=t(31949),S=t(79967),b=t(22902),f=t(79612),C=t(35223),O=t(14070),k=t(97291),N=t(46390),w=t(98623),x=t(31453),P=t(12528),I=t(83914),F=o.T.encloseNamespace("classrooms.classroomLabel"),A={"my-school-classrooms":"mySchoolClassrooms","favourite-classroom":"favouriteClassroom","open-classroom":"openClassroom"},L={"my-school-classrooms":"purple","favourite-classroom":"purple","open-classroom":"blue"};function R(e){var a;return s.createElement("div",{className:(0,x.A)("d-flex align-items-center gap-2",e.className)},s.createElement("div",null,s.createElement(P.f,{svgName:C.vn.Classrooms,svgSize:I.S.Standard,variant:L[e.type],textVariant:"white",svgWrapperClassName:"p-1"})),s.createElement("h2",{className:"h4 m-0"},null!==(a=e.text)&&void 0!==a?a:F(A[e.type])))}var T=t(59278),D=t(35599),M=t(7733),j=t(56644),U=t(9085),V="classrooms.pinnedClassroomsTiles";function G(){return s.createElement("div",{className:"py"},s.createElement(p.x,{namespace:V,phrase:"emptyPinnedClassrooms"}))}const _={pinnedClassroomTile:"jgtOl",pinnedClassroomTileImage:"TRhIX"};function B(){return s.createElement("div",{className:(0,x.A)("d-flex flex-column rounded overflow-hidden border border-gray-200",_.pinnedClassroomTile)},s.createElement("figure",{className:(0,x.A)("m-0",_.pinnedClassroomTileImage)}),s.createElement("div",{className:"d-flex flex-column gap-2 p-2"},s.createElement("span",{className:"partial-loading-background p-2 w-50"}),s.createElement("span",{className:"partial-loading-background p-2"})))}function z(e){return s.createElement("div",{className:"d-flex flex-row flex-wrap gap-3"},Array.from({length:e.size}).map(function(e,a){return s.createElement(B,{key:a})}))}var H="classrooms.pinnedClassroomsTiles";function J(e){var a=e.classroom.enrolments.data.filter(function(e){return e.role===j.tM.Student}).length,t=(0,U.s)(e.classroom.name,M.o);return s.createElement(u.F,{className:(0,x.A)("d-flex flex-column rounded overflow-hidden border border-gray-400",_.pinnedClassroomTile),appLink:{application:k.O.CLASSROOMS,action:O.e.Classrooms.CLASSROOM_HOME,args:[e.classroom.id]}},s.createElement("figure",{className:(0,x.A)("m-0",_.pinnedClassroomTileImage,t)}),s.createElement("div",{className:"d-flex flex-column gap-1 p-2"},s.createElement("span",{className:"fw-medium"},e.classroom.name),s.createElement("span",{className:"text-muted"},a?s.createElement(p.x,{namespace:H,phrase:"studentsCount",options:{smartCount:a}}):s.createElement(p.x,{namespace:H,phrase:"noStudents"}))))}function W(e){var a,t,n=null!==(a=e.emptyStateComponent)&&void 0!==a?a:G,r=null!==(t=e.loadingStateComponent)&&void 0!==t?t:z;return e.showPartialLoading?s.createElement(r,{size:5}):e.classrooms&&e.classrooms.length?s.createElement("div",{className:"d-flex flex-row flex-wrap gap-3"},e.classrooms.map(function(e){return s.createElement(J,{key:e.id,classroom:e})})):s.createElement(n,null)}var X=t(88630),Z=t(22767),q="classrooms.classroomsOverview",Y=o.T.encloseNamespace(q);function $(e){return s.createElement("div",{className:"d-flex flex-row justify-content-between align-items-center mb-3"},s.createElement(R,{type:e.type}),e.appLink&&!e.hideSeeAll&&s.createElement(u.F,{appLink:e.appLink},s.createElement(p.x,{namespace:q,phrase:"seeAll"})))}function K(){var e,a,t,n,r,l,u,p,x;(0,f.M)({title:Y("pageTitle")});var P=(0,S.k)(),I=(0,N.G)().isPlugin,F=(0,b.T)().hasPermissions,A=(0,i.r)(null).hasShareFlowV2,L=c.a.useBasicFetch(y.N.currentUser()),R=c.a.useBasicFetch(h.L.config()),M=c.a.useBasicFetch(v.X.interactiveMetadata()),j=c.a.useBasicFetch((null===(e=L.data)||void 0===e?void 0:e.isAuthenticated)&&g.h.yearGroups(L.data.customerId)),U=c.a.useBasicFetch(E.K.getRostering()),V=(null===(a=U.data)||void 0===a?void 0:a.status)&&"None"!==U.data.status,G=(0,w.a)({interactiveInsights:!0,shouldFetch:A,params:{type:[d.y.Open]}}),_=c.a.useBasicFetch(X.F.getPinnedClassrooms(null===(t=L.data)||void 0===t?void 0:t.id,null===(n=L.data)||void 0===n?void 0:n.customerId,{withStudents:!0,limit:5})),B=!!(R.data&&M.data&&j.data&&_.data);return s.createElement("div",{className:"px-3"},s.createElement(T.d,{activeTab:"overview",actions:[{label:o.T.getPhrase(q,"newClassroom"),appLink:{application:k.O.CLASSROOMS,action:O.e.Classrooms.NEW_CLASSROOM},svgName:C.vn.Plus,className:"btn btn-outline-dark",disabled:V,tooltip:V?Y("disabledByRostering"):"",analyticsOptions:{actionType:m.Vw.Create,entity:m.py.Classroom,workflowPhase:m.eu.Start,location:m.LZ.ClassroomsList},button:!P.xs}],hasRostering:V,hasShareFlowV2:A}),s.createElement("section",{className:"mb-4"},s.createElement($,{type:"favourite-classroom",appLink:{application:k.O.CLASSROOMS,action:O.e.Classrooms.VIEW_ALL},hideSeeAll:!(null===(l=null===(r=_.data)||void 0===r?void 0:r.data)||void 0===l?void 0:l.length)}),s.createElement(W,{showPartialLoading:!B,classrooms:null===(u=_.data)||void 0===u?void 0:u.data})),s.createElement("section",{className:"mb-4"},s.createElement($,{type:"open-classroom",appLink:{application:k.O.CLASSROOMS,action:O.e.Classrooms.OPEN_CLASSROOMS},hideSeeAll:!(null===(p=G.sentShares)||void 0===p?void 0:p.length)}),s.createElement(D.k,{loading:!B,shareData:G,hasShareFlowV2:A,hasPermissions:F,breakpoints:P,isPlugin:I,imageCdnUrl:null===(x=R.data)||void 0===x?void 0:x.imageCdnUrl,yearGroups:j.data,className:"mt-3",emptyState:function(){var e;return s.createElement(Z.l,{heading:Y("demoHeading"),demoInteractive:M.data,breakpoints:P,imageCdnUrl:null===(e=R.data)||void 0===e?void 0:e.imageCdnUrl,yearGroups:j.data,className:"mt-3",shareType:d.y.Open})}})))}var Q=t(91047),ee=t(86073),ae=t(98461),te=t(16714),se=t(12909),ne="classrooms.minimalClassroomsExperience",re=o.T.encloseNamespace(ne),ie="/product/integrations";function le(){var e,a,t,n;(0,f.M)({title:re("pageTitle")});var r=(0,S.k)(),l=(0,N.G)().isPlugin,o=(0,b.T)(),E=o.hasPermissions,C=o.getGatedPermission,x=(0,i.r)(null).hasShareFlowV2,P=C(te.C.ViewClassrooms),I=c.a.useBasicFetch(y.N.currentUser()),F=c.a.useBasicFetch(h.L.config()),A=c.a.useBasicFetch(v.X.interactiveMetadata()),L=c.a.useBasicFetch((null===(e=I.data)||void 0===e?void 0:e.isAuthenticated)&&g.h.yearGroups(I.data.customerId)),M=(0,w.a)({interactiveInsights:!0,shouldFetch:x,params:{type:[d.y.Open]}}),j=!!F.data&&!!A.data&&!!L.data;return s.createElement("div",{className:"px-3"},"soft-gate"===P&&s.createElement(se.H,null),s.createElement(T.d,{activeTab:"classrooms",hasRostering:!1,hasShareFlowV2:x,hideTabs:!0}),"hard-gate"!==P&&"soft-gate"!==P&&s.createElement("section",{className:"mb-4"},s.createElement(R,{type:"my-school-classrooms"}),s.createElement("div",{className:"d-flex flex-column flex-sm-row justify-content-between gap-2 bg-light-blue rounded p-3 align-items-center mt-3"},s.createElement("div",null,s.createElement(p.x,{namespace:ne,phrase:"myClassroomsNotice"})," ",s.createElement(ae.d,{href:ee._.safeUrlConcat(null===(a=F.data)||void 0===a?void 0:a.marketingSiteUrl,ie),className:"text-underline",newTab:!0},s.createElement(p.x,{namespace:ne,phrase:"learnMore"}))),s.createElement("div",null,s.createElement(u.F,{className:"btn btn-outline-dark hover-bg-white",appLink:{application:k.O.SIGN_UP,action:O.e.SignUp.UPGRADE},analyticsData:{},analyticsOptions:{actionType:m.Vw.Click,location:m.LZ.Classroom,entity:m.py.AppLink,descriptor:m.Yu.Upgrade,workflowPhase:m.eu.Start}},s.createElement(p.x,{namespace:ne,phrase:"requestFullAccess"}))))),s.createElement("section",{className:"mb-4"},"hard-gate"!==P&&"soft-gate"!==P&&s.createElement(R,{type:"open-classroom"}),j&&s.createElement(s.Fragment,null,s.createElement(Z.l,{heading:re("demoHeading"),demoInteractive:A.data,breakpoints:r,imageCdnUrl:null===(t=F.data)||void 0===t?void 0:t.imageCdnUrl,yearGroups:L.data,className:"mt-3",shareType:d.y.Open}),s.createElement(D.k,{shareData:M,hasShareFlowV2:x,hasPermissions:E,breakpoints:r,isPlugin:l,imageCdnUrl:null===(n=F.data)||void 0===n?void 0:n.imageCdnUrl,yearGroups:L.data,className:"mt-3",emptyState:function(){return s.createElement(s.Fragment,null)},hasDemoInsight:!0}))))}function oe(e){var a=(0,l.R)(),t=a.experience,o=a.loading,c=(0,i.r)(null).hasShareFlowV2;return o?s.createElement(s.Fragment,null):"none"===t?(n.Q.Ry.throw(new r.d),s.createElement(s.Fragment,null)):"full"===t&&c?s.createElement(K,null):"full"!==t||c?s.createElement(le,null):s.createElement(Q.FullClassroomsExperienceView,{query:e.query})}},22767:(e,a,t)=>{t.d(a,{l:()=>d});var s=t(32735),n=t(23481),r=t(2510),i=t(55219),l=t(18006),o=t(9566);const c={background:"HAuP3"};var m=n.T.encloseNamespace("myShares.demoInsights");function d(e){var a,t=e.breakpoints.xs||e.breakpoints.sm,n=e.shareType===r.y.Open?o.po:o.vJ,d=e.shareType===r.y.Open?o.$Z:o.GJ,u=Object.assign(Object.assign({},d),{sharedObject:Object.assign(Object.assign({},e.demoInteractive),{id:l.A})});return s.createElement("div",{className:e.className},s.createElement(i.g,{heading:null!==(a=e.heading)&&void 0!==a?a:m("demoHeading"),isFirst:!0}),s.createElement("div",{className:"".concat(c.background," rounded-3 mb-4")},s.createElement(i.F,{shareData:u,getObjectActions:function(){return[Object.assign(Object.assign({},o.VE),{button:!t,appLink:n})]},imageCdnUrl:e.imageCdnUrl,yearGroups:e.yearGroups,breakpoints:e.breakpoints,className:"bg-light-orange",appLink:function(){return n}})))}},18006:(e,a,t)=>{t.d(a,{A:()=>s});var s="GRWx6w"},9566:(e,a,t)=>{t.d(a,{$Z:()=>g,G6:()=>u,GJ:()=>h,VE:()=>y,_w:()=>p,po:()=>E,vJ:()=>v});var s=t(23481),n=t(110),r=t(33518),i=t(2510),l=t(4594),o=t(35223),c=t(14070),m=t(97291),d=s.T.encloseNamespace("myShares.demoInsights"),u={type:i.y.Link,privacy:r.e.JustMySchool,objectId:"0",objectTypeId:l.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),dateShared:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},p=Object.assign(Object.assign({},u),{type:i.y.Open,expireDate:n.O.add(new Date(u.dateCreated),30,"days").toISOString(),privacy:r.e.PinCode}),h={share:u,sharedObject:null,shareRecipients:null,dateShared:n.O.subtract(new Date,7,"days").toISOString()},g=Object.assign(Object.assign({},h),{share:p}),v={application:m.O.MY_SHARES,action:c.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},E={application:m.O.MY_SHARES,action:c.e.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO},y={svgName:o.vn.Analytics,label:d("demoInsights"),appLink:v,group:"insights",className:"btn btn-outline-dark"}},12909:(e,a,t)=>{t.d(a,{H:()=>d});var s=t(32735),n=t(15611),r=t(83914),i=t(83345),l=t(35223),o=t(14070),c=t(97291),m="signUp.softGateBanner";function d(){return s.createElement("div",{role:"alert",className:"bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center"},s.createElement(r.x,{svgName:l.vn.StarOutline,size:r.S.Large}),s.createElement(i.x,{namespace:m,phrase:"softGate"})," ",s.createElement(n.F,{appLink:{application:c.O.SIGN_UP,action:o.e.SignUp.PREMIUM_FEATURES},className:"indigo-link text-indigo text-underline d-inline"},s.createElement(i.x,{namespace:m,phrase:"learnMore"})))}}}]);
2
- //# sourceMappingURL=7843-f6033528ce-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7843-f6033528ce-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/enums/SharePrivacy.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/open-classrooms-table/OpenClassroomsTable.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-label/ClassroomLabel.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/pinned-classrooms-tiles/empty-state/EmptyPinnedClassroomsTiles.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/pinned-classrooms-tiles/pinned-classrooms-tiles.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/pinned-classrooms-tiles/partial-loading/PartialPinnedClassroomsTiles.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/pinned-classrooms-tiles/PinnedClassroomsTiles.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classrooms-overview/ClassroomsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/minimal-classrooms-experience/MinimalClassroomsExperienceView.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classrooms/ClassroomsView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-demo-insight/my-shares-demo-insights.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/my-shares-demo-insight/MySharesDemoInsight.tsx","file:///app/packages/projects/lite/src/apps/my-shares/constants/DemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/sign-up/components/soft-gate-banner/SoftGateBanner.tsx"],"sourcesContent":["export enum SharePrivacy {\n Public = 'Public',\n PinCode = 'PinCode',\n PasswordProtected = 'PasswordProtected',\n ProtectedOverrideRestriction = 'ProtectedOverrideRestriction',\n JustMySchoolOverrideRestriction = 'JustMySchoolOverrideRestriction',\n Protected = 'Protected',\n JustMySchool = 'JustMySchool',\n Direct = 'Direct'\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import React from 'react';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { useSharesTable } from 'shared/hooks/useSharesTable';\n\nimport { MySharesTableEmptyState } from 'apps/my-shares/components/my-shares-table/empty-state/MySharesTableEmptyState';\nimport { MySharesTable } from 'apps/my-shares/components/my-shares-table/MySharesTable';\nimport { PartialMySharesTable } from 'apps/my-shares/components/my-shares-table/partial-loading/PartialMySharesTable';\nimport { getShareObjectActions, getSharesParams } from 'apps/my-shares/views/my-shares/MySharesViewUtils';\n\ninterface OpenClassroomsTableProps {\n shareData: ReturnType<typeof useSharesTable>;\n hasShareFlowV2: boolean;\n hasPermissions: HasPermissionsFunc;\n breakpoints: Breakpoints;\n isPlugin: boolean;\n imageCdnUrl: string;\n yearGroups: YearGroup[];\n hasDemoInsight?: boolean;\n\n emptyState?: () => JSX.Element;\n loadingState?: () => JSX.Element;\n\n className?: string;\n loading?: boolean;\n}\n\nexport function OpenClassroomsTable(props: OpenClassroomsTableProps) {\n const hasInsightsPermission = props.hasShareFlowV2 && props.hasPermissions(PermissionName.ViewInsights);\n const sharesParams = getSharesParams([]);\n\n const LoadingComponent = props.loadingState ?? PartialMySharesTable;\n const EmptyStateComponent = props.emptyState ?? MySharesTableEmptyState;\n \n if (props.loading || props.shareData.showPartialLoading)\n return <LoadingComponent />;\n\n if (!props.shareData.sentShares.length)\n return <EmptyStateComponent />;\n\n return (\n <div className={props.className}>\n <MySharesTable\n sentShares={props.shareData.sentShares}\n sharedObjects={props.shareData.sharedObjects.items}\n shareRecipients={props.shareData.shareRecipients.items}\n interactivesPendingReview={props.shareData.interactivesPendingReview.itemsArr}\n getObjectActions={row => getShareObjectActions({\n share: row.share,\n sharedObject: row.sharedObject,\n audienceParams: sharesParams.audienceAppLinkParams,\n hasInsights: hasInsightsPermission,\n isPlugin: props.isPlugin,\n breakpoints: props.breakpoints\n })}\n groupByDateShared\n breakpoints={props.breakpoints}\n imageCdnUrl={props.imageCdnUrl}\n yearGroups={props.yearGroups}\n hasDemoInsights={props.hasDemoInsight}\n />\n {(props.shareData.hasMore || props.shareData.isFetching) &&\n <InfiniteScrollFooter\n isFetching={props.shareData.isFetching}\n fetchNext={props.shareData.fetchNext}\n nextCursor={props.shareData.nextCursor}\n />\n }\n </div>\n );\n}","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'classrooms.classroomLabel';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport type ClassroomLabelType = 'my-school-classrooms' | 'favourite-classroom' | 'open-classroom';\n\ninterface ClassroomLabelProps {\n type: ClassroomLabelType;\n className?: string;\n text?: string;\n}\n\nconst TypePhraseMap: {[key in ClassroomLabelType]: string} = {\n 'my-school-classrooms': 'mySchoolClassrooms',\n 'favourite-classroom': 'favouriteClassroom',\n 'open-classroom': 'openClassroom'\n};\n\nconst TypeVariantMap: {[key in ClassroomLabelType]: ButtonProps['variant']} = {\n 'my-school-classrooms': 'purple',\n 'favourite-classroom': 'purple',\n 'open-classroom': 'blue'\n};\n\nexport function ClassroomLabel(props: ClassroomLabelProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center gap-2', props.className)}>\n <div>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Standard}\n variant={TypeVariantMap[props.type]}\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n </div>\n <h2 className='h4 m-0'>\n {props.text ?? getPhrase(TypePhraseMap[props.type])}\n </h2>\n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'classrooms.pinnedClassroomsTiles';\n\nexport function EmptyPinnedClassroomsTiles(): JSX.Element {\n return (\n <div className='py'>\n <Text namespace={namespace} phrase='emptyPinnedClassrooms' />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"pinnedClassroomTile\":\"jgtOl\",\"pinnedClassroomTileImage\":\"TRhIX\"};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport styles from '../pinned-classrooms-tiles.scss';\n\ninterface PartialPinnedClassroomsTilesProps {\n size: number;\n}\n\nfunction PartialPinnedClassroomsTile(): JSX.Element {\n return (\n <div\n className={classNames('d-flex flex-column rounded overflow-hidden border border-gray-200', styles.pinnedClassroomTile)}\n >\n <figure\n className={classNames('m-0', styles.pinnedClassroomTileImage)}\n />\n\n <div className='d-flex flex-column gap-2 p-2'>\n <span className='partial-loading-background p-2 w-50'></span>\n <span className='partial-loading-background p-2'>\n </span>\n </div>\n </div>\n );\n}\n\nexport function PartialPinnedClassroomsTiles(props: PartialPinnedClassroomsTilesProps): JSX.Element {\n return (\n <div className='d-flex flex-row flex-wrap gap-3'>\n {Array.from({ length: props.size }).map((_, index) => <PartialPinnedClassroomsTile key={index} />)}\n </div>\n );\n}","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { Classroom, EnrolmentRole } from 'libs/shared/interfaces';\nimport { getDeterministicBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { EmptyPinnedClassroomsTiles } from './empty-state/EmptyPinnedClassroomsTiles';\nimport { PartialPinnedClassroomsTiles } from './partial-loading/PartialPinnedClassroomsTiles';\n\nimport styles from './pinned-classrooms-tiles.scss';\n\nconst namespace = 'classrooms.pinnedClassroomsTiles';\n\ninterface PinnedClassroomsTileProps {\n classroom: Classroom;\n}\n\nfunction PinnedClassroomsTile(props: PinnedClassroomsTileProps): JSX.Element {\n const studentsCount = props.classroom.enrolments.data.filter(e => e.role === EnrolmentRole.Student).length;\n\n const bgColorClassName = getDeterministicBgColorClass(props.classroom.name, BG_COLOUR_CLASS_NAMES);\n\n return (\n <AppLink\n className={classNames('d-flex flex-column rounded overflow-hidden border border-gray-400', styles.pinnedClassroomTile)}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_HOME,\n args: [props.classroom.id]\n }}\n >\n <figure\n className={classNames('m-0', styles.pinnedClassroomTileImage, bgColorClassName)}\n />\n\n <div className='d-flex flex-column gap-1 p-2'>\n <span className='fw-medium'>{props.classroom.name}</span>\n <span className='text-muted'>\n {studentsCount\n ? <Text namespace={namespace} phrase='studentsCount' options={{ smartCount: studentsCount }} />\n : <Text namespace={namespace} phrase='noStudents' />\n }\n </span>\n </div>\n </AppLink>\n );\n}\n\ninterface PinnedClassroomsTilesProps {\n classrooms: Classroom[];\n showPartialLoading: boolean;\n emptyStateComponent?: () => JSX.Element;\n loadingStateComponent?: () => JSX.Element;\n}\n\nexport function PinnedClassroomsTiles(props: PinnedClassroomsTilesProps): JSX.Element {\n const EmptyState = props.emptyStateComponent ?? EmptyPinnedClassroomsTiles;\n const LoadingState = props.loadingStateComponent ?? PartialPinnedClassroomsTiles;\n\n if (props.showPartialLoading)\n return <LoadingState size={5} />;\n \n if (!props.classrooms || !props.classrooms.length)\n return <EmptyState />;\n \n return (\n <div className='d-flex flex-row flex-wrap gap-3'>\n {props.classrooms.map(classroom => (\n <PinnedClassroomsTile key={classroom.id} classroom={classroom} />\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { ClassroomCollection, Config, CurrentUser, InteractiveMetadata, RosteringResponse, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useSharesTable } from 'shared/hooks/useSharesTable';\n\nimport { ClassroomLabel, ClassroomLabelType } from 'apps/classrooms/components/classroom-label/ClassroomLabel';\nimport { ClassroomsHeader } from 'apps/classrooms/components/classrooms-header/ClassroomsHeader';\nimport { OpenClassroomsTable } from 'apps/classrooms/components/open-classrooms-table/OpenClassroomsTable';\nimport { PinnedClassroomsTiles } from 'apps/classrooms/components/pinned-classrooms-tiles/PinnedClassroomsTiles';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { MySharesDemoInsight } from 'apps/my-shares/components/my-shares-demo-insight/MySharesDemoInsight';\n\nconst namespace = 'classrooms.classroomsOverview';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomSectionHeadingProps {\n type: ClassroomLabelType;\n appLink?: Core.AppLink;\n hideSeeAll?: boolean;\n}\n\nfunction ClassroomSectionHeading(props: ClassroomSectionHeadingProps): JSX.Element {\n return (\n <div className='d-flex flex-row justify-content-between align-items-center mb-3'>\n <ClassroomLabel type={props.type} />\n {props.appLink && !props.hideSeeAll && (\n <AppLink appLink={props.appLink}>\n <Text namespace={namespace} phrase='seeAll' />\n </AppLink>\n )}\n </div>\n );\n}\n\nexport function ClassroomsOverviewView(): JSX.Element {\n useSetPageMetadata({\n title: getPhrase('pageTitle')\n });\n\n const breakpoints = useBreakpoints();\n const { isPlugin } = usePluginHelper();\n const { hasPermissions } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const demoInteractive = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const hasRostering = rostering.data?.status && rostering.data.status !== 'None';\n const shareData = useSharesTable({\n interactiveInsights: true,\n shouldFetch: hasShareFlowV2,\n params: {\n type: [ShareType.Open]\n }\n });\n const favouriteClassrooms = Flight.useBasicFetch<ClassroomCollection>(\n ClassroomRequests.getPinnedClassrooms(\n currentUser.data?.id,\n currentUser.data?.customerId,\n { withStudents: true, limit: 5 }\n )\n );\n\n function getActions(): ActionOptions[] {\n return [{\n label: LanguageService.getPhrase(namespace, 'newClassroom'),\n appLink: {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_CLASSROOM\n },\n svgName: cvSvgLibrary.Plus,\n className: 'btn btn-outline-dark',\n disabled: hasRostering,\n tooltip: hasRostering ? getPhrase('disabledByRostering') : '',\n analyticsOptions: {\n actionType: UserAction.Create,\n entity: EntityType.Classroom,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ClassroomsList\n },\n button: !breakpoints.xs\n }];\n }\n \n const loaded = !!config.data && !!demoInteractive.data && !!yearGroups.data && !!favouriteClassrooms.data;\n\n return (\n <div className='px-3'>\n <ClassroomsHeader\n activeTab='overview'\n actions={getActions()}\n hasRostering={hasRostering}\n hasShareFlowV2={hasShareFlowV2}\n />\n\n <section className='mb-4'>\n <ClassroomSectionHeading\n type='favourite-classroom'\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.VIEW_ALL\n }}\n hideSeeAll={!favouriteClassrooms.data?.data?.length}\n />\n\n <PinnedClassroomsTiles\n showPartialLoading={!loaded}\n classrooms={favouriteClassrooms.data?.data}\n />\n </section>\n\n <section className='mb-4'>\n <ClassroomSectionHeading\n type='open-classroom'\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.OPEN_CLASSROOMS\n }}\n hideSeeAll={!shareData.sentShares?.length}\n />\n\n <OpenClassroomsTable\n loading={!loaded}\n shareData={shareData}\n hasShareFlowV2={hasShareFlowV2}\n hasPermissions={hasPermissions}\n breakpoints={breakpoints}\n isPlugin={isPlugin}\n imageCdnUrl={config.data?.imageCdnUrl}\n yearGroups={yearGroups.data}\n className='mt-3'\n emptyState={() => (\n <MySharesDemoInsight\n heading={getPhrase('demoHeading')}\n demoInteractive={demoInteractive.data}\n breakpoints={breakpoints}\n imageCdnUrl={config.data?.imageCdnUrl}\n yearGroups={yearGroups.data}\n className='mt-3'\n shareType={ShareType.Open}\n />\n )}\n />\n\n </section>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { UrlHelper } from 'libs/analytics/utils/UrlHelper';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useSharesTable } from 'shared/hooks/useSharesTable';\n\nimport { ClassroomLabel } from 'apps/classrooms/components/classroom-label/ClassroomLabel';\nimport { ClassroomsHeader } from 'apps/classrooms/components/classrooms-header/ClassroomsHeader';\nimport { OpenClassroomsTable } from 'apps/classrooms/components/open-classrooms-table/OpenClassroomsTable';\nimport { MySharesDemoInsight } from 'apps/my-shares/components/my-shares-demo-insight/MySharesDemoInsight';\nimport { SoftGateBanner } from 'apps/sign-up/components/soft-gate-banner/SoftGateBanner';\n\nconst namespace = 'classrooms.minimalClassroomsExperience';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\nconst productIntegrationsPath = '/product/integrations';\n\nexport function MinimalClassroomsExperienceView(): JSX.Element {\n useSetPageMetadata({\n title: getPhrase('pageTitle')\n });\n\n const breakpoints = useBreakpoints();\n const { isPlugin } = usePluginHelper();\n const { hasPermissions, getGatedPermission } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n\n const viewClassroomsGatedPermission = getGatedPermission(PermissionName.ViewClassrooms);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const demoInteractive = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const shareData = useSharesTable({\n interactiveInsights: true,\n shouldFetch: hasShareFlowV2,\n params: {\n type: [ShareType.Open]\n }\n });\n \n const loaded = !!config.data && !!demoInteractive.data && !!yearGroups.data;\n\n return (\n <div className='px-3'>\n {viewClassroomsGatedPermission === 'soft-gate' && <SoftGateBanner />}\n <ClassroomsHeader\n activeTab='classrooms'\n hasRostering={false}\n hasShareFlowV2={hasShareFlowV2}\n hideTabs\n />\n\n {viewClassroomsGatedPermission !== 'hard-gate' && viewClassroomsGatedPermission !== 'soft-gate' &&\n <section className='mb-4'>\n <ClassroomLabel type='my-school-classrooms' />\n\n <div className='d-flex flex-column flex-sm-row justify-content-between gap-2 bg-light-blue rounded p-3 align-items-center mt-3'>\n <div>\n <Text namespace={namespace} phrase='myClassroomsNotice' />&nbsp;\n <ExternalLink\n href={UrlHelper.safeUrlConcat(config.data?.marketingSiteUrl, productIntegrationsPath)} className='text-underline'\n newTab\n >\n <Text namespace={namespace} phrase='learnMore' />\n </ExternalLink>\n </div>\n <div>\n <AppLink\n className='btn btn-outline-dark hover-bg-white'\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.Classroom,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.Upgrade,\n workflowPhase: WorkflowPhase.Start\n }}\n >\n <Text namespace={namespace} phrase='requestFullAccess' />\n </AppLink>\n </div>\n </div>\n </section>\n }\n\n <section className='mb-4'>\n {viewClassroomsGatedPermission !== 'hard-gate' && viewClassroomsGatedPermission !== 'soft-gate' &&\n <ClassroomLabel type='open-classroom' />\n }\n\n {loaded &&\n <>\n <MySharesDemoInsight\n heading={getPhrase('demoHeading')}\n demoInteractive={demoInteractive.data}\n breakpoints={breakpoints}\n imageCdnUrl={config.data?.imageCdnUrl}\n yearGroups={yearGroups.data}\n className='mt-3'\n shareType={ShareType.Open}\n />\n \n <OpenClassroomsTable\n shareData={shareData}\n hasShareFlowV2={hasShareFlowV2}\n hasPermissions={hasPermissions}\n breakpoints={breakpoints}\n isPlugin={isPlugin}\n imageCdnUrl={config.data?.imageCdnUrl}\n yearGroups={yearGroups.data}\n className='mt-3'\n emptyState={() => <></>}\n hasDemoInsight\n />\n </>\n\n }\n </section>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { useClassroomExperience } from 'shared/hooks/useClassroomExperience';\n\nimport { ClassroomsOverviewView } from '../classrooms-overview/ClassroomsOverviewView';\nimport { FullClassroomsExperienceView } from '../full-classrooms-experience/FullClassroomsExperienceView';\nimport { MinimalClassroomsExperienceView } from '../minimal-classrooms-experience/MinimalClassroomsExperienceView';\n\ninterface ClassroomsViewProps {\n query: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function ClassroomsView(props: ClassroomsViewProps): JSX.Element {\n const { experience, loading } = useClassroomExperience();\n const { hasShareFlowV2 } = useSettings(null);\n\n if (loading)\n return <></>;\n \n if (experience === 'none') {\n Core.ErrorHelper.throw(new NotFoundError());\n return <></>;\n }\n \n if (experience === 'full' && hasShareFlowV2) {\n return <ClassroomsOverviewView />;\n }\n\n if (experience === 'full' && !hasShareFlowV2) {\n return <FullClassroomsExperienceView query={props.query} />;\n }\n\n return <MinimalClassroomsExperienceView />;\n}","// extracted by mini-css-extract-plugin\nexport default {\"background\":\"HAuP3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { MySharesTableHeading, MySharesTableRow } from 'apps/my-shares/components/my-shares-table-row/MySharesTableRow';\nimport { DEMO_INTERACTIVE_ID } from 'apps/my-shares/constants/DemoInsights';\nimport { DEMO_INSIGHTS_ACTION, DEMO_INSIGHTS_APPLINK, DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK, DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA, DEMO_INSIGHTS_SHARE_TABLE_DATA } from 'apps/my-shares/constants/MySharesDemoInsights';\n\nimport { MySharesTableData } from '../my-shares-table/MySharesTableUtils';\n\nimport styles from './my-shares-demo-insights.scss';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface MySharesDemoInsightProps {\n demoInteractive: InteractiveMetadata;\n imageCdnUrl: string;\n yearGroups: YearGroup[];\n breakpoints: Breakpoints;\n className?: string;\n heading?: string;\n shareType?: ShareType;\n}\n\nexport function MySharesDemoInsight(props: MySharesDemoInsightProps) {\n const isMobile = props.breakpoints.xs || props.breakpoints.sm;\n\n const appLink = props.shareType === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK : DEMO_INSIGHTS_APPLINK;\n\n function getDemoInteractive() {\n return {\n ...props.demoInteractive,\n id: DEMO_INTERACTIVE_ID\n };\n }\n\n function getObjectActions() {\n return [\n {\n ...DEMO_INSIGHTS_ACTION,\n button: !isMobile,\n appLink\n }\n ];\n }\n\n const demoShareTableData = props.shareType === ShareType.Open\n ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA\n : DEMO_INSIGHTS_SHARE_TABLE_DATA;\n\n const shareData: MySharesTableData = {\n ...demoShareTableData,\n sharedObject: getDemoInteractive()\n };\n\n return (\n <div className={props.className}>\n <MySharesTableHeading heading={props.heading ?? getPhrase('demoHeading')} isFirst={true} />\n\n <div className={`${styles.background} rounded-3 mb-4`}>\n <MySharesTableRow\n shareData={shareData}\n getObjectActions={getObjectActions}\n imageCdnUrl={props.imageCdnUrl}\n yearGroups={props.yearGroups}\n breakpoints={props.breakpoints}\n className='bg-light-orange'\n appLink={(() => appLink)}\n />\n </div>\n </div>\n );\n}","export const DEMO_INTERACTIVE_ID = 'GRWx6w';","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n dateShared: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE: Share = {\n ...DEMO_INSIGHTS_SHARE,\n type: ShareType.Open,\n expireDate: DateHelper.add(new Date(DEMO_INSIGHTS_SHARE.dateCreated), 30, 'days').toISOString(),\n privacy: SharePrivacy.PinCode\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA: MySharesTableData = {\n ...DEMO_INSIGHTS_SHARE_TABLE_DATA,\n share: DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE\n};\n\nexport const DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'signUp.softGateBanner';\n\nexport function SoftGateBanner(): JSX.Element {\n return (\n <div role='alert' className='bg-light-indigo text-indigo rounded p-2 mb-4 d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Large} />\n <Text namespace={namespace} phrase='softGate' />&nbsp;\n <AppLink\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.PREMIUM_FEATURES\n }}\n className='indigo-link text-indigo text-underline d-inline'\n >\n <Text namespace={namespace} phrase='learnMore' />\n </AppLink>\n </div>\n );\n}"],"names":["SharePrivacy","InsightsDemoRequests","interactive","url","key","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","OpenClassroomsTable","props","hasInsightsPermission","hasShareFlowV2","hasPermissions","sharesParams","LoadingComponent","loadingState","EmptyStateComponent","emptyState","loading","shareData","showPartialLoading","sentShares","length","className","sharedObjects","items","shareRecipients","interactivesPendingReview","itemsArr","getObjectActions","row","share","sharedObject","audienceParams","audienceAppLinkParams","hasInsights","isPlugin","breakpoints","groupByDateShared","imageCdnUrl","yearGroups","hasDemoInsights","hasDemoInsight","hasMore","isFetching","fetchNext","nextCursor","getPhrase","LanguageService","TypePhraseMap","TypeVariantMap","ClassroomLabel","IconCircle","svgName","svgSize","SvgContainer","S","variant","type","textVariant","svgWrapperClassName","text","EmptyPinnedClassroomsTiles","Text","namespace","phrase","PartialPinnedClassroomsTile","PartialPinnedClassroomsTiles","Array","from","size","map","_","index","PinnedClassroomsTile","studentsCount","classroom","enrolments","data","filter","e","role","bgColorClassName","name","AppLink","appLink","application","action","args","id","options","smartCount","PinnedClassroomsTiles","EmptyState","emptyStateComponent","LoadingState","loadingStateComponent","classrooms","ClassroomSectionHeading","hideSeeAll","ClassroomsOverviewView","useSetPageMetadata","title","useBreakpoints","usePluginHelper","usePermissions","useSettings","currentUser","UserRequests","config","ConfigRequests","demoInteractive","isAuthenticated","CustomerRequests","customerId","rostering","RosteringRequests","hasRostering","status","useSharesTable","interactiveInsights","shouldFetch","params","ShareType","favouriteClassrooms","ClassroomRequests","withStudents","limit","loaded","ClassroomsHeader","activeTab","actions","label","disabled","tooltip","analyticsOptions","actionType","entity","workflowPhase","location","button","xs","MySharesDemoInsight","heading","shareType","productIntegrationsPath","MinimalClassroomsExperienceView","getGatedPermission","viewClassroomsGatedPermission","PermissionName","SoftGateBanner","hideTabs","ExternalLink","href","UrlHelper","marketingSiteUrl","newTab","analyticsData","descriptor","ClassroomsView","useClassroomExperience","experience","NotFoundError","FullClassroomsExperienceView","query","isMobile","sm","demoShareTableData","isFirst","MySharesTableRow","DEMO_INTERACTIVE_ID","DEMO_INSIGHTS_SHARE","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","Date","toISOString","dateShared","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE","DEMO_INSIGHTS_SHARE_TABLE_DATA","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA","DEMO_INSIGHTS_APPLINK","DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK","DEMO_INSIGHTS_ACTION","group"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[787],{26136:(e,t,r)=>{r.d(t,{B:()=>l});var n=r(76198),a=r(23481),i=r(64818),o=a.T.encloseNamespace("shared.analyticsUtils");function l(e,t){return e?t?(0,n._8)((r=e.id,a=e.sessionId,l=+"".concat(r||function(e){if(!e)return 0;for(var t=0,r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:l})):e.deleted?o("deleted"):i.l.getFullName(e)||o("anonUser"):o("anonUser");var r,a,l}},39157:(e,t,r)=>{r.d(t,{HI:()=>m,R6:()=>s,Rt:()=>v,UU:()=>d,Zs:()=>u,nq:()=>f});var n=r(75896),a=r(94892),i=r(28972),o=r(8246),l=r(83140),c=r(80845);function s(e,t,r){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},o=(0,c.Q)(e),l=new Set(o.map(function(e){return e.id}));t.students.forEach(function(t){var o=Object.assign(Object.assign({},t),{summary:v(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):n.m.last(t.results).attempts.filter(function(e){var t;return!!l.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===l.size?(i.completed.push(o),o.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)});var s=n.m.sortBy(i.lowScore,function(e){return e.summary.percentCorrect}),u=n.m.sortBy(i.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},i),{lowScore:s,highScore:u})}function u(e,t){return(0,c.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===o.N.Correct}))?o.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[d(e)])||void 0===t?void 0:t.status)===o.N.Incorrect}))?o.N.Incorrect:void 0}function f(e,t){var r=t.students.length,n=0,a=0,o=0,s=0,u=0;return t.students.forEach(function(t){var r=(0,c.j_)(t);if(r){u+=t.results.length;var d=l.A.isInteractionCorrect(e,r);d===i.w.Correct&&n++,d===i.w.UnAnswered&&o++,d===i.w.AwaitingMarking&&s++,d!==i.w.UnAnswered&&a++}}),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:o,awaitingMarking:s,attempts:u}}function v(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,o=0,s=0;n.forEach(function(e){var t=l.A.isInteractionCorrect(e,r);t===i.w.Correct&&o++,t===i.w.AwaitingMarking&&s++});var u=a>0?o/a:0,d=new Set(n.map(function(e){return e.id})),m=r.attempts.filter(function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:o,awaitingMarking:s}}},6748:(e,t,r)=>{r.d(t,{i:()=>I});var n=r(32735),a=r(42648),i=r(35509),o=r(91967),l=r(15611),c=r(17808),s=r(1287),u=r(83914),d=r(90281),m={opacity:"0.8",cursor:"grabbing"},f=r(35223);function v(e){return function(e){if(Array.isArray(e))return p(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||g(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function g(e,t){if(e){if("string"==typeof e)return p(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?p(e,t):void 0}}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function h(e){var t,r,n,a;return{canScrollLeft:(null===(t=e.current)||void 0===t?void 0:t.scrollLeft)>0,canScrollRight:(null===(r=e.current)||void 0===r?void 0:r.scrollLeft)+1<(null===(n=e.current)||void 0===n?void 0:n.scrollWidth)-(null===(a=e.current)||void 0===a?void 0:a.clientWidth)}}const b={sortIndicator:"gFhu0",scrollContainer:"sWUp9",scrollbarTrack:"Vn2qM"};function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var w=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(n=Object.getOwnPropertySymbols(e);a<n.length;a++)t.indexOf(n[a])<0&&Object.prototype.propertyIsEnumerable.call(e,n[a])&&(r[n[a]]=e[n[a]])}return r};function S(e){var t,r;return e.column.canSort?n.createElement("span",{className:"".concat(b.sortIndicator,"\n ").concat(e.column.isSorted?"":"text-secondary","\n ").concat(null!==(r=null===(t=e.theme)||void 0===t?void 0:t.sortIndicator)&&void 0!==r?r:"")},n.createElement(u.x,{svgName:e.column.isSortedDesc||!e.column.isSorted?f.vn.ArrowRight:f.vn.ArrowLeft,size:u.S.Small})):n.createElement(n.Fragment,null)}function E(e){var t,r,a,u,d,f,g,p,h={columns:e.columns,data:e.data,disableSortBy:!e.enableSort,manualSortBy:e.manualSort,autoResetHiddenColumns:e.autoResetHiddenColumns,autoResetSortBy:e.autoResetSortBy,initialState:{sortBy:e.initialSortBy||[]}};e.initialSelectedRowIds&&(h.initialState={selectedRowIds:(g=e.initialSelectedRowIds,p={},g.forEach(function(e){return p[e]=!0}),p)}),e.getRowId&&(h.getRowId=e.getRowId);var b,w=i.useTable.apply(void 0,[h].concat((b=function(e){var t=[i.useSortBy,i.useRowSelect,"flex"===e.layout?i.useFlexLayout:i.useBlockLayout];return e.allowFiltering&&(t=[].concat(v(t),[i.useFilters])),e.allowGlobalFiltering&&(t=[].concat(v(t),[i.useGlobalFilter])),t}(Object.assign({},e)),function(e){if(Array.isArray(e))return y(e)}(b)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(b)||function(e,t){if(e){if("string"==typeof e)return y(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?y(e,t):void 0}}(b)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))),E=w.getTableProps,I=w.getTableBodyProps,C=w.headerGroups,R=w.rows,O=w.prepareRow,A=w.toggleAllRowsSelected,k=w.setGlobalFilter,N=w.setHiddenColumns,j=w.state.sortBy;function M(){return!R.length&&e.emptyState?e.emptyState:R.map(function(t){O(t);var r=function(t){var r,n,a,i,l,c=o.q.isFunction(null===(r=e.theme)||void 0===r?void 0:r.row)?e.theme.row(t):null!==(a=null===(n=e.theme)||void 0===n?void 0:n.row)&&void 0!==a?a:"";return t.isSelected&&(null===(i=e.theme)||void 0===i?void 0:i.selectedRow)&&(c+=" ".concat(null===(l=e.theme)||void 0===l?void 0:l.selectedRow)),e.onSelectRow&&(c+=" cursor-pointer"),e.enableSortableRows&&(c+=" cursor-grab"),c}(t),a=!!e.getRowAppLink&&e.getRowAppLink(t);function i(){e.onSelectRow&&(e.allowSelectMultipleRows||A(!1),e.onSelectRow(t),t.toggleRowSelected(!0))}function c(e,o){var c=function(e,t){return"dragAttributes"in e&&"dragListeners"in e?Object.assign(Object.assign(Object.assign({},e.dragAttributes),e.dragListeners),{"aria-roledescription":"Sortable row",ref:t}):{}}(e,o);return a?n.createElement("div",{role:"row",key:t.id},n.createElement(l.F,Object.assign({},e,c,{className:r,appLink:a}),U(t))):n.createElement("div",Object.assign({},e,c,{key:t.id,role:"row",className:r,onClick:i}),U(t))}var u=t.getRowProps();return e.enableSortableRows?n.createElement(s.W,{id:t.original.id,key:t.id,childProps:u,childComponent:n.forwardRef(function(e,t){return c(e,t)})}):c(u)})}function U(t){return t.cells.map(function(r){var a=function(t,r){var n,a,i="";return"function"==typeof(null===(n=e.theme)||void 0===n?void 0:n.cell)&&(i=e.theme.cell(t,r)),"string"==typeof(null===(a=e.theme)||void 0===a?void 0:a.cell)&&(i=e.theme.cell),e.onSelectCell&&(i+=" cursor-pointer"),i}(t,r);return n.createElement("div",Object.assign({key:r.column.id},r.getCellProps(),{className:a,onClick:function(){e.onSelectCell&&e.onSelectCell(r)}}),r.render("Cell"))})}return n.useEffect(function(){e.onSort&&e.onSort(j)},[j]),n.useEffect(function(){e.globalFilter&&k(e.globalFilter)},[e.globalFilter]),n.useEffect(function(){e.hiddenColumns&&N(e.hiddenColumns)},[e.hiddenColumns&&e.hiddenColumns.length]),n.createElement("div",Object.assign({},E(),{className:null!==(r=null===(t=e.theme)||void 0===t?void 0:t.table)&&void 0!==r?r:""}),n.createElement("div",{className:null!==(u=null===(a=e.theme)||void 0===a?void 0:a.header)&&void 0!==u?u:""},C.map(function(t){var r,a;return n.createElement("div",Object.assign({},t.getHeaderGroupProps(),{className:null!==(a=null===(r=e.theme)||void 0===r?void 0:r.headerRow)&&void 0!==a?a:""}),t.headers.map(function(t){var r,a;return n.createElement("div",Object.assign({},t.getHeaderProps(t.getSortByToggleProps()),{className:null!==(a=null===(r=e.theme)||void 0===r?void 0:r.headerCell)&&void 0!==a?a:""}),t.render("Header",{renderSortIndicator:function(){return n.createElement(S,{column:t,theme:e.theme})}}),!t.hideSortIndicator&&n.createElement(S,{column:t,theme:e.theme}))}))})),n.createElement("div",Object.assign({},I(),{className:null!==(f=null===(d=e.theme)||void 0===d?void 0:d.body)&&void 0!==f?f:""}),e.enableSortableRows?n.createElement(c.Q,{ids:R.map(function(e){return e.original.id}),getDragOverlay:function(t){var r,a,i=R.findIndex(function(e){return e.original.id===t}),o=R[i];return n.createElement("div",Object.assign({},e,{className:(r=e.theme,a="g-0 ",r&&(a+=r.row),a),style:m}),U(o))},onSortEnd:e.onSortingRowsEnd},M()):M()))}function I(e){var t=e.enableSlider,r=e.scrollIncrement,i=e.scrollable,l=w(e,["enableSlider","scrollIncrement","scrollable"]),c=function(){var e,t,r=n.useRef(null),a=(e=n.useState(h(r)),t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(e,t)||g(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),i=a[0],l=a[1],c=o.q.throttle(function(){l(h(r))},200),s=n.useCallback(function(e){var t;r.current&&(null===(t=r.current)||void 0===t||t.removeEventListener("scroll",c)),e&&(l(h(r)),e.addEventListener("scroll",c)),r.current=e},[]);return n.useEffect(function(){(null==r?void 0:r.current)&&l(h(r))},[r]),{ref:s,scrollState:i,scroll:function(e){var t;null===(t=r.current)||void 0===t||t.scrollBy({left:e,top:0,behavior:"smooth"})}}}(),s=c.ref,u=c.scrollState,m=c.scroll;if(i)return n.createElement(a.$B,{renderTrackHorizontal:function(){return n.createElement("div",{className:b.scrollbarTrack})},autoHeightMax:1e4,autoHeight:!0},n.createElement(E,Object.assign({},l)));if(!t)return n.createElement(E,Object.assign({},l));function f(e){m(r*("right"===e?1:-1))}return n.createElement("div",{className:"mx-n4 overflow-x-hidden overflow-y-hidden"},n.createElement("div",{className:"px-4"},n.createElement("div",{className:"position-relative"},n.createElement(d.W,{direction:d.f.Left,onClick:function(){return f("left")},hide:!u.canScrollLeft}),n.createElement("div",{className:"".concat(b.scrollContainer," ").concat(e.scrollContainerClassName),ref:s},n.createElement(E,Object.assign({},l))),n.createElement(d.W,{direction:d.f.Right,onClick:function(){return f("right")},hide:!u.canScrollRight}))))}I.defaultProps={scrollIncrement:250,scrollable:!1,layout:"flex"}},94892:(e,t,r)=>{r.d(t,{T:()=>a,i:()=>n});var n={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},28972:(e,t,r)=>{var n;r.d(t,{w:()=>n}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(n||(n={}))},8246:(e,t,r)=>{var n;r.d(t,{N:()=>n}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(n||(n={}))},54405:(e,t,r)=>{r.d(t,{X:()=>n});var n={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},83140:(e,t,r)=>{r.d(t,{A:()=>g});var n=r(28972),a=r(8246),i=r(56644);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function l(e,t,r){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function c(){return n.w.NotApplicable}function s(e,t){var r=e.actionableItems.filter(function(e){return e.isCorrect});return r.every(function(e){return!t(e.id)})?n.w.UnAnswered:r.every(function(e){var r;return e.name.trim().toLowerCase()===(null===(r=t(e.id))||void 0===r?void 0:r.trim().toLowerCase())})?n.w.Correct:n.w.Incorrect}function u(e,t){return e.actionableItems.every(function(e){return!t(e.id)})?n.w.UnAnswered:e.actionableItems.filter(function(e){return e.isCorrect}).every(function(e){var r,n=t(e.id);return(null==n?void 0:n.toString())===(null===(r=e.id)||void 0===r?void 0:r.toString())||n===e.name})?n.w.Correct:n.w.Incorrect}function d(e,t){return function(r){var n=null==t?void 0:t.attempts.find(function(t){return t.id===e.id});return null==n?void 0:n.answers.find(function(e){return e.id===r})}}function m(e,t){var r=d(e,t);return u(e,function(e){var t=r(e);return null==t?void 0:t.text})}function f(e,t){return function(e,t){var r;return e.actionableItems.forEach(function(e){var i=t(e.id);r=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?n.w.AwaitingMarking:n.w.Incorrect:n.w.Correct:n.w.UnAnswered}),r}(e,d(e,t))}var v=l(l(l(l(l(l(l({},i.Z9.Annotation,c),i.Z9.Image,c),i.Z9.MissingWord,function(e,t){var r=d(e,t);return s(e,function(e){var t=r(e);return null==t?void 0:t.text})}),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,f),i.Z9.TrueOrFalse,m),i.Z9.Illustration,f),g={notApplicable:c,awaitingMarking:function(){return n.w.AwaitingMarking},isMissingWordCorrect:s,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,v[e.typeId])(e,t)}}},78057:(e,t,r)=>{r.d(t,{R:()=>C});var n=r(32735),a=r(75896),i=r(23481),o=r(97958),l=i.T.encloseNamespace("shared.studentResultsTable");function c(e){return"not_completed"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.notCompletedImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("notCompletedDescription"))):"marking_required"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.markingRequiredImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("markingRequiredDescription"))):"helping_hand"===e.filter?n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.helpingHandImageUrl,size:"small"}),n.createElement(o.u.Info,null,l("helpingHandDescription"))):n.createElement(o.u,{className:"bg-white rounded-bottom py-5"},n.createElement(o.u.Image,{src:e.emptyStateImageUrl,size:"small"}),n.createElement(o.u.Heading,null,l("emptyStateHeading")),n.createElement(o.u.Info,null,l("emptyStateDescription")))}var s=r(83345),u="shared.studentResultsTable";function d(e){function t(t){var r=e.filter===t?null:t;e.setFilter(r)}function r(t){return"btn btn-outline-dark ".concat(function(t){return e.filter===t}(t)?"bg-dark text-white":"")}return n.createElement("div",{className:"d-flex align-items-center mb-3"},n.createElement("p",{className:"h6 mb-0"},n.createElement(s.x,{namespace:u,phrase:"filters"})),n.createElement("div",{className:"d-flex border-start ps-3 ms-3 gap-2"},n.createElement("button",{className:r("not_completed"),onClick:function(){return t("not_completed")}},n.createElement(s.x,{namespace:u,phrase:"notCompletedFilter"})),n.createElement("button",{className:r("marking_required"),onClick:function(){return t("marking_required")}},n.createElement(s.x,{namespace:u,phrase:"markingRequiredFilter"})),n.createElement("button",{className:r("helping_hand"),onClick:function(){return t("helping_hand")}},n.createElement(s.x,{namespace:u,phrase:"helpingHandFilter"}))))}var m=r(97364),f=r(6748),v=r(84806),g=r(19912);function p(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return h(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?h(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var b={table:"".concat(g.Z.fixedTable," bg-white rounded-start border border-end-0"),header:"".concat(g.Z.header," border-bottom"),headerRow:"h-100",headerCell:"d-flex align-items-center justify-content-start",row:g.Z.row},y={header:"".concat(g.Z.header," fw-bold"),headerRow:"h-100",headerCell:"".concat(g.Z.interactionHeaderCellOuter," bg-white border-bottom"),row:"".concat(g.Z.row," ").concat(g.Z.resultsRow),cell:g.Z.resultsCellOuter};function w(e){var t,r=p(n.useState((0,m.P)(e.sortBy,"score")),2),i=r[0],o=r[1],l=p(n.useState(e.filterBy),2),s=l[0],u=l[1],h=n.useRef(null),w=(0,v.R7)(e.results,e.anonymiseUsers,null===(t=e.config)||void 0===t?void 0:t.imageCdnUrl,e.showSeparateNameColumns),S=(0,v.lE)(e.interactive,e.interactiveMetadata,e.results,function(e){(0,v.bB)(h.current,e)},e.refreshTable),E=(0,v.Fx)(e.interactive,e.results,e.refreshTable,e.anonymiseUsers,a.m.first(i),s,e.showSeparateNameColumns);function I(e){(0,v.l8)(h.current,e)}return n.createElement("div",null,!!e.results.students.length&&n.createElement(d,{filter:s,setFilter:u}),!E.length&&n.createElement(c,{emptyStateImageUrl:e.emptyStateImageUrl,helpingHandImageUrl:e.helpingHandImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,notCompletedImageUrl:e.notCompletedImageUrl,filter:s}),!!E.length&&n.createElement("div",{ref:h,className:"d-flex".concat(E.length&&S.length?" ".concat(g.Z.hasResults):"")},n.createElement(f.i,{columns:w,data:E,theme:S.length?b:Object.assign(Object.assign({},b),{table:"".concat(g.Z.fixedTable," bg-white rounded border")}),onSelectRow:function(t){var r=t.original;e.viewStudentResults(r.user,e.interactiveMetadata.id)},onRowMouseOver:function(e){return I(e.index)},onRowMouseLeave:function(){return I()},enableSort:!0,manualSort:!0,onSort:o,initialSortBy:i}),!!S.length&&n.createElement(f.i,{columns:S,data:E,theme:y,enableSlider:!0,scrollIncrement:8*v.Ju,onSelectCell:function(t){e.viewStudentResults(t.row.original.user,e.interactiveMetadata.id,t.column.id)},scrollContainerClassName:"rounded-end border border-start-0 border"})))}var S=r(99742);const E={partialInsights:"qSeTe"};function I(){return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-3"},n.createElement("p",{className:"h6 px-4 mb-0 me-4 partial-loading-background"}," "),n.createElement("div",{className:"row g-2 w-50"},n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")),n.createElement("div",{className:"col-3"},n.createElement("div",{className:"p-2 rounded-1 partial-loading-background"}," ")))),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-12"},n.createElement("div",{className:"".concat(E.partialInsights," rounded partial-loading-background")}))))}function C(e){return n.createElement(n.Fragment,null,!e.hasDataLoaded&&n.createElement(I,null),e.hasDataLoaded&&n.createElement(w,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,refreshTable:e.isFetching||e.hideStaffResults,viewStudentResults:e.viewStudentResults,emptyStateImageUrl:S.W.Insights.NO_RESPONSES,sortBy:e.sortBy,filterBy:e.filterBy,anonymiseUsers:e.anonymiseUsers,notCompletedImageUrl:S.W.Insights.JIGSAW,markingRequiredImageUrl:S.W.Insights.CLIPBOARD,helpingHandImageUrl:S.W.Insights.SPEECH_BUBBLE_HEART,config:e.config,showSeparateNameColumns:!0}))}},9566:(e,t,r)=>{r.d(t,{$Z:()=>g,G6:()=>m,GJ:()=>v,VE:()=>b,_w:()=>f,po:()=>h,vJ:()=>p});var n=r(23481),a=r(110),i=r(33518),o=r(2510),l=r(4594),c=r(35223),s=r(14070),u=r(97291),d=n.T.encloseNamespace("myShares.demoInsights"),m={type:o.y.Link,privacy:i.e.JustMySchool,objectId:"0",objectTypeId:l.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),dateShared:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},f=Object.assign(Object.assign({},m),{type:o.y.Open,expireDate:a.O.add(new Date(m.dateCreated),30,"days").toISOString(),privacy:i.e.PinCode}),v={share:m,sharedObject:null,shareRecipients:null,dateShared:a.O.subtract(new Date,7,"days").toISOString()},g=Object.assign(Object.assign({},v),{share:f}),p={application:u.O.MY_SHARES,action:s.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},h={application:u.O.MY_SHARES,action:s.e.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO},b={svgName:c.vn.Analytics,label:d("demoInsights"),appLink:p,group:"insights",className:"btn btn-outline-dark"}},82433:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsStudentsDemoView:()=>I});var n=r(32735),a=r(81886),i=r(23481),o=r(2948),l=r(20354),c=r(26025),s=r(2510),u=r(38143),d=r(39151),m=r(54405),f=r(93322),v=r(79612),g=r(14070),p=r(97291),h=r(74049),b=r(78057),y=r(9566),w=r(10447);function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var E=i.T.encloseNamespace("insights.interactiveInsightsStudents");function I(e){var t,r,i,I,C,R=(I=(0,o.D)(u.g.ANONYMISE_USERS),C=1,function(e){if(Array.isArray(e))return e}(I)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,o,l=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){s=!0,a=e}finally{try{if(!c&&null!=r.return&&(o=r.return(),Object(o)!==o))return}finally{if(s)throw a}}return l}}(I,C)||function(e,t){if(e){if("string"==typeof e)return S(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?S(e,t):void 0}}(I,C)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,f.F)();var O=l.a.useBasicFetch(d.L.config()),A=l.a.useBasicFetch(m.X.interactiveMetadata()),k=l.a.useBasicFetch(m.X.interactive()),N=c.B.getAudienceAppLinkParams(),j=c.B.getDateRangeAppLinkParams(),M=l.a.useBasicFetch(m.X.interactiveResults()),U=k.data&&A.data&&!!M.data;(0,v.M)({title:A.data?E("pageTitle",{video:null===(t=A.data)||void 0===t?void 0:t.name}):null});var T=Object.assign(Object.assign({},N),j),B=e.type===s.y.Open?y._w:y.G6;return n.createElement("div",{className:"px-3"},n.createElement(h.j,{tabs:(0,w.aq)(null===(r=A.data)||void 0===r?void 0:r.id,"results",T,e.type),video:A.data,dateRangeAppLinkParams:j,share:Object.assign(Object.assign({},B),{objectId:null===(i=A.data)||void 0===i?void 0:i.id}),yearGroups:[],markingRequired:e.type!==s.y.Open,isDemo:!0,hasData:!0}),n.createElement(b.R,{interactiveMetadata:A.data,viewStudentResults:function(e,t,r){a.Q.C$.trigger({application:p.O.MY_SHARES,action:g.e.MyShares.INTERACTIVE_STUDENT_RESULTS_DEMO,params:{studentId:e.id,interactiveMetadataId:t,interactionId:r,sessionId:e.sessionId}})},interactive:k.data,results:M.data,filterBy:e.filterBy,sortBy:e.sortBy,isFetching:M.isFetching,anonymiseUsers:R,hasDataLoaded:U,config:O.data,hideStaffResults:!1}))}}}]);
2
- //# sourceMappingURL=787-dcb3a0a26c-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/787-dcb3a0a26c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/DragOverlayStyles.ts","file:///app/packages/libs/shared/src/components/table/TableUtils.ts","file:///app/packages/libs/shared/src/components/table/table.scss","file:///app/packages/libs/shared/src/components/table/Table.tsx","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/partial-interactive-insights-students.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/students/InteractiveInsightsStudentsDemoView.tsx"],"sourcesContent":["import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise) {\n if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","export const DragOverlayStyles = { opacity: '0.8', cursor: 'grabbing' };","import React from 'react';\nimport { PluginHook, useBlockLayout, useFilters, useFlexLayout, useGlobalFilter, useRowSelect, useSortBy } from 'react-table';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface PluginOptions {\n allowFiltering?: boolean;\n allowGlobalFiltering?: boolean;\n layout?: 'flex' | 'block';\n}\n\nexport function getPlugins<T extends HashObject>(props: PluginOptions): PluginHook<T>[] {\n let plugins: PluginHook<T>[] = [\n useSortBy,\n useRowSelect,\n props.layout === 'flex' ? useFlexLayout : useBlockLayout\n ];\n\n if (props.allowFiltering)\n plugins = [\n ...plugins,\n useFilters\n ];\n\n if (props.allowGlobalFiltering)\n plugins = [\n ...plugins,\n useGlobalFilter\n ];\n\n return plugins;\n}\n\nexport function getSelectedRowIds(ids: string[]): Record<string, boolean> {\n const idHash: Record<string, boolean> = {};\n\n ids.forEach(id => idHash[id] = true);\n\n return idHash;\n}\n\ninterface TableScrollState {\n canScrollLeft: boolean;\n canScrollRight: boolean;\n}\n\nfunction calculateScrollState(ref: React.MutableRefObject<HTMLDivElement>): TableScrollState {\n const canScrollLeft = ref.current?.scrollLeft > 0;\n const canScrollRight = (ref.current?.scrollLeft + 1) < ref.current?.scrollWidth - ref.current?.clientWidth;\n\n return { canScrollLeft, canScrollRight };\n}\n\ninterface UseTableScroll {\n ref: (el: HTMLDivElement) => void;\n scrollState: TableScrollState;\n scroll: (scrollBy: number) => void;\n}\n\nexport function useTableScroll(): UseTableScroll {\n const elRef = React.useRef<HTMLDivElement>(null);\n const [ scrollState, setScrollState ] = React.useState<TableScrollState>(calculateScrollState(elRef));\n\n function onScroll(): void {\n setScrollState(calculateScrollState(elRef));\n }\n\n function scroll(scrollBy: number): void {\n elRef.current?.scrollBy({ left: scrollBy, top: 0, behavior: 'smooth' });\n }\n\n const throttledOnScroll = FunctionHelper.throttle(onScroll, 200);\n\n const ref = React.useCallback((el: HTMLDivElement) => {\n if (elRef.current) {\n elRef.current?.removeEventListener('scroll', throttledOnScroll);\n }\n\n if (el) {\n setScrollState(calculateScrollState(elRef));\n el.addEventListener('scroll', throttledOnScroll);\n }\n\n elRef.current = el;\n }, []);\n\n React.useEffect(() => {\n if (elRef?.current) {\n setScrollState(calculateScrollState(elRef));\n }\n }, [elRef]);\n\n return { ref, scrollState, scroll };\n}","// extracted by mini-css-extract-plugin\nexport default {\"sortIndicator\":\"gFhu0\",\"scrollContainer\":\"sWUp9\",\"scrollbarTrack\":\"Vn2qM\"};","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport {\n Cell,\n Column as BaseColumn,\n HeaderGroup,\n HeaderProps as BaseHeaderProps,\n IdType,\n Row,\n SortingRule,\n TableOptions,\n TableRowProps,\n useTable } from 'react-table';\nimport { DragEndEvent } from '@dnd-kit/core';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { PropsWithSortableItemProps, SortableItemWrapper } from 'libs/shared/components/sortable/SortableItemWrapper';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { DragOverlayStyles } from 'libs/shared/constants/DragOverlayStyles';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { getPlugins, getSelectedRowIds, useTableScroll } from './TableUtils';\n\nimport styles from './table.scss';\n\nexport interface TableTheme {\n table?: string;\n header?: string;\n headerRow?: string;\n headerCell?: string;\n body?: string;\n row?: string | ((row: Row<any>) => string);\n selectedRow?: string;\n cell?: string | ((row?: Row<any>, cell?: Cell<any, any>) => string);\n sortIndicator?: string;\n}\n\nexport type HeaderProps<T extends HashObject> = BaseHeaderProps<T> & {\n renderSortIndicator: () => void;\n}\n\nexport type Column<T extends HashObject> = BaseColumn<T> & {\n hideSortIndicator?: boolean;\n}\n\ninterface SortIndicatorProps<T extends HashObject> {\n column: HeaderGroup<T>;\n theme?: TableTheme;\n}\n\nfunction SortIndicator<T extends HashObject>(props: SortIndicatorProps<T>): JSX.Element {\n if (!props.column.canSort)\n return <></>;\n\n return (\n <span\n className={\n `${styles.sortIndicator}\n ${!props.column.isSorted ? 'text-secondary' : ''}\n ${props.theme?.sortIndicator ?? ''}`\n }\n >\n <SvgContainer\n svgName={(props.column.isSortedDesc || !props.column.isSorted)\n ? cvSvgLibrary.ArrowRight\n : cvSvgLibrary.ArrowLeft\n }\n size={SvgContainerSize.Small}\n />\n </span>\n );\n}\n\ninterface BaseTableProps<T extends HashObject> {\n /**\n * Must be memoized.\n */\n data: T[];\n\n /**\n * Must be memoized.\n * \n * For documentation on Column Options, see https://react-table.tanstack.com/docs/api/useTable#column-options\n */\n columns: Column<T>[];\n\n theme?: TableTheme;\n\n onSelectRow?: (row: Row<T>) => void;\n\n onSelectCell?: (cell: Cell<T>) => void;\n\n onRowMouseOver?: (row: Row<T>) => void;\n\n onRowMouseLeave?: (row: Row<T>) => void;\n\n allowSelectMultipleRows?: boolean;\n\n initialSelectedRowIds?: string[];\n\n getRowId?: (row: T) => string;\n\n getRowAppLink?: (row: Row<T>) => Core.AppLink;\n\n enableSort?: boolean;\n\n manualSort?: boolean;\n\n onSort?: (sortingRule: SortingRule<T>[]) => void;\n \n // Opt-in to utilise react-table's useFilter hook.\n allowFiltering?: boolean;\n\n // Opt-in to utilise react-table's useGlobalFilter hook.\n allowGlobalFiltering?: boolean;\n\n // Use either a flex layout or a block layout. Default is flex.\n layout?: 'flex' | 'block';\n\n // Used by useGlobalFilter hook, needs to be enabled by prop above.\n globalFilter?: string;\n\n // Set initial state of hidden columns in react-table.\n hiddenColumns?: IdType<T>[];\n\n // Determine whether hidden columns should be preserved on a table update event.\n autoResetHiddenColumns?: boolean;\n\n // Determine whether sort order state should be preserved on a table update event.\n autoResetSortBy?: boolean;\n\n // Determine whether rows are sortable by drag and drop\n enableSortableRows?: boolean;\n\n onSortingRowsEnd?: (event: DragEndEvent) => void;\n\n // Set initial state of sorting in react-table\n initialSortBy?: SortingRule<T>[];\n\n emptyState?: JSX.Element;\n}\n \ntype SortableRowProps = PropsWithSortableItemProps<TableRowProps>;\n\nfunction BaseTable<T extends HashObject>(props: BaseTableProps<T>): JSX.Element {\n const tableOptions: TableOptions<T> = {\n columns: props.columns,\n data: props.data,\n disableSortBy: !props.enableSort,\n manualSortBy: props.manualSort,\n autoResetHiddenColumns: props.autoResetHiddenColumns,\n autoResetSortBy: props.autoResetSortBy,\n initialState: {\n sortBy: props.initialSortBy || []\n }\n };\n\n if (props.initialSelectedRowIds)\n tableOptions.initialState = { selectedRowIds: getSelectedRowIds(props.initialSelectedRowIds) };\n\n if (props.getRowId)\n tableOptions.getRowId = props.getRowId;\n\n const {\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n toggleAllRowsSelected,\n setGlobalFilter,\n setHiddenColumns,\n state: { sortBy }\n } = useTable<T>(tableOptions, ...getPlugins<T>({ ...props }));\n\n function getTableRowsClass(row: Row<T>) {\n let className = FunctionHelper.isFunction(props.theme?.row)\n ? props.theme.row(row)\n : props.theme?.row ?? '';\n\n if (row.isSelected && props.theme?.selectedRow)\n className += ` ${props.theme?.selectedRow}`;\n\n if (props.onSelectRow)\n className += ' cursor-pointer';\n\n if (props.enableSortableRows)\n className += ' cursor-grab';\n\n return className;\n }\n\n function renderTableRows() {\n if (!rows.length && props.emptyState)\n return props.emptyState;\n \n return rows.map(row => {\n prepareRow(row);\n \n const className = getTableRowsClass(row);\n const rowAppLink = !!props.getRowAppLink && props.getRowAppLink(row);\n\n function onClickRow(): void {\n if (!props.onSelectRow)\n return;\n\n if (!props.allowSelectMultipleRows)\n toggleAllRowsSelected(false);\n \n props.onSelectRow(row);\n row.toggleRowSelected(true);\n }\n\n function getSortableProps(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any) {\n if ('dragAttributes' in props && 'dragListeners' in props) {\n return {\n ...props.dragAttributes,\n ...props.dragListeners,\n 'aria-roledescription': 'Sortable row',\n ref\n };\n }\n\n return {};\n }\n\n function renderRow(props: TableRowProps | PropsWithSortableItemProps<TableRowProps>, ref?: any): JSX.Element {\n const sortableProps = getSortableProps(props, ref);\n\n if (rowAppLink) {\n return (\n <div\n role='row'\n key={row.id}\n >\n <AppLink\n {...props}\n {...sortableProps}\n className={className}\n appLink={rowAppLink}\n >\n {renderCells(row)}\n </AppLink>\n </div>\n );\n }\n\n return (\n <div\n {...props}\n {...sortableProps}\n key={row.id}\n role='row'\n className={className}\n onClick={onClickRow}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n const rowProps = row.getRowProps();\n\n if (props.enableSortableRows) {\n return (\n <SortableItemWrapper\n id={row.original.id}\n key={row.id}\n childProps={rowProps}\n childComponent={React.forwardRef(\n (props: SortableRowProps, ref: React.LegacyRef<HTMLDivElement>) => (renderRow(props, ref))\n )}\n />\n );\n }\n\n return renderRow(rowProps);\n });\n }\n\n function getDragOverlayClassName(theme: TableTheme): string {\n let className = 'g-0 ';\n\n if (theme)\n className += theme.row;\n\n return className;\n }\n\n function getDragOverlay(id: string) {\n const rowIndex = rows.findIndex(item => item.original.id === id);\n const row = rows[rowIndex];\n \n return (\n <div\n {...props}\n className={getDragOverlayClassName(props.theme)}\n style={DragOverlayStyles}\n >\n {renderCells(row)}\n </div>\n );\n }\n\n function getCellClassName(row: Row<T>, cell: Cell<T>): string {\n let cellClassName = '';\n\n if (typeof props.theme?.cell === 'function')\n cellClassName = props.theme.cell(row, cell);\n\n if (typeof props.theme?.cell === 'string')\n cellClassName = props.theme.cell;\n\n if (props.onSelectCell)\n cellClassName += ' cursor-pointer';\n\n return cellClassName;\n }\n\n function renderCells(row: Row<T>): JSX.Element[] {\n return row.cells.map(cell => {\n const cellClassName = getCellClassName(row, cell);\n\n function onClickCell(): void {\n props.onSelectCell && props.onSelectCell(cell);\n }\n\n return (\n <div key={cell.column.id} {...cell.getCellProps()} className={cellClassName} onClick={onClickCell} >\n {cell.render('Cell')}\n </div>\n );\n });\n }\n\n React.useEffect(() => {\n if (!props.onSort)\n return;\n\n props.onSort(sortBy);\n }, [sortBy]);\n\n React.useEffect(() => {\n if (!props.globalFilter)\n return;\n\n setGlobalFilter(props.globalFilter);\n }, [props.globalFilter]);\n\n React.useEffect(() => {\n if (!props.hiddenColumns)\n return;\n\n setHiddenColumns(props.hiddenColumns);\n }, [props.hiddenColumns && props.hiddenColumns.length]);\n\n return (\n <div {...getTableProps()} className={props.theme?.table ?? ''}>\n <div className={props.theme?.header ?? ''}>\n {headerGroups.map(headerGroup => (\n <div {...headerGroup.getHeaderGroupProps()} className={props.theme?.headerRow ?? ''}>\n {headerGroup.headers.map(column => (\n <div {...column.getHeaderProps(column.getSortByToggleProps())} className={props.theme?.headerCell ?? ''}>\n {column.render('Header', { renderSortIndicator: () => <SortIndicator column={column} theme={props.theme} /> })}\n {!(column as Column<T>).hideSortIndicator &&\n <SortIndicator column={column} theme={props.theme} />\n }\n </div>\n ))}\n </div>\n ))}\n </div>\n <div {...getTableBodyProps()} className={props.theme?.body ?? ''}>\n { props.enableSortableRows ? (\n <SortableContainerWrapper\n ids={rows.map(row => row.original.id)}\n getDragOverlay={getDragOverlay}\n onSortEnd={props.onSortingRowsEnd}\n >\n {renderTableRows()}\n </SortableContainerWrapper>\n ) : (\n renderTableRows()\n )}\n </div>\n </div>\n );\n}\n\ninterface TableProps<T extends HashObject> extends BaseTableProps<T> {\n enableSlider?: boolean;\n scrollIncrement?: number;\n scrollContainerClassName?: string;\n scrollable?: boolean;\n initialSortBy?: SortingRule<T>[];\n}\n\nTable.defaultProps = {\n scrollIncrement: 250,\n scrollable: false,\n layout: 'flex'\n};\n\nexport function Table<T extends HashObject>(props: TableProps<T>): JSX.Element {\n const { enableSlider, scrollIncrement, scrollable, ...tableProps } = props;\n\n const { ref, scrollState, scroll } = useTableScroll();\n\n if (scrollable) {\n return (\n <Scrollbars\n renderTrackHorizontal={() => <div className={styles.scrollbarTrack} />}\n autoHeightMax={10000}\n autoHeight\n >\n <BaseTable {...tableProps} />\n </Scrollbars>\n );\n }\n\n if (!enableSlider)\n return <BaseTable {...tableProps} />;\n\n function onClickScroll(direction: 'left' | 'right'): void {\n scroll(scrollIncrement * (direction === 'right' ? 1 : -1));\n }\n\n return (\n <div className='mx-n4 overflow-x-hidden overflow-y-hidden'>\n <div className='px-4'>\n <div className='position-relative'>\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => onClickScroll('left')}\n hide={!scrollState.canScrollLeft}\n />\n <div className={`${styles.scrollContainer} ${props.scrollContainerClassName}`} ref={ref}>\n <BaseTable {...tableProps } />\n </div>\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => onClickScroll('right')}\n hide={!scrollState.canScrollRight}\n />\n </div>\n </div>\n </div>\n );\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResultsEmptyStateProps {\n filter: FilterStudentsBy;\n notCompletedImageUrl: string;\n helpingHandImageUrl: string;\n markingRequiredImageUrl: string;\n emptyStateImageUrl: string;\n}\n\nexport function StudentResultsEmptyState(props: StudentResultsEmptyStateProps) {\n if (props.filter === 'not_completed') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.notCompletedImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('notCompletedDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n if (props.filter === 'marking_required') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.markingRequiredImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('markingRequiredDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n if (props.filter === 'helping_hand') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.helpingHandImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('helpingHandDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.studentResultsTable';\n\ninterface StudentResultsTableFiltersProps {\n filter: FilterStudentsBy;\n setFilter: (filter: FilterStudentsBy) => void;\n}\n\nexport function StudentResultsTableFilterButtons(props: StudentResultsTableFiltersProps) {\n function toggleFilter(selectedFilter: FilterStudentsBy) {\n const updatedFilter = props.filter === selectedFilter ? null : selectedFilter;\n\n props.setFilter(updatedFilter);\n }\n\n function isFilterSelected(filter: FilterStudentsBy) {\n return props.filter === filter;\n }\n\n function getClassName(filter: FilterStudentsBy) {\n return `btn btn-outline-dark ${isFilterSelected(filter) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start ps-3 ms-3 gap-2'>\n <button className={getClassName('not_completed')} onClick={() => toggleFilter('not_completed')}>\n <Text namespace={namespace} phrase='notCompletedFilter' />\n </button>\n <button className={getClassName('marking_required')} onClick={() => toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequiredFilter' />\n </button>\n <button className={getClassName('helping_hand')} onClick={() => toggleFilter('helping_hand')}>\n <Text namespace={namespace} phrase='helpingHandFilter' />\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Cell, Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { StudentResultsEmptyState } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState';\nimport { StudentResultsTableFilterButtons } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy, getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport {\n highlightColumns,\n highlightRows,\n RESULTS_COL_WIDTH,\n useGetFixedColumns,\n useGetResultColumns,\n useGetResultsTableData\n} from './StudentResultsTableUtils';\n\nimport styles from './student-results-table.scss';\n\nconst fixedTableTheme: TableTheme = {\n table: `${styles.fixedTable} bg-white rounded-start border border-end-0`,\n header: `${styles.header} border-bottom`,\n headerRow: 'h-100',\n headerCell: 'd-flex align-items-center justify-content-start',\n row: styles.row\n};\n\nconst resultsTableTheme: TableTheme = {\n header: `${styles.header} fw-bold`,\n headerRow: 'h-100',\n headerCell: `${styles.interactionHeaderCellOuter} bg-white border-bottom`,\n row: `${styles.row} ${styles.resultsRow}`,\n cell: styles.resultsCellOuter\n};\n\ninterface StudentResultsTableProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n config?: Config;\n selectedStudentId?: string;\n emptyStateImageUrl?: string;\n notCompletedImageUrl?: string;\n helpingHandImageUrl?: string;\n markingRequiredImageUrl?: string;\n anonymiseUsers?: boolean;\n sortBy?: SortStudentsBy;\n filterBy?: FilterStudentsBy;\n showSeparateNameColumns?: boolean;\n viewStudentResults: (\n student: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n}\n\nexport function StudentResultsTable(props: StudentResultsTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<StudentResultsWithSummary>[]>(\n getSortStudents(props.sortBy, 'score')\n );\n const [ filter, setFilter ] = React.useState<FilterStudentsBy>(props.filterBy);\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n const fixedColumns = useGetFixedColumns(\n props.results,\n props.anonymiseUsers,\n props.config?.imageCdnUrl,\n props.showSeparateNameColumns\n );\n const resultColumns = useGetResultColumns(\n props.interactive,\n props.interactiveMetadata,\n props.results,\n onColumnHover,\n props.refreshTable\n );\n const data = useGetResultsTableData(\n props.interactive,\n props.results,\n props.refreshTable,\n props.anonymiseUsers,\n ArrayHelper.first(sortBy),\n filter,\n props.showSeparateNameColumns\n );\n\n function onSelectStudent({ original }: Row<StudentResultsWithSummary>): void {\n props.viewStudentResults(original.user, props.interactiveMetadata.id);\n }\n\n function onSelectStudentResponse(cell: Cell<StudentResultsWithSummary>): void {\n props.viewStudentResults(\n cell.row.original.user,\n props.interactiveMetadata.id,\n cell.column.id\n );\n }\n\n function onColumnHover(index?: number): void {\n highlightColumns(ref.current, index);\n }\n\n function onRowHover(index?: number): void {\n highlightRows(ref.current, index);\n }\n\n function getFixedTableTheme(): TableTheme {\n if (resultColumns.length)\n return fixedTableTheme;\n\n return {\n ...fixedTableTheme,\n table: `${styles.fixedTable} bg-white rounded border`\n };\n }\n\n return (\n <div>\n {!!props.results.students.length && <StudentResultsTableFilterButtons filter={filter} setFilter={setFilter} />}\n\n {!data.length && (\n <StudentResultsEmptyState\n emptyStateImageUrl={props.emptyStateImageUrl}\n helpingHandImageUrl={props.helpingHandImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n notCompletedImageUrl={props.notCompletedImageUrl}\n filter={filter}\n />\n )}\n\n {!!data.length && (\n <div ref={ref} className={`d-flex${data.length && resultColumns.length ? ` ${styles.hasResults}` : ''}`}>\n <Table\n columns={fixedColumns}\n data={data}\n theme={getFixedTableTheme()}\n onSelectRow={onSelectStudent}\n onRowMouseOver={row => onRowHover(row.index)}\n onRowMouseLeave={() => onRowHover()}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n {!!resultColumns.length &&\n <Table\n columns={resultColumns}\n data={data}\n theme={resultsTableTheme}\n enableSlider\n scrollIncrement={RESULTS_COL_WIDTH * 8}\n onSelectCell={onSelectStudentResponse}\n scrollContainerClassName='rounded-end border border-start-0 border'\n />\n }\n </div>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qSeTe\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-students.scss';\n\nexport function PartialInteractiveInsightsStudents() {\n return (\n <div>\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 px-4 mb-0 me-4 partial-loading-background'>&nbsp;</p>\n <div className='row g-2 w-50'>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n </div>\n </div>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { StudentResultsTable } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTable';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents';\n\ninterface InteractiveInsightsStudentsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n isFetching: boolean;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n anonymiseUsers: boolean;\n config: Config;\n viewStudentResults: (\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n hasDataLoaded: boolean;\n hideStaffResults: boolean;\n showSeparateNameColumns?: boolean;\n}\n\nexport function InteractiveInsightsStudents(props: InteractiveInsightsStudentsProps) {\n return (\n <>\n {!props.hasDataLoaded &&\n <PartialInteractiveInsightsStudents />\n }\n\n {props.hasDataLoaded &&\n <StudentResultsTable\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n refreshTable={props.isFetching || props.hideStaffResults}\n viewStudentResults={props.viewStudentResults}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n sortBy={props.sortBy}\n filterBy={props.filterBy}\n anonymiseUsers={props.anonymiseUsers}\n notCompletedImageUrl={ImageUrls.Insights.JIGSAW}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n helpingHandImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n config={props.config}\n showSeparateNameColumns\n />\n }\n </>\n );\n}","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n dateShared: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE: Share = {\n ...DEMO_INSIGHTS_SHARE,\n type: ShareType.Open,\n expireDate: DateHelper.add(new Date(DEMO_INSIGHTS_SHARE.dateCreated), 30, 'days').toISOString(),\n privacy: SharePrivacy.PinCode\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA: MySharesTableData = {\n ...DEMO_INSIGHTS_SHARE_TABLE_DATA,\n share: DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE\n};\n\nexport const DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n type?: ShareType;\n}\n\nexport function InteractiveInsightsStudentsDemoView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(InsightsDemoRequests.interactiveMetadata());\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS_DEMO,\n params: {\n studentId: user.id,\n interactiveMetadataId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'results', params, props.type)}\n video={interactiveMetadata.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n hideStaffResults={false}\n />\n </div>\n );\n}"],"names":["getPhrase","anonymiseUserName","user","shouldAnonymise","userId","id","sessionId","seed","guid","hash","i","length","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","deleted","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","map","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","filter","a","has","answers","questionId","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","DragOverlayStyles","opacity","cursor","calculateScrollState","ref","canScrollLeft","current","scrollLeft","canScrollRight","scrollWidth","clientWidth","SortIndicator","props","column","canSort","className","isSorted","theme","sortIndicator","SvgContainer","svgName","isSortedDesc","S","BaseTable","ids","idHash","tableOptions","columns","data","disableSortBy","enableSort","manualSortBy","manualSort","autoResetHiddenColumns","autoResetSortBy","initialState","sortBy","initialSortBy","initialSelectedRowIds","selectedRowIds","getRowId","useTable","plugins","useSortBy","useRowSelect","layout","useFlexLayout","useBlockLayout","allowFiltering","useFilters","allowGlobalFiltering","useGlobalFilter","getPlugins","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","toggleAllRowsSelected","setGlobalFilter","setHiddenColumns","state","renderTableRows","emptyState","row","FunctionHelper","isSelected","selectedRow","onSelectRow","enableSortableRows","getTableRowsClass","rowAppLink","getRowAppLink","onClickRow","allowSelectMultipleRows","toggleRowSelected","renderRow","sortableProps","dragAttributes","dragListeners","getSortableProps","role","key","AppLink","appLink","renderCells","onClick","rowProps","getRowProps","SortableItemWrapper","original","childProps","childComponent","cells","cell","cellClassName","onSelectCell","getCellClassName","getCellProps","render","onSort","globalFilter","hiddenColumns","table","header","headerGroup","getHeaderGroupProps","headerRow","headers","getHeaderProps","getSortByToggleProps","headerCell","renderSortIndicator","hideSortIndicator","body","SortableContainerWrapper","getDragOverlay","rowIndex","findIndex","item","onSortEnd","onSortingRowsEnd","Table","enableSlider","scrollIncrement","scrollable","tableProps","elRef","scrollState","setScrollState","throttledOnScroll","el","removeEventListener","addEventListener","scroll","scrollBy","left","top","behavior","useTableScroll","renderTrackHorizontal","autoHeightMax","autoHeight","onClickScroll","direction","WidgetButton","W","hide","scrollContainerClassName","defaultProps","ScoreThresholdDefaults","ScoreThresholdInsights","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","LanguageService","StudentResultsEmptyState","EmptyState","src","notCompletedImageUrl","markingRequiredImageUrl","helpingHandImageUrl","emptyStateImageUrl","StudentResultsTableFilterButtons","toggleFilter","selectedFilter","updatedFilter","setFilter","getClassName","isFilterSelected","Text","namespace","phrase","fixedTableTheme","resultsTableTheme","StudentResultsTable","setSortBy","filterBy","fixedColumns","anonymiseUsers","config","imageCdnUrl","showSeparateNameColumns","resultColumns","index","refreshTable","ArrayHelper","onRowHover","viewStudentResults","onRowMouseOver","onRowMouseLeave","PartialInteractiveInsightsStudents","InteractiveInsightsStudents","hasDataLoaded","isFetching","hideStaffResults","ImageUrls","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","toISOString","dateShared","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK","DEMO_INSIGHTS_ACTION","label","group","InteractiveInsightsStudentsDemoView","audienceAppLinkParams","dateRangeAppLinkParams","title","video","params","tabs","yearGroups","isDemo","hasData","interactiveMetadataId","studentId"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8077],{76153:(e,t,n)=>{n.d(t,{F:()=>s});var r=n(33003),i=n.n(r);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,a,l=[],c=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,i=e}finally{try{if(!c&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(u)throw i}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var c={secondary:{label:"Secondary",isTertiary:!1},"primary & secondary":{label:"Primary & Secondary",isTertiary:!1},k12:{label:"Primary & Secondary",isTertiary:!1},primary:{label:"Primary",isTertiary:!1},special:{label:"Special",isTertiary:!1},university:{label:"University",isTertiary:!0},middle:{label:"Middle",isTertiary:!1},"fe college":{label:"FE College",isTertiary:!0},"high school":{label:"Secondary",isTertiary:!1},elementary:{label:"Primary",isTertiary:!1},"middle school":{label:"Middle",isTertiary:!1},tafe:{label:"TAFE",isTertiary:!0},college:{label:"FE College",isTertiary:!0},"sixth form college":{label:"Sixth Form College",isTertiary:!0}},u={england:"ENG",scotland:"SCT",wales:"WLS","northern ireland":"NIR"},s={hashedEmail:function(e){var t=e.trim().toLowerCase();return i().hash(t)},removeEmptyKeys:function(e){if(Array.isArray(e))return e;var t=Object.assign({},e);return Object.entries(t).filter(function(e){var t=a(e,2)[1];return null!=t&&!("string"==typeof t&&!t.length)}).reduce(function(e,t){var n,r,i,l=a(t,2),c=l[0],u=l[1];return Object.assign(Object.assign({},e),(n={},r=c,i=u===Object(u)?s.removeEmptyKeys(u):u,(r=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,n))},{})},EVENT_TOPIC:"Free Trial Request",BDM_EVENT_TOPIC:"Requested free trial (Streamable Customer)",SOURCE:"cv_product_trial_requested",BDM_SOURCE:"cv_product_bdm_trial_requested",TRIAL_UPGRADE_SOURCE:"cv_product_trial_upgrade_requested",getSchoolType:function(e){var t;if(e){var n=e.toLowerCase();if(!["unknown","other"].includes(n))return(null===(t=c[n])||void 0===t?void 0:t.label)||e}},isTertiarySchool:function(e){var t;return(null===(t=c[null==e?void 0:e.toLowerCase()])||void 0===t?void 0:t.isTertiary)||!1},parseProvince:function(e){return e.length?u[e.toLowerCase()]||e:""}}},68077:(e,t,n)=>{n.r(t),n.d(t,{AmplitudeAnalyticsClient:()=>g});var r=n(25150),i=n(23794),o=n(74058),a=n(76991),l=n(41268),c=n(65858),u=n(76153),s=n(19808),p=n(25882),v=n(97291),y=n(91996);function d(e){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},d(e)}function f(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function S(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,h(r.key),r)}}function h(e){var t=function(e){if("object"!=d(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=d(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==d(t)?t:t+""}function m(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(m=function(){return!!e})()}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function E(e,t){return E=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},E(e,t)}var g=function(e){function t(e){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t,n){return t=b(t),function(e,t){if(t&&("object"==d(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,m()?Reflect.construct(t,n||[],b(e).constructor):t.apply(e,n))}(this,t,[e])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&E(e,t)}(t,e),n=t,h=[{key:"eventWhitelist",get:function(){return f(f(f(f(f(f(f(f(f({},c.Vw.SendEmail,y.S.isInviteEvent),c.Vw.Download,y.S.isResourceDownloadEvent),c.Vw.Share,y.S.isShareEvent),c.Vw.Stream,y.S.isStreamEvent),c.Vw.Click,y.S.isSupportedClickEvent),c.Vw.PageView,y.S.isPageViewEvent),c.Vw.Search,y.S.isSearch),c.Vw.Filter,y.S.isSearch),c.Vw.Submit,y.S.isUpgradeFormEvent)}}],(l=[{key:"name",get:function(){return"AmplitudeAnalyticsClient"}},{key:"initialize",value:function(e){this.initializeSessionReplay(e.accessPolicy);var t=u.F.hashedEmail(e.currentUser.email);r.S1(e.apiKey,t,{serverZone:e.instanceRegion===s.b.UK?"EU":"US",logLevel:i.i.Warn,identityStorage:"localStorage",autocapture:{networkTracking:!1,pageViews:!1}});var n=new o.h2;n.set("userId",e.currentUser.id),r.yV(n)}},{key:"initializeSessionReplay",value:function(e){var t;p.uV.has(null==e?void 0:e.id)&&(t={sampleRate:1});var n=(0,a.k)(t);r.IH(n)}},{key:"shouldLog",value:function(e){if(!e)return!1;var n=t.eventWhitelist[e.type];return"function"==typeof n&&n(e)}},{key:"logEvent",value:function(e){r.j(e)}},{key:"log",value:function(e){var t,n,r,i=e.data;if(y.S.isPageViewEvent(e))return this.logEvent({event_type:"page_view",event_properties:{is_addressable:i.isAddressable,action_context:null===(t=i.appLink)||void 0===t?void 0:t.action,application_context:null===(n=i.appLink)||void 0===n?void 0:n.application,url:i.url,title:document.title}}),void(y.S.isPostSearchPageViewEvent(e)&&this.logSearchEvent(e));y.S.isStreamEvent(e)?this.logEvent({event_type:"product_stream",event_properties:{id:null==i?void 0:i.id,entity:e.actionContext.entity,name:null==i?void 0:i.name}}):y.S.isExploreTopicsEvent(e)?this.logEvent({event_type:"product_explore_topics",event_properties:{id:null==i?void 0:i.id,name:null==i?void 0:i.name,presentation_id:null==i?void 0:i.presentationId,presentation_name:null==i?void 0:i.presentationName}}):y.S.isSearch(e)?this.logSearchEvent(e):y.S.isSearchClickThrough(e)?this.logEvent({event_type:"product_search_clickthrough",event_properties:{query:null===(r=null==i?void 0:i.search)||void 0===r?void 0:r.query}}):y.S.isBookACallEvent(e)?this.logEvent({event_type:"product_click_book_a_call"}):y.S.isShareEvent(e)?this.logEvent({event_type:"product_share",event_properties:{id:null==i?void 0:i.id,entity:e.actionContext.entity,name:null==i?void 0:i.name}}):y.S.isResourceDownloadEvent(e)?this.logEvent({event_type:"product_download_resource",event_properties:{id:null==i?void 0:i.id,name:null==i?void 0:i.name,video_name:null==i?void 0:i.videoName}}):y.S.isInviteEvent(e)?this.logEvent({event_type:"product_invite",event_properties:{user_count:null==i?void 0:i.emailCount}}):y.S.isPlayerDevicesCtaEvent(e)?this.logEvent({event_type:"product_player_device_cta",event_properties:{descriptor:e.actionContext.descriptor,can_user_manage_integrations:null==i?void 0:i.canUserManageIntegrations,context:null==i?void 0:i.context}}):y.S.isIntegrationsEvent(e)?this.logEvent({event_type:"product_settings_integrations",event_properties:{descriptor:e.actionContext.descriptor,id:null==i?void 0:i.id,status:null==i?void 0:i.status}}):y.S.isUpgradeFormEvent(e)&&this.logEvent({event_type:"product_request_upgrade_form",event_properties:{job_title:null==i?void 0:i.jobTitle,is_kdm:null==i?void 0:i.isKdm}})}},{key:"isType",value:function(e){return e===t.type}},{key:"logSearchEvent",value:function(e){var t=e.data,n={};"query"in t&&(n.query=t.query),this.logEvent({event_type:"product_search",event_properties:Object.assign(Object.assign({},n),{action_type:this.getSearchActionType(e)})})}},{key:"getSearchActionType",value:function(e){if(e.type===c.Vw.Filter)return"filter";var t=e.data;if(e.type===c.Vw.PageView){var n=null==t?void 0:t.appLink;return(null==n?void 0:n.application)===v.O.SEARCH?null:y.S.isSearchResultClickthrough(n)?"clickthrough":"abandon"}return t.consecutiveSearchCount>1?"multi_search":"search"}}])&&S(n.prototype,l),h&&S(n,h),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,l,h}(l.z);g.type="AmplitudeAnalyticsClient"},91996:(e,t,n)=>{n.d(t,{S:()=>u});var r=n(49985),i=n(65858),o=n(75795),a=n(14070),l=n(97291),c=[{application:l.O.VIDEOS,action:a.e.Videos.PLAY_VIDEO},{application:l.O.INTERACTIVES,action:a.e.Interactives.VIEW_INTERACTIVE},{application:l.O.CLIPS,action:a.e.Clips.PLAY_CLIP},{application:l.O.SERIES,action:a.e.Series.SERIES},{application:l.O.PLAYLISTS,action:a.e.Playlists.PLAYLIST},{application:l.O.LIBRARIES,action:a.e.Libraries.FOLDER},{application:l.O.SUBJECT,action:a.e.Subjects.CLASSIFICATION},{application:l.O.MOVIES_AND_TV,action:a.e.MoviesAndTv.COMPANY_DASHBOARD}],u={isSearchResultClickthrough:function(e){return!(!(null==e?void 0:e.application)||!(null==e?void 0:e.action))&&c.some(function(t){return t.application===e.application&&t.action===e.action})},isPageViewEvent:function(e){if(e.type!==i.Vw.PageView)return!1;var t=e.data;return!(null==t?void 0:t.isError)},isPostSearchPageViewEvent:function(e){var t,n=e.data,r=null==n?void 0:n.appLink;if((null==r?void 0:r.application)===l.O.SEARCH)return!1;var i=null===(t=o.O.getPreviousRoute())||void 0===t?void 0:t.appLink;return(null==i?void 0:i.application)===l.O.SEARCH},isExploreTopicsEvent:function(e){return e.type===i.Vw.Click&&e.actionContext.entity===i.py.Classification},isSearch:function(e){return e.type===i.Vw.Search?e.actionContext.location===i.LZ.SearchBar:e.type===i.Vw.Filter&&e.actionContext.productArea===(0,r.c)(l.O.SEARCH)},isSearchClickThrough:function(e){var t;return e.type===i.Vw.Click&&e.actionContext.productArea===(0,r.c)(l.O.SEARCH)&&!Array.isArray(e.data)&&!!(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.search)},isBookACallEvent:function(e){return e.type===i.Vw.Click&&e.actionContext.entity===i.py.Url&&e.actionContext.descriptor===i.HS.BookACall},isStreamEvent:function(e){return e.type===i.Vw.Stream},isShareEvent:function(e){return e.type===i.Vw.Share&&e.actionContext.workflowPhase!==i.eu.Start},isResourceDownloadEvent:function(e){return e.type===i.Vw.Download&&e.actionContext.entity===i.py.Resource},isInviteEvent:function(e){return e.type===i.Vw.SendEmail&&e.actionContext.descriptor===i.Yu.InviteColleague},isPlayerDevicesCtaEvent:function(e){return e.type===i.Vw.Click&&e.actionContext.entity===i.py.DevicesCta},isIntegrationsEvent:function(e){return e.type===i.Vw.Click&&e.actionContext.entity===i.py.Integration},isSupportedClickEvent:function(e){return!!(u.isExploreTopicsEvent(e)||u.isSearchClickThrough(e)||u.isBookACallEvent(e)||u.isPlayerDevicesCtaEvent(e)||u.isIntegrationsEvent(e))},isUpgradeFormEvent:function(e){return e.type===i.Vw.Submit&&e.actionContext.descriptor===i.HS.RequestBdmTrial}}}}]);
2
- //# sourceMappingURL=8077-9fdb522d7e-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8077-9fdb522d7e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/sign-up/helpers/BrazeHelper.ts","file:///app/packages/projects/lite/src/shared/analytics-clients/AmplitudeAnalyticsClient.ts","file:///app/packages/projects/lite/src/shared/analytics-clients/AnalyticsEventHelper.ts"],"sourcesContent":["import SparkMD5 from 'spark-md5';\n\nimport type { HashObject } from 'libs/analytics/interfaces';\n\ninterface SchoolTypeInfo {\n label: string;\n isTertiary: boolean;\n}\n\nconst SCHOOL_TYPE_MAP: Record<string, SchoolTypeInfo> = {\n 'secondary': {\n label: 'Secondary',\n isTertiary: false\n },\n 'primary & secondary': {\n label: 'Primary & Secondary',\n isTertiary: false\n },\n 'k12': {\n label: 'Primary & Secondary',\n isTertiary: false\n },\n 'primary': {\n label: 'Primary',\n isTertiary: false\n },\n 'special': {\n label: 'Special',\n isTertiary: false\n },\n 'university': {\n label: 'University',\n isTertiary: true\n },\n 'middle': {\n label: 'Middle',\n isTertiary: false\n },\n 'fe college': {\n label: 'FE College',\n isTertiary: true\n },\n 'high school': {\n label: 'Secondary',\n isTertiary: false\n },\n 'elementary': {\n label: 'Primary',\n isTertiary: false\n },\n 'middle school': {\n label: 'Middle',\n isTertiary: false\n },\n 'tafe': {\n label: 'TAFE',\n isTertiary: true\n },\n 'college': {\n label: 'FE College',\n isTertiary: true\n },\n 'sixth form college': {\n label: 'Sixth Form College',\n isTertiary: true\n }\n};\n\nconst PROVINCE_ISO_MAP: HashObject<string> = {\n 'england': 'ENG',\n 'scotland': 'SCT',\n 'wales': 'WLS',\n 'northern ireland': 'NIR'\n};\n\nexport interface BrazeCheckEmailResponse {\n invalidUserIds: string[];\n message: string;\n users: HashObject[];\n}\n\nexport const BrazeHelper = {\n\n hashedEmail(email: string) {\n const normalizedEmail = email.trim().toLowerCase();\n return SparkMD5.hash(normalizedEmail);\n },\n\n removeEmptyKeys(object: HashObject<any>): HashObject<any> {\n if (Array.isArray(object))\n return object;\n\n const payload = { ...object };\n return Object.entries(payload)\n .filter(([ , v ]) => {\n if (v === undefined || v === null) {\n return false;\n }\n if (typeof v === 'string' && !v.length) {\n return false;\n }\n return true;\n })\n .reduce(\n (acc, [ k, v ]) => ({ ...acc, [k]: v === Object(v) ? BrazeHelper.removeEmptyKeys(v) : v }),\n {}\n );\n },\n\n EVENT_TOPIC: 'Free Trial Request',\n\n BDM_EVENT_TOPIC: 'Requested free trial (Streamable Customer)',\n\n SOURCE: 'cv_product_trial_requested',\n\n BDM_SOURCE: 'cv_product_bdm_trial_requested',\n\n TRIAL_UPGRADE_SOURCE: 'cv_product_trial_upgrade_requested',\n\n getSchoolType(schoolType: string): string {\n if (!schoolType) return;\n\n const prospectType = schoolType.toLowerCase();\n\n if ([ 'unknown', 'other' ].includes(prospectType)) return;\n \n const mappedSchoolType = SCHOOL_TYPE_MAP[prospectType]?.label;\n if (mappedSchoolType)\n return mappedSchoolType;\n \n return schoolType;\n },\n\n isTertiarySchool(schoolType: string): boolean {\n return SCHOOL_TYPE_MAP[schoolType?.toLowerCase()]?.isTertiary || false;\n },\n\n parseProvince(province?: string): string {\n if (!province.length) return '';\n\n const mappedProvince = PROVINCE_ISO_MAP[province.toLowerCase()];\n return mappedProvince || province;\n }\n};","import * as amplitude from '@amplitude/analytics-browser';\nimport { SessionReplayOptions, sessionReplayPlugin } from '@amplitude/plugin-session-replay-browser';\n\nimport { AnalyticsClientOptions, BaseAnalyticsClient } from 'libs/analytics/clients/BaseAnalyticsClient';\nimport { HashObject, UserAction } from 'libs/analytics/interfaces';\nimport type { CoreAnalyticsType, DataObjectPayload } from 'libs/analytics/models/AnalyticsEvent';\n\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { InstanceRegion } from 'libs/shared/enums/InstanceRegion';\nimport { EXPERIMENTAL_GATED_ACCESS_POLICY_IDS } from 'libs/shared/hooks/useAccessPolicy';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { AccessPolicy } from 'libs/shared/interfaces/models/AccessPolicy';\n\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { AnalyticsEventHelper } from './AnalyticsEventHelper';\n\ninterface EventWhitelist {\n [eventName: string]: (...args: any) => any | boolean;\n}\n\ninterface AmplituideAnalyticsClientOptions extends AnalyticsClientOptions {\n currentUser: CurrentUser;\n apiKey: string;\n instanceRegion: InstanceRegion;\n accessPolicy: AccessPolicy;\n}\n\nexport class AmplitudeAnalyticsClient extends BaseAnalyticsClient {\n public static readonly type: string = 'AmplitudeAnalyticsClient';\n // @ts-ignore\n public get name(): string {\n return 'AmplitudeAnalyticsClient';\n }\n\n constructor(options: AmplituideAnalyticsClientOptions) {\n super(options);\n }\n\n public initialize(options: AmplituideAnalyticsClientOptions): void {\n this.initializeSessionReplay(options.accessPolicy);\n\n const id = BrazeHelper.hashedEmail(options.currentUser.email);\n amplitude.init(options.apiKey, id, {\n serverZone: options.instanceRegion === InstanceRegion.UK ? 'EU' : 'US',\n logLevel: amplitude.Types.LogLevel.Warn,\n identityStorage: 'localStorage',\n autocapture: {\n // We're not interested in tracking network requests and we don't\n // want amplitude to collect any data within them\n networkTracking: false,\n // We disable the default page view tracking as we're tracking it manually\n // because our page titles update based on feched data\n pageViews: false\n }\n });\n\n const identify = new amplitude.Identify();\n identify.set('userId', options.currentUser.id);\n\n amplitude.identify(identify);\n }\n\n private initializeSessionReplay(accessPolicy: AccessPolicy): void {\n let options: SessionReplayOptions;\n // Forcing session replays for experimental gated access policies\n if (EXPERIMENTAL_GATED_ACCESS_POLICY_IDS.has(accessPolicy?.id))\n options = { sampleRate: 1 };\n\n const sessionReplayTracking = sessionReplayPlugin(options);\n amplitude.add(sessionReplayTracking);\n }\n\n public shouldLog(event?: CoreAnalyticsType): boolean {\n if (!event)\n return false;\n \n const predicate = AmplitudeAnalyticsClient.eventWhitelist[event.type];\n if (typeof predicate === 'function')\n return predicate(event);\n\n return false;\n }\n\n private logEvent(event: amplitude.Types.BaseEvent): void {\n amplitude.track(event);\n }\n\n public log(event: CoreAnalyticsType): void {\n const eventData = event.data as HashObject;\n\n if (AnalyticsEventHelper.isPageViewEvent(event)) {\n this.logEvent({\n event_type: 'page_view',\n event_properties: {\n is_addressable: eventData.isAddressable,\n action_context: eventData.appLink?.action,\n application_context: eventData.appLink?.application,\n url: eventData.url,\n title: document.title\n }\n });\n\n if (AnalyticsEventHelper.isPostSearchPageViewEvent(event))\n this.logSearchEvent(event);\n\n return;\n }\n\n if (AnalyticsEventHelper.isStreamEvent(event)) {\n this.logEvent({\n event_type: 'product_stream',\n event_properties: {\n id: eventData?.id,\n entity: event.actionContext.entity,\n name: eventData?.name\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isExploreTopicsEvent(event)) {\n this.logEvent({\n event_type: 'product_explore_topics',\n event_properties: {\n id: eventData?.id,\n name: eventData?.name,\n presentation_id: eventData?.presentationId,\n presentation_name: eventData?.presentationName\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isSearch(event)) {\n this.logSearchEvent(event);\n return;\n }\n\n if (AnalyticsEventHelper.isSearchClickThrough(event)) {\n this.logEvent({\n event_type: 'product_search_clickthrough',\n event_properties: {\n query: eventData?.search?.query\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isBookACallEvent(event)) {\n this.logEvent({\n event_type: 'product_click_book_a_call'\n });\n return;\n }\n\n if (AnalyticsEventHelper.isShareEvent(event)) {\n this.logEvent({\n event_type: 'product_share',\n event_properties: {\n id: eventData?.id,\n entity: event.actionContext.entity,\n name: eventData?.name\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isResourceDownloadEvent(event)) {\n this.logEvent({\n event_type: 'product_download_resource',\n event_properties: {\n id: eventData?.id,\n name: eventData?.name,\n video_name: eventData?.videoName\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isInviteEvent(event)) {\n this.logEvent({\n event_type: 'product_invite',\n event_properties: {\n user_count: eventData?.emailCount\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isPlayerDevicesCtaEvent(event)) {\n this.logEvent({\n event_type: 'product_player_device_cta',\n event_properties: {\n descriptor: event.actionContext.descriptor,\n can_user_manage_integrations: eventData?.canUserManageIntegrations,\n context: eventData?.context\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isIntegrationsEvent(event)) {\n this.logEvent({\n event_type: 'product_settings_integrations',\n event_properties: {\n descriptor: event.actionContext.descriptor,\n id: eventData?.id,\n status: eventData?.status\n }\n });\n return;\n }\n\n if (AnalyticsEventHelper.isUpgradeFormEvent(event)) {\n this.logEvent({\n event_type: 'product_request_upgrade_form',\n event_properties: {\n job_title: eventData?.jobTitle,\n is_kdm: eventData?.isKdm\n }\n });\n return;\n }\n }\n\n public isType(type: string): this is AmplitudeAnalyticsClient {\n return type === AmplitudeAnalyticsClient.type;\n }\n\n private logSearchEvent(event: CoreAnalyticsType): void {\n const eventData = event.data as HashObject;\n\n const additionalData: HashObject = {};\n if ('query' in eventData)\n additionalData.query = eventData.query;\n\n this.logEvent({\n event_type: 'product_search',\n event_properties: {\n ...additionalData,\n action_type: this.getSearchActionType(event)\n }\n });\n }\n\n private getSearchActionType(event: CoreAnalyticsType): string {\n if (event.type === UserAction.Filter)\n return 'filter';\n\n const eventData = event.data as DataObjectPayload;\n if (event.type === UserAction.PageView) {\n const appLink = eventData?.appLink;\n\n if (appLink?.application === AppChannels.SEARCH)\n return null;\n\n if (AnalyticsEventHelper.isSearchResultClickthrough(appLink))\n return 'clickthrough';\n\n return 'abandon';\n }\n\n if (eventData.consecutiveSearchCount > 1)\n return 'multi_search';\n\n return 'search';\n }\n\n private static get eventWhitelist(): EventWhitelist {\n return {\n [UserAction.SendEmail]: AnalyticsEventHelper.isInviteEvent,\n [UserAction.Download]: AnalyticsEventHelper.isResourceDownloadEvent,\n [UserAction.Share]: AnalyticsEventHelper.isShareEvent,\n [UserAction.Stream]: AnalyticsEventHelper.isStreamEvent,\n [UserAction.Click]: AnalyticsEventHelper.isSupportedClickEvent,\n [UserAction.PageView]: AnalyticsEventHelper.isPageViewEvent,\n [UserAction.Search]: AnalyticsEventHelper.isSearch,\n [UserAction.Filter]: AnalyticsEventHelper.isSearch,\n [UserAction.Submit]: AnalyticsEventHelper.isUpgradeFormEvent\n };\n }\n}","import { Core } from 'libs/common/backbone/index';\n\nimport { colonCaseToKebabCase } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, SignUpDescriptors, UpgradeBannerDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport type { CoreAnalyticsType, DataObjectPayload } from 'libs/analytics/models/AnalyticsEvent';\n\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\n/**\n * List of app links that represent successful search result clickthroughs\n */\nconst resultAppLinks = [\n { application: AppChannels.VIDEOS, action: Actions.Videos.PLAY_VIDEO },\n { application: AppChannels.INTERACTIVES, action: Actions.Interactives.VIEW_INTERACTIVE },\n { application: AppChannels.CLIPS, action: Actions.Clips.PLAY_CLIP },\n { application: AppChannels.SERIES, action: Actions.Series.SERIES },\n { application: AppChannels.PLAYLISTS, action: Actions.Playlists.PLAYLIST },\n { application: AppChannels.LIBRARIES, action: Actions.Libraries.FOLDER },\n { application: AppChannels.SUBJECT, action: Actions.Subjects.CLASSIFICATION },\n { application: AppChannels.MOVIES_AND_TV, action: Actions.MoviesAndTv.COMPANY_DASHBOARD }\n];\n\nexport const AnalyticsEventHelper = {\n /**\n * Checks if an app link represents a valid search result clickthrough\n */\n isSearchResultClickthrough(appLink: Core.AppLink): boolean {\n if (!appLink?.application || !appLink?.action) {\n return false;\n }\n\n return resultAppLinks.some((link: { application: string; action: string }) =>\n link.application === appLink.application && link.action === appLink.action);\n },\n isPageViewEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.PageView)\n return false;\n\n /**\n * We only want to collect the page view where the user has navigated\n * . We'll ignore error pages.\n */\n const eventData = event.data as DataObjectPayload;\n if (eventData?.isError)\n return false;\n\n return true;\n },\n\n /**\n * We want to log search events to Braze and Amplitude when the user has navigated away from the /search route.\n * Hence the name \"post-search event\".\n * To do this, we listen for page_view events where the user is going from /search to any other route.\n */\n isPostSearchPageViewEvent(event: CoreAnalyticsType): boolean {\n const eventData = event.data as HashObject;\n const currentAppLink = eventData?.appLink;\n\n // If the user is navigating to search, ignore\n if (currentAppLink?.application === AppChannels.SEARCH)\n return false;\n\n const previousAppLink = ContextService.getPreviousRoute()?.appLink;\n\n // If the user is coming from a route that isn't /search, ignore\n if (previousAppLink?.application !== AppChannels.SEARCH)\n return false;\n\n return true;\n },\n\n isExploreTopicsEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Click)\n return false;\n\n if (event.actionContext.entity !== EntityType.Classification)\n return false;\n\n return true;\n },\n\n isSearch(event: CoreAnalyticsType): boolean {\n if (event.type === UserAction.Search)\n return event.actionContext.location === LocationContext.SearchBar;\n\n if (event.type === UserAction.Filter)\n return event.actionContext.productArea === colonCaseToKebabCase(AppChannels.SEARCH);\n\n return false;\n },\n\n isSearchClickThrough(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Click)\n return false;\n\n if (event.actionContext.productArea !== colonCaseToKebabCase(AppChannels.SEARCH))\n return false;\n\n /**\n * The search clickthrough events are never logged as an array\n */\n if (Array.isArray(event.data))\n return false;\n\n /**\n * We're relying on the fact that search click through events have\n * the search property of the entity populated with a node containing the score\n */\n if (!event?.data?.search)\n return false;\n\n return true;\n },\n\n isBookACallEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Click)\n return false;\n\n if (event.actionContext.entity !== EntityType.Url)\n return false;\n\n if (event.actionContext.descriptor !== UpgradeBannerDescriptors.BookACall)\n return false;\n\n return true;\n },\n\n isStreamEvent(event: CoreAnalyticsType): boolean {\n return event.type === UserAction.Stream;\n },\n\n isShareEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Share)\n return false;\n\n return event.actionContext.workflowPhase !== WorkflowPhase.Start;\n },\n\n isResourceDownloadEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Download)\n return false;\n\n return event.actionContext.entity === EntityType.Resource;\n },\n\n isInviteEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.SendEmail)\n return false;\n\n return event.actionContext.descriptor === SignUpDescriptors.InviteColleague;\n },\n\n isPlayerDevicesCtaEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Click)\n return false;\n \n if (event.actionContext.entity !== EntityType.DevicesCta)\n return false;\n\n return true;\n },\n\n isIntegrationsEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Click)\n return false;\n\n if (event.actionContext.entity !== EntityType.Integration)\n return false;\n\n return true;\n },\n\n isSupportedClickEvent(event: CoreAnalyticsType): boolean {\n if (AnalyticsEventHelper.isExploreTopicsEvent(event))\n return true;\n\n if (AnalyticsEventHelper.isSearchClickThrough(event))\n return true;\n\n if (AnalyticsEventHelper.isBookACallEvent(event))\n return true;\n\n if (AnalyticsEventHelper.isPlayerDevicesCtaEvent(event))\n return true;\n\n if (AnalyticsEventHelper.isIntegrationsEvent(event))\n return true;\n \n return false;\n },\n\n isUpgradeFormEvent(event: CoreAnalyticsType): boolean {\n if (event.type !== UserAction.Submit)\n return false;\n\n if (event.actionContext.descriptor !== UpgradeBannerDescriptors.RequestBdmTrial)\n return false;\n\n return true;\n }\n};\n"],"names":["SCHOOL_TYPE_MAP","label","isTertiary","PROVINCE_ISO_MAP","BrazeHelper","hashedEmail","email","normalizedEmail","trim","toLowerCase","removeEmptyKeys","object","Array","isArray","payload","Object","entries","filter","v","length","reduce","acc","k","EVENT_TOPIC","BDM_EVENT_TOPIC","SOURCE","BDM_SOURCE","TRIAL_UPGRADE_SOURCE","getSchoolType","schoolType","prospectType","includes","isTertiarySchool","parseProvince","province","AmplitudeAnalyticsClient","options","this","initializeSessionReplay","accessPolicy","id","currentUser","apiKey","serverZone","instanceRegion","logLevel","identityStorage","autocapture","networkTracking","pageViews","identify","set","sampleRate","sessionReplayTracking","event","predicate","eventWhitelist","type","eventData","data","logEvent","event_type","event_properties","is_addressable","isAddressable","action_context","appLink","action","application_context","application","url","title","document","logSearchEvent","entity","actionContext","name","presentation_id","presentationId","presentation_name","presentationName","query","search","video_name","videoName","user_count","emailCount","descriptor","can_user_manage_integrations","canUserManageIntegrations","context","status","job_title","jobTitle","is_kdm","isKdm","additionalData","action_type","getSearchActionType","consecutiveSearchCount","resultAppLinks","AnalyticsEventHelper","isSearchResultClickthrough","some","link","isPageViewEvent","isError","isPostSearchPageViewEvent","currentAppLink","previousAppLink","isExploreTopicsEvent","isSearch","location","productArea","c","isSearchClickThrough","isBookACallEvent","isStreamEvent","isShareEvent","workflowPhase","isResourceDownloadEvent","isInviteEvent","isPlayerDevicesCtaEvent","isIntegrationsEvent","isSupportedClickEvent","isUpgradeFormEvent"],"sourceRoot":""}