@clickview/lite 0.84.0 → 0.84.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/4945-lite-72ae59fcab.chunk.css +2 -0
  3. package/dist/css/8852-lite-84d6357a79.chunk.css +1 -0
  4. package/dist/css/{lite-app-b4540a3be1.css → lite-app-084c45f90e.css} +2 -0
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/{1202-d96ad80884-lite.chunk.js → 1202-5473d9962d-lite.chunk.js} +2 -2
  7. package/dist/scripts/{1202-d96ad80884-lite.chunk.js.map → 1202-5473d9962d-lite.chunk.js.map} +1 -1
  8. package/dist/scripts/171-acb1ef0ae4-lite.chunk.js +2 -0
  9. package/dist/scripts/171-acb1ef0ae4-lite.chunk.js.map +1 -0
  10. package/dist/scripts/1726-b08dde1407-lite.chunk.js +2 -0
  11. package/dist/scripts/1726-b08dde1407-lite.chunk.js.map +1 -0
  12. package/dist/scripts/1912-52e57d9f16-lite.chunk.js +2 -0
  13. package/dist/scripts/1912-52e57d9f16-lite.chunk.js.map +1 -0
  14. package/dist/scripts/{289-669c0c8222-lite.chunk.js → 289-190caa6455-lite.chunk.js} +2 -2
  15. package/dist/scripts/{289-669c0c8222-lite.chunk.js.map → 289-190caa6455-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/{3249-0b55dec380-lite.chunk.js → 3249-08a22f8aaf-lite.chunk.js} +2 -2
  17. package/dist/scripts/3249-08a22f8aaf-lite.chunk.js.map +1 -0
  18. package/dist/scripts/3840-df2873e349-lite.chunk.js +2 -0
  19. package/dist/scripts/3840-df2873e349-lite.chunk.js.map +1 -0
  20. package/dist/scripts/4006-5078eb2c01-lite.chunk.js +3 -0
  21. package/dist/scripts/4006-5078eb2c01-lite.chunk.js.map +1 -0
  22. package/dist/scripts/4525-2ade147f5d-lite.chunk.js +2 -0
  23. package/dist/scripts/4525-2ade147f5d-lite.chunk.js.map +1 -0
  24. package/dist/scripts/4945-fbbb21cf54-lite.chunk.js +2 -0
  25. package/dist/scripts/4945-fbbb21cf54-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4985-6bdacf82c1-lite.chunk.js +2 -0
  27. package/dist/scripts/4985-6bdacf82c1-lite.chunk.js.map +1 -0
  28. package/dist/scripts/5002-c0f45922c6-lite.chunk.js +2 -0
  29. package/dist/scripts/5002-c0f45922c6-lite.chunk.js.map +1 -0
  30. package/dist/scripts/516-94eeca32e7-lite.chunk.js +2 -0
  31. package/dist/scripts/516-94eeca32e7-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5270-55334d53e9-lite.chunk.js +2 -0
  33. package/dist/scripts/5270-55334d53e9-lite.chunk.js.map +1 -0
  34. package/dist/scripts/5579-7d9081e134-lite.chunk.js +2 -0
  35. package/dist/scripts/{5579-a9c152057f-lite.chunk.js.map → 5579-7d9081e134-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/5712-37a97adc65-lite.chunk.js +2 -0
  37. package/dist/scripts/5712-37a97adc65-lite.chunk.js.map +1 -0
  38. package/dist/scripts/639-0bf7cc53f9-lite.chunk.js +2 -0
  39. package/dist/scripts/639-0bf7cc53f9-lite.chunk.js.map +1 -0
  40. package/dist/scripts/6909-b5717e92e8-lite.chunk.js +2 -0
  41. package/dist/scripts/6909-b5717e92e8-lite.chunk.js.map +1 -0
  42. package/dist/scripts/7459-c1882c6f0d-lite.chunk.js +3 -0
  43. package/dist/scripts/7459-c1882c6f0d-lite.chunk.js.map +1 -0
  44. package/dist/scripts/7604-5d2ba346e2-lite.chunk.js +3 -0
  45. package/dist/scripts/7604-5d2ba346e2-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-899a1d0cb1-lite.chunk.js} +2 -2
  47. package/dist/scripts/7617-899a1d0cb1-lite.chunk.js.map +1 -0
  48. package/dist/scripts/7742-95097c976d-lite.chunk.js +2 -0
  49. package/dist/scripts/7742-95097c976d-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{7843-f6033528ce-lite.chunk.js → 7843-fc9ddb3b52-lite.chunk.js} +2 -2
  51. package/dist/scripts/7843-fc9ddb3b52-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{7867-14c692e69c-lite.chunk.js → 7867-589c7bd788-lite.chunk.js} +3 -3
  53. package/dist/scripts/7867-589c7bd788-lite.chunk.js.map +1 -0
  54. package/dist/scripts/{787-dcb3a0a26c-lite.chunk.js → 787-5c7976e8cb-lite.chunk.js} +2 -2
  55. package/dist/scripts/{787-dcb3a0a26c-lite.chunk.js.map → 787-5c7976e8cb-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/8056-a3d8fa8728-lite.chunk.js +2 -0
  57. package/dist/scripts/8056-a3d8fa8728-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{8672-6967ce8a23-lite.chunk.js → 8672-5637204ae3-lite.chunk.js} +2 -2
  59. package/dist/scripts/{8672-6967ce8a23-lite.chunk.js.map → 8672-5637204ae3-lite.chunk.js.map} +1 -1
  60. package/dist/scripts/8852-c39595da59-lite.chunk.js +2 -0
  61. package/dist/scripts/8852-c39595da59-lite.chunk.js.map +1 -0
  62. package/dist/scripts/8944-022dbd6a0b-lite.chunk.js +2 -0
  63. package/dist/scripts/8944-022dbd6a0b-lite.chunk.js.map +1 -0
  64. package/dist/scripts/9742-c839ec5abb-lite.chunk.js +2 -0
  65. package/dist/scripts/9742-c839ec5abb-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 9803-9a666cfdef-lite.chunk.js} +3 -3
  67. package/dist/scripts/9803-9a666cfdef-lite.chunk.js.map +1 -0
  68. package/dist/scripts/bundle-375332cf3f.min.js +3 -0
  69. package/dist/scripts/{bundle-2bbba2aa8b.min.js.map → bundle-375332cf3f.min.js.map} +1 -1
  70. package/package.json +1 -1
  71. package/dist/scripts/171-36c7520c9c-lite.chunk.js +0 -2
  72. package/dist/scripts/171-36c7520c9c-lite.chunk.js.map +0 -1
  73. package/dist/scripts/1726-c79cf77a51-lite.chunk.js +0 -2
  74. package/dist/scripts/1726-c79cf77a51-lite.chunk.js.map +0 -1
  75. package/dist/scripts/1912-1f78dc635a-lite.chunk.js +0 -2
  76. package/dist/scripts/1912-1f78dc635a-lite.chunk.js.map +0 -1
  77. package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
  78. package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
  79. package/dist/scripts/3249-0b55dec380-lite.chunk.js.map +0 -1
  80. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
  81. package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
  82. package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
  83. package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
  84. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
  85. package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
  86. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
  87. package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
  88. package/dist/scripts/5002-7514146621-lite.chunk.js +0 -2
  89. package/dist/scripts/5002-7514146621-lite.chunk.js.map +0 -1
  90. package/dist/scripts/5270-d407e1ae84-lite.chunk.js +0 -2
  91. package/dist/scripts/5270-d407e1ae84-lite.chunk.js.map +0 -1
  92. package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
  93. package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
  94. package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
  95. package/dist/scripts/6909-a9b8930e37-lite.chunk.js +0 -2
  96. package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
  97. package/dist/scripts/7401-833bc4a088-lite.chunk.js +0 -2
  98. package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +0 -1
  99. package/dist/scripts/7604-f664281904-lite.chunk.js +0 -3
  100. package/dist/scripts/7604-f664281904-lite.chunk.js.map +0 -1
  101. package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
  102. package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
  103. package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
  104. package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
  105. package/dist/scripts/7867-14c692e69c-lite.chunk.js.map +0 -1
  106. package/dist/scripts/8056-eec7c2fda0-lite.chunk.js +0 -2
  107. package/dist/scripts/8056-eec7c2fda0-lite.chunk.js.map +0 -1
  108. package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
  109. package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
  110. package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
  111. package/dist/scripts/8944-b56c3e61fc-lite.chunk.js +0 -2
  112. package/dist/scripts/8944-b56c3e61fc-lite.chunk.js.map +0 -1
  113. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js +0 -2
  114. package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
  115. package/dist/scripts/bundle-2bbba2aa8b.min.js +0 -3
  116. /package/dist/css/{2074-lite-ac8da6c78b.chunk.css → 4525-lite-ac8da6c78b.chunk.css} +0 -0
  117. /package/dist/css/{8364-lite-db31e36b79.chunk.css → 7459-lite-db31e36b79.chunk.css} +0 -0
  118. /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 4006-5078eb2c01-lite.chunk.js.LICENSE.txt} +0 -0
  119. /package/dist/scripts/{7604-f664281904-lite.chunk.js.LICENSE.txt → 7459-c1882c6f0d-lite.chunk.js.LICENSE.txt} +0 -0
  120. /package/dist/scripts/{7867-14c692e69c-lite.chunk.js.LICENSE.txt → 7604-5d2ba346e2-lite.chunk.js.LICENSE.txt} +0 -0
  121. /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7867-589c7bd788-lite.chunk.js.LICENSE.txt} +0 -0
  122. /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 9803-9a666cfdef-lite.chunk.js.LICENSE.txt} +0 -0
  123. /package/dist/scripts/{bundle-2bbba2aa8b.min.js.LICENSE.txt → bundle-375332cf3f.min.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1202],{38307:(e,t,n)=>{n.d(t,{c:()=>y,l:()=>g});var r=n(32735),a=n(232),i=n.n(a),o=n(8604),c=n(83345);const s={heatMap:"epapa",legend:"uhH4p"};function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var u="shared.engagementHeatMap",d="#f1f1f1",m=i().scale(["#daf07d","#08bd1a"]),v=[0,.01,.25,.5,.75,1];function f(e,t){return e?m(e/t).hex():d}function p(e,t){for(var n=[],r=0;r<e.length;r++){var a=r>0&&e[r-1],i=e[r],o=r<e.length-1&&e[r+1];i===a&&i===o||n.push("".concat(f(i,t)," ").concat(100/e.length*r,"%"))}return"linear-gradient(to right, ".concat(n.join(","),")")}function g(){var e=Math.max.apply(Math,v),t=100/v.length;return r.createElement("div",{className:"d-flex justify-content-between w-100"},r.createElement(c.x,{namespace:u,phrase:"less"}),r.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(s.legend)},v.map(function(n,a){return r.createElement("div",{key:a,style:{width:"".concat(t,"%"),backgroundColor:f(n,e)}})})),r.createElement(c.x,{namespace:u,phrase:"more"}))}function y(e){var t,n,a,i=(0,o.O)(e.engagement),c=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return l(e)}(a=i)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(a)||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 r.createElement("div",{className:"border rounded ".concat(s.heatMap," ").concat(null!==(n=e.className)&&void 0!==n?n:""),style:{background:p(i,c)}})}},84621:(e,t,n)=>{n.d(t,{L:()=>o});var r=n(32735),a=n(83914);const i={icon:"sAmpy",count:"faDs4"};function o(e){return r.createElement("section",{className:"d-flex flex-column border rounded p-3 h-100"},r.createElement("div",{className:"d-flex ".concat(e.subtitle?"align-items-top":"align-items-center"," mb-2")},r.createElement("div",{className:"".concat(i.icon," ").concat(e.svgClassName," rounded-circle d-flex justify-content-center align-items-center")},r.createElement(a.x,{svgName:e.svgName,size:a.S.Small})),r.createElement("div",{className:"d-flex flex-column ms-2"},r.createElement("h2",{className:"h6 mb-0"},e.title)),"number"==typeof e.count&&r.createElement("div",{className:"".concat(i.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},70072:(e,t,n)=>{n.d(t,{d:()=>r});var r={fontSize:"12px",fontFamily:'"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',fontWeight:"400",color:"#313543"}},26136:(e,t,n)=>{n.d(t,{B:()=>c});var r=n(76198),a=n(23481),i=n(64818),o=a.T.encloseNamespace("shared.analyticsUtils");function c(e,t){return e?t?(0,r._8)((n=e.id,a=e.sessionId,c=+"".concat(n||function(e){if(!e)return 0;for(var t=0,n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:c})):e.deleted?o("deleted"):i.l.getFullName(e)||o("anonUser"):o("anonUser");var n,a,c}},8604:(e,t,n)=>{function r(e){var t=e.videoDuration||0;return new Array(Math.ceil(t)).fill(null).map(function(t,n){return(null==e?void 0:e.heatMap[n])||0})}function a(e){return null==e?void 0:e.reduce(function(t,n){return t+n.engagementRate/e.length},0)}n.d(t,{O:()=>r,Q:()=>a})},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>l,Rt:()=>f,UU:()=>d,Zs:()=>u,nq:()=>v});var r=n(75896),a=n(94892),i=n(28972),o=n(8246),c=n(83140),s=n(80845);function l(e,t,n){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},o=(0,s.Q)(e),c=new Set(o.map(function(e){return e.id}));t.students.forEach(function(t){var o=Object.assign(Object.assign({},t),{summary:f(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):r.m.last(t.results).attempts.filter(function(e){var t;return!!c.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===c.size?(i.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)});var l=r.m.sortBy(i.lowScore,function(e){return e.summary.percentCorrect}),u=r.m.sortBy(i.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},i),{lowScore:l,highScore:u})}function u(e,t){return(0,s.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,s.j_)(t),a=(0,s.f6)(e,r);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Correct}))?o.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Incorrect}))?o.N.Incorrect:void 0}function v(e,t){var n=t.students.length,r=0,a=0,o=0,l=0,u=0;return t.students.forEach(function(t){var n=(0,s.j_)(t);if(n){u+=t.results.length;var d=c.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&o++,d===i.w.AwaitingMarking&&l++,d!==i.w.UnAnswered&&a++}}),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:o,awaitingMarking:l,attempts:u}}function f(e,t){var n=(0,s.j_)(t),r=(0,s.Q)(e),a=r.length,o=0,l=0;r.forEach(function(e){var t=c.A.isInteractionCorrect(e,n);t===i.w.Correct&&o++,t===i.w.AwaitingMarking&&l++});var u=a>0?o/a:0,d=new Set(r.map(function(e){return e.id})),m=n.attempts.filter(function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:o,awaitingMarking:l}}},77640:(e,t,n)=>{n.d(t,{t:()=>f});var r=n(32735),a=n(23481),i=n(31453),o=n(26136),c=n(97408),s=n(83914),l=n(76881),u=n(86613),d=n(64818),m=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function f(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var i=(0,o.B)(n,r),c=i.split(" ").filter(function(e){return!!e});return{name:i,surname:c.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,o.B)(n,!0):a?d.l.getDisplayName(n):d.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,f=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(m.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(c.q,{imageUrl:f,imageCdnUrl:e.imageCdnUrl,initials:d.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:s.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,i.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=d.l.getUserType(e),n=d.l.getUserRole(e);if(t===l.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=d.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}f.defaults={showSubText:!0}},40782:(e,t,n)=>{n.d(t,{I:()=>r,O:()=>s});var r,a=n(32735),i=n(2606),o=n(362);function c(e){var t=a.useCallback(function(t){if(t){var n=t.r.baseVal.value,r=2*Math.PI*n,a=r-e.percentage*r;t.style.strokeDasharray="".concat(r," ").concat(r),t.style.strokeDashoffset=a.toString()}},[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,i.pu)(e.size),className:o.Z.backgroundCircle}),!(0,i.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,i.pu)(e.size),className:(0,i.V4)(e.percentage,e.scoreThresholds)}))}function s(e){var t,n=(0,i.Ki)(e.percentage),s=e.size||(e.layout===r.LabelInside?i.Mk.Large:i.Mk.Small),l=e.customLabel||(0,i.DV)(n);return e.layout===r.LabelOnly?a.createElement("span",{className:(0,i.IA)(n)},l):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===r.LabelBefore&&a.createElement("span",{className:"me-2"},l),a.createElement("div",{className:(0,i.tw)(s,n)},a.createElement(c,{percentage:n,size:s,scoreThresholds:e.scoreThresholds}),e.layout===r.LabelInside&&a.createElement("span",{className:o.Z.centredPercentageText},l)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(r||(r={})),s.defaultProps={layout:r.CircleOnly}},2606:(e,t,n)=>{n.d(t,{DV:()=>g,IA:()=>v,Ki:()=>p,Mk:()=>c,V4:()=>m,pu:()=>d,tw:()=>f,zR:()=>y});var r=n(94892),a=n(362);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 o(e,t,n){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;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}var c,s=.2,l=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var u=o(o(o({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function d(e){var t=u[e].size,n=e===c.Large?l:s;return"".concat(t/2-2*n,"rem")}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function f(e,t){var n="d-inline-block ".concat(a.Z.circleContainer);return e===c.Large&&(n+=" ".concat(a.Z.lgCircleContainer)),e===c.ExtraSmall&&(n+=" ".concat(a.Z.xsCircleContainer)),y(t)&&(n+=" ".concat(a.Z.pendingCircle)),n}function p(e){if(!y(e))return+e.toFixed(2)}function g(e){return y(e)?"--%":"".concat(Math.round(100*e),"%")}function y(e){return"number"!=typeof e}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),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"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},83140:(e,t,n)=>{n.d(t,{A:()=>p});var r=n(28972),a=n(8246),i=n(56644);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return r.w.NotApplicable}function l(e,t){var n=e.actionableItems.filter(function(e){return e.isCorrect});return n.every(function(e){return!t(e.id)})?r.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())})?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every(function(e){return!t(e.id)})?r.w.UnAnswered:e.actionableItems.filter(function(e){return e.isCorrect}).every(function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name})?r.w.Correct:r.w.Incorrect}function d(e,t){return function(n){var r=null==t?void 0:t.attempts.find(function(t){return t.id===e.id});return null==r?void 0:r.answers.find(function(e){return e.id===n})}}function m(e,t){var n=d(e,t);return u(e,function(e){var t=n(e);return null==t?void 0:t.text})}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach(function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered}),n}(e,d(e,t))}var f=c(c(c(c(c(c(c({},i.Z9.Annotation,s),i.Z9.Image,s),i.Z9.MissingWord,function(e,t){var n=d(e,t);return l(e,function(e){var t=n(e);return null==t?void 0:t.text})}),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,m),i.Z9.Illustration,v),p={notApplicable:s,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:l,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,f[e.typeId])(e,t)}}},9566:(e,t,n)=>{n.d(t,{$Z:()=>p,G6:()=>m,GJ:()=>f,VE:()=>h,_w:()=>v,po:()=>y,vJ:()=>g});var r=n(23481),a=n(110),i=n(33518),o=n(2510),c=n(4594),s=n(35223),l=n(14070),u=n(97291),d=r.T.encloseNamespace("myShares.demoInsights"),m={type:o.y.Link,privacy:i.e.JustMySchool,objectId:"0",objectTypeId:c.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),dateShared:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},v=Object.assign(Object.assign({},m),{type:o.y.Open,expireDate:a.O.add(new Date(m.dateCreated),30,"days").toISOString(),privacy:i.e.PinCode}),f={share:m,sharedObject:null,shareRecipients:null,dateShared:a.O.subtract(new Date,7,"days").toISOString()},p=Object.assign(Object.assign({},f),{share:v}),g={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},y={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO},h={svgName:s.vn.Analytics,label:d("demoInsights"),appLink:g,group:"insights",className:"btn btn-outline-dark"}},38926:(e,t,n)=>{n.r(t),n.d(t,{InteractiveInsightsOverviewDemoView:()=>I});var r=n(32735),a=n(23481),i=n(2948),o=n(20354),c=n(26025),s=n(2510),l=n(38143),u=n(39151),d=n(54405),m=n(31949),v=n(93322),f=n(79612),p=n(74049),g=n(54948),y=n(9566),h=n(10447),S=n(14070),b=n(97291);function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var w=a.T.encloseNamespace("insights.interactiveInsightsOverviewView");function I(e){var t,n,a,I,A,C,M=(A=(0,i.D)(l.g.ANONYMISE_USERS),C=1,function(e){if(Array.isArray(e))return e}(A)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(A,C)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(e,t):void 0}}(A,C)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,v.F)();var O=o.a.useBasicFetch(m.N.currentUser()),N=o.a.useBasicFetch(u.L.config()),k=o.a.useBasicFetch(d.X.interactiveMetadata()),R=o.a.useBasicFetch(d.X.interactive()),T=c.B.getAudienceAppLinkParams(),j=c.B.getDateRangeAppLinkParams(),_=o.a.useBasicFetch(d.X.interactiveResults()),x=o.a.useBasicFetch(d.X.aggregateHeatmap()),D=o.a.useBasicFetch(d.X.videoViews());(0,f.M)({title:k.data?w("pageTitle",{video:null===(t=k.data)||void 0===t?void 0:t.name}):null});var U=O.data&&N.data&&k.data&&R.data&&_.data&&x.data&&!!D.data,L=Object.assign(Object.assign({},T),j),H=function(e,t,n){return n===s.y.Open?{resultsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,args:[e],params:t},questionsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,args:[e],params:t},heatmapAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,args:[e],params:t}}:{resultsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_DEMO,args:[e],params:t},questionsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_DEMO,args:[e],params:t},heatmapAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_DEMO,args:[e],params:t}}}("",L,e.type),V=e.type===s.y.Open?y._w:y.G6;return U?r.createElement("div",{className:"px-3"},r.createElement(p.j,{video:k.data,tabs:(0,h.aq)(null===(n=k.data)||void 0===n?void 0:n.id,"insights",L,e.type),dateRangeAppLinkParams:j,share:Object.assign(Object.assign({},V),{objectId:null===(a=k.data)||void 0===a?void 0:a.id}),yearGroups:[],markingRequired:e.type!==s.y.Open,isDemo:!0,hasData:!0}),r.createElement(g.m,{aggregateEngagement:x.data,interactive:R.data,interactiveMetadata:k.data,classroomStudents:null,results:_.data,osCount:null===(I=D.data)||void 0===I?void 0:I.osCount,config:N.data,interactiveInsightsAppLinks:H,anonymiseUsers:M,hasDataLoaded:U,share:V})):r.createElement(r.Fragment,null)}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}},362:(e,t,n)=>{n.d(t,{Z:()=>r});const r={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
- //# sourceMappingURL=1202-d96ad80884-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1202],{38307:(e,t,n)=>{n.d(t,{c:()=>y,l:()=>g});var r=n(32735),a=n(232),i=n.n(a),o=n(8604),c=n(83345);const s={heatMap:"epapa",legend:"uhH4p"};function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var u="shared.engagementHeatMap",d="#f1f1f1",m=i().scale(["#daf07d","#08bd1a"]),v=[0,.01,.25,.5,.75,1];function f(e,t){return e?m(e/t).hex():d}function p(e,t){for(var n=[],r=0;r<e.length;r++){var a=r>0&&e[r-1],i=e[r],o=r<e.length-1&&e[r+1];i===a&&i===o||n.push("".concat(f(i,t)," ").concat(100/e.length*r,"%"))}return"linear-gradient(to right, ".concat(n.join(","),")")}function g(){var e=Math.max.apply(Math,v),t=100/v.length;return r.createElement("div",{className:"d-flex justify-content-between w-100"},r.createElement(c.x,{namespace:u,phrase:"less"}),r.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(s.legend)},v.map(function(n,a){return r.createElement("div",{key:a,style:{width:"".concat(t,"%"),backgroundColor:f(n,e)}})})),r.createElement(c.x,{namespace:u,phrase:"more"}))}function y(e){var t,n,a,i=(0,o.O)(e.engagement),c=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return l(e)}(a=i)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(a)||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 r.createElement("div",{className:"border rounded ".concat(s.heatMap," ").concat(null!==(n=e.className)&&void 0!==n?n:""),style:{background:p(i,c)}})}},84621:(e,t,n)=>{n.d(t,{L:()=>o});var r=n(32735),a=n(83914);const i={icon:"sAmpy",count:"faDs4"};function o(e){return r.createElement("section",{className:"d-flex flex-column border rounded p-3 h-100"},r.createElement("div",{className:"d-flex ".concat(e.subtitle?"align-items-top":"align-items-center"," mb-2")},r.createElement("div",{className:"".concat(i.icon," ").concat(e.svgClassName," rounded-circle d-flex justify-content-center align-items-center")},r.createElement(a.x,{svgName:e.svgName,size:a.S.Small})),r.createElement("div",{className:"d-flex flex-column ms-2"},r.createElement("h2",{className:"h6 mb-0"},e.title)),"number"==typeof e.count&&r.createElement("div",{className:"".concat(i.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},70072:(e,t,n)=>{n.d(t,{d:()=>r});var r={fontSize:"12px",fontFamily:'"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',fontWeight:"400",color:"#313543"}},26136:(e,t,n)=>{n.d(t,{B:()=>c});var r=n(76198),a=n(23481),i=n(64818),o=a.T.encloseNamespace("shared.analyticsUtils");function c(e,t){return e?t?(0,r._8)((n=e.id,a=e.sessionId,c=+"".concat(n||function(e){if(!e)return 0;for(var t=0,n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:c})):e.deleted?o("deleted"):i.l.getFullName(e)||o("anonUser"):o("anonUser");var n,a,c}},8604:(e,t,n)=>{function r(e){var t=e.videoDuration||0;return new Array(Math.ceil(t)).fill(null).map(function(t,n){return(null==e?void 0:e.heatMap[n])||0})}function a(e){return null==e?void 0:e.reduce(function(t,n){return t+n.engagementRate/e.length},0)}n.d(t,{O:()=>r,Q:()=>a})},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>l,Rt:()=>f,UU:()=>d,Zs:()=>u,nq:()=>v});var r=n(75896),a=n(94892),i=n(28972),o=n(8246),c=n(83140),s=n(80845);function l(e,t,n){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},o=(0,s.Q)(e),c=new Set(o.map(function(e){return e.id}));t.students.forEach(function(t){var o=Object.assign(Object.assign({},t),{summary:f(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):r.m.last(t.results).attempts.filter(function(e){var t;return!!c.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===c.size?(i.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)});var l=r.m.sortBy(i.lowScore,function(e){return e.summary.percentCorrect}),u=r.m.sortBy(i.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},i),{lowScore:l,highScore:u})}function u(e,t){return(0,s.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,s.j_)(t),a=(0,s.f6)(e,r);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Correct}))?o.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===o.N.Incorrect}))?o.N.Incorrect:void 0}function v(e,t){var n=t.students.length,r=0,a=0,o=0,l=0,u=0;return t.students.forEach(function(t){var n=(0,s.j_)(t);if(n){u+=t.results.length;var d=c.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&o++,d===i.w.AwaitingMarking&&l++,d!==i.w.UnAnswered&&a++}}),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:o,awaitingMarking:l,attempts:u}}function f(e,t){var n=(0,s.j_)(t),r=(0,s.Q)(e),a=r.length,o=0,l=0;r.forEach(function(e){var t=c.A.isInteractionCorrect(e,n);t===i.w.Correct&&o++,t===i.w.AwaitingMarking&&l++});var u=a>0?o/a:0,d=new Set(r.map(function(e){return e.id})),m=n.attempts.filter(function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:u,correct:o,awaitingMarking:l}}},77640:(e,t,n)=>{n.d(t,{t:()=>f});var r=n(32735),a=n(23481),i=n(31453),o=n(26136),c=n(97408),s=n(83914),l=n(76881),u=n(86613),d=n(64818),m=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function f(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var i=(0,o.B)(n,r),c=i.split(" ").filter(function(e){return!!e});return{name:i,surname:c.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,o.B)(n,!0):a?d.l.getDisplayName(n):d.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,f=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(m.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(c.q,{imageUrl:f,imageCdnUrl:e.imageCdnUrl,initials:d.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:s.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,i.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=d.l.getUserType(e),n=d.l.getUserRole(e);if(t===l.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=d.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}f.defaults={showSubText:!0}},40782:(e,t,n)=>{n.d(t,{I:()=>r,O:()=>s});var r,a=n(32735),i=n(2606),o=n(362);function c(e){var t=a.useCallback(function(t){if(t){var n=t.r.baseVal.value,r=2*Math.PI*n,a=r-e.percentage*r;t.style.strokeDasharray="".concat(r," ").concat(r),t.style.strokeDashoffset=a.toString()}},[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,i.pu)(e.size),className:o.Z.backgroundCircle}),!(0,i.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,i.pu)(e.size),className:(0,i.V4)(e.percentage,e.scoreThresholds)}))}function s(e){var t,n=(0,i.Ki)(e.percentage),s=e.size||(e.layout===r.LabelInside?i.Mk.Large:i.Mk.Small),l=e.customLabel||(0,i.DV)(n);return e.layout===r.LabelOnly?a.createElement("span",{className:(0,i.IA)(n)},l):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===r.LabelBefore&&a.createElement("span",{className:"me-2"},l),a.createElement("div",{className:(0,i.tw)(s,n)},a.createElement(c,{percentage:n,size:s,scoreThresholds:e.scoreThresholds}),e.layout===r.LabelInside&&a.createElement("span",{className:o.Z.centredPercentageText},l)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(r||(r={})),s.defaultProps={layout:r.CircleOnly}},2606:(e,t,n)=>{n.d(t,{DV:()=>g,IA:()=>v,Ki:()=>p,Mk:()=>c,V4:()=>m,pu:()=>d,tw:()=>f,zR:()=>y});var r=n(94892),a=n(362);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 o(e,t,n){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;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}var c,s=.2,l=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var u=o(o(o({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function d(e){var t=u[e].size,n=e===c.Large?l:s;return"".concat(t/2-2*n,"rem")}function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function f(e,t){var n="d-inline-block ".concat(a.Z.circleContainer);return e===c.Large&&(n+=" ".concat(a.Z.lgCircleContainer)),e===c.ExtraSmall&&(n+=" ".concat(a.Z.xsCircleContainer)),y(t)&&(n+=" ".concat(a.Z.pendingCircle)),n}function p(e){if(!y(e))return+e.toFixed(2)}function g(e){return y(e)?"--%":"".concat(Math.round(100*e),"%")}function y(e){return"number"!=typeof e}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),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"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},83140:(e,t,n)=>{n.d(t,{A:()=>p});var r=n(28972),a=n(8246),i=n(56644);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return r.w.NotApplicable}function l(e,t){var n=e.actionableItems.filter(function(e){return e.isCorrect});return n.every(function(e){return!t(e.id)})?r.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())})?r.w.Correct:r.w.Incorrect}function u(e,t){return e.actionableItems.every(function(e){return!t(e.id)})?r.w.UnAnswered:e.actionableItems.filter(function(e){return e.isCorrect}).every(function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name})?r.w.Correct:r.w.Incorrect}function d(e,t){return function(n){var r=null==t?void 0:t.attempts.find(function(t){return t.id===e.id});return null==r?void 0:r.answers.find(function(e){return e.id===n})}}function m(e,t){var n=d(e,t);return u(e,function(e){var t=n(e);return null==t?void 0:t.text})}function v(e,t){return function(e,t){var n;return e.actionableItems.forEach(function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered}),n}(e,d(e,t))}var f=c(c(c(c(c(c(c({},i.Z9.Annotation,s),i.Z9.Image,s),i.Z9.MissingWord,function(e,t){var n=d(e,t);return l(e,function(e){var t=n(e);return null==t?void 0:t.text})}),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,v),i.Z9.TrueOrFalse,m),i.Z9.Illustration,v),p={notApplicable:s,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:l,isMultipleChoiceCorrect:u,isInteractionCorrect:function(e,t){return(0,f[e.typeId])(e,t)}}},9566:(e,t,n)=>{n.d(t,{$Z:()=>p,G6:()=>m,GJ:()=>f,VE:()=>h,_w:()=>v,po:()=>y,vJ:()=>g});var r=n(23481),a=n(110),i=n(33518),o=n(2510),c=n(4594),s=n(35223),l=n(14070),u=n(97291),d=r.T.encloseNamespace("myShares.demoInsights"),m={type:o.y.Link,privacy:i.e.JustMySchool,objectId:"0",objectTypeId:c.E.Interactive,viewCount:28,accessCount:15,dateCreated:(new Date).toISOString(),dateShared:(new Date).toISOString(),expireDate:null,link:{shortenedEmbedUrl:"",shortenedUrl:""},shareId:"0",ownerCustomerId:0,ownerId:0,recipients:[],options:{preventScrubbing:!1,immediateFeedback:!1}},v=Object.assign(Object.assign({},m),{type:o.y.Open,expireDate:a.O.add(new Date(m.dateCreated),30,"days").toISOString(),privacy:i.e.PinCode}),f={share:m,sharedObject:null,shareRecipients:null,dateShared:a.O.subtract(new Date,7,"days").toISOString()},p=Object.assign(Object.assign({},f),{share:v}),g={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},y={application:u.O.MY_SHARES,action:l.e.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO},h={svgName:s.vn.Analytics,label:d("demoInsights"),appLink:g,group:"insights",className:"btn btn-outline-dark"}},38926:(e,t,n)=>{n.r(t),n.d(t,{InteractiveInsightsOverviewDemoView:()=>I});var r=n(32735),a=n(23481),i=n(2948),o=n(20354),c=n(26025),s=n(2510),l=n(38143),u=n(39151),d=n(54405),m=n(31949),v=n(93322),f=n(79612),p=n(9540),g=n(54948),y=n(9566),h=n(10447),S=n(14070),b=n(97291);function E(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var w=a.T.encloseNamespace("insights.interactiveInsightsOverviewView");function I(e){var t,n,a,I,A,C,M=(A=(0,i.D)(l.g.ANONYMISE_USERS),C=1,function(e){if(Array.isArray(e))return e}(A)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(c.push(r.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw a}}return c}}(A,C)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(e,t):void 0}}(A,C)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,v.F)();var O=o.a.useBasicFetch(m.N.currentUser()),N=o.a.useBasicFetch(u.L.config()),k=o.a.useBasicFetch(d.X.interactiveMetadata()),R=o.a.useBasicFetch(d.X.interactive()),T=c.B.getAudienceAppLinkParams(),j=c.B.getDateRangeAppLinkParams(),_=o.a.useBasicFetch(d.X.interactiveResults()),x=o.a.useBasicFetch(d.X.aggregateHeatmap()),D=o.a.useBasicFetch(d.X.videoViews());(0,f.M)({title:k.data?w("pageTitle",{video:null===(t=k.data)||void 0===t?void 0:t.name}):null});var U=O.data&&N.data&&k.data&&R.data&&_.data&&x.data&&!!D.data,L=Object.assign(Object.assign({},T),j),H=function(e,t,n){return n===s.y.Open?{resultsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,args:[e],params:t},questionsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,args:[e],params:t},heatmapAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,args:[e],params:t}}:{resultsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_STUDENTS_DEMO,args:[e],params:t},questionsAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_QUESTIONS_DEMO,args:[e],params:t},heatmapAppLink:{application:b.O.MY_SHARES,action:S.e.MyShares.INTERACTIVE_HEATMAP_DEMO,args:[e],params:t}}}("",L,e.type),V=e.type===s.y.Open?y._w:y.G6;return U?r.createElement("div",{className:"px-3"},r.createElement(p.j,{video:k.data,tabs:(0,h.aq)(null===(n=k.data)||void 0===n?void 0:n.id,"insights",L,e.type),dateRangeAppLinkParams:j,share:Object.assign(Object.assign({},V),{objectId:null===(a=k.data)||void 0===a?void 0:a.id}),yearGroups:[],markingRequired:e.type!==s.y.Open,isDemo:!0,hasData:!0}),r.createElement(g.m,{aggregateEngagement:x.data,interactive:R.data,interactiveMetadata:k.data,classroomStudents:null,results:_.data,osCount:null===(I=D.data)||void 0===I?void 0:I.osCount,config:N.data,interactiveInsightsAppLinks:H,anonymiseUsers:M,hasDataLoaded:U,share:V})):r.createElement(r.Fragment,null)}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}},362:(e,t,n)=>{n.d(t,{Z:()=>r});const r={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
2
+ //# sourceMappingURL=1202-5473d9962d-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/1202-d96ad80884-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/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.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/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.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, SvgContainerSize } 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 rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\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}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise) {\n if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { 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 const videoDuration = engagement.videoDuration || 0;\n \n return (new Array(Math.ceil(videoDuration))).fill(null).map((t, idx) => engagement?.heatMap[idx] || 0);\n}\n\nexport function getEngagementRate(engagement: Engagement[]): number {\n return engagement?.reduce((prev, next) => prev + next.engagementRate / engagement.length, 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, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\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 /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId || user.deleted) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && (!!props.user.sessionId || !!props.user.deleted)}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n dateShared: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE: Share = {\n ...DEMO_INSIGHTS_SHARE,\n type: ShareType.Open,\n expireDate: DateHelper.add(new Date(DEMO_INSIGHTS_SHARE.dateCreated), 30, 'days').toISOString(),\n privacy: SharePrivacy.PinCode\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA: MySharesTableData = {\n ...DEMO_INSIGHTS_SHARE_TABLE_DATA,\n share: DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE\n};\n\nexport const DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsOverviewDemoViewProps {\n type?: ShareType;\n}\n\nexport function InteractiveInsightsOverviewDemoView(props: InteractiveInsightsOverviewDemoViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(\n InsightsDemoRequests.videoViews()\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n aggregateEngagement.data &&\n !!videoViews.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n '',\n params,\n props.type\n );\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n if (!hasDataLoaded)\n return <></>;\n \n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'insights', params, props.type)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n classroomStudents={null}\n results={results.data}\n osCount={videoViews.data?.osCount}\n config={config.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject, type?: ShareType) {\n if (type === ShareType.Open) {\n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n }\n };\n }\n \n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\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\"};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"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","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","getPhrase","anonymiseUserName","user","shouldAnonymise","userId","id","sessionId","seed","guid","hash","charCodeAt","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","deleted","getFullHeatMap","videoDuration","Array","ceil","fill","t","getEngagementRate","reduce","prev","next","engagementRate","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","attempts","filter","a","has","answers","questionId","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","UserRecipientItemMetadata","anonymiseUsers","showDisplayName","anonName","nameParts","split","n","name","surname","slice","avatarUrl","avatar","url","getUserProps","avatarClassName","imageUrl","imageCdnUrl","initials","showAnonymousUser","anonymousSvgSize","detailsClassName","nameClassName","showSubText","getSubText","userType","role","yearGroup","defaults","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","strokeWidth","getCircleClassName","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","toISOString","dateShared","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK","DEMO_INSIGHTS_ACTION","appLink","group","LanguageService","InteractiveInsightsOverviewDemoView","SharedViewModelKeys","useLockContentWidth","currentUser","UserRequests","config","ConfigRequests","audienceAppLinkParams","dateRangeAppLinkParams","aggregateEngagement","useSetPageMetadata","video","hasDataLoaded","params","interactiveInsightsAppLinks","ShareType","resultsAppLink","args","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","InsightsHeader","tabs","yearGroups","isDemo","hasData","InteractiveInsightsOverview","classroomStudents","osCount"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/1202-5473d9962d-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/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.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/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/MySharesDemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.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, SvgContainerSize } 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 rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\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}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise) {\n if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { 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 const videoDuration = engagement.videoDuration || 0;\n \n return (new Array(Math.ceil(videoDuration))).fill(null).map((t, idx) => engagement?.heatMap[idx] || 0);\n}\n\nexport function getEngagementRate(engagement: Engagement[]): number {\n return engagement?.reduce((prev, next) => prev + next.engagementRate / engagement.length, 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, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\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 /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId || user.deleted) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && (!!props.user.sessionId || !!props.user.deleted)}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result?.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { MySharesTableData } from 'apps/my-shares/components/my-shares-table/MySharesTableUtils';\n\nconst namespace = 'myShares.demoInsights';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEMO_INSIGHT_DAYS_AGO = 7;\n\nexport const DEMO_INSIGHTS_SHARE: Share = {\n type: ShareType.Link,\n privacy: SharePrivacy.JustMySchool,\n objectId: '0',\n objectTypeId: MasterType.Interactive,\n viewCount: 28,\n accessCount: 15,\n dateCreated: new Date().toISOString(),\n dateShared: new Date().toISOString(),\n expireDate: null,\n link: {\n shortenedEmbedUrl: '',\n shortenedUrl: ''\n },\n shareId: '0',\n ownerCustomerId: 0,\n ownerId: 0,\n recipients: [],\n options: {\n preventScrubbing: false,\n immediateFeedback: false\n }\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE: Share = {\n ...DEMO_INSIGHTS_SHARE,\n type: ShareType.Open,\n expireDate: DateHelper.add(new Date(DEMO_INSIGHTS_SHARE.dateCreated), 30, 'days').toISOString(),\n privacy: SharePrivacy.PinCode\n};\n\nexport const DEMO_INSIGHTS_SHARE_TABLE_DATA: MySharesTableData = {\n share: DEMO_INSIGHTS_SHARE,\n sharedObject: null,\n shareRecipients: null,\n dateShared: DateHelper.subtract(new Date(), DEMO_INSIGHT_DAYS_AGO, 'days').toISOString()\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA: MySharesTableData = {\n ...DEMO_INSIGHTS_SHARE_TABLE_DATA,\n share: DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE\n};\n\nexport const DEMO_INSIGHTS_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n};\n\nexport const DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK: Core.AppLink = {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_OPEN_CLASSROOM_DEMO\n};\n\nexport const DEMO_INSIGHTS_ACTION: ActionOptions = {\n svgName: cvSvgLibrary.Analytics,\n label: getPhrase('demoInsights'),\n appLink: DEMO_INSIGHTS_APPLINK,\n group: 'insights',\n className: 'btn btn-outline-dark'\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BaseAnalyticsEventResponse } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE, DEMO_INSIGHTS_SHARE } from 'apps/my-shares/constants/MySharesDemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/demo/overview/InteractiveInsightsOverviewDemoUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsOverviewDemoViewProps {\n type?: ShareType;\n}\n\nexport function InteractiveInsightsOverviewDemoView(props: InteractiveInsightsOverviewDemoViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const videoViews = Flight.useBasicFetch<BaseAnalyticsEventResponse>(\n InsightsDemoRequests.videoViews()\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n const hasDataLoaded =\n currentUser.data &&\n config.data &&\n interactiveMetadata.data &&\n interactive.data &&\n results.data &&\n aggregateEngagement.data &&\n !!videoViews.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(\n '',\n params,\n props.type\n );\n\n const share = props.type === ShareType.Open ? DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE : DEMO_INSIGHTS_SHARE;\n\n if (!hasDataLoaded)\n return <></>;\n \n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsDemoInteractiveTabs(interactiveMetadata.data?.id, 'insights', params, props.type)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n share={{\n ...share,\n objectId: interactiveMetadata.data?.id\n }}\n yearGroups={[]}\n markingRequired={props.type !== ShareType.Open}\n isDemo\n hasData\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n classroomStudents={null}\n results={results.data}\n osCount={videoViews.data?.osCount}\n config={config.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getInteractiveInsightsAppLinks(id: string, params?: HashObject, type?: ShareType) {\n if (type === ShareType.Open) {\n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_OPEN_CLASSROOM_DEMO,\n args: [id],\n params\n }\n };\n }\n \n return {\n resultsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENTS_DEMO,\n args: [id],\n params\n },\n questionsAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_QUESTIONS_DEMO,\n args: [id],\n params\n },\n heatmapAppLink: {\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_HEATMAP_DEMO,\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\"};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};"],"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","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","getPhrase","anonymiseUserName","user","shouldAnonymise","userId","id","sessionId","seed","guid","hash","charCodeAt","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","deleted","getFullHeatMap","videoDuration","Array","ceil","fill","t","getEngagementRate","reduce","prev","next","engagementRate","groupStudents","interactive","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","students","forEach","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","attempts","filter","a","has","answers","questionId","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","answer","resultId","getMarkedStatus","studentResults","markedAnswers","result","studentResponse","every","status","getInteractionResultsSummary","interaction","numStudents","numCorrect","answered","unanswered","correctness","correct","numInteractions","answeredInteractions","UserRecipientItemMetadata","anonymiseUsers","showDisplayName","anonName","nameParts","split","n","name","surname","slice","avatarUrl","avatar","url","getUserProps","avatarClassName","imageUrl","imageCdnUrl","initials","showAnonymousUser","anonymousSvgSize","detailsClassName","nameClassName","showSubText","getSubText","userType","role","yearGroup","defaults","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","percentage","strokeDasharray","strokeDashoffset","scoreThresholds","PercentageIndicator","percentageToFixed","layout","LabelInside","label","customLabel","LabelOnly","LabelBefore","defaultProps","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","strokeWidth","getCircleClassName","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","round","ScoreThresholdDefaults","ScoreThresholdInsights","InteractionCorrectness","InteractiveAnswerStatus","InsightsDemoRequests","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","InteractiveCorrectnessHelper","isInteractionCorrect","isCorrectFn","typeId","DEMO_INSIGHTS_SHARE","type","privacy","objectId","objectTypeId","viewCount","accessCount","dateCreated","toISOString","dateShared","expireDate","link","shortenedEmbedUrl","shortenedUrl","shareId","ownerCustomerId","ownerId","recipients","options","preventScrubbing","immediateFeedback","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE","DEMO_INSIGHTS_SHARE_TABLE_DATA","share","sharedObject","shareRecipients","DEMO_INSIGHTS_OPEN_CLASSROOM_SHARE_TABLE_DATA","DEMO_INSIGHTS_APPLINK","application","action","DEMO_INSIGHTS_OPEN_CLASSROOM_APPLINK","DEMO_INSIGHTS_ACTION","appLink","group","LanguageService","InteractiveInsightsOverviewDemoView","SharedViewModelKeys","useLockContentWidth","currentUser","UserRequests","config","ConfigRequests","audienceAppLinkParams","dateRangeAppLinkParams","aggregateEngagement","useSetPageMetadata","video","hasDataLoaded","params","interactiveInsightsAppLinks","ShareType","resultsAppLink","args","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","InsightsHeader","tabs","yearGroups","isDemo","hasData","InteractiveInsightsOverview","classroomStudents","osCount"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[171],{53172:(e,t,a)=>{a.d(t,{l:()=>o});var n=a(32735),i=a(31453),r=a(83914),c=a(83345),l=a(35223),s="shared.premiumBadge";function o(e){return n.createElement("span",{className:(0,i.A)("badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center","fw-medium text-indigo","sm"===e.size?"badge-sm":"badge-std",e.invert?"bg-white":"bg-light-indigo",e.className)},n.createElement(r.x,{svgName:l.vn.StarOutline,size:r.S.Medium}),n.createElement(c.x,{phrase:"premium",namespace:s}))}},36199:(e,t,a)=>{var n;a.d(t,{V:()=>n}),function(e){e[e.Original=0]="Original",e[e.Copy=1]="Copy"}(n||(n={}))},10171:(e,t,a)=>{a.r(t),a.d(t,{NewClipInteractiveView:()=>w});var n=a(32735),i=a(23481),r=a(20354),c=a(49985),l=a(65858),s=a(9111),o=a(13876),d=a(16714),u=a(43012),m=a(31949),p=a(22902),f=a(64695),v=a(11607),g=a(99742);const h={selected:"U6H7L"};var b=i.T.encloseNamespace("interactives.feedbackChoices");function E(e){var t=e.title,a=e.description,i=e.value,r=e.className,c=e.onClick,l=e.selected,s=i?g.W.Interactives.FeedbackOptions.FEEDBACK:g.W.Interactives.FeedbackOptions.NO_FEEDBACK;return n.createElement(v.L,{onClick:function(){return c(i)},className:"\n text-center\n cursor-pointer\n p-3\n border\n rounded-3\n ".concat(r,"\n ").concat(l?"border-info":"border","\n ").concat(l?h.selected:"","\n ")},n.createElement("img",{src:s,className:"img-fluid my-3"}),n.createElement("h2",{className:"h3"},t),n.createElement("p",null,a))}function y(e){var t=e.feedback,a=e.setFeedback;return n.createElement("div",{className:"d-flex mb-3"},n.createElement(E,{title:b("feedbackTitle"),description:b("feedbackDescription"),value:!0,onClick:a,selected:!0===t,className:"flex-fill w-50 me-2"}),n.createElement(E,{title:b("noFeedbackTitle"),description:b("noFeedbackDescription"),value:!1,onClick:a,selected:!1===t,className:"flex-fill w-50 ms-2"}))}var I=a(75986);function T(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,i,r,c,l=[],s=!0,o=!1;try{if(r=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;s=!1}else for(;!(s=(n=r.call(a)).done)&&(l.push(n.value),l.length!==t);s=!0);}catch(e){o=!0,i=e}finally{try{if(!s&&null!=a.return&&(c=a.return(),Object(c)!==c))return}finally{if(o)throw i}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?k(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var N=i.T.encloseNamespace("shared.makeClipInteractive");function w(e){var t,a,i,v=e.clipId,g=e.closePopup,h=T(n.useState(!1),2),b=h[0],E=h[1],k=T(n.useState(null),2),w=k[0],C=k[1],P=r.a.useBasicFetch(m.N.currentUser()),S=r.a.useBasicFetch(u.e.clip(v)),A=(0,p.T)().getGatedPermission,x=(0,I.$)({feedback:w,setShowSpinner:E,closePopup:g,name:null===(t=S.data)||void 0===t?void 0:t.name,duration:S.data?1e3*(S.data.endTime-S.data.startTime):null,objectId:null===(a=S.data)||void 0===a?void 0:a.id,currentUser:P.data,baseAnalyticsData:{clip:{id:v,name:null===(i=S.data)||void 0===i?void 0:i.name}}}).createInteractive,O=!S.data||!P.data;return"hard-gate"===A(d.C.UploadVideo)?n.createElement(f.q,{feature:"interactive",animate:!1,closePopup:e.closePopup}):n.createElement(s.G,{title:N("title"),closePopup:g,showLoadingSpinner:O,size:"lg"},n.createElement(y,{feedback:w,setFeedback:C}),n.createElement(o.u,null,n.createElement(o.u.Cancel,{onClick:function(){c.k.logUserAction({clip:{id:v}},{location:l.LZ.NewInteractive,entity:l.py.Interactive,actionType:l.Vw.Create,workflowPhase:l.eu.Discard}),g()}}),n.createElement(o.u.Submit,{variant:"dark",onClick:x,text:N("continue"),showSpinner:b,disabled:"boolean"!=typeof w})))}},75986:(e,t,a)=>{a.d(t,{$:()=>g});var n=a(70680),i=a(23481),r=a(81886),c=a(20354),l=a(49985),s=a(65858),o=a(5960),d=a(36199),u=a(20768),m=a(69883),p=a(14070),f=a(97291),v=i.T.encloseNamespace("shared.makeInteractive"),g=function(e){var t=e.feedback,a=e.setShowSpinner,i=e.objectId,g=e.name,h=e.duration,b=e.currentUser,E=e.closePopup,y=e.baseAnalyticsData,I=(0,n.I0)(),T=(0,m.Z)();function k(){a(!1),T.error(v("error"))}function N(e){var t={name:g,interactiveId:e.id,owner:{id:b.id},originType:d.V.Original,status:o.X.Draft};c.a.fetch(I,u.b.createInteractiveMetadata(i,t,w,k))}function w(e){l.k.logUserAction(Object.assign(Object.assign({},y),{id:e.id,name:e.name}),{location:s.LZ.NewInteractive,entity:s.py.Interactive,actionType:s.Vw.Create,workflowPhase:s.eu.Complete}),r.Q.C$.trigger({application:f.O.INTERACTIVES,action:p.e.Interactives.EDIT_INTERACTIVE,args:[e.id,e.name]}),E()}return{createInteractive:function(){a(!0);var e={name:g,duration:h,immediateFeedback:t,preventScrubbing:!1};c.a.fetch(I,u.b.createInteractive(e,N,k))}}}},64695:(e,t,a)=>{a.d(t,{q:()=>b});var n=a(32735),i=a(37241),r=a(68050),c=a(23481),l=a(65858),s=a(97958),o=a(9111),d=a(53172),u=a(83345),m=a(99742),p=a(14070),f=a(97291),v="shared.hardGatePopup",g=c.T.encloseNamespace(v),h={assign:{titlePhrase:"assignTitle",headingPhrase:"assignHeading",imageUrl:m.W.ReverseTrial.ASSIGN},playlists:{titlePhrase:"playlistsTitle",headingPhrase:"playlistsHeading",imageUrl:m.W.ReverseTrial.PLAYLIST},interactive:{titlePhrase:"interactiveTitle",headingPhrase:"interactiveHeading",imageUrl:m.W.ReverseTrial.INTERACTIVE},"copy-interactives":{titlePhrase:"copyInteractiveTitle",headingPhrase:"copyInteractiveHeading",imageUrl:m.W.ReverseTrial.INTERACTIVE},integrations:{titlePhrase:"integrationsTitle",headingPhrase:"integrationsHeading",imageUrl:m.W.ReverseTrial.INTEGRATIONS}};function b(e){var t=h[e.feature];return n.createElement(o.G,{size:"lg",animation:e.animate,closePopup:e.closePopup,hideTitle:!0},n.createElement(i.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3",closeButton:!0},n.createElement(i.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},g(t.titlePhrase),n.createElement("span",{className:"d-inline-block me-2"},n.createElement(d.l,{size:"std"})))),n.createElement(r.Z,{className:"mb-3"},n.createElement(s.u,{className:"pt-3"},n.createElement(s.u.Image,{src:t.imageUrl,altText:g(t.titlePhrase)}),n.createElement(s.u.Heading,{className:"h6"},n.createElement(u.x,{namespace:v,phrase:t.headingPhrase})),n.createElement(s.u.Info,null,n.createElement(u.x,{namespace:v,phrase:"description"})),n.createElement(s.u.Cta,{appLink:{application:f.O.SIGN_UP,action:p.e.SignUp.INVITE_COLLEAGUE},text:g("cta"),analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.GatedPopup,entity:l.py.AppLink,descriptor:l.Yu.PremiumFeatures}}))),e.extraContent)}}}]);
2
+ //# sourceMappingURL=171-acb1ef0ae4-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/171-acb1ef0ae4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/premium-badge/PremiumBadge.tsx","file:///app/packages/libs/shared/src/enums/InteractiveOriginType.ts","file:///app/packages/projects/lite/src/apps/interactives/components/feedback-choice/feedback-choices.scss","file:///app/packages/projects/lite/src/apps/interactives/components/feedback-choice/FeedbackChoices.tsx","file:///app/packages/projects/lite/src/apps/interactives/views/new-clip-interactive/NewClipInteractiveView.tsx","file:///app/packages/projects/lite/src/apps/interactives/views/new-interactive/useNewInteractiveCallbacks.ts","file:///app/packages/projects/lite/src/shared/components/hard-gate-popup/HardGatePopup.tsx"],"sourcesContent":["import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.premiumBadge';\n\ninterface PremiumBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n className?: string;\n}\n\nexport function PremiumBadge(props: PremiumBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center',\n 'fw-medium text-indigo',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-indigo',\n props.className\n )}>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Medium} />\n <Text phrase='premium' namespace={namespace} />\n </span>\n );\n}","export enum InteractiveOriginType {\n Original = 0,\n Copy = 1\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"selected\":\"U6H7L\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'interactives.feedbackChoices';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './feedback-choices.scss';\n\ninterface FeedbackChoiceProps {\n title: string;\n description: string;\n value: boolean;\n selected: boolean;\n className?: string;\n onClick: (value: boolean) => void;\n}\n\nfunction FeedbackChoice(props: FeedbackChoiceProps): React.ReactElement {\n const {\n title,\n description,\n value,\n className,\n onClick,\n selected\n } = props;\n\n const imgSrc = value ?\n ImageUrls.Interactives.FeedbackOptions.FEEDBACK :\n ImageUrls.Interactives.FeedbackOptions.NO_FEEDBACK;\n\n return (\n <DivButton\n onClick={() => onClick(value)}\n className={`\n text-center\n cursor-pointer\n p-3\n border\n rounded-3\n ${className}\n ${selected ? 'border-info' : 'border'}\n ${selected ? styles.selected : ''}\n `}\n >\n <img src={imgSrc} className='img-fluid my-3' />\n <h2 className='h3'>{title}</h2>\n <p>{description}</p>\n </DivButton>\n );\n}\n\ninterface FeedbackChoicesProps {\n feedback: boolean;\n setFeedback: (feedback: boolean) => void\n}\n\nexport function FeedbackChoices(props: FeedbackChoicesProps): React.ReactElement {\n const { feedback, setFeedback } = props;\n\n return (\n <div className='d-flex mb-3'>\n <FeedbackChoice\n title={getPhrase('feedbackTitle')}\n description={getPhrase('feedbackDescription')}\n value={true}\n onClick={setFeedback}\n selected={feedback === true}\n className='flex-fill w-50 me-2'\n />\n <FeedbackChoice\n title={getPhrase('noFeedbackTitle')}\n description={getPhrase('noFeedbackDescription')}\n value={false}\n onClick={setFeedback}\n selected={feedback === false}\n className='flex-fill w-50 ms-2'\n />\n </div>\n );\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Clip, CurrentUser, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { HardGatePopup } from 'shared/components/hard-gate-popup/HardGatePopup';\n\nimport { FeedbackChoices } from 'apps/interactives/components/feedback-choice/FeedbackChoices';\n\nimport { useNewInteractiveCallbacks } from '../new-interactive/useNewInteractiveCallbacks';\n\nconst namespace = 'shared.makeClipInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NewClipInteractiveProps extends PopupViewProps {\n clipId: string;\n}\n\nexport function NewClipInteractiveView(props: NewClipInteractiveProps): React.ReactElement {\n const { clipId, closePopup } = props;\n\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const [ feedback, setFeedback ] = React.useState<boolean>(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(clipId));\n const { getGatedPermission } = usePermissions();\n\n const {\n createInteractive\n } = useNewInteractiveCallbacks({\n feedback,\n setShowSpinner,\n closePopup,\n name: clip.data?.name,\n duration: clip.data ? (clip.data.endTime - clip.data.startTime) * 1000 : null,\n objectId: clip.data?.id,\n currentUser: currentUser.data,\n baseAnalyticsData: { clip: { id: clipId, name: clip.data?.name } }\n });\n\n function cancelCreate(): void {\n AnalyticsHelper.logUserAction({\n clip: { id: clipId }\n }, {\n location: LocationContext.NewInteractive,\n entity: EntityType.Interactive,\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Discard\n });\n\n closePopup();\n }\n\n const popupSpinner = !clip.data || !currentUser.data;\n\n if (getGatedPermission(PermissionName.UploadVideo) === 'hard-gate') {\n return (\n <HardGatePopup\n feature='interactive'\n animate={false}\n closePopup={props.closePopup}\n />\n );\n }\n\n return (\n <Popup\n title={getPhrase('title')}\n closePopup={closePopup}\n showLoadingSpinner={popupSpinner}\n size={'lg'}\n >\n <FeedbackChoices feedback={feedback} setFeedback={setFeedback} />\n <PopupButtons>\n <PopupButtons.Cancel onClick={cancelCreate} />\n <PopupButtons.Submit\n variant='dark'\n onClick={createInteractive}\n text={getPhrase('continue')}\n showSpinner={showSpinner}\n disabled={typeof feedback !== 'boolean'}\n />\n </PopupButtons>\n </Popup>\n );\n}","import { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { AnalyticsDataPayload } from 'libs/analytics/models/AnalyticsEvent';\n\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { InteractiveOriginType } from 'libs/shared/enums/InteractiveOriginType';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CreateInteractiveMetadataRequest, CreateInteractiveRequest, CurrentUser, Interaction, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.makeInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useNewInteractiveCallbacks = (options: {\n feedback: boolean;\n setShowSpinner: (val: boolean) => void;\n objectId: string;\n name: string;\n duration: number;\n currentUser: CurrentUser;\n closePopup: () => void;\n baseAnalyticsData: AnalyticsDataPayload;\n}) => {\n const {\n feedback,\n setShowSpinner,\n objectId,\n name,\n duration,\n currentUser,\n closePopup,\n baseAnalyticsData\n } = options;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function onError(): void {\n setShowSpinner(false);\n alerts.error(getPhrase('error'));\n }\n\n function createInteractive(): void {\n setShowSpinner(true);\n const data: CreateInteractiveRequest = {\n name,\n duration: duration,\n immediateFeedback: feedback,\n preventScrubbing: false\n };\n\n /* 1st Request */\n Flight.fetch(\n dispatch,\n InteractiveRequests.createInteractive(\n data,\n onInteractiveCreated,\n onError\n )\n );\n }\n\n function onInteractiveCreated(resp: Interaction): void {\n const data: CreateInteractiveMetadataRequest = {\n name,\n interactiveId: resp.id,\n owner: { id: currentUser.id },\n originType: InteractiveOriginType.Original,\n status: CurationStatus.Draft\n };\n\n /* 2nd Request */\n Flight.fetch(\n dispatch,\n InteractiveRequests.createInteractiveMetadata(\n objectId,\n data,\n onInteractiveMetadataCreated,\n onError\n )\n );\n }\n\n function onInteractiveMetadataCreated(resp: InteractiveMetadata): void {\n AnalyticsHelper.logUserAction({\n ...baseAnalyticsData,\n id: resp.id,\n name: resp.name\n }, {\n location: LocationContext.NewInteractive,\n entity: EntityType.Interactive,\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Complete\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [ resp.id, resp.name ]\n });\n closePopup();\n }\n\n return {\n createInteractive\n };\n};\n\n","import React from 'react';\nimport { Modal, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.hardGatePopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Feature = 'assign' | 'playlists' | 'interactive' | 'copy-interactives' | 'integrations';\n\ninterface FeatureConfig {\n titlePhrase: string;\n headingPhrase: string;\n imageUrl: string;\n}\n\nconst featureConfigMap: Record<Feature, FeatureConfig> = {\n 'assign': {\n titlePhrase: 'assignTitle',\n headingPhrase: 'assignHeading',\n imageUrl: ImageUrls.ReverseTrial.ASSIGN\n },\n 'playlists': {\n titlePhrase: 'playlistsTitle',\n headingPhrase: 'playlistsHeading',\n imageUrl: ImageUrls.ReverseTrial.PLAYLIST\n },\n 'interactive': {\n titlePhrase: 'interactiveTitle',\n headingPhrase: 'interactiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'copy-interactives': {\n titlePhrase: 'copyInteractiveTitle',\n headingPhrase: 'copyInteractiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'integrations': {\n titlePhrase: 'integrationsTitle',\n headingPhrase: 'integrationsHeading',\n imageUrl: ImageUrls.ReverseTrial.INTEGRATIONS\n }\n};\n\nexport interface HardGatePopupProps extends MultiStepPopupViewProps {\n feature: Feature;\n extraContent?: React.ReactNode;\n}\n\nexport function HardGatePopup(props: HardGatePopupProps): JSX.Element {\n const config = featureConfigMap[props.feature];\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n hideTitle\n >\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase(config.titlePhrase)}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n <Row className='mb-3'>\n <EmptyState className='pt-3'>\n <EmptyState.Image src={config.imageUrl} altText={getPhrase(config.titlePhrase)} />\n <EmptyState.Heading className='h6'>\n <Text namespace={namespace} phrase={config.headingPhrase} />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n <EmptyState.Cta\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n text={getPhrase('cta')}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedPopup,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n />\n </EmptyState>\n </Row>\n \n {props.extraContent}\n </Popup>\n );\n}\n\n"],"names":["namespace","PremiumBadge","props","className","size","invert","svgName","S","phrase","InteractiveOriginType","getPhrase","LanguageService","FeedbackChoice","title","description","value","onClick","selected","imgSrc","ImageUrls","DivButton","src","FeedbackChoices","feedback","setFeedback","NewClipInteractiveView","clipId","closePopup","showSpinner","setShowSpinner","currentUser","UserRequests","clip","ClipRequests","getGatedPermission","usePermissions","createInteractive","useNewInteractiveCallbacks","name","data","duration","endTime","startTime","objectId","id","baseAnalyticsData","popupSpinner","PermissionName","HardGatePopup","feature","animate","Popup","showLoadingSpinner","PopupButtons","AnalyticsHelper","location","entity","actionType","workflowPhase","variant","text","disabled","options","dispatch","alerts","onError","error","onInteractiveCreated","resp","interactiveId","owner","originType","status","onInteractiveMetadataCreated","application","action","args","immediateFeedback","preventScrubbing","featureConfigMap","titlePhrase","headingPhrase","imageUrl","config","animation","hideTitle","closeButton","as","altText","appLink","analyticsData","analyticsOptions","descriptor","extraContent"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1726],{61104:(e,t,n)=>{n.d(t,{E:()=>d});var a=n(32735),i=n(9111),r=n(13876),o=n(11607);const l={selected:"zWik0",disabled:"bMSMv"};function c(e){var t,n,i,r,c,s="text-center cursor-pointer p-3 border rounded-3 mx-2 user-select-none w-50";return e.selected&&(s+=" border-info ".concat(l.selected)),(null===(t=e.option)||void 0===t?void 0:t.disabled)&&(s+=" ".concat(l.disabled)),a.createElement(o.L,{onClick:function(){var t;(null===(t=e.option)||void 0===t?void 0:t.disabled)||e.onSelect(e.option)},className:s},(null===(n=e.option)||void 0===n?void 0:n.imageUrl)&&a.createElement("img",{src:e.option.imageUrl,className:"img-fluid my-3 ".concat(null!==(i=e.option.imageClassName)&&void 0!==i?i:""),draggable:!1}),(null===(r=e.option)||void 0===r?void 0:r.title)&&a.createElement("h2",{className:"h3"},e.option.title),(null===(c=e.option)||void 0===c?void 0:c.description)&&a.createElement("p",{className:"mb-0",dangerouslySetInnerHTML:{__html:e.option.description}}),e.children)}function s(e){return a.createElement("div",{className:"d-flex mb-3 mx-n2"},e.options.map(function(t){var n;return a.createElement(c,{key:t.id,option:t,selected:(null===(n=e.selection)||void 0===n?void 0:n.id)===t.id,onSelect:e.selectOption})}))}function d(e){return a.createElement(i.G,{size:"lg",title:e.title,showLoadingSpinner:e.showLoadingSpinner,closePopup:e.closePopup},a.createElement(a.Fragment,null,!!e.warningComponent&&e.warningComponent,e.question&&a.createElement("h2",{className:"h5 text-center fw-semibold mb-3"},e.question),a.createElement(s,{options:e.options,selection:e.selection,selectOption:e.selectOption}),a.createElement(r.u,null,e.cancelButtonProps&&a.createElement(r.u.Cancel,Object.assign({},e.cancelButtonProps)),e.submitButtonProps&&a.createElement(r.u.Submit,Object.assign({},e.submitButtonProps)))))}},53172:(e,t,n)=>{n.d(t,{l:()=>s});var a=n(32735),i=n(31453),r=n(83914),o=n(83345),l=n(35223),c="shared.premiumBadge";function s(e){return a.createElement("span",{className:(0,i.A)("badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center","fw-medium text-indigo","sm"===e.size?"badge-sm":"badge-std",e.invert?"bg-white":"bg-light-indigo",e.className)},a.createElement(r.x,{svgName:l.vn.StarOutline,size:r.S.Medium}),a.createElement(o.x,{phrase:"premium",namespace:c}))}},36199:(e,t,n)=>{var a;n.d(t,{V:()=>a}),function(e){e[e.Original=0]="Original",e[e.Copy=1]="Copy"}(a||(a={}))},91726:(e,t,n)=>{n.r(t),n.d(t,{NewInteractiveView:()=>E});var a=n(32735),i=n(23481),r=n(20354),o=n(49985),l=n(65858),c=n(61104),s=n(16714),d=n(31949),u=n(1575),m=n(22902),p=n(64695),v=n(99742),g=n(75986);function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,i,r,o,l=[],c=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=r.call(n)).done)&&(l.push(a.value),l.length!==t);c=!0);}catch(e){s=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw i}}return l}}(e,t)||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,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var b=i.T.encloseNamespace("shared.makeInteractive");function E(e){var t,n,i,h,E=e.videoId,y=e.closePopup,I=f(a.useState(!1),2),T=I[0],P=I[1],w=f(a.useState(null),2),k=w[0],N=w[1],S=r.a.useBasicFetch(d.N.currentUser()),C=r.a.useBasicFetch(u.R.video(E)),O=(0,m.T)().getGatedPermission,A=(0,g.$)({feedback:"feedback"===(null==k?void 0:k.id),setShowSpinner:P,closePopup:y,name:null===(t=C.data)||void 0===t?void 0:t.name,duration:null===(n=C.data)||void 0===n?void 0:n.duration,objectId:null===(i=C.data)||void 0===i?void 0:i.id,currentUser:S.data,baseAnalyticsData:{video:{id:E,name:null===(h=C.data)||void 0===h?void 0:h.name}}}).createInteractive,x=[{id:"feedback",title:b("feedbackTitle"),description:b("feedbackDescription"),imageUrl:v.W.Interactives.FeedbackOptions.FEEDBACK},{id:"no-feedback",title:b("noFeedbackTitle"),description:b("noFeedbackDescription"),imageUrl:v.W.Interactives.FeedbackOptions.NO_FEEDBACK}];return"hard-gate"===O(s.C.UploadVideo)?a.createElement(p.q,{feature:"interactive",animate:!1,closePopup:e.closePopup}):a.createElement(c.E,{title:b("title"),closePopup:y,options:x,selectOption:N,selection:k,showLoadingSpinner:!C.data||!S.data,cancelButtonProps:{onClick:function(){var e;o.k.logUserAction({video:{id:E,name:null===(e=C.data)||void 0===e?void 0:e.name}},{location:l.LZ.NewInteractive,entity:l.py.Interactive,actionType:l.Vw.Create,workflowPhase:l.eu.Discard}),y()},text:b("cancel"),variant:"link"},submitButtonProps:{onClick:A,text:b("continue"),variant:"dark",showSpinner:T,disabled:!k}})}},75986:(e,t,n)=>{n.d(t,{$:()=>f});var a=n(70680),i=n(23481),r=n(81886),o=n(20354),l=n(49985),c=n(65858),s=n(5960),d=n(36199),u=n(20768),m=n(69883),p=n(14070),v=n(97291),g=i.T.encloseNamespace("shared.makeInteractive"),f=function(e){var t=e.feedback,n=e.setShowSpinner,i=e.objectId,f=e.name,h=e.duration,b=e.currentUser,E=e.closePopup,y=e.baseAnalyticsData,I=(0,a.I0)(),T=(0,m.Z)();function P(){n(!1),T.error(g("error"))}function w(e){var t={name:f,interactiveId:e.id,owner:{id:b.id},originType:d.V.Original,status:s.X.Draft};o.a.fetch(I,u.b.createInteractiveMetadata(i,t,k,P))}function k(e){l.k.logUserAction(Object.assign(Object.assign({},y),{id:e.id,name:e.name}),{location:c.LZ.NewInteractive,entity:c.py.Interactive,actionType:c.Vw.Create,workflowPhase:c.eu.Complete}),r.Q.C$.trigger({application:v.O.INTERACTIVES,action:p.e.Interactives.EDIT_INTERACTIVE,args:[e.id,e.name]}),E()}return{createInteractive:function(){n(!0);var e={name:f,duration:h,immediateFeedback:t,preventScrubbing:!1};o.a.fetch(I,u.b.createInteractive(e,w,P))}}}},64695:(e,t,n)=>{n.d(t,{q:()=>b});var a=n(32735),i=n(37241),r=n(68050),o=n(23481),l=n(65858),c=n(97958),s=n(9111),d=n(53172),u=n(83345),m=n(99742),p=n(14070),v=n(97291),g="shared.hardGatePopup",f=o.T.encloseNamespace(g),h={assign:{titlePhrase:"assignTitle",headingPhrase:"assignHeading",imageUrl:m.W.ReverseTrial.ASSIGN},playlists:{titlePhrase:"playlistsTitle",headingPhrase:"playlistsHeading",imageUrl:m.W.ReverseTrial.PLAYLIST},interactive:{titlePhrase:"interactiveTitle",headingPhrase:"interactiveHeading",imageUrl:m.W.ReverseTrial.INTERACTIVE},"copy-interactives":{titlePhrase:"copyInteractiveTitle",headingPhrase:"copyInteractiveHeading",imageUrl:m.W.ReverseTrial.INTERACTIVE},integrations:{titlePhrase:"integrationsTitle",headingPhrase:"integrationsHeading",imageUrl:m.W.ReverseTrial.INTEGRATIONS}};function b(e){var t=h[e.feature];return a.createElement(s.G,{size:"lg",animation:e.animate,closePopup:e.closePopup,hideTitle:!0},a.createElement(i.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3",closeButton:!0},a.createElement(i.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},f(t.titlePhrase),a.createElement("span",{className:"d-inline-block me-2"},a.createElement(d.l,{size:"std"})))),a.createElement(r.Z,{className:"mb-3"},a.createElement(c.u,{className:"pt-3"},a.createElement(c.u.Image,{src:t.imageUrl,altText:f(t.titlePhrase)}),a.createElement(c.u.Heading,{className:"h6"},a.createElement(u.x,{namespace:g,phrase:t.headingPhrase})),a.createElement(c.u.Info,null,a.createElement(u.x,{namespace:g,phrase:"description"})),a.createElement(c.u.Cta,{appLink:{application:v.O.SIGN_UP,action:p.e.SignUp.INVITE_COLLEAGUE},text:f("cta"),analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.GatedPopup,entity:l.py.AppLink,descriptor:l.Yu.PremiumFeatures}}))),e.extraContent)}}}]);
2
+ //# sourceMappingURL=1726-b08dde1407-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/1726-b08dde1407-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/choices-popup/components/choices/choices.scss","file:///app/packages/libs/shared/src/components/choices-popup/components/choices/Choices.tsx","file:///app/packages/libs/shared/src/components/choices-popup/ChoicesPopup.tsx","file:///app/packages/libs/shared/src/components/premium-badge/PremiumBadge.tsx","file:///app/packages/libs/shared/src/enums/InteractiveOriginType.ts","file:///app/packages/projects/lite/src/apps/interactives/views/new-interactive/NewInteractiveView.tsx","file:///app/packages/projects/lite/src/apps/interactives/views/new-interactive/useNewInteractiveCallbacks.ts","file:///app/packages/projects/lite/src/shared/components/hard-gate-popup/HardGatePopup.tsx"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"selected\":\"zWik0\",\"disabled\":\"bMSMv\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './choices.scss';\n\nexport interface ChoicePopupOption {\n id: string;\n title?: string;\n description?: string;\n imageUrl?: string;\n disabled?: boolean;\n imageClassName?: string;\n}\n\n\ninterface ChoiceProps {\n option?: ChoicePopupOption;\n selected: boolean | ((selectedChoice: boolean) => boolean);\n onSelect: (option: ChoicePopupOption) => void;\n}\n\nexport function Choice(props: React.PropsWithChildren<ChoiceProps>): React.ReactElement {\n function onSelect(): void {\n if (props.option?.disabled)\n return;\n\n props.onSelect(props.option);\n }\n\n let className = 'text-center cursor-pointer p-3 border rounded-3 mx-2 user-select-none w-50';\n\n if (props.selected)\n className += ` border-info ${styles.selected}`;\n\n if (props.option?.disabled)\n className += ` ${styles.disabled}`;\n\n return (\n <DivButton onClick={onSelect} className={className}>\n {props.option?.imageUrl && <img src={props.option.imageUrl} className={`img-fluid my-3 ${props.option.imageClassName ?? ''}`} draggable={false} />}\n {props.option?.title && <h2 className='h3'>{props.option.title}</h2>}\n {props.option?.description && <p className='mb-0' dangerouslySetInnerHTML={{ __html: props.option.description }}></p>}\n {props.children}\n </DivButton>\n );\n}\n\ninterface ChoicesProps {\n options: [ChoicePopupOption, ChoicePopupOption];\n selection: ChoicePopupOption | null;\n selectOption: (option: ChoicePopupOption) => void;\n}\n\nexport function Choices(props: ChoicesProps): React.ReactElement {\n return (\n <div className='d-flex mb-3 mx-n2'>\n {props.options.map(o => (\n <Choice\n key={o.id}\n option={o}\n selected={props.selection?.id === o.id}\n onSelect={props.selectOption}\n />\n ))}\n </div>\n );\n}","import React from 'react';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { PopupButtons, PopupCancelButtonProps, PopupSubmitButtonProps } from '../popup/PopupButtons';\n\nimport { ChoicePopupOption, Choices } from './components/choices/Choices';\n\ninterface ChoicesPopupProps {\n title: string;\n options: [ChoicePopupOption, ChoicePopupOption];\n selection: ChoicePopupOption | null;\n selectOption: (choice: ChoicePopupOption) => void;\n question?: string;\n showLoadingSpinner?: boolean;\n submitButtonProps?: PopupSubmitButtonProps;\n cancelButtonProps?: PopupCancelButtonProps;\n warningComponent?: JSX.Element;\n}\n\ntype PropTypes = ChoicesPopupProps & PopupViewProps;\n\nexport function ChoicesPopup(props: PropTypes): JSX.Element {\n return (\n <Popup\n size='lg'\n title={props.title}\n showLoadingSpinner={props.showLoadingSpinner}\n closePopup={props.closePopup}\n >\n <>\n {!!props.warningComponent && props.warningComponent}\n\n {props.question &&\n <h2 className='h5 text-center fw-semibold mb-3'>{props.question}</h2>\n }\n\n <Choices\n options={props.options}\n selection={props.selection}\n selectOption={props.selectOption}\n />\n\n <PopupButtons>\n {props.cancelButtonProps && <PopupButtons.Cancel {...props.cancelButtonProps} />}\n {props.submitButtonProps && <PopupButtons.Submit {...props.submitButtonProps} />}\n </PopupButtons>\n </>\n </Popup>\n );\n}","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.premiumBadge';\n\ninterface PremiumBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n className?: string;\n}\n\nexport function PremiumBadge(props: PremiumBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center',\n 'fw-medium text-indigo',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-indigo',\n props.className\n )}>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Medium} />\n <Text phrase='premium' namespace={namespace} />\n </span>\n );\n}","export enum InteractiveOriginType {\n Original = 0,\n Copy = 1\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChoicesPopup } from 'libs/shared/components/choices-popup/ChoicesPopup';\nimport { ChoicePopupOption } from 'libs/shared/components/choices-popup/components/choices/Choices';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CurrentUser, PopupViewProps, Video } from 'libs/shared/interfaces';\n\nimport { HardGatePopup } from 'shared/components/hard-gate-popup/HardGatePopup';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { useNewInteractiveCallbacks } from './useNewInteractiveCallbacks';\n\nconst namespace = 'shared.makeInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NewInteractiveProps extends PopupViewProps {\n videoId: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function NewInteractiveView(props: NewInteractiveProps): React.ReactElement {\n const { videoId, closePopup } = props;\n\n const [ showSpinnerButton, setShowSpinnerButton ] = React.useState(false);\n const [ choice, setChoice ] = React.useState<ChoicePopupOption>(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(videoId));\n const { getGatedPermission } = usePermissions();\n\n const {\n createInteractive\n } = useNewInteractiveCallbacks({\n feedback: choice?.id === 'feedback',\n setShowSpinner: setShowSpinnerButton,\n closePopup,\n name: video.data?.name,\n duration: video.data?.duration,\n objectId: video.data?.id,\n currentUser: currentUser.data,\n baseAnalyticsData: { video: { id: videoId, name: video.data?.name } }\n });\n\n function cancelCreate(): void {\n AnalyticsHelper.logUserAction({\n video: { id: videoId, name: video.data?.name }\n }, {\n location: LocationContext.NewInteractive,\n entity: EntityType.Interactive,\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Discard\n });\n\n closePopup();\n }\n\n const choices: [ChoicePopupOption, ChoicePopupOption] = [{\n id: 'feedback',\n title: getPhrase('feedbackTitle'),\n description: getPhrase('feedbackDescription'),\n imageUrl: ImageUrls.Interactives.FeedbackOptions.FEEDBACK\n }, {\n id: 'no-feedback',\n title: getPhrase('noFeedbackTitle'),\n description: getPhrase('noFeedbackDescription'),\n imageUrl: ImageUrls.Interactives.FeedbackOptions.NO_FEEDBACK\n }];\n\n if (getGatedPermission(PermissionName.UploadVideo) === 'hard-gate') {\n return (\n <HardGatePopup\n feature='interactive'\n animate={false}\n closePopup={props.closePopup}\n />\n );\n }\n\n return (\n <ChoicesPopup\n title={getPhrase('title')}\n closePopup={closePopup}\n options={choices}\n selectOption={setChoice}\n selection={choice}\n showLoadingSpinner={!video.data || !currentUser.data}\n cancelButtonProps={{\n onClick: cancelCreate,\n text: getPhrase('cancel'),\n variant: 'link'\n }}\n submitButtonProps={{\n onClick: createInteractive,\n text: getPhrase('continue'),\n variant: 'dark',\n showSpinner: showSpinnerButton,\n disabled: !choice\n }}\n />\n );\n}\n","import { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\nimport { AnalyticsDataPayload } from 'libs/analytics/models/AnalyticsEvent';\n\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { InteractiveOriginType } from 'libs/shared/enums/InteractiveOriginType';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CreateInteractiveMetadataRequest, CreateInteractiveRequest, CurrentUser, Interaction, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.makeInteractive';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useNewInteractiveCallbacks = (options: {\n feedback: boolean;\n setShowSpinner: (val: boolean) => void;\n objectId: string;\n name: string;\n duration: number;\n currentUser: CurrentUser;\n closePopup: () => void;\n baseAnalyticsData: AnalyticsDataPayload;\n}) => {\n const {\n feedback,\n setShowSpinner,\n objectId,\n name,\n duration,\n currentUser,\n closePopup,\n baseAnalyticsData\n } = options;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function onError(): void {\n setShowSpinner(false);\n alerts.error(getPhrase('error'));\n }\n\n function createInteractive(): void {\n setShowSpinner(true);\n const data: CreateInteractiveRequest = {\n name,\n duration: duration,\n immediateFeedback: feedback,\n preventScrubbing: false\n };\n\n /* 1st Request */\n Flight.fetch(\n dispatch,\n InteractiveRequests.createInteractive(\n data,\n onInteractiveCreated,\n onError\n )\n );\n }\n\n function onInteractiveCreated(resp: Interaction): void {\n const data: CreateInteractiveMetadataRequest = {\n name,\n interactiveId: resp.id,\n owner: { id: currentUser.id },\n originType: InteractiveOriginType.Original,\n status: CurationStatus.Draft\n };\n\n /* 2nd Request */\n Flight.fetch(\n dispatch,\n InteractiveRequests.createInteractiveMetadata(\n objectId,\n data,\n onInteractiveMetadataCreated,\n onError\n )\n );\n }\n\n function onInteractiveMetadataCreated(resp: InteractiveMetadata): void {\n AnalyticsHelper.logUserAction({\n ...baseAnalyticsData,\n id: resp.id,\n name: resp.name\n }, {\n location: LocationContext.NewInteractive,\n entity: EntityType.Interactive,\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Complete\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.INTERACTIVES,\n action: Actions.Interactives.EDIT_INTERACTIVE,\n args: [ resp.id, resp.name ]\n });\n closePopup();\n }\n\n return {\n createInteractive\n };\n};\n\n","import React from 'react';\nimport { Modal, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'shared.hardGatePopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype Feature = 'assign' | 'playlists' | 'interactive' | 'copy-interactives' | 'integrations';\n\ninterface FeatureConfig {\n titlePhrase: string;\n headingPhrase: string;\n imageUrl: string;\n}\n\nconst featureConfigMap: Record<Feature, FeatureConfig> = {\n 'assign': {\n titlePhrase: 'assignTitle',\n headingPhrase: 'assignHeading',\n imageUrl: ImageUrls.ReverseTrial.ASSIGN\n },\n 'playlists': {\n titlePhrase: 'playlistsTitle',\n headingPhrase: 'playlistsHeading',\n imageUrl: ImageUrls.ReverseTrial.PLAYLIST\n },\n 'interactive': {\n titlePhrase: 'interactiveTitle',\n headingPhrase: 'interactiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'copy-interactives': {\n titlePhrase: 'copyInteractiveTitle',\n headingPhrase: 'copyInteractiveHeading',\n imageUrl: ImageUrls.ReverseTrial.INTERACTIVE\n },\n 'integrations': {\n titlePhrase: 'integrationsTitle',\n headingPhrase: 'integrationsHeading',\n imageUrl: ImageUrls.ReverseTrial.INTEGRATIONS\n }\n};\n\nexport interface HardGatePopupProps extends MultiStepPopupViewProps {\n feature: Feature;\n extraContent?: React.ReactNode;\n}\n\nexport function HardGatePopup(props: HardGatePopupProps): JSX.Element {\n const config = featureConfigMap[props.feature];\n\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n hideTitle\n >\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase(config.titlePhrase)}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n <Row className='mb-3'>\n <EmptyState className='pt-3'>\n <EmptyState.Image src={config.imageUrl} altText={getPhrase(config.titlePhrase)} />\n <EmptyState.Heading className='h6'>\n <Text namespace={namespace} phrase={config.headingPhrase} />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='description' />\n </EmptyState.Info>\n <EmptyState.Cta\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n text={getPhrase('cta')}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.GatedPopup,\n entity: EntityType.AppLink,\n descriptor: SignUpDescriptors.PremiumFeatures\n }}\n />\n </EmptyState>\n </Row>\n \n {props.extraContent}\n </Popup>\n );\n}\n\n"],"names":["Choice","props","className","selected","option","disabled","DivButton","onClick","onSelect","imageUrl","src","imageClassName","draggable","title","description","dangerouslySetInnerHTML","__html","children","Choices","options","map","o","key","id","selection","selectOption","ChoicesPopup","Popup","size","showLoadingSpinner","closePopup","warningComponent","question","PopupButtons","cancelButtonProps","submitButtonProps","namespace","PremiumBadge","invert","svgName","S","phrase","InteractiveOriginType","getPhrase","NewInteractiveView","videoId","showSpinnerButton","setShowSpinnerButton","choice","setChoice","currentUser","video","getGatedPermission","createInteractive","feedback","setShowSpinner","name","data","duration","objectId","baseAnalyticsData","choices","feature","animate","location","entity","actionType","workflowPhase","text","variant","showSpinner","useNewInteractiveCallbacks","dispatch","alerts","onError","error","onInteractiveCreated","resp","interactiveId","owner","originType","status","onInteractiveMetadataCreated","application","action","args","immediateFeedback","preventScrubbing","featureConfigMap","titlePhrase","headingPhrase","HardGatePopup","config","animation","hideTitle","closeButton","as","altText","appLink","analyticsData","analyticsOptions","descriptor","extraContent"],"sourceRoot":""}