@clickview/lite 0.82.3 → 0.83.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1074-fdce06d863-lite.chunk.js +2 -0
- package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +1 -0
- package/dist/scripts/{1199-da55d69853-lite.chunk.js → 1199-01cc084886-lite.chunk.js} +1 -1
- package/dist/scripts/{1199-da55d69853-lite.chunk.js.map → 1199-01cc084886-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2664-87c8cbfa7f-lite.chunk.js → 2664-907153c03b-lite.chunk.js} +2 -2
- package/dist/scripts/2664-907153c03b-lite.chunk.js.map +1 -0
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js +2 -0
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +1 -0
- package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 3392-f7f8cb65e5-lite.chunk.js} +3 -3
- package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +1 -0
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js +2 -0
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +1 -0
- package/dist/scripts/{4177-285ddf9ae3-lite.chunk.js → 4177-2d876c7b14-lite.chunk.js} +2 -2
- package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +1 -0
- package/dist/scripts/{1336-1826f6e582-lite.chunk.js → 4208-0706461da6-lite.chunk.js} +2 -2
- package/dist/scripts/4208-0706461da6-lite.chunk.js.map +1 -0
- package/dist/scripts/{4578-7578bcf17a-lite.chunk.js → 4578-27028d26eb-lite.chunk.js} +2 -2
- package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +2 -0
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +1 -0
- package/dist/scripts/{4621-1f79d94416-lite.chunk.js → 4621-7fb0a05bcb-lite.chunk.js} +2 -2
- package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js +2 -0
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +1 -0
- package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js → 4948-ba684e5f4f-lite.chunk.js} +1 -1
- package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js.map → 4948-ba684e5f4f-lite.chunk.js.map} +1 -1
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js +2 -0
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +1 -0
- package/dist/scripts/{5554-17bb3b86fc-lite.chunk.js → 5554-f1f3baf822-lite.chunk.js} +2 -2
- package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +1 -0
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +2 -0
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +1 -0
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +2 -0
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-a9b8930e37-lite.chunk.js → 6909-ba75701156-lite.chunk.js} +2 -2
- package/dist/scripts/6909-ba75701156-lite.chunk.js.map +1 -0
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +2 -0
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +1 -0
- package/dist/scripts/7568-55e9b01367-lite.chunk.js +3 -0
- package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +1 -0
- package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-211f084b70-lite.chunk.js} +2 -2
- package/dist/scripts/7617-211f084b70-lite.chunk.js.map +1 -0
- package/dist/scripts/7742-514844bd1a-lite.chunk.js +2 -0
- package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +1 -0
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js +2 -0
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +1 -0
- package/dist/scripts/8077-870bd8e245-lite.chunk.js +3 -0
- package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +1 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js +3 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +1 -0
- package/dist/scripts/8735-e74a148502-lite.chunk.js +2 -0
- package/dist/scripts/8735-e74a148502-lite.chunk.js.map +1 -0
- package/dist/scripts/8856-2d332952ae-lite.chunk.js +2 -0
- package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +1 -0
- package/dist/scripts/904-2784e45cfc-lite.chunk.js +2 -0
- package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +1 -0
- package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js → 9042-fd7e79b891-lite.chunk.js} +1 -1
- package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js.map → 9042-fd7e79b891-lite.chunk.js.map} +1 -1
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js +2 -0
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +1 -0
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js +2 -0
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +1 -0
- package/dist/scripts/{9742-5f99d74bb0-lite.chunk.js → 9742-3f6b75484a-lite.chunk.js} +2 -2
- package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +1 -0
- package/dist/scripts/979-6a70a0e616-lite.chunk.js +2 -0
- package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +1 -0
- package/dist/scripts/{3612-8c6423bd51-lite.chunk.js → 9911-8892b6dbfe-lite.chunk.js} +2 -2
- package/dist/scripts/{3612-8c6423bd51-lite.chunk.js.map → 9911-8892b6dbfe-lite.chunk.js.map} +1 -1
- package/dist/scripts/bundle-f926852f33.min.js +3 -0
- package/dist/scripts/{bundle-610971c0fb.min.js.map → bundle-f926852f33.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/css/2074-lite-ac8da6c78b.chunk.css +0 -4
- package/dist/scripts/1202-d96ad80884-lite.chunk.js +0 -2
- package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +0 -1
- package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +0 -1
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
- package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +0 -1
- package/dist/scripts/2888-2596e106a5-lite.chunk.js +0 -2
- package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +0 -1
- package/dist/scripts/289-669c0c8222-lite.chunk.js +0 -2
- package/dist/scripts/289-669c0c8222-lite.chunk.js.map +0 -1
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
- package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
- package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
- package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +0 -1
- package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +0 -1
- package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-f36469abb7-lite.chunk.js +0 -2
- package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +0 -1
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
- package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +0 -1
- package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
- package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +0 -1
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
- package/dist/scripts/6070-a390fdce21-lite.chunk.js +0 -2
- package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
- package/dist/scripts/7401-833bc4a088-lite.chunk.js +0 -2
- package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +0 -1
- package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
- package/dist/scripts/7843-f6033528ce-lite.chunk.js +0 -2
- package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +0 -2
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +0 -1
- package/dist/scripts/8077-9fdb522d7e-lite.chunk.js +0 -2
- package/dist/scripts/8077-9fdb522d7e-lite.chunk.js.map +0 -1
- package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
- package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
- package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js +0 -2
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +0 -1
- package/dist/scripts/9295-4242401e60-lite.chunk.js +0 -2
- package/dist/scripts/9295-4242401e60-lite.chunk.js.map +0 -1
- package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
- package/dist/scripts/979-4b893e5603-lite.chunk.js +0 -2
- package/dist/scripts/979-4b893e5603-lite.chunk.js.map +0 -1
- package/dist/scripts/9911-9272b96e46-lite.chunk.js +0 -2
- package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-610971c0fb.min.js +0 -3
- /package/dist/css/{787-lite-5a317efacd.chunk.css → 2970-lite-5a317efacd.chunk.css} +0 -0
- /package/dist/css/{6070-lite-45dc286aab.chunk.css → 6550-lite-45dc286aab.chunk.css} +0 -0
- /package/dist/css/{2888-lite-856c02f000.chunk.css → 7148-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{8364-lite-db31e36b79.chunk.css → 843-lite-db31e36b79.chunk.css} +0 -0
- /package/dist/css/{9911-lite-856c02f000.chunk.css → 8735-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{5579-lite-f8e496136d.chunk.css → 8856-lite-f8e496136d.chunk.css} +0 -0
- /package/dist/css/{289-lite-2435a34b13.chunk.css → 904-lite-2435a34b13.chunk.css} +0 -0
- /package/dist/css/{1202-lite-4a892bdbf2.chunk.css → 9528-lite-4a892bdbf2.chunk.css} +0 -0
- /package/dist/css/{3612-lite-2b4142796a.chunk.css → 9911-lite-2b4142796a.chunk.css} +0 -0
- /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7568-55e9b01367-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 8077-870bd8e245-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-610971c0fb.min.js.LICENSE.txt → bundle-f926852f33.min.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4948],{21976:(e,t,a)=>{a.d(t,{x:()=>u});var n=a(32735),r=a(72306),s=a.n(r),i=a(70312),l=a.n(i),c=a(75896),o=a(70072),m=function(e){return{title:{text:null},credits:{enabled:!1},yAxis:{title:{text:null},labels:{enabled:!1},gridLineWidth:0,tickPixelInterval:1,startOnTick:!1,endOnTick:!1,min:-.2},xAxis:{title:{text:e,margin:8,style:o.d},labels:{style:o.d},lineWidth:0},legend:{enabled:!1},chart:{type:"column",backgroundColor:"transparent",height:"160px",spacingTop:20},plotOptions:{column:{dataLabels:{enabled:!1},enableMouseTracking:!1,minPointLength:8}}}};function u(e){var t,a,r,i,o=n.useRef(),u=n.useRef(null);return n.useEffect(function(){if(e.withObserver&&window.ResizeObserver){var t=new window.ResizeObserver(function(){var e;null===(e=o.current)||void 0===e||e.chart.reflow()});return o.current&&t.observe(u.current),function(){return t.disconnect()}}},[e.withObserver]),n.createElement("div",{ref:u},n.createElement(l(),{highcharts:s(),options:(a=e.chartData,r=m(e.label),i=null===(t=c.m.first(a.series))||void 0===t?void 0:t.data.some(function(e){return e.y>0}),Object.assign(Object.assign({},r),{yAxis:Object.assign(Object.assign({},r.yAxis),i?{min:-.2}:{min:0,max:1}),xAxis:Object.assign(Object.assign(Object.assign({},r.xAxis),e.xAxis),{categories:a.categories}),series:a.series})),ref:o}))}},98551:(e,t,a)=>{a.d(t,{y:()=>m});var n=a(32735),r=a(77640),s=a(15611),i=a(40782),l=a(2606);const c={avatar:"uMuZt",image:"WdKiU"};var o=3;function m(e){return n.createElement(n.Fragment,null,e.students.length?n.createElement("ul",{className:"list-unstyled mb-2"},e.students.slice(0,o).map(function(t,a){return n.createElement("li",{key:a,className:"d-flex align-items-center mb-2"},n.createElement(r.t,{user:t,imageCdnUrl:e.imageCdnUrl,avatarClassName:c.avatar,detailsClassName:"ms-2",showDisplayName:!0,showSubText:!1,anonymiseUsers:e.anonymiseUsers}),n.createElement("div",{className:"d-flex align-items-center ms-auto"},n.createElement("span",{className:"me-2"},void 0===t.percentage?"- ":Math.round(100*t.percentage),"%"),n.createElement(i.O,{percentage:t.percentage,size:l.Mk.ExtraSmall})))})):n.createElement("div",{className:"text-center"},n.createElement("img",{className:"".concat(c.image," mb-2"),src:e.imageUrl}),n.createElement("p",{className:"text-secondary mb-0",dangerouslySetInnerHTML:{__html:e.description}})),!!e.students.length&&e.appLink&&n.createElement(s.F,{appLink:e.appLink,className:"text-info mt-auto"},e.appLinkText))}},51870:(e,t,a)=>{a.d(t,{i:()=>g});var n=a(32735),r=a(23481),s=a(84621),i=a(21976),l=a(70072),c=a(83345),o=a(35223);const m={purpleChart:"OPcvi",grayChart:"HlWj7"};function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var d="shared.insightDevices",p=r.T.encloseNamespace(d);function g(e){var t,a,r=function(){var t,a={Phone:0,Computer:0};return(null===(t=e.osCount)||void 0===t?void 0:t.length)?e.osCount.reduce(function(e,t){if(!t.name)return e;var a=function(e){switch(e){case"Android":case"Windows Phone":case"iOS":case"BlackBerry":return"Phone";case"Linux":case"Unix":case"Macintosh":case"Windows":return"Computer"}}(t.name);return a?(e[a]=e[a]+t.count,e):e},a):a}(),g=Math.max.apply(Math,function(e){if(Array.isArray(e))return u(e)}(a=Object.keys(r).map(function(e){return r[e]}))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?u(e,t):void 0}}(a)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),h=Object.keys(r).filter(function(e){return r[e]===g}),v={categories:Object.keys(r),series:[{type:"column",borderRadius:4,dataLabels:{enabled:!0,style:l.d,inside:!1,overflow:"allow",crop:!1},data:Object.keys(r).map(function(e){var t=0!==g&&r[e]===g;return{className:"".concat(0===r[e]?m.grayChart:m.purpleChart," ").concat(t?"":"opacity-25"),borderWidth:t?2:0,borderColor:t?"black":"",y:r[e]}})}]};return n.createElement(s.L,{title:p("title"),svgClassName:"bg-light-ultramarine text-ultramarine",svgName:o.vn.Monitor},n.createElement("p",{className:"mb-0"},(null===(t=e.osCount)||void 0===t?void 0:t.filter(function(e){return e.name}).length)?n.createElement(c.x,{namespace:d,phrase:"description",options:{smartCount:h.length,device:1===h.length?h[0].toLowerCase():null}}):n.createElement(c.x,{namespace:d,phrase:"notViewed"})),n.createElement("div",{className:"position-relative mt-auto"},n.createElement(i.x,{label:p("device"),chartData:v,xAxis:{labels:{useHTML:!0,formatter:function(){return'\n <div class="d-flex flex-column align-items-center">\n <span class="'.concat(m.font,' font-size-sm text-dark mb-1">').concat(this.value,"</span>\n ").concat(function(e){var t="";switch(e){case"Computer":t=o.vn.Monitor;break;case"Phone":t=o.vn.Mobile;break;case"Tablet":t=o.vn.Tablet;break;default:return}return o.Nj.getSvg(t).replace(/<svg[^>]*>/g,'<svg class="svg-container">')}(this.value),"\n </div>\n ")}}},withObserver:!0})))}},50916:(e,t,a)=>{a.d(t,{b:()=>p});var n=a(32735),r=a(23481),s=a(38307),i=a(84621),l=a(15611),c=a(83345),o=a(35223);const m={heatMap:"Rfr9N",heatMapTimepointIndicator:"s6JbA",heatMapTimepointIndicatorVisible:"mgjWX"};var u="shared.insightHeatmap",d=r.T.encloseNamespace(u);function p(e){var t,a=e.engagementRate||(null===(t=e.engagement)||void 0===t?void 0:t.engagementRate),r=a>0?Math.round(100*a):null;return n.createElement(i.L,{title:d("title"),svgName:o.vn.Timer,svgClassName:"bg-light-green text-green"},n.createElement("div",{className:"mb-2"},n.createElement("p",{className:"mb-0"},r?n.createElement(c.x,{namespace:u,phrase:"everyoneWatched",options:{engagementRate:r}}):n.createElement(c.x,{namespace:u,phrase:"notWatched"})),!!r&&n.createElement(l.F,{appLink:e.heatmapAppLink,className:"text-info"},n.createElement(c.x,{namespace:u,phrase:"viewHeatmap"}))),n.createElement("div",{className:"mb-2"},n.createElement(s.c,{engagement:e.engagement,className:m.heatMap})),n.createElement("p",{className:"h3 text-center mb-2"},r||"--","%"),n.createElement("p",{className:"text-center mb-0 font-size-sm"},n.createElement(c.x,{namespace:u,phrase:"amountWatched"})))}},53214:(e,t,a)=>{a.d(t,{u:()=>v});var n=a(32735),r=a(23481),s=a(2510),i=a(97958),l=a(83345),c=a(99705),o=a(12778),m=a(35223),u=a(99742),d=a(86099),p=a(38279),g="lite.insightsMask",h=r.T.encloseNamespace(g);function v(e){var t=(0,d.Zm)(e.share);return n.createElement("div",{className:"".concat(!e.hasData&&p.Z.mask," position-relative")},n.createElement("div",{className:e.hasData?"":"position-absolute ps-1"},e.children),n.createElement("div",{className:e.hasData?"":"".concat(p.Z.backdrop," d-flex flex-column align-items-center justify-content-start py-5")},!e.hasData&&n.createElement(i.u,null,n.createElement(i.u.Image,{src:u.W.Insights.SEND_PAPER_PLANE}),n.createElement(i.u.Heading,null,n.createElement(l.x,{namespace:g,phrase:"shareHeading"})),n.createElement(i.u.Info,{className:"w-75"},n.createElement(l.x,{namespace:g,phrase:"shareDescription"})," "),n.createElement(i.u.Cta,{text:h(e.share.type===s.y.Link?"share":"shareOptions"),appLink:t,icon:m.vn.Share,className:"btn btn-dark mb-3"}),n.createElement(i.u.Cta,{text:h("shareInfo"),href:o.o.getLiteArticle(c.b.Sharing),openInNewTab:!0,className:"btn btn-link text-info py-0"}))))}},54948:(e,t,a)=>{a.d(t,{m:()=>le});var n=a(32735),r=a(23481),s=a(84621),i=a(21976),l=a(70072),c=a(83345),o=a(35223);const m={tealChart:"lZZf0",grayChart:"wJQc4"};function u(e){return u="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},u(e)}function d(e){return function(e){if(Array.isArray(e))return g(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(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 p(e,t){if(e){if("string"==typeof e)return g(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?g(e,t):void 0}}function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var h="shared.insightAverageAttempts",v=r.T.encloseNamespace(h);function b(e){var t,a,r=function(){var t=e.students.reduce(function(e,t){var a,n,r,s=t.summary.attempts.toString();return s in e||Object.assign(e,(a={},r=0,(n=function(e){var t=function(e){if("object"!=u(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=u(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==u(t)?t:t+""}(n=s))in a?Object.defineProperty(a,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[n]=r,a)),e[s]++,e},{});return Object.keys(t).length?t:{0:0}}(),g=Math.max.apply(Math,d(Object.keys(r).map(function(e){return r[e]}))),b=Object.keys(r).reduce(function(e,t){return r[t]===g?[].concat(d(e),[t]):e},[]),f=(t=0===r[0],{categories:Object.keys(r),series:[{type:"column",color:r[0]?"#EAEAEA":"#40C2BB",borderRadius:4,dataLabels:{enabled:!t,style:l.d,inside:!1,overflow:"allow",crop:!1},data:Object.keys(r).map(function(e){var a=0!==g&&r[e]===g;return{className:"".concat(t?m.grayChart:m.tealChart," ").concat(r[e]!==g&&0!==r[e]?"opacity-25":""),borderWidth:a?2:0,borderColor:a?"black":"",y:r[e]}})}]});return n.createElement(s.L,{title:v("title"),svgName:o.vn.Refresh,svgClassName:"bg-light-purple text-purple"},n.createElement("p",null,b.length?n.createElement(c.x,{namespace:h,phrase:"averageAttempts",options:{smartCount:(a=Object.entries(r).reduce(function(e,t){var a,n,r=(n=2,function(e){if(Array.isArray(e))return e}(a=t)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,s,i,l=[],c=!0,o=!1;try{if(s=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=s.call(a)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){o=!0,r=e}finally{try{if(!c&&null!=a.return&&(i=a.return(),Object(i)!==i))return}finally{if(o)throw r}}return l}}(a,n)||p(a,n)||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.")}()),s=r[0],i=r[1];return e.totalAttempts+=+s*i,e.totalUsers+=i,e},{totalAttempts:0,totalUsers:0}),0===a.totalUsers?0:Math.round(a.totalAttempts/a.totalUsers*100)/100)}}):n.createElement(c.x,{namespace:h,phrase:"noAttempts"})),n.createElement("div",{className:"mt-auto"},n.createElement(i.x,{label:v("attempts"),chartData:f})))}var f=a(75896);const y={redChart:"G7zOw",yellowChart:"k34mm",greenChart:"vBneA",blueChart:"RPTWm",grayChart:"k4JFZ",borderDark:"LWor3"};var E="shared.insightAverageScore",k=r.T.encloseNamespace(E);function N(e){return n.createElement(s.L,{title:k("title"),svgName:o.vn.Analytics,svgClassName:"bg-light-orange text-orange"},n.createElement("p",null,e.students.length?n.createElement(c.x,{namespace:E,phrase:"averageScore",options:(l=e.students.map(function(e){return e.summary.percentCorrect}),m=l.reduce(function(e,t){return e+t},0)/l.length,u=f.m.last(f.m.last(e.students).results).attempts.length,{averageScore:Math.round(u*m),totalQuestions:u,averagePercentage:(100*m).toFixed(1)})}):n.createElement(c.x,{namespace:E,phrase:"noAnswers"})),n.createElement(i.x,{label:"".concat(k("studentScores")," (%)"),chartData:(t=Array(11).fill(0),a=e.students.reduce(function(e,t){return e[Math.floor(10*t.summary.percentCorrect)]++,e},t),r=["0","10","20","30","40","50","60","70","80","90","100"],{categories:r,series:[{type:"column",color:"#4E9ACE",borderRadius:4,data:a.map(function(e,t){var a=Number(r[t]);return{className:"".concat(function(e,t){return 0===t?y.grayChart:e<50?y.redChart:e<70?y.yellowChart:e<90?y.greenChart:y.blueChart}(a,e)),y:e}})}]})}));var t,a,r,l,m,u}var A=a(98551),C=r.T.encloseNamespace("shared.insightCompletedStudents");function x(e){return n.createElement(s.L,{title:C("title"),svgName:o.vn.Flag,svgClassName:"bg-light-indigo text-indigo",count:e.students.length},n.createElement(A.y,{students:e.students.map(function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})}),imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:C("completedStudents"),appLink:e.resultsAppLink,appLinkText:C("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var L=a(51870),S=a(39157),O=a(15611),w=a(86572),U=a(40782),j=a(80845),I="shared.insightEasiestQuestion",M=r.T.encloseNamespace(I);function T(e){var t,a=n.useMemo(function(){return t=e.interactive,a=e.results,n=(0,j.Q)(t).map(function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,S.nq)(e,a)})}).filter(function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking}),r=f.m.sortBy(n,function(e){return e.resultsSummary.percentCorrect}),f.m.last(r);var t,a,n,r},[e.results.students.length]);return n.createElement(s.L,{title:M("title"),svgName:o.vn.StarOutline,svgClassName:"bg-light-blue text-blue"},n.createElement("div",{className:"d-flex align-items-center"},n.createElement(U.O,{percentage:null===(t=null==a?void 0:a.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:U.I.LabelInside}),a?n.createElement("div",{className:"d-flex ms-2"},n.createElement(w.y,{interaction:a,iconClassName:"flex-shrink-0"})):n.createElement("span",{className:"ms-2"},M("noAnswers"))),a&&n.createElement(O.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_desc"})}),className:"text-info"},n.createElement(c.x,{namespace:I,phrase:"viewQuestions"})))}var R="shared.insightHardestQuestion",q=r.T.encloseNamespace(R);function W(e){var t,a=n.useMemo(function(){return t=e.interactive,a=e.results,n=(0,j.Q)(t).map(function(e){return Object.assign(Object.assign({},e),{resultsSummary:(0,S.nq)(e,a)})}).filter(function(e){return!!e.resultsSummary.answered&&!e.resultsSummary.awaitingMarking}),r=f.m.sortBy(n,function(e){return e.resultsSummary.percentCorrect}),f.m.first(r);var t,a,n,r},[e.results.students.length]);return n.createElement(s.L,{title:q("title"),svgName:o.vn.QuestionMark,svgClassName:"bg-light-orange text-orange"},n.createElement("div",{className:"d-flex align-items-center"},n.createElement(U.O,{percentage:null===(t=null==a?void 0:a.resultsSummary)||void 0===t?void 0:t.percentCorrect,layout:U.I.LabelInside}),a?n.createElement("div",{className:"d-flex ms-2"},n.createElement(w.y,{interaction:a,iconClassName:"flex-shrink-0"})):n.createElement("span",{className:"ms-2"},q("noAnswers"))),a&&n.createElement(O.F,{appLink:Object.assign(Object.assign({},e.questionsAppLink),{params:Object.assign(Object.assign({},e.questionsAppLink.params),{sortBy:"score_asc"})}),className:"text-info"},n.createElement(c.x,{namespace:R,phrase:"viewQuestions"})))}var B=a(50916),P=r.T.encloseNamespace("shared.insightHighScoringStudents");function _(e){return n.createElement(s.L,{title:P("title"),svgName:o.vn.Trophy,svgClassName:"bg-light-teal text-teal",count:e.students.length},n.createElement(A.y,{students:e.students.map(function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})}),imageCdnUrl:e.imageCdnUrl,imageUrl:e.greenChartImageUrl,description:P(e.completed.length?"noStudents":"highScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_desc"})}),appLinkText:P("viewByHighest"),anonymiseUsers:e.anonymiseUsers}))}var D=r.T.encloseNamespace("shared.insightLowScoringStudents");function H(e){return n.createElement(s.L,{title:D("title"),svgName:o.vn.Hand,svgClassName:"bg-light-red text-red",count:e.students.length},n.createElement(A.y,{students:e.students.map(function(e){return Object.assign(Object.assign({},e.user),{percentage:e.summary.percentCorrect})}),imageCdnUrl:e.imageCdnUrl,imageUrl:e.completed.length?e.heartImageUrl:e.redChartImageUrl,description:D(e.completed.length?"doingWell":"lowScore"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:Object.assign(Object.assign({},e.resultsAppLink.params),{sortBy:"score_asc"})}),appLinkText:D("viewByLowest"),anonymiseUsers:e.anonymiseUsers}))}var Q=r.T.encloseNamespace("shared.insightMarkingRequired");function Z(e){return n.createElement(s.L,{title:Q("title"),svgName:o.vn.Hand,svgClassName:"bg-light-blue text-blue",count:e.students.length},n.createElement(A.y,{students:e.students,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:Q("studentsRequireMarking"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:{filterBy:"marking_required"}}),appLinkText:Q("viewAll"),anonymiseUsers:e.anonymiseUsers}))}function z(e){return function(e){if(Array.isArray(e))return F(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 F(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?F(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 F(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var G=r.T.encloseNamespace("shared.insightNotCompletedStudents");function J(e){var t,a,r,i=(t=e.markingRequiredStudents.map(function(e){return null==e?void 0:e.user.id}),a=e.completedStudents.map(function(e){return null==e?void 0:e.user.id}),r=e.classroomStudents.filter(function(e){return!t.includes(e.id)&&!a.includes(e.id)}),f.m.uniq([].concat(z(e.notCompletedStudents.map(function(e){return e.user})),z(r)),"id"));return n.createElement(s.L,{title:G("title"),svgName:o.vn.Puzzle,svgClassName:"bg-light-teal text-teal",count:i.length},n.createElement(A.y,{students:i,imageCdnUrl:e.imageCdnUrl,imageUrl:e.imageUrl,description:G("completed"),appLink:Object.assign(Object.assign({},e.resultsAppLink),{params:{filterBy:"not_completed"}}),appLinkText:G("viewAll"),anonymiseUsers:e.anonymiseUsers}))}var V=a(8604),$=a(94892),K=a(99742),X=a(91693),Y=a(38279),ee="lite.insightsMask";function te(e){return n.createElement("div",{className:"".concat(e.requiresMarking&&Y.Z.mask," position-relative")},n.createElement("div",{className:e.requiresMarking?"position-absolute top-0":""},e.children),n.createElement("div",{className:e.requiresMarking?"".concat(Y.Z.backdrop," d-flex flex-column align-items-center justify-content-start py-5"):""},!!e.requiresMarking&&n.createElement("div",{className:"text-center w-50"},n.createElement("img",{src:K.W.Insights.MARKING_RESPONSES,className:"mb-3",width:288}),n.createElement("h2",{className:"h3 mb-3"},n.createElement(c.x,{namespace:ee,phrase:"markHeading"})),n.createElement("p",{className:"mb-3"},n.createElement(c.x,{namespace:ee,phrase:"markDescription"})),n.createElement(X.h,{svgName:o.vn.Check,className:"btn btn-dark mb-3",appLink:Object.assign(Object.assign({},e.appLink),{params:Object.assign(Object.assign({},e.appLink.params),{filterBy:"marking_required"})})},n.createElement(c.x,{namespace:ee,phrase:"markResponses",options:{smartCount:e.requiresMarking}})),n.createElement("button",{className:"btn btn-link d-block p-0 mx-auto",onClick:e.hideMarkingRequiredMask},n.createElement(c.x,{namespace:ee,phrase:"seeIncomplete"})))))}var ae=a(53214);const ne={partialInsights:"pG0Jh"};function re(){return n.createElement("div",null,n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))),n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))),n.createElement("h2",{className:"h4 w-25 partial-loading-background"}," "),n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(ne.partialInsights," rounded partial-loading-background")}))))}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var ie="insights.interactiveInsightsOverview";function le(e){var t,a,r,s,i,l,o,m=(i=n.useState(!1),l=2,function(e){if(Array.isArray(e))return e}(i)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,s,i,l=[],c=!0,o=!1;try{if(s=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=s.call(a)).done)&&(l.push(n.value),l.length!==t);c=!0);}catch(e){o=!0,r=e}finally{try{if(!c&&null!=a.return&&(i=a.return(),Object(i)!==i))return}finally{if(o)throw r}}return l}}(i,l)||function(e,t){if(e){if("string"==typeof e)return se(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?se(e,t):void 0}}(i,l)||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.")}()),u=m[0],d=m[1],p=e.hasDataLoaded&&(0,S.R6)(e.interactive,e.results,$.T),g=e.hasDataLoaded&&!!e.results.students.length,h=(null===(r=null===(a=null===(t=e.results)||void 0===t?void 0:t.students)||void 0===a?void 0:a.filter(function(e){return!e.isPlaceholder}))||void 0===r?void 0:r.length)||0;return n.createElement(n.Fragment,null,!e.hasDataLoaded&&n.createElement(re,null),e.hasDataLoaded&&n.createElement(ae.u,{video:e.interactiveMetadata,hasData:g,share:e.share},n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(c.x,{namespace:ie,phrase:"studentResponses"}),n.createElement("span",null,": ",h,e.classroomStudents?"/".concat(e.classroomStudents.length):"")),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col"},n.createElement(Z,{imageUrl:K.W.Insights.SPEECH_BUBBLE_ASTERISK,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:(o=p.markingRequired,o.map(function(e){return e.user})),anonymiseUsers:e.anonymiseUsers})),!!(null===(s=e.classroomStudents)||void 0===s?void 0:s.length)&&n.createElement("div",{className:"col"},n.createElement(J,{markingRequiredStudents:p.markingRequired,completedStudents:p.completed,notCompletedStudents:p.notCompleted,classroomStudents:e.classroomStudents,imageCdnUrl:e.config.imageCdnUrl,imageUrl:K.W.Insights.JIGSAW,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers})),n.createElement("div",{className:"col"},n.createElement(x,{students:p.completed,imageCdnUrl:e.config.imageCdnUrl,imageUrl:K.W.Insights.AVATAR,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,anonymiseUsers:e.anonymiseUsers})))),n.createElement(te,{requiresMarking:!u&&p.markingRequired.length,appLink:e.interactiveInsightsAppLinks.resultsAppLink,hideMarkingRequiredMask:function(){return d(!0)}},n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(c.x,{namespace:ie,phrase:"studentsPerformance"})),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col-6"},n.createElement(H,{redChartImageUrl:K.W.Insights.RED_CHART,heartImageUrl:K.W.Insights.SPEECH_BUBBLE_HEART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:p.lowScore,completed:p.completed,anonymiseUsers:e.anonymiseUsers})),n.createElement("div",{className:"col-6"},n.createElement(_,{greenChartImageUrl:K.W.Insights.GREEN_CHART,resultsAppLink:e.interactiveInsightsAppLinks.resultsAppLink,imageCdnUrl:e.config.imageCdnUrl,students:p.highScore,completed:p.completed,anonymiseUsers:e.anonymiseUsers})),n.createElement("div",{className:"col-6"},n.createElement(W,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})),n.createElement("div",{className:"col-6"},n.createElement(T,{interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results,questionsAppLink:e.interactiveInsightsAppLinks.questionsAppLink})))),n.createElement("section",{className:"mb-5"},n.createElement("h2",{className:"h4"},n.createElement(c.x,{namespace:ie,phrase:"classPerformance"})),n.createElement("div",{className:"row g-3"},n.createElement("div",{className:"col-6"},n.createElement(N,{students:p.completed})),n.createElement("div",{className:"col-6"},n.createElement(b,{students:p.completed})),n.createElement("div",{className:"col-6"},n.createElement(L.i,{osCount:e.osCount})),n.createElement("div",{className:"col-6"},n.createElement(B.b,{engagement:e.aggregateEngagement,heatmapAppLink:e.interactiveInsightsAppLinks.heatmapAppLink,engagementRate:(0,V.Q)(e.individualEngagement)})))))))}},38279:(e,t,a)=>{a.d(t,{Z:()=>n});const n={mask:"VRTes",backdrop:"XzVXl"}}}]);
|
|
2
|
-
//# sourceMappingURL=4948-
|
|
2
|
+
//# sourceMappingURL=4948-ba684e5f4f-lite.chunk.js.map
|
package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js.map → 4948-ba684e5f4f-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/4948-de1c75e7fb-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/InsightChart.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/insight-student-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/InsightStudentList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/insight-devices.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/InsightDevices.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/insight-heatmap.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/InsightHeatmap.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsShareMask.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/insight-average-attempts.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/InsightAverageAttempts.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/insight-average-score.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/InsightAverageScore.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/completed-students/InsightCompletedStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/hardest-question/InsightHardestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/marking-required/InsightMarkingRequired.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/partial-interactive-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/insights-mask.scss"],"sourcesContent":["import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\n\nconst getStaticChartOptions = (label: string): Highcharts.Options => {\n return {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n yAxis: {\n title: {\n text: null\n },\n labels: {\n enabled: false\n },\n gridLineWidth: 0,\n tickPixelInterval: 1,\n startOnTick: false,\n endOnTick: false,\n min: -0.2\n },\n xAxis: {\n title: {\n text: label,\n margin: 8,\n style: CHART_FONT_STYLES\n },\n labels: {\n style: CHART_FONT_STYLES\n },\n lineWidth: 0\n },\n legend: {\n enabled: false\n },\n chart: {\n type: 'column',\n backgroundColor: 'transparent',\n height: '160px',\n spacingTop: 20\n },\n plotOptions: {\n column: {\n dataLabels: {\n enabled: false\n },\n enableMouseTracking: false,\n minPointLength: 8\n }\n }\n };\n};\n\ninterface InsightChartProps {\n label: string;\n chartData: ChartData;\n xAxis?: Highcharts.XAxisOptions;\n withObserver?: boolean;\n}\n\nexport function InsightChart(props: InsightChartProps) {\n const ref = React.useRef<{ chart: Highcharts.Chart, container: React.RefObject<HTMLDivElement> }>();\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!props.withObserver || !window.ResizeObserver)\n return;\n\n const observer = new window.ResizeObserver(() => {\n ref.current?.chart.reflow();\n });\n\n if (ref.current)\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [props.withObserver]);\n\n function getChartOptions(): Highcharts.Options {\n const data = props.chartData;\n const staticChartOptions = getStaticChartOptions(props.label);\n\n const hasData = ArrayHelper.first(data.series)?.data.some((data: Highcharts.PointOptionsObject) => data.y > 0);\n\n return {\n ...staticChartOptions,\n yAxis: {\n ...staticChartOptions.yAxis,\n ...(hasData ? {\n min: -0.2\n } : {\n min: 0,\n max: 1\n })\n },\n xAxis: {\n ...staticChartOptions.xAxis,\n ...props.xAxis,\n categories: data.categories\n },\n series: data.series\n };\n }\n\n return (\n <div ref={containerRef}>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions()}\n ref={ref}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"uMuZt\",\"image\":\"WdKiU\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { ProgressCircleSize } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport styles from './insight-student-list.scss';\n\ntype UserPercentage = AnonUser & {\n percentage?: number;\n}\n\nconst MAX_ITEMS = 3;\n\ninterface InsightStudentListProps {\n students: UserPercentage[];\n imageUrl: string;\n imageCdnUrl: string;\n description: string;\n anonymiseUsers: boolean;\n appLink?: Core.AppLink;\n appLinkText?: string;\n}\n\nexport function InsightStudentList(props: InsightStudentListProps) {\n return (\n <>\n {props.students.length ? (\n <ul className='list-unstyled mb-2'>\n {props.students.slice(0, MAX_ITEMS).map((student, index) => (\n <li key={index} className='d-flex align-items-center mb-2'>\n <UserRecipientItemMetadata\n user={student}\n imageCdnUrl={props.imageCdnUrl}\n avatarClassName={styles.avatar}\n detailsClassName='ms-2'\n showDisplayName\n showSubText={false}\n anonymiseUsers={props.anonymiseUsers}\n />\n\n <div className='d-flex align-items-center ms-auto'>\n <span className='me-2'>{student.percentage === undefined ? '- ' : Math.round(student.percentage * 100)}%</span>\n <PercentageIndicator percentage={student.percentage} size={ProgressCircleSize.ExtraSmall} />\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className='text-center'>\n <img className={`${styles.image} mb-2`} src={props.imageUrl} />\n <p className='text-secondary mb-0' dangerouslySetInnerHTML={{ __html: props.description }} />\n </div>\n )}\n\n {!!props.students.length && props.appLink && (\n <AppLink appLink={props.appLink} className='text-info mt-auto'>\n {props.appLinkText}\n </AppLink>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"purpleChart\":\"OPcvi\",\"grayChart\":\"HlWj7\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary, SvgHelper } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-devices.scss';\n\nconst namespace = 'shared.insightDevices';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// Names from UserAgentHelper.getOperatingSystem()\nfunction getDeviceType(name: string) {\n switch (name) {\n case 'Android':\n case 'Windows Phone':\n case 'iOS':\n case 'BlackBerry':\n return 'Phone';\n case 'Linux':\n case 'Unix':\n case 'Macintosh':\n case 'Windows':\n return 'Computer';\n }\n}\n\nfunction getDeviceIcon(name: string) {\n let svgName = '';\n \n switch (name) {\n case 'Computer':\n svgName = cvSvgLibrary.Monitor;\n break;\n case 'Phone':\n svgName = cvSvgLibrary.Mobile;\n break;\n case 'Tablet':\n svgName = cvSvgLibrary.Tablet;\n break;\n default: return;\n }\n \n // Default svg attributes causes Highcharts error\n return SvgHelper.getSvg(svgName).replace(/<svg[^>]*>/g, '<svg class=\"svg-container\">');\n}\n\ninterface InsightDevicesProps {\n osCount: GroupedAnalyticsCount[]\n}\n\nexport function InsightDevices(props: InsightDevicesProps) {\n const categoriesData = getCategoriesData();\n const topDeviceCount = getTopDeviceCount();\n const topDevices = getTopDevices();\n\n function getCategoriesData() {\n const defaultDevices: HashObject = { Phone: 0, Computer: 0 };\n\n if (!props.osCount?.length)\n return defaultDevices;\n\n return props.osCount.reduce((acc, group) => {\n if (!group.name) return acc;\n\n const deviceCategory = getDeviceType(group.name);\n\n if (!deviceCategory) return acc;\n\n acc[deviceCategory] = acc[deviceCategory] + group.count;\n\n return acc;\n }, defaultDevices);\n }\n\n function getTopDeviceCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getTopDevices() {\n return Object.keys(categoriesData).filter(category => categoriesData[category] === topDeviceCount);\n }\n\n function getXAxisLabelIcons(): any {\n return {\n labels: {\n useHTML: true,\n formatter: function () {\n return `\n <div class=\"d-flex flex-column align-items-center\">\n <span class=\"${styles.font} font-size-sm text-dark mb-1\">${this.value}</span>\n ${getDeviceIcon(this.value)}\n </div>\n `;\n }\n }\n };\n }\n\n function getChartData(): ChartData {\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n borderRadius: 4,\n dataLabels: {\n enabled: true,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount =\n topDeviceCount !== 0 && categoriesData[category] === topDeviceCount;\n\n return {\n className: `${categoriesData[category] === 0 ? styles.grayChart : styles.purpleChart} ${!highestCount ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n const chartData = getChartData();\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgClassName='bg-light-ultramarine text-ultramarine'\n svgName={cvSvgLibrary.Monitor}\n >\n <p className='mb-0'>\n {props.osCount?.filter(group => group.name).length\n ? (\n <Text\n namespace={namespace}\n phrase='description'\n options={{\n smartCount: topDevices.length,\n device: topDevices.length === 1 ? topDevices[0].toLowerCase() : null\n }}\n />\n ) : (\n <Text\n namespace={namespace}\n phrase='notViewed'\n />\n )}\n </p>\n\n <div className='position-relative mt-auto'>\n <InsightChart\n label={getPhrase('device')}\n chartData={chartData} xAxis={getXAxisLabelIcons()}\n withObserver\n />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"Rfr9N\",\"heatMapTimepointIndicator\":\"s6JbA\",\"heatMapTimepointIndicatorVisible\":\"mgjWX\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-heatmap.scss';\n\nconst namespace = 'shared.insightHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHeatmapProps {\n engagement: Engagement;\n heatmapAppLink: Core.AppLink;\n engagementRate?: number;\n}\n\nexport function InsightHeatmap(props: InsightHeatmapProps) {\n const engagementRate = props.engagementRate || props.engagement?.engagementRate;\n const roundedRate = engagementRate > 0\n ? Math.round(engagementRate * 100)\n : null;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='mb-2'>\n <p className='mb-0'>\n {roundedRate\n ? (\n <Text namespace={namespace} phrase='everyoneWatched' options={{ engagementRate: roundedRate }} />\n )\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n {!!roundedRate &&\n <AppLink appLink={props.heatmapAppLink} className='text-info'>\n <Text namespace={namespace} phrase='viewHeatmap' />\n </AppLink>\n }\n </div>\n\n <div className='mb-2'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n </div>\n\n <p className='h3 text-center mb-2'>{roundedRate || '--'}%</p>\n <p className='text-center mb-0 font-size-sm'><Text namespace={namespace} phrase='amountWatched' /></p>\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { getShareOptionsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsShareMaskProps extends React.PropsWithChildren {\n hasData: boolean;\n video: VideoTypes;\n share: Share;\n}\n\nexport function InsightsShareMask(props: InsightsShareMaskProps) {\n const appLink = getShareOptionsAppLink(props.share);\n\n return (\n <div className={`${!props.hasData && styles.mask} position-relative`}>\n <div className={!props.hasData ? 'position-absolute ps-1' : ''}>{props.children}</div>\n <div\n className={!props.hasData ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!props.hasData && (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.Insights.SEND_PAPER_PLANE} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='shareHeading' />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text namespace={namespace} phrase='shareDescription' /> \n </EmptyState.Info>\n <EmptyState.Cta\n text={getPhrase(props.share.type === ShareType.Link ? 'share' : 'shareOptions')}\n appLink={appLink}\n icon={cvSvgLibrary.Share}\n className='btn btn-dark mb-3'\n />\n <EmptyState.Cta\n text={getPhrase('shareInfo')}\n href={ArticleHelper.getLiteArticle(LiteSupportArticle.Sharing)}\n openInNewTab\n className='btn btn-link text-info py-0'\n />\n </EmptyState>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"tealChart\":\"lZZf0\",\"grayChart\":\"wJQc4\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-attempts.scss';\n\nconst namespace = 'shared.insightAverageAttempts';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAverageAttemptsProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageAttempts(props: InsightAverageAttemptsProps) {\n const categoriesData = getCategoriesData();\n const highestAttemptsCount = getHighestAttemptsCount();\n const averageAttempts = getAverageAttempts();\n const chartData = getChartData();\n\n function getCategoriesData() {\n const categoriesData = props.students.reduce((acc, student) => {\n const attemptsCategory = student.summary.attempts.toString();\n\n if (!(attemptsCategory in acc)) {\n Object.assign(acc, { [attemptsCategory]: 0 });\n }\n\n acc[attemptsCategory]++;\n\n return acc;\n }, {} as HashObject);\n return Object.keys(categoriesData).length ? categoriesData : { 0: 0 };\n }\n\n function getHighestAttemptsCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getAverageAttempts(): number[] {\n return Object.keys(categoriesData).reduce((acc, category) => {\n const userCount = categoriesData[category];\n return userCount === highestAttemptsCount ? [ ...acc, category ] : acc;\n }, []);\n }\n\n function calculateAverage() {\n const total = Object.entries(categoriesData).reduce(\n (acc, [ attemptsCount, usersCount ]) => {\n acc.totalAttempts += +attemptsCount * usersCount;\n acc.totalUsers += usersCount;\n return acc;\n },\n { totalAttempts: 0, totalUsers: 0 }\n );\n\n return total.totalUsers === 0 ? 0 : Math.round(total.totalAttempts / total.totalUsers * 100) / 100;\n }\n\n function getChartData(): ChartData {\n const noAttempts = categoriesData[0] === 0;\n\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n color: categoriesData[0] ? '#EAEAEA' : '#40C2BB',\n borderRadius: 4,\n dataLabels: {\n enabled: !noAttempts,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount = highestAttemptsCount !== 0 && categoriesData[category] === highestAttemptsCount;\n\n return {\n className: `${noAttempts ? styles.grayChart : styles.tealChart} ${categoriesData[category] !== highestAttemptsCount && categoriesData[category] !== 0 ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Refresh}\n svgClassName='bg-light-purple text-purple'\n >\n <p>\n {averageAttempts.length\n ? <Text namespace={namespace} phrase='averageAttempts' options={{ smartCount: calculateAverage() }} />\n : <Text namespace={namespace} phrase='noAttempts' />\n }\n </p>\n\n <div className='mt-auto'>\n <InsightChart label={getPhrase('attempts')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"redChart\":\"G7zOw\",\"yellowChart\":\"k34mm\",\"greenChart\":\"vBneA\",\"blueChart\":\"RPTWm\",\"grayChart\":\"k4JFZ\",\"borderDark\":\"LWor3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-score.scss';\n\nconst namespace = 'shared.insightAverageScore';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightAverageScoreProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageScore(props: InsightAverageScoreProps) {\n function getChartData(): ChartData {\n const scoreCount = Array(11).fill(0);\n const scorePercentageData = props.students.reduce((acc, value) => {\n const scoreIndex = Math.floor(value.summary.percentCorrect * 10);\n acc[scoreIndex]++;\n\n return acc;\n }, scoreCount);\n\n const PERCENTAGES = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100' ];\n\n return {\n categories: PERCENTAGES,\n series: [{\n type: 'column',\n color: '#4E9ACE',\n borderRadius: 4,\n data: scorePercentageData.map((score, index) => {\n const percentageCategory = Number(PERCENTAGES[index]);\n\n const getChartColour = (percentage: number, score: number) => {\n if (score === 0)\n return styles.grayChart;\n if (percentage < 50)\n return styles.redChart;\n if (percentage < 70)\n return styles.yellowChart;\n if (percentage < 90)\n return styles.greenChart;\n\n return styles.blueChart;\n };\n\n return {\n className: `${getChartColour(percentageCategory, score)}`,\n y: score\n };\n })\n }]\n };\n }\n\n function getAverageNumbers() {\n const averageScores = props.students.map(student => student.summary.percentCorrect);\n const averagePercentage = averageScores.reduce((a, b) => a + b, 0) / averageScores.length;\n const totalQuestions = ArrayHelper.last(\n ArrayHelper.last(props.students).results\n ).attempts.length;\n\n return {\n averageScore: Math.round(totalQuestions * averagePercentage),\n totalQuestions,\n averagePercentage: (averagePercentage * 100).toFixed(1)\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Analytics}\n svgClassName='bg-light-orange text-orange'\n >\n <p>\n {props.students.length\n ? <Text namespace={namespace} phrase='averageScore' options={getAverageNumbers()} />\n : <Text namespace={namespace} phrase='noAnswers' />\n }\n </p>\n\n <InsightChart label={`${getPhrase('studentScores')} (%)`} chartData={getChartData()} />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightCompletedStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightCompletedStudents(props: InsightCompletedStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completedStudents')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightEasiestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightEasiestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightEasiestQuestion(props: InsightEasiestQuestionProps) {\n const easiestQuestion = React.useMemo(\n () => getEasiestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getEasiestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.last(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.StarOutline}\n svgClassName='bg-light-blue text-blue'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={easiestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {easiestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={easiestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {easiestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n className='text-info'>\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHardestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHardestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightHardestQuestion(props: InsightHardestQuestionProps) {\n const hardestQuestion = React.useMemo(\n () => getHardestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getHardestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.first(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.QuestionMark}\n svgClassName='bg-light-orange text-orange'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={hardestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {hardestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={hardestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {hardestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHighScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHighScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n greenChartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers?: boolean;\n}\n\nexport function InsightHighScoringStudents(props: InsightHighScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Trophy}\n svgClassName='bg-light-teal text-teal'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.greenChartImageUrl}\n description={getPhrase(props.completed.length ? 'noStudents' : 'highScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n appLinkText={getPhrase('viewByHighest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightLowScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightLowScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n redChartImageUrl: string;\n heartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightLowScoringStudents(props: InsightLowScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-red text-red'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.completed.length ? props.heartImageUrl : props.redChartImageUrl}\n description={getPhrase(props.completed.length ? 'doingWell' : 'lowScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n appLinkText={getPhrase('viewByLowest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'shared.insightMarkingRequired';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightMarkingRequiredProps {\n students: AnonUser[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightMarkingRequired(props: InsightMarkingRequiredProps) {\n const markingRequiredFilter: FilterStudentsBy = 'marking_required';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-blue text-blue'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsRequireMarking')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: markingRequiredFilter\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightNotCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightNotCompletedStudentsProps {\n markingRequiredStudents: StudentResultsWithSummary[];\n completedStudents: StudentResultsWithSummary[];\n notCompletedStudents: StudentResultsWithSummary[];\n classroomStudents: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightNotCompletedStudents(props: InsightNotCompletedStudentsProps) {\n const notCompletedStudents = getNotCompletedStudents();\n \n function getNotCompletedStudents() {\n const markingRequiredStudentIds = props.markingRequiredStudents.map(student => student?.user.id);\n const completedStudentIds = props.completedStudents.map(student => student?.user.id);\n \n const notStartedStudents = props.classroomStudents.filter(student => {\n return !markingRequiredStudentIds.includes(student.id) &&\n !completedStudentIds.includes(student.id);\n });\n \n return ArrayHelper.uniq([\n ...props.notCompletedStudents.map(student => student.user),\n ...notStartedStudents\n ], 'id');\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n count={notCompletedStudents.length}\n >\n <InsightStudentList\n students={notCompletedStudents}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completed')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: 'not_completed'\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\n\ninterface InsightsMarkingRequiredMaskProps extends React.PropsWithChildren {\n requiresMarking: number;\n appLink: Core.AppLink;\n hideMarkingRequiredMask: () => void;\n}\n\nexport function InsightsMarkingRequiredMask(props: InsightsMarkingRequiredMaskProps) {\n const filterBy: FilterStudentsBy = 'marking_required';\n\n return (\n <div className={`${props.requiresMarking && styles.mask} position-relative`}>\n <div className={props.requiresMarking ? 'position-absolute top-0' : ''}>{props.children}</div>\n <div\n className={props.requiresMarking ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!!props.requiresMarking && (\n <div className='text-center w-50'>\n <img src={ImageUrls.Insights.MARKING_RESPONSES} className='mb-3' width={288} />\n <h2 className='h3 mb-3'><Text namespace={namespace} phrase='markHeading' /></h2>\n <p className='mb-3'><Text namespace={namespace} phrase='markDescription' /></p>\n <IconButton\n svgName={cvSvgLibrary.Check}\n className='btn btn-dark mb-3'\n appLink={{\n ...props.appLink,\n params: {\n ...props.appLink.params as HashObject,\n filterBy\n }\n }}\n >\n <Text namespace={namespace} phrase='markResponses' options={{ smartCount: props.requiresMarking }} />\n </IconButton>\n <button className='btn btn-link d-block p-0 mx-auto' onClick={props.hideMarkingRequiredMask}><Text namespace={namespace} phrase='seeIncomplete' /></button>\n </div>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"pG0Jh\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-overview.scss';\n\nexport function PartialInteractiveInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightAverageAttempts } from 'libs/shared/apps/analytics/components/insights/average-attempts/InsightAverageAttempts';\nimport { InsightAverageScore } from 'libs/shared/apps/analytics/components/insights/average-score/InsightAverageScore';\nimport { InsightCompletedStudents } from 'libs/shared/apps/analytics/components/insights/completed-students/InsightCompletedStudents';\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightEasiestQuestion } from 'libs/shared/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion';\nimport { InsightHardestQuestion } from 'libs/shared/apps/analytics/components/insights/hardest-question/InsightHardestQuestion';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightHighScoringStudents } from 'libs/shared/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents';\nimport { InsightLowScoringStudents } from 'libs/shared/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents';\nimport { InsightMarkingRequired } from 'libs/shared/apps/analytics/components/insights/marking-required/InsightMarkingRequired';\nimport { InsightNotCompletedStudents } from 'libs/shared/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { Config, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsMarkingRequiredMask } from 'apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask';\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialInteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview';\n\nconst namespace = 'insights.interactiveInsightsOverview';\n\ninterface InteractiveInsightsOverviewProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n interactiveMetadata: InteractiveMetadata;\n osCount: GroupedAnalyticsCount[];\n classroomStudents: User[];\n aggregateEngagement: Engagement\n individualEngagement?: Engagement[];\n interactiveInsightsAppLinks: HashObject;\n config: Config;\n anonymiseUsers: boolean;\n hasDataLoaded: boolean;\n share: Share;\n}\n\nexport function InteractiveInsightsOverview(props: InteractiveInsightsOverviewProps) {\n const [ hideMarkingRequiredMask, setHideMarkingRequiredMask ] = React.useState(false);\n\n const studentGroups = props.hasDataLoaded && groupStudents(props.interactive, props.results, ScoreThresholdInsights);\n const hasData = props.hasDataLoaded && !!props.results.students.length;\n\n function getUsers(studentResult: StudentResultsWithSummary[]): (AnonUser)[] {\n return studentResult.map(student => student.user);\n }\n\n const resultCount = props.results?.students?.filter(s => !s.isPlaceholder)?.length || 0;\n return (\n <>\n {!props.hasDataLoaded && <PartialInteractiveInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask video={props.interactiveMetadata} hasData={hasData} share={props.share}>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentResponses' />\n <span>: {resultCount}{props.classroomStudents ? `/${props.classroomStudents.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n <div className='col'>\n <InsightMarkingRequired\n imageUrl={ImageUrls.Insights.SPEECH_BUBBLE_ASTERISK}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={getUsers(studentGroups.markingRequired)}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n {!!props.classroomStudents?.length && (\n <div className='col'>\n <InsightNotCompletedStudents\n markingRequiredStudents={studentGroups.markingRequired}\n completedStudents={studentGroups.completed}\n notCompletedStudents={studentGroups.notCompleted}\n classroomStudents={props.classroomStudents}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.JIGSAW}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col'>\n <InsightCompletedStudents\n students={studentGroups.completed}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.AVATAR}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <InsightsMarkingRequiredMask\n requiresMarking={!hideMarkingRequiredMask && studentGroups.markingRequired.length}\n appLink={props.interactiveInsightsAppLinks.resultsAppLink}\n hideMarkingRequiredMask={() => setHideMarkingRequiredMask(true)}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentsPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightLowScoringStudents\n redChartImageUrl={ImageUrls.Insights.RED_CHART}\n heartImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.lowScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n <div className='col-6'>\n <InsightHighScoringStudents\n greenChartImageUrl={ImageUrls.Insights.GREEN_CHART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.highScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n <div className='col-6'>\n <InsightHardestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n <div className='col-6'>\n <InsightEasiestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='classPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightAverageScore\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightAverageAttempts\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightDevices osCount={props.osCount} />\n </div>\n <div className='col-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.interactiveInsightsAppLinks.heatmapAppLink}\n // Average of all the individual engagements\n engagementRate={getEngagementRate(props.individualEngagement)}\n />\n </div>\n </div>\n </section>\n </InsightsMarkingRequiredMask>\n </InsightsShareMask>\n }\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"mask\":\"VRTes\",\"backdrop\":\"XzVXl\"};"],"names":["getStaticChartOptions","label","title","text","credits","enabled","yAxis","labels","gridLineWidth","tickPixelInterval","startOnTick","endOnTick","min","xAxis","margin","style","lineWidth","legend","chart","type","backgroundColor","height","spacingTop","plotOptions","column","dataLabels","enableMouseTracking","minPointLength","InsightChart","props","data","staticChartOptions","hasData","ref","containerRef","withObserver","window","ResizeObserver","observer","current","reflow","observe","disconnect","highcharts","options","chartData","series","some","y","max","categories","MAX_ITEMS","InsightStudentList","students","length","className","slice","map","student","index","key","UserRecipientItemMetadata","user","imageCdnUrl","avatarClassName","detailsClassName","showDisplayName","showSubText","anonymiseUsers","undefined","percentage","Math","round","PercentageIndicator","size","src","imageUrl","dangerouslySetInnerHTML","__html","description","appLink","AppLink","appLinkText","namespace","getPhrase","LanguageService","InsightDevices","categoriesData","defaultDevices","Phone","Computer","osCount","reduce","acc","group","name","deviceCategory","getDeviceType","count","getCategoriesData","topDeviceCount","Object","keys","category","topDevices","filter","borderRadius","inside","overflow","crop","highestCount","borderWidth","borderColor","InsightCard","svgClassName","svgName","Text","phrase","smartCount","device","toLowerCase","useHTML","formatter","this","value","SvgHelper","replace","getDeviceIcon","InsightHeatmap","engagementRate","engagement","roundedRate","heatmapAppLink","EngagementHeatMap","InsightsShareMask","share","children","icon","href","openInNewTab","InsightAverageAttempts","noAttempts","total","attemptsCategory","summary","attempts","toString","assign","highestAttemptsCount","averageAttempts","color","entries","attemptsCount","usersCount","totalAttempts","totalUsers","InsightAverageScore","averageScores","percentCorrect","averagePercentage","a","b","totalQuestions","ArrayHelper","results","averageScore","toFixed","scoreCount","Array","fill","scorePercentageData","floor","PERCENTAGES","score","percentageCategory","Number","getChartColour","InsightCompletedStudents","resultsAppLink","InsightEasiestQuestion","easiestQuestion","interactive","answeredInteractions","i","resultsSummary","answered","awaitingMarking","sortedInteractions","layout","InteractionLabel","interaction","iconClassName","questionsAppLink","params","sortBy","InsightHardestQuestion","hardestQuestion","InsightHighScoringStudents","greenChartImageUrl","completed","InsightLowScoringStudents","heartImageUrl","redChartImageUrl","InsightMarkingRequired","filterBy","InsightNotCompletedStudents","markingRequiredStudentIds","completedStudentIds","notStartedStudents","notCompletedStudents","markingRequiredStudents","id","completedStudents","classroomStudents","includes","InsightsMarkingRequiredMask","requiresMarking","ImageUrls","width","IconButton","onClick","hideMarkingRequiredMask","PartialInteractiveInsightsOverview","InteractiveInsightsOverview","studentResult","setHideMarkingRequiredMask","studentGroups","hasDataLoaded","resultCount","s","isPlaceholder","video","interactiveMetadata","interactiveInsightsAppLinks","config","markingRequired","notCompleted","lowScore","highScore","aggregateEngagement","individualEngagement"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/4948-ba684e5f4f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/insight-chart/InsightChart.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/insight-student-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-student-list/InsightStudentList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/insight-devices.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/devices/InsightDevices.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/insight-heatmap.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/heatmap/InsightHeatmap.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsShareMask.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/insight-average-attempts.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-attempts/InsightAverageAttempts.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/insight-average-score.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insights/average-score/InsightAverageScore.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/completed-students/InsightCompletedStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/hardest-question/InsightHardestQuestion.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/marking-required/InsightMarkingRequired.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/partial-interactive-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/insights-mask.scss"],"sourcesContent":["import React from 'react';\nimport Highcharts from 'highcharts';\nimport HighchartsReact from 'highcharts-react-official';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\n\nconst getStaticChartOptions = (label: string): Highcharts.Options => {\n return {\n title: {\n text: null\n },\n credits: {\n enabled: false\n },\n yAxis: {\n title: {\n text: null\n },\n labels: {\n enabled: false\n },\n gridLineWidth: 0,\n tickPixelInterval: 1,\n startOnTick: false,\n endOnTick: false,\n min: -0.2\n },\n xAxis: {\n title: {\n text: label,\n margin: 8,\n style: CHART_FONT_STYLES\n },\n labels: {\n style: CHART_FONT_STYLES\n },\n lineWidth: 0\n },\n legend: {\n enabled: false\n },\n chart: {\n type: 'column',\n backgroundColor: 'transparent',\n height: '160px',\n spacingTop: 20\n },\n plotOptions: {\n column: {\n dataLabels: {\n enabled: false\n },\n enableMouseTracking: false,\n minPointLength: 8\n }\n }\n };\n};\n\ninterface InsightChartProps {\n label: string;\n chartData: ChartData;\n xAxis?: Highcharts.XAxisOptions;\n withObserver?: boolean;\n}\n\nexport function InsightChart(props: InsightChartProps) {\n const ref = React.useRef<{ chart: Highcharts.Chart, container: React.RefObject<HTMLDivElement> }>();\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!props.withObserver || !window.ResizeObserver)\n return;\n\n const observer = new window.ResizeObserver(() => {\n ref.current?.chart.reflow();\n });\n\n if (ref.current)\n observer.observe(containerRef.current);\n\n return () => observer.disconnect();\n }, [props.withObserver]);\n\n function getChartOptions(): Highcharts.Options {\n const data = props.chartData;\n const staticChartOptions = getStaticChartOptions(props.label);\n\n const hasData = ArrayHelper.first(data.series)?.data.some((data: Highcharts.PointOptionsObject) => data.y > 0);\n\n return {\n ...staticChartOptions,\n yAxis: {\n ...staticChartOptions.yAxis,\n ...(hasData ? {\n min: -0.2\n } : {\n min: 0,\n max: 1\n })\n },\n xAxis: {\n ...staticChartOptions.xAxis,\n ...props.xAxis,\n categories: data.categories\n },\n series: data.series\n };\n }\n\n return (\n <div ref={containerRef}>\n <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions()}\n ref={ref}\n />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"uMuZt\",\"image\":\"WdKiU\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { ProgressCircleSize } from 'libs/shared/components/percentage-indicator/PercentageIndicatorUtils';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport styles from './insight-student-list.scss';\n\ntype UserPercentage = AnonUser & {\n percentage?: number;\n}\n\nconst MAX_ITEMS = 3;\n\ninterface InsightStudentListProps {\n students: UserPercentage[];\n imageUrl: string;\n imageCdnUrl: string;\n description: string;\n anonymiseUsers: boolean;\n appLink?: Core.AppLink;\n appLinkText?: string;\n}\n\nexport function InsightStudentList(props: InsightStudentListProps) {\n return (\n <>\n {props.students.length ? (\n <ul className='list-unstyled mb-2'>\n {props.students.slice(0, MAX_ITEMS).map((student, index) => (\n <li key={index} className='d-flex align-items-center mb-2'>\n <UserRecipientItemMetadata\n user={student}\n imageCdnUrl={props.imageCdnUrl}\n avatarClassName={styles.avatar}\n detailsClassName='ms-2'\n showDisplayName\n showSubText={false}\n anonymiseUsers={props.anonymiseUsers}\n />\n\n <div className='d-flex align-items-center ms-auto'>\n <span className='me-2'>{student.percentage === undefined ? '- ' : Math.round(student.percentage * 100)}%</span>\n <PercentageIndicator percentage={student.percentage} size={ProgressCircleSize.ExtraSmall} />\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className='text-center'>\n <img className={`${styles.image} mb-2`} src={props.imageUrl} />\n <p className='text-secondary mb-0' dangerouslySetInnerHTML={{ __html: props.description }} />\n </div>\n )}\n\n {!!props.students.length && props.appLink && (\n <AppLink appLink={props.appLink} className='text-info mt-auto'>\n {props.appLinkText}\n </AppLink>\n )}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"purpleChart\":\"OPcvi\",\"grayChart\":\"HlWj7\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary, SvgHelper } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-devices.scss';\n\nconst namespace = 'shared.insightDevices';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// Names from UserAgentHelper.getOperatingSystem()\nfunction getDeviceType(name: string) {\n switch (name) {\n case 'Android':\n case 'Windows Phone':\n case 'iOS':\n case 'BlackBerry':\n return 'Phone';\n case 'Linux':\n case 'Unix':\n case 'Macintosh':\n case 'Windows':\n return 'Computer';\n }\n}\n\nfunction getDeviceIcon(name: string) {\n let svgName = '';\n \n switch (name) {\n case 'Computer':\n svgName = cvSvgLibrary.Monitor;\n break;\n case 'Phone':\n svgName = cvSvgLibrary.Mobile;\n break;\n case 'Tablet':\n svgName = cvSvgLibrary.Tablet;\n break;\n default: return;\n }\n \n // Default svg attributes causes Highcharts error\n return SvgHelper.getSvg(svgName).replace(/<svg[^>]*>/g, '<svg class=\"svg-container\">');\n}\n\ninterface InsightDevicesProps {\n osCount: GroupedAnalyticsCount[]\n}\n\nexport function InsightDevices(props: InsightDevicesProps) {\n const categoriesData = getCategoriesData();\n const topDeviceCount = getTopDeviceCount();\n const topDevices = getTopDevices();\n\n function getCategoriesData() {\n const defaultDevices: HashObject = { Phone: 0, Computer: 0 };\n\n if (!props.osCount?.length)\n return defaultDevices;\n\n return props.osCount.reduce((acc, group) => {\n if (!group.name) return acc;\n\n const deviceCategory = getDeviceType(group.name);\n\n if (!deviceCategory) return acc;\n\n acc[deviceCategory] = acc[deviceCategory] + group.count;\n\n return acc;\n }, defaultDevices);\n }\n\n function getTopDeviceCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getTopDevices() {\n return Object.keys(categoriesData).filter(category => categoriesData[category] === topDeviceCount);\n }\n\n function getXAxisLabelIcons(): any {\n return {\n labels: {\n useHTML: true,\n formatter: function () {\n return `\n <div class=\"d-flex flex-column align-items-center\">\n <span class=\"${styles.font} font-size-sm text-dark mb-1\">${this.value}</span>\n ${getDeviceIcon(this.value)}\n </div>\n `;\n }\n }\n };\n }\n\n function getChartData(): ChartData {\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n borderRadius: 4,\n dataLabels: {\n enabled: true,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount =\n topDeviceCount !== 0 && categoriesData[category] === topDeviceCount;\n\n return {\n className: `${categoriesData[category] === 0 ? styles.grayChart : styles.purpleChart} ${!highestCount ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n const chartData = getChartData();\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgClassName='bg-light-ultramarine text-ultramarine'\n svgName={cvSvgLibrary.Monitor}\n >\n <p className='mb-0'>\n {props.osCount?.filter(group => group.name).length\n ? (\n <Text\n namespace={namespace}\n phrase='description'\n options={{\n smartCount: topDevices.length,\n device: topDevices.length === 1 ? topDevices[0].toLowerCase() : null\n }}\n />\n ) : (\n <Text\n namespace={namespace}\n phrase='notViewed'\n />\n )}\n </p>\n\n <div className='position-relative mt-auto'>\n <InsightChart\n label={getPhrase('device')}\n chartData={chartData} xAxis={getXAxisLabelIcons()}\n withObserver\n />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"Rfr9N\",\"heatMapTimepointIndicator\":\"s6JbA\",\"heatMapTimepointIndicatorVisible\":\"mgjWX\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EngagementHeatMap } from 'libs/shared/apps/analytics/components/engagement-heat-map/EngagementHeatMap';\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-heatmap.scss';\n\nconst namespace = 'shared.insightHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHeatmapProps {\n engagement: Engagement;\n heatmapAppLink: Core.AppLink;\n engagementRate?: number;\n}\n\nexport function InsightHeatmap(props: InsightHeatmapProps) {\n const engagementRate = props.engagementRate || props.engagement?.engagementRate;\n const roundedRate = engagementRate > 0\n ? Math.round(engagementRate * 100)\n : null;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='mb-2'>\n <p className='mb-0'>\n {roundedRate\n ? (\n <Text namespace={namespace} phrase='everyoneWatched' options={{ engagementRate: roundedRate }} />\n )\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n {!!roundedRate &&\n <AppLink appLink={props.heatmapAppLink} className='text-info'>\n <Text namespace={namespace} phrase='viewHeatmap' />\n </AppLink>\n }\n </div>\n\n <div className='mb-2'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n </div>\n\n <p className='h3 text-center mb-2'>{roundedRate || '--'}%</p>\n <p className='text-center mb-0 font-size-sm'><Text namespace={namespace} phrase='amountWatched' /></p>\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { getShareOptionsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsShareMaskProps extends React.PropsWithChildren {\n hasData: boolean;\n video: VideoTypes;\n share: Share;\n}\n\nexport function InsightsShareMask(props: InsightsShareMaskProps) {\n const appLink = getShareOptionsAppLink(props.share);\n\n return (\n <div className={`${!props.hasData && styles.mask} position-relative`}>\n <div className={!props.hasData ? 'position-absolute ps-1' : ''}>{props.children}</div>\n <div\n className={!props.hasData ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!props.hasData && (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.Insights.SEND_PAPER_PLANE} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='shareHeading' />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text namespace={namespace} phrase='shareDescription' /> \n </EmptyState.Info>\n <EmptyState.Cta\n text={getPhrase(props.share.type === ShareType.Link ? 'share' : 'shareOptions')}\n appLink={appLink}\n icon={cvSvgLibrary.Share}\n className='btn btn-dark mb-3'\n />\n <EmptyState.Cta\n text={getPhrase('shareInfo')}\n href={ArticleHelper.getLiteArticle(LiteSupportArticle.Sharing)}\n openInNewTab\n className='btn btn-link text-info py-0'\n />\n </EmptyState>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"tealChart\":\"lZZf0\",\"grayChart\":\"wJQc4\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { CHART_FONT_STYLES } from 'libs/shared/apps/analytics/constants/ChartStyles';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-attempts.scss';\n\nconst namespace = 'shared.insightAverageAttempts';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightAverageAttemptsProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageAttempts(props: InsightAverageAttemptsProps) {\n const categoriesData = getCategoriesData();\n const highestAttemptsCount = getHighestAttemptsCount();\n const averageAttempts = getAverageAttempts();\n const chartData = getChartData();\n\n function getCategoriesData() {\n const categoriesData = props.students.reduce((acc, student) => {\n const attemptsCategory = student.summary.attempts.toString();\n\n if (!(attemptsCategory in acc)) {\n Object.assign(acc, { [attemptsCategory]: 0 });\n }\n\n acc[attemptsCategory]++;\n\n return acc;\n }, {} as HashObject);\n return Object.keys(categoriesData).length ? categoriesData : { 0: 0 };\n }\n\n function getHighestAttemptsCount() {\n return Math.max(...Object.keys(categoriesData).map(category => categoriesData[category]));\n }\n\n function getAverageAttempts(): number[] {\n return Object.keys(categoriesData).reduce((acc, category) => {\n const userCount = categoriesData[category];\n return userCount === highestAttemptsCount ? [ ...acc, category ] : acc;\n }, []);\n }\n\n function calculateAverage() {\n const total = Object.entries(categoriesData).reduce(\n (acc, [ attemptsCount, usersCount ]) => {\n acc.totalAttempts += +attemptsCount * usersCount;\n acc.totalUsers += usersCount;\n return acc;\n },\n { totalAttempts: 0, totalUsers: 0 }\n );\n\n return total.totalUsers === 0 ? 0 : Math.round(total.totalAttempts / total.totalUsers * 100) / 100;\n }\n\n function getChartData(): ChartData {\n const noAttempts = categoriesData[0] === 0;\n\n return {\n categories: Object.keys(categoriesData),\n series: [{\n type: 'column',\n color: categoriesData[0] ? '#EAEAEA' : '#40C2BB',\n borderRadius: 4,\n dataLabels: {\n enabled: !noAttempts,\n style: CHART_FONT_STYLES,\n inside: false,\n overflow: 'allow',\n crop: false\n },\n data: Object.keys(categoriesData).map(category => {\n const highestCount = highestAttemptsCount !== 0 && categoriesData[category] === highestAttemptsCount;\n\n return {\n className: `${noAttempts ? styles.grayChart : styles.tealChart} ${categoriesData[category] !== highestAttemptsCount && categoriesData[category] !== 0 ? 'opacity-25' : ''}`,\n borderWidth: highestCount ? 2 : 0,\n borderColor: highestCount ? 'black' : '',\n y: categoriesData[category]\n };\n })\n }]\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Refresh}\n svgClassName='bg-light-purple text-purple'\n >\n <p>\n {averageAttempts.length\n ? <Text namespace={namespace} phrase='averageAttempts' options={{ smartCount: calculateAverage() }} />\n : <Text namespace={namespace} phrase='noAttempts' />\n }\n </p>\n\n <div className='mt-auto'>\n <InsightChart label={getPhrase('attempts')} chartData={chartData} />\n </div>\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"redChart\":\"G7zOw\",\"yellowChart\":\"k34mm\",\"greenChart\":\"vBneA\",\"blueChart\":\"RPTWm\",\"grayChart\":\"k4JFZ\",\"borderDark\":\"LWor3\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightChart } from 'libs/shared/apps/analytics/components/insight-chart/InsightChart';\nimport { ChartData } from 'libs/shared/apps/analytics/interfaces/ChartData';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './insight-average-score.scss';\n\nconst namespace = 'shared.insightAverageScore';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightAverageScoreProps {\n students: StudentResultsWithSummary[];\n}\n\nexport function InsightAverageScore(props: InsightAverageScoreProps) {\n function getChartData(): ChartData {\n const scoreCount = Array(11).fill(0);\n const scorePercentageData = props.students.reduce((acc, value) => {\n const scoreIndex = Math.floor(value.summary.percentCorrect * 10);\n acc[scoreIndex]++;\n\n return acc;\n }, scoreCount);\n\n const PERCENTAGES = [ '0', '10', '20', '30', '40', '50', '60', '70', '80', '90', '100' ];\n\n return {\n categories: PERCENTAGES,\n series: [{\n type: 'column',\n color: '#4E9ACE',\n borderRadius: 4,\n data: scorePercentageData.map((score, index) => {\n const percentageCategory = Number(PERCENTAGES[index]);\n\n const getChartColour = (percentage: number, score: number) => {\n if (score === 0)\n return styles.grayChart;\n if (percentage < 50)\n return styles.redChart;\n if (percentage < 70)\n return styles.yellowChart;\n if (percentage < 90)\n return styles.greenChart;\n\n return styles.blueChart;\n };\n\n return {\n className: `${getChartColour(percentageCategory, score)}`,\n y: score\n };\n })\n }]\n };\n }\n\n function getAverageNumbers() {\n const averageScores = props.students.map(student => student.summary.percentCorrect);\n const averagePercentage = averageScores.reduce((a, b) => a + b, 0) / averageScores.length;\n const totalQuestions = ArrayHelper.last(\n ArrayHelper.last(props.students).results\n ).attempts.length;\n\n return {\n averageScore: Math.round(totalQuestions * averagePercentage),\n totalQuestions,\n averagePercentage: (averagePercentage * 100).toFixed(1)\n };\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Analytics}\n svgClassName='bg-light-orange text-orange'\n >\n <p>\n {props.students.length\n ? <Text namespace={namespace} phrase='averageScore' options={getAverageNumbers()} />\n : <Text namespace={namespace} phrase='noAnswers' />\n }\n </p>\n\n <InsightChart label={`${getPhrase('studentScores')} (%)`} chartData={getChartData()} />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightCompletedStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightCompletedStudents(props: InsightCompletedStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completedStudents')}\n appLink={props.resultsAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightEasiestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightEasiestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightEasiestQuestion(props: InsightEasiestQuestionProps) {\n const easiestQuestion = React.useMemo(\n () => getEasiestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getEasiestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.last(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.StarOutline}\n svgClassName='bg-light-blue text-blue'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={easiestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {easiestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={easiestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {easiestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n className='text-info'>\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHardestQuestion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHardestQuestionProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n questionsAppLink: Core.AppLink;\n}\n\nexport function InsightHardestQuestion(props: InsightHardestQuestionProps) {\n const hardestQuestion = React.useMemo(\n () => getHardestQuestion(props.interactive, props.results),\n [props.results.students.length]\n );\n\n function getHardestQuestion(interactive: Interactive, results: InteractiveResultSet): InteractionWithResultsSummary {\n const interactions: InteractionWithResultsSummary[] = getInteractions(interactive).map(i => ({\n ...i,\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n const answeredInteractions = interactions.filter(i =>\n !!i.resultsSummary.answered && !i.resultsSummary.awaitingMarking);\n\n const sortedInteractions = ArrayHelper.sortBy(\n answeredInteractions,\n i => i.resultsSummary.percentCorrect\n );\n\n return ArrayHelper.first(sortedInteractions);\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.QuestionMark}\n svgClassName='bg-light-orange text-orange'\n >\n <div className='d-flex align-items-center'>\n <PercentageIndicator\n percentage={hardestQuestion?.resultsSummary?.percentCorrect}\n layout={PercentageIndicatorLayout.LabelInside}\n />\n {hardestQuestion\n ? <div className='d-flex ms-2'>\n <InteractionLabel interaction={hardestQuestion} iconClassName='flex-shrink-0' />\n </div>\n : <span className='ms-2'>{getPhrase('noAnswers')}</span>\n }\n </div>\n\n {hardestQuestion && (\n <AppLink\n appLink={{\n ...props.questionsAppLink,\n params: {\n ...props.questionsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='viewQuestions' />\n </AppLink>\n )}\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightHighScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightHighScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n greenChartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers?: boolean;\n}\n\nexport function InsightHighScoringStudents(props: InsightHighScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Trophy}\n svgClassName='bg-light-teal text-teal'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.greenChartImageUrl}\n description={getPhrase(props.completed.length ? 'noStudents' : 'highScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_desc'\n }\n }}\n appLinkText={getPhrase('viewByHighest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightLowScoringStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightLowScoringStudentsProps {\n students: StudentResultsWithSummary[];\n imageCdnUrl: string;\n redChartImageUrl: string;\n heartImageUrl: string;\n resultsAppLink: Core.AppLink;\n completed: StudentResultsWithSummary[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightLowScoringStudents(props: InsightLowScoringStudentsProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-red text-red'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students.map(student => ({ ...student.user, percentage: student.summary.percentCorrect }))}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.completed.length ? props.heartImageUrl : props.redChartImageUrl}\n description={getPhrase(props.completed.length ? 'doingWell' : 'lowScore')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n ...props.resultsAppLink.params as HashObject,\n sortBy: 'score_asc'\n }\n }}\n appLinkText={getPhrase('viewByLowest')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\n\nconst namespace = 'shared.insightMarkingRequired';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\ninterface InsightMarkingRequiredProps {\n students: AnonUser[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightMarkingRequired(props: InsightMarkingRequiredProps) {\n const markingRequiredFilter: FilterStudentsBy = 'marking_required';\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Hand}\n svgClassName='bg-light-blue text-blue'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsRequireMarking')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: markingRequiredFilter\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightNotCompletedStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightNotCompletedStudentsProps {\n markingRequiredStudents: StudentResultsWithSummary[];\n completedStudents: StudentResultsWithSummary[];\n notCompletedStudents: StudentResultsWithSummary[];\n classroomStudents: User[];\n imageCdnUrl: string;\n imageUrl: string;\n resultsAppLink: Core.AppLink;\n anonymiseUsers: boolean;\n}\n\nexport function InsightNotCompletedStudents(props: InsightNotCompletedStudentsProps) {\n const notCompletedStudents = getNotCompletedStudents();\n \n function getNotCompletedStudents() {\n const markingRequiredStudentIds = props.markingRequiredStudents.map(student => student?.user.id);\n const completedStudentIds = props.completedStudents.map(student => student?.user.id);\n \n const notStartedStudents = props.classroomStudents.filter(student => {\n return !markingRequiredStudentIds.includes(student.id) &&\n !completedStudentIds.includes(student.id);\n });\n \n return ArrayHelper.uniq([\n ...props.notCompletedStudents.map(student => student.user),\n ...notStartedStudents\n ], 'id');\n }\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n count={notCompletedStudents.length}\n >\n <InsightStudentList\n students={notCompletedStudents}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('completed')}\n appLink={{\n ...props.resultsAppLink,\n params: {\n filterBy: 'not_completed'\n }\n }}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\n\ninterface InsightsMarkingRequiredMaskProps extends React.PropsWithChildren {\n requiresMarking: number;\n appLink: Core.AppLink;\n hideMarkingRequiredMask: () => void;\n}\n\nexport function InsightsMarkingRequiredMask(props: InsightsMarkingRequiredMaskProps) {\n const filterBy: FilterStudentsBy = 'marking_required';\n\n return (\n <div className={`${props.requiresMarking && styles.mask} position-relative`}>\n <div className={props.requiresMarking ? 'position-absolute top-0' : ''}>{props.children}</div>\n <div\n className={props.requiresMarking ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!!props.requiresMarking && (\n <div className='text-center w-50'>\n <img src={ImageUrls.Insights.MARKING_RESPONSES} className='mb-3' width={288} />\n <h2 className='h3 mb-3'><Text namespace={namespace} phrase='markHeading' /></h2>\n <p className='mb-3'><Text namespace={namespace} phrase='markDescription' /></p>\n <IconButton\n svgName={cvSvgLibrary.Check}\n className='btn btn-dark mb-3'\n appLink={{\n ...props.appLink,\n params: {\n ...props.appLink.params as HashObject,\n filterBy\n }\n }}\n >\n <Text namespace={namespace} phrase='markResponses' options={{ smartCount: props.requiresMarking }} />\n </IconButton>\n <button className='btn btn-link d-block p-0 mx-auto' onClick={props.hideMarkingRequiredMask}><Text namespace={namespace} phrase='seeIncomplete' /></button>\n </div>\n )}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"pG0Jh\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-overview.scss';\n\nexport function PartialInteractiveInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'> </h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InsightAverageAttempts } from 'libs/shared/apps/analytics/components/insights/average-attempts/InsightAverageAttempts';\nimport { InsightAverageScore } from 'libs/shared/apps/analytics/components/insights/average-score/InsightAverageScore';\nimport { InsightCompletedStudents } from 'libs/shared/apps/analytics/components/insights/completed-students/InsightCompletedStudents';\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightEasiestQuestion } from 'libs/shared/apps/analytics/components/insights/easiest-question/InsightEasiestQuestion';\nimport { InsightHardestQuestion } from 'libs/shared/apps/analytics/components/insights/hardest-question/InsightHardestQuestion';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightHighScoringStudents } from 'libs/shared/apps/analytics/components/insights/high-scoring-students/InsightHighScoringStudents';\nimport { InsightLowScoringStudents } from 'libs/shared/apps/analytics/components/insights/low-scoring-students/InsightLowScoringStudents';\nimport { InsightMarkingRequired } from 'libs/shared/apps/analytics/components/insights/marking-required/InsightMarkingRequired';\nimport { InsightNotCompletedStudents } from 'libs/shared/apps/analytics/components/insights/not-completed-students/InsightNotCompletedStudents';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { groupStudents } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\nimport { Config, Engagement, Interactive, InteractiveMetadata, InteractiveResultSet, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsMarkingRequiredMask } from 'apps/my-shares/components/insights-mask/InsightsMarkingRequiredMask';\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialInteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/partial-loading/PartialInteractiveInsightsOverview';\n\nconst namespace = 'insights.interactiveInsightsOverview';\n\ninterface InteractiveInsightsOverviewProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n interactiveMetadata: InteractiveMetadata;\n osCount: GroupedAnalyticsCount[];\n classroomStudents: User[];\n aggregateEngagement: Engagement\n individualEngagement?: Engagement[];\n interactiveInsightsAppLinks: HashObject;\n config: Config;\n anonymiseUsers: boolean;\n hasDataLoaded: boolean;\n share: Share;\n}\n\nexport function InteractiveInsightsOverview(props: InteractiveInsightsOverviewProps) {\n const [ hideMarkingRequiredMask, setHideMarkingRequiredMask ] = React.useState(false);\n\n const studentGroups = props.hasDataLoaded && groupStudents(props.interactive, props.results, ScoreThresholdInsights);\n const hasData = props.hasDataLoaded && !!props.results.students.length;\n\n function getUsers(studentResult: StudentResultsWithSummary[]): (AnonUser)[] {\n return studentResult.map(student => student.user);\n }\n\n const resultCount = props.results?.students?.filter(s => !s.isPlaceholder)?.length || 0;\n return (\n <>\n {!props.hasDataLoaded && <PartialInteractiveInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask video={props.interactiveMetadata} hasData={hasData} share={props.share}>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentResponses' />\n <span>: {resultCount}{props.classroomStudents ? `/${props.classroomStudents.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n <div className='col'>\n <InsightMarkingRequired\n imageUrl={ImageUrls.Insights.SPEECH_BUBBLE_ASTERISK}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={getUsers(studentGroups.markingRequired)}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n {!!props.classroomStudents?.length && (\n <div className='col'>\n <InsightNotCompletedStudents\n markingRequiredStudents={studentGroups.markingRequired}\n completedStudents={studentGroups.completed}\n notCompletedStudents={studentGroups.notCompleted}\n classroomStudents={props.classroomStudents}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.JIGSAW}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col'>\n <InsightCompletedStudents\n students={studentGroups.completed}\n imageCdnUrl={props.config.imageCdnUrl}\n imageUrl={ImageUrls.Insights.AVATAR}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <InsightsMarkingRequiredMask\n requiresMarking={!hideMarkingRequiredMask && studentGroups.markingRequired.length}\n appLink={props.interactiveInsightsAppLinks.resultsAppLink}\n hideMarkingRequiredMask={() => setHideMarkingRequiredMask(true)}\n >\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentsPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightLowScoringStudents\n redChartImageUrl={ImageUrls.Insights.RED_CHART}\n heartImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.lowScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n <div className='col-6'>\n <InsightHighScoringStudents\n greenChartImageUrl={ImageUrls.Insights.GREEN_CHART}\n resultsAppLink={props.interactiveInsightsAppLinks.resultsAppLink}\n imageCdnUrl={props.config.imageCdnUrl}\n students={studentGroups.highScore}\n completed={studentGroups.completed}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n <div className='col-6'>\n <InsightHardestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n <div className='col-6'>\n <InsightEasiestQuestion\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n questionsAppLink={props.interactiveInsightsAppLinks.questionsAppLink}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='classPerformance' />\n </h2>\n <div className='row g-3'>\n <div className='col-6'>\n <InsightAverageScore\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightAverageAttempts\n students={studentGroups.completed}\n />\n </div>\n <div className='col-6'>\n <InsightDevices osCount={props.osCount} />\n </div>\n <div className='col-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.interactiveInsightsAppLinks.heatmapAppLink}\n // Average of all the individual engagements\n engagementRate={getEngagementRate(props.individualEngagement)}\n />\n </div>\n </div>\n </section>\n </InsightsMarkingRequiredMask>\n </InsightsShareMask>\n }\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"mask\":\"VRTes\",\"backdrop\":\"XzVXl\"};"],"names":["getStaticChartOptions","label","title","text","credits","enabled","yAxis","labels","gridLineWidth","tickPixelInterval","startOnTick","endOnTick","min","xAxis","margin","style","lineWidth","legend","chart","type","backgroundColor","height","spacingTop","plotOptions","column","dataLabels","enableMouseTracking","minPointLength","InsightChart","props","data","staticChartOptions","hasData","ref","containerRef","withObserver","window","ResizeObserver","observer","current","reflow","observe","disconnect","highcharts","options","chartData","series","some","y","max","categories","MAX_ITEMS","InsightStudentList","students","length","className","slice","map","student","index","key","UserRecipientItemMetadata","user","imageCdnUrl","avatarClassName","detailsClassName","showDisplayName","showSubText","anonymiseUsers","undefined","percentage","Math","round","PercentageIndicator","size","src","imageUrl","dangerouslySetInnerHTML","__html","description","appLink","AppLink","appLinkText","namespace","getPhrase","LanguageService","InsightDevices","categoriesData","defaultDevices","Phone","Computer","osCount","reduce","acc","group","name","deviceCategory","getDeviceType","count","getCategoriesData","topDeviceCount","Object","keys","category","topDevices","filter","borderRadius","inside","overflow","crop","highestCount","borderWidth","borderColor","InsightCard","svgClassName","svgName","Text","phrase","smartCount","device","toLowerCase","useHTML","formatter","this","value","SvgHelper","replace","getDeviceIcon","InsightHeatmap","engagementRate","engagement","roundedRate","heatmapAppLink","EngagementHeatMap","InsightsShareMask","share","children","icon","href","openInNewTab","InsightAverageAttempts","noAttempts","total","attemptsCategory","summary","attempts","toString","assign","highestAttemptsCount","averageAttempts","color","entries","attemptsCount","usersCount","totalAttempts","totalUsers","InsightAverageScore","averageScores","percentCorrect","averagePercentage","a","b","totalQuestions","ArrayHelper","results","averageScore","toFixed","scoreCount","Array","fill","scorePercentageData","floor","PERCENTAGES","score","percentageCategory","Number","getChartColour","InsightCompletedStudents","resultsAppLink","InsightEasiestQuestion","easiestQuestion","interactive","answeredInteractions","i","resultsSummary","answered","awaitingMarking","sortedInteractions","layout","InteractionLabel","interaction","iconClassName","questionsAppLink","params","sortBy","InsightHardestQuestion","hardestQuestion","InsightHighScoringStudents","greenChartImageUrl","completed","InsightLowScoringStudents","heartImageUrl","redChartImageUrl","InsightMarkingRequired","filterBy","InsightNotCompletedStudents","markingRequiredStudentIds","completedStudentIds","notStartedStudents","notCompletedStudents","markingRequiredStudents","id","completedStudents","classroomStudents","includes","InsightsMarkingRequiredMask","requiresMarking","ImageUrls","width","IconButton","onClick","hideMarkingRequiredMask","PartialInteractiveInsightsOverview","InteractiveInsightsOverview","studentResult","setHideMarkingRequiredMask","studentGroups","hasDataLoaded","resultCount","s","isPlaceholder","video","interactiveMetadata","interactiveInsightsAppLinks","config","markingRequired","notCompleted","lowScore","highScore","aggregateEngagement","individualEngagement"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4985],{63719:(e,t,n)=>{n.d(t,{h:()=>l});var a=n(32735),i=n(77316);function r(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function l(e){var t,n,l=(t=a.useMemo(function(){return i.p.getBuilder()},[]),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,i,r,o,l=[],c=!0,s=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(a=r.call(n)).done)&&(l.push(a.value),l.length!==t);c=!0);}catch(e){s=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw i}}return l}}(t,n)||r(t,n)||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.")}()),c=l[0],s=(0,l[1])(c);return s&&e?[].concat(function(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||r(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.")}()}(s),[Object.assign(Object.assign({},e),{active:!0})]):s}},67088:(e,t,n)=>{n.r(t),n.d(t,{MyVideosFolderView:()=>K});var a=n(32735),i=n(23481),r=n(81886),o=n(20354),l=n(28400),c=n(65858),s=n(43500),d=n(83657),u=n(49935),m=n(73518),p=n(39958),v=n(1302),f=n(91693),y=n(37395),g=n(4201),h=n(83345),E=n(1860),b=n(30254),k=n(3534),V=n(51365),A=n(16714),O=n(183),F=n(98064),M=n(31949),S=n(63719),w=n(299),C=n(91286),D=n(22902),L=n(79612),I=n(37802),x=n(35223),_=n(58535),B=n(14070),N=n(97291),j=n(58321),P=n(44110),R=n(10741),Y=n(22490),T=n(98860),U=n(12617),H=n(45967),Q=n(65202),X=n(74796),Z=n(18097),$=n(14305),q=n(72363);const W={uploadingList:"BrRqF"};var G="default.myVideosFolders",J=i.T.encloseNamespace(G);function K(e){var t,n,i,K,z,ee,te,ne=o.a.useGetFetch(),ae=(0,j.U)({locationContext:c.LZ.VideoThumbnail}).commonVideoProps,ie=(0,P.i)(),re=(0,H.q)().handleDragEnd,oe=(0,g.of)().focusSearchBar,le=o.a.useBasicFetch(F.D.folder(e.id)),ce=(0,T.P)(e.id),se=o.a.useBasicFetch(M.N.currentUser()),de=o.a.useBasicFetch((null===(t=se.data)||void 0===t?void 0:t.isAuthenticated)&&M.N.workspace());(0,L.M)({title:le.data?J("pageTitle",{folder:null===(n=le.data)||void 0===n?void 0:n.name}):""}),(0,C.v)(le);var ue=(0,S.h)({name:null===(i=le.data)||void 0===i?void 0:i.name}),me=(0,X.f)(),pe=(0,I.r)(null),ve=pe.myVideosFolders,fe=pe.isLoadingSettings;a.useEffect(function(){fe||ve||r.Q.C$.trigger({application:N.O.MY_VIDEOS,action:B.e.MyVideos.MY_VIDEOS},{replace:!0})},[ve,fe]);var ye=(0,q.y)(),ge=(0,q.W)(null===(K=de.data)||void 0===K?void 0:K.id,e.id),he=(0,D.T)().hasPermissions,Ee=function(t,n){return U.E.videos(e.id,t,n)},be=o.a.useBasicFetch(Ee(e.cursor,e.typeFilter));(0,C.v)(be);var ke=(0,Q.J)({onRemove:function(e,t){return ne(Ee(e,t))},categoryId:+e.id}),Ve=ke.uploadingVideos,Ae=ke.onClickAlternate,Oe=ke.onClickDelete,Fe=ke.processingIds,Me=null===(ee=null===(z=be.data)||void 0===z?void 0:z.data)||void 0===ee?void 0:ee.filter(function(e){return!Fe[e.id]}),Se=(0,w.X)(Me);if(!le.data)return a.createElement(a.Fragment,null);var we=!!(null===(te=null==ce?void 0:ce.items)||void 0===te?void 0:te.length);return a.createElement(V.M.Provider,{value:ye},a.createElement("div",{className:"px-3"},a.createElement("div",{className:"d-flex justify-content-between align-items-start"},a.createElement("h1",{className:"h2 mb-0"},le.data.name),a.createElement("div",{className:"d-sm-flex d-none ms-2"},a.createElement(f.h,{svgName:x.vn.Search,appLink:{application:N.O.SEARCH,action:B.e.Search.HOME,params:{source:s.fi.MyVideos}},className:"btn btn-outline-dark me-2",onClick:oe,analyticsData:{},analyticsOptions:{entity:c.py.SearchResults,location:c.LZ.MyVideos,actionType:c.Vw.Click,descriptor:c.Bk.MyVideos}},a.createElement(h.x,{namespace:G,phrase:"searchMyVideos"})),a.createElement(d.e,{actions:me("page",le.data),actionsDropdownClassName:"btn btn-outline-dark"}))),a.createElement("div",{className:"mt-3"},a.createElement(u.Oo,{breadcrumbs:ue})),a.createElement("hr",null),!(null==ce?void 0:ce.hasCompleted)&&a.createElement(v.i,null),a.createElement(m.p,{handleDragEnd:re,dragOverlayComponent:_.U,source:le.data},we&&a.createElement("div",{className:"mx-n2"},a.createElement(p.$,{folders:ce.items,getAppLink:function(e){return{application:N.O.MY_VIDEOS,action:B.e.MyVideos.MY_VIDEOS_FOLDER,args:[e.id,l.m.slugify(e.name)]}},expandFolders:!1,getFolderActions:function(e){return me("folder",e)},drag:!0,drop:!0})),a.createElement(b.X,{allowBulkAction:!0,allowFilter:!0,isVideosLoading:!be.data,checkboxHelper:Se,getVideosBulkAction:ge,locationContext:c.LZ.MyVideos,typeFilter:e.typeFilter,getAppLink:function(){var t;return{application:N.O.MY_VIDEOS,action:B.e.MyVideos.MY_VIDEOS_FOLDER,args:[e.id,l.m.slugify(null===(t=le.data)||void 0===t?void 0:t.name)]}}}),!!(null==Ve?void 0:Ve.length)&&a.createElement("div",{className:"position-relative ".concat(W.uploadingList)},Ve.map(function(t){return a.createElement(Z.X,{item:t,onClickAlternate:Ae,onClickDelete:Oe,key:t.id,allowBulkAction:!0,categoryId:e.id})})),function(){var t,n,i,r;return be.data?(null===(n=null===(t=be.data)||void 0===t?void 0:t.data)||void 0===n?void 0:n.length)?a.createElement(a.Fragment,null,a.createElement(k.E4,{videos:Me,getVideoAppLink:function(t,n){var a;return Y.W.getAppLink(t,Object.assign(Object.assign({},n),{context:O.Q.Folder,contextId:e.id,includeContext:null===(a=se.data)||void 0===a?void 0:a.isAuthenticated}))},presentationAudiences:ie.data,canRemovePrivateVideos:!0,allowBulkAction:!0,hasPermissions:he,getVideosBulkAction:ge,typeFilter:e.typeFilter,checkboxHelper:Se,drag:we,getPreviewQuestionsAppLink:function(e){return R.j.getPreviewQuestionsAppLink(e)},commonVideoProps:ae}),!!(null===(r=null===(i=be.data)||void 0===i?void 0:i.pagination)||void 0===r?void 0:r.cursors)&&a.createElement(y.t,{appLink:{action:B.e.MyVideos.MY_VIDEOS_FOLDER,application:N.O.MY_VIDEOS,args:[e.id,l.m.slugify(le.data.name)],params:{cursor:e.cursor,previous:e.previous,type:e.typeFilter}},cursors:{next:be.data.pagination.cursors.next,previous:e.cursor},buttonVariant:"outline-dark",className:"py-2 float-end",prevHack:!0})):a.createElement($.K,{canUpload:he(A.C.UploadVideo)}):a.createElement(E.S,{allowBulkActions:!0})}())))}}}]);
|
|
2
|
+
//# sourceMappingURL=4985-7e02d5df40-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4985-7e02d5df40-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/hooks/useBreadcrumbs.ts","file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos-folder/my-videos-folders.scss","file:///app/packages/projects/lite/src/apps/my-videos/views/my-videos-folder/MyVideosFolderView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { BreadcrumbService } from 'libs/shared/services/BreadcrumbService';\n\nexport function useBreadcrumbs(current: Breadcrumb): Breadcrumb[] {\n const [ match, useBuilder ] = React.useMemo(() => BreadcrumbService.getBuilder(), []);\n\n const breadcrumbs = useBuilder(match);\n\n if (!breadcrumbs || !current)\n return breadcrumbs;\n\n return [ ...breadcrumbs, { ...current, active: true }];\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"uploadingList\":\"BrRqF\"};","import React from 'react';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { EntityType, Folder, LocationContext, SearchSourceDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { SearchIndices, SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { DragDropMoveContext } from 'libs/shared/components/drag-drop-move/DragDropMoveContext';\nimport { FolderList } from 'libs/shared/components/folder-list/FolderList';\nimport { PartialFolderList } from 'libs/shared/components/folder-list/partial-loading/PartialFolderList';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { useFocusSearchBar } from 'libs/shared/components/search-bar/SearchUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoListActions } from 'libs/shared/components/video-list/video-list-actions/VideoListActions';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RelatedVideosContext } from 'libs/shared/enums/RelatedVideosContext';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { BulkCheckboxManager, useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { BasePaginatedCollection, CurrentUser, Library, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { DragDropOverlay } from 'shared/components/drag-drop-overlay/DragDropOverlay';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { useFetchAllChildFolders } from 'apps/libraries/hooks/UseFetchAllChildFolders';\nimport { MyVideosRequests } from 'apps/my-videos/flight-requests/MyVideosRequests';\nimport { useDragDropMove } from 'apps/my-videos/hooks/useDragDropMove';\nimport { useUploadItems } from 'apps/my-videos/hooks/useUploadItems';\nimport { useGetFolderActions } from 'apps/my-videos/utils/getFolderActions';\nimport { UploadingItem } from 'apps/upload/components/uploading-item/UploadingItem';\n\nimport { MyVideosEmptyState } from '../my-videos/empty-state/MyVideosEmptyState';\nimport { useMyVideosViewActions, useMyVideosViewBulkActions } from '../my-videos/MyVideosViewUtils';\n\nimport styles from './my-videos-folders.scss';\n\nconst namespace = 'default.myVideosFolders';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface MyVideosFolderViewProps {\n id: string;\n cursor?: string;\n previous?: string;\n typeFilter?: SearchIndices[];\n}\n\nexport function MyVideosFolderView(props: MyVideosFolderViewProps): JSX.Element {\n const fetch = Flight.useGetFetch();\n \n const { commonVideoProps } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n const audiences = usePresentationAudiences();\n const { handleDragEnd } = useDragDropMove();\n const { focusSearchBar } = useFocusSearchBar();\n\n const folder = Flight.useBasicFetch<Folder>(LibraryRequests.folder(props.id));\n const subfolders = useFetchAllChildFolders(props.id);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const workspace = Flight.useBasicFetch<Library>(\n currentUser.data?.isAuthenticated && UserRequests.workspace()\n );\n\n useSetPageMetadata({\n title: folder.data ? getPhrase('pageTitle', { folder: folder.data?.name }) : ''\n });\n\n useHandleObjectError(folder);\n\n const breadcrumbs = useBreadcrumbs({ name: folder.data?.name });\n const getFolderActions = useGetFolderActions();\n\n // TODO: Remove this redirect when we release my videos with folders.\n const { myVideosFolders, isLoadingSettings } = useSettings(null);\n React.useEffect(() => {\n if (isLoadingSettings || myVideosFolders)\n return;\n \n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS\n }, { replace: true });\n }, [ myVideosFolders, isLoadingSettings ]);\n\n const getVideoItemActions = useMyVideosViewActions();\n const getVideosBulkActions = useMyVideosViewBulkActions(workspace.data?.id, props.id);\n const { hasPermissions } = usePermissions();\n\n const getMyVideosRequest = (cursor?: string, typeFilter?: SearchIndices | SearchIndices[]) => {\n // Delete the above when master supports the new assoc types.\n return MyVideosRequests.videos(props.id, cursor, typeFilter);\n };\n\n const fetchNext = (cursor?: string, typeFilter?: SearchIndices | SearchIndices[]) => {\n return fetch(getMyVideosRequest(cursor, typeFilter));\n };\n\n const videos = Flight.useBasicFetch<BasePaginatedCollection<VideoTypes>>(\n getMyVideosRequest(props.cursor, props.typeFilter)\n );\n\n useHandleObjectError(videos);\n\n const {\n uploadingVideos,\n onClickAlternate,\n onClickDelete,\n processingIds\n } = useUploadItems({ onRemove: fetchNext, categoryId: +props.id });\n\n const omittedVideos = videos.data?.data?.filter(v => !processingIds[v.id]);\n\n const CheckboxHelper: BulkCheckboxManager = useBulkCheckboxManager(omittedVideos);\n\n function getMyVideosAppLink(): Core.AppLink {\n return {\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n application: AppChannels.MY_VIDEOS,\n args: [ props.id, TextHelper.slugify(folder.data.name) ],\n params: { cursor: props.cursor, previous: props.previous, type: props.typeFilter }\n };\n }\n\n function getCursors(): Cursors {\n return { next: videos.data.pagination.cursors.next, previous: props.cursor };\n }\n\n if (!folder.data)\n return <></>;\n\n const hasFolders = !!subfolders?.items?.length;\n return (\n <VideoActionsContext.Provider value={getVideoItemActions}>\n <div className='px-3'>\n <div className='d-flex justify-content-between align-items-start'>\n <h1 className='h2 mb-0'>{folder.data.name}</h1>\n <div className='d-sm-flex d-none ms-2'>\n <IconButton\n svgName={cvSvgLibrary.Search}\n appLink={{\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: {\n source: SourceFilterOptions.MyVideos\n }\n }}\n className='btn btn-outline-dark me-2'\n onClick={focusSearchBar}\n analyticsData={{}}\n analyticsOptions={{\n entity: EntityType.SearchResults,\n location: LocationContext.MyVideos,\n actionType: UserAction.Click,\n descriptor: SearchSourceDescriptor.MyVideos\n }}\n >\n <Text namespace={namespace} phrase='searchMyVideos' />\n </IconButton>\n <ActionsComponent\n actions={getFolderActions('page', folder.data)}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n </div>\n </div>\n <div className='mt-3'>\n <Breadcrumbs breadcrumbs={breadcrumbs} />\n </div>\n <hr />\n {!subfolders?.hasCompleted && <PartialFolderList />}\n <DragDropMoveContext\n handleDragEnd={handleDragEnd}\n dragOverlayComponent={DragDropOverlay}\n source={folder.data}\n >\n {hasFolders &&\n <div className='mx-n2'>\n <FolderList\n folders={subfolders.items}\n getAppLink={(f: Folder) => ({\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ f.id, TextHelper.slugify(f.name) ]\n })}\n expandFolders={false}\n getFolderActions={f => getFolderActions('folder', f)}\n drag\n drop\n />\n </div>\n }\n <VideoListActions\n allowBulkAction\n allowFilter\n isVideosLoading={!videos.data}\n checkboxHelper={CheckboxHelper}\n getVideosBulkAction={getVideosBulkActions}\n locationContext={LocationContext.MyVideos}\n typeFilter={props.typeFilter}\n getAppLink={() => ({\n application: AppChannels.MY_VIDEOS,\n action: Actions.MyVideos.MY_VIDEOS_FOLDER,\n args: [ props.id, TextHelper.slugify(folder.data?.name) ]\n })}\n />\n {!!uploadingVideos?.length && (\n <div className={`position-relative ${styles.uploadingList}`}>\n {uploadingVideos.map(uploadingVideo => (\n <UploadingItem\n item={uploadingVideo}\n onClickAlternate={onClickAlternate}\n onClickDelete={onClickDelete}\n key={uploadingVideo.id}\n allowBulkAction\n categoryId={props.id}\n />\n ))}\n </div>\n )}\n {(() => {\n if (!videos.data)\n return <PartialVideoList allowBulkActions />;\n\n if (!videos.data?.data?.length)\n return <MyVideosEmptyState canUpload={hasPermissions(PermissionName.UploadVideo)} />;\n\n return (\n <>\n <VideoList\n videos={omittedVideos}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: RelatedVideosContext.Folder,\n contextId: props.id,\n includeContext: currentUser.data?.isAuthenticated\n })}\n presentationAudiences={audiences.data}\n canRemovePrivateVideos\n allowBulkAction\n hasPermissions={hasPermissions}\n getVideosBulkAction={getVideosBulkActions}\n typeFilter={props.typeFilter}\n checkboxHelper={CheckboxHelper}\n drag={hasFolders}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={commonVideoProps}\n />\n {!!videos.data?.pagination?.cursors && (\n <Pagination\n appLink={getMyVideosAppLink()}\n cursors={getCursors()}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n prevHack\n />\n )}\n </>\n );\n })()}\n </DragDropMoveContext>\n </div>\n </VideoActionsContext.Provider>\n );\n}"],"names":["useBreadcrumbs","current","match","breadcrumbs","useBuilder","active","namespace","getPhrase","LanguageService","MyVideosFolderView","props","fetch","commonVideoProps","useCommonVideoProps","locationContext","audiences","usePresentationAudiences","handleDragEnd","useDragDropMove","focusSearchBar","folder","LibraryRequests","id","subfolders","currentUser","UserRequests","workspace","data","isAuthenticated","useSetPageMetadata","title","name","useSettings","myVideosFolders","isLoadingSettings","application","action","replace","getVideoItemActions","getVideosBulkActions","hasPermissions","usePermissions","getMyVideosRequest","cursor","typeFilter","MyVideosRequests","videos","useUploadItems","onRemove","categoryId","uploadingVideos","onClickAlternate","onClickDelete","processingIds","omittedVideos","filter","v","CheckboxHelper","useBulkCheckboxManager","hasFolders","items","length","VideoActionsContext","value","className","IconButton","svgName","appLink","params","source","onClick","analyticsData","analyticsOptions","entity","location","actionType","descriptor","Text","phrase","Actions","actions","actionsDropdownClassName","Breadcrumbs","hasCompleted","PartialFolderList","DragDropMoveContext","dragOverlayComponent","DragDropOverlay","FolderList","folders","getAppLink","f","args","TextHelper","expandFolders","getFolderActions","drag","drop","VideoListActions","allowBulkAction","allowFilter","isVideosLoading","checkboxHelper","getVideosBulkAction","map","uploadingVideo","UploadingItem","item","key","VideoList","getVideoAppLink","opts","VideoAppLinkHelper","context","RelatedVideosContext","contextId","includeContext","presentationAudiences","canRemovePrivateVideos","getPreviewQuestionsAppLink","interactive","InteractiveHelper","pagination","cursors","Pagination","previous","type","next","buttonVariant","prevHack","MyVideosEmptyState","canUpload","PermissionName","PartialVideoList","allowBulkActions"],"sourceRoot":""}
|