@clickview/lite 0.69.1-dev.0 → 0.69.1-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{2636-lite-f995954232.chunk.css → 6078-lite-4d1b877b3f.chunk.css} +4 -0
  3. package/dist/css/{1239-lite-8152f713c8.chunk.css → 7210-lite-a568e8ec1e.chunk.css} +1 -0
  4. package/dist/scripts/1210-7afb28caac-lite.chunk.js +2 -0
  5. package/dist/scripts/1210-7afb28caac-lite.chunk.js.map +1 -0
  6. package/dist/scripts/232-1522c00252-lite.chunk.js +3 -0
  7. package/dist/scripts/232-1522c00252-lite.chunk.js.map +1 -0
  8. package/dist/scripts/300-3d9f3cd4e3-lite.chunk.js +2 -0
  9. package/dist/scripts/300-3d9f3cd4e3-lite.chunk.js.map +1 -0
  10. package/dist/scripts/3079-0a333d6805-lite.chunk.js +2 -0
  11. package/dist/scripts/3079-0a333d6805-lite.chunk.js.map +1 -0
  12. package/dist/scripts/3110-eee18143c6-lite.chunk.js +2 -0
  13. package/dist/scripts/3110-eee18143c6-lite.chunk.js.map +1 -0
  14. package/dist/scripts/312-693aa30814-lite.chunk.js +2 -0
  15. package/dist/scripts/312-693aa30814-lite.chunk.js.map +1 -0
  16. package/dist/scripts/4229-477b1858dc-lite.chunk.js +2 -0
  17. package/dist/scripts/4229-477b1858dc-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{4845-f3646fb657-lite.chunk.js → 4845-9b4657e696-lite.chunk.js} +2 -2
  19. package/dist/scripts/4845-9b4657e696-lite.chunk.js.map +1 -0
  20. package/dist/scripts/5679-b40a221c78-lite.chunk.js +2 -0
  21. package/dist/scripts/5679-b40a221c78-lite.chunk.js.map +1 -0
  22. package/dist/scripts/6046-104677f08c-lite.chunk.js +2 -0
  23. package/dist/scripts/6046-104677f08c-lite.chunk.js.map +1 -0
  24. package/dist/scripts/6078-0bc71f8768-lite.chunk.js +2 -0
  25. package/dist/scripts/6078-0bc71f8768-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{6188-e108abca25-lite.chunk.js → 6188-77fc2f3ec5-lite.chunk.js} +2 -2
  27. package/dist/scripts/6188-77fc2f3ec5-lite.chunk.js.map +1 -0
  28. package/dist/scripts/6351-dff9edbb16-lite.chunk.js +3 -0
  29. package/dist/scripts/6351-dff9edbb16-lite.chunk.js.map +1 -0
  30. package/dist/scripts/6973-c4cb114bd7-lite.chunk.js +2 -0
  31. package/dist/scripts/6973-c4cb114bd7-lite.chunk.js.map +1 -0
  32. package/dist/scripts/7210-d8fa7ca624-lite.chunk.js +3 -0
  33. package/dist/scripts/7210-d8fa7ca624-lite.chunk.js.map +1 -0
  34. package/dist/scripts/7482-13e6f78c32-lite.chunk.js +2 -0
  35. package/dist/scripts/7482-13e6f78c32-lite.chunk.js.map +1 -0
  36. package/dist/scripts/9040-be65e4eb1e-lite.chunk.js +2 -0
  37. package/dist/scripts/9040-be65e4eb1e-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{bundle-90d3c7fd15.min.js → bundle-bad2e20859.min.js} +3 -3
  39. package/dist/scripts/{bundle-90d3c7fd15.min.js.map → bundle-bad2e20859.min.js.map} +1 -1
  40. package/package.json +1 -1
  41. package/dist/scripts/1210-3cbdc62b0a-lite.chunk.js +0 -2
  42. package/dist/scripts/1210-3cbdc62b0a-lite.chunk.js.map +0 -1
  43. package/dist/scripts/1239-ed9b8aadb4-lite.chunk.js +0 -3
  44. package/dist/scripts/1239-ed9b8aadb4-lite.chunk.js.map +0 -1
  45. package/dist/scripts/2636-63e5f2c9e6-lite.chunk.js +0 -2
  46. package/dist/scripts/2636-63e5f2c9e6-lite.chunk.js.map +0 -1
  47. package/dist/scripts/3036-d18c598435-lite.chunk.js +0 -2
  48. package/dist/scripts/3036-d18c598435-lite.chunk.js.map +0 -1
  49. package/dist/scripts/4229-75ba28a266-lite.chunk.js +0 -2
  50. package/dist/scripts/4229-75ba28a266-lite.chunk.js.map +0 -1
  51. package/dist/scripts/4266-e856b96643-lite.chunk.js +0 -3
  52. package/dist/scripts/4266-e856b96643-lite.chunk.js.map +0 -1
  53. package/dist/scripts/4598-f326dc1aec-lite.chunk.js +0 -2
  54. package/dist/scripts/4598-f326dc1aec-lite.chunk.js.map +0 -1
  55. package/dist/scripts/4845-f3646fb657-lite.chunk.js.map +0 -1
  56. package/dist/scripts/6046-44c115a89c-lite.chunk.js +0 -2
  57. package/dist/scripts/6046-44c115a89c-lite.chunk.js.map +0 -1
  58. package/dist/scripts/6188-e108abca25-lite.chunk.js.map +0 -1
  59. package/dist/scripts/6317-49be898c73-lite.chunk.js +0 -2
  60. package/dist/scripts/6317-49be898c73-lite.chunk.js.map +0 -1
  61. package/dist/scripts/6973-ede6601614-lite.chunk.js +0 -2
  62. package/dist/scripts/6973-ede6601614-lite.chunk.js.map +0 -1
  63. package/dist/scripts/7075-9a76ce47c9-lite.chunk.js +0 -3
  64. package/dist/scripts/7075-9a76ce47c9-lite.chunk.js.map +0 -1
  65. package/dist/scripts/9040-9393c59004-lite.chunk.js +0 -2
  66. package/dist/scripts/9040-9393c59004-lite.chunk.js.map +0 -1
  67. /package/dist/css/{3036-lite-1b3e9aa905.chunk.css → 3079-lite-1b3e9aa905.chunk.css} +0 -0
  68. /package/dist/css/{7075-lite-a377febbb0.chunk.css → 6351-lite-a377febbb0.chunk.css} +0 -0
  69. /package/dist/scripts/{4266-e856b96643-lite.chunk.js.LICENSE.txt → 232-1522c00252-lite.chunk.js.LICENSE.txt} +0 -0
  70. /package/dist/scripts/{1239-ed9b8aadb4-lite.chunk.js.LICENSE.txt → 6351-dff9edbb16-lite.chunk.js.LICENSE.txt} +0 -0
  71. /package/dist/scripts/{7075-9a76ce47c9-lite.chunk.js.LICENSE.txt → 7210-d8fa7ca624-lite.chunk.js.LICENSE.txt} +0 -0
  72. /package/dist/scripts/{bundle-90d3c7fd15.min.js.LICENSE.txt → bundle-bad2e20859.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4598],{54405:(e,a,t)=>{t.d(a,{X:()=>i});var i={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},18006:(e,a,t)=>{t.d(a,{c:()=>i,q:()=>n});var i="D8qRe7",n="GRWx6w"},44183:(e,a,t)=>{t.r(a),t.d(a,{InsightsHeatmapDemoView:()=>j});var i=t(32735),n=t(23481),r=t(2948),s=t(20354),o=t(26025),c=t(60051),u=t(39151),l=t(54405),d=t(47812),m=t(31949),v=t(93322),g=t(79612),h=t(86702),f=t(26203),p=t(64176),y=t(18006),k=t(10447);function w(e,a){(null==a||a>e.length)&&(a=e.length);for(var t=0,i=Array(a);t<a;t++)i[t]=e[t];return i}var b=n.T.encloseNamespace("shared.insightsHeatmap");function j(){var e,a,t,n,j=(t=(0,r.D)(h.y.ANONYMISE_USERS),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,a){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var i,n,r,s,o=[],c=!0,u=!1;try{if(r=(t=t.call(e)).next,0===a){if(Object(t)!==t)return;c=!1}else for(;!(c=(i=r.call(t)).done)&&(o.push(i.value),o.length!==a);c=!0);}catch(e){u=!0,n=e}finally{try{if(!c&&null!=t.return&&(s=t.return(),Object(s)!==s))return}finally{if(u)throw n}}return o}}(t,n)||function(e,a){if(e){if("string"==typeof e)return w(e,a);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?w(e,a):void 0}}(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.")}())[0];(0,v.F)();var A=s.a.useBasicFetch(m.N.currentUser()),B=s.a.useBasicFetch(l.X.interactiveMetadata()),F=s.a.useBasicFetch(u.L.config()),S=o.B.getAudienceAppLinkParams(),E=o.B.getDateRangeAppLinkParams(),L=s.a.useBasicFetch(l.X.aggregateHeatmap()),z=s.a.useBasicFetch(l.X.individualHeatmap()),D=s.a.useBasicFetch(l.X.users()),R=s.a.useBasicFetch(l.X.videoViews()),H=s.a.useBasicFetch(B.data&&d.k.createViewKey(function(){var e;return(null===(e=F.data)||void 0===e?void 0:e.liteUrl.includes("staging"))?y.c:y.q}(),c.f.Share));(0,g.M)({title:B.data?b("pageTitle",{video:null===(e=B.data)||void 0===e?void 0:e.name}):null});var O=A.data&&R.data&&B.data&&L.data&&H.data,X=!!z.data,I=Object.assign(Object.assign({},S),E);return i.createElement("div",{className:"px-3"},i.createElement(f.j,{video:B.data,tabs:(0,k.aq)(null===(a=B.data)||void 0===a?void 0:a.id,"heatmap",I),dateRangeAppLinkParams:E,isDemo:!0}),i.createElement(p.w,{aggregateEngagement:L.data,individualEngagement:z.data,videoViews:R.data,config:F.data,users:D.data,viewKey:H.data,hasDataLoaded:!!O,tableDataLoaded:X,anonymiseUsers:j,audienceAppLinkParams:S,dateRangeAppLinkParams:E}))}}}]);
2
- //# sourceMappingURL=4598-f326dc1aec-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4598-f326dc1aec-lite.chunk.js","mappings":"oIAEO,IAAMA,EAAuB,CAClCC,YAAW,WACT,MAAO,CACLC,IAAK,mCACLC,IAAK,mBACLC,WAAW,EAEf,EAEAC,oBAAmB,WACjB,MAAO,CACLH,IAAK,4CACLC,IAAK,4BACLC,WAAW,EAEf,EAEAE,mBAAkB,WAChB,MAAO,CACLJ,IAAK,2CACLC,IAAK,2BACLC,WAAW,EAEf,EAEAG,WAAU,WACR,MAAO,CACLL,IAAK,mCACLC,IAAK,mBACLC,WAAW,EAEf,EAEAI,MAAK,WACH,MAAO,CACLN,IAAK,6BACLC,IAAK,aACLC,WAAW,EAEf,EAEAK,kBAAiB,WACf,MAAO,CACLP,IAAK,0CACLC,IAAK,0BACLC,WAAW,EAEf,EAEAM,iBAAgB,WACd,MAAO,CACLR,IAAK,yCACLC,IAAK,yBACLC,WAAW,EAEf,E,2CCzDK,IAAMO,EAA8B,SAC9BC,EAA2B,Q,oWCuBxC,IACMC,EAAY,qBADA,0BAGZ,SAAUC,I,YACPC,G,GAAkB,OAAsB,qB,EAA8B,E,o4BAAxD,IAErB,SAEA,IAAMC,EAAc,kBAAkC,mBAChDC,EAAQ,kBACZ,2BAEIC,EAAS,kBAA6B,cAEtCC,EAAwB,+BACxBC,EAAyB,gCAEzBC,EAAsB,kBAC1B,wBAGIC,EAAuB,kBAC3B,yBAGId,EAAQ,kBAA6B,aAErCD,EAAa,kBAA6C,kBAE1DgB,EAAU,kBAAoCN,EAAMO,MACxD,kBAkBF,W,MACE,OAAe,QAAX,EAAAN,EAAOM,YAAI,eAAEC,QAAQC,SAAS,YAAmB,IAE9C,GACT,CAtB+BC,GAAwB,aAEvD,OAAmB,CAAEC,MAAOX,EAAMO,KAAOX,EAAU,YAAa,CAAEI,MAAiB,QAAV,EAAAA,EAAMO,YAAI,eAAEK,OAAU,OAE/F,IAAMC,EACJd,EAAYQ,MACZjB,EAAWiB,MACXP,EAAMO,MACNH,EAAoBG,MACpBD,EAAQC,KAEJO,IAAoBT,EAAqBE,KAEzCQ,EAAS,OAAH,wBACPb,GACAC,GASL,OACE,uBAAKa,UAAU,QACb,gBAAC,IAAc,CACbhB,MAAOA,EAAMO,KACbU,MAAM,QAAyC,QAAV,EAAAjB,EAAMO,YAAI,eAAEW,GAAI,UAAWH,GAChEZ,uBAAwBA,EACxBgB,QAAM,IAGR,gBAAC,IAAe,CACdf,oBAAqBA,EAAoBG,KACzCF,qBAAsBA,EAAqBE,KAC3CjB,WAAYA,EAAWiB,KACvBN,OAAQA,EAAOM,KACfhB,MAAOA,EAAMgB,KACbD,QAASA,EAAQC,KACjBM,gBAAiBA,EACjBC,gBAAiBA,EACjBhB,eAAgBA,EAChBI,sBAAuBA,EACvBC,uBAAwBA,IAIhC,C","sources":["file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/projects/lite/src/apps/my-shares/constants/DemoInsights.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/heatmap/InsightsHeatmapDemoView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","export const DEMO_INTERACTIVE_STAGING_ID = 'D8qRe7';\nexport const DEMO_INTERACTIVE_PROD_ID = 'GRWx6w';","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Engagement, IndividualEngagementResponse, InteractiveMetadata, PlayerViewKey, User } from 'libs/shared/interfaces';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { DEMO_INTERACTIVE_PROD_ID, DEMO_INTERACTIVE_STAGING_ID } from 'apps/my-shares/constants/DemoInsights';\nimport { getInsightsDemoInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function InsightsHeatmapDemoView() {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n InsightsDemoRequests.aggregateHeatmap()\n );\n\n const individualEngagement = Flight.useBasicFetch<IndividualEngagementResponse>(\n InsightsDemoRequests.individualHeatmap()\n );\n\n const users = Flight.useBasicFetch<User[]>(InsightsDemoRequests.users());\n\n const videoViews = Flight.useBasicFetch<VideoViewEventResponse>(InsightsDemoRequests.videoViews());\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(video.data &&\n PlayerRequests.createViewKey(getDemoInteractiveId(), MediaIdType.Share));\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n\n const hasDataLoaded =\n currentUser.data &&\n videoViews.data &&\n video.data &&\n aggregateEngagement.data &&\n viewKey.data;\n\n const tableDataLoaded = !!individualEngagement.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n function getDemoInteractiveId() {\n if (config.data?.liteUrl.includes('staging')) return DEMO_INTERACTIVE_STAGING_ID;\n\n return DEMO_INTERACTIVE_PROD_ID;\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsDemoInteractiveTabs(video.data?.id, 'heatmap', params)}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n isDemo\n />\n\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={individualEngagement.data}\n videoViews={videoViews.data}\n config={config.data}\n users={users.data}\n viewKey={viewKey.data}\n hasDataLoaded={!!hasDataLoaded}\n tableDataLoaded={tableDataLoaded}\n anonymiseUsers={anonymiseUsers}\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n />\n </div>\n );\n}"],"names":["InsightsDemoRequests","interactive","url","key","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","DEMO_INTERACTIVE_STAGING_ID","DEMO_INTERACTIVE_PROD_ID","getPhrase","InsightsHeatmapDemoView","anonymiseUsers","currentUser","video","config","audienceAppLinkParams","dateRangeAppLinkParams","aggregateEngagement","individualEngagement","viewKey","data","liteUrl","includes","getDemoInteractiveId","title","name","hasDataLoaded","tableDataLoaded","params","className","tabs","id","isDemo"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4845-f3646fb657-lite.chunk.js","mappings":"8JAiBA,SAASA,EACPC,EACAC,GAEA,MAAO,CACLC,cAAeF,EAAYG,GAC3BC,kBAAmBJ,EAAYK,WAC/BC,UAAW,CAAEC,MAAON,EAAOM,MAAOC,IAAKP,EAAOO,KAC9CC,QAASR,EAAOS,OAChBC,oBAAqBV,EAAOW,QAEhC,CAEO,IAAMC,EAA6B,CAMxCC,qBAAoB,SAClBC,EACAC,EACAhB,EACAC,EACAgB,EACAC,EACAC,EACAC,GAEA,MAAO,CACLC,IAAKJ,EAAoB,gDACkBF,EAAa,qBAAaC,GAAqB,gDAC/CD,EAAa,qBAAaC,GACrEM,KAAK,OAAuB,0BAAD,OAA2BP,EAAa,YAAIC,GAAyBf,GAChGsB,KAAMxB,EAA4BC,EAAaC,GAC/CuB,KAAM,SACNC,WAAW,EACXP,QAAAA,EACAC,MAAAA,EACAC,OAAAA,EAEJ,EAMAM,KAAI,SACFX,EACAC,EACAW,EACAJ,EACAL,EACAC,EACAC,GAEA,MAAO,CACLC,IAAK,oCAAF,OAAsCM,GACzCL,IAAK,eAAF,OAAiBK,EAAQ,YAAIJ,EAAKK,UACrCJ,KAAM,QACND,KAAAA,EACAE,WAAW,EACXI,iBAAkB,0BAAF,OAA4Bd,EAAa,YAAIC,GAC7DE,QAAAA,EACAC,MAAAA,EACAC,OAAAA,EAEJ,EAEAU,eAAc,SAACP,GACb,MAAO,CACLF,IAAK,gEACLC,IAAK,+BACLE,KAAM,SACND,KAAAA,EAEJ,EAEAQ,yBAAwB,SAACR,GACvB,MAAO,CACLF,IAAK,6CACLC,IAAK,6BACLC,KAAAA,EACAC,KAAM,SACNC,WAAW,EAEf,E,kSC5FI,SAAUO,EAAgBC,G,MACxBC,EAAe,kBAAoCD,GAAW,oBAA8BA,IAElG,OAAsB,QAAjB,EAAAC,EAAaX,YAAI,eAAEY,QAGjBD,EAAaX,KAAKa,QAAO,SAACC,EAAMC,GAAO,OAAK,+BAAMD,I,EAAI,G,EAAGC,EAAQC,U,EAAYD,G,+XAAO,GAAK,CAAC,GAFxF,CAAC,CAGZ,C,mFCXM,SAAUE,EACdxB,EACAyB,EACAxB,G,MAEMjB,EAAc,kBAAkC,mBAEhD0C,EAAsB,oBAA4C1B,GACtE,wBAAwCA,IAEpC2B,EAAc,qBAA4D,QAAxB,EAAAD,EAAoBnB,YAAI,eAAER,gBAChF,gBAAgC2B,EAAoBnB,KAAKR,gBAErD6B,IAAuB5C,EAAYuB,QAAUoB,EAAYpB,QAAWkB,EAE1E,OAAO,kBAA2CG,GAChD,EAAAC,EAAA,qBACEH,EAAoBnB,KAAKR,cACzB2B,EAAoBnB,KAAKpB,GACzBH,EAAYuB,KACZkB,EACAxB,GAEN,C,iwBC5BO,IAAM6B,EAAoB,SAACC,GAChC,IAAMrC,EAAmB,GACnBE,EAAoB,GAU1B,OARImC,EAAYC,OACdtC,EAAOuC,KAAI,MAAXvC,EAAM,EAASqC,EAAYC,QAEzBD,EAAYG,YACdtC,EAAQqC,KAAI,MAAZrC,EAAO,EAASmC,EAAYG,aAE1BH,EAAYI,iBACdvC,EAAQqC,KAAI,MAAZrC,EAAO,EAASmC,EAAYI,kBACvB,CACLzC,OAAAA,EACAE,QAAAA,EAEJ,C,kBChBM,SAAUwC,EAAuBC,EAAiBpD,EAAgCqD,GACtF,IAAIhC,EAAM,GAAH,OAAM+B,EAAO,YAAIpD,EAAOM,MAAK,YAAIN,EAAOO,KAEzC+C,EAAYC,MAAMC,QAAQxD,EAAOS,QAAUT,EAAOS,OAAOgD,OAAOC,KAAK,KAAO1D,EAAOS,OACnFkD,EAAaJ,MAAMC,QAAQxD,EAAOW,SAAWX,EAAOW,QAAQ8C,OAAOC,KAAK,KAAO1D,EAAOW,QAW5F,OATI2C,IACFjC,GAAO,IAAJ,OAAQiC,IAETK,IACFtC,GAAO,IAAJ,OAAQsC,IAETN,IACFhC,GAAO,IAAJ,OAAQgC,IAENhC,CACT,C,6bCaA,IACMuC,EAAY,qBADA,wCASZ,SAAUC,EAAgCC,G,gBACvCC,G,GAAkB,OAAsB,qB,EAAoC,E,o4BAA9D,GAEbC,GAAmB,OAAY,MAA/BA,eAEAC,GAAmB,SAAnBA,eAEFC,EAAS,kBAA6B,cAEtCzB,EAAsB,kBAC1B,wBAAwCqB,EAAMhD,gBAG1C4B,EAAc,mBAA0D,QAAxB,EAAAD,EAAoBnB,YAAI,eAAER,gBAC9E,gBAAgC2B,EAAoBnB,KAAKR,gBAErDqD,EAAY,kBAAgC,2BAAqCL,EAAMhD,gBACvFmB,GAAe,OAA8B,QAAd,EAAAkC,EAAU7C,YAAI,eAAEpB,IAE/CkE,EAAwB,+BACxBC,EAAyB,gCAEzBC,GAAU,OAA2BR,EAAMhD,cAAe,OAAF,yBACzD,SAAkB,UAA+BuD,KACjD,OAAkBD,KACpB,GAEGG,EAAgB7B,EAAYpB,MAAQmB,EAAoBnB,QAAUgD,EAAQhD,MAEhF,OAAmB,CAAEkD,MAAO/B,EAAoBnB,KAAOsC,EAAU,YAAa,CAAEa,MAA+B,QAAxB,EAAAhC,EAAoBnB,YAAI,eAAEoD,OAAU,OAmB3H,IAAMC,EAAS,OAAH,wBACPP,GACAC,GAGL,OACE,uBAAKO,UAAU,QACb,gBAAC,IAAc,CACbP,uBAAwBA,EACxBQ,MAAM,QAA2Bf,EAAMhD,cAAe,UAAW6D,GACjEF,MAAOhC,EAAoBnB,KAC3BwD,aAAcb,EAAe,2BAC7Bc,gBAA4B,QAAX,EAAAb,EAAO5C,YAAI,eAAEyD,gBAC9Bf,eAAgBA,IAGlB,gBAAC,IAA2B,CAC1BvB,oBAAqBA,EAAoBnB,KACzC0D,mBAnCN,SACEC,EACAlE,EACAmE,GAEA,eAA2B,CACzBC,YAAa,aACbC,OAAQ,yCACRT,OAAQ,CACNU,UAAW,OAAQJ,EAAOA,EAAK/E,QAAKoF,EACpCvE,sBAAAA,EACAmE,cAAAA,EACA5C,UAAW,cAAe2C,EAAOA,EAAK3C,eAAYgD,IAGxD,EAqBM5C,YAAaA,EAAYpB,KACzBgD,QAASA,EAAQhD,KACjBiE,SAAUzB,EAAMyB,SAChBC,OAAQ1B,EAAM0B,OACdC,WAAYnB,EAAQmB,WACpB1B,eAAgBA,EAChBQ,cAAeA,EACftC,aAAcA,IAItB,C","sources":["file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView.tsx"],"sourcesContent":["import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: { start: filter.start, end: filter.end },\n userIds: filter.userId,\n classroomsAndGroups: filter.groupId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n includePublicResults: boolean,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: includePublicResults ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews`,\n type: HttpVerbs.POST,\n data\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '{gateway}/v2/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(shareId && ShareRequests.getAnonSessions(shareId));\n\n if (!anonSessions.data?.length)\n return {};\n\n return anonSessions.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { AnalyticsRequestFilter, CurrentUser, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nexport function useFetchInteractiveResults(\n interactiveMetadataId: string,\n requestFilter: AnalyticsRequestFilter,\n includePublicResults?: boolean\n): Flight.Response<InteractiveResultSet> {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(!!interactiveMetadataId &&\n InteractiveRequests.interactiveMetadata(interactiveMetadataId));\n\n const interactive = Flight.useBasicFetch<Interactive>(!!interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shouldFetchResults = !!currentUser.data && !!interactive.data && (!!requestFilter);\n\n return Flight.useBasicFetch<InteractiveResultSet>(shouldFetchResults &&\n InteractiveResultsRequests.interactiveResultSet(\n interactiveMetadata.data.interactiveId,\n interactiveMetadata.data.id,\n currentUser.data,\n requestFilter,\n includePublicResults\n ));\n}","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, Interactive, InteractiveMetadata, ShareLink } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n interactiveId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\nexport function InteractiveInsightsStudentsView(props: InteractiveInsightsStudentsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.interactiveId));\n const anonSessions = useAnonSessions(shareLink.data?.id);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n }, true);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n function viewStudentResults(\n user: UserOrAnonSession,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.INSIGHTS,\n action: Actions.Insights.INTERACTIVE_STUDENT_RESULTS,\n params: {\n studentId: 'id' in user ? user.id : undefined,\n interactiveMetadataId,\n interactionId,\n sessionId: 'sessionId' in user ? user.sessionId : undefined\n }\n });\n }\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n return (\n <div className='px-3'>\n <InsightsHeader\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(props.interactiveId, 'results', params)}\n video={interactiveMetadata.data}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n />\n\n <InteractiveInsightsStudents\n interactiveMetadata={interactiveMetadata.data}\n viewStudentResults={viewStudentResults}\n interactive={interactive.data}\n results={results.data}\n filterBy={props.filterBy}\n sortBy={props.sortBy}\n isFetching={results.isFetching}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n anonSessions={anonSessions}\n />\n </div>\n );\n}"],"names":["getInteractiveResultFilters","currentUser","filter","currentUserId","id","currentCustomerId","customerId","dateRange","start","end","userIds","userId","classroomsAndGroups","groupId","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","includePublicResults","success","error","always","url","key","data","type","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactiveResultsReport","useAnonSessions","shareId","anonSessions","length","reduce","prev","current","sessionId","useFetchInteractiveResults","requestFilter","interactiveMetadata","interactive","shouldFetchResults","I","getAudienceParams","queryParams","users","push","classrooms","classroomGroups","getAnalyticsRequestKey","baseKey","sharerId","userIdKey","Array","isArray","sort","join","groupIdKey","getPhrase","InteractiveInsightsStudentsView","props","anonymiseUsers","hasShareFlowV2","hasPermissions","config","shareLink","audienceAppLinkParams","dateRangeAppLinkParams","results","hasDataLoaded","title","video","name","params","className","tabs","hasAnalytics","analyticsWebUrl","viewStudentResults","user","interactionId","application","action","studentId","undefined","filterBy","sortBy","isFetching"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6046],{5255:(e,t,a)=>{a.d(t,{Y:()=>o});var r=a(20354),n=a(30439);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function o(e){var t,a=r.a.useBasicFetch(e&&n.o.getAnonSessions(e));return(null===(t=a.data)||void 0===t?void 0:t.length)?a.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(a={},r=t.sessionId,n=t,(r=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=i(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(r))in a?Object.defineProperty(a,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[r]=n,a));var a,r,n}),{}):{}}},74901:(e,t,a)=>{function r(e){return function(e){if(Array.isArray(e))return n(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 n(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)?n(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 n(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}a.d(t,{K:()=>i});var i=function(e){var t=[],a=[];return e.users&&t.push.apply(t,r(e.users)),e.classrooms&&a.push.apply(a,r(e.classrooms)),e.classroomGroups&&a.push.apply(a,r(e.classroomGroups)),{userId:t,groupId:a}}},94644:(e,t,a)=>{a.d(t,{r:()=>d});var r=a(50242),n=a(81886),i=a(67058),o=a(14553),s=a(49267),u=a(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:u._,internalServerError:u._};function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&n.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?a.badRequest||n.Q.Ry.throw(new o.badRequest):a.forbidden||n.Q.Ry.throw(new o.forbidden.privacy):a.notFound||n.Q.Ry.throw(new o.notFound):a.internalServerError||n.Q.Ry.throw(new u._))}}},17913:(e,t,a)=>{a.d(t,{u:()=>o});var r=a(97395),n=a(110),i=a(62875),o={individualEngagement:function(e,t,a,n){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),n&&(o.includeAnonViews=!0),{url:r._.urlBuilder("{gateway}/v1/analytics/heat-map",o),key:(0,i.H)("engagement:".concat(e,":").concat(n),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{data:null===(t=e.data)||void 0===t?void 0:t.map((function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})}))})},normalize:!1}},aggregateEngagement:function(e,t,a,n){var o=Object.assign({objectId:e},t);return a&&(o.sharerId=a),n&&(o.includeAnonViews=!0),{url:r._.urlBuilder("{gateway}/v1/analytics/heat-map/aggregations",o),key:(0,i.H)("aggregate:engagement:".concat(e,":").concat(n),t,a),formatData:function(e){var t;return Object.assign(Object.assign({},e),{heatMap:null!==(t=e.heatMap)&&void 0!==t?t:[]})},normalize:!1}},views:function(e,t,a,o){var s=Object.assign(Object.assign({},e),{timeOffset:n.O.getTimezoneOffset()});return t&&(s.objectId=t),a&&(s.sharerId=a),o&&(s.includeAnonViews=!0),{url:r._.urlBuilder("{gateway}/v1/analytics/video-views",s),key:(0,i.H)("video:views:".concat(t,":").concat(o),e,a),normalize:!1}}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var r=a(32735),n=a(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){o.forEach((function(e){(0,n.r)(e.statusCode,t,a)}))}),[i(o),t,a])}},62875:(e,t,a)=>{function r(e,t,a){var r="".concat(e,":").concat(t.start,":").concat(t.end),n=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,i=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId;return n&&(r+=":".concat(n)),i&&(r+=":".concat(i)),a&&(r+=":".concat(a)),r}a.d(t,{H:()=>r})},56046:(e,t,a)=>{a.r(t),a.d(t,{InsightsHeatmapView:()=>_});var r=a(32735),n=a(23481),i=a(2948),o=a(20354),s=a(5255),u=a(4606),c=a(26025),d=a(74901),l=a(40003),v=a(30439),f=a(4594),g=a(60051),y=a(16714),m=a(39151),p=a(47812),b=a(31949),h=a(17913),I=a(91286),w=a(93322),j=a(22902),A=a(79612),O=a(37802),S=a(31908),E=a(86702),k=a(26203),F=a(64176),B=a(10447);function R(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,r=Array(t);a<t;a++)r[a]=e[a];return r}var L=n.T.encloseNamespace("shared.insightsHeatmap");function _(e){var t,a,n,_,C,M,V,P,U,q=(P=(0,i.D)(E.y.ANONYMISE_USERS),U=1,function(e){if(Array.isArray(e))return e}(P)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var r,n,i,o,s=[],u=!0,c=!1;try{if(i=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;u=!1}else for(;!(u=(r=i.call(a)).done)&&(s.push(r.value),s.length!==t);u=!0);}catch(e){c=!0,n=e}finally{try{if(!u&&null!=a.return&&(o=a.return(),Object(o)!==o))return}finally{if(c)throw n}}return s}}(P,U)||function(e,t){if(e){if("string"==typeof e)return R(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)?R(e,t):void 0}}(P,U)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,w.F)();var H=(0,O.r)(null).hasShareFlowV2,T=(0,j.T)().hasPermissions,D=(0,O.r)(null).publicInteractiveAttempts,N=o.a.useBasicFetch(b.N.currentUser()),Q=S.M.getVideoRequest(e.videoId,e.typeId),z=o.a.useBasicFetch(Q),K=o.a.useBasicFetch(m.L.config()),$=o.a.useBasicFetch(v.o.getShareLinkByObjectId(e.videoId)),Y=(0,s.Y)(null===(t=$.data)||void 0===t?void 0:t.id),x=c.B.getAudienceAppLinkParams(),G=c.B.getDateRangeAppLinkParams(),W=Object.assign(Object.assign({},(0,l.wO)((0,l.Hb)(),G)),(0,d.K)(x)),J=o.a.useBasicFetch(N.data&&h.u.aggregateEngagement(e.videoId,W,N.data.id,D)),X=o.a.useBasicFetch(N.data&&h.u.individualEngagement(e.videoId,W,null===(a=N.data)||void 0===a?void 0:a.id,D)),Z=(null===(_=null===(n=X.data)||void 0===n?void 0:n.data)||void 0===_?void 0:_.map((function(e){return e.userId})).filter(Boolean))||[],ee=(0,u.U)(Z),te=ee.users,ae=ee.isLoading,re=o.a.useBasicFetch(N.data&&h.u.views(W,e.videoId,null===(C=N.data)||void 0===C?void 0:C.id,D)),ne=o.a.useBasicFetch(p.k.createViewKey(e.videoId,g.f.MasterObject));(0,A.M)({title:z.data?L("pageTitle",{video:null===(M=z.data)||void 0===M?void 0:M.name}):null}),(0,I.v)(z);var ie=N.data&&re.data&&z.data&&J.data&&ne.data,oe=!(!X.data||Z.length&&ae),se=Object.assign(Object.assign({},x),G);return r.createElement("div",{className:"px-3"},r.createElement(k.j,{video:z.data,dateRangeAppLinkParams:G,tabs:e.typeId===f.E.Interactive?(0,B.kj)(e.videoId,"heatmap",se):e.typeId===f.E.Clip?(0,B.$o)(e.videoId,"heatmap",se):(0,B.$6)(e.videoId,"heatmap",se),hasAnalytics:T(y.C.ViewCustomerAnalytics),analyticsWebUrl:null===(V=K.data)||void 0===V?void 0:V.analyticsWebUrl,hasShareFlowV2:H}),r.createElement(F.w,{aggregateEngagement:J.data,individualEngagement:X.data,videoViews:re.data,config:K.data,users:te,viewKey:ne.data,hasDataLoaded:!!ie,tableDataLoaded:oe,anonymiseUsers:q,audienceAppLinkParams:x,dateRangeAppLinkParams:G,anonSessions:Y}))}}}]);
2
- //# sourceMappingURL=6046-44c115a89c-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/6046-44c115a89c-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AudienceUtils.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/VideoViewRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/heatmap/InsightsHeatmapView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(shareId && ShareRequests.getAnonSessions(shareId));\n\n if (!anonSessions.data?.length)\n return {};\n\n return anonSessions.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import { AudienceQueryParams } from 'libs/shared/apps/analytics/interfaces/AudienceQueryParams';\n\nexport const getAudienceParams = (queryParams: AudienceQueryParams) => {\n const userId: string[] = [];\n const groupId: string[] = [];\n\n if (queryParams.users)\n userId.push(...queryParams.users);\n\n if (queryParams.classrooms)\n groupId.push(...queryParams.classrooms);\n\n if (queryParams.classroomGroups)\n groupId.push(...queryParams.classroomGroups);\n return {\n userId,\n groupId\n };\n};","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsRequestFilter, Engagement } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nexport const VideoViewRequests = {\n individualEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n\n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map', queryParams),\n key: getAnalyticsRequestKey(`engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: any) => {\n return {\n ...data,\n data: data.data?.map((d: any) => ({\n ...d,\n heatMap: d.heatMap ?? []\n }))\n };\n },\n normalize: false\n };\n },\n \n aggregateEngagement(\n objectId: string,\n filter: AnalyticsRequestFilter,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n objectId,\n ...filter\n };\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/heat-map/aggregations', queryParams),\n key: getAnalyticsRequestKey(`aggregate:engagement:${objectId}:${includeAnonViews}`, filter, sharerId),\n formatData: (data: Engagement) => {\n return {\n ...data,\n heatMap: data.heatMap ?? []\n };\n },\n normalize: false\n };\n },\n \n views(\n filter: AnalyticsRequestFilter,\n objectId?: string,\n sharerId?: string,\n includeAnonViews?: boolean\n ): Flight.Request {\n const queryParams: HashObject = {\n ...filter,\n timeOffset: DateHelper.getTimezoneOffset()\n };\n\n if (objectId)\n queryParams.objectId = objectId;\n\n if (sharerId)\n queryParams.sharerId = sharerId;\n \n if (includeAnonViews)\n queryParams.includeAnonViews = true;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/analytics/video-views', queryParams),\n key: getAnalyticsRequestKey(`video:views:${objectId}:${includeAnonViews}`, filter, sharerId),\n normalize: false\n };\n }\n};","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, sharerId?: string): string {\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (sharerId)\n key += `:${sharerId}`;\n\n return key;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useChunkedUsersResponse } from 'libs/shared/apps/analytics/hooks/UseEngagementUsers';\nimport { VideoViewEventResponse } from 'libs/shared/apps/analytics/interfaces/VideoViewEvent';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoViewRequests } from 'libs/shared/flight-requests/VideoViewRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { AnalyticsRequestFilter, Config, CurrentUser, Engagement, IndividualEngagementResponse, PlayerViewKey, ShareLink, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { getInsightsClipTabs, getInsightsInteractiveTabs, getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapViewProps {\n videoId: string;\n typeId: MasterType;\n}\n\nexport function InsightsHeatmapView(props: InsightsHeatmapViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasShareFlowV2 } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const { publicInteractiveAttempts } = useSettings(null);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const videoRequest = VideoHelper.getVideoRequest(props.videoId, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.videoId));\n\n const anonSessions = useAnonSessions(shareLink.data?.id);\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const requestFilter: AnalyticsRequestFilter = {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n };\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n currentUser.data && VideoViewRequests.aggregateEngagement(\n props.videoId,\n requestFilter,\n currentUser.data.id,\n publicInteractiveAttempts\n )\n );\n\n const individualEngagement = Flight.useBasicFetch<IndividualEngagementResponse>(currentUser.data &&\n VideoViewRequests.individualEngagement(\n props.videoId,\n requestFilter,\n currentUser.data?.id,\n publicInteractiveAttempts\n ));\n\n const userIds = individualEngagement.data?.data?.map(d => d.userId).filter(Boolean) || [];\n const { users, isLoading } = useChunkedUsersResponse(userIds);\n\n const videoViews = Flight.useBasicFetch<VideoViewEventResponse>(currentUser.data &&\n VideoViewRequests.views(requestFilter, props.videoId, currentUser.data?.id, publicInteractiveAttempts));\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n PlayerRequests.createViewKey(props.videoId, MediaIdType.MasterObject)\n );\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError(video);\n\n const hasDataLoaded =\n currentUser.data &&\n videoViews.data &&\n video.data &&\n aggregateEngagement.data &&\n viewKey.data;\n\n const tableDataLoaded = !!individualEngagement.data && (!userIds.length || !isLoading);\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n function getInsightsTabs() {\n if (props.typeId === MasterType.Interactive)\n return getInsightsInteractiveTabs(props.videoId, 'heatmap', params);\n\n if (props.typeId === MasterType.Clip)\n return getInsightsClipTabs(props.videoId, 'heatmap', params);\n\n return getInsightsVideoTabs(props.videoId, 'heatmap', params);\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsTabs()}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n hasShareFlowV2={hasShareFlowV2}\n />\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={individualEngagement.data}\n videoViews={videoViews.data}\n config={config.data}\n users={users}\n viewKey={viewKey.data}\n hasDataLoaded={!!hasDataLoaded}\n tableDataLoaded={tableDataLoaded}\n anonymiseUsers={anonymiseUsers}\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n anonSessions={anonSessions}\n />\n </div>\n );\n}"],"names":["useAnonSessions","shareId","anonSessions","data","length","reduce","prev","current","sessionId","getAudienceParams","queryParams","userId","groupId","users","push","classrooms","classroomGroups","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","VideoViewRequests","individualEngagement","objectId","filter","sharerId","includeAnonViews","url","key","formatData","map","d","heatMap","normalize","aggregateEngagement","views","timeOffset","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","getAnalyticsRequestKey","baseKey","start","end","userIdKey","sort","groupIdKey","getPhrase","InsightsHeatmapView","props","anonymiseUsers","hasShareFlowV2","hasPermissions","publicInteractiveAttempts","currentUser","videoRequest","videoId","typeId","video","config","shareLink","id","audienceAppLinkParams","dateRangeAppLinkParams","requestFilter","userIds","Boolean","isLoading","videoViews","viewKey","title","name","hasDataLoaded","tableDataLoaded","params","className","tabs","hasAnalytics","analyticsWebUrl"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/6188-e108abca25-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseAnonSessions.ts","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListFooter.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/student-response-list/student-response-list.scss","file:///app/packages/libs/shared/src/apps/student-response-list/StudentResponseList.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/flight-requests/InsightsDemoRequests.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/demo/interactive-student-results/InteractiveStudentResultsDemoView.tsx"],"sourcesContent":["import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\n\nexport interface AnonSession {\n sessionId: string;\n sessionName: string;\n}\n\nexport interface AnonSessions extends Record<string, AnonSession> {}\n\nexport function useAnonSessions(shareId: string): AnonSessions {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(shareId && ShareRequests.getAnonSessions(shareId));\n\n if (!anonSessions.data?.length)\n return {};\n\n return anonSessions.data.reduce((prev, current) => ({ ...prev, [current.sessionId]: current }), {});\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListFooterProps {\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n onClickClose: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListFooter(props: StudentResponseListFooterProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-end pt-3'>\n <div>\n {!props.showSubmitButtonSpinner &&\n <button className='btn btn-link' onClick={props.onClickClose}>\n {getPhrase('close')}\n </button>\n }\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip\n id='submitAnswers'\n title={getPhrase('demoOnly')}\n spanHack\n spanHackClassName='d-inline-flex'\n >\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.studentResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResponseListHeaderProps {\n summary: ResultsSummary;\n interactionsToMark: Interaction[];\n markedAnswers: MarkedAnswerHash;\n onClickSubmit: () => void;\n showSubmitButtonSpinner: boolean;\n isDemo?: boolean;\n}\n\nexport function StudentResponseListHeader(props: StudentResponseListHeaderProps): JSX.Element {\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n return (\n <div className='d-flex justify-content-between pb-3'>\n <div className='d-flex'>\n {!!props.summary.unanswered &&\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('unanswered')}</strong>\n {props.summary.unanswered}\n </div>\n }\n <div className='bg-light rounded p-2 me-2'>\n <strong className='me-2'>{getPhrase('score')}</strong>\n {props.summary.awaitingMarking\n ? <em>{getPhrase('pending')}</em>\n : `${Math.round(props.summary.percentCorrect * 100)}%`\n }\n </div>\n </div>\n {!!props.interactionsToMark.length && (\n <>\n {props.isDemo ? (\n <Tooltip id='submitAnswers' title={getPhrase('demoOnly')} spanHack>\n <button\n className='btn btn-outline-dark pointer-events-none'\n disabled={!numMarkedAnswers}\n >\n {getPhrase('submitAnswers')}\n </button>\n </Tooltip>\n ) : (\n <SpinnerButton\n variant='outline-dark'\n onClick={props.onClickSubmit}\n disabled={!numMarkedAnswers}\n showSpinner={props.showSubmitButtonSpinner}\n >\n {getPhrase('submitAnswers')}\n </SpinnerButton>\n )}\n </>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"MvGb5\"};","import React from 'react';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus, getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, Interactive, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getInteractions, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport { StudentResponseListFooter } from './StudentResponseListFooter';\nimport { StudentResponseListHeader } from './StudentResponseListHeader';\n\nimport styles from './student-response-list.scss';\n\nfunction getInteractionsToMark(\n interactions: Interaction[],\n studentResults: StudentResults\n): Interaction[] {\n return interactions.filter(i => {\n return InteractiveCorrectnessHelper.isInteractionCorrect(\n i,\n getStudentResult(studentResults)\n ) === InteractionCorrectness.AwaitingMarking;\n });\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nfunction useScrollSelectedInteractionIntoView(): React.MutableRefObject<HTMLLIElement> {\n const ref = React.useRef<HTMLLIElement>(null);\n const [ scrolled, setScrolled ] = React.useState(false);\n\n // Only scroll once\n React.useEffect(() => {\n if (!ref.current || scrolled)\n return;\n\n setScrolled(true);\n requestAnimationFrame(() => ref.current.scrollIntoView({ behavior: 'smooth', block: 'center' }));\n }, [ ref.current, scrolled ]);\n\n return ref;\n}\n\ninterface StudentResponseListProps {\n interactive: Interactive;\n markedAnswers: MarkedAnswerHash;\n studentResults: StudentResults;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n onClickClose: () => void;\n imageCdnUrl: string;\n selectedInteractionId?: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n isDemo?: boolean;\n anonSessions?: AnonSessions;\n}\n\nexport function StudentResponseList(props: StudentResponseListProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n const selectedInteractionRef = useScrollSelectedInteractionIntoView();\n\n const summary = getStudentResultsSummary(props.interactive, props.studentResults);\n const interactions = getInteractions(props.interactive);\n const questionsToMark = getInteractionsToMark(interactions, props.studentResults);\n\n function onClickSubmit(): void {\n setShowSpinner(true);\n props.submitMarkedAnswers();\n }\n\n return (\n <>\n <StudentResponseListHeader\n summary={summary}\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n <ul className='list-unstyled'>\n {interactions.map((interaction, idx) => {\n const isSelected = interaction.id.toString() === props.selectedInteractionId?.toString();\n const markingRequired = questionsToMark.some(q => q.id === interaction.id);\n const anonymisedUserName = anonymiseUserName(\n getUserOrAnonSession(props.studentResults, props.anonSessions),\n props.anonymiseUsers\n );\n\n let className = 'p-2 mb-3 rounded';\n\n if (isSelected)\n className += ' border-2 border-info shadow';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n else\n className += ' border';\n\n return (\n <li key={idx} className={className} ref={isSelected ? selectedInteractionRef : null}>\n <div className='d-flex mb-2'>\n <InteractionLabel\n interaction={interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n className='bg-light ps-2'\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={interaction}\n studentResults={props.studentResults}\n markedStatus={getMarkedStatus(interaction.id, props.studentResults, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymisedUserName={anonymisedUserName}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n <StudentResponseListFooter\n interactionsToMark={questionsToMark}\n markedAnswers={props.markedAnswers}\n onClickSubmit={onClickSubmit}\n onClickClose={props.onClickClose}\n showSubmitButtonSpinner={showSpinner}\n isDemo={props.isDemo}\n />\n </>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { Flight } from 'libs/common/react/index';\n\nexport const InsightsDemoRequests = {\n interactive(): Flight.Request {\n return {\n url: `/mocks/insights/interactive.json`,\n key: `demo:interactive`,\n normalize: false\n };\n },\n\n interactiveMetadata(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-metadata.json`,\n key: `demo:interactive:metadata`,\n normalize: false\n };\n },\n\n interactiveResults(): Flight.Request {\n return {\n url: `/mocks/insights/interactive-results.json`,\n key: `demo:interactive:results`,\n normalize: false\n };\n },\n\n videoViews(): Flight.Request {\n return {\n url: `/mocks/insights/video-views.json`,\n key: `demo:video:views`,\n normalize: false\n };\n },\n\n users(): Flight.Request {\n return {\n url: `/mocks/insights/users.json`,\n key: `demo:users`,\n normalize: false\n };\n },\n\n individualHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/individual-heatmap.json`,\n key: `demo:individual:heatmap`,\n normalize: false\n };\n },\n\n aggregateHeatmap(): Flight.Request {\n return {\n url: `/mocks/insights/aggregate-heatmap.json`,\n key: `demo:aggregate:heatmap`,\n normalize: false\n };\n }\n};","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { useAnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName, getUserOrAnonSession } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { StudentResponseList } from 'libs/shared/apps/student-response-list/StudentResponseList';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InsightsDemoRequests } from 'libs/shared/flight-requests/InsightsDemoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet, ShareLink } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.interactiveStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n userId: string;\n interactiveId: string;\n interactionId?: string;\n reportsStyling?: boolean;\n sessionId?: string;\n}\n\nexport function InteractiveStudentResultsDemoView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InsightsDemoRequests.interactiveMetadata()\n );\n const interactive = Flight.useBasicFetch<Interactive>(InsightsDemoRequests.interactive());\n\n const results = Flight.useBasicFetch<InteractiveResultSet>(InsightsDemoRequests.interactiveResults());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const shareLink = Flight.useBasicFetch<ShareLink>(ShareRequests.getShareLinkByObjectId(props.interactiveId));\n\n const anonSessions = useAnonSessions(shareLink.data?.id);\n\n useHandleObjectError([ interactiveMetadata, results ]);\n useCannotConsumeError(interactiveMetadata);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n props.closePopup\n );\n\n const studentResults = results.data?.students.find(s => {\n if (props.userId)\n return s.user?.id?.toString() === props.userId?.toString();\n\n if (props.sessionId)\n return s.sessionId?.toString() === props.sessionId?.toString();\n\n return false;\n });\n\n const popupTitle = studentResults\n ? getPhrase('heading', { studentName: anonymiseUserName(getUserOrAnonSession(studentResults, anonSessions), anonymiseUsers) })\n : '';\n const dataLoaded = !!interactive.data && !!results.data && !!config.data;\n\n return (\n <Popup\n title={popupTitle}\n showLoadingSpinner={!dataLoaded}\n closePopup={props.closePopup}\n size='lg'\n >\n {dataLoaded &&\n <StudentResponseList\n interactive={interactive.data}\n studentResults={studentResults}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={submitMarkedAnswers}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n onClickClose={props.closePopup}\n anonymiseUsers={anonymiseUsers}\n reportsStyling={props.reportsStyling}\n isDemo\n />\n }\n </Popup>\n );\n}"],"names":["useAnonSessions","shareId","anonSessions","data","length","reduce","prev","current","sessionId","getPhrase","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","Object","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","id","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","Math","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","requestAnimationFrame","scrollIntoView","behavior","block","interactive","studentResults","interactions","questionsToMark","filter","i","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","anonymiseUsers","key","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","InsightsDemoRequests","url","normalize","interactiveMetadata","interactiveResults","videoViews","users","individualHeatmap","aggregateHeatmap","generateCacheKey","flightObjs","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","InteractiveStudentResultsDemoView","results","config","shareLink","interactiveId","closePopup","students","find","s","userId","user","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6317],{38307:(e,t,a)=>{a.d(t,{c:()=>h,l:()=>g});var n=a(32735),r=a(232),s=a.n(r),i=a(8604),c=a(83345);const l={heatMap:"epapa",legend:"uhH4p"};function o(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 m="shared.engagementHeatMap",u="#f1f1f1",d=s().scale(["#daf07d","#08bd1a"]),v=[0,.01,.25,.5,.75,1];function p(e,t){return e?d(e/t).hex():u}function f(e,t){for(var a=[],n=0;n<e.length;n++){var r=n>0&&e[n-1],s=e[n],i=n<e.length-1&&e[n+1];s===r&&s===i||a.push("".concat(p(s,t)," ").concat(100/e.length*n,"%"))}return"linear-gradient(to right, ".concat(a.join(","),")")}function g(){var e=Math.max.apply(Math,v),t=100/v.length;return n.createElement("div",{className:"d-flex justify-content-between w-100"},n.createElement(c.x,{namespace:m,phrase:"less"}),n.createElement("div",{className:"d-flex mx-1 flex-grow-1 ".concat(l.legend)},v.map((function(a,r){return n.createElement("div",{key:r,style:{width:"".concat(t,"%"),backgroundColor:p(a,e)}})}))),n.createElement(c.x,{namespace:m,phrase:"more"}))}function h(e){var t,a,r,s=(0,i.O)(e.engagement),c=null!==(t=e.max)&&void 0!==t?t:Math.max.apply(Math,function(e){if(Array.isArray(e))return o(e)}(r=s)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var 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)?o(e,t):void 0}}(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}());return n.createElement("div",{className:"border rounded ".concat(l.heatMap," ").concat(null!==(a=e.className)&&void 0!==a?a:""),style:{background:f(s,c)}})}},84621:(e,t,a)=>{a.d(t,{L:()=>i});var n=a(32735),r=a(83914);const s={icon:"sAmpy",count:"faDs4"};function i(e){return n.createElement("section",{className:"d-flex flex-column border rounded p-3 h-100"},n.createElement("div",{className:"d-flex ".concat(e.subtitle?"align-items-top":"align-items-center"," mb-2")},n.createElement("div",{className:"".concat(s.icon," ").concat(e.svgClassName," rounded-circle d-flex justify-content-center align-items-center")},n.createElement(r.x,{svgName:e.svgName,size:r.S.Small})),n.createElement("div",{className:"d-flex flex-column ms-2"},n.createElement("h2",{className:"h6 mb-0"},e.title)),"number"==typeof e.count&&n.createElement("div",{className:"".concat(s.count," d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto")},e.count)),e.children)}},21976:(e,t,a)=>{a.d(t,{x:()=>u});var n=a(32735),r=a(72306),s=a.n(r),i=a(70312),c=a.n(i),l=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){return n.createElement(c(),{highcharts:s(),options:(a=e.chartData,r=m(e.label),i=null===(t=l.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}))});var t,a,r,i}},98551:(e,t,a)=>{a.d(t,{y:()=>m});var n=a(32735),r=a(77640),s=a(15611),i=a(40782),c=a(2606);const l={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:l.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:c.Mk.ExtraSmall})))}))):n.createElement("div",{className:"text-center"},n.createElement("img",{className:"".concat(l.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:()=>p});var n=a(32735),r=a(23481),s=a(84621),i=a(21976),c=a(70072),l=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",v=r.T.encloseNamespace(d);function p(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}(),p=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.")}()),f=Object.keys(r).filter((function(e){return r[e]===p})),g={categories:Object.keys(r),series:[{type:"column",borderRadius:4,dataLabels:{enabled:!0,style:c.d,inside:!1,overflow:"allow",crop:!1},data:Object.keys(r).map((function(e){var t=0!==p&&r[e]===p;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:v("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(l.x,{namespace:d,phrase:"description",options:{smartCount:f.length,device:1===f.length?f[0].toLowerCase():null}}):n.createElement(l.x,{namespace:d,phrase:"notViewed"})),n.createElement("div",{className:"position-relative mt-auto"},n.createElement(i.x,{label:v("device"),chartData:g,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 ")}}}})))}},50916:(e,t,a)=>{a.d(t,{b:()=>v});var n=a(32735),r=a(23481),s=a(38307),i=a(84621),c=a(15611),l=a(83345),o=a(35223);const m={heatMap:"Rfr9N",heatMapTimepointIndicator:"s6JbA",heatMapTimepointIndicatorVisible:"mgjWX"};var u="shared.insightHeatmap",d=r.T.encloseNamespace(u);function v(e){var t=e.engagement.engagementRate>0?Math.round(100*e.engagement.engagementRate):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"},t?n.createElement(l.x,{namespace:u,phrase:"everyoneWatched",options:{engagementRate:t}}):n.createElement(l.x,{namespace:u,phrase:"notWatched"})),!!t&&n.createElement(c.F,{appLink:e.heatmapAppLink,className:"text-info"},n.createElement(l.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"},t||"--","%"),n.createElement("p",{className:"text-center mb-0 font-size-sm"},n.createElement(l.x,{namespace:u,phrase:"amountWatched"})))}},70072:(e,t,a)=>{a.d(t,{d:()=>n});var n={fontSize:"12px",fontFamily:'"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"',fontWeight:"400",color:"#313543"}},26136:(e,t,a)=>{a.d(t,{B2:()=>c,DV:()=>o,jP:()=>l});var n=a(76198),r=a(23481),s=a(64818),i=r.T.encloseNamespace("shared.analyticsUtils");function c(e,t){return e?t?(0,n._8)((a="sessionId"in e?e.sessionName:e.id,r=+"".concat(a).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:r})):"sessionId"in e?e.sessionName:s.l.getFullName(e):"";var a,r}function l(e,t){var a={sessionId:e,sessionName:i("anonymousUser")};return e&&t&&t[e]||a}function o(e,t){return e.user?e.user:l(e.sessionId,t)}},8604:(e,t,a)=>{function n(e){return new Array(Math.ceil(e.videoDuration)).fill(null).map((function(t,a){return e.heatMap[a]||0}))}a.d(t,{O:()=>n})},77640:(e,t,a)=>{a.d(t,{t:()=>v});var n=a(32735),r=a(23481),s=a(26136),i=a(97408),c=a(83914),l=a(76881),o=a(86613),m=a(64818),u=a(26521),d=r.T.encloseNamespace("shared.userRecipientItemMetadata");function v(e){var t,a,r,v,p,f=(r=(t=e).user,v=t.anonymiseUsers,p=t.showDisplayName,"sessionId"in r?{name:(0,s.B2)(r,v),surname:"",avatarUrl:null}:{name:v?(0,s.B2)(r,!0):p?m.l.getDisplayName(r):m.l.getFullName(r),surname:r.surname,avatarUrl:null===(a=r.avatar)||void 0===a?void 0:a.url}),g=f.name,h=f.surname,y=f.avatarUrl;return n.createElement(n.Fragment,null,n.createElement("div",{className:"".concat(u.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block")},n.createElement(i.q,{imageUrl:y,imageCdnUrl:e.imageCdnUrl,initials:m.l.getInitials(g,h),showAnonymousUser:"sessionId"in e.user,anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:c.S.Small})),n.createElement("div",{className:e.detailsClassName},n.createElement("h4",{className:"font-size-normal fw-normal m-0"},g),e.showSubText&&"id"in e.user&&n.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=m.l.getUserType(e),a=m.l.getUserRole(e);if(t===l.Y.Staff)return a===o.i.Admin?d("admin"):d("staff");var n=m.l.getYearGroup(e);return(null==n?void 0:n.name)&&"Learners"!==n.name?n.name:d("student")}(e.user))))}v.defaults={showSubText:!0}},49863:(e,t,a)=>{a.d(t,{m9:()=>b,Ad:()=>x,Kh:()=>E});var n=a(32735),r=a(23481),s=a(75896),i=a(97408),c=a(18995),l=a(12528),o=a(83914),m=a(36532),u=a(4594),d=a(36511),v=a(35223),p=a(64818);const f={avatarContainer:"ByxQa",sm:"EgJ0v",sharedAvatar:"cW0NT"};var g=r.T.encloseNamespace("reportsShare.sharedToAvatarList");function h(e){var t=s.m.countBy(e,"typeId"),a=t[u.E.User],n=t[u.E.Classroom],r=t[u.E.ClassroomGroup];return a&&n&&r?g("classroomsGroupsAndUsers",{userCount:a,classroomCount:n,groupCount:r}):a&&n?g("classroomsAndUsers",{userCount:a,classroomCount:n}):a&&r?g("groupsAndUsers",{userCount:a,groupCount:r}):n&&r?g("classroomsAndGroups",{classroomCount:n,groupCount:r}):a?g("users",{userCount:a}):n?g("classrooms",{classroomCount:n}):r?g("groups",{groupCount:r}):void 0}function y(e){var t,a,r,s,c,g=(null===(t=e.item)||void 0===t?void 0:t.typeId)===u.E.User&&e.item,h=(null===(a=e.item)||void 0===a?void 0:a.typeId)===u.E.Classroom&&e.item,y=(null===(r=e.item)||void 0===r?void 0:r.typeId)===u.E.ClassroomGroup&&e.item,b="d-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100";return n.createElement(n.Fragment,null,!!g&&n.createElement(m.u,{title:"".concat(g.name," ").concat(g.surname),spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement(i.q,{imageUrl:null===(s=g.avatar)||void 0===s?void 0:s.url,imageCdnUrl:e.imageCdnUrl,initials:p.l.getInitials(g.name,g.surname),extraClasses:f.sharedAvatar})),!!h&&n.createElement(m.u,{title:h.name,spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:b},n.createElement(l.f,{svgName:v.vn.Classrooms,svgSize:o.S.Large,variant:"teal"}))),!!y&&n.createElement(m.u,{title:y.name,spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:b},n.createElement(l.f,{svgName:v.vn.Group,variant:(0,d.I)(null===(c=y.metadata)||void 0===c?void 0:c.colour)}))))}function b(e){return n.createElement("div",{className:"".concat(f.avatarContainer," ").concat("sm"===e.avatarSize?f.sm:"")},n.createElement(m.u,{title:g("anonymous"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100"},n.createElement(o.x,{svgName:v.vn.Anonymous,size:"sm"===e.avatarSize?o.S.Small:null})))}function x(e){return n.createElement("div",{className:"".concat(f.avatarContainer," ").concat("sm"===e.avatarSize?f.sm:"")},n.createElement(m.u,{title:e.text||g("sharedLink"),spanHack:!0,spanHackClassName:"bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100 ".concat(e.className||"")},n.createElement(o.x,{svgName:v.vn.Link,size:"sm"===e.avatarSize?o.S.Small:null})))}function E(e){return n.createElement(c.e,Object.assign({},e,{items:e.recipients,avatarItem:y,avatarContainerClassname:"".concat(f.avatarContainer," ").concat("sm"===e.avatarSize?f.sm:""),getHiddenTooltip:h,hasShareLink:e.hasShareLink,shareLinkText:e.shareLinkText}))}E.defaultProps={maxAvatars:5}},65853:(e,t,a)=>{a.d(t,{R:()=>d});var n=a(23481),r=a(110),s=a(4594),i=a(49080),c=a(26361),l=a(35223),o=a(31908);function m(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 u=n.T.encloseNamespace("share.shareLinkInfo"),d={getPrivateIconAndText:function(e){var t=e.entityTypeId,a=e.privacy,n=e.hasStudentExp,r=e.entity,i=e.yearGroups;if(t===s.E.Topic||t===s.E.Series)return{icon:l.vn.VisibleOn,text:u(n?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(a))switch(a.privacy){case"public":return{icon:l.vn.VisibleOn,text:u("publicDescription")};case"protected":return a.overrideRestrictions?{icon:l.vn.VisibleOn,text:u("clickViewOnly")}:{icon:l.vn.Lock,text:d.getRespectRatingText(r,i,n)};case"just_my_customer":return a.overrideRestrictions?{icon:l.vn.Lock,text:u(n?"justMySchoolTeachers":"justMySchoolDescription")}:{icon:l.vn.Lock,text:d.getRespectRatingText(r,i,n)};case"restricted":case"private":return{icon:l.vn.Lock,text:u("privateDescription")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,a=e.isPasswordProtected,n=e.status;if(!t&&!a)return d.getPrivateIconAndText(e);if(!t)return{icon:l.vn.Lock,text:u("password")};var s=r.O.isToday(t),c=r.O.diffBetween(t,new Date,"day");if(!a){var o=s?u("expiryToday"):u("expiry",{days:c});return n===i.F.Expired&&(o=u("expired")),{icon:l.vn.Timer,text:o}}var m=s?u("passwordExpiryToday"):u("passwordExpiry",{days:c});return n===i.F.Expired&&(m=u("passwordExpired")),{icon:l.vn.Lock,text:m}},getRespectRatingText:function(e,t,a){var n;if(!e||!t)return null;if(a)return u("justMySchoolTeachers");if(!o.M.isVideoType(e))return u("collectionRating");var r=c.l.getWeightedRestriction(null===(n=e._restrictions)||void 0===n?void 0:n.value);if(r&&!r.yearGroup)return u("onlyAdmins");var s,i,l,d=o.M.getRating(e),v=function(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=function(e,t){if(e){if("string"==typeof e)return m(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)?m(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){a&&(e=a);var n=0,r=function(){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,i=!0,c=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return i=e.done,e},e:function(e){c=!0,s=e},f:function(){try{i||null==a.return||a.return()}finally{if(c)throw s}}}}(t);try{for(v.s();!(l=v.n()).done;){var p=l.value;(!s||p.value>s.value)&&(s=p),r&&p.value<=r.yearGroup||d&&p.rating.value<d.value||(!i||p.value<i.value)&&(i=p)}}catch(e){v.e(e)}finally{v.f()}return i?1===t.length?u("clickViewOnly"):i.value===s.value?u("maxYearGroup",{yearGroup:s.name}):u("yearGroupRange",{yearGroup:i.name}):u("onlyStaff")}}},18995:(e,t,a)=>{a.d(t,{e:()=>l});var n=a(32735),r=a(23481),s=a(49863),i=a(36532),c=r.T.encloseNamespace("shared.avatarList");function l(e){var t=e.items.length>e.maxAvatars?e.items.slice(0,e.maxAvatars-1):e.items,a=e.items.length>t.length?e.items.slice(e.maxAvatars-1):[],r=e.avatarItem,l=a.length,o="sm"===e.avatarSize?4:8;function m(t){return{transform:"translateX(".concat((e.hasShareLink?t+1:t)*-o,"px)"),zIndex:e.maxAvatars-t}}return 0===t.length&&0===a.length?n.createElement(n.Fragment,null):n.createElement("div",{className:"d-flex",style:{marginRight:"-".concat((t.length-1+(a.length?1:0)+(e.hasShareLink?1:0))*o,"px")}},e.hasShareLink&&n.createElement("div",{style:{zIndex:e.maxAvatars+1}},n.createElement(s.Ad,{text:e.shareLinkText,avatarSize:e.avatarSize,className:"bg-dark text-white"})),t.map((function(t,a){return n.createElement("div",{className:"".concat(e.avatarContainerClassname||""),key:t.id,style:m(a)},n.createElement(r,{item:t,imageCdnUrl:e.imageCdnUrl,index:a,maxAvatars:e.maxAvatars}))})),!!a.length&&n.createElement("div",{className:"".concat(e.avatarContainerClassname||""," bg-white rounded-circle"),style:{transform:"translateX(".concat(t.length*-o,"px)"),zIndex:e.maxAvatars-t.length}},n.createElement(i.u,{title:e.getHiddenTooltip?e.getHiddenTooltip(a):e.roleToDisplay?c("staff"===e.roleToDisplay?"staff":"student",{count:l,smartCount:l}):c("users",{count:l,smartCount:l}),spanHack:!0,spanHackClassName:"h-100 w-100"},n.createElement("div",{className:"d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ".concat(e.numberClassname||"")},"+".concat(a.length)))))}l.defaultProps={maxAvatars:5}},40782:(e,t,a)=>{a.d(t,{I:()=>n,O:()=>l});var n,r=a(32735),s=a(2606),i=a(362);function c(e){var t=r.useCallback((function(t){if(t){var a=t.r.baseVal.value,n=2*Math.PI*a,r=n-e.percentage*n;t.style.strokeDasharray="".concat(n," ").concat(n),t.style.strokeDashoffset=r.toString()}}),[e.percentage]);return r.createElement("svg",null,r.createElement("circle",{r:(0,s.pu)(e.size),className:i.Z.backgroundCircle}),!(0,s.zR)(e.percentage)&&r.createElement("circle",{ref:t,r:(0,s.pu)(e.size),className:(0,s.V4)(e.percentage,e.scoreThresholds)}))}function l(e){var t,a=(0,s.Ki)(e.percentage),l=e.size||(e.layout===n.LabelInside?s.Mk.Large:s.Mk.Small),o=e.customLabel||(0,s.DV)(a);return e.layout===n.LabelOnly?r.createElement("span",{className:(0,s.IA)(a)},o):r.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===n.LabelBefore&&r.createElement("span",{className:"me-2"},o),r.createElement("div",{className:(0,s.tw)(l,a)},r.createElement(c,{percentage:a,size:l,scoreThresholds:e.scoreThresholds}),e.layout===n.LabelInside&&r.createElement("span",{className:i.Z.centredPercentageText},o)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(n||(n={})),l.defaultProps={layout:n.CircleOnly}},2606:(e,t,a)=>{a.d(t,{DV:()=>g,IA:()=>v,Ki:()=>f,Mk:()=>c,V4:()=>d,pu:()=>u,tw:()=>p,zR:()=>h});var n=a(94892),r=a(362);function s(e){return s="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},s(e)}function i(e,t,a){return(t=function(e){var t=function(e){if("object"!=s(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=s(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==s(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var c,l=.2,o=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var m=i(i(i({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function u(e){var t=m[e].size,a=e===c.Large?o:l;return"".concat(t/2-2*a,"rem")}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?r.Z.circleSuccess:e>=t.MODERATE?r.Z.circleWarning:r.Z.circleDanger}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function p(e,t){var a="d-inline-block ".concat(r.Z.circleContainer);return e===c.Large&&(a+=" ".concat(r.Z.lgCircleContainer)),e===c.ExtraSmall&&(a+=" ".concat(r.Z.xsCircleContainer)),h(t)&&(a+=" ".concat(r.Z.pendingCircle)),a}function f(e){if(!h(e))return+e.toFixed(2)}function g(e){return h(e)?"--%":"".concat(Math.round(100*e),"%")}function h(e){return"number"!=typeof e}},94892:(e,t,a)=>{a.d(t,{T:()=>r,i:()=>n});var n={HIGH:.75,MODERATE:.5},r={HIGH:.7,MODERATE:.7}},93322:(e,t,a)=>{a.d(t,{F:()=>s});var n=a(32735),r=a(13126);function s(){n.useEffect((function(){return r.e.lockContentWidth(),function(){return r.e.unlockContentWidth()}}),[])}},53214:(e,t,a)=>{a.d(t,{u:()=>g});var n=a(32735),r=a(91693),s=a(83345),i=a(4594),c=a(35223),l=a(99742),o=a(14070),m=a(97291),u=a(86099),d=a(38279);function v(e){return v="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},v(e)}function p(e,t,a){return(t=function(e){var t=function(e){if("object"!=v(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=v(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==v(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var f="lite.insightsMask";function g(e){return n.createElement("div",{className:"".concat(!e.hasShared&&d.Z.mask," position-relative")},n.createElement("div",{className:e.hasShared?"":"position-absolute"},e.children),n.createElement("div",{className:e.hasShared?"":"".concat(d.Z.backdrop," d-flex flex-column align-items-center justify-content-start py-5")},!e.hasShared&&n.createElement("div",{className:"text-center p-5 m-5 w-50"},n.createElement("img",{className:"mb-3",src:l.W.Insights.SEND_PAPER_PLANE,width:288}),n.createElement("h2",{className:"h3 mb-3"},n.createElement(s.x,{namespace:f,phrase:"shareHeading"})),n.createElement("p",{className:"mb-3"},n.createElement(s.x,{namespace:f,phrase:"shareDescription"})),n.createElement(r.h,{svgName:c.vn.Share,className:"btn btn-dark",appLink:function(){var t;if(e.hasShareFlowV2){var a=p(p(p({},i.E.Video,o.e.Insights.VIDEO_SHARE_OPTIONS),i.E.Clip,o.e.Insights.CLIP_SHARE_OPTIONS),i.E.Interactive,o.e.Insights.INTERACTIVE_SHARE_OPTIONS);return{application:m.O.INSIGHTS,action:a[e.video.typeId],args:[null===(t=e.video)||void 0===t?void 0:t.id],params:{shareId:e.shareId}}}return(0,u.YK)(e.video)}()},n.createElement(s.x,{namespace:f,phrase:"share"})))))}},24758:(e,t,a)=>{a.d(t,{A:()=>c});var n=a(32735),r=a(49863),s=a(83345),i="myShares.sharedToPill";function c(e){var t=e.shareRecipients;return n.createElement("div",{className:"d-flex align-items-center bg-gray-100 rounded-pill w-fit gap-2 p-2"},n.createElement("span",{className:"text-nowrap"},n.createElement(s.x,{namespace:i,phrase:t?"sharedTo":"sharedVia"})),!t&&n.createElement(r.Ad,{text:e.shareLinkText,avatarSize:"sm",className:"bg-dark text-white"}),t&&!(null==t?void 0:t.length)&&n.createElement(r.m9,{avatarSize:"sm"}),t&&n.createElement(r.Kh,{recipients:t,imageCdnUrl:e.imageCdnUrl,maxAvatars:e.maxAvatars,avatarSize:"sm",hasShareLink:e.hasShareLink,shareLinkText:e.shareLinkText}))}c.defaultProps={maxAvatars:3}},26521:(e,t,a)=>{a.d(t,{Z:()=>n});const n={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}},362:(e,t,a)=>{a.d(t,{Z:()=>n});const n={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}},38279:(e,t,a)=>{a.d(t,{Z:()=>n});const n={mask:"VRTes",backdrop:"XzVXl"}},82602:(e,t,a)=>{a.d(t,{WU:()=>o});var n=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],s={},i=function(e,t){s[e]=t},c=[60,60,24,7,365/7/12,12];function l(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var o=function(e,t,a){var n=function(e,t){return(+(t?l(t):new Date)-+l(e))/1e3}(e,a&&a.relativeDate);return function(e,t){for(var a=e<0?1:0,n=e=Math.abs(e),r=0;e>=c[r]&&r<c.length;r++)e/=c[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,n)[a].replace("%s",e.toString())}(n,function(e){return s[e]||s.en_US}(t))};i("en_US",(function(e,t){if(0===t)return["just now","right now"];var a=n[Math.floor(t/2)];return e>1&&(a+="s"),[e+" "+a+" ago","in "+e+" "+a]})),i("zh_CN",(function(e,t){if(0===t)return["刚刚","片刻后"];var a=r[~~(t/2)];return[e+" "+a+"前",e+" "+a+"后"]}))}}]);
2
- //# sourceMappingURL=6317-49be898c73-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/6317-49be898c73-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/engagement-heat-map.scss","file:///app/packages/libs/shared/src/apps/analytics/components/engagement-heat-map/EngagementHeatMap.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/insight-card.scss","file:///app/packages/libs/shared/src/apps/analytics/components/insight-card/InsightCard.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insight-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/libs/shared/src/apps/analytics/constants/ChartStyles.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/EngagementUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/shared-to-avatar-list.scss","file:///app/packages/libs/shared/src/apps/share/components/shared-to-avatar-list/SharedToAvatarList.tsx","file:///app/packages/libs/shared/src/apps/share/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/components/avatar-list/AvatarList.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicator.tsx","file:///app/packages/libs/shared/src/components/percentage-indicator/PercentageIndicatorUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/hooks/useLockContentWidth.ts","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/InsightsShareMask.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/shared-to-pill/SharedToPill.tsx","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss","file:///app/packages/libs/shared/src/components/percentage-indicator/percentage-indicator.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/insights-mask/insights-mask.scss","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"heatMap\":\"epapa\",\"legend\":\"uhH4p\"};","import React from 'react';\nimport chroma from 'chroma-js';\n\nimport { getFullHeatMap } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Engagement } from 'libs/shared/interfaces';\n\nimport styles from './engagement-heat-map.scss';\n\nconst namespace = 'shared.engagementHeatMap';\n\nconst ZERO_COLOUR = '#f1f1f1';\nconst MIN_COLOUR = '#daf07d';\nconst MAX_COLOUR = '#08bd1a';\n\nconst COLOUR_SCALE = chroma.scale([ MIN_COLOUR, MAX_COLOUR ]);\n\nconst LEGEND_VALUES = [ 0, 0.01, 0.25, 0.5, 0.75, 1 ];\n\nfunction getBackgroundColor(value: number, max: number): string {\n if (!value)\n return ZERO_COLOUR;\n\n return COLOUR_SCALE(value / max).hex();\n}\n\nfunction getGradient(data: number[], max: number): string {\n const gradient: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const previousValue = i > 0 && data[i - 1];\n const currentValue = data[i];\n const nextValue = i < data.length - 1 && data[i + 1];\n\n /**\n * We want to capture colour changes but if a value has the same value\n * of both of its neighbours, we can skip it.\n */\n if (currentValue === previousValue && currentValue === nextValue)\n continue;\n\n gradient.push(`${getBackgroundColor(currentValue, max)} ${100 / data.length * i}%`);\n }\n\n return `linear-gradient(to right, ${gradient.join(',')})`;\n}\n\nexport function EngagementHeatMapLegend(): JSX.Element {\n const max = Math.max(...LEGEND_VALUES);\n const legendSquareWidthPercentage = 100 / LEGEND_VALUES.length;\n\n return (\n <div className='d-flex justify-content-between w-100'>\n <Text namespace={namespace} phrase='less' />\n <div className={`d-flex mx-1 flex-grow-1 ${styles.legend}`}>\n {LEGEND_VALUES.map((val, idx) => (\n <div\n key={idx}\n style={{\n width: `${legendSquareWidthPercentage}%`,\n backgroundColor: getBackgroundColor(val, max)\n }}\n />\n ))}\n </div>\n <Text namespace={namespace} phrase='more' />\n </div>\n );\n}\n\ninterface EngagementHeatMapProps {\n engagement: Engagement;\n max?: number;\n className?: string;\n}\n\nexport function EngagementHeatMap(props: EngagementHeatMapProps): JSX.Element {\n const heatMap = getFullHeatMap(props.engagement);\n const max = props.max ?? Math.max(...heatMap);\n\n return (\n <div\n className={`border rounded ${styles.heatMap} ${props.className ?? ''}`}\n style={{\n background: getGradient(heatMap, max)\n }}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"sAmpy\",\"count\":\"faDs4\"};","import React from 'react';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './insight-card.scss';\n\ninterface InsightCardProps extends React.PropsWithChildren {\n svgName: string;\n svgClassName: string;\n title: string;\n subtitle?: string;\n count?: number;\n}\n\nexport function InsightCard(props: InsightCardProps) {\n return (\n <section className='d-flex flex-column border rounded p-3 h-100'>\n <div className={`d-flex ${props.subtitle ? 'align-items-top' : 'align-items-center'} mb-2`}>\n <div className={`${styles.icon} ${props.svgClassName} rounded-circle d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={props.svgName} size={SvgContainerSize.Small} />\n </div>\n <div className='d-flex flex-column ms-2'>\n <h2 className='h6 mb-0'>{props.title}</h2>\n </div>\n {typeof props.count === 'number' && (\n <div className={`${styles.count} d-flex justify-content-center align-items-center bg-light rounded-circle ms-auto`}>\n {props.count}\n </div>\n )}\n </div>\n {props.children}\n </section>\n );\n}","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}\n\nexport function InsightChart(props: InsightChartProps) {\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 <HighchartsReact\n highcharts={Highcharts}\n options={getChartOptions()}\n />\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 { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\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';\n\nimport styles from './insight-student-list.scss';\n\ntype UserPercentage = UserOrAnonSession & {\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 label={getPhrase('device')} chartData={chartData} xAxis={getXAxisLabelIcons()} />\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}\n\nexport function InsightHeatmap(props: InsightHeatmapProps) {\n const engagementRate = props.engagement.engagementRate > 0 ? Math.round(props.engagement.engagementRate * 100) : null;\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Timer}\n svgClassName='bg-light-green text-green'\n >\n <div className='mb-2'>\n <p className='mb-0'>\n {engagementRate\n ? (\n <Text namespace={namespace} phrase='everyoneWatched' options={{ engagementRate }} />\n )\n : <Text namespace={namespace} phrase='notWatched' />\n }\n </p>\n {!!engagementRate &&\n <AppLink appLink={props.heatmapAppLink} className='text-info'>\n <Text namespace={namespace} phrase='viewHeatmap' />\n </AppLink>\n }\n </div>\n\n <div className='mb-2'>\n <EngagementHeatMap\n engagement={props.engagement}\n className={styles.heatMap}\n />\n </div>\n\n <p className='h3 text-center mb-2'>{engagementRate || '--'}%</p>\n <p className='text-center mb-0 font-size-sm'><Text namespace={namespace} phrase='amountWatched' /></p>\n </InsightCard>\n );\n}","export const CHART_FONT_STYLES = {\n fontSize: '12px',\n fontFamily: `\"Inter\",-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",\"Liberation Sans\",sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"`,\n fontWeight: '400',\n color: '#313543'\n};","import { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonSession, AnonSessions } from 'libs/shared/apps/analytics/hooks/UseAnonSessions';\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { StudentResults } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getUniqueNamesConfig(id: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${id}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: UserOrAnonSession, shouldAnonymise: boolean): string {\n if (!user)\n return '';\n\n if (!shouldAnonymise)\n return 'sessionId' in user ? user.sessionName : UserHelper.getFullName(user);\n\n return uniqueNamesGenerator(getUniqueNamesConfig('sessionId' in user ? user.sessionName : user.id));\n}\n\nexport function getAnonSession(sessionId: string, anonSessions: AnonSessions): AnonSession {\n const fallback = {\n sessionId: sessionId,\n sessionName: getPhrase('anonymousUser')\n };\n\n if (!sessionId || !anonSessions)\n return fallback;\n\n const anonSession = anonSessions[sessionId];\n\n if (anonSession)\n return anonSession;\n\n return fallback;\n}\n\nexport function getUserOrAnonSession(result: StudentResults, anonSessions: AnonSessions): UserOrAnonSession {\n if (result.user)\n return result.user;\n\n return getAnonSession(result.sessionId, anonSessions);\n}\n","import { Engagement } from 'libs/shared/interfaces';\n\n/**\n * The heat map in the API response won't contain trailing zeros so we need to add those\n * in manually.\n */\nexport function getFullHeatMap(engagement: Engagement): number[] {\n return (new Array(Math.ceil(engagement.videoDuration))).fill(null).map((t, idx) => engagement.heatMap[idx] || 0);\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserOrAnonSession } from 'libs/shared/apps/analytics/interfaces/UserOrAnonSession';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n \n /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: UserOrAnonSession,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if ('sessionId' in user) {\n return {\n name: anonymiseUserName(user, anonymiseUsers),\n surname: '',\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: UserOrAnonSession;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={'sessionId' in props.user}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className='font-size-normal fw-normal m-0'>\n {name}\n </h4>\n {props.showSubText && 'id' in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"ByxQa\",\"sm\":\"EgJ0v\",\"sharedAvatar\":\"cW0NT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { AvatarItemProps, AvatarList } from 'libs/shared/components/avatar-list/AvatarList';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { BaseObject, Classroom, ClassroomGroup, User } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './shared-to-avatar-list.scss';\n\nconst namespace = 'reportsShare.sharedToAvatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getHiddenRecipientText(hiddenRecipients: BaseObject[]): string {\n const counts = ArrayHelper.countBy(hiddenRecipients, 'typeId');\n const userCount = counts[MasterType.User];\n const classroomCount = counts[MasterType.Classroom];\n const groupCount = counts[MasterType.ClassroomGroup];\n\n if (userCount && classroomCount && groupCount)\n return getPhrase('classroomsGroupsAndUsers', { userCount, classroomCount, groupCount });\n\n if (userCount && classroomCount)\n return getPhrase('classroomsAndUsers', { userCount, classroomCount });\n\n if (userCount && groupCount)\n return getPhrase('groupsAndUsers', { userCount, groupCount });\n\n if (classroomCount && groupCount)\n return getPhrase('classroomsAndGroups', { classroomCount, groupCount });\n\n if (userCount)\n return getPhrase('users', { userCount });\n\n if (classroomCount)\n return getPhrase('classrooms', { classroomCount });\n\n if (groupCount)\n return getPhrase('groups', { groupCount });\n}\n\nfunction SharedToAvatar(props: AvatarItemProps): JSX.Element {\n const user: User = props.item?.typeId === MasterType.User && props.item as User;\n const classroom: Classroom = props.item?.typeId === MasterType.Classroom && props.item as Classroom;\n const classroomGroup: ClassroomGroup = props.item?.typeId === MasterType.ClassroomGroup\n && props.item as ClassroomGroup;\n\n const svgContainerClassName = 'd-flex justify-content-center align-items-center text-white rounded-circle h-100 w-100';\n\n return (\n <>\n {!!user &&\n <Tooltip title={`${user.name} ${user.surname}`} spanHack spanHackClassName='h-100 w-100'>\n <Avatar\n imageUrl={user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(user.name, user.surname)}\n extraClasses={styles.sharedAvatar}\n />\n </Tooltip>\n }\n {!!classroom &&\n <Tooltip title={classroom.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Large}\n variant='teal'\n />\n </div>\n </Tooltip>\n }\n {!!classroomGroup &&\n <Tooltip title={classroomGroup.name} spanHack spanHackClassName='h-100 w-100'>\n <div className={svgContainerClassName}>\n <IconCircle\n svgName={cvSvgLibrary.Group}\n variant={mapColourToBsVariant(classroomGroup.metadata?.colour)}\n />\n </div>\n </Tooltip>\n }\n </>\n );\n}\n\n\ninterface AnonymousSharedToAvatarProps {\n avatarSize?: 'md' | 'sm';\n}\n\nexport function AnonymousSharedToAvatar(props: AnonymousSharedToAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={getPhrase('anonymous')}\n spanHack\n spanHackClassName='bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100'\n >\n <SvgContainer svgName={cvSvgLibrary.Anonymous} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedLinkAvatarProps {\n text?: string;\n avatarSize?: 'md' | 'sm';\n className?: string;\n}\n\nexport function SharedLinkAvatar(props: SharedLinkAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}>\n <Tooltip\n title={props.text || getPhrase('sharedLink')}\n spanHack\n spanHackClassName={`bg-light text-dark d-flex justify-content-center align-items-center rounded-circle h-100 w-100 ${props.className || ''}`}\n >\n <SvgContainer svgName={cvSvgLibrary.Link} size={props.avatarSize === 'sm' ? SvgContainerSize.Small : null} />\n </Tooltip>\n </div>\n );\n}\n\ninterface SharedToAvatarListProps {\n recipients: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nSharedToAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function SharedToAvatarList(props: SharedToAvatarListProps): JSX.Element {\n return (\n <AvatarList\n {...props}\n items={props.recipients}\n avatarItem={SharedToAvatar}\n avatarContainerClassname={`${styles.avatarContainer} ${props.avatarSize === 'sm' ? styles.sm : ''}`}\n getHiddenTooltip={getHiddenRecipientText}\n hasShareLink={props.hasShareLink}\n shareLinkText={props.shareLinkText}\n />\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacyResponse } from 'libs/shared/apps/share/interfaces/responses/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'share.shareLinkInfo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacyResponse;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy.privacy) {\n case 'public':\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case 'protected':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case 'just_my_customer':\n if (privacy.overrideRestrictions)\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n /**\n * Because we plan to add restricted management later \n * for the time being we treat is the same as private \n */\n case 'restricted':\n case 'private':\n return { icon: cvSvgLibrary.Lock, text: getPhrase('privateDescription') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharedLinkAvatar } from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.avatarList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface AvatarItemProps {\n imageCdnUrl: string;\n index: number;\n item?: BaseObject;\n hiddenItems?: BaseObject[];\n maxAvatars?: number;\n}\n\ninterface AvatarListProps {\n items: BaseObject[];\n imageCdnUrl: string;\n maxAvatars?: number;\n avatarItem?: (props: AvatarItemProps) => JSX.Element;\n getHiddenTooltip?: (hiddenItems: BaseObject[]) => string;\n numberClassname?: string;\n avatarContainerClassname?: string;\n roleToDisplay?: 'student' | 'staff';\n hasShareLink?: boolean;\n avatarSize?: 'md' | 'sm';\n shareLinkText?: string;\n}\n\nAvatarList.defaultProps = {\n maxAvatars: 5\n};\n\nexport function AvatarList(props: AvatarListProps): JSX.Element {\n const itemsToDisplay = props.items.length > props.maxAvatars\n ? props.items.slice(0, props.maxAvatars - 1)\n : props.items;\n\n const hiddenItems = props.items.length > itemsToDisplay.length\n ? props.items.slice(props.maxAvatars - 1)\n : [];\n\n const AvatarItem = props.avatarItem;\n const hiddenItemsCounts = hiddenItems.length;\n const translateX = props.avatarSize === 'sm' ? 4 : 8;\n\n function getTooltip() {\n if (props.getHiddenTooltip)\n return props.getHiddenTooltip(hiddenItems);\n\n if (props.roleToDisplay)\n return getPhrase(props.roleToDisplay === 'staff' ? 'staff' : 'student', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n\n return getPhrase('users', { count: hiddenItemsCounts, smartCount: hiddenItemsCounts });\n }\n\n function getContainerStyles() {\n return {\n marginRight: `-${((itemsToDisplay.length - 1) + (hiddenItems.length ? 1 : 0) + (props.hasShareLink ? 1 : 0)) * translateX}px`\n };\n }\n\n function getAvatarStyles(idx: number) {\n return {\n transform: `translateX(${(props.hasShareLink ? idx + 1 : idx) * -translateX}px)`,\n zIndex: props.maxAvatars - idx\n };\n }\n\n if (itemsToDisplay.length === 0 && hiddenItems.length === 0)\n return <></>;\n\n return (\n <div\n className='d-flex'\n style={getContainerStyles()}\n >\n {props.hasShareLink && (\n <div style={{ zIndex: props.maxAvatars + 1 }}>\n <SharedLinkAvatar text={props.shareLinkText} avatarSize={props.avatarSize} className='bg-dark text-white' />\n </div>\n )}\n {itemsToDisplay.map((item, idx) => (\n <div\n className={`${props.avatarContainerClassname || ''}`} key={item.id}\n style={getAvatarStyles(idx)}\n >\n <AvatarItem\n item={item}\n imageCdnUrl={props.imageCdnUrl}\n index={idx}\n maxAvatars={props.maxAvatars}\n />\n </div>\n ))}\n\n {!!hiddenItems.length && (\n <div\n className={`${props.avatarContainerClassname || ''} bg-white rounded-circle`}\n style={{ transform: `translateX(${itemsToDisplay.length * -translateX}px)`, zIndex: props.maxAvatars - itemsToDisplay.length }}\n >\n <Tooltip title={getTooltip()} spanHack spanHackClassName='h-100 w-100'>\n <div className={`d-flex justify-content-center align-items-center border border-dark rounded-circle h-100 w-100 ${props.numberClassname || ''}`}>\n {`+${hiddenItems.length}`}\n </div>\n </Tooltip>\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport {\n getCircleClassName,\n getCircleContainerClassName,\n getCircleRadius,\n getColouredLabelClassName,\n getFormattedPercentage,\n getPercentageToFixed,\n isPending,\n ProgressCircleSize\n} from './PercentageIndicatorUtils';\n\nimport styles from './percentage-indicator.scss';\n\ninterface ProgressCircleProps {\n size: ProgressCircleSize;\n scoreThresholds?: ScoreThresholds;\n percentage?: number;\n}\n\nfunction ProgressCircle(props: ProgressCircleProps): JSX.Element {\n const ref = React.useCallback((circle: SVGCircleElement) => {\n if (!circle)\n return;\n\n const radius = circle.r.baseVal.value;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - props.percentage * circumference;\n\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n circle.style.strokeDashoffset = offset.toString();\n }, [props.percentage]);\n\n return (\n <svg>\n <circle r={getCircleRadius(props.size)} className={styles.backgroundCircle} />\n {!isPending(props.percentage) &&\n <circle\n ref={ref}\n r={getCircleRadius(props.size)}\n className={getCircleClassName(props.percentage, props.scoreThresholds)}\n />\n }\n </svg>\n );\n}\n\nexport enum PercentageIndicatorLayout {\n CircleOnly = 'circle_only',\n LabelOnly = 'label_only',\n LabelBefore = 'label_before',\n LabelInside = 'label_inside'\n}\n\ninterface PercentageIndicatorProps {\n layout: PercentageIndicatorLayout;\n percentage?: number; // Between 0 and 1 or undefined for pending\n className?: string;\n customLabel?: string;\n scoreThresholds?: ScoreThresholds;\n size?: ProgressCircleSize;\n}\n\nPercentageIndicator.defaultProps = {\n layout: PercentageIndicatorLayout.CircleOnly\n};\n\nexport function PercentageIndicator(props: PercentageIndicatorProps): JSX.Element {\n const percentageToFixed = getPercentageToFixed(props.percentage);\n\n const size = props.size ||\n (props.layout === PercentageIndicatorLayout.LabelInside\n ? ProgressCircleSize.Large\n : ProgressCircleSize.Small\n );\n\n const label = props.customLabel || getFormattedPercentage(percentageToFixed);\n\n if (props.layout === PercentageIndicatorLayout.LabelOnly)\n return (\n <span className={getColouredLabelClassName(percentageToFixed)}>\n {label}\n </span>\n );\n\n return (\n <div className={`d-flex align-items-center justify-content-between ${props.className ?? ''}`}>\n {props.layout === PercentageIndicatorLayout.LabelBefore &&\n <span className='me-2'>\n {label}\n </span>\n }\n <div className={getCircleContainerClassName(size, percentageToFixed)}>\n <ProgressCircle percentage={percentageToFixed} size={size} scoreThresholds={props.scoreThresholds} />\n {props.layout === PercentageIndicatorLayout.LabelInside &&\n <span className={styles.centredPercentageText}>\n {label}\n </span>\n }\n </div>\n </div>\n );\n}","import { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\n\nimport styles from './percentage-indicator.scss';\n\n/**\n * Values for width and strokeWidth are taken from progress-circle.scss.\n * If either are changed, they must be updated in both places.\n */\nconst CIRCLE_WIDTH = 2; // rem\nconst CIRCLE_WIDTH_LG = 5.8; // rem\nconst CIRCLE_STROKE_WIDTH = 0.2; // rem\nconst CIRCLE_STROKE_WIDTH_LG = 0.36; // rem\n \nexport enum ProgressCircleSize {\n Small = 'small',\n Large = 'large',\n ExtraSmall = 'extraSmall'\n}\n\nconst ProgressCircleSizeMap = {\n [ProgressCircleSize.ExtraSmall]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Small]: {\n size: CIRCLE_WIDTH\n },\n [ProgressCircleSize.Large]: {\n size: CIRCLE_WIDTH_LG\n }\n};\n\n/**\n * radius = width / 2 - strokeWidth * 2\n */\nexport function getCircleRadius(size: ProgressCircleSize): string {\n const width = ProgressCircleSizeMap[size].size;\n const strokeWidth = size === ProgressCircleSize.Large ? CIRCLE_STROKE_WIDTH_LG : CIRCLE_STROKE_WIDTH;\n return `${width / 2 - strokeWidth * 2}rem`;\n}\n \nexport function getCircleClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return styles.circleSuccess;\n \n if (percentage >= scoreThresholds.MODERATE)\n return styles.circleWarning;\n \n return styles.circleDanger;\n}\n \nexport function getColouredLabelClassName(\n percentage: number,\n scoreThresholds: ScoreThresholds = ScoreThresholdDefaults\n): string {\n if (percentage >= scoreThresholds.HIGH)\n return 'text-success';\n \n if (percentage >= scoreThresholds.MODERATE)\n return 'text-warning';\n \n return 'text-danger';\n}\n \nexport function getCircleContainerClassName(size: ProgressCircleSize, percentage?: number): string {\n let className = `d-inline-block ${styles.circleContainer}`;\n \n if (size === ProgressCircleSize.Large)\n className += ` ${styles.lgCircleContainer}`;\n\n if (size === ProgressCircleSize.ExtraSmall)\n className += ` ${styles.xsCircleContainer}`;\n\n if (isPending(percentage))\n className += ` ${styles.pendingCircle}`;\n \n return className;\n}\n\nexport function getPercentageToFixed(percentage?: number): number | undefined {\n if (isPending(percentage))\n return;\n \n return +percentage.toFixed(2);\n}\n \nexport function getFormattedPercentage(percentage?: number): string {\n if (isPending(percentage))\n return `--%`;\n\n return `${Math.round(percentage * 100)}%`;\n}\n\nexport function isPending(percentage?: number): boolean {\n return typeof percentage !== 'number';\n}","export interface ScoreThresholds {\n HIGH: number;\n MODERATE: number;\n}\n\nexport const ScoreThresholdDefaults: ScoreThresholds = {\n HIGH: 0.75,\n MODERATE: 0.5\n};\n\nexport const ScoreThresholdInsights: ScoreThresholds = {\n HIGH: 0.7,\n MODERATE: 0.7\n};","import React from 'react';\n\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\n\nexport function useLockContentWidth(): void {\n React.useEffect(() => {\n LayoutHelper.lockContentWidth();\n return () => LayoutHelper.unlockContentWidth();\n }, []);\n}","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getShareAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport styles from './insights-mask.scss';\n\nconst namespace = 'lite.insightsMask';\n\ninterface InsightsShareMaskProps extends React.PropsWithChildren {\n hasShared: boolean;\n video: VideoTypes;\n hasShareFlowV2?: boolean;\n shareId?: string;\n}\n\nexport function InsightsShareMask(props: InsightsShareMaskProps) {\n function buildAppLink() {\n if (props.hasShareFlowV2) {\n const actions: Partial<Record<MasterType, string>> = {\n [MasterType.Video]: Actions.Insights.VIDEO_SHARE_OPTIONS,\n [MasterType.Clip]: Actions.Insights.CLIP_SHARE_OPTIONS,\n [MasterType.Interactive]: Actions.Insights.INTERACTIVE_SHARE_OPTIONS\n };\n \n return {\n application: AppChannels.INSIGHTS,\n action: actions[props.video.typeId],\n args: [props.video?.id],\n params: {\n shareId: props.shareId\n }\n };\n }\n\n return getShareAppLink(props.video);\n }\n\n return (\n <div className={`${!props.hasShared && styles.mask} position-relative`}>\n <div className={!props.hasShared ? 'position-absolute' : ''}>{props.children}</div>\n <div\n className={!props.hasShared ? `${styles.backdrop} d-flex flex-column align-items-center justify-content-start py-5` : ''}\n >\n {!props.hasShared && (\n <div className='text-center p-5 m-5 w-50'>\n <img className='mb-3' src={ImageUrls.Insights.SEND_PAPER_PLANE} width={288} />\n <h2 className='h3 mb-3'><Text namespace={namespace} phrase='shareHeading' /></h2>\n <p className='mb-3'><Text namespace={namespace} phrase='shareDescription' /></p>\n <IconButton svgName={cvSvgLibrary.Share} className='btn btn-dark' appLink={buildAppLink()}>\n <Text namespace={namespace} phrase='share' />\n </IconButton>\n </div>\n )}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { AnonymousSharedToAvatar, SharedLinkAvatar, SharedToAvatarList } from 'libs/shared/apps/share/components/shared-to-avatar-list/SharedToAvatarList';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst namespace = 'myShares.sharedToPill';\n\ninterface SharedToPillProps {\n shareRecipients: BaseObject[];\n hasShareLink?: boolean;\n maxAvatars?: number;\n imageCdnUrl: string;\n shareLinkText?: string;\n}\n\nSharedToPill.defaultProps = {\n maxAvatars: 3\n};\n\nexport function SharedToPill(props: SharedToPillProps) {\n const { shareRecipients } = props;\n\n return (\n <div className='d-flex align-items-center bg-gray-100 rounded-pill w-fit gap-2 p-2'>\n <span className='text-nowrap'><Text namespace={namespace} phrase={!shareRecipients ? 'sharedVia' : 'sharedTo'} /></span>\n\n {!shareRecipients &&\n <SharedLinkAvatar text={props.shareLinkText} avatarSize='sm' className='bg-dark text-white' />\n }\n\n {shareRecipients && !shareRecipients?.length &&\n <AnonymousSharedToAvatar avatarSize='sm' />\n }\n\n {shareRecipients &&\n <SharedToAvatarList\n recipients={shareRecipients}\n imageCdnUrl={props.imageCdnUrl}\n maxAvatars={props.maxAvatars}\n avatarSize='sm'\n hasShareLink={props.hasShareLink}\n shareLinkText={props.shareLinkText}\n />\n }\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};","// extracted by mini-css-extract-plugin\nexport default {\"circleContainer\":\"p8Vgz\",\"backgroundCircle\":\"asGGE\",\"circleSuccess\":\"PXLNj\",\"circleWarning\":\"ZckRN\",\"circleDanger\":\"slBRg\",\"lgCircleContainer\":\"N8KCI\",\"xsCircleContainer\":\"RPqZ2\",\"pendingCircle\":\"DKrcq\",\"centredPercentageText\":\"tpmLR\"};","// extracted by mini-css-extract-plugin\nexport default {\"mask\":\"VRTes\",\"backdrop\":\"XzVXl\"};","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["namespace","ZERO_COLOUR","COLOUR_SCALE","LEGEND_VALUES","getBackgroundColor","value","max","hex","getGradient","data","gradient","i","length","previousValue","currentValue","nextValue","push","join","EngagementHeatMapLegend","Math","legendSquareWidthPercentage","className","Text","phrase","map","val","idx","key","style","width","backgroundColor","EngagementHeatMap","props","heatMap","engagement","background","InsightCard","subtitle","svgClassName","SvgContainer","svgName","size","S","title","count","children","getStaticChartOptions","label","text","credits","enabled","yAxis","labels","gridLineWidth","tickPixelInterval","startOnTick","endOnTick","min","xAxis","margin","lineWidth","legend","chart","type","height","spacingTop","plotOptions","column","dataLabels","enableMouseTracking","minPointLength","InsightChart","highcharts","options","chartData","staticChartOptions","hasData","series","some","y","categories","MAX_ITEMS","InsightStudentList","students","slice","student","index","UserRecipientItemMetadata","user","imageCdnUrl","avatarClassName","detailsClassName","showDisplayName","showSubText","anonymiseUsers","undefined","percentage","round","PercentageIndicator","src","imageUrl","dangerouslySetInnerHTML","__html","description","appLink","AppLink","appLinkText","getPhrase","LanguageService","InsightDevices","categoriesData","defaultDevices","Phone","Computer","osCount","reduce","acc","group","name","deviceCategory","getDeviceType","getCategoriesData","topDeviceCount","Object","keys","category","topDevices","filter","borderRadius","inside","overflow","crop","highestCount","borderWidth","borderColor","smartCount","device","toLowerCase","useHTML","formatter","this","SvgHelper","replace","getDeviceIcon","InsightHeatmap","engagementRate","heatmapAppLink","CHART_FONT_STYLES","fontSize","fontFamily","fontWeight","color","anonymiseUserName","shouldAnonymise","id","sessionName","seed","floor","Date","getMinutes","dictionaries","separator","getAnonSession","sessionId","anonSessions","fallback","getUserOrAnonSession","result","getFullHeatMap","Array","ceil","videoDuration","fill","t","surname","avatarUrl","avatar","url","initials","showAnonymousUser","anonymousSvgSize","getSubText","userType","role","yearGroup","defaults","getHiddenRecipientText","hiddenRecipients","counts","ArrayHelper","userCount","MasterType","classroomCount","groupCount","SharedToAvatar","item","typeId","classroom","classroomGroup","svgContainerClassName","Tooltip","spanHack","spanHackClassName","Avatar","UserHelper","extraClasses","IconCircle","svgSize","variant","metadata","colour","AnonymousSharedToAvatar","avatarSize","SharedLinkAvatar","SharedToAvatarList","AvatarList","items","recipients","avatarItem","avatarContainerClassname","getHiddenTooltip","hasShareLink","shareLinkText","defaultProps","maxAvatars","ShareLinkHelper","getPrivateIconAndText","entityTypeId","privacy","hasStudentExp","entity","yearGroups","icon","isArray","overrideRestrictions","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","days","video","restriction","_restrictions","maxYearGroup","minAllowedYearGroup","rating","itemsToDisplay","hiddenItems","AvatarItem","hiddenItemsCounts","translateX","getAvatarStyles","transform","zIndex","marginRight","roleToDisplay","numberClassname","PercentageIndicatorLayout","ProgressCircle","ref","circle","radius","r","baseVal","circumference","PI","offset","strokeDasharray","strokeDashoffset","toString","scoreThresholds","percentageToFixed","layout","LabelInside","customLabel","LabelOnly","LabelBefore","CircleOnly","ProgressCircleSize","CIRCLE_STROKE_WIDTH","CIRCLE_STROKE_WIDTH_LG","ProgressCircleSizeMap","ExtraSmall","Small","Large","getCircleRadius","strokeWidth","getCircleClassName","HIGH","MODERATE","getColouredLabelClassName","getCircleContainerClassName","isPending","getPercentageToFixed","toFixed","getFormattedPercentage","ScoreThresholdDefaults","ScoreThresholdInsights","useLockContentWidth","InsightsShareMask","hasShared","hasShareFlowV2","actions","application","action","args","params","shareId","buildAppLink","SharedToPill","shareRecipients","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","isNaN","test","parseInt","trim","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","abs","unit"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6973],{5255:(e,t,n)=>{n.d(t,{Y:()=>s});var r=n(20354),a=n(30439);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function s(e){var t,n=r.a.useBasicFetch(e&&a.o.getAnonSessions(e));return(null===(t=n.data)||void 0===t?void 0:t.length)?n.data.reduce((function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a=t,(r=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=i(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(r))in n?Object.defineProperty(n,r,{value:a,enumerable:!0,configurable:!0,writable:!0}):n[r]=a,n));var n,r,a}),{}):{}}},41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(71553),i=n(20768),s=n(31949);function o(e,t,n){var o,u=r.a.useBasicFetch(s.N.currentUser()),l=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),c=r.a.useBasicFetch(!!(null===(o=l.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(l.data.interactiveId)),d=!!u.data&&!!c.data&&!!t;return r.a.useBasicFetch(d&&a.I.interactiveResultSet(l.data.interactiveId,l.data.id,u.data,t,n))}},26025:(e,t,n)=>{n.d(t,{B:()=>i});var r=n(1048),a=n(75795),i={getAudienceAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.users,i=t.classrooms,s=t.classroomGroups,o=function(e){var n=t[e];if(n)return Array.isArray(n)?n:[n]},u={};return n&&(u.users=o("users")),i&&(u.classrooms=o("classrooms")),s&&(u.classroomGroups=o("classroomGroups")),u},getDateRangeAppLinkParams:function(){var e=a.O.getCurrentRoute().appLink,t=r.t.isObject(e.params)?e.params:{},n=t.from,i=t.to,s=t.rangeName,o={};return n&&(o.from=n),i&&(o.to=i),s&&(o.rangeName=s),o}}},40003:(e,t,n)=>{n.d(t,{Hb:()=>m,NG:()=>b,W5:()=>d,eO:()=>v,nG:()=>l,wO:()=>p,zn:()=>u});var r=n(23481),a=n(110),i=n(57266),s=r.T.encloseNamespace("shared.analyticsUtils");function o(e){var t=a.O.convertDateToUTC(e);return a.O.format(t,"YYYY-MM-DDTHH:mm:ss")}function u(){return new Date(2021,0,1)}function l(){return new Date}function c(e){return e.find((function(e){return!!e.default}))}function d(e,t){if(t)return e.find((function(e){return e.name===t}))}function m(){var e=u(),t=(new Date).getFullYear(),n=t===e.getFullYear();return[{name:s("today"),startDate:new Date,endDate:new Date},{name:s("thisMonth"),startDate:new Date(t,(new Date).getMonth(),1),endDate:new Date},{name:s("lastThreeMonths"),startDate:new Date(t,(new Date).getMonth()-2,1),endDate:new Date},{name:s("lastSixMonths"),startDate:new Date(t,(new Date).getMonth()-5,1),endDate:new Date},{name:s("thisYear"),startDate:new Date(t,0,1),endDate:new Date},{name:s("lastYear"),startDate:new Date(t-1,0,1),endDate:new Date(t,0,0),disabled:n,tooltip:n?s("lastYearDisabled"):""},{name:s("allTime"),startDate:a.O.subtract(new Date,5,"years"),endDate:new Date,default:!0}]}function f(e){return a.O.format(e,"YYYY-MM-DD")}function v(e){return e.name?{rangeName:e.name}:{from:f(e.startDate),to:f(e.endDate)}}function b(e,t){var n=t.to,r=t.from,s=t.rangeName,o=d(e,s);if(o)return r||n?void i.e.updateParams(v(o),{replace:!0,merge:!0,keysToRemove:["from","to"]}):o;var m=c(e);if(r&&n&&a.O.isValid(r)&&a.O.isValid(n)){var f=!0,b=a.O.convertDateToUTC(new Date(r)),p=a.O.convertDateToUTC(new Date(n));a.O.isBefore(b,u(),"day")&&(b=u(),f=!1),a.O.isAfter(p,l(),"day")&&(p=l(),f=!1),a.O.isAfter(b,p)&&(b=m.startDate,p=m.endDate,f=!1);var g={startDate:b,endDate:p,name:f?s||"custom":""};if(f)return g;i.e.updateParams(v(g),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}else i.e.updateParams(v(m),{replace:!0,merge:!0,keysToRemove:["rangeName"]})}function p(e,t){var n=function(e){return o(a.O.startOf(e,"day"))},r=function(e){return o(a.O.endOf(e,"day"))},i=d(e,t.rangeName);if(i)return{start:n(f(i.startDate)),end:r(f(i.endDate))};if(t.from&&t.to)return{start:n(t.from),end:r(t.to)};var s=c(e);return{start:n(f(s.startDate)),end:r(f(s.endDate))}}},43503:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsView:()=>A});var r=n(32735),a=n(23481),i=n(20354),s=n(2948),o=n(5255),u=n(41196),l=n(9193),c=n(26025),d=n(26136),m=n(40003),f=n(30439),v=n(3218),b=n(9111),p=n(38143),g=n(39151),y=n(20768),w=n(26304),h=n(91286),k=n(93322);function D(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var S=a.T.encloseNamespace("shared.interactiveStudentResults");function A(e){var t,n,a,A,O,C,E,R=(C=(0,s.D)(p.g.ANONYMISE_USERS),E=1,function(e){if(Array.isArray(e))return e}(C)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,o=[],u=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,a=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw a}}return o}}(C,E)||function(e,t){if(e){if("string"==typeof e)return D(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?D(e,t):void 0}}(C,E)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,k.F)();var I=i.a.useBasicFetch(y.b.interactiveMetadata(e.interactiveId)),N=i.a.useBasicFetch((null===(t=I.data)||void 0===t?void 0:t.interactiveId)&&y.b.interactive(I.data.interactiveId)),M=c.B.getDateRangeAppLinkParams(),j=(0,u.W)(e.interactiveId,(0,m.wO)((0,m.Hb)(),M)),T=i.a.useBasicFetch(g.L.config()),F=i.a.useBasicFetch(f.o.getShareLinkByObjectId(e.interactiveId)),B=(0,o.Y)(null===(n=F.data)||void 0===n?void 0:n.id);(0,h.v)([I,j]),(0,w.b)(I);var U=(0,l.D)(null===(a=N.data)||void 0===a?void 0:a.id,null===(A=I.data)||void 0===A?void 0:A.id,e.closePopup),Y=U.markedAnswers,P=U.addMarkedAnswers,L=U.submitMarkedAnswers,x=null===(O=j.data)||void 0===O?void 0:O.students.find((function(t){var n,r,a,i,s;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(a=e.userId)||void 0===a?void 0:a.toString()):!!e.sessionId&&(null===(i=t.sessionId)||void 0===i?void 0:i.toString())===(null===(s=e.sessionId)||void 0===s?void 0:s.toString())})),H=x?S("heading",{studentName:(0,d.B2)((0,d.DV)(x,B),R)}):"",Q=!!N.data&&!!j.data&&!!T.data;return r.createElement(b.G,{title:H,showLoadingSpinner:!Q,closePopup:e.closePopup,size:"lg"},Q&&r.createElement(v.R,{interactive:N.data,studentResults:x,markedAnswers:Y,addMarkedAnswers:P,submitMarkedAnswers:L,imageCdnUrl:T.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:R,reportsStyling:e.reportsStyling,anonSessions:B}))}},3218:(e,t,n)=>{n.d(t,{R:()=>D});var r=n(32735),a=n(69087),i=n(26136),s=n(39157),o=n(69186),u=n(86572),l=n(28972),c=n(83140),d=n(80845),m=n(23481),f=n(2102),v=n(36532),b=m.T.encloseNamespace("interactives.studentResponseList");function p(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},b("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:b("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},b("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},b("submitAnswers")))))}var g=m.T.encloseNamespace("interactives.studentResponseList");function y(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},g("score")),e.summary.awaitingMarking?r.createElement("em",null,g("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(v.u,{id:"submitAnswers",title:g("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},g("submitAnswers"))):r.createElement(f.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},g("submitAnswers"))))}const w={awaitingMarking:"MvGb5"};function h(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,s,o=[],u=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);u=!0);}catch(e){l=!0,a=e}finally{try{if(!u&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function D(e){var t,n,m,f,v=h(r.useState(!1),2),b=v[0],g=v[1],k=(t=r.useRef(null),n=h(r.useState(!1),2),m=n[0],f=n[1],r.useEffect((function(){t.current&&!m&&(f(!0),requestAnimationFrame((function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})})))}),[t.current,m]),t),D=(0,s.Rt)(e.interactive,e.studentResults),S=(0,d.Q)(e.interactive),A=function(e,t){return e.filter((function(e){return c.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking}))}(S,e.studentResults);function O(){g(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(y,{summary:D,interactionsToMark:A,markedAnswers:e.markedAnswers,onClickSubmit:O,showSubmitButtonSpinner:b,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},S.map((function(t,n){var l,c=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=A.some((function(e){return e.id===t.id})),m=(0,i.B2)((0,i.DV)(e.studentResults,e.anonSessions),e.anonymiseUsers),f="p-2 mb-3 rounded";return c&&(f+=" border-2 border-info shadow"),f+=d?" ".concat(w.awaitingMarking):" border",r.createElement("li",{key:n,className:f,ref:c?k:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(u.y,{interaction:t,iconClassName:"flex-shrink-0"})),e.reportsStyling?r.createElement(o.O,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,className:"bg-light ps-2",showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):r.createElement(a.d,{interaction:t,studentResults:e.studentResults,markedStatus:(0,s.HI)(t.id,e.studentResults,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymisedUserName:m,showFeedback:!0}))}))),r.createElement(p,{interactionsToMark:A,markedAnswers:e.markedAnswers,onClickSubmit:O,onClickClose:e.onClickClose,showSubmitButtonSpinner:b,isDemo:e.isDemo}))}},94644:(e,t,n)=>{n.d(t,{r:()=>c});var r=n(50242),a=n(81886),i=n(67058),s=n(14553),o=n(49267),u=n(49075),l={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:u._,internalServerError:u._};function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},l),t);i&&a.Q.Ry.isStatusCodeError(i)&&(i!==r.o.InternalServer?i!==r.o.NotFound?i!==r.o.Forbidden?n.badRequest||a.Q.Ry.throw(new s.badRequest):n.forbidden||a.Q.Ry.throw(new s.forbidden.privacy):n.notFound||a.Q.Ry.throw(new s.notFound):n.internalServerError||a.Q.Ry.throw(new u._))}}},91286:(e,t,n)=>{n.d(t,{v:()=>s});var r=n(32735),a=n(94644);function i(e){return e.map((function(e){return e.statusCode})).join(":")}function s(e,t,n){var s=Array.isArray(e)?e:[e];(0,r.useEffect)((function(){s.forEach((function(e){(0,a.r)(e.statusCode,t,n)}))}),[i(s),t,n])}},57266:(e,t,n)=>{n.d(t,{e:()=>s});var r=n(81886),a=n(1048),i=n(75795),s={updateParams:function(e,t){var n=i.O.getCurrentRoute().appLink,s="string"==typeof n.params?r.Q.Ab.DeserializeQueryParams(n.params):n.params;t.keysToRemove&&(s=a.t.omit(s,t.keysToRemove));var o=(null==t?void 0:t.merge)?Object.assign(Object.assign({},s),e):e,u=Object.assign(Object.assign({},n),{params:o});a.t.isEqual(n,u)||r.Q.C$.trigger(u,a.t.omit(t,["merge","keysToRemove"]))}}}}]);
2
- //# sourceMappingURL=6973-ede6601614-lite.chunk.js.map