@clickview/lite 0.57.2-rc.0 → 0.57.2-rc.2

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 (100) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{3918-lite-9bd35b2c4c.chunk.css → 3918-lite-88ef54ffc6.chunk.css} +3 -1
  3. package/dist/css/{1057-lite-04173a371f.chunk.css → 8849-lite-1ad0b22428.chunk.css} +2 -1
  4. package/dist/css/{lite-app-5335e8e07a.css → lite-app-560655620c.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/1734-f5ffd39591-lite.chunk.js +2 -0
  7. package/dist/scripts/1734-f5ffd39591-lite.chunk.js.map +1 -0
  8. package/dist/scripts/2506-aee0b1f275-lite.chunk.js +2 -0
  9. package/dist/scripts/2506-aee0b1f275-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{2564-cd82320188-lite.chunk.js → 2564-98ba0d782a-lite.chunk.js} +3 -3
  11. package/dist/scripts/{2564-cd82320188-lite.chunk.js.map → 2564-98ba0d782a-lite.chunk.js.map} +1 -1
  12. package/dist/scripts/2615-e9b2938c18-lite.chunk.js +3 -0
  13. package/dist/scripts/2615-e9b2938c18-lite.chunk.js.map +1 -0
  14. package/dist/scripts/2788-86687fd69d-lite.chunk.js +2 -0
  15. package/dist/scripts/2788-86687fd69d-lite.chunk.js.map +1 -0
  16. package/dist/scripts/2820-b3d1688da0-lite.chunk.js +2 -0
  17. package/dist/scripts/2820-b3d1688da0-lite.chunk.js.map +1 -0
  18. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js +2 -0
  19. package/dist/scripts/2978-b7bcc3eac4-lite.chunk.js.map +1 -0
  20. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js +2 -0
  21. package/dist/scripts/3391-5e26ca5ece-lite.chunk.js.map +1 -0
  22. package/dist/scripts/{3667-f9f546136c-lite.chunk.js → 3667-149e98454c-lite.chunk.js} +3 -3
  23. package/dist/scripts/{3667-f9f546136c-lite.chunk.js.map → 3667-149e98454c-lite.chunk.js.map} +1 -1
  24. package/dist/scripts/3918-43b95cb315-lite.chunk.js +2 -0
  25. package/dist/scripts/3918-43b95cb315-lite.chunk.js.map +1 -0
  26. package/dist/scripts/4113-d6411052c4-lite.chunk.js +2 -0
  27. package/dist/scripts/4113-d6411052c4-lite.chunk.js.map +1 -0
  28. package/dist/scripts/4137-bef0be4a57-lite.chunk.js +3 -0
  29. package/dist/scripts/4137-bef0be4a57-lite.chunk.js.map +1 -0
  30. package/dist/scripts/4266-42463e0c33-lite.chunk.js +3 -0
  31. package/dist/scripts/4266-42463e0c33-lite.chunk.js.map +1 -0
  32. package/dist/scripts/5817-84b8e83c19-lite.chunk.js +3 -0
  33. package/dist/scripts/5817-84b8e83c19-lite.chunk.js.map +1 -0
  34. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js → 6433-ad3992c23a-lite.chunk.js} +2 -2
  35. package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.map → 6433-ad3992c23a-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/7434-34137ad94a-lite.chunk.js +2 -0
  37. package/dist/scripts/7434-34137ad94a-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{7556-79099a07fc-lite.chunk.js → 7556-69f8cb3b20-lite.chunk.js} +3 -3
  39. package/dist/scripts/7556-69f8cb3b20-lite.chunk.js.map +1 -0
  40. package/dist/scripts/{8095-777a5c5ddf-lite.chunk.js → 8095-afb976fac0-lite.chunk.js} +2 -2
  41. package/dist/scripts/8095-afb976fac0-lite.chunk.js.map +1 -0
  42. package/dist/scripts/839-f8478d27f8-lite.chunk.js +2 -0
  43. package/dist/scripts/839-f8478d27f8-lite.chunk.js.map +1 -0
  44. package/dist/scripts/8489-7779fd40b3-lite.chunk.js +3 -0
  45. package/dist/scripts/8489-7779fd40b3-lite.chunk.js.map +1 -0
  46. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js +2 -0
  47. package/dist/scripts/8849-020bfd8cdd-lite.chunk.js.map +1 -0
  48. package/dist/scripts/bundle-fb8200eefd.min.js +3 -0
  49. package/dist/scripts/bundle-fb8200eefd.min.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/scripts/1057-3c48d4553a-lite.chunk.js +0 -2
  52. package/dist/scripts/1057-3c48d4553a-lite.chunk.js.map +0 -1
  53. package/dist/scripts/1683-57c0175d4e-lite.chunk.js +0 -2
  54. package/dist/scripts/1683-57c0175d4e-lite.chunk.js.map +0 -1
  55. package/dist/scripts/1734-bbca52585c-lite.chunk.js +0 -2
  56. package/dist/scripts/1734-bbca52585c-lite.chunk.js.map +0 -1
  57. package/dist/scripts/232-278263e5f8-lite.chunk.js +0 -3
  58. package/dist/scripts/232-278263e5f8-lite.chunk.js.map +0 -1
  59. package/dist/scripts/2615-90d4cdd835-lite.chunk.js +0 -3
  60. package/dist/scripts/2615-90d4cdd835-lite.chunk.js.map +0 -1
  61. package/dist/scripts/2788-013bbba554-lite.chunk.js +0 -2
  62. package/dist/scripts/2788-013bbba554-lite.chunk.js.map +0 -1
  63. package/dist/scripts/312-2458059ebb-lite.chunk.js +0 -2
  64. package/dist/scripts/312-2458059ebb-lite.chunk.js.map +0 -1
  65. package/dist/scripts/3918-2855f0da2a-lite.chunk.js +0 -2
  66. package/dist/scripts/3918-2855f0da2a-lite.chunk.js.map +0 -1
  67. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js +0 -3
  68. package/dist/scripts/4137-f0ac17da1f-lite.chunk.js.map +0 -1
  69. package/dist/scripts/4654-6fedfb863f-lite.chunk.js +0 -2
  70. package/dist/scripts/4654-6fedfb863f-lite.chunk.js.map +0 -1
  71. package/dist/scripts/5817-900efca702-lite.chunk.js +0 -3
  72. package/dist/scripts/5817-900efca702-lite.chunk.js.map +0 -1
  73. package/dist/scripts/7237-86c18f2701-lite.chunk.js +0 -2
  74. package/dist/scripts/7237-86c18f2701-lite.chunk.js.map +0 -1
  75. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js +0 -2
  76. package/dist/scripts/7434-366d4ae5e0-lite.chunk.js.map +0 -1
  77. package/dist/scripts/7556-79099a07fc-lite.chunk.js.map +0 -1
  78. package/dist/scripts/8095-777a5c5ddf-lite.chunk.js.map +0 -1
  79. package/dist/scripts/839-889090dc50-lite.chunk.js +0 -2
  80. package/dist/scripts/839-889090dc50-lite.chunk.js.map +0 -1
  81. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js +0 -3
  82. package/dist/scripts/8489-6e8c4dd60f-lite.chunk.js.map +0 -1
  83. package/dist/scripts/897-399a877281-lite.chunk.js +0 -2
  84. package/dist/scripts/897-399a877281-lite.chunk.js.map +0 -1
  85. package/dist/scripts/9201-899c885914-lite.chunk.js +0 -2
  86. package/dist/scripts/9201-899c885914-lite.chunk.js.map +0 -1
  87. package/dist/scripts/bundle-4b58e56927.min.js +0 -3
  88. package/dist/scripts/bundle-4b58e56927.min.js.map +0 -1
  89. /package/dist/css/{1683-lite-bdd5b6edf8.chunk.css → 2506-lite-bdd5b6edf8.chunk.css} +0 -0
  90. /package/dist/css/{7237-lite-a8e87f096f.chunk.css → 2820-lite-a8e87f096f.chunk.css} +0 -0
  91. /package/dist/scripts/{2564-cd82320188-lite.chunk.js.LICENSE.txt → 2564-98ba0d782a-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{2615-90d4cdd835-lite.chunk.js.LICENSE.txt → 2615-e9b2938c18-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{3667-f9f546136c-lite.chunk.js.LICENSE.txt → 3667-149e98454c-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{4137-f0ac17da1f-lite.chunk.js.LICENSE.txt → 4137-bef0be4a57-lite.chunk.js.LICENSE.txt} +0 -0
  95. /package/dist/scripts/{232-278263e5f8-lite.chunk.js.LICENSE.txt → 4266-42463e0c33-lite.chunk.js.LICENSE.txt} +0 -0
  96. /package/dist/scripts/{5817-900efca702-lite.chunk.js.LICENSE.txt → 5817-84b8e83c19-lite.chunk.js.LICENSE.txt} +0 -0
  97. /package/dist/scripts/{6433-ff27a3c867-lite.chunk.js.LICENSE.txt → 6433-ad3992c23a-lite.chunk.js.LICENSE.txt} +0 -0
  98. /package/dist/scripts/{7556-79099a07fc-lite.chunk.js.LICENSE.txt → 7556-69f8cb3b20-lite.chunk.js.LICENSE.txt} +0 -0
  99. /package/dist/scripts/{8489-6e8c4dd60f-lite.chunk.js.LICENSE.txt → 8489-7779fd40b3-lite.chunk.js.LICENSE.txt} +0 -0
  100. /package/dist/scripts/{bundle-4b58e56927.min.js.LICENSE.txt → bundle-fb8200eefd.min.js.LICENSE.txt} +0 -0
@@ -1,3 +0,0 @@
1
- /*! For license information please see 5817-900efca702-lite.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5817],{53353:(e,t,n)=>{n.d(t,{c:()=>v,l:()=>m});var r=n(32735),i=n(232),o=n.n(i),a=n(8604),c=n(83345);const l={heatMap:"epapa",legend:"uhH4p"};function u(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 s="shared.engagementHeatMap",f="#f1f1f1",p=o().scale(["#daf07d","#08bd1a"]),y=[0,.01,.25,.5,.75,1];function d(e,t){return e?p(e/t).hex():f}function h(e,t){for(var n=[],r=0;r<e.length;r++){var i=r>0&&e[r-1],o=e[r],a=r<e.length-1&&e[r+1];o===i&&o===a||n.push("".concat(d(o,t)," ").concat(100/e.length*r,"%"))}return"linear-gradient(to right, ".concat(n.join(","),")")}function m(){var e=Math.max.apply(Math,y),t=100/y.length;return r.createElement("div",{className:"d-flex justify-content-between w-100"},r.createElement(c.x,{namespace:s,phrase:"less"}),r.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(l.legend)},y.map((function(n,i){return r.createElement("div",{key:i,style:{width:"".concat(t,"%"),backgroundColor:d(n,e)}})}))),r.createElement(c.x,{namespace:s,phrase:"more"}))}function v(e){var t,n,i,o=(0,a.O)(e.engagement),c=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return u(e)}(i=o)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,t){if(e){if("string"==typeof e)return u(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)?u(e,t):void 0}}(i)||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(l.heatMap," ").concat(null!==(n=e.className)&&void 0!==n?n:""),style:{background:h(o,c)}})}},25216:(e,t,n)=>{n.d(t,{L:()=>a});var r=n(32735),i=n(83914);const o={icon:"sAmpy",count:"faDs4"};function a(e){return r.createElement("section",{className:"d-flex flex-column border border-light rounded p-3 h-100"},r.createElement("div",{className:"d-flex align-items-center mb-2"},r.createElement("div",{className:"".concat(o.icon," ").concat(e.svgClassName," rounded-circle d-flex align-items-center justify-content-center")},r.createElement(i.x,{svgName:e.svgName})),r.createElement("div",{className:"d-flex flex-column ms-2"},r.createElement("h2",{className:"h6 mb-0"},e.title),e.subtitle&&r.createElement("p",{className:"text-secondary font-size-sm mb-0"},e.subtitle)),"number"==typeof e.count&&r.createElement("div",{className:"".concat(o.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},8604:(e,t,n)=>{function r(e){return new Array(Math.ceil(e.videoDuration)).fill(null).map((function(t,n){return e.heatMap[n]||0}))}n.d(t,{O:()=>r})},17913:(e,t,n)=>{n.d(t,{u:()=>a});var r=n(97395),i=n(110),o=n(62875),a={individualEngagement:function(e,t,n,i,a,c){var l=Object.assign({objectId:e},t);return n&&(l.sharerId=n),{url:r._.urlBuilder("{gateway}/v1/analytics/heat-map",l),key:(0,o.H)("engagement:".concat(e),t,n),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1,success:i,error:a,always:c}},aggregateEngagement:function(e,t,n,i,a,c){var l=Object.assign({objectId:e},t);return n&&(l.sharerId=n),{url:r._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",l),key:(0,o.H)("aggregate:engagement:".concat(e),t,n),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1,success:i,error:a,always:c}},views:function(e,t,n,a,c,l){var u="video:views";t&&(u+=":".concat(t));var s=Object.assign(Object.assign({objectId:t},e),{timeOffset:i.O.getTimezoneOffset()});return n&&(s.sharerId=n),{url:r._.urlBuilder("{gateway}/v1/analytics/video-views",s),key:(0,o.H)(u,e,n),normalize:!1,success:a,error:c,always:l}}}},61477:(e,t,n)=>{n.r(t),n.d(t,{InsightsHeatmapView:()=>yt});var r=n(32735),i=n(2948),o=n(20354),a=n(69674),c=n(23481),l=n(53353),u=n(26136),s=n(20789),f=n(40782),p=n(64818);const y={heatMap:"rwDjh",avatarContainer:"kW4ZM"};function d(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 h=c.T.encloseNamespace("shared.engagementTable");function m(e){var t;return r.createElement("div",{className:"".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function v(e){return r.createElement(m,{className:"d-inline-block ".concat(e.column.isSorted?"fw-bold":"")},h(e.phraseKey))}function g(e){return r.useMemo((function(){var t,n,i=(t=e.engagement,n=0,t.forEach((function(e){var t,r=Math.max.apply(Math,function(e){if(Array.isArray(e))return d(e)}(t=e.heatMap)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return d(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)?d(e,t):void 0}}(t)||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.")}());r>n&&(n=r)})),n);return[{Header:function(e){var t=e.column;return r.createElement(v,{column:t,phraseKey:"name"})},width:22,accessor:"user",sortType:function(t,n){return(0,u.B)(t.values.user,e.anonymiseUsers)>(0,u.B)(n.values.user,e.anonymiseUsers)?1:-1},Cell:function(t){var n,i,o,a,c=t.value,l=(i=c,o=e.anonymiseUsers,{name:(a=(0,u.B)(i,o).split(" ").filter((function(e){return!!e})))[0],surname:a.slice(1).join(" ")}),f=l.name,d=l.surname;return r.createElement(m,{className:"d-flex align-items-center h-100"},r.createElement("span",{className:y.avatarContainer},r.createElement(s.q,{imageCdnUrl:e.imageCdnUrl,initials:p.l.getInitials(f,d),imageUrl:e.anonymiseUsers?null:null===(n=c.avatar)||void 0===n?void 0:n.url})),r.createElement("span",{className:"ms-2 clamp-1"},f," ",d))}},{Header:function(e){var t=e.column;return r.createElement(v,{column:t,phraseKey:"views"})},accessor:"viewCount",width:15,sortType:"basic",sortDescFirst:!0,Cell:function(e){var t=e.value;return r.createElement(m,{className:"d-flex align-items-center h-100"},r.createElement("div",null,t))}},{Header:function(e){var t=e.column;return r.createElement(v,{column:t,phraseKey:"engagement"})},accessor:"engagementRate",width:20,sortType:"basic",sortDescFirst:!0,Cell:function(e){var t=e.value;return r.createElement(m,{className:"w-33"},r.createElement(f.O,{percentage:t,layout:f.I.LabelBefore}))}},{Header:function(e){var t=e.column;return r.createElement(v,{column:t,phraseKey:"heatMap"})},accessor:"heatMap",width:48,disableSortBy:!0,Cell:function(e){var t=e.row.original;return r.createElement(m,{className:"d-flex align-items-center h-100"},r.createElement(l.c,{engagement:t,max:i,className:"".concat(y.heatMap," flex-grow-1")}))}}]}),[e.anonymiseUsers])}var b={table:"bg-white border border-light rounded px-0",header:"border-bottom",headerCell:"m-3",cell:"mx-3 my-2"};function w(e){var t,n,i=g({engagement:e.engagement,imageCdnUrl:e.imageCdnUrl,anonymiseUsers:e.anonymiseUsers}),o=(t=e.engagement,n=e.users,r.useMemo((function(){var e=[];return t.forEach((function(t){var r=null==n?void 0:n.find((function(e){return e.id===t.userId}));r&&e.push(Object.assign(Object.assign({},t),{user:r}))})),e}),[null==n?void 0:n.length]));return o.length?r.createElement(a.i,{columns:i,data:o,theme:b,enableSort:!0}):r.createElement(r.Fragment,null)}var O=n(25216);function E(e){return r.createElement(f.O,{layout:e.layout,className:e.className,percentage:0,customLabel:"--%"})}var j=n(83345),S=n(35223),P="shared.insightAmountWatched",C=c.T.encloseNamespace(P);function T(e){var t,n=(null===(t=e.engagement)||void 0===t?void 0:t.engagementRate)>0?e.engagement.engagementRate:null,i=Math.round(100*e.engagement.engagementRate),o=!e.params.users&&!e.params.classrooms&&!e.params.classroomGroups;return r.createElement(O.L,{title:C("title"),svgName:S.vn.Timer,svgClassName:"bg-light-green text-green"},r.createElement("div",{className:"d-flex flex-column align-items-center my-auto"},!!e.engagement&&r.createElement(r.Fragment,null,r.createElement(f.O,{percentage:n,layout:f.I.LabelInside}),r.createElement("p",{className:"ms-2"},"number"==typeof n?o?r.createElement(j.x,{namespace:P,phrase:"everyoneWatched",options:{percentage:i}}):r.createElement(j.x,{namespace:P,phrase:"usersWatched",options:{percentage:i}}):r.createElement(j.x,{namespace:P,phrase:"notWatched"}))),!e.engagement&&r.createElement(r.Fragment,null,r.createElement(E,{layout:f.I.LabelInside}))))}var k=n(72306),_=n.n(k),x=n(70312),I=n.n(x),N=n(75896),M=["#FF9300","#38A2E8","#7A76E8","#B679C7","#F7847B","#D9584F","#FFCD52","#5DC786","#40BCC3","#40C2BB"];function A(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}function L(e){return+e.split(" ")[1]}var R=n(23232),D="shared.insightTotalViews",B=c.T.encloseNamespace(D),F={title:{text:null},credits:{enabled:!1},chart:{backgroundColor:"transparent",spacing:[0,0,0,0]},plotOptions:{pie:{allowPointSelect:!0,cursor:"pointer",dataLabels:{enabled:!1},showInLegend:!0,borderWidth:0,size:"60%"}}};function U(e){var t,n,i,o,a,c,l,u,s=(o=e.events,a=[],c=function(e){return"Unknown"===e?"Staff":e},l={},null==(u=o["yearGroupCount"])||u.forEach((function(e){var t;e.name&&!(null==a?void 0:a.includes(e.name.toLowerCase()))&&(l[e.name]=null!==(t=l[e.name])&&void 0!==t?t:0,l[e.name]+=e.count)})),t=N.m.sortBy(Object.keys(l).map((function(e){return{name:c?c(e):e,y:l[e],type:"pie"}})),"name").map((function(e,t){return Object.assign(Object.assign({},e),{color:M[t%M.length]})})),(i=t,n=function(e){if(Array.isArray(e))return A(e)}(i)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,t){if(e){if("string"==typeof e)return A(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)?A(e,t):void 0}}(i)||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.")}()).sort((function(e,t){var n=L(e.name.toString()),r=L(t.name.toString());return Number.isNaN(n)||Number.isNaN(r)?+e.name-+t.name:n-r})),n),f=function(e){var t;return null!==(t=null==e?void 0:e.reduce((function(e,t){return e+t.y}),0))&&void 0!==t?t:null}(s);return r.createElement(O.L,{title:B("title"),svgClassName:"bg-light-blue text-blue",svgName:S.vn.VisibleOn},(null==s?void 0:s.length)?r.createElement(r.Fragment,null,r.createElement("p",{className:"mb-0"},r.createElement(j.x,{namespace:D,phrase:"totalViews",options:{totalViews:f}})),r.createElement("div",{className:"d-flex justify-content-center h-75"},r.createElement(I(),{highcharts:_(),options:function(e){return Object.assign(Object.assign({},F),{series:[{type:"pie",name:"views",data:e}]})}(s),containerProps:{className:"w-100"}}))):r.createElement(R.u,{className:"pt-0"},r.createElement(R.u.Image,{src:e.emptyStateImage,size:"small"}),r.createElement(R.u.Heading,{className:"h3"},r.createElement(j.x,{namespace:D,phrase:"noViews"})),r.createElement(R.u.Info,null,r.createElement(j.x,{namespace:D,phrase:"notWatched"}))))}var H=n(4606),z=n(26025),V=n(74901),Z=n(40003),G=n(4594),K=n(60051),W=n(39151),$=n(47812),q=n(31949),Q=n(17913),Y=n(31908),X=n(99742),J=n(86702),ee=n(8604),te=n(36527),ne=n(41386),re=n(93861);function ie(e){return ie="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},ie(e)}function oe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,ae(r.key),r)}}function ae(e){var t=function(e,t){if("object"!=ie(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=ie(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==ie(t)?t:t+""}function ce(e,t,n){return t=se(t),function(e,t){if(t&&("object"==ie(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,le()?Reflect.construct(t,n||[],se(e).constructor):t.apply(e,n))}function le(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(le=function(){return!!e})()}function ue(){return ue="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=se(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},ue.apply(null,arguments)}function se(e){return se=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},se(e)}function fe(e,t){return fe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},fe(e,t)}var pe=function(e){function t(e,n){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=ce(this,t,[e,n])).overlayVisible=n.overlayVisible,r.toggle(r.overlayVisible),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&fe(e,t)}(t,e),n=t,r=[{key:"handleToggle",value:function(){this.toggle(!this.overlayVisible)}},{key:"toggle",value:function(e){e?this.toggleOn():this.toggleOff()}},{key:"toggleOn",value:function(){re.Z.dom.addClass(this.toggleEl,"on"),this.overlayVisible=!0,this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible),this.player().addClass("cv-reports-player-overlay-visible")}},{key:"toggleOff",value:function(){re.Z.dom.removeClass(this.toggleEl,"on"),this.overlayVisible=!1,this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible),this.player().removeClass("cv-reports-player-overlay-visible")}},{key:"handleClick",value:function(e){e.stopImmediatePropagation()}},{key:"createEl",value:function(e,n,r){this.handlerBound||(this.handleToggle=this.handleToggle.bind(this),this.handlerBound=!0),this.toggleEl&&this.toggleEl.removeEventListener("click",this.handleToggle),this.toggleEl=re.Z.dom.createEl("div",{className:"custom-toggle custom-toggle-info toggle-option float-end",innerHTML:'<span class="handle"></span></div>'}),this.toggleEl.addEventListener("click",this.handleToggle);var i,o,a,c=(i=t,"createEl",o=this,a=ue(se(1&3?i.prototype:i),"createEl",o),function(e){return a.apply(o,e)})([e,{className:"vjs-menu-item cv-cog-menu-item",innerHTML:'\n <span class="vjs-menu-item-text">Heat Map</span>\n <span class="cv-toggle-container"></span>'},r]);return c.children[1].appendChild(this.toggleEl),c}}],r&&oe(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(re.Z.getComponent("MenuItem"));re.Z.registerComponent("EngagementOverlayMenuItem",pe);var ye=n(74161),de=n(86572),he=3;function me(e){var t,n=e.interactive.timepoints.find((function(t){var n=t.visibleAt/1e3;return Math.floor(e.time)===Math.floor(n)||Math.ceil(e.time)===Math.ceil(n)}));if(!(null===(t=null==n?void 0:n.interactions)||void 0===t?void 0:t.length))return r.createElement(r.Fragment,null);var i=n.interactions.length>he?n.interactions.slice(0,he-1):n.interactions,o=n.interactions.length-i.length;return r.createElement("div",{className:"d-flex justify-content-end ms-2"},i.map((function(e,t){return r.createElement(de.y,{key:t,interaction:e,showQuestion:!1,iconClassName:"ms-1"})})),!!o&&r.createElement("div",{className:"interaction-type-icon d-flex justify-content-center align-items-center border border-dark text-body ms-1"},"+".concat(o)))}var ve=n(42503);function ge(e){return function(e){if(Array.isArray(e))return be(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return be(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)?be(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function be(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 we={title:{text:null},xAxis:{visible:!1,minPadding:0,maxPadding:0},legend:{enabled:!1},credits:{enabled:!1},defs:{gradient:{tagName:"linearGradient",id:"area-gradient",x1:0,y1:1,x2:0,y2:0,children:[{tagName:"stop",offset:0},{tagName:"stop",offset:1}]}}};function Oe(e,t){return{styledMode:!0,spacing:[15,0,0,0],width:e,height:t}}function Ee(e){return Ee="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},Ee(e)}function je(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Se(r.key),r)}}function Se(e){var t=function(e,t){if("object"!=Ee(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=Ee(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Ee(t)?t:t+""}function Pe(e,t,n){return t=ke(t),function(e,t){if(t&&("object"==Ee(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,Ce()?Reflect.construct(t,n||[],ke(e).constructor):t.apply(e,n))}function Ce(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Ce=function(){return!!e})()}function Te(){return Te="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=ke(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},Te.apply(null,arguments)}function ke(e){return ke=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ke(e)}function _e(e,t){return _e=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},_e(e,t)}var xe=re.Z.getComponent("Component");_().AST.allowedTags.push("g"),_().AST.allowedAttributes.push("viewBox","transform");var Ie=function(e){function t(e,n){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=Pe(this,t,[e,n])).initialize(),r.bindListeners(),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&_e(e,t)}(t,e),n=t,i=[{key:"initialize",value:function(){var e=this;this.player().ready((function(){return e.buildChart()}))}},{key:"buildCSSClass",value:function(){return"cv-engagement-overlay"}},{key:"createEl",value:function(e,n,r){var i,o,a;return(i=t,"createEl",o=this,a=Te(ke(1&3?i.prototype:i),"createEl",o),function(e){return a.apply(o,e)})([e,Object.assign(Object.assign({},n),{className:this.buildCSSClass(),innerHTML:'<div class="cv-engagement-chart"></div><div class="cv-engagement-timepoint-indicator"></div>'}),r])}},{key:"toggleChart",value:function(e){e?this.buildChart():this.destroyChart()}},{key:"bindListeners",value:function(){var e=this;this.handleClick=this.handleClick.bind(this),this.resizeChart=this.resizeChart.bind(this),this.player().on("playerresize",this.resizeChart),this.on(this.el(),"mouseup",this.handleClick),this.player().on("dispose",(function(){e.player().off("playerresize",e.resizeChart),e.off(e.el(),"mouseup",e.handleClick)}))}},{key:"handleClick",value:function(e){re.Z.dom.isSingleLeftClick(e)&&(this.player().paused()?this.player().play():this.player().pause())}},{key:"buildChart",value:function(){var e=this;if(!this.chart){var t=this.getChartDimensions();if(t){var n=this.el().querySelector(".cv-engagement-chart");this.chart=_().chart(n,this.getHighchartOptions(t))}else this.player().one("play",(function(){return e.buildChart()}))}}},{key:"resizeChart",value:function(){var e=this.getChartDimensions();this.chart&&e&&this.chart.setSize(e.width,e.height)}},{key:"destroyChart",value:function(){var e;null===(e=this.chart)||void 0===e||e.destroy(),this.chart=null}},{key:"getChartDimensions",value:function(){var e=this.player().getChild("collapserator"),t=null==e?void 0:e.currentHeight(),n=this.el().clientWidth;return t&&n?{width:n,height:this.player().currentDimensions().height-t}:null}},{key:"getHighchartOptions",value:function(e){var t,n,i,o=e.width,a=e.height;return Object.assign(Object.assign({},we),{chart:Oe(o,a),yAxis:(n=this.options_.heatMap,{max:1.05*Math.max.apply(Math,ge(n)),min:0,minPadding:0,maxPadding:0,allowDecimals:!0,startOnTick:!1,endOnTick:!1,visible:!1}),tooltip:(i=this.options_.interactive,{formatter:function(){var e=i?function(e,t){return(0,ye.renderToStaticMarkup)(r.createElement(me,{time:t,interactive:e}))}(i,this.x):"";return'<div class="cv-engagement-tooltip bg-white rounded"><div class="d-flex justify-content-between">'+"<strong>".concat((0,ve.m)(this.x),"</strong>")+"".concat(e)+'</div><div class="d-flex justify-content-between rounded bg-light cv-view-count-container">'+'<strong>Views</strong> <span class="cv-view-count">'.concat(this.y,"</span>")+"</div></div>"},positioner:function(e,t,n){var r=this.chart.plotWidth-e,i=n.plotX-e/2;return{x:Math.min(Math.max(i,0),r),y:this.chart.plotTop}},useHTML:!0,padding:0}),plotOptions:(t=this.moveTimepointIndicator.bind(this),{area:{point:{events:{mouseOver:function(){t(this.x)},mouseOut:function(){t(null)}}}},series:{marker:{enabled:!1}}}),series:[{type:"area",data:this.options_.heatMap}]})}},{key:"moveTimepointIndicator",value:function(e){this.options_.onTimepointHover&&this.options_.onTimepointHover(e);var t=this.el().querySelector(".cv-engagement-timepoint-indicator");null!==e?(re.Z.dom.addClass(t,"cv-engagement-timepoint-indicator-visible"),t.style.left="".concat(e/this.options_.heatMap.length*100,"%")):re.Z.dom.removeClass(t,"cv-engagement-timepoint-indicator-visible")}}],i&&je(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,i}(xe);function Ne(e){return Ne="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},Ne(e)}function Me(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Ae(r.key),r)}}function Ae(e){var t=function(e,t){if("object"!=Ne(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=Ne(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Ne(t)?t:t+""}function Le(e,t,n){return t=De(t),function(e,t){if(t&&("object"==Ne(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,Re()?Reflect.construct(t,n||[],De(e).constructor):t.apply(e,n))}function Re(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Re=function(){return!!e})()}function De(e){return De=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},De(e)}function Be(e,t){return Be=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Be(e,t)}re.Z.registerComponent("EngagementOverlay",Ie);var Fe=function(e){function t(e,n){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=Le(this,t,[e,n])).options=n,e.ready((function(){r.initialize()})),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&Be(e,t)}(t,e),n=t,(r=[{key:"initialize",value:function(){var e;this.hasHeatMapData()&&(this.player.addChild("engagementOverlay",{heatMap:this.options.heatMap,interactive:this.options.interactive,onTimepointHover:this.options.onTimepointHover}),(null===(e=this.player.getChild("collapserator"))||void 0===e?void 0:e.getChild("cogButton")).addItem({index:0,ctor:pe,name:"EngagementOverlayMenuItem",options:{overlayVisible:!0}}))}},{key:"toggleOverlay",value:function(e){var t=this.player.getChild("engagementOverlay");null==t||t.toggleChart(e)}},{key:"hasHeatMapData",value:function(){var e;return(null===(e=this.options.heatMap)||void 0===e?void 0:e.reduce((function(e,t){return e+t}),0))>0}}])&&Me(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(re.Z.getPlugin("plugin"));re.Z.registerPlugin("engagementOverlayPlugin",Fe),n(16852);var Ue=n(90915),He=n(10463);function ze(e){return ze="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},ze(e)}function Ve(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Ze(r.key),r)}}function Ze(e){var t=function(e,t){if("object"!=ze(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=ze(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==ze(t)?t:t+""}function Ge(e,t,n){return t=We(t),function(e,t){if(t&&("object"==ze(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,Ke()?Reflect.construct(t,n||[],We(e).constructor):t.apply(e,n))}function Ke(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Ke=function(){return!!e})()}function We(e){return We=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},We(e)}function $e(e,t){return $e=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},$e(e,t)}n(41400);var qe=function(e){function t(e,n){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=Ge(this,t,[e])).options=n,r.player.one("loadedmetadata",(function(){return r.player.ready(r.initialize.bind(r))})),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&$e(e,t)}(t,e),n=t,(r=[{key:"initialize",value:function(){He.O.useTrack(this.player,"metadata","interactive",this.onTrackLoaded.bind(this)),this.player.addClass("cv-interactive-plugin")}},{key:"onTrackLoaded",value:function(e){this.addChildren(e)}},{key:"addChildren",value:function(e){this.player.controlBar.getChild("progressControl").getChild("SeekBar").addChild(new Ue.N(this.player,{interactive:this.options.interactive,track:e}))}}])&&Ve(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(re.Z.getPlugin("plugin"));function Qe(e){return Qe="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},Qe(e)}function Ye(){Ye=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,i=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",c=o.asyncIterator||"@@asyncIterator",l=o.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function s(e,t,n,r){var o=t&&t.prototype instanceof v?t:v,a=Object.create(o.prototype),c=new x(r||[]);return i(a,"_invoke",{value:C(e,n,c)}),a}function f(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=s;var p="suspendedStart",y="suspendedYield",d="executing",h="completed",m={};function v(){}function g(){}function b(){}var w={};u(w,a,(function(){return this}));var O=Object.getPrototypeOf,E=O&&O(O(I([])));E&&E!==n&&r.call(E,a)&&(w=E);var j=b.prototype=v.prototype=Object.create(w);function S(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function P(e,t){function n(i,o,a,c){var l=f(e[i],e,o);if("throw"!==l.type){var u=l.arg,s=u.value;return s&&"object"==Qe(s)&&r.call(s,"__await")?t.resolve(s.__await).then((function(e){n("next",e,a,c)}),(function(e){n("throw",e,a,c)})):t.resolve(s).then((function(e){u.value=e,a(u)}),(function(e){return n("throw",e,a,c)}))}c(l.arg)}var o;i(this,"_invoke",{value:function(e,r){function i(){return new t((function(t,i){n(e,r,t,i)}))}return o=o?o.then(i,i):i()}})}function C(t,n,r){var i=p;return function(o,a){if(i===d)throw Error("Generator is already running");if(i===h){if("throw"===o)throw a;return{value:e,done:!0}}for(r.method=o,r.arg=a;;){var c=r.delegate;if(c){var l=T(c,r);if(l){if(l===m)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(i===p)throw i=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);i=d;var u=f(t,n,r);if("normal"===u.type){if(i=r.done?h:y,u.arg===m)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(i=h,r.method="throw",r.arg=u.arg)}}}function T(t,n){var r=n.method,i=t.iterator[r];if(i===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,T(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),m;var o=f(i,t.iterator,n.arg);if("throw"===o.type)return n.method="throw",n.arg=o.arg,n.delegate=null,m;var a=o.arg;return a?a.done?(n[t.resultName]=a.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,m):a:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,m)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function x(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function I(t){if(t||""===t){var n=t[a];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,o=function n(){for(;++i<t.length;)if(r.call(t,i))return n.value=t[i],n.done=!1,n;return n.value=e,n.done=!0,n};return o.next=o}}throw new TypeError(Qe(t)+" is not iterable")}return g.prototype=b,i(j,"constructor",{value:b,configurable:!0}),i(b,"constructor",{value:g,configurable:!0}),g.displayName=u(b,l,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===g||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,u(e,l,"GeneratorFunction")),e.prototype=Object.create(j),e},t.awrap=function(e){return{__await:e}},S(P.prototype),u(P.prototype,c,(function(){return this})),t.AsyncIterator=P,t.async=function(e,n,r,i,o){void 0===o&&(o=Promise);var a=new P(s(e,n,r,i),o);return t.isGeneratorFunction(n)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},S(j),u(j,l,"Generator"),u(j,a,(function(){return this})),u(j,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=I,x.prototype={constructor:x,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(_),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function i(r,i){return c.type="throw",c.arg=t,n.next=r,i&&(n.method="next",n.arg=e),!!i}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],c=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var l=r.call(a,"catchLoc"),u=r.call(a,"finallyLoc");if(l&&u){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(l){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else{if(!u)throw Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===e||"continue"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o.finallyLoc,m):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),m},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),m}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;_(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:I(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),m}},t}function Xe(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Je(r.key),r)}}function Je(e){var t=function(e,t){if("object"!=Qe(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=Qe(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Qe(t)?t:t+""}function et(e,t,n){return t=rt(t),function(e,t){if(t&&("object"==Qe(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,tt()?Reflect.construct(t,n||[],rt(e).constructor):t.apply(e,n))}function tt(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(tt=function(){return!!e})()}function nt(){return nt="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=rt(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},nt.apply(null,arguments)}function rt(e){return rt=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},rt(e)}function it(e,t){return it=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},it(e,t)}re.Z.registerPlugin("interactiveSeekBarPlugin",qe);var ot=function(e){function t(e,n){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),et(this,t,[e,n])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&it(e,t)}(t,e),n=t,r=[{key:"getPlayerClassName",value:function(){return"cv-reports-player"}},{key:"getAnalyticsPlayerType",value:function(){return"reports-player"}},{key:"additionalSetup",value:function(e){var n,r,i,o,a=this,c=Object.create(null,{additionalSetup:{get:function(){return e=t,"additionalSetup",n=a,nt(rt(1&1?e.prototype:e),"additionalSetup",n);var e,n}}});return n=this,r=void 0,i=void 0,o=Ye().mark((function t(){return Ye().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:c.additionalSetup.call(this,e),this.setupEngagementOverlayPlugin(e),this.setupUpClipPlugin(e),this.setupInteractiveSeekBarPlugin(e);case 4:case"end":return t.stop()}}),t,this)})),new(i||(i=Promise))((function(e,t){function a(e){try{l(o.next(e))}catch(e){t(e)}}function c(e){try{l(o.throw(e))}catch(e){t(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(a,c)}l((o=o.apply(n,r||[])).next())}))}},{key:"setupEngagementOverlayPlugin",value:function(e){var t;this.player.engagementOverlayPlugin({heatMap:this.options.heatMap,interactive:null===(t=e.additionalData)||void 0===t?void 0:t.interactive,onTimepointHover:this.options.onTimepointHover})}},{key:"setupUpClipPlugin",value:function(e){var t,n,r="MasterClip"===e.mediaType,i="MasterInteractive"===e.mediaType;if((r||i)&&(r&&(n=e.additionalData),!i||(n=null===(t=e.additionalData)||void 0===t?void 0:t.clipData))){if(!n)throw Error("Invalid clip data");this.player.clipPlugin({startTime:n.startTime,endTime:n.endTime})}}},{key:"setupInteractiveSeekBarPlugin",value:function(e){var t,n,r=null===(t=e.additionalData)||void 0===t?void 0:t.interactive;(null===(n=e.additionalData)||void 0===n?void 0:n.interactive)&&(this.track=ne.h.getInteractiveTrack(this.player,e),this.player.interactiveSeekBarPlugin({interactive:r}))}},{key:"getSeekBarOptions",value:function(){return{ignoreChapters:!0}}}],r&&Xe(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(te.r);function at(e){var t=r.useRef(),n=r.useRef();return r.useEffect((function(){n.current=new ot(t.current,e)}),[]),r.createElement("div",{ref:t})}const ct={playerContainer:"hXVIx",playerPlaceholder:"fhZb2",heatMap:"PP9cQ",heatMapTimepointIndicator:"kQ5NO",heatMapTimepointIndicatorVisible:"J1dev",partialLoadingContainer:"xEqEk"};var lt=c.T.encloseNamespace("shared.videoEngagementOverlay");function ut(e){var t=r.useRef(),n=(0,ee.O)(e.engagement);return r.createElement("div",{className:"bg-white border border-light rounded overflow-hidden h-100"},r.createElement("div",{className:"position-relative"},r.createElement("div",{className:ct.playerPlaceholder}),r.createElement("div",{className:ct.playerContainer},r.createElement(at,{viewKey:e.viewKey,playerApi:new URL(e.playerApiUrl),hotkeyElQuerySelector:"body",heatMap:n,onTimepointHover:function(e){var r=t.current;r&&(null!==e?(r.classList.add(ct.heatMapTimepointIndicatorVisible),r.style.left="".concat(e/n.length*100,"%")):r.classList.remove(ct.heatMapTimepointIndicatorVisible))},aspectRatio:"16:9"}))),r.createElement("div",{className:"p-3"},r.createElement("div",{className:"position-relative"},r.createElement(l.c,{engagement:e.engagement,className:ct.heatMap}),r.createElement("div",{ref:t,className:ct.heatMapTimepointIndicator})),r.createElement("div",{className:"d-flex justify-content-between mt-2"},r.createElement("strong",null,lt("heatmap")),r.createElement("div",{className:"w-33"},r.createElement(l.l,null)))))}var st=n(5672),ft=n(83590);function pt(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}function yt(e){var t,n,a,c,l,u,s=(l=(0,i.D)(J.y.ANONYMISE_USERS),u=1,function(e){if(Array.isArray(e))return e}(l)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o,a,c=[],l=!0,u=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=o.call(n)).done)&&(c.push(r.value),c.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(u)throw i}}return c}}(l,u)||function(e,t){if(e){if("string"==typeof e)return pt(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)?pt(e,t):void 0}}(l,u)||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],f=o.a.useBasicFetch(q.N.currentUser()),p=Y.M.getVideoRequest(e.videoId,e.typeId),y=o.a.useBasicFetch(p),d=o.a.useBasicFetch(W.L.config()),h=z.B.getAudienceAppLinkParams(),m=z.B.getDateRangeAppLinkParams(),v=Object.assign(Object.assign({},(0,Z.wO)((0,Z.Hb)(),m)),(0,V.K)(h)),g=o.a.useBasicFetch(Q.u.aggregateEngagement(e.videoId,v,f.data.id)),b=o.a.useBasicFetch(f.data&&Q.u.individualEngagement(e.videoId,v,null===(t=f.data)||void 0===t?void 0:t.id)),O=(0,H.U)(null===(a=null===(n=b.data)||void 0===n?void 0:n.data)||void 0===a?void 0:a.map((function(e){return e.userId}))),E=O.users,j=O.isLoading,S=o.a.useBasicFetch(Q.u.views(v,e.videoId)),P=o.a.useBasicFetch($.k.createViewKey(e.videoId,K.f.MasterObject)),C=f.data&&S.data&&y.data&&g.data&&P.data,k=!(!b.data||b.data.data.length&&j);if(!C)return r.createElement(r.Fragment,null);var _,x,I=Object.assign(Object.assign({},h),m);return r.createElement("div",{className:"px-3"},r.createElement(ft.m,{video:y.data,audienceAppLinkParams:h,dateRangeAppLinkParams:m,tabs:e.typeId===G.E.Interactive?(0,st.kj)(e.videoId,"heatmap",I):e.typeId===G.E.Clip?(0,st.$o)(e.videoId,"heatmap",I):(0,st.$6)(e.videoId,"heatmap",I)}),r.createElement("div",{className:"row g-2"},r.createElement("div",{className:"col-12 col-lg-3"},r.createElement(U,{events:S.data,emptyStateImage:X.W.EmptyStates.MY_VIDEOS})),r.createElement("div",{className:"col-12 col-lg-3"},r.createElement(T,{engagement:g.data,params:h})),r.createElement("div",{className:"col-12 col-lg-6"},r.createElement(ut,{engagement:g.data,viewKey:P.data.viewKey,playerApiUrl:d.data.playerApiUrl,imageCdnUrl:d.data.imageCdnUrl})),k&&r.createElement(w,{key:(_=Object.assign(Object.assign({},h),m),x=[],Object.keys(_).forEach((function(e){var t=_[e];t&&x.push("".concat(e,":").concat(Array.isArray(t)?t.join(","):t))})),x.join(":")),engagement:b.data.data,users:E,imageCdnUrl:null===(c=d.data)||void 0===c?void 0:c.imageCdnUrl,anonymiseUsers:s})))}},16852:(e,t,n)=>{var r=n(93861);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){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,a(r.key),r)}}function a(e){var t=function(e,t){if("object"!=i(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=i(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}function c(e,t,n){return t=s(t),function(e,t){if(t&&("object"==i(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,l()?Reflect.construct(t,n||[],s(e).constructor):t.apply(e,n))}function l(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(l=function(){return!!e})()}function u(){return u="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=s(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},u.apply(null,arguments)}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}var p=function(e){function t(e,n){var r;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),r=c(this,t,[e]),void 0===n.startTime)throw Error("Invalid clip start");if(void 0===n.endTime)throw Error("Invalid clip end");if(n.startTime>n.endTime)throw Error("Clip start cannot be greater than clip end");return r._clipStart=parseFloat(n.startTime.toPrecision(4)),r._clipEnd=parseFloat(n.endTime.toPrecision(4)),r.playerEndedFn=r.player.ended.bind(e),r.playerDurationFn=r.player.duration.bind(e),r.playerCurrentTimeFn=r.player.currentTime.bind(e),r.playerbufferedFn=r.player.buffered.bind(e),r.player.ended=r.ended.bind(r),r.player.duration=r.duration.bind(r),r.player.currentTime=r.currentTime.bind(r),r.player.buffered=r.buffered.bind(r),r.initialize(),r.player.ready((function(){r.player.trigger("durationchange")})),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&f(e,t)}(t,e),n=t,i=[{key:"clipStart",get:function(){var e=this.playerDurationFn();return this._clipStart>e?e:this._clipStart}},{key:"clipEnd",get:function(){var e=this.playerDurationFn();return e<=0?this._clipEnd:this._clipEnd>e?e:this._clipEnd}},{key:"dispose",value:function(){var e,n,r;this.player.off("timeupdate",this.onTimeUpdate),this.player.off("play",this.onPlay),this.player.ended=this.playerEndedFn,this.player.duration=this.playerDurationFn,this.player.currentTime=this.playerCurrentTimeFn,this.player.buffered=this.playerbufferedFn,this.player.trigger("durationchange"),(e=t,"dispose",n=this,r=u(s(1&3?e.prototype:e),"dispose",n),function(e){return r.apply(n,e)})([])}},{key:"initialize",value:function(){this.onTimeUpdate=this.onTimeUpdate.bind(this),this.onPlay=this.onPlay.bind(this),this.player.on("timeupdate",this.onTimeUpdate),this.player.on("play",this.onPlay)}},{key:"onPlay",value:function(){this._isEnded&&this.player.currentTime(0)}},{key:"onTimeUpdate",value:function(){var e=this.getCurrentTime(!1);e>this.clipEnd?this._isEnded||(this.player.pause(),this.player.trigger("ended"),this._isEnded=!0):(this._isEnded=!1,e<this.clipStart-10&&this.playerCurrentTimeFn(this.clipStart,!0))}},{key:"ended",value:function(){return this.getCurrentTime(!1)>this.clipEnd}},{key:"duration",value:function(e){return e&&e>0&&(this.playerDurationFn()?console.info("The duration of the player has already been set. This is a no-op."):this.playerDurationFn(e)),this.clipEnd-this.clipStart}},{key:"currentTime",value:function(e){if("number"!=typeof e)return this.getCurrentTime(!0);for(var t=e+this.clipStart,n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];this.playerCurrentTimeFn(t,r)}},{key:"getCurrentTime",value:function(e){var t=this.playerCurrentTimeFn(),n=0;return t>=this.clipStart&&(n=t-this.clipStart),this.player.getCache().currentTime=n,e?n:t}},{key:"buffered",value:function(){for(var e=this.playerbufferedFn(),t=[],n=0;n<e.length;n++)t[n]=[Math.max(0,e.start(n)-this.clipStart),Math.min(Math.max(0,e.end(n)-this.clipStart),this.player.duration())];return r.Z.createTimeRanges(t)}}],i&&o(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,i}(r.Z.getPlugin("plugin"));r.Z.registerPlugin("clipPlugin",p)},90915:(e,t,n)=>{n.d(t,{N:()=>P});var r=n(93861),i=n(84120);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,c(r.key),r)}}function c(e){var t=function(e,t){if("object"!=o(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}function l(e,t,n){return t=p(t),function(e,t){if(t&&("object"==o(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,u()?Reflect.construct(t,n||[],p(e).constructor):t.apply(e,n))}function u(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(u=function(){return!!e})()}function s(e,t,n,r){var i=f(p(1&r?e.prototype:e),t,n);return 2&r?function(e){return i.apply(n,e)}:i}function f(){return f="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=p(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},f.apply(null,arguments)}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function y(e,t){return y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},y(e,t)}var d=function(e){function t(e,n){var r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=l(this,t,[e,n])).timepoint_=n.timepoint,r.time_=n.timepoint.visibleAt/1e3;var o=n.timepoint.interactions[0];o||r.hide();var a=i.w.getTypeInfo(o.typeId).bgClassName;return r.$(".vjs-icon-placeholder").classList.add(a),r.controlText(o.name),r.update(),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&y(e,t)}(t,e),n=t,r=[{key:"buildCSSClass",value:function(){return"cv-interactive-bar-item ".concat(s(t,"buildCSSClass",this,3)([]))}},{key:"createEl",value:function(e,n,r){return s(t,"createEl",this,3)([e,Object.assign(Object.assign({},n),{className:this.buildCSSClass()}),Object.assign(Object.assign({},r),{tabIndex:0})])}},{key:"update",value:function(){var e=this.player_.duration(),t=this.time_/e;this.el().style.left=100*t+"%",t>100||t<0?this.hide():this.show()}},{key:"handleClick",value:function(e){e.stopPropagation(),this.player_.currentTime(this.time_)}}],r&&a(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(r.Z.getComponent("Button"));function h(e){return h="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},h(e)}function m(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}function v(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,g(r.key),r)}}function g(e){var t=function(e,t){if("object"!=h(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=h(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==h(t)?t:t+""}function b(e,t,n){return t=j(t),function(e,t){if(t&&("object"==h(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,w()?Reflect.construct(t,n||[],j(e).constructor):t.apply(e,n))}function w(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(w=function(){return!!e})()}function O(e,t,n,r){var i=E(j(1&r?e.prototype:e),t,n);return 2&r?function(e){return i.apply(n,e)}:i}function E(){return E="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=j(e)););return e}(e,t);if(r){var i=Object.getOwnPropertyDescriptor(r,t);return i.get?i.get.call(arguments.length<3?e:n):i.value}},E.apply(null,arguments)}function j(e){return j=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},j(e)}function S(e,t){return S=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},S(e,t)}var P=function(e){function t(e,n){var r;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(r=b(this,t,[e,n])).track_=n.track,r.interactive_=n.interactive,r.onDurationChange=r.onDurationChange.bind(r),r.createInteractionItems=r.createInteractionItems.bind(r),r.createInteractionItems(),r.track_.on("cv:cuechange",r.createInteractionItems),r.player_.on("durationchange",r.onDurationChange),r.player_.on("dispose",(function(){r.track_.off("cv:cuechange"),r.player_.off("durationchange",r.onDurationChange)})),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&S(e,t)}(t,e),n=t,r=[{key:"buildCSSClass",value:function(){return"cv-interactive-bar-items ".concat(O(t,"buildCSSClass",this,3)([]))}},{key:"createEl",value:function(e,n,r){return O(t,"createEl",this,3)([e,Object.assign(Object.assign({},n),{className:this.buildCSSClass()}),r])}},{key:"update",value:function(){this.children_.forEach((function(e){e.update()}))}},{key:"createInteractionItems",value:function(){var e,t=this;if(this.track_){(function(e){return function(e){if(Array.isArray(e))return m(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return m(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)?m(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()})(this.children_).forEach((function(e){t.removeChild(e)}));for(var n=0;n<this.track_.cues.length;n++){var r=this.track_.cues[n],i=this.getTimepointById(r.text);i&&(null===(e=i.interactions)||void 0===e?void 0:e.length)&&this.addChild(new d(this.player_,{timepoint:i}))}}}},{key:"onDurationChange",value:function(){this.update()}},{key:"getTimepointById",value:function(e){var t;return null===(t=this.interactive_.timepoints)||void 0===t?void 0:t.find((function(t){return t.id.toString()===e.toString()}))}}],r&&v(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(r.Z.getComponent("Component"))},41386:(e,t,n)=>{n.d(t,{h:()=>r});var r={getInteractiveTrack:function(e,t){var n,r=e.addTextTrack("metadata","interactive"),i=t.additionalData.interactive,o=null===(n=t.additionalData.clipData)||void 0===n?void 0:n.startTime;return i.timepoints.forEach((function(e){var t,n=e.visibleAt/1e3,i=e.visibleFor?n+e.visibleFor/1e3:n+1;o&&(n+=o,i+=o),(null===(t=e.interactions)||void 0===t?void 0:t.length)&&r.addCue({startTime:Math.max(.001,n-.001),endTime:i,text:e.id})})),r}}},41400:()=>{}}]);
3
- //# sourceMappingURL=5817-900efca702-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/5817-900efca702-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/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/flight-requests/VideoViewRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/engagement-table.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/EngagementTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-table/EngagementTable.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PartialPercentageIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/amount-watched/InsightAmountWatched.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/ChartColourUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/SharedUserActivityPieChartUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/components/insights/total-views/InsightTotalViews.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item.ts","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay-chart-options.tsx","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay.ts","file:///app/packages/projects/player/src/plugins/engagement-overlay-plugin/engagement-overlay-plugin.ts","file:///app/packages/projects/player/src/plugins/interactive-plugin/interactive-seek-bar-plugin.ts","file:///app/packages/projects/player/src/players/reports/reports-player.ts","file:///app/packages/projects/player/src/react/ReportsPlayer.tsx","file:///app/packages/projects/lite/src/apps/insights/components/video-engagement-overlay/video-engagement-overlay.scss","file:///app/packages/projects/lite/src/apps/insights/components/video-engagement-overlay/VideoEngagementOverlay.tsx","file:///app/packages/projects/lite/src/apps/insights/views/heatmap/InsightsHeatmapView.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/FilterParamUtils.ts","file:///app/packages/projects/player/src/plugins/clip-plugin/clip-plugin.ts","file:///app/packages/projects/player/src/plugins/interactive-plugin/components/seek-bar/interactive-bar-item.ts","file:///app/packages/projects/player/src/plugins/interactive-plugin/components/seek-bar/interactive-bar-items.ts","file:///app/packages/projects/player/src/utils/interactive-track-helper.ts"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border border-light rounded p-3 h-100'>\n <div className='d-flex align-items-center mb-2'>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex align-items-center justify-content-center`}>\n <SvgContainer svgName={props.svgName} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n {props.subtitle && <p className='text-secondary font-size-sm mb-0'>{props.subtitle}</p>}\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n return (new Array(Math.ceil(engagement.videoDuration))).fill(null).map((t, idx) => engagement.heatMap[idx] || 0);\n}","import { Xhr } from 'libs/common/backbone/interfaces/Xhr';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsRequestFilter, Engagement, IndividualEngagementResponse } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: IndividualEngagementResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n success?: (data: Engagement) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false,\n success,\n error,\n always\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n success?: (data: VideoViewEventResponse) => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let baseKey = 'video:views';\n\n if (objectId)\n baseKey += `:${objectId}`;\n\n const queryParams: HashObject = {\n objectId,\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(baseKey, filter, sharerId),\n normalize: false,\n success,\n error,\n always\n };\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"rwDjh\",\"avatarContainer\":\"kW4ZM\"};","import React from 'react';\nimport { Column, ColumnInstance, Row } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Engagement, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './engagement-table.scss';\n\nconst namespace = 'shared.engagementTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<EngagementTableData>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={`d-inline-block ${props.column.isSorted ? 'fw-bold' : ''}`}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport interface EngagementTableData extends Engagement {\n user: User;\n}\n\nfunction getMaxHeatMapValue(engagement: Engagement[]): number {\n let max = 0;\n\n engagement.forEach(e => {\n const localMax = Math.max(...e.heatMap);\n\n if (localMax > max)\n max = localMax;\n });\n\n return max;\n}\n\nfunction getUsersName(user: User, anonymiseUsers: boolean) {\n const fullName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = fullName.split(' ').filter(n => !!n);\n\n return {\n name: nameParts[0],\n surname: nameParts.slice(1).join(' ')\n };\n}\n\ninterface EngagementColumnProps {\n engagement: Engagement[],\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function useGetColumns(props: EngagementColumnProps): Column<EngagementTableData>[] {\n return React.useMemo(() => {\n const maxHeatMapValue = getMaxHeatMapValue(props.engagement);\n\n return [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n width: 22,\n accessor: 'user',\n sortType: (rowA: Row<EngagementTableData>, rowB: Row<EngagementTableData>) => {\n const nameA = anonymiseUserName(rowA.values.user, props.anonymiseUsers);\n const nameB = anonymiseUserName(rowB.values.user, props.anonymiseUsers);\n\n return nameA > nameB ? 1 : -1;\n },\n Cell: ({ value }) => {\n const { name, surname } = getUsersName(value, props.anonymiseUsers);\n return (\n <CellWrapper className='d-flex align-items-center h-100'>\n <span className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n imageUrl={!props.anonymiseUsers ? value.avatar?.url : null}\n />\n </span>\n <span className={'ms-2 clamp-1'}>\n {name} {surname}\n </span>\n </CellWrapper>\n );\n }\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='views' />,\n accessor: 'viewCount',\n width: 15,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <div>{value}</div>\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='engagement' />,\n accessor: 'engagementRate',\n width: 20,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n Cell: ({ value }) => (\n <CellWrapper className='w-33'>\n <PercentageIndicator\n percentage={value}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n </CellWrapper>\n )\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='heatMap' />,\n accessor: 'heatMap',\n width: 48,\n disableSortBy: true,\n Cell: ({ row: { original } }) => (\n <CellWrapper className='d-flex align-items-center h-100'>\n <EngagementHeatMap\n engagement={original}\n max={maxHeatMapValue}\n className={`${styles.heatMap} flex-grow-1`}\n />\n </CellWrapper>\n )\n }\n ];\n }, [props.anonymiseUsers]);\n}\n\nexport function useGetTableData(\n engagement: Engagement[],\n users?: User[]\n): EngagementTableData[] {\n return React.useMemo(() => {\n const data: EngagementTableData[] = [];\n\n engagement.forEach(e => {\n const user = users?.find(u => u.id === e.userId);\n\n // Omit deleted users\n if (user)\n data.push({ ...e, user });\n });\n\n return data;\n }, [users?.length]);\n}","import React from 'react';\n\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { User } from 'libs/shared/interfaces';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { useGetColumns, useGetTableData } from './EngagementTableUtils';\n\nconst theme: TableTheme = {\n table: 'bg-white border border-light rounded px-0',\n header: 'border-bottom',\n headerCell: 'm-3',\n cell: 'mx-3 my-2'\n};\n\ninterface EngagementTableProps {\n engagement: Engagement[];\n imageCdnUrl: string;\n users?: User[];\n anonymiseUsers: boolean;\n}\n\nexport function EngagementTable(props: EngagementTableProps): JSX.Element {\n const columns = useGetColumns({\n engagement: props.engagement,\n imageCdnUrl: props.imageCdnUrl,\n anonymiseUsers: props.anonymiseUsers\n });\n\n const data = useGetTableData(props.engagement, props.users);\n\n if (!data.length)\n return <></>;\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={theme}\n enableSort\n />\n );\n}","import React from 'react';\n\nimport { PercentageIndicator, PercentageIndicatorLayout } from './PercentageIndicator';\n\ninterface PartialPercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n className?: string;\n}\n\nexport function PartialPercentageIndicator(props: PartialPercentageIndicatorProps): JSX.Element {\n return (\n <PercentageIndicator\n layout={props.layout}\n className={props.className}\n percentage={0}\n customLabel='--%'\n />\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\nimport { PartialPercentageIndicator } from 'libs/shared/components/percentage-indicator/PartialPercentageIndicator';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightAmountWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAmountWatchedProps {\n engagement: Engagement;\n params: FilterQueryParams;\n}\n\nexport function InsightAmountWatched(props: InsightAmountWatchedProps) {\n const engagementRate = props.engagement?.engagementRate > 0 ? props.engagement.engagementRate : null;\n const percentage = Math.round(props.engagement.engagementRate * 100);\n\n const everyoneSelected = !props.params.users\n && !props.params.classrooms\n && !props.params.classroomGroups;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='d-flex flex-column align-items-center my-auto'>\n {!!props.engagement &&\n <>\n <PercentageIndicator\n percentage={engagementRate}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n <p className='ms-2'>\n {typeof engagementRate === 'number'\n ? everyoneSelected ?\n <Text namespace={namespace} phrase='everyoneWatched' options={{ percentage }} />\n : <Text namespace={namespace} phrase='usersWatched' options={{ percentage }} />\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n </>\n }\n {!props.engagement &&\n <>\n <PartialPercentageIndicator layout={PercentageIndicatorLayout.LabelInside} />\n </>\n }\n </div>\n </InsightCard>\n );\n}","const CHART_COLOURS = [\n '#FF9300', // Pizazz\n '#38A2E8', // Picton Blue\n '#7A76E8', // Portage\n '#B679C7', // East Side\n '#F7847B', // Froly\n '#D9584F', // Red (Not in the Primary palette)\n '#FFCD52', // Yellow (Not in the Primary Palette)\n '#5DC786', // Emerald\n '#40BCC3', // Perolous\n '#40C2BB' // Puerto rico\n];\n\nexport function mixinSeriesColours<T>(data: T[]): T[] {\n return data.map((d, idx) => ({\n ...d,\n color: CHART_COLOURS[idx % CHART_COLOURS.length]\n }));\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { BaseAnalyticsEventResponse, GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { UnionEventResponse } from 'libs/shared/apps/analytics/interfaces/UnionEvent';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { mixinSeriesColours } from 'libs/shared/apps/analytics/utils/ChartColourUtils';\n\ntype EventResponseGroupByAttributes = keyof Pick<VideoViewEventResponse, 'contentTypeCount'>\n | keyof Pick<BaseAnalyticsEventResponse, 'userTypeCount' | 'yearGroupCount'>;\n\nexport function groupEvents(\n events: UnionEventResponse,\n groupBy: EventResponseGroupByAttributes,\n groupsToOmit?: string[],\n getSeriesName?: (group: string) => string\n): Highcharts.PointOptionsObject[] {\n const groups: HashObject<number> = {};\n\n const eventCounts = events[groupBy as keyof UnionEventResponse] as GroupedAnalyticsCount[];\n\n eventCounts?.forEach(ev => {\n if (!ev.name || groupsToOmit?.includes(ev.name.toLowerCase()))\n return;\n\n groups[ev.name] = groups[ev.name] ?? 0;\n groups[ev.name] += ev.count;\n });\n\n return mixinSeriesColours(ArrayHelper.sortBy(Object.keys(groups).map(group => ({\n name: getSeriesName ? getSeriesName(group) : group,\n y: groups[group],\n type: 'pie'\n })), 'name'));\n}\n\n// make sure 'Year 11' comes after 'Year 2', will not reorder when the year group name dose not follow 'Year {number}' pattern\nexport function sortByYearGroup(data: Highcharts.PointOptionsObject[]) {\n const copied = [...data];\n\n copied.sort((a, b) => {\n const numberA = getYearGroupNumber(a.name.toString());\n const numberB = getYearGroupNumber(b.name.toString());\n if (Number.isNaN(numberA) || Number.isNaN(numberB))\n return (+a.name) - (+b.name);\n\n return numberA - numberB;\n });\n\n return copied;\n}\n\nexport function getTotalEventCount(data?: Highcharts.PointOptionsObject[]): number | null {\n return data?.reduce((a, b) => a + b.y, 0) ?? null;\n}\n\nfunction getYearGroupNumber(name: string): number {\n return +name.split(' ')[1];\n}","import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { getTotalEventCount, groupEvents, sortByYearGroup } from 'libs/shared/apps/analytics/utils/SharedUserActivityPieChartUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightTotalViews';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n chart: {\n backgroundColor: 'transparent',\n spacing: [ 0, 0, 0, 0 ]\n },\n plotOptions: {\n pie: {\n allowPointSelect: true,\n cursor: 'pointer',\n dataLabels: {\n enabled: false\n },\n showInLegend: true,\n borderWidth: 0,\n size: '60%'\n }\n }\n};\n\ninterface InsightTotalViewsProps {\n events: VideoViewEventResponse;\n emptyStateImage: string;\n}\n\nexport function InsightTotalViews(props: InsightTotalViewsProps) {\n const chartData = sortByYearGroup(groupEvents(props.events, 'yearGroupCount', [], getSeriesName));\n const totalViews = getTotalEventCount(chartData);\n\n function getChartOptions(\n data: Highcharts.PointOptionsObject[]\n ): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n series: [{\n type: 'pie',\n name: 'views',\n data\n }]\n };\n }\n\n function getSeriesName(group: string): string {\n return group === 'Unknown' ? 'Staff' : group;\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n // Replace with ultra marine + light colour\n svgClassName='bg-light-blue text-blue'\n // Add visibility icon \n svgName={cvSvgLibrary.VisibleOn}\n >\n {chartData?.length ? (\n <>\n <p className='mb-0'><Text namespace={namespace} phrase='totalViews' options={{ totalViews }} /></p>\n\n <div className='d-flex justify-content-center h-75'>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions(chartData)}\n containerProps={{\n className: `w-100`\n }}\n />\n </div>\n </>\n ) : (\n <EmptyState className='pt-0'>\n <EmptyState.Image src={props.emptyStateImage} size='small'></EmptyState.Image>\n <EmptyState.Heading className='h3'><Text namespace={namespace} phrase='noViews' /></EmptyState.Heading>\n <EmptyState.Info><Text namespace={namespace} phrase='notWatched' /></EmptyState.Info>\n </EmptyState>\n )}\n </InsightCard>\n );\n}","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\ninterface EngagementOverlayMenuItemOptions extends videojs.MenuItemOptions {\n overlayVisible: boolean\n}\n\nexport class EngagementOverlayMenuItem extends MenuItem {\n private toggleEl: Element;\n private overlayVisible: boolean;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayMenuItemOptions) {\n super(player, options);\n\n this.overlayVisible = options.overlayVisible;\n this.toggle(this.overlayVisible);\n }\n\n public handleToggle(): void {\n this.toggle(!this.overlayVisible);\n }\n\n private toggle(state: boolean): void {\n state ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n this.overlayVisible = true;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().addClass('cv-reports-player-overlay-visible');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n this.overlayVisible = false;\n this.player().engagementOverlayPlugin().toggleOverlay(this.overlayVisible);\n this.player().removeClass('cv-reports-player-overlay-visible');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Heat Map</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n}\n\nvideojs.registerComponent('EngagementOverlayMenuItem', EngagementOverlayMenuItem);\n","import React from 'react';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interactive } from 'libs/shared/interfaces';\n\nconst MAX_INTERACTIONS_TO_SHOW = 3;\n\ninterface TimepointInteractionsProps {\n interactive: Interactive;\n time: number;\n}\n\nexport function TimepointInteractions(props: TimepointInteractionsProps): JSX.Element {\n const timepoint = props.interactive.timepoints.find(t => {\n const timepointTime = t.visibleAt / 1000;\n \n return Math.floor(props.time) === Math.floor(timepointTime)\n || Math.ceil(props.time) === Math.ceil(timepointTime);\n });\n\n if (!timepoint?.interactions?.length)\n return <></>;\n\n const interactions = timepoint.interactions.length > MAX_INTERACTIONS_TO_SHOW\n ? timepoint.interactions.slice(0, MAX_INTERACTIONS_TO_SHOW - 1)\n : timepoint.interactions;\n\n const hiddenInteractions = timepoint.interactions.length - interactions.length;\n\n return (\n <div className='d-flex justify-content-end ms-2'>\n {interactions.map((i, idx) => (\n <InteractionLabel\n key={idx}\n interaction={i}\n showQuestion={false}\n iconClassName='ms-1'\n />\n ))}\n {!!hiddenInteractions &&\n <div\n className={'interaction-type-icon d-flex justify-content-center'\n + ' align-items-center border border-dark text-body ms-1'}\n >\n {`+${hiddenInteractions}`}\n </div>\n }\n </div>\n );\n}","import React from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport Highcharts from 'highcharts';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { TimepointInteractions } from 'projects/player/plugins/engagement-overlay-plugin/components/timepoint-interactions/timepoint-interactions';\nimport { formatTime } from 'projects/player/utils/formatTime';\n\nexport const STATIC_CHART_OPTIONS: Highcharts.Options = {\n title: {\n text: null\n },\n xAxis: {\n visible: false,\n minPadding: 0,\n maxPadding: 0\n },\n legend: {\n enabled: false\n },\n credits: {\n enabled: false\n },\n defs: {\n gradient: ({\n tagName: 'linearGradient',\n id: 'area-gradient',\n x1: 0,\n y1: 1,\n x2: 0,\n y2: 0,\n children: [\n ({\n tagName: 'stop',\n offset: 0\n } as Highcharts.ASTNode),\n ({\n tagName: 'stop',\n offset: 1\n } as Highcharts.ASTNode)\n ]\n } as Highcharts.ASTNode)\n }\n};\n\nexport function getChartOptions(width: number, height: number): Highcharts.ChartOptions {\n return {\n styledMode: true,\n spacing: [ 15, 0, 0, 0 ],\n width,\n height\n };\n}\n\nexport function getYAxisChartOptions(heatMap: number[]): Highcharts.YAxisOptions {\n const maxValue = Math.max(...heatMap);\n\n return {\n /**\n * To prevent max values from being cut off, we pad them relative to the chart scale.\n */\n max: maxValue * 1.05,\n min: 0,\n minPadding: 0,\n maxPadding: 0,\n allowDecimals: true,\n startOnTick: false,\n endOnTick: false,\n visible: false\n };\n}\n\nexport function getTooltipOptions(interactive?: Interactive): Highcharts.TooltipOptions {\n return {\n formatter: function () {\n const timepointInteractionsHtml = interactive\n ? getTimepointInteractionsHtml(interactive, this.x)\n : '';\n\n return (\n '<div class=\"cv-engagement-tooltip bg-white rounded\">'\n + '<div class=\"d-flex justify-content-between\">'\n + `<strong>${formatTime(this.x)}</strong>`\n + `${timepointInteractionsHtml}`\n + '</div>'\n + '<div class=\"d-flex justify-content-between rounded bg-light cv-view-count-container\">'\n + `<strong>Views</strong> <span class=\"cv-view-count\">${this.y}</span>`\n + '</div>'\n + '</div>'\n );\n },\n positioner: function (\n labelWidth: number,\n labelHeight: number,\n point: Highcharts.TooltipPositionerPointObject\n ) {\n const minX = 0;\n const maxX = this.chart.plotWidth - labelWidth;\n const x = point.plotX - labelWidth / 2;\n \n return {\n // Clamp x between min and max\n x: Math.min(Math.max(x, minX), maxX),\n y: this.chart.plotTop\n };\n },\n useHTML: true,\n padding: 0\n };\n}\n\nexport function getPlotOptions(moveTimepointIndicator: (x: number | null) => void): Highcharts.PlotOptions {\n return {\n area: {\n point: {\n events: {\n mouseOver: function () {\n moveTimepointIndicator(this.x);\n },\n mouseOut: function () {\n moveTimepointIndicator(null);\n }\n }\n }\n },\n series: {\n marker: {\n enabled: false\n }\n }\n };\n}\n\nfunction getTimepointInteractionsHtml(interactive: Interactive, time: number): string {\n return renderToStaticMarkup(\n <TimepointInteractions time={time} interactive={interactive} />\n );\n}","import Highcharts from 'highcharts';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport {\n getChartOptions,\n getPlotOptions,\n getTooltipOptions,\n getYAxisChartOptions,\n STATIC_CHART_OPTIONS\n} from './engagement-overlay-chart-options';\n\nimport './engagement-overlay.scss';\n\nconst Component = videojs.getComponent('Component');\n\nHighcharts.AST.allowedTags.push('g');\nHighcharts.AST.allowedAttributes.push('viewBox', 'transform');\n\ninterface ChartDimensions {\n width: number;\n height: number;\n}\n\ninterface EngagementOverlayOptions extends videojs.ComponentOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class EngagementOverlay extends Component {\n public options_: EngagementOverlayOptions;\n private chart: Highcharts.Chart;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayOptions) {\n super(player, options);\n\n this.initialize();\n this.bindListeners();\n }\n\n public initialize(): void {\n this.player().ready(() => this.buildChart());\n }\n\n public buildCSSClass(): string {\n return 'cv-engagement-overlay';\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n const innerHTML = '<div class=\"cv-engagement-chart\"></div>'\n + '<div class=\"cv-engagement-timepoint-indicator\"></div>';\n\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML\n }, attributes);\n }\n\n public toggleChart(show: boolean): void {\n if (show)\n this.buildChart();\n else\n this.destroyChart();\n }\n\n private bindListeners(): void {\n this.handleClick = this.handleClick.bind(this);\n this.resizeChart = this.resizeChart.bind(this);\n\n this.player().on('playerresize', this.resizeChart);\n\n this.on(this.el(), 'mouseup', this.handleClick);\n\n this.player().on('dispose', () => {\n this.player().off('playerresize', this.resizeChart);\n\n this.off(this.el(), 'mouseup', this.handleClick);\n });\n }\n\n private handleClick(event: videojs.EventTarget.Event): void {\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n if (this.player().paused()) {\n this.player().play();\n return;\n }\n\n this.player().pause();\n }\n\n private buildChart(): void {\n if (this.chart)\n return;\n\n const chartDimensions = this.getChartDimensions();\n\n /**\n * The dimensions calculation relies on the control bar and progress control\n * being visible, so if it isn't, we wait for the play event.\n */\n if (!chartDimensions) {\n this.player().one('play', () => this.buildChart());\n return;\n }\n\n const container: HTMLElement = this.el().querySelector('.cv-engagement-chart');\n\n this.chart = Highcharts.chart(container, this.getHighchartOptions(chartDimensions));\n }\n\n private resizeChart(): void {\n const chartDimensions = this.getChartDimensions();\n\n if (!this.chart || !chartDimensions)\n return;\n\n this.chart.setSize(chartDimensions.width, chartDimensions.height);\n }\n\n private destroyChart(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n\n private getChartDimensions(): ChartDimensions {\n const collapserator = this.player().getChild('collapserator');\n const collapseratorHeight = collapserator?.currentHeight();\n\n const width = this.el().clientWidth;\n\n if (!collapseratorHeight || !width)\n return null;\n\n const { height } = this.player().currentDimensions();\n \n return {\n width,\n height: height - collapseratorHeight\n };\n }\n\n private getHighchartOptions({ width, height }: ChartDimensions): Highcharts.Options {\n return {\n ...STATIC_CHART_OPTIONS,\n chart: getChartOptions(width, height),\n yAxis: getYAxisChartOptions(this.options_.heatMap),\n tooltip: getTooltipOptions(this.options_.interactive),\n plotOptions: getPlotOptions(this.moveTimepointIndicator.bind(this)),\n series: [{\n type: 'area',\n data: this.options_.heatMap\n }]\n };\n }\n\n private moveTimepointIndicator(x: number | null): void {\n if (this.options_.onTimepointHover)\n this.options_.onTimepointHover(x);\n\n const indicator: HTMLDivElement = this.el().querySelector('.cv-engagement-timepoint-indicator');\n\n if (x === null) {\n videojs.dom.removeClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n return;\n }\n\n videojs.dom.addClass(indicator, 'cv-engagement-timepoint-indicator-visible');\n indicator.style.left = `${x / this.options_.heatMap.length * 100}%`;\n }\n}\n\nvideojs.registerComponent('EngagementOverlay', EngagementOverlay);","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { EngagementOverlay } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\nimport { EngagementOverlayMenuItem } from 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay-menu-item/engagement-overlay-menu-item';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/components/engagement-overlay/engagement-overlay';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface EngagementOverlayPluginOptions {\n heatMap: number[];\n interactive?: Interactive;\n onTimepointHover?: (time: number | null) => void;\n}\n\nclass EngagementOverlayPlugin extends Plugin {\n private options: EngagementOverlayPluginOptions;\n\n constructor(player: VideoJsPlayer, options: EngagementOverlayPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if (!this.hasHeatMapData())\n return;\n\n this.player.addChild('engagementOverlay', {\n heatMap: this.options.heatMap,\n interactive: this.options.interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({\n index: 0,\n ctor: EngagementOverlayMenuItem,\n name: 'EngagementOverlayMenuItem',\n options: { overlayVisible: true }\n });\n }\n\n public toggleOverlay(show: boolean): void {\n const engagementOverlay = this.player.getChild('engagementOverlay') as EngagementOverlay;\n engagementOverlay?.toggleChart(show);\n }\n\n private hasHeatMapData(): boolean {\n return this.options.heatMap?.reduce((acc, val) => acc + val, 0) > 0;\n }\n}\n\nvideojs.registerPlugin('engagementOverlayPlugin', EngagementOverlayPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n engagementOverlayPlugin(options?: EngagementOverlayPluginOptions): EngagementOverlayPlugin;\n }\n}","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItems } from 'projects/player/plugins/interactive-plugin/components/seek-bar/interactive-bar-items';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport './interactive-plugin-styles.scss';\n\nconst Plugin = videojs.getPlugin('plugin');\n\ninterface InteractiveSeekBarPluginOptions {\n interactive: Interactive;\n}\n\n/**\n * This plugin will just render the interactive seek bar (i.e. just the interaction markers).\n * The user won't be able to interact with any of the interactions.\n * Currently this is just used in reports-player\n */\nclass InteractiveSeekBarPlugin extends Plugin {\n private options: InteractiveSeekBarPluginOptions;\n\n constructor(player: VideoJsPlayer, options: InteractiveSeekBarPluginOptions) {\n super(player);\n\n this.options = options;\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initialize.bind(this)));\n }\n\n private initialize(): void {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n TrackHelper.useTrack(this.player, 'metadata', 'interactive', this.onTrackLoaded.bind(this));\n\n this.player.addClass('cv-interactive-plugin');\n }\n\n private onTrackLoaded(track: TextTrack): void {\n this.addChildren(track);\n }\n\n private addChildren(track: TextTrack): void {\n const seekBar = this.player.controlBar.getChild('progressControl').getChild('SeekBar');\n\n seekBar.addChild(new InteractiveBarItems(this.player, {\n interactive: this.options.interactive,\n track\n }));\n }\n}\n\nvideojs.registerPlugin('interactiveSeekBarPlugin', InteractiveSeekBarPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n interactiveSeekBarPlugin(options?: InteractiveSeekBarPluginOptions): InteractiveSeekBarPlugin;\n }\n}","import { Interactive } from 'libs/shared/interfaces';\n\nimport { ClipData } from 'projects/player/interfaces/models/ClipData';\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\nimport { BasePlayer, BasePlayerOptions } from 'projects/player/players/base-player';\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\nimport { InteractiveTrackHelper } from 'projects/player/utils/interactive-track-helper';\n\nimport './reports-player.scss';\n\nimport 'projects/player/plugins/engagement-overlay-plugin/engagement-overlay-plugin';\nimport 'projects/player/plugins/clip-plugin/clip-plugin';\nimport 'projects/player/plugins/interactive-plugin/interactive-seek-bar-plugin';\n\nexport interface ReportsPlayerOptions extends BasePlayerOptions {\n heatMap: number[];\n onTimepointHover?: (time: number | null) => void;\n}\n\nexport class ReportsPlayer extends BasePlayer {\n protected options: ReportsPlayerOptions;\n private track: TextTrack;\n\n constructor(id: string | Element, options: ReportsPlayerOptions) {\n super(id, options);\n }\n\n protected getPlayerClassName(): string {\n return 'cv-reports-player';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'reports-player';\n }\n\n protected async additionalSetup(playbackObject: PlaybackObject): Promise<void> {\n super.additionalSetup(playbackObject);\n\n this.setupEngagementOverlayPlugin(playbackObject);\n this.setupUpClipPlugin(playbackObject);\n this.setupInteractiveSeekBarPlugin(playbackObject);\n }\n\n private setupEngagementOverlayPlugin(playbackObject: PlaybackObject): void {\n this.player.engagementOverlayPlugin({\n heatMap: this.options.heatMap,\n interactive: playbackObject.additionalData?.interactive as Interactive,\n onTimepointHover: this.options.onTimepointHover\n });\n }\n\n private setupUpClipPlugin(playbackObject: PlaybackObject): void {\n const isClip = playbackObject.mediaType === 'MasterClip';\n const isInteractive = playbackObject.mediaType === 'MasterInteractive';\n\n if (!isClip && !isInteractive)\n return;\n\n let clipData: ClipData;\n if (isClip)\n clipData = playbackObject.additionalData;\n \n if (isInteractive) {\n clipData = playbackObject.additionalData?.clipData;\n\n // Not all interactives will have clip data\n if (!clipData)\n return;\n }\n\n if (!clipData)\n throw Error('Invalid clip data');\n\n this.player.clipPlugin({\n startTime: clipData.startTime,\n endTime: clipData.endTime\n });\n }\n\n private setupInteractiveSeekBarPlugin(playbackObject: PlaybackObject): void {\n const interactive = playbackObject.additionalData?.interactive as Interactive;\n\n if (!playbackObject.additionalData?.interactive)\n return;\n\n this.track = InteractiveTrackHelper.getInteractiveTrack(this.player, playbackObject);\n\n this.player.interactiveSeekBarPlugin({ interactive });\n }\n\n protected getSeekBarOptions(): any {\n return {\n ignoreChapters: true\n };\n }\n}\n","import React from 'react';\n\nimport { ReportsPlayer, ReportsPlayerOptions } from 'projects/player/players/reports/reports-player';\n\nexport function ClickViewReportsPlayer(props: ReportsPlayerOptions): React.ReactElement {\n const ref = React.useRef();\n const playerRef = React.useRef<ReportsPlayer>();\n\n React.useEffect(() => {\n playerRef.current = new ReportsPlayer(ref.current, props);\n }, []);\n\n return (\n <div ref={ref}></div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"playerContainer\":\"hXVIx\",\"playerPlaceholder\":\"fhZb2\",\"heatMap\":\"PP9cQ\",\"heatMapTimepointIndicator\":\"kQ5NO\",\"heatMapTimepointIndicatorVisible\":\"J1dev\",\"partialLoadingContainer\":\"xEqEk\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap, EngagementHeatMapLegend } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport { ClickViewReportsPlayer } from 'projects/player/react/ReportsPlayer';\n\nimport styles from './video-engagement-overlay.scss';\n\nconst namespace = 'shared.videoEngagementOverlay';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoEngagementOverlayProps {\n engagement: Engagement;\n viewKey: string;\n imageCdnUrl: string;\n playerApiUrl: string;\n}\n\nexport function VideoEngagementOverlay(props: VideoEngagementOverlayProps): JSX.Element {\n const timepointIndicatorRef = React.useRef<HTMLDivElement>();\n\n const heatMap = getFullHeatMap(props.engagement);\n\n function setHoverTimepoint(time: number | null): void {\n const el = timepointIndicatorRef.current;\n\n if (!el)\n return;\n\n if (time === null) {\n el.classList.remove(styles.heatMapTimepointIndicatorVisible);\n return;\n }\n\n el.classList.add(styles.heatMapTimepointIndicatorVisible);\n el.style.left = `${time / heatMap.length * 100}%`;\n }\n\n return (\n <div className='bg-white border border-light rounded overflow-hidden h-100'>\n <div className='position-relative'>\n {/**\n * The below div is an empty 16:9 rectangle which maintains this component's\n * height while the player is loading.\n */\n }\n <div className={styles.playerPlaceholder} />\n <div className={styles.playerContainer}>\n <ClickViewReportsPlayer\n viewKey={props.viewKey}\n playerApi={new URL(props.playerApiUrl)}\n hotkeyElQuerySelector='body'\n heatMap={heatMap}\n onTimepointHover={setHoverTimepoint}\n aspectRatio='16:9'\n />\n </div>\n </div>\n <div className='p-3'>\n <div className='position-relative'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n <div ref={timepointIndicatorRef} className={styles.heatMapTimepointIndicator} />\n </div>\n <div className='d-flex justify-content-between mt-2'>\n <strong>\n {getPhrase('heatmap')}\n </strong>\n <div className='w-33'>\n <EngagementHeatMapLegend />\n </div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { EngagementTable } from 'libs/shared/apps/analytics/components/engagement-table/EngagementTable';\nimport { InsightAmountWatched } from 'libs/shared/apps/analytics/components/insights/amount-watched/InsightAmountWatched';\nimport { InsightTotalViews } from 'libs/shared/apps/analytics/components/insights/total-views/InsightTotalViews';\nimport { useChunkedUsersResponse } from 'libs/shared/apps/analytics/hooks/UseEngagementUsers';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { getFilterParamsKey } from 'libs/shared/apps/analytics/utils/FilterParamUtils';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { AnalyticsRequestFilter, Config, CurrentUser, Engagement, IndividualEngagementResponse, PlayerViewKey, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { VideoEngagementOverlay } from 'apps/insights/components/video-engagement-overlay/VideoEngagementOverlay';\nimport { getInsightsClipTabs, getInsightsInteractiveTabs, getInsightsVideoTabs } from 'apps/insights/utils/InsightsAppLinkUtils';\nimport { InsightsHeaderView } from 'apps/insights/views/header/InsightsHeaderView';\n\ninterface InsightsHeatmapViewProps {\n videoId: string;\n typeId: MasterType;\n}\n\nexport function InsightsHeatmapView(props: InsightsHeatmapViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const videoRequest = VideoHelper.getVideoRequest(props.videoId, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const requestFilter: AnalyticsRequestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n };\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewRequests.aggregateEngagement(\n props.videoId,\n requestFilter,\n currentUser.data.id\n )\n );\n\n const individualEngagement = Flight.useBasicFetch<IndividualEngagementResponse>(currentUser.data &&\n VideoViewRequests.individualEngagement(props.videoId, requestFilter, currentUser.data?.id));\n\n const { users, isLoading } = useChunkedUsersResponse(\n individualEngagement.data?.data?.map(d => d.userId)\n );\n\n const videoViews = Flight.useBasicFetch<VideoViewEventResponse>(\n VideoViewRequests.views(requestFilter, props.videoId)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n PlayerRequests.createViewKey(props.videoId, MediaIdType.MasterObject)\n );\n\n const hasDataLoaded =\n currentUser.data &&\n videoViews.data &&\n video.data &&\n aggregateEngagement.data &&\n viewKey.data;\n\n const tableDataLoaded = !!individualEngagement.data && (!individualEngagement.data.data.length || !isLoading);\n\n if (!hasDataLoaded) return <></>;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n function getInsightsTabs() {\n if (props.typeId === MasterType.Interactive)\n return getInsightsInteractiveTabs(props.videoId, 'heatmap', params);\n\n if (props.typeId === MasterType.Clip)\n return getInsightsClipTabs(props.videoId, 'heatmap', params);\n\n return getInsightsVideoTabs(props.videoId, 'heatmap', params);\n }\n\n return (\n <div className='px-3'>\n <InsightsHeaderView\n video={video.data}\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsTabs()}\n />\n\n <div className='row g-2'>\n <div className='col-12 col-lg-3'>\n <InsightTotalViews events={videoViews.data} emptyStateImage={ImageUrls.EmptyStates.MY_VIDEOS} />\n </div>\n <div className='col-12 col-lg-3'>\n <InsightAmountWatched engagement={aggregateEngagement.data} params={audienceAppLinkParams} />\n </div>\n <div className='col-12 col-lg-6'>\n <VideoEngagementOverlay\n engagement={aggregateEngagement.data}\n viewKey={viewKey.data.viewKey}\n playerApiUrl={config.data.playerApiUrl}\n imageCdnUrl={config.data.imageCdnUrl}\n />\n </div>\n\n {tableDataLoaded &&\n <EngagementTable\n key={getFilterParamsKey({ ...audienceAppLinkParams, ...dateRangeAppLinkParams })}\n engagement={individualEngagement.data.data}\n users={users}\n imageCdnUrl={config.data?.imageCdnUrl}\n anonymiseUsers={anonymiseUsers}\n />\n }\n </div>\n </div>\n );\n}","import { FilterQueryParams } from 'libs/shared/apps/analytics/interfaces/FilterQueryParams';\n\nexport function getFilterParamsKey(filters: FilterQueryParams): string {\n const keys: string[] = [];\n\n Object.keys(filters).forEach((key: keyof FilterQueryParams) => {\n const val = filters[key];\n\n if (!val)\n return;\n\n keys.push(`${key}:${Array.isArray(val) ? val.join(',') : val}`);\n });\n\n return keys.join(':');\n}","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\n/**\n * TODO:\n * The value below is set quite high to compensate for the ridiculous amount of drift that can occur\n * when casting to a Vivi device. This is a temporary fix until we can get Vivi to fix the issue on their end.\n */\nconst CLIP_SEEK_DRIFT_IN_SECONDS = 10;\n\nexport interface ClipPluginOptions {\n startTime: number;\n endTime: number;\n}\n\nexport class ClipPlugin extends Plugin {\n private _clipStart: number;\n private _clipEnd: number;\n private _isEnded: boolean;\n\n private playerEndedFn: () => boolean;\n private playerDurationFn: (seconds?: number) => number;\n private playerCurrentTimeFn: (seconds?: number, ...args: any[]) => number;\n private playerbufferedFn: () => TimeRanges;\n\n constructor(player: VideoJsPlayer, options: ClipPluginOptions) {\n super(player);\n\n // validate clip start/end\n if (options.startTime === undefined) {\n throw Error('Invalid clip start');\n }\n\n if (options.endTime === undefined) {\n throw Error('Invalid clip end');\n }\n\n if (options.startTime > options.endTime) {\n throw Error('Clip start cannot be greater than clip end');\n }\n\n this._clipStart = parseFloat(options.startTime.toPrecision(4));\n this._clipEnd = parseFloat(options.endTime.toPrecision(4));\n\n // save old player functions\n this.playerEndedFn = this.player.ended.bind(player);\n this.playerDurationFn = this.player.duration.bind(player);\n this.playerCurrentTimeFn = this.player.currentTime.bind(player);\n this.playerbufferedFn = this.player.buffered.bind(player);\n\n // overwrite the base player function with our new fancy ones\n this.player.ended = this.ended.bind(this);\n this.player.duration = this.duration.bind(this);\n this.player.currentTime = this.currentTime.bind(this);\n this.player.buffered = this.buffered.bind(this);\n\n this.initialize();\n\n this.player.ready(() => {\n // manually trigger a duation change since we have a new duration from the clip\n this.player.trigger('durationchange');\n });\n }\n\n /**\n * Ensure that the clip start is not greater than the total video duration\n */\n public get clipStart(): number {\n const videoDuration = this.playerDurationFn();\n\n if (this._clipStart > videoDuration)\n return videoDuration;\n\n return this._clipStart;\n }\n\n /**\n * Ensure that the clip end is not greater than the total video duration\n */\n public get clipEnd(): number {\n const videoDuration = this.playerDurationFn();\n\n // The video duration may not have been determined yet, so we can't do\n // any clamping right now..\n if (videoDuration <= 0)\n return this._clipEnd;\n\n // Clamp the clip end to the video duration\n if (this._clipEnd > videoDuration)\n return videoDuration;\n\n return this._clipEnd;\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n this.player.off('play', this.onPlay);\n\n // put the original functions back\n this.player.ended = this.playerEndedFn;\n this.player.duration = this.playerDurationFn;\n this.player.currentTime = this.playerCurrentTimeFn;\n this.player.buffered = this.playerbufferedFn;\n\n // trigger another durationchange since the duration will now go back to the original\n this.player.trigger('durationchange');\n\n super.dispose();\n }\n\n private initialize(): void {\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onPlay = this.onPlay.bind(this);\n\n this.player.on('timeupdate', this.onTimeUpdate);\n this.player.on('play', this.onPlay);\n }\n\n private onPlay(): void {\n // if we try to play but the clip has ended, go back to the start\n if (this._isEnded) {\n this.player.currentTime(0);\n }\n }\n\n private onTimeUpdate(): void {\n const currentTime = this.getCurrentTime(false);\n\n // check ended\n if (currentTime > this.clipEnd) {\n if (!this._isEnded) {\n this.player.pause();\n this.player.trigger('ended');\n \n this._isEnded = true;\n }\n\n return;\n }\n\n this._isEnded = false;\n\n // ensure video is playing from the correct clip start (taking into account some seek drift)\n if (currentTime < (this.clipStart - CLIP_SEEK_DRIFT_IN_SECONDS)) {\n this.playerCurrentTimeFn(this.clipStart, true);\n }\n }\n\n private ended(): boolean {\n return this.getCurrentTime(false) > this.clipEnd;\n }\n\n private duration(seconds?: number): number {\n // set the underlying player duration (and cache) if it hasn't been set already\n if (seconds && seconds > 0) {\n const existingDuration = this.playerDurationFn();\n\n if (existingDuration)\n console.info('The duration of the player has already been set. This is a no-op.');\n else\n this.playerDurationFn(seconds);\n }\n \n return this.clipEnd - this.clipStart;\n }\n\n private currentTime(seconds?: number, ...args: any[]): number {\n if (typeof seconds !== 'number') {\n return this.getCurrentTime(true);\n }\n\n const correctedSeconds = seconds + this.clipStart;\n\n this.playerCurrentTimeFn(correctedSeconds, args);\n\n return;\n }\n\n /**\n * Gets the current time of the video and updates the videojs currentTime cache\n * @param clipTime Set to true to return the current time in the context of a clip\n */\n private getCurrentTime(clipTime: boolean): number {\n const playerCurrentTime = this.playerCurrentTimeFn();\n let time = 0;\n\n if (playerCurrentTime >= this.clipStart) {\n time = playerCurrentTime - this.clipStart;\n }\n\n // ensure that the videojs currentTime cache reflects our fake time\n this.player.getCache().currentTime = time;\n\n if (clipTime)\n return time;\n\n return playerCurrentTime;\n }\n\n private buffered(): TimeRanges {\n const buff = this.playerbufferedFn();\n const ranges = [];\n\n for (let i = 0; i < buff.length; i++) {\n ranges[i] = [\n Math.max(0, buff.start(i) - this.clipStart),\n Math.min(Math.max(0, buff.end(i) - this.clipStart), this.player.duration())\n ];\n }\n\n return videojs.createTimeRanges(ranges as any);\n }\n}\n\nvideojs.registerPlugin('clipPlugin', ClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n clipPlugin(options: ClipPluginOptions): void;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Timepoint } from 'libs/shared/interfaces';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport './interactive-bar-item.scss';\n\nconst Component = videojs.getComponent('Button');\n\ninterface InteractiveBarItemOptions extends videojs.ComponentOptions {\n timepoint: Timepoint;\n}\n\nexport class InteractiveBarItem extends Component {\n private timepoint_: Timepoint;\n private time_: number;\n\n constructor(player: VideoJsPlayer, options: InteractiveBarItemOptions) {\n super(player, options);\n\n this.timepoint_ = options.timepoint;\n this.time_ = options.timepoint.visibleAt / 1000;\n\n const firstInteraction = options.timepoint.interactions[0];\n\n // if we have no interaction, hide this timepoint\n if (!firstInteraction)\n this.hide();\n\n const { bgClassName } = InteractionTypeHelper.getTypeInfo(firstInteraction.typeId);\n this.$('.vjs-icon-placeholder').classList.add(bgClassName);\n\n // set the control text to the interaction name for screen readers\n this.controlText(firstInteraction.name);\n\n this.update();\n }\n\n public buildCSSClass(): string {\n return `cv-interactive-bar-item ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLButtonElement {\n const el = super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass()\n }, {\n ...attributes,\n tabIndex: 0\n });\n\n return el;\n }\n\n public update(): void {\n const duration = this.player_.duration();\n const width = this.time_ / duration;\n\n (this.el() as HTMLElement).style.left = (width * 100) + '%';\n\n // hide items outside of bounds\n if (width > 100 || width < 0)\n this.hide();\n else\n this.show();\n }\n\n public handleClick(e: Event): void {\n e.stopPropagation();\n this.player_.currentTime(this.time_);\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { Interactive, Timepoint } from 'libs/shared/interfaces';\n\nimport { InteractiveBarItem } from './interactive-bar-item';\n\nimport './interactive-bar-items.scss';\n\nconst Component = videojs.getComponent('Component');\n\ninterface InteractiveBarItemsOptions extends videojs.SliderOptions {\n track: TextTrack;\n interactive: Interactive;\n}\n\nexport class InteractiveBarItems extends Component {\n private track_: TextTrack;\n private interactive_: Interactive;\n\n constructor(player: VideoJsPlayer, options: InteractiveBarItemsOptions) {\n super(player, options);\n\n this.track_ = options.track;\n this.interactive_ = options.interactive;\n\n this.onDurationChange = this.onDurationChange.bind(this);\n this.createInteractionItems = this.createInteractionItems.bind(this);\n\n this.createInteractionItems();\n\n (this.track_ as any).on('cv:cuechange', this.createInteractionItems);\n\n this.player_.on('durationchange', this.onDurationChange);\n this.player_.on('dispose', () => {\n (this.track_ as any).off('cv:cuechange');\n\n this.player_.off('durationchange', this.onDurationChange);\n });\n }\n\n public buildCSSClass(): string {\n return `cv-interactive-bar-items ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass()\n }, attributes);\n }\n\n public update(): void {\n this.children_.forEach((child: InteractiveBarItem) => {\n child.update();\n });\n }\n\n private createInteractionItems(): void {\n if (!this.track_)\n return;\n\n /**\n * Removing existing children\n *\n * We have to clone the array here otherwise\n * the forEach only removes every 2nd item\n */\n [...this.children_].forEach(child => {\n this.removeChild(child);\n });\n\n for (let i = 0; i < this.track_.cues.length; i++) {\n const cue = this.track_.cues[i] as any;\n const timepoint = this.getTimepointById(cue.text);\n\n if (!timepoint || !timepoint.interactions?.length)\n continue;\n\n this.addChild(new InteractiveBarItem(this.player_, {\n timepoint: timepoint\n }));\n }\n }\n\n private onDurationChange(): void {\n this.update();\n }\n\n private getTimepointById(id: string): Timepoint | null {\n return this.interactive_.timepoints?.find(t => t.id.toString() === id.toString());\n }\n}\n","import { VideoJsPlayer } from 'video.js';\n\nimport { Interactive } from 'libs/shared/interfaces';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\n\nexport const InteractiveTrackHelper = {\n getInteractiveTrack(player: VideoJsPlayer, playbackObject: PlaybackObject): TextTrack {\n const track = player.addTextTrack('metadata', 'interactive') as unknown as TextTrack;\n\n const interactive = playbackObject.additionalData.interactive as Interactive;\n const clipOffset = playbackObject.additionalData.clipData?.startTime;\n\n interactive.timepoints.forEach(t => {\n let startTime = t.visibleAt / 1000;\n let endTime = t.visibleFor ? startTime + (t.visibleFor / 1000) : startTime + 1;\n\n if (clipOffset) {\n startTime += clipOffset;\n endTime += clipOffset;\n }\n\n if (!t.interactions?.length)\n return;\n\n track.addCue({\n // Handles calling currentTime() with the exact time of the timepoint\n startTime: Math.max(0.001, startTime - 0.001),\n endTime,\n text: t.id\n } as any);\n });\n\n return track;\n }\n};"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","svgClassName","SvgContainer","svgName","title","subtitle","count","children","getFullHeatMap","Array","ceil","videoDuration","fill","t","VideoViewRequests","individualEngagement","objectId","filter","sharerId","success","error","always","queryParams","url","formatData","d","normalize","aggregateEngagement","views","baseKey","timeOffset","getPhrase","LanguageService","CellWrapper","HeaderCell","column","isSorted","phraseKey","useGetColumns","maxHeatMapValue","forEach","e","localMax","Header","accessor","sortType","rowA","rowB","values","user","anonymiseUsers","Cell","nameParts","name","split","n","surname","slice","Avatar","imageCdnUrl","initials","UserHelper","imageUrl","avatar","sortDescFirst","PercentageIndicator","percentage","layout","disableSortBy","original","row","theme","table","header","headerCell","cell","EngagementTable","users","columns","find","u","id","userId","Table","enableSort","PartialPercentageIndicator","customLabel","InsightAmountWatched","engagementRate","round","everyoneSelected","params","classrooms","classroomGroups","options","CHART_COLOURS","getYearGroupNumber","STATIC_CHART_OPTIONS","text","credits","enabled","chart","spacing","plotOptions","pie","allowPointSelect","cursor","dataLabels","showInLegend","borderWidth","size","InsightTotalViews","copied","events","groupsToOmit","getSeriesName","groups","eventCounts","chartData","group","ev","includes","toLowerCase","ArrayHelper","Object","keys","y","type","color","sort","a","b","numberA","toString","numberB","Number","isNaN","totalViews","reduce","getTotalEventCount","highcharts","series","getChartOptions","containerProps","EmptyState","src","emptyStateImage","EngagementOverlayMenuItem","player","overlayVisible","toggle","this","state","toggleOn","toggleOff","toggleEl","engagementOverlayPlugin","toggleOverlay","addClass","removeClass","event","stopImmediatePropagation","tagName","properties","attributes","handlerBound","handleToggle","bind","removeEventListener","innerHTML","addEventListener","el","appendChild","MAX_INTERACTIONS_TO_SHOW","TimepointInteractions","timepoint","interactive","timepoints","timepointTime","visibleAt","floor","time","interactions","hiddenInteractions","InteractionLabel","interaction","showQuestion","iconClassName","xAxis","visible","minPadding","maxPadding","legend","defs","x1","y1","x2","y2","offset","height","styledMode","Component","EngagementOverlay","initialize","bindListeners","ready","buildChart","buildCSSClass","show","destroyChart","handleClick","resizeChart","on","off","paused","play","pause","chartDimensions","getChartDimensions","container","querySelector","getHighchartOptions","one","setSize","destroy","collapserator","getChild","collapseratorHeight","currentHeight","clientWidth","currentDimensions","moveTimepointIndicator","yAxis","options_","min","allowDecimals","startOnTick","endOnTick","tooltip","formatter","timepointInteractionsHtml","renderToStaticMarkup","getTimepointInteractionsHtml","x","formatTime","positioner","labelWidth","labelHeight","point","maxX","plotWidth","plotX","plotTop","useHTML","padding","area","mouseOver","mouseOut","marker","onTimepointHover","indicator","left","EngagementOverlayPlugin","hasHeatMapData","addChild","addItem","index","ctor","engagementOverlay","toggleChart","acc","InteractiveSeekBarPlugin","onTrackLoaded","track","addChildren","controlBar","ReportsPlayer","playbackObject","additionalSetup","setupEngagementOverlayPlugin","setupUpClipPlugin","setupInteractiveSeekBarPlugin","additionalData","clipData","isClip","mediaType","isInteractive","Error","clipPlugin","startTime","endTime","interactiveSeekBarPlugin","ignoreChapters","ClickViewReportsPlayer","ref","playerRef","current","VideoEngagementOverlay","timepointIndicatorRef","viewKey","playerApi","URL","playerApiUrl","hotkeyElQuerySelector","classList","add","remove","aspectRatio","InsightsHeatmapView","currentUser","UserRequests","videoRequest","VideoHelper","videoId","typeId","video","config","ConfigRequests","audienceAppLinkParams","dateRangeAppLinkParams","requestFilter","isLoading","videoViews","PlayerRequests","MediaIdType","hasDataLoaded","tableDataLoaded","filters","InsightsHeaderView","tabs","MasterType","ImageUrls","isArray","ClipPlugin","undefined","_clipStart","parseFloat","toPrecision","_clipEnd","playerEndedFn","ended","playerDurationFn","duration","playerCurrentTimeFn","currentTime","playerbufferedFn","buffered","trigger","onTimeUpdate","onPlay","_isEnded","getCurrentTime","clipEnd","clipStart","seconds","console","info","correctedSeconds","args","clipTime","playerCurrentTime","getCache","buff","ranges","start","end","InteractiveBarItem","timepoint_","time_","firstInteraction","hide","bgClassName","InteractionTypeHelper","$","controlText","update","tabIndex","player_","stopPropagation","InteractiveBarItems","track_","interactive_","onDurationChange","createInteractionItems","children_","child","removeChild","cues","cue","getTimepointById","InteractiveTrackHelper","getInteractiveTrack","addTextTrack","clipOffset","visibleFor","addCue"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7237],{71553:(e,t,n)=>{n.d(t,{I:()=>s});var a=n(99940),r=n(62875);function i(e,t){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:{start:t.start,end:t.end},userIds:t.userId,classroomsAndGroups:t.groupId}}var s={interactiveResultSet:function(e,t,n,s,c,o,l){return{url:"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:(0,r.H)("interactive:result:set:".concat(e,":").concat(t),s),data:i(n,s),type:a.k.POST,normalize:!1,success:c,error:o,always:l}},mark:function(e,t,n,r,i,s,c){return{url:"/api/domain/v1/analytics/answers/".concat(n),key:"mark:answer:".concat(n,":").concat(r.resultId),type:a.k.PUT,data:r,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:i,error:s,always:c}},pendingReviews:function(e){return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews",type:a.k.POST,data:e}},interactiveResultsReport:function(e){return{url:"{gateway}/v2/analytics/interactives/report",key:"interactive:results:report",data:e,type:a.k.POST,normalize:!1}}}},62875:(e,t,n)=>{function a(e,t,n){var a="".concat(e,":").concat(t.start,":").concat(t.end),r=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,i=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return r&&(a+=":".concat(r)),i&&(a+=":".concat(i)),n&&(a+=":".concat(n)),a}n.d(t,{H:()=>a})},36511:(e,t,n)=>{n.d(t,{I:()=>r});var a=n(40424);function r(e){switch(e){case a.R.Pink:return"pink";case a.R.Orange:return"orange";case a.R.Green:return"green";case a.R.Blue:return"blue";case a.R.Purple:return"purple";case a.R.Indigo:return"indigo";default:return"pink"}}},95121:(e,t,n)=>{n.r(t),n.d(t,{ClassroomOverviewView:()=>M});var a=n(32735),r=n(70680),i=n(23481),s=n(20354),c=n(75896),o=n(71553),l=n(30439),u=n(49935),d=n(71020),m=n(5062),p=n(4594),v=n(39151),g=n(31949),f=n(39902),h=n(79967),I=n(60115),y=n(79612),E=n(66607),b=n(99742),w=n(14070),S=n(97291),k=n(88630),C=n(22602),O=n(64071),R=n(70835),A=n(23120),N=n(82202),T=n(63153);function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var L=i.T.encloseNamespace("lite.insightsList");function M(e){var t,n,i,M=(0,r.I0)(),x=(0,h.k)(),F=s.a.useBasicFetch(g.N.currentUser()),H=s.a.useBasicFetch(F.data&&k.F.getClassroom(e.classroomId,F.data.id)),U=null===(n=null===(t=H.data)||void 0===t?void 0:t._integrations)||void 0===n?void 0:n.rostered,V=function(t){return l.o.sentShare({cursor:t,recipientGroupId:[e.classroomId]})},B=function(e){return s.a.getFetch(M)(V(e))},D=(0,I.K)(V,B),P=D.items,_=D.hasMore,G=D.isFetching,W=D.nextCursor,z=c.m.uniq(null!==(i=null==P?void 0:P.map((function(e){return e.objectId})))&&void 0!==i?i:[]),K=(0,f.f)(z,(function(e){return l.o.sharedObjectsById(e)})),Z=(null==K?void 0:K.items)&&Object.keys(K.items).reduce((function(e,t){if(K.items[t].typeId!==p.E.Interactive)return e;var n,a=K.items[t];return[].concat(function(e){if(Array.isArray(e))return j(e)}(n=e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||function(e,t){if(e){if("string"==typeof e)return j(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?j(e,t):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[{metadataId:a.id,interactiveId:a.interactiveId}])}),[]),q=s.a.useBasicFetch((null==K?void 0:K.items)&&F.data&&o.I.pendingReviews({interactives:Z,filters:{currentCustomerId:F.data.customerId,currentUserId:F.data.id}})),J=E.x.getRecipientIds(P),Q=(0,f.f)(J,(function(e){return l.o.getRecipientsById(e,F.data.customerId)})),$=s.a.useBasicFetch(v.L.config());(0,y.M)({title:L("insights")});var X=(0,A.j)(x,{classrooms:[e.classroomId]}),Y=(0,T.o0)(P,!!K.items,J,!!Q.items,$),ee=G||K.isFetching||Q.isFetching||q.isFetching,te=a.useMemo((function(){return P}),[!!P,ee]),ne=a.useMemo((function(){return(0,T.bT)(K)}),[!!K.items,ee]),ae=a.useMemo((function(){return(0,T.bT)(Q)}),[!!Q.items,ee]);return F.data&&H.data?a.createElement(C.R,{activeTab:"overview",classroom:H.data,currentUser:F.data,onTogglePin:function(e,t,n){if(!U){var a=e?k.F.pinClassroom:k.F.unpinClassroom;s.a.fetch(M,a(H.data,t,n))}},isRostered:U},Y?a.createElement(N.N,null):P.length?a.createElement(a.Fragment,null,a.createElement(R.G,{sentShares:te,sharedObjects:ne,shareRecipients:ae,interactivesPendingReviews:q.data,getObjectAppLink:T.Qh,getObjectActions:X,imageCdnUrl:$.data.imageCdnUrl,groupByDateShared:!0,dependencies:[ee],breakpoints:x,hideViews:!0}),(_||ee)&&a.createElement(d._,{isFetching:ee,fetchNext:B,nextCursor:W})):a.createElement(O.i,{appLink:{application:S.O.DASHBOARD,action:w.e.Dashboard.HOME},imageUrl:b.W.EmptyStates.Share.SHARED_WITH_ME})):a.createElement("div",{className:"px-3"},a.createElement("div",{className:"mb-1 partial-loading-background"}),a.createElement("div",{className:"pb-3"},a.createElement(u.b2,{numItems:2})),a.createElement("div",{className:"pb-2"},a.createElement(m.Z,null)))}},64071:(e,t,n)=>{n.d(t,{i:()=>c});var a=n(32735),r=n(23481),i=n(23232),s=r.T.encloseNamespace("insights.insightsListEmptyState");function c(e){return a.createElement(i.u,null,a.createElement(i.u.Image,{src:e.imageUrl,size:"small"}),a.createElement(i.u.Heading,null,s(e.useInteractiveCopy?"interactivesHeading":"genericHeading")),a.createElement(i.u.Info,null,s(e.useInteractiveCopy?"interactivesInfo":"genericInfo")),!!e.appLink&&a.createElement(i.u.Cta,{appLink:e.appLink,text:s("cta")}))}},70835:(e,t,n)=>{n.d(t,{G:()=>C});var a=n(32735),r=n(95834),i=n(69674),s=n(82602),c=n(23481),o=n(75896),l=n(110),u=n(65858),d=n(29024),m=n(40391),p=n(64249),v=n(83657),g=n(36848),f=n(83914),h=n(83345),I=n(4594),y=n(85063),E=n(35223),b=n(31908),w="insights.insightsListTable",S=c.T.encloseNamespace(w);function k(e){var t;if(e.type===y.y.ShareLink||!(null===(t=null==e?void 0:e.recipients)||void 0===t?void 0:t.length))return e.dateCreated;var n=e.recipients.map((function(e){return e.dateShared}));return n.sort((function(e,t){return l.O.isSame(e,t)?0:l.O.isAfter(e,t)?1:-2})),n.length?o.m.last(n):""}var C=a.memo((function(e){var t,n,c,o,l,C,O,R,A,N,T,j=(t=e.sentShares,n=e.sharedObjects,c=e.shareRecipients,o=e.interactivesPendingReviews,l=e.dependencies,a.useMemo((function(){var e=[];return t.forEach((function(t){var a,r,i=n.find((function(e){return e.id===t.objectId})),s=null;if(t.type===y.y.DirectShare&&(s=[],null===(a=t.recipients)||void 0===a||a.forEach((function(e){var t=c.find((function(t){return t.id===e.id}));t&&s.push(t)}))),i){var l=i.typeId===I.E.Interactive&&(null==o?void 0:o.find((function(e){return e.interactiveId===i.interactiveId})));e.push({share:t,sharedObject:i,shareRecipients:s,dateShared:k(t),viewCount:null!==(r=t.viewCount)&&void 0!==r?r:0,pendingReview:null==l?void 0:l.pendingReviewCount})}})),e}),l));return a.createElement(a.Fragment,null,a.createElement(i.i,{columns:(C=e.getObjectAppLink,O=e.getObjectActions,R=e.imageCdnUrl,A=e.breakpoints,N=e.hideViews,T=A&&(A.xs||A.sm||A.md),[{Header:S("title"),accessor:"sharedObject",id:"image",Cell:function(e){var t=e.value;return a.createElement("div",{className:"w-100"},a.createElement(d.k,{object:t,appLink:C(t),showVideoMetadata:!0,locationContext:u.LZ.SharedByMe}))},minWidth:140,maxWidth:30},{accessor:"sharedObject",id:"name",Cell:function(e){var t,n,r=e.value,i=e.row,s=e.data;if(r.name){if(b.M.isVideoType(r)&&!(null===(t=b.M.getCanBeConsumed(r))||void 0===t?void 0:t.canNavigate))return a.createElement("span",{className:"clamp-2"},r.name);var c=null===(n=s[i.index])||void 0===n?void 0:n.pendingReview;return a.createElement("div",null,a.createElement(g.F,{appLink:C(r),className:"clamp-2",analyticsData:{id:r.id,name:r.name},analyticsOptions:{entity:p.I.getAnalyticsEntity(r.type),actionType:u.Vw.Click,location:u.LZ.SharedByMe}},r.name),!!c&&a.createElement("div",{className:"bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2"},a.createElement(h.x,{namespace:w,phrase:"requireMarking",options:{count:c}})))}return a.createElement("span",null,a.createElement(h.x,{namespace:w,phrase:"videoUnavailable"}))},width:100},{Header:S("sharedTo"),accessor:"shareRecipients",Cell:function(e){var t=e.value;return t?t.length?a.createElement(m.Kh,{recipients:t,imageCdnUrl:R,maxAvatars:T?1:2}):a.createElement(m.m9,null):a.createElement(m.Ad,null)},width:30},!N&&{Header:S("views"),accessor:"share",Cell:function(e){var t=e.value;return a.createElement("div",{className:"d-flex align-items-center"},a.createElement(f.x,{svgName:E.vn.User}),a.createElement("span",null,t.accessedCount,t.totalAccessible?"/".concat(t.totalAccessible):""))},width:30},!T&&{Header:S("shared"),id:"dateShared",accessor:function(e){return(0,s.WU)(e.dateShared)},width:40},{accessor:"sharedObject",id:"actions",Cell:function(e){var t=e.value;return a.createElement(v.e,{actions:O(t),className:"w-100 justify-content-end align-items-center gap-2",actionsDropdownClassName:"bg-transparent",dropdownToggleSvgSize:f.S.Standard})},width:40}].filter(Boolean)),data:j,theme:r.J}))}))},23120:(e,t,n)=>{n.d(t,{j:()=>d,w:()=>m});var a=n(32735),r=n(23481),i=n(4594),s=n(35223),c=n(31908),o=n(14070),l=n(97291),u=r.T.encloseNamespace("lite.insightsList");function d(e,t){var n=e.xs||e.sm||e.md,r=JSON.stringify(t);return a.useCallback((function(e){return function(e,t,n){var a,r;c.M.isVideo(e)&&(a="video",r={application:l.O.INSIGHTS,action:o.e.Insights.VIDEO_OVERVIEW,args:[e.id]}),c.M.isInteractive(e)&&(a="interactive",r={application:l.O.INSIGHTS,action:o.e.Insights.INTERACTIVE_OVERVIEW,args:[e.id]}),c.M.isClip(e)&&(a="clip",r={application:l.O.INSIGHTS,action:o.e.Insights.CLIP_OVERVIEW,args:[e.id]}),e.typeId===i.E.Series&&(a="series"),e.typeId===i.E.Playlist&&(a="playlist");var d=[{label:u("editShareSettings"),appLink:{application:l.O.DEFAULT,action:o.e.Default.SHARE,args:[e.id],params:{entityType:a}}}];if(c.M.isVideoType(e)){if(!c.M.getCanBeConsumed(e).canConsume)return[];d.unshift({label:u("viewInsights"),className:"btn btn-outline-dark",button:!n,svgName:s.vn.Chart,appLink:Object.assign(Object.assign({},r),{params:t})})}return d}(e,t,n)}),[n,r])}function m(e){var t,n,a=null===(t=e.params)||void 0===t?void 0:t.typeId;return a?"string"==typeof a?[+a]:(null===(n=e.params)||void 0===n?void 0:n.typeId.map((function(e){return+e})))||[]:[]}}}]);
2
- //# sourceMappingURL=7237-86c18f2701-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7237-86c18f2701-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-overview/ClassroomOverviewView.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/empty-state/InsightsListEmptyState.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTableUtils.tsx","file:///app/packages/projects/lite/src/apps/insights/components/insights-list/table/InsightsListTable.tsx","file:///app/packages/projects/lite/src/apps/insights/views/insights-list/InsightsListViewUtils.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { ShareHelper } from 'libs/shared/utils/ShareHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { InsightsListEmptyState } from 'apps/insights/components/insights-list/empty-state/InsightsListEmptyState';\nimport { InsightsListTable } from 'apps/insights/components/insights-list/table/InsightsListTable';\nimport { useGetInsightsObjectActions } from 'apps/insights/views/insights-list/InsightsListViewUtils';\nimport { PartialSharedByMeTable } from 'apps/share/views/shared-by-me/partial-loading/PartialSharedByMeTable';\nimport { getBatchFetchResultAsArray, getObjectAppLink, usePartialLoading } from 'apps/share/views/shared-by-me/SharedByMeViewUtils';\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomOverviewViewProps {\n classroomId: string;\n}\n\nexport function ClassroomOverviewView(props: ClassroomOverviewViewProps) {\n const dispatch = useDispatch();\n const breakpoints = useBreakpoints();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.classroomId, currentUser.data.id));\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const getRequest = (cursor?: string) => ShareRequests.sentShare({\n cursor,\n recipientGroupId: [props.classroomId]\n });\n const fetchNext = (cursor?: string) => Flight.getFetch(dispatch)(getRequest(cursor));\n\n\n const {\n items: sentShares,\n hasMore,\n isFetching: isFetchingSentShares,\n nextCursor\n } = useInfiniteList<UnionShareObject>(getRequest, fetchNext);\n\n const sharedObjectIds = ArrayHelper.uniq(sentShares?.map(s => s.objectId) ?? []);\n\n const sharedObjectsFetchResult = useBatchFetch(sharedObjectIds, (ids: string[]) => {\n return ShareRequests.sharedObjectsById(ids);\n });\n\n const interactiveIds = getInteractiveIds();\n\n const interactivesPendingReview = Flight.useBasicFetch<InteractivesPendingReviews[]>(\n sharedObjectsFetchResult?.items && currentUser.data &&\n InteractiveResultsRequests.pendingReviews({\n interactives: interactiveIds,\n filters: {\n currentCustomerId: currentUser.data.customerId,\n currentUserId: currentUser.data.id\n }\n })\n );\n\n const recipientIds = ShareHelper.getRecipientIds(sentShares);\n\n const shareRecipientsFetchResult = useBatchFetch(recipientIds, (ids: string[]) => {\n return ShareRequests.getRecipientsById(ids, currentUser.data.customerId);\n });\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n useSetPageMetadata({ title: getPhrase('insights') });\n\n const getSharedObjectActions = useGetInsightsObjectActions(breakpoints, { classrooms: [props.classroomId]});\n\n const showPartialLoading = usePartialLoading(\n sentShares,\n !!sharedObjectsFetchResult.items,\n recipientIds,\n !!shareRecipientsFetchResult.items,\n config\n );\n\n // Wait until all data is fetched before telling the table to re-render\n const isFetching = isFetchingSentShares\n || sharedObjectsFetchResult.isFetching\n || shareRecipientsFetchResult.isFetching\n || interactivesPendingReview.isFetching;\n\n const sentSharesMemo = React.useMemo(() => sentShares, [ !!sentShares, isFetching ]);\n const sharedObjects = React.useMemo(() =>\n getBatchFetchResultAsArray(sharedObjectsFetchResult), [ !!sharedObjectsFetchResult.items, isFetching ]);\n const shareRecipients = React.useMemo(\n () =>\n getBatchFetchResultAsArray(shareRecipientsFetchResult),\n [ !!shareRecipientsFetchResult.items, isFetching ]\n );\n\n function getInteractiveIds() {\n return sharedObjectsFetchResult?.items && Object.keys(sharedObjectsFetchResult.items).reduce(\n (acc, value) => {\n const isInteractive = sharedObjectsFetchResult.items[value].typeId === MasterType.Interactive;\n\n if (!isInteractive) return acc;\n\n const interactive = sharedObjectsFetchResult.items[value] as InteractiveMetadata;\n return [ ...acc, { metadataId: interactive.id, interactiveId: interactive.interactiveId }];\n },\n []\n );\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n const classroomDataLoaded = currentUser.data && classroom.data;\n\n if (!classroomDataLoaded)\n return (\n <div className='px-3'>\n <div className={`mb-1 partial-loading-background`} />\n\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n </div>\n );\n\n return (\n <ClassroomLayout\n activeTab='overview'\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n isRostered={isRostered}\n >\n {(() => {\n if (showPartialLoading)\n return <PartialSharedByMeTable />;\n\n if (!sentShares.length)\n return (\n <InsightsListEmptyState\n appLink={{ application: AppChannels.DASHBOARD, action: Actions.Dashboard.HOME }}\n imageUrl={ImageUrls.EmptyStates.Share.SHARED_WITH_ME}\n />\n );\n\n return (\n <>\n <InsightsListTable\n sentShares={sentSharesMemo}\n sharedObjects={sharedObjects}\n shareRecipients={shareRecipients}\n interactivesPendingReviews={interactivesPendingReview.data}\n getObjectAppLink={getObjectAppLink}\n getObjectActions={getSharedObjectActions}\n imageCdnUrl={config.data.imageCdnUrl}\n groupByDateShared\n dependencies={[isFetching]}\n breakpoints={breakpoints}\n hideViews\n />\n {(hasMore || isFetching) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} nextCursor={nextCursor} />\n }\n </>\n );\n })()}\n </ClassroomLayout>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nconst namespace = 'insights.insightsListEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsListEmptyStateProps {\n imageUrl: string;\n appLink?: Core.AppLink;\n useInteractiveCopy?: boolean;\n}\n\nexport function InsightsListEmptyState(props: InsightsListEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} size='small'/>\n <EmptyState.Heading>\n {getPhrase(props.useInteractiveCopy ? 'interactivesHeading' : 'genericHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>{getPhrase(props.useInteractiveCopy ? 'interactivesInfo' : 'genericInfo')}</EmptyState.Info>\n {!!props.appLink &&\n <EmptyState.Cta appLink={props.appLink} text={getPhrase('cta')} />\n }\n </EmptyState>\n );\n}","import React from 'react';\nimport { Column } from 'react-table';\nimport { format as formatDate } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SharedObjectImage } from 'libs/shared/apps/share/components/shared-object-image/SharedObjectImage';\nimport {\n AnonymousSharedToAvatar,\n SharedLinkAvatar,\n SharedToAvatarList\n} from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { SharableEntity, ShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareType } from 'libs/shared/enums/ShareType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, InteractiveMetadata, UnionShareObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'insights.insightsListTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDateShared(share: UnionShareObject): string {\n if (share.type === ShareType.ShareLink || !share?.recipients?.length)\n return share.dateCreated;\n\n const datesShared = share.recipients.map(r => r.dateShared);\n\n datesShared.sort((date1, date2) => {\n if (DateHelper.isSame(date1, date2))\n return 0;\n\n return DateHelper.isAfter(date1, date2) ? 1 : -2;\n });\n\n\n if (!datesShared.length)\n return '';\n\n return ArrayHelper.last(datesShared);\n}\n\ninterface SharedByMeTableData {\n share: UnionShareObject;\n sharedObject: SharableEntity;\n dateShared: string;\n shareRecipients?: BaseObject[];\n viewCount: number;\n pendingReview: number;\n}\n\nexport function getColumns(\n getObjectAppLink: (object: BaseObject) => Core.AppLink,\n getObjectActions: (object: BaseObject) => ActionOptions[],\n imageCdnUrl: string,\n breakpoints?: Breakpoints,\n hideViews?: boolean\n): Column<SharedByMeTableData>[] {\n const isMobile = breakpoints && (breakpoints.xs || breakpoints.sm || breakpoints.md);\n\n const columns: Column<SharedByMeTableData>[] = [\n {\n Header: getPhrase('title'),\n accessor: 'sharedObject',\n id: 'image',\n Cell: ({ value }) => (\n <div className='w-100'>\n <SharedObjectImage\n object={value}\n appLink={getObjectAppLink(value)}\n showVideoMetadata\n locationContext={LocationContext.SharedByMe}\n />\n </div>\n ),\n minWidth: 140,\n maxWidth: 30\n },\n {\n accessor: 'sharedObject',\n id: 'name',\n Cell: ({ value, row, data }) => {\n if (value.name) {\n if (VideoHelper.isVideoType(value) && !VideoHelper.getCanBeConsumed(value)?.canNavigate) {\n return (\n <span className='clamp-2'>\n {value.name}\n </span>\n );\n }\n\n const pendingReview = data[row.index]?.pendingReview;\n\n return (\n <div>\n <AppLink\n appLink={getObjectAppLink(value)}\n className='clamp-2'\n analyticsData={{ id: value.id, name: value.name }}\n analyticsOptions={{\n entity: ShareViewHelper.getAnalyticsEntity(value.type),\n actionType: UserAction.Click,\n location: LocationContext.SharedByMe\n }}\n >\n {value.name}\n </AppLink>\n \n {!!pendingReview && (\n <div className='bg-light-indigo text-dark-blue fw-semibold font-size-sm rounded-pill w-fit mt-1 px-2'>\n <Text namespace={namespace} phrase='requireMarking' options={{ count: pendingReview }} />\n </div>\n )}\n </div>\n );\n }\n\n return <span><Text namespace={namespace} phrase='videoUnavailable' /></span>;\n },\n width: 100\n },\n {\n Header: getPhrase('sharedTo'),\n accessor: 'shareRecipients',\n Cell: ({ value }) => {\n if (!value)\n return <SharedLinkAvatar />;\n\n if (!value.length)\n return <AnonymousSharedToAvatar />;\n\n return <SharedToAvatarList recipients={value} imageCdnUrl={imageCdnUrl} maxAvatars={isMobile ? 1 : 2} />;\n },\n width: 30\n },\n !hideViews && {\n Header: getPhrase('views'),\n accessor: 'share',\n Cell: ({ value }) => {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{value.accessedCount}{value.totalAccessible ? `/${value.totalAccessible}` : ''}</span>\n </div>\n );\n },\n width: 30\n },\n !isMobile && {\n Header: getPhrase('shared'),\n id: 'dateShared',\n accessor: s => formatDate(s.dateShared),\n width: 40\n },\n {\n accessor: 'sharedObject',\n id: 'actions',\n Cell: ({ value }) => (\n <Actions\n actions={getObjectActions(value)}\n className='w-100 justify-content-end align-items-center gap-2'\n actionsDropdownClassName='bg-transparent'\n dropdownToggleSvgSize={SvgContainerSize.Standard}\n />\n ),\n width: 40\n }\n ];\n\n return columns.filter((Boolean));\n}\n\nexport function useGetData(\n sentShares: UnionShareObject[],\n sharedObjects: BaseObject[],\n shareRecipients: BaseObject[],\n interactivesPendingReviews: InteractivesPendingReviews[],\n dependencies: any[]\n): SharedByMeTableData[] {\n return React.useMemo(() => {\n const tableData: SharedByMeTableData[] = [];\n\n sentShares.forEach(s => {\n const sharedObject = sharedObjects.find(o => o.id === s.objectId);\n\n let recipients: BaseObject[] | null = null;\n\n if (s.type === ShareType.DirectShare) {\n recipients = [];\n\n s.recipients?.forEach(r => {\n const recipient = shareRecipients.find(s => s.id === r.id);\n\n if (recipient)\n recipients.push(recipient);\n });\n }\n\n // Skip if we don't have access to the shared object (e.g. if it's been deleted)\n if (sharedObject) {\n const pendingReview = sharedObject.typeId === MasterType.Interactive && interactivesPendingReviews?.find(\n pendingReview => pendingReview.interactiveId === (sharedObject as InteractiveMetadata).interactiveId\n );\n\n tableData.push({\n share: s,\n sharedObject,\n shareRecipients: recipients,\n dateShared: getDateShared(s),\n viewCount: s.viewCount ?? 0,\n pendingReview: pendingReview?.pendingReviewCount\n });\n }\n });\n\n return tableData;\n }, dependencies);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { InteractivesPendingReviews } from 'libs/shared/apps/analytics/interfaces/response/InteractivesPendingReviewsResponse';\nimport { SHARES_TABLE_THEME } from 'libs/shared/apps/share/constants/TableTheme';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Table } from 'libs/shared/components/table/Table';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject, UnionShareObject } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './InsightsListTableUtils';\n\ninterface InsightsListTableProps {\n sentShares: UnionShareObject[];\n sharedObjects: BaseObject[];\n shareRecipients: BaseObject[];\n interactivesPendingReviews: InteractivesPendingReviews[];\n getObjectAppLink: (object: BaseObject) => Core.AppLink;\n getObjectActions: (object: BaseObject) => ActionOptions[];\n imageCdnUrl: string;\n groupByDateShared?: boolean;\n showStatus?: boolean;\n showViewCount?: boolean;\n dependencies?: any[];\n breakpoints?: Breakpoints;\n hideViews?: boolean\n}\n\nfunction InsightsListTableMemo(props: InsightsListTableProps): JSX.Element {\n const data = useGetData(\n props.sentShares,\n props.sharedObjects,\n props.shareRecipients,\n props.interactivesPendingReviews,\n props.dependencies\n );\n\n return (\n <>\n <Table\n columns={getColumns(\n props.getObjectAppLink,\n props.getObjectActions,\n props.imageCdnUrl,\n props.breakpoints,\n props.hideViews\n )}\n data={data}\n theme={SHARES_TABLE_THEME}\n />\n </>\n );\n}\n\nexport const InsightsListTable = React.memo(InsightsListTableMemo);","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\nimport { SharableEntityType } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\n\nconst namespace = 'lite.insightsList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getInsightsObjectActions(\n sharedObject: BaseObject,\n audienceParams: AudienceQueryParams,\n isMobile: boolean\n): ActionOptions[] {\n let entityType: SharableEntityType;\n let insightsAppLink: Core.AppLink;\n\n if (VideoHelper.isVideo(sharedObject)) {\n entityType = 'video';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.VIDEO_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isInteractive(sharedObject)) {\n entityType = 'interactive';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (VideoHelper.isClip(sharedObject)) {\n entityType = 'clip';\n insightsAppLink = {\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.CLIP_OVERVIEW,\n args: [sharedObject.id]\n };\n }\n\n if (sharedObject.typeId === MasterType.Series)\n entityType = 'series';\n\n if (sharedObject.typeId === MasterType.Playlist)\n entityType = 'playlist';\n\n \n const insightObjectActions: ActionOptions[] = [\n {\n label: getPhrase('editShareSettings'),\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.SHARE,\n args: [sharedObject.id],\n params: { entityType }\n }\n }\n ];\n\n if (VideoHelper.isVideoType(sharedObject)) {\n const { canConsume } = VideoHelper.getCanBeConsumed(sharedObject);\n\n if (!canConsume)\n return [];\n\n insightObjectActions.unshift({\n label: getPhrase('viewInsights'),\n className: 'btn btn-outline-dark',\n button: !isMobile,\n svgName: cvSvgLibrary.Chart,\n appLink: { ...insightsAppLink, params: audienceParams }\n });\n }\n\n return insightObjectActions;\n}\n\nexport function useGetInsightsObjectActions(\n breakpoints: Breakpoints,\n audienceParams?: AudienceQueryParams\n): ((object: BaseObject) => ActionOptions[]) | null {\n const isMobile = breakpoints.xs || breakpoints.sm || breakpoints.md;\n const audienceParamsKey = JSON.stringify(audienceParams);\n\n return React.useCallback(\n (object: BaseObject) => getInsightsObjectActions(\n object,\n audienceParams,\n isMobile\n ),\n [ isMobile, audienceParamsKey ]\n );\n}\n\n\nexport function getTypeIdParams(appLink: Core.AppLink): MasterType[] {\n const typeIdParams = (appLink.params as HashObject)?.typeId;\n\n if (!typeIdParams) return [];\n\n if (typeof typeIdParams === 'string')\n return [+typeIdParams];\n\n return (appLink.params as HashObject)?.typeId.map((typeId: MasterType) => +typeId) || [];\n}"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","sort","join","groupIdKey","mapColourToBsVariant","groupColour","getPhrase","ClassroomOverviewView","props","dispatch","breakpoints","classroom","classroomId","isRostered","_integrations","rostered","getRequest","cursor","recipientGroupId","fetchNext","sentShares","items","hasMore","isFetchingSentShares","isFetching","nextCursor","sharedObjectIds","map","s","objectId","sharedObjectsFetchResult","ids","interactiveIds","Object","keys","reduce","acc","value","typeId","interactive","metadataId","interactivesPendingReview","I","interactives","filters","recipientIds","shareRecipientsFetchResult","config","title","getSharedObjectActions","classrooms","showPartialLoading","sentSharesMemo","sharedObjects","shareRecipients","activeTab","onTogglePin","shouldPin","onSuccess","onError","request","length","interactivesPendingReviews","getObjectAppLink","getObjectActions","imageCdnUrl","groupByDateShared","dependencies","hideViews","appLink","application","action","imageUrl","className","numItems","InsightsListEmptyState","src","size","useInteractiveCopy","text","namespace","LanguageService","getDateShared","share","ShareType","recipients","dateCreated","datesShared","r","dateShared","date1","date2","DateHelper","ArrayHelper","InsightsListTable","isMobile","tableData","forEach","sharedObject","find","o","recipient","push","pendingReview","MasterType","viewCount","pendingReviewCount","Table","columns","xs","sm","md","Header","accessor","Cell","SharedObjectImage","object","showVideoMetadata","locationContext","minWidth","maxWidth","row","name","VideoHelper","canNavigate","index","AppLink","analyticsData","analyticsOptions","entity","ShareViewHelper","actionType","location","Text","phrase","options","count","width","SharedToAvatarList","maxAvatars","SvgContainer","svgName","accessedCount","totalAccessible","Actions","actions","actionsDropdownClassName","dropdownToggleSvgSize","S","Boolean","theme","useGetInsightsObjectActions","audienceParams","audienceParamsKey","JSON","stringify","entityType","insightsAppLink","args","insightObjectActions","label","params","canConsume","unshift","button","getInsightsObjectActions","getTypeIdParams","typeIdParams"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7434],{26025:(e,t,n)=>{n.d(t,{B:()=>s});var r=n(1048),a=n(75795),s={getAudienceAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.users,s=t.classrooms,i=t.classroomGroups,o=function(e){var n=t[e];if(n)return Array.isArray(n)?n:[n]},u={};return n&&(u.users=o("users")),s&&(u.classrooms=o("classrooms")),i&&(u.classroomGroups=o("classroomGroups")),u},getDateRangeAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.from,s=t.to,i=t.rangeName,o={};return n&&(o.from=n),s&&(o.to=s),i&&(o.rangeName=i),o}}},26136:(e,t,n)=>{n.d(t,{B:()=>s});var r=n(76198),a=n(64818);function s(e,t){return t?(0,r._8)(function(e){var t=+"".concat(e.id).concat(Math.floor((new Date).getMinutes()/5));return{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:t}}(e)):a.l.getFullName(e)}},40003:(e,t,n)=>{n.d(t,{Hb:()=>m,NG:()=>g,W5:()=>d,eO:()=>v,nG:()=>c,wO:()=>p,zn:()=>u});var r=n(23481),a=n(110),s=n(57266),i=r.T.encloseNamespace("shared.analyticsUtils");function o(e){var t=a.O.convertDateToUTC(e);return a.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function u(){return new Date(2021,0,1)}function c(){return new Date}function l(e){return e.find((function(e){return!!e.default}))}function d(e,t){if(t)return e.find((function(e){return e.name===t}))}function m(){var e=u(),t=(new Date).getFullYear(),n=t===e.getFullYear();return[{name:i("today"),startDate:new Date,endDate:new Date},{name:i("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:i("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:i("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:i("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:i("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:n,tooltip:n?i("lastYearDisabled"):""},{name:i("allTime"),startDate:a.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function f(e){return a.O.format(e,"YYYY-MM-DD")}function v(e){return e.name?{rangeName:e.name}:{from:f(e.startDate),to:f(e.endDate)}}function g(e,t){var n=t.to,r=t.from,i=t.rangeName,o=d(e,i);if(o)return r||n?void s.e.updateParams(v(o),{replace:!0,merge:!0,keysToRemove:["from","to"]}):o;var m=l(e);if(r&&n&&a.O.isValid(r)&&a.O.isValid(n)){var f=!0,g=a.O.convertDateToUTC(new Date(r)),p=a.O.convertDateToUTC(new Date(n));a.O.isBefore(g,u(),"day")&&(g=u(),f=!1),a.O.isAfter(p,c(),"day")&&(p=c(),f=!1),a.O.isAfter(g,p)&&(g=m.startDate,p=m.endDate,f=!1);var y={startDate:g,endDate:p,name:f?i:""};if(f)return y;s.e.updateParams(v(y),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}else s.e.updateParams(v(m),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}function p(e,t){var n=function(e){return o(a.O.startOf(e,"day"))},r=function(e){return o(a.O.endOf(e,"day"))},s=d(e,t.rangeName);if(s)return{start:n(f(s.startDate)),end:r(f(s.endDate))};if(t.from&&t.to)return{start:n(t.from),end:r(t.to)};var i=l(e);return{start:n(f(i.startDate)),end:r(f(i.endDate))}}},70548:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsView:()=>F});var r=n(32735),a=n(23481),s=n(20354),i=n(2948),o=n(41196),u=n(9193),c=n(26025),l=n(26136),d=n(40003),m=n(72915),f=n(39157),v=n(80897),g=n(86572),p=n(28972),y=n(83140),b=n(80845),w=n(2102),k=a.T.encloseNamespace("interactives.studentResponseList");function h(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},k("close")),!!e.interactionsToMark.length&&r.createElement(w.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},k("submitAnswers"))))}var D=a.T.encloseNamespace("interactives.studentResponseList");function A(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},D("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},D("score")),e.summary.awaitingMarking?r.createElement("em",null,D("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),r.createElement("div",null,!!e.interactionsToMark.length&&r.createElement(w.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},D("submitAnswers"))))}const S={awaitingMarking:"MvGb5"};function O(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],u=!0,c=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){c=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return C(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)?C(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 C(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}function R(e){var t,n,a,s,i=O(r.useState(!1),2),o=i[0],u=i[1],c=(t=r.useRef(),n=O(r.useState(!1),2),a=n[0],s=n[1],r.useEffect((function(){t.current&&!a&&(s(!0),t.current.scrollIntoView({behavior:"smooth",block:"center"}))}),[t.current,a]),t),d=(0,f.Rt)(e.interactive,e.studentResults),w=(0,b.Q)(e.interactive),k=function(e,t){return e.filter((function(e){return y.A.isInteractionCorrect(e,(0,b.j_)(t))===p.w.AwaitingMarking}))}(w,e.studentResults);function D(){u(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(A,{summary:d,interactionsToMark:k,markedAnswers:e.markedAnswers,onClickSubmit:D,showSubmitButtonSpinner:o}),r.createElement("ul",{className:"list-unstyled"},w.map((function(t,n){var a,s=t.id.toString()===(null===(a=e.selectedInteractionId)||void 0===a?void 0:a.toString()),i="p-2 mb-3 rounded";return s&&(i+=" border-2 border-info shadow"),i+=k.some((function(e){return e.id===t.id}))?" ".concat(S.awaitingMarking):" border",r.createElement("li",{key:n,className:i,ref:s?c:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(g.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(v.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,f.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:e.anonymiseUsers?(0,l.B)(e.studentResults.user,!0):null,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(m.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,f.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:e.anonymiseUsers?(0,l.B)(e.studentResults.user,!0):null,showFeedback:!0}))}))),r.createElement(h,{interactionsToMark:k,markedAnswers:e.markedAnswers,onClickSubmit:D,onClickClose:e.onClickClose,showSubmitButtonSpinner:o}))}var E=n(9111),M=n(38143),I=n(39151),N=n(20768),j=n(26304),T=n(91286);function U(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 B=a.T.encloseNamespace("shared.interactiveStudentResults");function F(e){var t,n,a,m,f,v,g=(f=(0,i.D)(M.g.ANONYMISE_USERS),v=1,function(e){if(Array.isArray(e))return e}(f)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,s,i,o=[],u=!0,c=!1;try{if(s=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=s.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){c=!0,a=e}finally{try{if(!u&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(f,v)||function(e,t){if(e){if("string"==typeof e)return U(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)?U(e,t):void 0}}(f,v)||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],p=s.a.useBasicFetch(N.b.interactiveMetadata(e.interactiveId)),y=s.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&N.b.interactive(p.data.interactiveId)),b=c.B.getDateRangeAppLinkParams(),w=(0,o.W)(e.interactiveId,Object.assign(Object.assign({},(0,d.wO)((0,d.Hb)(),b)),{userId:e.userId})),k=s.a.useBasicFetch(I.L.config());(0,T.v)([p,w]),(0,j.b)(p);var h=(0,u.D)(null===(n=y.data)||void 0===n?void 0:n.id,null===(a=p.data)||void 0===a?void 0:a.id,e.closePopup),D=h.markedAnswers,A=h.addMarkedAnswers,S=h.submitMarkedAnswers,O=null===(m=w.data)||void 0===m?void 0:m.students.find((function(t){return t.user.id.toString()===e.userId.toString()})),C=O?B("heading",{studentName:(0,l.B)(O.user,g)}):"",F=!!y.data&&!!w.data&&!!k.data;return r.createElement(E.G,{title:C,showLoadingSpinner:!F,closePopup:e.closePopup,size:"lg"},F&&r.createElement(R,{interactive:y.data,studentResults:O,markedAnswers:D,addMarkedAnswers:A,submitMarkedAnswers:S,imageCdnUrl:k.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:g,reportsStyling:e.reportsStyling}))}},94892:(e,t,n)=>{n.d(t,{i:()=>r});var r={HIGH:.75,MODERATE:.5}},94644:(e,t,n)=>{n.d(t,{r:()=>l});var r=n(50242),a=n(81886),s=n(67058),i=n(14553),o=n(49267),u=n(49075),c={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.q},badRequest:u._};function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},c),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==r.o.NotFound?s!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new i.badRequest):n.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):n.notFound||a.Q.Ry.throw(new i.notFound))}}},91286:(e,t,n)=>{n.d(t,{v:()=>i});var r=n(32735),a=n(94644);function s(e){return e.map((function(e){return e.statusCode})).join(":")}function i(e,t,n){var i=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){i.forEach((function(e){(0,a.r)(e.statusCode,t,n)}))}),[s(i),t,n])}},62875:(e,t,n)=>{function r(e,t,n){var r="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return a&&(r+=":".concat(a)),s&&(r+=":".concat(s)),n&&(r+=":".concat(n)),r}n.d(t,{H:()=>r})},57266:(e,t,n)=>{n.d(t,{e:()=>i});var r=n(81886),a=n(1048),s=n(75795),i={updateParams:function(e,t){var n=s.O.getCurrentRoute().appLink,i="string"==typeof n.params?r.Q.Ab.DeserializeQueryParams(n.params):n.params;t.keysToRemove&&(i=a.t.omit(i,t.keysToRemove));var o=(null==t?void 0:t.merge)?Object.assign(Object.assign({},i),e):e,u=Object.assign(Object.assign({},n),{params:o});a.t.isEqual(n,u)||r.Q.C$.trigger(u,a.t.omit(t,["merge","keysToRemove"]))}}}}]);
2
- //# sourceMappingURL=7434-366d4ae5e0-lite.chunk.js.map