@clickview/lite 0.57.2-dev.2 → 0.57.2-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 (31) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/scripts/1057-3c48d4553a-lite.chunk.js +2 -0
  3. package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +1 -0
  4. package/dist/scripts/1734-bbca52585c-lite.chunk.js +2 -0
  5. package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +1 -0
  6. package/dist/scripts/7237-86c18f2701-lite.chunk.js +2 -0
  7. package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +1 -0
  8. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js +2 -0
  9. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +1 -0
  10. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +3 -0
  11. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +1 -0
  12. package/dist/scripts/9201-899c885914-lite.chunk.js +2 -0
  13. package/dist/scripts/9201-899c885914-lite.chunk.js.map +1 -0
  14. package/dist/scripts/{bundle-33a0223ac5.min.js → bundle-4b58e56927.min.js} +3 -3
  15. package/dist/scripts/bundle-4b58e56927.min.js.map +1 -0
  16. package/package.json +1 -1
  17. package/dist/scripts/1057-80dd5a1be7-lite.chunk.js +0 -2
  18. package/dist/scripts/1057-80dd5a1be7-lite.chunk.js.map +0 -1
  19. package/dist/scripts/1734-4a7f3b5c3e-lite.chunk.js +0 -2
  20. package/dist/scripts/1734-4a7f3b5c3e-lite.chunk.js.map +0 -1
  21. package/dist/scripts/7237-bf0cded690-lite.chunk.js +0 -2
  22. package/dist/scripts/7237-bf0cded690-lite.chunk.js.map +0 -1
  23. package/dist/scripts/8095-85db09f5b2-lite.chunk.js +0 -2
  24. package/dist/scripts/8095-85db09f5b2-lite.chunk.js.map +0 -1
  25. package/dist/scripts/8489-d9860267ec-lite.chunk.js +0 -3
  26. package/dist/scripts/8489-d9860267ec-lite.chunk.js.map +0 -1
  27. package/dist/scripts/9201-58ea2d1161-lite.chunk.js +0 -2
  28. package/dist/scripts/9201-58ea2d1161-lite.chunk.js.map +0 -1
  29. package/dist/scripts/bundle-33a0223ac5.min.js.map +0 -1
  30. /package/dist/scripts/{8489-d9860267ec-lite.chunk.js.LICENSE.txt → 8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt} +0 -0
  31. /package/dist/scripts/{bundle-33a0223ac5.min.js.LICENSE.txt → bundle-4b58e56927.min.js.LICENSE.txt} +0 -0
package/dist/bundles.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "appBundle": "bundle-33a0223ac5.min.js",
2
+ "appBundle": "bundle-4b58e56927.min.js",
3
3
  "cssBundle": "lite-app-5335e8e07a.css",
4
4
  "polyfillBundle": "polyfills-365f92d668.min.js"
5
5
  }
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1057],{53353:(e,t,n)=>{n.d(t,{c:()=>h,l:()=>f});var a=n(32735),r=n(232),s=n.n(r),i=n(8604),c=n(83345);const l={heatMap:"epapa",legend:"uhH4p"};function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var u="shared.engagementHeatMap",m="#f1f1f1",d=s().scale(["#daf07d","#08bd1a"]),g=[0,.01,.25,.5,.75,1];function p(e,t){return e?d(e/t).hex():m}function v(e,t){for(var n=[],a=0;a<e.length;a++){var r=a>0&&e[a-1],s=e[a],i=a<e.length-1&&e[a+1];s===r&&s===i||n.push("".concat(p(s,t)," ").concat(100/e.length*a,"%"))}return"linear-gradient(to right, ".concat(n.join(","),")")}function f(){var e=Math.max.apply(Math,g),t=100/g.length;return a.createElement("div",{className:"d-flex justify-content-between w-100"},a.createElement(c.x,{namespace:u,phrase:"less"}),a.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(l.legend)},g.map((function(n,r){return a.createElement("div",{key:r,style:{width:"".concat(t,"%"),backgroundColor:p(n,e)}})}))),a.createElement(c.x,{namespace:u,phrase:"more"}))}function h(e){var t,n,r,s=(0,i.O)(e.engagement),c=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return o(e)}(r=s)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||function(e,t){if(e){if("string"==typeof e)return o(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)?o(e,t):void 0}}(r)||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.")}());return a.createElement("div",{className:"border rounded ".concat(l.heatMap," ").concat(null!==(n=e.className)&&void 0!==n?n:""),style:{background:v(s,c)}})}},25216:(e,t,n)=>{n.d(t,{L:()=>i});var a=n(32735),r=n(83914);const s={icon:"sAmpy",count:"faDs4"};function i(e){return a.createElement("section",{className:"d-flex flex-column border border-light rounded p-3 h-100"},a.createElement("div",{className:"d-flex align-items-center mb-2"},a.createElement("div",{className:"".concat(s.icon," ").concat(e.svgClassName," rounded-circle d-flex align-items-center justify-content-center")},a.createElement(r.x,{svgName:e.svgName})),a.createElement("div",{className:"d-flex flex-column ms-2"},a.createElement("h2",{className:"h6 mb-0"},e.title),e.subtitle&&a.createElement("p",{className:"text-secondary font-size-sm mb-0"},e.subtitle)),"number"==typeof e.count&&a.createElement("div",{className:"".concat(s.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},461:(e,t,n)=>{n.d(t,{y:()=>o});var a=n(32735),r=n(77640),s=n(36848),i=n(40782);const c={avatar:"uMuZt",image:"WdKiU"};var l=3;function o(e){return a.createElement(a.Fragment,null,e.students.length?a.createElement("ul",{className:"list-unstyled mb-2"},e.students.slice(0,l).map((function(t){return a.createElement("li",{key:t.id,className:"d-flex align-items-center mb-2"},a.createElement(r.t,{user:t,imageCdnUrl:e.imageCdnUrl,avatarClassName:c.avatar,detailsClassName:"ms-2",showDisplayName:!0,showSubText:!1,anonymiseUsers:e.anonymiseUsers}),a.createElement("div",{className:"d-flex align-items-center ms-auto"},a.createElement("span",{className:"me-1"},void 0===t.percentage?"- ":Math.round(100*t.percentage),"%"),a.createElement(i.O,{percentage:t.percentage})))}))):a.createElement("div",{className:"text-center"},a.createElement("img",{className:"".concat(c.image," mb-2"),src:e.imageUrl}),a.createElement("p",{className:"text-secondary mb-0"},e.description)),!!e.students.length&&a.createElement(s.F,{appLink:e.appLink,className:"text-info mt-auto"},e.appLinkText))}},94652:(e,t,n)=>{n.d(t,{b:()=>g});var a=n(32735),r=n(23481),s=n(53353),i=n(25216),c=n(36848),l=n(83345),o=n(35223);const u={heatMap:"Rfr9N",heatMapTimepointIndicator:"s6JbA",heatMapTimepointIndicatorVisible:"mgjWX"};var m="shared.insightHeatmap",d=r.T.encloseNamespace(m);function g(e){var t=e.engagement.engagementRate>0?Math.round(100*e.engagement.engagementRate):null;return a.createElement(i.L,{title:d("title"),svgName:o.vn.Timer,svgClassName:"bg-light-green text-green"},a.createElement("div",{className:"mb-2"},a.createElement("p",{className:"mb-0"},t?a.createElement(l.x,{namespace:m,phrase:"everyoneWatched",options:{engagementRate:t}}):a.createElement(l.x,{namespace:m,phrase:"notWatched"})),t&&a.createElement(c.F,{appLink:e.heatmapAppLink,className:"text-info"},a.createElement(l.x,{namespace:m,phrase:"viewHeatmap"}))),a.createElement("div",{className:"mb-2"},a.createElement(s.c,{engagement:e.engagement,className:u.heatMap})),a.createElement("p",{className:"h3 text-center mb-2"},t||"--","%"),a.createElement("p",{className:"text-center mb-0 font-size-sm"},a.createElement(l.x,{namespace:m,phrase:"amountWatched"})))}},71553:(e,t,n)=>{n.d(t,{I:()=>i});var a=n(99940),r=n(62875);function s(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var i={interactiveResultSet:function(e,t,n,i,c,l,o){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),i),data:s(n,i),type:a.k.POST,normalize:!1,success:c,error:l,always:o}},mark:function(e,t,n,r,s,i,c){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:c}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},41196:(e,t,n)=>{n.d(t,{W:()=>c});var a=n(20354),r=n(71553),s=n(20768),i=n(31949);function c(e,t){var n,c=a.a.useBasicFetch(i.N.currentUser()),l=a.a.useBasicFetch(!!e&&s.b.interactiveMetadata(e)),o=a.a.useBasicFetch(!!(null===(n=l.data)||void 0===n?void 0:n.interactiveId)&&s.b.interactive(l.data.interactiveId)),u=!!c.data&&!!o.data&&!!t;return a.a.useBasicFetch(u&&r.I.interactiveResultSet(l.data.interactiveId,l.data.id,c.data,t))}},8604:(e,t,n)=>{function a(e){return new Array(Math.ceil(e.videoDuration)).fill(null).map((function(t,n){return e.heatMap[n]||0}))}n.d(t,{O:()=>a})},39157:(e,t,n)=>{n.d(t,{HI:()=>d,R6:()=>o,Rt:()=>p,UU:()=>m,Zs:()=>u,nq:()=>g});var a=n(75896),r=n(94892),s=n(28972),i=n(8246),c=n(83140),l=n(80845);function o(e,t){var n={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},s=(0,l.Q)(e).length;t.students.forEach((function(t){var i=Object.assign(Object.assign({},t),{summary:p(e,t)});i.summary.awaitingMarking?n.markingRequired.push(i):a.m.last(t.results).attempts.length===s?(n.completed.push(i),i.summary.percentCorrect>=r.i.HIGH&&n.highScore.push(i),i.summary.percentCorrect<r.i.MODERATE&&n.lowScore.push(i)):n.notCompleted.push(i)}));var i=a.m.sortBy(n.lowScore,(function(e){return e.summary.percentCorrect})),c=a.m.sortBy(n.highScore,(function(e){return e.summary.percentCorrect})).reverse();return Object.assign(Object.assign({},n),{lowScore:i,highScore:c})}function u(e,t){return(0,l.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,n){var a=(0,l.j_)(t),r=(0,l.f6)(e,a);return(null==r?void 0:r.answers.every((function(e){var t;return(null===(t=n[m(e)])||void 0===t?void 0:t.status)===i.N.Correct})))?i.N.Correct:(null==r?void 0:r.answers.every((function(e){var t;return(null===(t=n[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect})))?i.N.Incorrect:void 0}function g(e,t){var n=t.students.length,a=0,r=0,i=0,o=0,u=0;return t.students.forEach((function(t){var n=(0,l.j_)(t);if(n){u+=t.results.length;var m=c.A.isInteractionCorrect(e,n);m===s.w.Correct&&a++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&o++,m!==s.w.UnAnswered&&r++}})),{percentCorrect:n>0?a/n:0,correct:a,answered:r,unanswered:i,awaitingMarking:o,attempts:u}}function p(e,t){var n=(0,l.j_)(t),a=(0,l.Q)(e),r=a.length,i=0,o=0;a.forEach((function(e){var t=c.A.isInteractionCorrect(e,n);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&o++}));var u=r>0?i/r:0,m=new Set(a.map((function(e){return e.id}))),d=n.attempts.filter((function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:n.attempts.length,attempts:t.results.length,unanswered:r-d,percentCorrect:u,correct:i,awaitingMarking:o}}},77640:(e,t,n)=>{n.d(t,{t:()=>d});var a=n(32735),r=n(23481),s=n(26136),i=n(20789),c=n(76881),l=n(86613),o=n(64818),u=n(94831),m=r.T.encloseNamespace("shared.userRecipientItemMetadata");function d(e){var t;return a.createElement(a.Fragment,null,a.createElement("div",{className:"".concat(u.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block")},a.createElement(i.q,{imageUrl:null===(t=e.user.avatar)||void 0===t?void 0:t.url,imageCdnUrl:e.imageCdnUrl,initials:o.l.getInitials(e.user.name,e.user.surname)})),a.createElement("div",{className:e.detailsClassName},a.createElement("h4",{className:"font-size-normal fw-normal m-0"},e.anonymiseUsers?(0,s.B)(e.user,!0):e.showDisplayName?o.l.getDisplayName(e.user):o.l.getFullName(e.user)),e.showSubText&&a.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=o.l.getUserType(e),n=o.l.getUserRole(e);if(t===c.Y.Staff)return n===l.i.Admin?m("admin"):m("staff");var a=o.l.getYearGroup(e);return(null==a?void 0:a.name)?a.name:m("student")}(e.user))))}d.defaults={showSubText:!0}},28972:(e,t,n)=>{var a;n.d(t,{w:()=>a}),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"}(a||(a={}))},8246:(e,t,n)=>{var a;n.d(t,{N:()=>a}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(a||(a={}))},17913:(e,t,n)=>{n.d(t,{u:()=>i});var a=n(97395),r=n(110),s=n(62875),i={individualEngagement:function(e,t,n,r,i,c){var l=Object.assign({objectId:e},t);return n&&(l.sharerId=n),{url:a._.urlBuilder("{gateway}/v1/analytics/heat-map",l),key:(0,s.H)("engagement:".concat(e),t,n),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1,success:r,error:i,always:c}},aggregateEngagement:function(e,t,n,r,i,c){var l=Object.assign({objectId:e},t);return n&&(l.sharerId=n),{url:a._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",l),key:(0,s.H)("aggregate:engagement:".concat(e),t,n),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1,success:r,error:i,always:c}},views:function(e,t,n,i,c,l){var o="video:views";t&&(o+=":".concat(t));var u=Object.assign(Object.assign({objectId:t},e),{timeOffset:r.O.getTimezoneOffset()});return n&&(u.sharerId=n),{url:a._.urlBuilder("{gateway}/v1/analytics/video-views",u),key:(0,s.H)(o,e,n),normalize:!1,success:i,error:c,always:l}}}},83140:(e,t,n)=>{n.d(t,{A:()=>v});var a=n(28972),r=n(8246),s=n(40424);function i(e){return i="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},i(e)}function c(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=i(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=i(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(){return a.w.NotApplicable}function o(e,t){var n=e.actionableItems.filter((function(e){return e.isCorrect}));return n.every((function(e){return!t(e.id)}))?a.w.UnAnswered:n.every((function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())}))?a.w.Correct:a.w.Incorrect}function u(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?a.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var n,a=t(e.id);return(null==a?void 0:a.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||a===e.name}))?a.w.Correct:a.w.Incorrect}function m(e,t){return function(n){var a=t.attempts.find((function(t){return t.id===e.id}));return null==a?void 0:a.answers.find((function(e){return e.id===n}))}}function d(e,t){var n=m(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function g(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var s=t(e.id);n=s?s.status!==r.N.Correct?s.status!==r.N.Incorrect?a.w.AwaitingMarking:a.w.Incorrect:a.w.Correct:a.w.UnAnswered})),n}(e,m(e,t))}var p=c(c(c(c(c(c(c({},s.Z9.Annotation,l),s.Z9.Image,l),s.Z9.MissingWord,(function(e,t){var n=m(e,t);return o(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),s.Z9.MultipleChoice,d),s.Z9.ShortAnswer,g),s.Z9.TrueOrFalse,d),s.Z9.Illustration,g),v={notApplicable:l,awaitingMarking:function(){return a.w.AwaitingMarking},isMissingWordCorrect:o,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,p[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>o,Wn:()=>i,f6:()=>l,j_:()=>c});var a=n(75896),r=n(40424);function s(e){return e.typeId!==r.Z9.Annotation&&e.typeId!==r.Z9.Image}function i(e){return a.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function c(e){return a.m.last(e.results)}function l(e,t){return a.m.findWhere(null==t?void 0:t.attempts,{id:e})}function o(e){return i(e).filter(s)}},62174:(e,t,n)=>{n.r(t),n.d(t,{InteractiveInsightsOverviewView:()=>ve});var a=n(32735),r=n(2948),s=n(20354),i=n(75896),c=n(23481),l=n(25216),o=n(72306),u=n.n(o),m=n(70312),d=n.n(m);const g={font:"nSTtI",chartContainer:"Otcfo"};var p=function(e){return{title:{text:null},credits:{enabled:!1},yAxis:{title:{text:null},labels:{enabled:!1},gridLineWidth:0,min:0,max:1},xAxis:{title:{text:e,style:{color:"#313543",fontSize:"12px"}},labels:{style:{color:"#313543",fontSize:"12px"}},className:g.font,lineWidth:0},legend:{enabled:!1},chart:{type:"column",backgroundColor:"transparent",height:"160px",spacingTop:20},plotOptions:{column:{dataLabels:{enabled:!1},enableMouseTracking:!1,minPointLength:8}}}};function v(e){return a.createElement("div",{className:g.chartContainer},a.createElement(d(),{highcharts:u(),options:(t=e.chartData,n=p(e.label),Object.assign(Object.assign({},n),{xAxis:Object.assign(Object.assign({},n.xAxis),{categories:t.categories}),series:t.series}))}));var t,n}var f=n(83345),h=n(35223);const y={tealChart:"lZZf0",grayChart:"wJQc4",font:"o1Xbr"};function b(e){return b="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},b(e)}var E="shared.insightAverageAttempts",w=c.T.encloseNamespace(E);function N(e){var t,n,r=e.students.reduce((function(e,t){return t.summary.attempts>e?t.summary.attempts:e}),0),s=(t=function(){var t={};return e.students.forEach((function(e){var n,a,r,s=e.summary.attempts.toString();s in t||Object.assign(t,(n={},r=0,(a=function(e){var t=function(e,t){if("object"!=b(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=b(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==b(t)?t:t+""}(a=s))in n?Object.defineProperty(n,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[a]=r,n)),t[s]++})),Object.keys(t).length?t:{0:0}}(),n=0===t[0],{categories:Object.keys(t),series:[{type:"column",color:t[0]?"#EAEAEA":"#40C2BB",borderRadius:4,dataLabels:{enabled:!n,style:{fontSize:"12px",fontWeight:"normal"},inside:!1,overflow:"allow",crop:!1,className:y.font},data:Object.keys(t).map((function(e){return{className:"".concat(n?y.grayChart:y.tealChart," ").concat(r.toString()!==e?"opacity-25":""),y:t[e]}}))}]});return a.createElement(l.L,{title:w("title"),svgName:h.vn.Refresh,svgClassName:"bg-light-indigo text-indigo"},a.createElement("p",null,r?a.createElement(f.x,{namespace:E,phrase:"averageAttempts",options:{attempts:r}}):a.createElement(f.x,{namespace:E,phrase:"noAttempts"})),a.createElement("div",{className:"mt-auto"},a.createElement(v,{label:w("attempts"),chartData:s})))}const C={redChart:"G7zOw",yellowChart:"k34mm",greenChart:"vBneA",blueChart:"RPTWm",grayChart:"k4JFZ",borderDark:"LWor3"};var A="shared.insightAverageScore",S=c.T.encloseNamespace(A);function k(e){return a.createElement(l.L,{title:S("title"),svgName:h.vn.Chart,svgClassName:"bg-light-orange text-orange"},a.createElement("p",null,e.students.length?a.createElement(f.x,{namespace:A,phrase:"averageScore",options:(r=e.students.map((function(e){return e.summary.percentCorrect})),s=r.reduce((function(e,t){return e+t}),0)/r.length,c=i.m.last(i.m.last(e.students).results).attempts.length,{averageScore:Math.round(c*s),totalQuestions:c,averagePercentage:Math.round(100*s*10)/10})}):a.createElement(f.x,{namespace:A,phrase:"noAnswers"})),a.createElement(v,{label:"".concat(S("studentScores")," (%)"),chartData:(t=e.students.reduce((function(e,t){return e[Math.floor(10*t.summary.percentCorrect)]++,e}),[0,0,0,0,0,0,0,0,0,0,0]),n=["0","10","20","30","40","50","60","70","80","90","100"],{categories:n,series:[{type:"column",color:"#4E9ACE",borderRadius:4,data:t.map((function(e,t){var a=Number(n[t]);return{className:"".concat(function(e,t){return 0===t?C.grayChart:e<50?C.redChart:e<70?C.yellowChart:e<90?C.greenChart:C.blueChart}(a,e)," rounded"),y:e}}))}]})}));var t,n,r,s,c}var I=n(461),x=c.T.encloseNamespace("shared.insightCompletedStudents");function O(e){return a.createElement(l.L,{title:x("title"),svgName:h.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},a.createElement(I.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:x("completedStudents"),appLink:e.resultsAppLink,appLinkText:x("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var U=n(39157),j=n(36848),L=n(86572),T=n(40782),M=n(80845),R="shared.insightEasiestQuestion",B=c.T.encloseNamespace(R);function H(e){var t,n,r,s,c,o=(n=e.interactive,r=e.results,s=(0,M.Q)(n).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,U.nq)(e,r)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),c=i.m.sortBy(s,(function(e){return e.resultsSummary.percentCorrect})),i.m.last(c));return a.createElement(l.L,{title:B("title"),subtitle:B("subtitle"),svgName:h.vn.StarOutline,svgClassName:"bg-light-blue text-blue"},a.createElement("div",{className:"d-flex align-items-center"},a.createElement(T.O,{percentage:null===(t=null==o?void 0:o.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:T.I.LabelInside}),o?a.createElement("div",{className:"d-flex ms-2"},a.createElement(L.y,{interaction:o,iconClassName:"flex-shrink-0"})):a.createElement("span",{className:"ms-2"},B("noAnswers"))),o&&a.createElement(j.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_desc"})}),className:"text-info"},a.createElement(f.x,{namespace:R,phrase:"viewQuestions"})))}var W="shared.insightHardestQuestion",_=c.T.encloseNamespace(W);function P(e){var t,n,r,s,c,o=(n=e.interactive,r=e.results,s=(0,M.Q)(n).map((function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,U.nq)(e,r)})})).filter((function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking})),c=i.m.sortBy(s,(function(e){return e.resultsSummary.percentCorrect})),i.m.first(c));return a.createElement(l.L,{title:_("title"),subtitle:_("subtitle"),svgName:h.vn.QuestionMark,svgClassName:"bg-light-orange text-orange"},a.createElement("div",{className:"d-flex align-items-center"},a.createElement(T.O,{percentage:null===(t=null==o?void 0:o.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:T.I.LabelInside}),o?a.createElement("div",{className:"d-flex ms-2"},a.createElement(L.y,{interaction:o,iconClassName:"flex-shrink-0"})):a.createElement("span",{className:"ms-2"},_("noAnswers"))),o&&a.createElement(j.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_asc"})}),className:"text-info"},a.createElement(f.x,{namespace:W,phrase:"viewQuestions"})))}var q=n(94652),F=c.T.encloseNamespace("shared.insightHighScoringStudents");function D(e){return a.createElement(l.L,{title:F("title"),subtitle:F("subtitle"),svgName:h.vn.Trophy,svgClassName:"bg-light-teal text-teal",count:e.students.length},a.createElement(I.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.greenChartImageUrl,description:F(e.completed.length?"noStudents":"highScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_desc"})}),appLinkText:F("viewByHighest"),anonymiseUsers:e.anonymiseUsers}))}var Z=c.T.encloseNamespace("shared.insightLowScoringStudents");function z(e){return a.createElement(l.L,{title:Z("title"),subtitle:Z("subtitle"),svgName:h.vn.Hand,svgClassName:"bg-light-red text-red",count:e.students.length},a.createElement(I.y,{students:e.students.map((function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})})),imageCdnUrl:e.imageCdnUrl,imageUrl:e.completed.length?e.heartImageUrl:e.redChartImageUrl,description:Z(e.completed.length?"doingWell":"lowScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_asc"})}),appLinkText:Z("viewByLowest"),anonymiseUsers:e.anonymiseUsers}))}var Q=c.T.encloseNamespace("shared.insightMarkingRequired");function G(e){return a.createElement(l.L,{title:Q("title"),svgName:h.vn.Hand,svgClassName:"bg-light-blue text-blue",count:e.students.length},a.createElement(I.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:Q("studentsRequireMarking"),appLink:e.resultsAppLink,appLinkText:Q("viewAll"),anonymiseUsers:e.anonymiseUsers}))}function V(e){return function(e){if(Array.isArray(e))return K(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return K(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)?K(e,t):void 0}}(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 K(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var J=c.T.encloseNamespace("shared.insightNotCompletedStudents");function Y(e){var t,n,r,s=(t=e.markingRequiredStudents.map((function(e){return null==e?void 0:e.user.id})),n=e.completedStudents.map((function(e){return null==e?void 0:e.user.id})),r=e.classroomStudents.filter((function(e){return!t.includes(e.id)&&!n.includes(e.id)})),i.m.uniq([].concat(V(e.notCompletedStudents.map((function(e){return e.user}))),V(r)),"id"));return a.createElement(l.L,{title:J("title"),svgName:h.vn.Puzzle,svgClassName:"bg-light-teal text-teal",count:s.length},a.createElement(I.y,{students:s,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:J("completed"),appLink:e.resultsAppLink,appLinkText:J("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var $=n(41196),X=n(26025),ee=n(74901),te=n(40003),ne=n(38143),ae=n(39151),re=n(20768),se=n(31949),ie=n(17913),ce=n(99742),le=n(88630),oe=n(5672),ue=n(83590),me=n(14070),de=n(97291);function ge(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var pe="insights.interactiveInsightsOverview";function ve(e){var t,n,c,l,o,u=(l=(0,r.D)(ne.g.ANONYMISE_USERS),o=1,function(e){if(Array.isArray(e))return e}(l)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,s,i,c=[],l=!0,o=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=s.call(n)).done)&&(c.push(a.value),c.length!==t);l=!0);}catch(e){o=!0,r=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(o)throw r}}return c}}(l,o)||function(e,t){if(e){if("string"==typeof e)return ge(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)?ge(e,t):void 0}}(l,o)||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],m=s.a.useBasicFetch(se.N.currentUser()),d=s.a.useBasicFetch(ae.L.config()),g=s.a.useBasicFetch(m.data&&e.classroomId&&le.F.getClassroom(e.classroomId,m.data.id)),p=s.a.useBasicFetch(re.b.interactiveMetadata(e.interactiveId)),v=s.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&re.b.interactive(p.data.interactiveId)),h=X.B.getAudienceAppLinkParams(),y=X.B.getDateRangeAppLinkParams(),b=(0,$.W)(e.interactiveId,Object.assign(Object.assign({},(0,te.wO)((0,te.Hb)(),y)),(0,ee.K)(h))),E=1===(null===(n=h.classrooms)||void 0===n?void 0:n.length)&&!(null===(c=h.classroomGroups)||void 0===c?void 0:c.length),w=s.a.useBasicFetch(E&&le.F.getClassroomStudents(i.m.first(h.classrooms))),C=s.a.useBasicFetch(ie.u.aggregateEngagement(e.interactiveId,Object.assign(Object.assign({},(0,te.wO)((0,te.Hb)(),y)),(0,ee.K)(h)),m.data.id)),A=m.data&&d.data&&(!e.classroomId||g.data)&&p.data&&v.data&&b.data&&(!E||w.data)&&C.data,S=A&&(0,U.R6)(v.data,b.data);if(!A)return a.createElement(a.Fragment,null);var I,x=Object.assign(Object.assign({},h),y),j=function(e,t){return{resultsAppLink:{application:de.O.INSIGHTS,action:me.e.Insights.INTERACTIVE_RESULTS,args:[e],params:t},questionsAppLink:{application:de.O.INSIGHTS,action:me.e.Insights.INTERACTIVE_QUESTIONS,args:[e],params:t},heatmapAppLink:{application:de.O.INSIGHTS,action:me.e.Insights.VIDEO_HEATMAP,args:[e],params:t}}}(e.interactiveId);return a.createElement("div",{className:"px-3"},a.createElement(ue.m,{video:p.data,audienceAppLinkParams:h,dateRangeAppLinkParams:y,tabs:(0,oe.kj)(p.data.id,"overview",x)}),a.createElement("section",{className:"mb-5"},a.createElement("h2",{className:"h4"},a.createElement(f.x,{namespace:pe,phrase:"studentResponses"}),a.createElement("span",null,": ",S.completed.length,w.data?"/".concat(w.data.data.length):"")),a.createElement("div",{className:"row g-3"},a.createElement("div",{className:"col-12 col-md"},a.createElement(G,{imageUrl:ce.W.Insights.SPEECH_BUBBLE_ASTERISK,resultsAppLink:j.resultsAppLink,imageCdnUrl:d.data.imageCdnUrl,students:(I=S.markingRequired,I.map((function(e){return e.user}))),anonymiseUsers:u})),E&&a.createElement("div",{className:"col-12 col-md"},a.createElement(Y,{markingRequiredStudents:S.markingRequired,completedStudents:S.completed,notCompletedStudents:S.notCompleted,classroomStudents:w.data.data,imageCdnUrl:d.data.imageCdnUrl,imageUrl:ce.W.Insights.JIGSAW,resultsAppLink:j.resultsAppLink,anonymiseUsers:u})),a.createElement("div",{className:"col-12 col-md"},a.createElement(O,{students:S.completed,imageCdnUrl:d.data.imageCdnUrl,imageUrl:ce.W.Insights.AVATAR,resultsAppLink:j.resultsAppLink,anonymiseUsers:u})))),a.createElement("section",{className:"mb-5"},a.createElement("h2",{className:"h4"},a.createElement(f.x,{namespace:pe,phrase:"studentsPerformance"})),a.createElement("div",{className:"row g-3"},a.createElement("div",{className:"col-12 col-md-6"},a.createElement(z,{redChartImageUrl:ce.W.Insights.RED_CHART,heartImageUrl:ce.W.Insights.SPEECH_BUBBLE_HEART,resultsAppLink:j.resultsAppLink,imageCdnUrl:d.data.imageCdnUrl,students:S.lowScore,completed:S.completed,anonymiseUsers:u})),a.createElement("div",{className:"col-12 col-md-6"},a.createElement(D,{greenChartImageUrl:ce.W.Insights.GREEN_CHART,resultsAppLink:j.resultsAppLink,imageCdnUrl:d.data.imageCdnUrl,students:S.highScore,completed:S.completed,anonymiseUsers:u})),a.createElement("div",{className:"col-12 col-md-6"},a.createElement(P,{interactive:v.data,interactiveMetadata:p.data,results:b.data,questionsAppLink:j.questionsAppLink})),a.createElement("div",{className:"col-12 col-md-6"},a.createElement(H,{interactive:v.data,interactiveMetadata:p.data,results:b.data,questionsAppLink:j.questionsAppLink})))),a.createElement("section",{className:"mb-5"},a.createElement("h2",{className:"h4"},a.createElement(f.x,{namespace:pe,phrase:"classPerformance"})),a.createElement("div",{className:"row g-3"},a.createElement("div",{className:"col-12 col-md-6"},a.createElement(k,{students:S.completed})),a.createElement("div",{className:"col-12 col-md-6"},a.createElement(N,{students:S.completed})),a.createElement("div",{className:"col-12 col-md-6"},a.createElement(q.b,{engagement:C.data,heatmapAppLink:j.heatmapAppLink})))))}},94831:(e,t,n)=>{n.d(t,{Z:()=>a});const a={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}}}]);
2
+ //# sourceMappingURL=1057-3c48d4553a-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/1057-3c48d4553a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/insight-student-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/InsightStudentList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/insight-heatmap.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/InsightHeatmap.tsx","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","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/VideoViewRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/insight-chart.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/InsightChart.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/insight-average-attempts.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/InsightAverageAttempts.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/insight-average-score.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/InsightAverageScore.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/completed-students/InsightCompletedStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/hardest-question/InsightHardestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/marking-required/InsightMarkingRequired.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents.tsx","file:///app/packages/projects/lite/src/apps/insights/views/interactive/overview/InteractiveInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/insights/views/interactive/overview/InteractiveInsightsOverviewUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border border-light rounded p-3 h-100'>\n <div className='d-flex align-items-center mb-2'>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex align-items-center justify-content-center`}>\n <SvgContainer svgName={props.svgName} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n {props.subtitle && <p className='text-secondary font-size-sm mb-0'>{props.subtitle}</p>}\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"uMuZt\",\"image\":\"WdKiU\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './insight-student-list.scss';\n\nconst MAX_ITEMS = 3;\n\ninterface UserPercentage extends User {\n percentage?: number;\n}\n\ninterface InsightStudentListProps {\n students: UserPercentage[];\n imageUrl: string;\n imageCdnUrl: string;\n appLink: Core.AppLink;\n description: string;\n appLinkText: string;\n percentages?: number[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentList(props: InsightStudentListProps) {\n return (\n <>\n {props.students.length ? (\n <ul className='list-unstyled mb-2'>\n {props.students.slice(0, MAX_ITEMS).map(student => (\n <li key={student.id} className='d-flex align-items-center mb-2'>\n <UserRecipientItemMetadata\n user={student}\n imageCdnUrl={props.imageCdnUrl}\n avatarClassName={styles.avatar}\n detailsClassName='ms-2'\n showDisplayName\n showSubText={false}\n anonymiseUsers={props.anonymiseUsers}\n />\n\n <div className='d-flex align-items-center ms-auto'>\n <span className='me-1'>{student.percentage === undefined ? '- ' : Math.round(student.percentage * 100)}%</span>\n <PercentageIndicator percentage={student.percentage} />\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className='text-center'>\n <img className={`${styles.image} mb-2`} src={props.imageUrl} />\n <p className='text-secondary mb-0'>{props.description}</p>\n </div>\n )}\n\n {!!props.students.length && (\n <AppLink appLink={props.appLink} className='text-info mt-auto'>\n {props.appLinkText}\n </AppLink>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"Rfr9N\",\"heatMapTimepointIndicator\":\"s6JbA\",\"heatMapTimepointIndicatorVisible\":\"mgjWX\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-heatmap.scss';\n\nconst namespace = 'shared.insightHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHeatmapProps {\n engagement: Engagement;\n heatmapAppLink: Core.AppLink;\n}\n\nexport function InsightHeatmap(props: InsightHeatmapProps) {\n const engagementRate = props.engagement.engagementRate > 0 ? Math.round(props.engagement.engagementRate * 100) : null;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='mb-2'>\n <p className='mb-0'>\n {engagementRate\n ? (\n <Text namespace={namespace} phrase='everyoneWatched' options={{ engagementRate }} />\n )\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n {engagementRate &&\n <AppLink appLink={props.heatmapAppLink} className='text-info'>\n <Text namespace={namespace} phrase='viewHeatmap' />\n </AppLink>\n }\n </div>\n\n <div className='mb-2'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n </div>\n\n <p className='h3 text-center mb-2'>{engagementRate || '--'}%</p>\n <p className='text-center mb-0 font-size-sm'><Text namespace={namespace} phrase='amountWatched' /></p>\n </InsightCard>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter\n ));\n}","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n return (new Array(Math.ceil(engagement.videoDuration))).fill(null).map((t, idx) => engagement.heatMap[idx] || 0);\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 } 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(interactive: Interactive, results: InteractiveResultSet): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\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 if (ArrayHelper.last(s.results).attempts.length === numInteractions) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= ScoreThresholdDefaults.HIGH)\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < 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).reverse();\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: result.attempts.length,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n\n if (yearGroup?.name)\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: User;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {props.anonymiseUsers\n ? anonymiseUserName(props.user, true)\n : props.showDisplayName\n ? UserHelper.getDisplayName(props.user)\n : UserHelper.getFullName(props.user)\n }\n </h4>\n {props.showSubText && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\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 { Xhr } from 'libs/common/backbone/interfaces/Xhr';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsRequestFilter, Engagement, IndividualEngagementResponse } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: IndividualEngagementResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: Engagement) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n success?: (data: VideoViewEventResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let baseKey = 'video:views';\n\n if (objectId)\n baseKey += `:${objectId}`;\n\n const queryParams: HashObject = {\n objectId,\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(baseKey, filter, sharerId),\n normalize: false,\n success,\n error,\n always\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 { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}","// extracted by mini-css-extract-plugin\nexport default {\"font\":\"nSTtI\",\"chartContainer\":\"Otcfo\"};","import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\n\nimport styles from './insight-chart.scss';\n\nconst getStaticChartOptions = (label: string): Highcharts.Options => {\n return {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n yAxis: {\n title: {\n text: null\n },\n labels: {\n enabled: false\n },\n gridLineWidth: 0,\n min: 0,\n max: 1\n },\n xAxis: {\n title: {\n text: label,\n style: {\n color: '#313543',\n fontSize: '12px'\n }\n },\n labels: {\n style: {\n color: '#313543',\n fontSize: '12px'\n }\n },\n className: styles.font,\n lineWidth: 0\n },\n legend: {\n enabled: false\n },\n chart: {\n type: 'column',\n backgroundColor: 'transparent',\n height: '160px',\n spacingTop: 20\n },\n plotOptions: {\n column: {\n dataLabels: {\n enabled: false\n },\n enableMouseTracking: false,\n minPointLength: 8\n }\n }\n };\n};\n\ninterface InsightChartProps {\n label: string;\n chartData: ChartData;\n}\n\nexport function InsightChart(props: InsightChartProps) {\n function getChartOptions(): Highcharts.Options {\n const data = props.chartData;\n const staticChartOptions = getStaticChartOptions(props.label);\n\n return {\n ...staticChartOptions,\n xAxis: {\n ...staticChartOptions.xAxis,\n categories: data.categories\n },\n series: data.series\n };\n }\n\n return (\n <div className={styles.chartContainer}>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions()}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"tealChart\":\"lZZf0\",\"grayChart\":\"wJQc4\",\"font\":\"o1Xbr\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-attempts.scss';\n\nconst namespace = 'shared.insightAverageAttempts';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAverageAttemptsProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageAttempts(props: InsightAverageAttemptsProps) {\n const averageAttempts = getAverageAttempts();\n const chartData = getChartData();\n\n function getCategoriesData() {\n const categoriesData: HashObject = {};\n props.students.forEach(student => {\n const attemptsCategory = student.summary.attempts.toString();\n\n if (!(attemptsCategory in categoriesData)) {\n Object.assign(categoriesData, { [attemptsCategory]: 0 });\n }\n\n categoriesData[attemptsCategory]++;\n });\n return Object.keys(categoriesData).length ? categoriesData : { 0: 0 };\n }\n\n function getAverageAttempts() {\n return props.students.reduce((acc, student) => student.summary.attempts > acc ? student.summary.attempts : acc, 0);\n }\n\n function getChartData(): ChartData {\n const categoriesData = getCategoriesData();\n const noAttempts = categoriesData[0] === 0;\n\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n color: categoriesData[0] ? '#EAEAEA' : '#40C2BB',\n borderRadius: 4,\n dataLabels: {\n enabled: !noAttempts,\n style: {\n fontSize: '12px',\n fontWeight: 'normal'\n },\n inside: false,\n overflow: 'allow',\n crop: false,\n className: styles.font\n },\n data: Object.keys(categoriesData).map(category => ({\n className: `${noAttempts ? styles.grayChart : styles.tealChart} ${averageAttempts.toString() !== category ? 'opacity-25' : ''}`,\n y: categoriesData[category]\n }))\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Refresh}\n svgClassName='bg-light-indigo text-indigo'\n >\n <p>\n {averageAttempts\n ? <Text namespace={namespace} phrase='averageAttempts' options={{ attempts: averageAttempts }} />\n : <Text namespace={namespace} phrase='noAttempts'/>\n }\n </p>\n\n <div className='mt-auto'>\n <InsightChart label={getPhrase('attempts')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"redChart\":\"G7zOw\",\"yellowChart\":\"k34mm\",\"greenChart\":\"vBneA\",\"blueChart\":\"RPTWm\",\"grayChart\":\"k4JFZ\",\"borderDark\":\"LWor3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-score.scss';\n\nconst namespace = 'shared.insightAverageScore';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightAverageScoreProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageScore(props: InsightAverageScoreProps) {\n function getChartData(): ChartData {\n const scoreCount = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n const scorePercentageData = props.students.reduce((acc, value) => {\n const scoreIndex = Math.floor(value.summary.percentCorrect * 10);\n acc[scoreIndex]++;\n\n return acc;\n }, scoreCount);\n\n const PERCENTAGES = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100' ];\n // TODO Outline \n // const averageScore = scorePercentageData.reduce((acc, value) => {\n // return value > acc ? value : acc;\n // }, 0);\n // ${averageScore === score ? styles.borderDark : ''}\n\n return {\n categories: PERCENTAGES,\n series: [{\n type: 'column',\n color: '#4E9ACE',\n borderRadius: 4,\n data: scorePercentageData.map((score, index) => {\n const percentageCategory = Number(PERCENTAGES[index]);\n\n const getChartColour = (percentage: number, score: number) => {\n if (score === 0)\n return styles.grayChart;\n if (percentage < 50)\n return styles.redChart;\n if (percentage < 70)\n return styles.yellowChart;\n if (percentage < 90)\n return styles.greenChart;\n\n return styles.blueChart;\n };\n\n return {\n className: `${getChartColour(percentageCategory, score)} rounded`,\n y: score\n };\n })\n }]\n };\n }\n\n function getAverageNumbers() {\n const averageScores = props.students.map(student => student.summary.percentCorrect);\n const averagePercentage = averageScores.reduce((a, b) => a + b, 0) / averageScores.length;\n const totalQuestions = ArrayHelper.last(\n ArrayHelper.last(props.students).results\n ).attempts.length;\n\n return {\n averageScore: Math.round(totalQuestions * averagePercentage),\n totalQuestions,\n averagePercentage: Math.round((averagePercentage * 100) * 10) / 10\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Chart}\n svgClassName='bg-light-orange text-orange'\n >\n <p>\n {props.students.length\n ? <Text namespace={namespace} phrase='averageScore' options={getAverageNumbers()} />\n : <Text namespace={namespace} phrase='noAnswers' />\n }\n </p>\n\n <InsightChart label={`${getPhrase('studentScores')} (%)`} chartData={getChartData()} />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightCompletedStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightCompletedStudents(props: InsightCompletedStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completedStudents')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightEasiestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightEasiestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightEasiestQuestion(props: InsightEasiestQuestionProps) {\n const easiestQuestion = getEasiestQuestion(props.interactive, props.results);\n\n function getEasiestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.last(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n subtitle={getPhrase('subtitle')}\n svgName={cvSvgLibrary.StarOutline}\n svgClassName='bg-light-blue text-blue'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={easiestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {easiestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={easiestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {easiestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n className='text-info'>\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHardestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHardestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightHardestQuestion(props: InsightHardestQuestionProps) {\n const hardestQuestion = getHardestQuestion(props.interactive, props.results);\n\n function getHardestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.first(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n subtitle={getPhrase('subtitle')}\n svgName={cvSvgLibrary.QuestionMark}\n svgClassName='bg-light-orange text-orange'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={hardestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {hardestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={hardestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {hardestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHighScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHighScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n greenChartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers?: boolean;\n}\n\nexport function InsightHighScoringStudents(props: InsightHighScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n subtitle={getPhrase('subtitle')}\n svgName={cvSvgLibrary.Trophy}\n svgClassName='bg-light-teal text-teal'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.greenChartImageUrl}\n description={getPhrase(props.completed.length ? 'noStudents' : 'highScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n appLinkText={getPhrase('viewByHighest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightLowScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightLowScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n redChartImageUrl: string;\n heartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightLowScoringStudents(props: InsightLowScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n subtitle={getPhrase('subtitle')}\n svgName={cvSvgLibrary.Hand}\n // TODO add light red\n svgClassName='bg-light-red text-red'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.completed.length ? props.heartImageUrl : props.redChartImageUrl}\n description={getPhrase(props.completed.length ? 'doingWell' : 'lowScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n appLinkText={getPhrase('viewByLowest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'shared.insightMarkingRequired';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightMarkingRequiredProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightMarkingRequired(props: InsightMarkingRequiredProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-blue text-blue'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsRequireMarking')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightNotCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightNotCompletedStudentsProps {\n markingRequiredStudents: StudentResultsWithSummary[];\n completedStudents: StudentResultsWithSummary[];\n notCompletedStudents: StudentResultsWithSummary[];\n classroomStudents: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightNotCompletedStudents(props: InsightNotCompletedStudentsProps) {\n const notCompletedStudents = getNotCompletedStudents();\n\n function getNotCompletedStudents() {\n const markingRequiredStudentIds = props.markingRequiredStudents.map(student => student?.user.id);\n const completedStudentIds = props.completedStudents.map(student => student?.user.id);\n\n const notStartedStudents = props.classroomStudents.filter(student => {\n return !markingRequiredStudentIds.includes(student.id) &&\n !completedStudentIds.includes(student.id);\n });\n\n return ArrayHelper.uniq([\n ...props.notCompletedStudents.map(student => student.user),\n ...notStartedStudents\n ], 'id');\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n count={notCompletedStudents.length}\n >\n <InsightStudentList\n students={notCompletedStudents}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completed')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightAverageAttempts } from 'libs/shared/apps/analytics/components/insights/average-attempts/InsightAverageAttempts';\nimport { InsightAverageScore } from 'libs/shared/apps/analytics/components/insights/average-score/InsightAverageScore';\nimport { InsightCompletedStudents } from 'libs/shared/apps/analytics/components/insights/completed-students/InsightCompletedStudents';\nimport { InsightEasiestQuestion } from 'libs/shared/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion';\nimport { InsightHardestQuestion } from 'libs/shared/apps/analytics/components/insights/hardest-question/InsightHardestQuestion';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightHighScoringStudents } from 'libs/shared/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents';\nimport { InsightLowScoringStudents } from 'libs/shared/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents';\nimport { InsightMarkingRequired } from 'libs/shared/apps/analytics/components/insights/marking-required/InsightMarkingRequired';\nimport { InsightNotCompletedStudents } from 'libs/shared/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { BasePaginatedCollection, Classroom, Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, User } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { getInsightsInteractiveTabs } from 'apps/insights/utils/InsightsAppLinkUtils';\nimport { InsightsHeaderView } from 'apps/insights/views/header/InsightsHeaderView';\nimport { getInteractiveInsightsAppLinks } from 'apps/insights/views/interactive/overview/InteractiveInsightsOverviewUtils';\n\nconst namespace = 'insights.interactiveInsightsOverview';\n\ninterface InteractiveInsightsViewProps {\n interactiveId: string;\n classroomId?: string;\n}\n\nexport function InteractiveInsightsOverviewView(props: InteractiveInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data && props.classroomId &&\n ClassroomRequests.getClassroom(props.classroomId, currentUser.data.id));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n });\n\n const classroomFilterOnly =\n audienceAppLinkParams.classrooms?.length === 1 && !audienceAppLinkParams.classroomGroups?.length;\n const classroomStudents = Flight.useBasicFetch<BasePaginatedCollection<User>>(classroomFilterOnly &&\n ClassroomRequests.getClassroomStudents(ArrayHelper.first(audienceAppLinkParams.classrooms)));\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewRequests.aggregateEngagement(\n props.interactiveId,\n {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n },\n currentUser.data.id\n )\n );\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n (!props.classroomId || classroom.data) &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n (!classroomFilterOnly || classroomStudents.data) &&\n aggregateEngagement.data;\n\n const studentGroups = hasDataLoaded && groupStudents(interactive.data, results.data);\n\n function getUsers(studentResult: StudentResultsWithSummary[]): User[] {\n return studentResult.map(student => student.user);\n }\n\n if (!hasDataLoaded) return <></>;\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n props.interactiveId\n );\n\n return (\n <div className='px-3'>\n <InsightsHeaderView\n video={interactiveMetadata.data}\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(interactiveMetadata.data.id, 'overview', params)}\n />\n\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentResponses' />\n <span>: {studentGroups.completed.length}{classroomStudents.data ? `/${classroomStudents.data.data.length}` : ''}</span>\n </h2>\n\n <div className='row g-3'>\n <div className='col-12 col-md'>\n <InsightMarkingRequired\n imageUrl={ImageUrls.Insights.SPEECH_BUBBLE_ASTERISK}\n resultsAppLink={interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={config.data.imageCdnUrl}\n students={getUsers(studentGroups.markingRequired)}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n\n {classroomFilterOnly && (\n <div className='col-12 col-md'>\n <InsightNotCompletedStudents\n markingRequiredStudents={studentGroups.markingRequired}\n completedStudents={studentGroups.completed}\n notCompletedStudents={studentGroups.notCompleted}\n classroomStudents={classroomStudents.data.data}\n imageCdnUrl={config.data.imageCdnUrl}\n imageUrl={ImageUrls.Insights.JIGSAW}\n resultsAppLink={interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n )}\n\n <div className='col-12 col-md'>\n <InsightCompletedStudents\n students={studentGroups.completed}\n imageCdnUrl={config.data.imageCdnUrl}\n imageUrl={ImageUrls.Insights.AVATAR}\n resultsAppLink={interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n </div>\n </section>\n\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentsPerformance' />\n </h2>\n\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightLowScoringStudents\n redChartImageUrl={ImageUrls.Insights.RED_CHART}\n heartImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n resultsAppLink={interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={config.data.imageCdnUrl}\n students={studentGroups.lowScore}\n completed={studentGroups.completed}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHighScoringStudents\n greenChartImageUrl={ImageUrls.Insights.GREEN_CHART}\n resultsAppLink={interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={config.data.imageCdnUrl}\n students={studentGroups.highScore}\n completed={studentGroups.completed}\n anonymiseUsers={anonymiseUsers}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHardestQuestion\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n results={results.data}\n questionsAppLink={interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightEasiestQuestion\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n results={results.data}\n questionsAppLink={interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n </div>\n </section>\n\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='classPerformance' />\n </h2>\n\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightAverageScore\n students={studentGroups.completed}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightAverageAttempts\n students={studentGroups.completed}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={aggregateEngagement.data}\n heatmapAppLink={interactiveInsightsAppLinks.heatmapAppLink}\n />\n </div>\n </div>\n </section>\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject) {\n return {\n resultsAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_RESULTS,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_QUESTIONS,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_HEATMAP,\n args: [id],\n params\n }\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","svgClassName","SvgContainer","svgName","title","subtitle","count","children","MAX_ITEMS","InsightStudentList","students","slice","student","id","UserRecipientItemMetadata","user","imageCdnUrl","avatarClassName","detailsClassName","showDisplayName","showSubText","anonymiseUsers","undefined","percentage","round","PercentageIndicator","src","imageUrl","description","AppLink","appLink","appLinkText","getPhrase","LanguageService","InsightHeatmap","engagementRate","options","heatmapAppLink","getInteractiveResultFilters","currentUser","filter","currentUserId","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","getFullHeatMap","Array","ceil","videoDuration","fill","t","groupStudents","results","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","attempts","percentCorrect","sortedLowScore","sortedHighScore","reverse","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","questionId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","answers","every","a","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","interactions","interactionIds","Set","answeredInteractions","has","avatar","initials","name","surname","getSubText","userType","role","yearGroup","defaults","InteractionCorrectness","InteractiveAnswerStatus","VideoViewRequests","individualEngagement","objectId","sharerId","queryParams","formatData","d","aggregateEngagement","views","baseKey","timeOffset","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","interactionRequiresAnswer","flattenInteractions","timepoints","getStudentResult","getStudentAttempt","getInteractions","getStaticChartOptions","label","credits","enabled","yAxis","labels","gridLineWidth","min","xAxis","color","fontSize","lineWidth","legend","chart","height","spacingTop","plotOptions","column","dataLabels","enableMouseTracking","minPointLength","InsightChart","highcharts","chartData","staticChartOptions","categories","series","InsightAverageAttempts","categoriesData","noAttempts","averageAttempts","reduce","acc","attemptsCategory","Object","assign","keys","getCategoriesData","borderRadius","fontWeight","inside","overflow","crop","category","y","InsightAverageScore","averageScores","averagePercentage","b","totalQuestions","ArrayHelper","averageScore","scorePercentageData","floor","PERCENTAGES","score","index","percentageCategory","Number","getChartColour","InsightCompletedStudents","resultsAppLink","InsightEasiestQuestion","sortedInteractions","easiestQuestion","resultsSummary","layout","InteractionLabel","iconClassName","questionsAppLink","params","sortBy","InsightHardestQuestion","hardestQuestion","InsightHighScoringStudents","greenChartImageUrl","InsightLowScoringStudents","heartImageUrl","redChartImageUrl","InsightMarkingRequired","InsightNotCompletedStudents","markingRequiredStudentIds","completedStudentIds","notStartedStudents","notCompletedStudents","markingRequiredStudents","completedStudents","classroomStudents","includes","InteractiveInsightsOverviewView","SharedViewModelKeys","UserRequests","config","ConfigRequests","classroom","classroomId","ClassroomRequests","InteractiveRequests","audienceAppLinkParams","dateRangeAppLinkParams","classroomFilterOnly","classrooms","classroomGroups","hasDataLoaded","studentGroups","studentResult","interactiveInsightsAppLinks","application","action","args","getInteractiveInsightsAppLinks","InsightsHeaderView","video","tabs","ImageUrls"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1734],{71553:(e,t,n)=>{n.d(t,{I:()=>s});var a=n(99940),r=n(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var s={interactiveResultSet:function(e,t,n,s,c,l,o){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),s),data:i(n,s),type:a.k.POST,normalize:!1,success:c,error:l,always:o}},mark:function(e,t,n,r,i,s,c){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:c}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},83657:(e,t,n)=>{n.d(t,{e:()=>o});var a=n(32735),r=n(91967),i=n(10874),s=n(36532),c=n(42735),l=n(86509);function o(e){var t=a.useMemo((function(){return e.actions.sort((function(e,t){return e.order-t.order}))}),[e.actions]),n=[],o=[];t.forEach((function(e){e.button?n.push(e):o.push(e)}));var u="d-flex";return e.className&&(u+=" ".concat(e.className)),n.length||o.length?a.createElement("div",{className:u},n.length?n.map((function(t,n){return a.createElement(a.Fragment,{key:n},function(){if(t.label){var n=r.q.isFunction(t.label)?t.label:function(){return a.createElement(a.Fragment,null,t.label)};return a.createElement(c.K,{appLink:t.appLink,href:t.href,onClick:t.onClick,svgName:t.svgName,svgSize:e.dropdownToggleSvgSize,className:t.className,tooltip:t.tooltip,showSpinner:t.showSpinner,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled},n())}var l=a.createElement(i.h,{appLink:t.appLink,href:t.href,onClick:t.onClick,svgName:t.svgName,className:t.className,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled,showBorder:t.showBorder,customSize:e.customSize,ariaLabel:t.tooltip});return t.tooltip?a.createElement(s.u,{title:t.tooltip,spanHack:!0},l):l}())})):a.createElement(a.Fragment,null),e.sortComponent&&e.sortComponent,o.length?a.createElement(l.m,{actions:o,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):a.createElement(a.Fragment,null)):a.createElement(a.Fragment,null)}},64071:(e,t,n)=>{n.d(t,{i:()=>c});var a=n(32735),r=n(23481),i=n(23232),s=r.T.encloseNamespace("insights.insightsListEmptyState");function c(e){return a.createElement(i.u,null,a.createElement(i.u.Image,{src:e.imageUrl,size:"small"}),a.createElement(i.u.Heading,null,s(e.useInteractiveCopy?"interactivesHeading":"genericHeading")),a.createElement(i.u.Info,null,s(e.useInteractiveCopy?"interactivesInfo":"genericInfo")),!!e.appLink&&a.createElement(i.u.Cta,{appLink:e.appLink,text:s("cta")}))}},70835:(e,t,n)=>{n.d(t,{G:()=>C});var a=n(32735),r=n(95834),i=n(69674),s=n(82602),c=n(23481),l=n(75896),o=n(110),u=n(65858),d=n(29024),p=n(40391),m=n(64249),v=n(83657),g=n(36848),f=n(83914),h=n(83345),y=n(4594),E=n(85063),I=n(35223),b=n(31908),k="insights.insightsListTable",S=c.T.encloseNamespace(k);function w(e){var t;if(e.type===E.y.ShareLink||!(null===(t=null==e?void 0:e.recipients)||void 0===t?void 0:t.length))return e.dateCreated;var n=e.recipients.map((function(e){return e.dateShared}));return n.sort((function(e,t){return o.O.isSame(e,t)?0:o.O.isAfter(e,t)?1:-2})),n.length?l.m.last(n):""}var C=a.memo((function(e){var t,n,c,l,o,C,N,O,L,T,A,j=(t=e.sentShares,n=e.sharedObjects,c=e.shareRecipients,l=e.interactivesPendingReviews,o=e.dependencies,a.useMemo((function(){var e=[];return t.forEach((function(t){var a,r,i=n.find((function(e){return e.id===t.objectId})),s=null;if(t.type===E.y.DirectShare&&(s=[],null===(a=t.recipients)||void 0===a||a.forEach((function(e){var t=c.find((function(t){return t.id===e.id}));t&&s.push(t)}))),i){var o=i.typeId===y.E.Interactive&&(null==l?void 0:l.find((function(e){return e.interactiveId===i.interactiveId})));e.push({share:t,sharedObject:i,shareRecipients:s,dateShared:w(t),viewCount:null!==(r=t.viewCount)&&void 0!==r?r:0,pendingReview:null==o?void 0:o.pendingReviewCount})}})),e}),o));return a.createElement(a.Fragment,null,a.createElement(i.i,{columns:(C=e.getObjectAppLink,N=e.getObjectActions,O=e.imageCdnUrl,L=e.breakpoints,T=e.hideViews,A=L&&(L.xs||L.sm||L.md),[{Header:S("title"),accessor:"sharedObject",id:"image",Cell:function(e){var t=e.value;return a.createElement("div",{className:"w-100"},a.createElement(d.k,{object:t,appLink:C(t),showVideoMetadata:!0,locationContext:u.LZ.SharedByMe}))},minWidth:140,maxWidth:30},{accessor:"sharedObject",id:"name",Cell:function(e){var t,n,r=e.value,i=e.row,s=e.data;if(r.name){if(b.M.isVideoType(r)&&!(null===(t=b.M.getCanBeConsumed(r))||void 0===t?void 0:t.canNavigate))return a.createElement("span",{className:"clamp-2"},r.name);var c=null===(n=s[i.index])||void 0===n?void 0:n.pendingReview;return a.createElement("div",null,a.createElement(g.F,{appLink:C(r),className:"clamp-2",analyticsData:{id:r.id,name:r.name},analyticsOptions:{entity:m.I.getAnalyticsEntity(r.type),actionType:u.Vw.Click,location:u.LZ.SharedByMe}},r.name),!!c&&a.createElement("div",{className:"bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2"},a.createElement(h.x,{namespace:k,phrase:"requireMarking",options:{count:c}})))}return a.createElement("span",null,a.createElement(h.x,{namespace:k,phrase:"videoUnavailable"}))},width:100},{Header:S("sharedTo"),accessor:"shareRecipients",Cell:function(e){var t=e.value;return t?t.length?a.createElement(p.Kh,{recipients:t,imageCdnUrl:O,maxAvatars:A?1:2}):a.createElement(p.m9,null):a.createElement(p.Ad,null)},width:30},!T&&{Header:S("views"),accessor:"share",Cell:function(e){var t=e.value;return a.createElement("div",{className:"d-flex align-items-center"},a.createElement(f.x,{svgName:I.vn.User}),a.createElement("span",null,t.accessedCount,t.totalAccessible?"/".concat(t.totalAccessible):""))},width:30},!A&&{Header:S("shared"),id:"dateShared",accessor:function(e){return(0,s.WU)(e.dateShared)},width:40},{accessor:"sharedObject",id:"actions",Cell:function(e){var t=e.value;return a.createElement(v.e,{actions:N(t),className:"w-100 justify-content-end align-items-center gap-2",actionsDropdownClassName:"bg-transparent",dropdownToggleSvgSize:f.S.Standard})},width:40}].filter(Boolean)),data:j,theme:r.J}))}))},64734:(e,t,n)=>{n.r(t),n.d(t,{InsightsListView:()=>P});var a=n(32735),r=n(70680),i=n(39202),s=n(23481),c=n(20354),l=n(75896),o=n(71553),u=n(26025),d=n(65961),p=n(30439),m=n(71020),v=n(83345),g=n(4594),f=n(39151),h=n(31949),y=n(39902),E=n(79967),I=n(60115),b=n(79612),k=n(66607),S=n(99742),w=n(14070),C=n(97291),N=n(64071),O=n(70835),L=n(36848);function T(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var A="insights.insightsTypeFilters",j=s.T.encloseNamespace(A);function F(e){return a.createElement("div",{className:"d-flex align-items-center"},a.createElement("p",{className:"h6 mb-0"},a.createElement(v.x,{namespace:A,phrase:"filters"})),a.createElement("div",{className:"d-flex border-start border-light ps-3 ms-3 gap-2"},a.createElement(x,{typeId:g.E.Video,typeFilters:e.typeIdParams,appLink:e.appLink}),a.createElement(x,{typeId:g.E.Clip,typeFilters:e.typeIdParams,appLink:e.appLink}),a.createElement(x,{typeId:g.E.Interactive,typeFilters:e.typeIdParams,appLink:e.appLink})))}function x(e){var t,n,r=e.typeFilters.includes(e.typeId),i=e.appLink,s=i.params;t=r?e.typeFilters.filter((function(t){return t!==e.typeId})):[].concat(function(e){if(Array.isArray(e))return T(e)}(n=e.typeFilters)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||function(e,t){if(e){if("string"==typeof e)return T(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)?T(e,t):void 0}}(n)||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.typeId]);var c=Object.assign(Object.assign({},i),{params:Object.assign(Object.assign({},s),{typeId:t})});function l(){return e.typeId===g.E.Video?"videos":e.typeId===g.E.Clip?"clips":e.typeId===g.E.Interactive?"interactives":void 0}return a.createElement(L.F,{className:"btn ".concat(r?"btn-dark":"btn-outline-dark"),appLink:c,ariaLabel:"".concat(j("ariaFilterBy"),": ").concat(j(l()))},a.createElement(v.x,{namespace:A,phrase:l()}))}var M=n(23120),R=n(82202),V=n(63153);function B(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(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)?H(e,t):void 0}}(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 H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var U="lite.insightsList",D=s.T.encloseNamespace(U);function P(){var e,t=(0,r.I0)(),n=(0,E.k)(),s=c.a.useBasicFetch(h.N.currentUser()),L=i.C$.getCurrentAppLink(),T=(0,M.w)(L),A=u.B.getAudienceAppLinkParams(),j=function(e){return p.o.sentShare(Object.assign({cursor:e},(t=[g.E.Video,g.E.Interactive,g.E.Clip],{recipientUserId:null==A?void 0:A.users,recipientGroupId:[].concat(B((null==A?void 0:A.classroomGroups)||[]),B((null==A?void 0:A.classrooms)||[])),objectTypeId:T.length?T:t})));var t},x=function(e){return c.a.getFetch(t)(j(e))},H=(0,I.K)(j,x),P=H.items,z=H.hasMore,_=H.isFetching,G=H.nextCursor,W=l.m.uniq(null!==(e=null==P?void 0:P.map((function(e){return e.objectId})))&&void 0!==e?e:[]),K=(0,y.f)(W,(function(e){return p.o.sharedObjectsById(e)})),q=(null==K?void 0:K.items)&&Object.keys(K.items).reduce((function(e,t){if(K.items[t].typeId!==g.E.Interactive)return e;var n=K.items[t];return[].concat(B(e),[{metadataId:n.id,interactiveId:n.interactiveId}])}),[]),J=c.a.useBasicFetch((null==K?void 0:K.items)&&s.data&&o.I.pendingReviews({interactives:q,filters:{currentCustomerId:s.data.customerId,currentUserId:s.data.id}})),$=k.x.getRecipientIds(P),Z=(0,y.f)($,(function(e){return p.o.getRecipientsById(e,s.data.customerId)})),Q=c.a.useBasicFetch(f.L.config());(0,b.M)({title:D("insights")});var X=(0,M.j)(n,A),Y=(0,V.o0)(P,!!K.items,$,!!Z.items,Q),ee=_||K.isFetching||Z.isFetching||J.isFetching,te=JSON.stringify(L.params),ne=a.useMemo((function(){return P}),[!!P,ee,te]),ae=a.useMemo((function(){return(0,V.bT)(K)}),[!!K.items,ee,te]),re=a.useMemo((function(){return(0,V.bT)(Z)}),[!!Z.items,ee,te]),ie=[ee,te];return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"d-flex justify-content-between mb-2"},a.createElement("h1",null,a.createElement(v.x,{namespace:U,phrase:"insights"})),a.createElement(d.B,null)),a.createElement("div",{className:"mb-2"},a.createElement(F,{appLink:L,typeIdParams:T})),Y?a.createElement(R.N,null):P.length?a.createElement(a.Fragment,null,a.createElement(O.G,{sentShares:ne,sharedObjects:ae,shareRecipients:re,interactivesPendingReviews:J.data,getObjectAppLink:V.Qh,getObjectActions:X,imageCdnUrl:Q.data.imageCdnUrl,groupByDateShared:!0,dependencies:ie,breakpoints:n}),(z||ee)&&a.createElement(m._,{isFetching:ee,fetchNext:x,nextCursor:G})):a.createElement(N.i,{appLink:{application:C.O.DASHBOARD,action:w.e.Dashboard.HOME},imageUrl:S.W.EmptyStates.Share.SHARED_WITH_ME}))}},23120:(e,t,n)=>{n.d(t,{j:()=>d,w:()=>p});var a=n(32735),r=n(23481),i=n(4594),s=n(35223),c=n(31908),l=n(14070),o=n(97291),u=r.T.encloseNamespace("lite.insightsList");function d(e,t){var n=e.xs||e.sm||e.md,r=JSON.stringify(t);return a.useCallback((function(e){return function(e,t,n){var a,r;c.M.isVideo(e)&&(a="video",r={application:o.O.INSIGHTS,action:l.e.Insights.VIDEO_OVERVIEW,args:[e.id]}),c.M.isInteractive(e)&&(a="interactive",r={application:o.O.INSIGHTS,action:l.e.Insights.INTERACTIVE_OVERVIEW,args:[e.id]}),c.M.isClip(e)&&(a="clip",r={application:o.O.INSIGHTS,action:l.e.Insights.CLIP_OVERVIEW,args:[e.id]}),e.typeId===i.E.Series&&(a="series"),e.typeId===i.E.Playlist&&(a="playlist");var d=[{label:u("editShareSettings"),appLink:{application:o.O.DEFAULT,action:l.e.Default.SHARE,args:[e.id],params:{entityType:a}}}];if(c.M.isVideoType(e)){if(!c.M.getCanBeConsumed(e).canConsume)return[];d.unshift({label:u("viewInsights"),className:"btn btn-outline-dark",button:!n,svgName:s.vn.Chart,appLink:Object.assign(Object.assign({},r),{params:t})})}return d}(e,t,n)}),[n,r])}function p(e){var t,n,a=null===(t=e.params)||void 0===t?void 0:t.typeId;return a?"string"==typeof a?[+a]:(null===(n=e.params)||void 0===n?void 0:n.typeId.map((function(e){return+e})))||[]:[]}}}]);
2
+ //# sourceMappingURL=1734-bbca52585c-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/1734-bbca52585c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/empty-state/InsightsListEmptyState.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTableUtils.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTable.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/type-filter/InsightsTypeFilters.tsx","file:///app/packages/projects/lite/src/apps/insights/views/insights-list/InsightsListView.tsx","file:///app/packages/projects/lite/src/apps/insights/views/insights-list/InsightsListViewUtils.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n showBorder?: boolean; // only works for button without text label\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n customSize?: boolean;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n\n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n svgSize={props.dropdownToggleSvgSize}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n showBorder={a.showBorder}\n customSize={props.customSize}\n ariaLabel={a.tooltip}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'insights.insightsListEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsListEmptyStateProps {\n imageUrl: string;\n appLink?: Core.AppLink;\n useInteractiveCopy?: boolean;\n}\n\nexport function InsightsListEmptyState(props: InsightsListEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size='small'/>\n <EmptyState.Heading>\n {getPhrase(props.useInteractiveCopy ? 'interactivesHeading' : 'genericHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase(props.useInteractiveCopy ? 'interactivesInfo' : 'genericInfo')}</EmptyState.Info>\n {!!props.appLink &&\n <EmptyState.Cta appLink={props.appLink} text={getPhrase('cta')} />\n }\n </EmptyState>\n );\n}","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport {\n AnonymousSharedToAvatar,\n SharedLinkAvatar,\n SharedToAvatarList\n} from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\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 { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'insights.insightsListTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: UnionShareObject): string {\n if (share.type === ShareType.ShareLink || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesShared = share.recipients.map(r => r.dateShared);\n\n datesShared.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n\n if (!datesShared.length)\n return '';\n\n return ArrayHelper.last(datesShared);\n}\n\ninterface SharedByMeTableData {\n share: UnionShareObject;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: BaseObject[];\n viewCount: number;\n pendingReview: number;\n}\n\nexport function getColumns(\n getObjectAppLink: (object: BaseObject) => Core.AppLink,\n getObjectActions: (object: BaseObject) => ActionOptions[],\n imageCdnUrl: string,\n breakpoints?: Breakpoints,\n hideViews?: boolean\n): Column<SharedByMeTableData>[] {\n const isMobile = breakpoints && (breakpoints.xs || breakpoints.sm || breakpoints.md);\n\n const columns: Column<SharedByMeTableData>[] = [\n {\n Header: getPhrase('title'),\n accessor: 'sharedObject',\n id: 'image',\n Cell: ({ value }) => (\n <div className='w-100'>\n <SharedObjectImage\n object={value}\n appLink={getObjectAppLink(value)}\n showVideoMetadata\n locationContext={LocationContext.SharedByMe}\n />\n </div>\n ),\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'sharedObject',\n id: 'name',\n Cell: ({ value, row, data }) => {\n if (value.name) {\n if (VideoHelper.isVideoType(value) && !VideoHelper.getCanBeConsumed(value)?.canNavigate) {\n return (\n <span className='clamp-2'>\n {value.name}\n </span>\n );\n }\n\n const pendingReview = data[row.index]?.pendingReview;\n\n return (\n <div>\n <AppLink\n appLink={getObjectAppLink(value)}\n className='clamp-2'\n analyticsData={{ id: value.id, name: value.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(value.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {value.name}\n </AppLink>\n \n {!!pendingReview && (\n <div className='bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2'>\n <Text namespace={namespace} phrase='requireMarking' options={{ count: pendingReview }} />\n </div>\n )}\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 100\n },\n {\n Header: getPhrase('sharedTo'),\n accessor: 'shareRecipients',\n Cell: ({ value }) => {\n if (!value)\n return <SharedLinkAvatar />;\n\n if (!value.length)\n return <AnonymousSharedToAvatar />;\n\n return <SharedToAvatarList recipients={value} imageCdnUrl={imageCdnUrl} maxAvatars={isMobile ? 1 : 2} />;\n },\n width: 30\n },\n !hideViews && {\n Header: getPhrase('views'),\n accessor: 'share',\n Cell: ({ value }) => {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{value.accessedCount}{value.totalAccessible ? `/${value.totalAccessible}` : ''}</span>\n </div>\n );\n },\n width: 30\n },\n !isMobile && {\n Header: getPhrase('shared'),\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 40\n },\n {\n accessor: 'sharedObject',\n id: 'actions',\n Cell: ({ value }) => (\n <Actions\n actions={getObjectActions(value)}\n className='w-100 justify-content-end align-items-center gap-2'\n actionsDropdownClassName='bg-transparent'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n />\n ),\n width: 40\n }\n ];\n\n return columns.filter((Boolean));\n}\n\nexport function useGetData(\n sentShares: UnionShareObject[],\n sharedObjects: BaseObject[],\n shareRecipients: BaseObject[],\n interactivesPendingReviews: InteractivesPendingReviews[],\n dependencies: any[]\n): SharedByMeTableData[] {\n return React.useMemo(() => {\n const tableData: SharedByMeTableData[] = [];\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects.find(o => o.id === s.objectId);\n\n let recipients: BaseObject[] | null = null;\n\n if (s.type === ShareType.DirectShare) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients.find(s => s.id === r.id);\n\n if (recipient)\n recipients.push(recipient);\n });\n }\n\n // Skip if we don't have access to the shared object (e.g. if it's been deleted)\n if (sharedObject) {\n const pendingReview = sharedObject.typeId === MasterType.Interactive && interactivesPendingReviews?.find(\n pendingReview => pendingReview.interactiveId === (sharedObject as InteractiveMetadata).interactiveId\n );\n\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n viewCount: s.viewCount ?? 0,\n pendingReview: pendingReview?.pendingReviewCount\n });\n }\n });\n\n return tableData;\n }, dependencies);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './InsightsListTableUtils';\n\ninterface InsightsListTableProps {\n sentShares: UnionShareObject[];\n sharedObjects: BaseObject[];\n shareRecipients: BaseObject[];\n interactivesPendingReviews: InteractivesPendingReviews[];\n getObjectAppLink: (object: BaseObject) => Core.AppLink;\n getObjectActions: (object: BaseObject) => ActionOptions[];\n imageCdnUrl: string;\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: any[];\n breakpoints?: Breakpoints;\n hideViews?: boolean\n}\n\nfunction InsightsListTableMemo(props: InsightsListTableProps): JSX.Element {\n const data = useGetData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n props.interactivesPendingReviews,\n props.dependencies\n );\n\n return (\n <>\n <Table\n columns={getColumns(\n props.getObjectAppLink,\n props.getObjectActions,\n props.imageCdnUrl,\n props.breakpoints,\n props.hideViews\n )}\n data={data}\n theme={SHARES_TABLE_THEME}\n />\n </>\n );\n}\n\nexport const InsightsListTable = React.memo(InsightsListTableMemo);","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'insights.insightsTypeFilters';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsTypeFilterProps {\n appLink: Core.AppLink;\n typeIdParams: MasterType[];\n}\n\nexport function InsightsTypeFilters(props: InsightsTypeFilterProps) {\n return (\n <div className='d-flex align-items-center'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start border-light ps-3 ms-3 gap-2'>\n <InsightTypeFilterButton typeId={MasterType.Video} typeFilters={props.typeIdParams} appLink={props.appLink} />\n <InsightTypeFilterButton typeId={MasterType.Clip} typeFilters={props.typeIdParams} appLink={props.appLink} />\n <InsightTypeFilterButton\n typeId={MasterType.Interactive}\n typeFilters={props.typeIdParams}\n appLink={props.appLink}\n />\n </div>\n </div>\n );\n}\n\ninterface InsightTypeFilterButtonProps {\n typeId: MasterType;\n typeFilters: MasterType[];\n appLink: Core.AppLink;\n}\n\nfunction InsightTypeFilterButton(props: InsightTypeFilterButtonProps) {\n const selected = props.typeFilters.includes(props.typeId);\n\n const currentAppLink = props.appLink;\n const currentParams = currentAppLink.params as HashObject;\n\n let newType: MasterType[];\n\n if (selected)\n newType = props.typeFilters.filter(t => t !== props.typeId);\n else\n newType = [ ...props.typeFilters, props.typeId ];\n\n const newAppLink = {\n ...currentAppLink,\n params: {\n ...currentParams,\n typeId: newType\n }\n };\n\n function getTypePhrase(): string {\n if (props.typeId === MasterType.Video) return 'videos';\n if (props.typeId === MasterType.Clip) return 'clips';\n if (props.typeId === MasterType.Interactive) return 'interactives';\n }\n\n return (\n <AppLink\n className={`btn ${selected ? 'btn-dark' : 'btn-outline-dark'}`}\n appLink={newAppLink}\n ariaLabel={`${getPhrase('ariaFilterBy')}: ${getPhrase(getTypePhrase())}`}\n >\n <Text namespace={namespace} phrase={getTypePhrase()} />\n </AppLink>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { AudienceFilterView } from 'libs/shared/apps/analytics/views/audience-filter/AudienceFilterView';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { GetSentItemsParams } from 'libs/shared/apps/share/interfaces/requests/GetSentItemsParams';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsListEmptyState } from 'apps/insights/components/insights-list/empty-state/InsightsListEmptyState';\nimport { InsightsListTable } from 'apps/insights/components/insights-list/table/InsightsListTable';\nimport { InsightsTypeFilters } from 'apps/insights/components/insights-list/type-filter/InsightsTypeFilters';\nimport { getTypeIdParams, useGetInsightsObjectActions } from 'apps/insights/views/insights-list/InsightsListViewUtils';\nimport { PartialSharedByMeTable } from 'apps/share/views/shared-by-me/partial-loading/PartialSharedByMeTable';\nimport { getBatchFetchResultAsArray, getObjectAppLink, usePartialLoading } from 'apps/share/views/shared-by-me/SharedByMeViewUtils';\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function InsightsListView() {\n const dispatch = useDispatch();\n const breakpoints = useBreakpoints();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const currentAppLink = AppLinkHelper.getCurrentAppLink();\n\n const typeIdAppLinkParams = getTypeIdParams(currentAppLink);\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n\n const getRequest = (cursor?: string) => ShareRequests.sentShare({\n cursor,\n ...getSentSharesFilter()\n });\n const fetchNext = (cursor?: string) => Flight.getFetch(dispatch)(getRequest(cursor));\n\n const {\n items: sentShares,\n hasMore,\n isFetching: isFetchingSentShares,\n nextCursor\n } = useInfiniteList<UnionShareObject>(getRequest, fetchNext);\n\n const sharedObjectIds = ArrayHelper.uniq(sentShares?.map(s => s.objectId) ?? []);\n\n const sharedObjectsFetchResult = useBatchFetch(sharedObjectIds, (ids: string[]) => {\n return ShareRequests.sharedObjectsById(ids);\n });\n\n const interactiveIds = getInteractiveIds();\n\n const interactivesPendingReview = Flight.useBasicFetch<InteractivesPendingReviews[]>(\n sharedObjectsFetchResult?.items && currentUser.data &&\n InteractiveResultsRequests.pendingReviews({\n interactives: interactiveIds,\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n })\n );\n\n const recipientIds = ShareHelper.getRecipientIds(sentShares);\n\n const shareRecipientsFetchResult = useBatchFetch(recipientIds, (ids: string[]) => {\n return ShareRequests.getRecipientsById(ids, currentUser.data.customerId);\n });\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useSetPageMetadata({ title: getPhrase('insights') });\n\n const getSharedObjectActions = useGetInsightsObjectActions(breakpoints, audienceAppLinkParams);\n\n const showPartialLoading = usePartialLoading(\n sentShares,\n !!sharedObjectsFetchResult.items,\n recipientIds,\n !!shareRecipientsFetchResult.items,\n config\n );\n\n // Wait until all data is fetched before telling the table to re-render\n const isFetching = isFetchingSentShares\n || sharedObjectsFetchResult.isFetching\n || shareRecipientsFetchResult.isFetching\n || interactivesPendingReview.isFetching;\n\n const filterKey = JSON.stringify(currentAppLink.params);\n\n const sentSharesMemo = React.useMemo(() => sentShares, [ !!sentShares, isFetching, filterKey ]);\n const sharedObjects = React.useMemo(() =>\n getBatchFetchResultAsArray(sharedObjectsFetchResult), [ !!sharedObjectsFetchResult.items, isFetching, filterKey ]);\n const shareRecipients = React.useMemo(\n () =>\n getBatchFetchResultAsArray(shareRecipientsFetchResult),\n [ !!shareRecipientsFetchResult.items, isFetching, filterKey ]\n );\n\n const dependencies = [ isFetching, filterKey ];\n\n function getSentSharesFilter(): GetSentItemsParams {\n const defaultObjectTypes = [ MasterType.Video, MasterType.Interactive, MasterType.Clip ];\n\n return {\n recipientUserId: audienceAppLinkParams?.users,\n recipientGroupId: [ ...audienceAppLinkParams?.classroomGroups || [], ...audienceAppLinkParams?.classrooms || [] ],\n objectTypeId: typeIdAppLinkParams.length ? typeIdAppLinkParams : defaultObjectTypes\n };\n }\n\n function getInteractiveIds() {\n return sharedObjectsFetchResult?.items && Object.keys(sharedObjectsFetchResult.items).reduce(\n (acc, value) => {\n const isInteractive = sharedObjectsFetchResult.items[value].typeId === MasterType.Interactive;\n\n if (!isInteractive) return acc;\n\n const interactive = sharedObjectsFetchResult.items[value] as InteractiveMetadata;\n return [ ...acc, { metadataId: interactive.id, interactiveId: interactive.interactiveId }];\n },\n []\n );\n }\n\n return (\n <div className='px-3'>\n <div className='d-flex justify-content-between mb-2'>\n <h1><Text namespace={namespace} phrase='insights' /></h1>\n\n <AudienceFilterView />\n </div>\n\n <div className='mb-2'>\n <InsightsTypeFilters appLink={currentAppLink} typeIdParams={typeIdAppLinkParams} />\n </div>\n\n {(() => {\n if (showPartialLoading)\n return <PartialSharedByMeTable />;\n\n if (!sentShares.length)\n return (\n <InsightsListEmptyState\n appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }}\n imageUrl={ImageUrls.EmptyStates.Share.SHARED_WITH_ME}\n />\n );\n\n return (\n <>\n <InsightsListTable\n sentShares={sentSharesMemo}\n sharedObjects={sharedObjects}\n shareRecipients={shareRecipients}\n interactivesPendingReviews={interactivesPendingReview.data}\n getObjectAppLink={getObjectAppLink}\n getObjectActions={getSharedObjectActions}\n imageCdnUrl={config.data.imageCdnUrl}\n groupByDateShared\n dependencies={dependencies}\n breakpoints={breakpoints}\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\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 { HashObject } from 'libs/common/react/interfaces';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getInsightsObjectActions(\n sharedObject: BaseObject,\n audienceParams: AudienceQueryParams,\n isMobile: boolean\n): ActionOptions[] {\n let entityType: SharableEntityType;\n let insightsAppLink: Core.AppLink;\n\n if (VideoHelper.isVideo(sharedObject)) {\n entityType = 'video';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isInteractive(sharedObject)) {\n entityType = 'interactive';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isClip(sharedObject)) {\n entityType = 'clip';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (sharedObject.typeId === MasterType.Series)\n entityType = 'series';\n\n if (sharedObject.typeId === MasterType.Playlist)\n entityType = 'playlist';\n\n \n const insightObjectActions: ActionOptions[] = [\n {\n label: getPhrase('editShareSettings'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [sharedObject.id],\n params: { entityType }\n }\n }\n ];\n\n if (VideoHelper.isVideoType(sharedObject)) {\n const { canConsume } = VideoHelper.getCanBeConsumed(sharedObject);\n\n if (!canConsume)\n return [];\n\n insightObjectActions.unshift({\n label: getPhrase('viewInsights'),\n className: 'btn btn-outline-dark',\n button: !isMobile,\n svgName: cvSvgLibrary.Chart,\n appLink: { ...insightsAppLink, params: audienceParams }\n });\n }\n\n return insightObjectActions;\n}\n\nexport function useGetInsightsObjectActions(\n breakpoints: Breakpoints,\n audienceParams?: AudienceQueryParams\n): ((object: BaseObject) => ActionOptions[]) | null {\n const isMobile = breakpoints.xs || breakpoints.sm || breakpoints.md;\n const audienceParamsKey = JSON.stringify(audienceParams);\n\n return React.useCallback(\n (object: BaseObject) => getInsightsObjectActions(\n object,\n audienceParams,\n isMobile\n ),\n [ isMobile, audienceParamsKey ]\n );\n}\n\n\nexport function getTypeIdParams(appLink: Core.AppLink): MasterType[] {\n const typeIdParams = (appLink.params as HashObject)?.typeId;\n\n if (!typeIdParams) return [];\n\n if (typeof typeIdParams === 'string')\n return [+typeIdParams];\n\n return (appLink.params as HashObject)?.typeId.map((typeId: MasterType) => +typeId) || [];\n}"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","Actions","props","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","className","length","map","idx","label","appLink","href","onClick","svgName","svgSize","dropdownToggleSvgSize","tooltip","showSpinner","analyticsData","analyticsOptions","openInNewTab","disabled","iconButton","showBorder","customSize","ariaLabel","title","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","fetchMore","getPhrase","InsightsListEmptyState","src","imageUrl","size","useInteractiveCopy","text","namespace","LanguageService","getDateShared","share","ShareType","recipients","dateCreated","datesShared","r","dateShared","date1","date2","DateHelper","ArrayHelper","InsightsListTable","sentShares","sharedObjects","shareRecipients","interactivesPendingReviews","dependencies","getObjectAppLink","getObjectActions","imageCdnUrl","breakpoints","hideViews","isMobile","tableData","s","sharedObject","find","o","objectId","recipient","pendingReview","typeId","MasterType","viewCount","pendingReviewCount","Table","columns","xs","sm","md","Header","accessor","Cell","value","SharedObjectImage","object","showVideoMetadata","locationContext","minWidth","maxWidth","row","name","VideoHelper","canNavigate","index","AppLink","entity","ShareViewHelper","actionType","location","Text","phrase","options","count","width","SharedToAvatarList","maxAvatars","SvgContainer","accessedCount","totalAccessible","S","Boolean","theme","InsightsTypeFilters","InsightTypeFilterButton","typeFilters","typeIdParams","newType","selected","includes","currentAppLink","currentParams","params","t","newAppLink","getTypePhrase","InsightsListView","dispatch","useBreakpoints","UserRequests","typeIdAppLinkParams","audienceAppLinkParams","getRequest","cursor","ShareRequests","defaultObjectTypes","recipientUserId","users","recipientGroupId","classroomGroups","classrooms","objectTypeId","fetchNext","items","hasMore","isFetchingSentShares","isFetching","nextCursor","sharedObjectIds","sharedObjectsFetchResult","ids","interactiveIds","Object","keys","reduce","acc","interactive","metadataId","interactivesPendingReview","I","interactives","filters","recipientIds","ShareHelper","shareRecipientsFetchResult","config","ConfigRequests","useSetPageMetadata","getSharedObjectActions","showPartialLoading","filterKey","JSON","stringify","sentSharesMemo","AudienceFilterView","PartialSharedByMeTable","groupByDateShared","InfiniteScrollFooter","application","action","ImageUrls","useGetInsightsObjectActions","audienceParams","audienceParamsKey","entityType","insightsAppLink","args","insightObjectActions","canConsume","unshift","getInsightsObjectActions","getTypeIdParams"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7237],{71553:(e,t,n)=>{n.d(t,{I:()=>s});var a=n(99940),r=n(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var s={interactiveResultSet:function(e,t,n,s,c,o,l){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),s),data:i(n,s),type:a.k.POST,normalize:!1,success:c,error:o,always:l}},mark:function(e,t,n,r,i,s,c){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:c}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},62875:(e,t,n)=>{function a(e,t,n){var a="".concat(e,":").concat(t.start,":").concat(t.end),r=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,i=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return r&&(a+=":".concat(r)),i&&(a+=":".concat(i)),n&&(a+=":".concat(n)),a}n.d(t,{H:()=>a})},36511:(e,t,n)=>{n.d(t,{I:()=>r});var a=n(40424);function r(e){switch(e){case a.R.Pink:return"pink";case a.R.Orange:return"orange";case a.R.Green:return"green";case a.R.Blue:return"blue";case a.R.Purple:return"purple";case a.R.Indigo:return"indigo";default:return"pink"}}},95121:(e,t,n)=>{n.r(t),n.d(t,{ClassroomOverviewView:()=>M});var a=n(32735),r=n(70680),i=n(23481),s=n(20354),c=n(75896),o=n(71553),l=n(30439),u=n(49935),d=n(71020),m=n(5062),p=n(4594),v=n(39151),g=n(31949),f=n(39902),h=n(79967),I=n(60115),y=n(79612),E=n(66607),b=n(99742),w=n(14070),S=n(97291),k=n(88630),C=n(22602),O=n(64071),R=n(70835),A=n(23120),N=n(82202),T=n(63153);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var L=i.T.encloseNamespace("lite.insightsList");function M(e){var t,n,i,M=(0,r.I0)(),x=(0,h.k)(),F=s.a.useBasicFetch(g.N.currentUser()),H=s.a.useBasicFetch(F.data&&k.F.getClassroom(e.classroomId,F.data.id)),U=null===(n=null===(t=H.data)||void 0===t?void 0:t._integrations)||void 0===n?void 0:n.rostered,V=function(t){return l.o.sentShare({cursor:t,recipientGroupId:[e.classroomId]})},B=function(e){return s.a.getFetch(M)(V(e))},D=(0,I.K)(V,B),P=D.items,_=D.hasMore,G=D.isFetching,W=D.nextCursor,z=c.m.uniq(null!==(i=null==P?void 0:P.map((function(e){return e.objectId})))&&void 0!==i?i:[]),K=(0,f.f)(z,(function(e){return l.o.sharedObjectsById(e)})),Z=(null==K?void 0:K.items)&&Object.keys(K.items).reduce((function(e,t){if(K.items[t].typeId!==p.E.Interactive)return e;var n,a=K.items[t];return[].concat(function(e){if(Array.isArray(e))return j(e)}(n=e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||function(e,t){if(e){if("string"==typeof e)return j(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)?j(e,t):void 0}}(n)||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.")}(),[{metadataId:a.id,interactiveId:a.interactiveId}])}),[]),q=s.a.useBasicFetch((null==K?void 0:K.items)&&F.data&&o.I.pendingReviews({interactives:Z,filters:{currentCustomerId:F.data.customerId,currentUserId:F.data.id}})),J=E.x.getRecipientIds(P),Q=(0,f.f)(J,(function(e){return l.o.getRecipientsById(e,F.data.customerId)})),$=s.a.useBasicFetch(v.L.config());(0,y.M)({title:L("insights")});var X=(0,A.j)(x,{classrooms:[e.classroomId]}),Y=(0,T.o0)(P,!!K.items,J,!!Q.items,$),ee=G||K.isFetching||Q.isFetching||q.isFetching,te=a.useMemo((function(){return P}),[!!P,ee]),ne=a.useMemo((function(){return(0,T.bT)(K)}),[!!K.items,ee]),ae=a.useMemo((function(){return(0,T.bT)(Q)}),[!!Q.items,ee]);return F.data&&H.data?a.createElement(C.R,{activeTab:"overview",classroom:H.data,currentUser:F.data,onTogglePin:function(e,t,n){if(!U){var a=e?k.F.pinClassroom:k.F.unpinClassroom;s.a.fetch(M,a(H.data,t,n))}},isRostered:U},Y?a.createElement(N.N,null):P.length?a.createElement(a.Fragment,null,a.createElement(R.G,{sentShares:te,sharedObjects:ne,shareRecipients:ae,interactivesPendingReviews:q.data,getObjectAppLink:T.Qh,getObjectActions:X,imageCdnUrl:$.data.imageCdnUrl,groupByDateShared:!0,dependencies:[ee],breakpoints:x,hideViews:!0}),(_||ee)&&a.createElement(d._,{isFetching:ee,fetchNext:B,nextCursor:W})):a.createElement(O.i,{appLink:{application:S.O.DASHBOARD,action:w.e.Dashboard.HOME},imageUrl:b.W.EmptyStates.Share.SHARED_WITH_ME})):a.createElement("div",{className:"px-3"},a.createElement("div",{className:"mb-1 partial-loading-background"}),a.createElement("div",{className:"pb-3"},a.createElement(u.b2,{numItems:2})),a.createElement("div",{className:"pb-2"},a.createElement(m.Z,null)))}},64071:(e,t,n)=>{n.d(t,{i:()=>c});var a=n(32735),r=n(23481),i=n(23232),s=r.T.encloseNamespace("insights.insightsListEmptyState");function c(e){return a.createElement(i.u,null,a.createElement(i.u.Image,{src:e.imageUrl,size:"small"}),a.createElement(i.u.Heading,null,s(e.useInteractiveCopy?"interactivesHeading":"genericHeading")),a.createElement(i.u.Info,null,s(e.useInteractiveCopy?"interactivesInfo":"genericInfo")),!!e.appLink&&a.createElement(i.u.Cta,{appLink:e.appLink,text:s("cta")}))}},70835:(e,t,n)=>{n.d(t,{G:()=>C});var a=n(32735),r=n(95834),i=n(69674),s=n(82602),c=n(23481),o=n(75896),l=n(110),u=n(65858),d=n(29024),m=n(40391),p=n(64249),v=n(83657),g=n(36848),f=n(83914),h=n(83345),I=n(4594),y=n(85063),E=n(35223),b=n(31908),w="insights.insightsListTable",S=c.T.encloseNamespace(w);function k(e){var t;if(e.type===y.y.ShareLink||!(null===(t=null==e?void 0:e.recipients)||void 0===t?void 0:t.length))return e.dateCreated;var n=e.recipients.map((function(e){return e.dateShared}));return n.sort((function(e,t){return l.O.isSame(e,t)?0:l.O.isAfter(e,t)?1:-2})),n.length?o.m.last(n):""}var C=a.memo((function(e){var t,n,c,o,l,C,O,R,A,N,T,j=(t=e.sentShares,n=e.sharedObjects,c=e.shareRecipients,o=e.interactivesPendingReviews,l=e.dependencies,a.useMemo((function(){var e=[];return t.forEach((function(t){var a,r,i=n.find((function(e){return e.id===t.objectId})),s=null;if(t.type===y.y.DirectShare&&(s=[],null===(a=t.recipients)||void 0===a||a.forEach((function(e){var t=c.find((function(t){return t.id===e.id}));t&&s.push(t)}))),i){var l=i.typeId===I.E.Interactive&&(null==o?void 0:o.find((function(e){return e.interactiveId===i.interactiveId})));e.push({share:t,sharedObject:i,shareRecipients:s,dateShared:k(t),viewCount:null!==(r=t.viewCount)&&void 0!==r?r:0,pendingReview:null==l?void 0:l.pendingReviewCount})}})),e}),l));return a.createElement(a.Fragment,null,a.createElement(i.i,{columns:(C=e.getObjectAppLink,O=e.getObjectActions,R=e.imageCdnUrl,A=e.breakpoints,N=e.hideViews,T=A&&(A.xs||A.sm||A.md),[{Header:S("title"),accessor:"sharedObject",id:"image",Cell:function(e){var t=e.value;return a.createElement("div",{className:"w-100"},a.createElement(d.k,{object:t,appLink:C(t),showVideoMetadata:!0,locationContext:u.LZ.SharedByMe}))},minWidth:140,maxWidth:30},{accessor:"sharedObject",id:"name",Cell:function(e){var t,n,r=e.value,i=e.row,s=e.data;if(r.name){if(b.M.isVideoType(r)&&!(null===(t=b.M.getCanBeConsumed(r))||void 0===t?void 0:t.canNavigate))return a.createElement("span",{className:"clamp-2"},r.name);var c=null===(n=s[i.index])||void 0===n?void 0:n.pendingReview;return a.createElement("div",null,a.createElement(g.F,{appLink:C(r),className:"clamp-2",analyticsData:{id:r.id,name:r.name},analyticsOptions:{entity:p.I.getAnalyticsEntity(r.type),actionType:u.Vw.Click,location:u.LZ.SharedByMe}},r.name),!!c&&a.createElement("div",{className:"bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2"},a.createElement(h.x,{namespace:w,phrase:"requireMarking",options:{count:c}})))}return a.createElement("span",null,a.createElement(h.x,{namespace:w,phrase:"videoUnavailable"}))},width:100},{Header:S("sharedTo"),accessor:"shareRecipients",Cell:function(e){var t=e.value;return t?t.length?a.createElement(m.Kh,{recipients:t,imageCdnUrl:R,maxAvatars:T?1:2}):a.createElement(m.m9,null):a.createElement(m.Ad,null)},width:30},!N&&{Header:S("views"),accessor:"share",Cell:function(e){var t=e.value;return a.createElement("div",{className:"d-flex align-items-center"},a.createElement(f.x,{svgName:E.vn.User}),a.createElement("span",null,t.accessedCount,t.totalAccessible?"/".concat(t.totalAccessible):""))},width:30},!T&&{Header:S("shared"),id:"dateShared",accessor:function(e){return(0,s.WU)(e.dateShared)},width:40},{accessor:"sharedObject",id:"actions",Cell:function(e){var t=e.value;return a.createElement(v.e,{actions:O(t),className:"w-100 justify-content-end align-items-center gap-2",actionsDropdownClassName:"bg-transparent",dropdownToggleSvgSize:f.S.Standard})},width:40}].filter(Boolean)),data:j,theme:r.J}))}))},23120:(e,t,n)=>{n.d(t,{j:()=>d,w:()=>m});var a=n(32735),r=n(23481),i=n(4594),s=n(35223),c=n(31908),o=n(14070),l=n(97291),u=r.T.encloseNamespace("lite.insightsList");function d(e,t){var n=e.xs||e.sm||e.md,r=JSON.stringify(t);return a.useCallback((function(e){return function(e,t,n){var a,r;c.M.isVideo(e)&&(a="video",r={application:l.O.INSIGHTS,action:o.e.Insights.VIDEO_OVERVIEW,args:[e.id]}),c.M.isInteractive(e)&&(a="interactive",r={application:l.O.INSIGHTS,action:o.e.Insights.INTERACTIVE_OVERVIEW,args:[e.id]}),c.M.isClip(e)&&(a="clip",r={application:l.O.INSIGHTS,action:o.e.Insights.CLIP_OVERVIEW,args:[e.id]}),e.typeId===i.E.Series&&(a="series"),e.typeId===i.E.Playlist&&(a="playlist");var d=[{label:u("editShareSettings"),appLink:{application:l.O.DEFAULT,action:o.e.Default.SHARE,args:[e.id],params:{entityType:a}}}];if(c.M.isVideoType(e)){if(!c.M.getCanBeConsumed(e).canConsume)return[];d.unshift({label:u("viewInsights"),className:"btn btn-outline-dark",button:!n,svgName:s.vn.Chart,appLink:Object.assign(Object.assign({},r),{params:t})})}return d}(e,t,n)}),[n,r])}function m(e){var t,n,a=null===(t=e.params)||void 0===t?void 0:t.typeId;return a?"string"==typeof a?[+a]:(null===(n=e.params)||void 0===n?void 0:n.typeId.map((function(e){return+e})))||[]:[]}}}]);
2
+ //# sourceMappingURL=7237-86c18f2701-lite.chunk.js.map