@clickview/lite 0.75.0-rc.3 → 0.75.0-rc.5

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 (94) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/languages/en.json +1 -1
  3. package/dist/scripts/104-0c03791b45-lite.chunk.js +2 -0
  4. package/dist/scripts/104-0c03791b45-lite.chunk.js.map +1 -0
  5. package/dist/scripts/1074-4f6b136f9a-lite.chunk.js +2 -0
  6. package/dist/scripts/1074-4f6b136f9a-lite.chunk.js.map +1 -0
  7. package/dist/scripts/1192-d409863a3c-lite.chunk.js +2 -0
  8. package/dist/scripts/1192-d409863a3c-lite.chunk.js.map +1 -0
  9. package/dist/scripts/{1199-6522b1d291-lite.chunk.js → 1199-d2fcbb547e-lite.chunk.js} +1 -1
  10. package/dist/scripts/1199-d2fcbb547e-lite.chunk.js.map +1 -0
  11. package/dist/scripts/{1221-894d8474d5-lite.chunk.js → 1221-1109d5379d-lite.chunk.js} +2 -2
  12. package/dist/scripts/1221-1109d5379d-lite.chunk.js.map +1 -0
  13. package/dist/scripts/1491-ab92a040e5-lite.chunk.js +2 -0
  14. package/dist/scripts/1491-ab92a040e5-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1610-bf848cce4d-lite.chunk.js → 1610-bb6eff2ff1-lite.chunk.js} +2 -2
  16. package/dist/scripts/1610-bb6eff2ff1-lite.chunk.js.map +1 -0
  17. package/dist/scripts/{218-297de74688-lite.chunk.js → 218-f6cc4a3b6a-lite.chunk.js} +2 -2
  18. package/dist/scripts/218-f6cc4a3b6a-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{2968-c4c0114915-lite.chunk.js → 2968-13e56eeff8-lite.chunk.js} +1 -1
  20. package/dist/scripts/2968-13e56eeff8-lite.chunk.js.map +1 -0
  21. package/dist/scripts/3597-eaae787997-lite.chunk.js +3 -0
  22. package/dist/scripts/3597-eaae787997-lite.chunk.js.map +1 -0
  23. package/dist/scripts/4033-8c890bbdd6-lite.chunk.js +3 -0
  24. package/dist/scripts/4033-8c890bbdd6-lite.chunk.js.map +1 -0
  25. package/dist/scripts/4185-7178e5a716-lite.chunk.js +2 -0
  26. package/dist/scripts/4185-7178e5a716-lite.chunk.js.map +1 -0
  27. package/dist/scripts/{4722-d96da2a258-lite.chunk.js → 4722-9eb591621a-lite.chunk.js} +3 -3
  28. package/dist/scripts/4722-9eb591621a-lite.chunk.js.map +1 -0
  29. package/dist/scripts/{5153-acc6c13153-lite.chunk.js → 5153-cf62a95421-lite.chunk.js} +2 -2
  30. package/dist/scripts/5153-cf62a95421-lite.chunk.js.map +1 -0
  31. package/dist/scripts/6756-cfd00009e4-lite.chunk.js +3 -0
  32. package/dist/scripts/6756-cfd00009e4-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{6790-c8a9efba50-lite.chunk.js → 6790-36ce6dda04-lite.chunk.js} +1 -1
  34. package/dist/scripts/6790-36ce6dda04-lite.chunk.js.map +1 -0
  35. package/dist/scripts/7148-d966512e45-lite.chunk.js +2 -0
  36. package/dist/scripts/7148-d966512e45-lite.chunk.js.map +1 -0
  37. package/dist/scripts/{7438-88d11bb89a-lite.chunk.js → 7438-38f60d3e8e-lite.chunk.js} +1 -1
  38. package/dist/scripts/7438-38f60d3e8e-lite.chunk.js.map +1 -0
  39. package/dist/scripts/{8856-02dd2e486c-lite.chunk.js → 8856-4da691f96f-lite.chunk.js} +1 -1
  40. package/dist/scripts/8856-4da691f96f-lite.chunk.js.map +1 -0
  41. package/dist/scripts/9003-fc8e674468-lite.chunk.js +2 -0
  42. package/dist/scripts/9003-fc8e674468-lite.chunk.js.map +1 -0
  43. package/dist/scripts/9042-add0f1c2e2-lite.chunk.js +2 -0
  44. package/dist/scripts/9042-add0f1c2e2-lite.chunk.js.map +1 -0
  45. package/dist/scripts/{9134-19912ca3ee-lite.chunk.js → 9134-a6a5fc92cf-lite.chunk.js} +1 -1
  46. package/dist/scripts/9134-a6a5fc92cf-lite.chunk.js.map +1 -0
  47. package/dist/scripts/9620-3746c84350-lite.chunk.js +3 -0
  48. package/dist/scripts/9620-3746c84350-lite.chunk.js.map +1 -0
  49. package/dist/scripts/{bundle-828ca65de8.min.js → bundle-ea99ddf0dd.min.js} +3 -3
  50. package/dist/scripts/{bundle-828ca65de8.min.js.map → bundle-ea99ddf0dd.min.js.map} +1 -1
  51. package/package.json +1 -1
  52. package/dist/scripts/104-7abe2b09dd-lite.chunk.js +0 -2
  53. package/dist/scripts/104-7abe2b09dd-lite.chunk.js.map +0 -1
  54. package/dist/scripts/1074-2ab8b03e30-lite.chunk.js +0 -2
  55. package/dist/scripts/1074-2ab8b03e30-lite.chunk.js.map +0 -1
  56. package/dist/scripts/1199-6522b1d291-lite.chunk.js.map +0 -1
  57. package/dist/scripts/1221-894d8474d5-lite.chunk.js.map +0 -1
  58. package/dist/scripts/1400-43b37bfa8d-lite.chunk.js +0 -2
  59. package/dist/scripts/1400-43b37bfa8d-lite.chunk.js.map +0 -1
  60. package/dist/scripts/1610-bf848cce4d-lite.chunk.js.map +0 -1
  61. package/dist/scripts/218-297de74688-lite.chunk.js.map +0 -1
  62. package/dist/scripts/2968-c4c0114915-lite.chunk.js.map +0 -1
  63. package/dist/scripts/4033-af3bf49c75-lite.chunk.js +0 -3
  64. package/dist/scripts/4033-af3bf49c75-lite.chunk.js.map +0 -1
  65. package/dist/scripts/4185-1f65c7adc9-lite.chunk.js +0 -2
  66. package/dist/scripts/4185-1f65c7adc9-lite.chunk.js.map +0 -1
  67. package/dist/scripts/4722-d96da2a258-lite.chunk.js.map +0 -1
  68. package/dist/scripts/5153-acc6c13153-lite.chunk.js.map +0 -1
  69. package/dist/scripts/6756-e90680dfcd-lite.chunk.js +0 -3
  70. package/dist/scripts/6756-e90680dfcd-lite.chunk.js.map +0 -1
  71. package/dist/scripts/6790-c8a9efba50-lite.chunk.js.map +0 -1
  72. package/dist/scripts/7148-432ab72091-lite.chunk.js +0 -2
  73. package/dist/scripts/7148-432ab72091-lite.chunk.js.map +0 -1
  74. package/dist/scripts/7438-88d11bb89a-lite.chunk.js.map +0 -1
  75. package/dist/scripts/8687-549a2d9278-lite.chunk.js +0 -3
  76. package/dist/scripts/8687-549a2d9278-lite.chunk.js.map +0 -1
  77. package/dist/scripts/8856-02dd2e486c-lite.chunk.js.map +0 -1
  78. package/dist/scripts/9003-1db925f5ec-lite.chunk.js +0 -2
  79. package/dist/scripts/9003-1db925f5ec-lite.chunk.js.map +0 -1
  80. package/dist/scripts/9042-1a42fcbba2-lite.chunk.js +0 -2
  81. package/dist/scripts/9042-1a42fcbba2-lite.chunk.js.map +0 -1
  82. package/dist/scripts/9134-19912ca3ee-lite.chunk.js.map +0 -1
  83. package/dist/scripts/9528-2b478f4ca8-lite.chunk.js +0 -3
  84. package/dist/scripts/9528-2b478f4ca8-lite.chunk.js.map +0 -1
  85. /package/dist/css/{8687-lite-6787cc731a.chunk.css → 3597-lite-6787cc731a.chunk.css} +0 -0
  86. /package/dist/css/{9528-lite-6787cc731a.chunk.css → 9620-lite-6787cc731a.chunk.css} +0 -0
  87. /package/dist/scripts/{1221-894d8474d5-lite.chunk.js.LICENSE.txt → 1221-1109d5379d-lite.chunk.js.LICENSE.txt} +0 -0
  88. /package/dist/scripts/{4033-af3bf49c75-lite.chunk.js.LICENSE.txt → 3597-eaae787997-lite.chunk.js.LICENSE.txt} +0 -0
  89. /package/dist/scripts/{4722-d96da2a258-lite.chunk.js.LICENSE.txt → 4033-8c890bbdd6-lite.chunk.js.LICENSE.txt} +0 -0
  90. /package/dist/scripts/{5153-acc6c13153-lite.chunk.js.LICENSE.txt → 4722-9eb591621a-lite.chunk.js.LICENSE.txt} +0 -0
  91. /package/dist/scripts/{6756-e90680dfcd-lite.chunk.js.LICENSE.txt → 5153-cf62a95421-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{8687-549a2d9278-lite.chunk.js.LICENSE.txt → 6756-cfd00009e4-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{9528-2b478f4ca8-lite.chunk.js.LICENSE.txt → 9620-3746c84350-lite.chunk.js.LICENSE.txt} +0 -0
  94. /package/dist/scripts/{bundle-828ca65de8.min.js.LICENSE.txt → bundle-ea99ddf0dd.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7148],{41196:(e,t,n)=>{n.d(t,{W:()=>o});var r=n(20354),a=n(93479),i=n(20768),s=n(31949);function o(e,t,n){var o,c=r.a.useBasicFetch(s.N.currentUser()),l=r.a.useBasicFetch(!!e&&i.b.interactiveMetadata(e)),u=r.a.useBasicFetch(!!(null===(o=l.data)||void 0===o?void 0:o.interactiveId)&&i.b.interactive(l.data.interactiveId)),d=!!c.data&&!!u.data;return r.a.useBasicFetch(d&&a.I.interactiveResultSet(l.data.interactiveId,l.data.id,c.data,t,n))}},26136:(e,t,n)=>{n.d(t,{B:()=>o});var r=n(76198),a=n(23481),i=n(64818),s=a.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,r._8)((n=e.id,a=e.sessionId,o=+"".concat(n||function(e){if(!e)return 0;for(var t=0,n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[r.O9,r.yd],separator:" ",length:2,style:"capital",seed:o})):i.l.getFullName(e)||s("anonUser"):s("anonUser");var n,a,o}},2510:(e,t,n)=>{var r;n.d(t,{y:()=>r}),function(e){e.Link="Link",e.Classroom="Classroom",e.Open="Open",e.Live="Live"}(r||(r={}))},18488:(e,t,n)=>{n.d(t,{o:()=>s});var r=n(99940),a=n(97395),i={namespace:"share-v2"},s={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:r.k.POST,data:e,normalizeOptions:i,invalidationKeys:["sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:r.k.PUT,data:t,normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e)]}},deleteShare:function(e){return{type:r.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:i,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e)]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:r.k.GET,normalizeOptions:i}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:a._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:r.k.GET,normalize:!1}},getShareLink:function(e){return{url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:i}},createShareLink:function(e){return{type:r.k.POST,url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2"],normalizeOptions:i}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:r.k.GET,normalizeOptions:i}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:r.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),a=n(69087),i=n(26136),s=n(39157),o=n(69186),c=n(86572),l=n(28972),u=n(83140),d=n(80845),m=n(23481),v=n(2102),f=n(36532),h=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},h("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(f.u,{id:"submitAnswers",title:h("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},h("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},h("submitAnswers")))))}var y=m.T.encloseNamespace("interactives.studentResponseList");function b(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"},y("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},y("score")),e.summary.awaitingMarking?r.createElement("em",null,y("pending")):"".concat(Math.round(100*e.summary.percentCorrect),"%"))),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(f.u,{id:"submitAnswers",title:y("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},y("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},y("submitAnswers"))))}const g={awaitingMarking:"MvGb5"};function k(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=[],c=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&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 w(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)?w(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 w(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 S(e){var t,n,m,v,f=k(r.useState(!1),2),h=f[0],y=f[1],w=(t=r.useRef(null),n=k(r.useState(!1),2),m=n[0],v=n[1],r.useEffect((function(){t.current&&!m&&(v(!0),requestAnimationFrame((function(){return t.current.scrollIntoView({behavior:"smooth",block:"center"})})))}),[t.current,m]),t),S=(0,s.Rt)(e.interactive,e.studentResults),C=(0,d.Q)(e.interactive),I=function(e,t){return e.filter((function(e){return u.A.isInteractionCorrect(e,(0,d.j_)(t))===l.w.AwaitingMarking}))}(C,e.studentResults);function A(){y(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(b,{summary:S,interactionsToMark:I,markedAnswers:e.markedAnswers,onClickSubmit:A,showSubmitButtonSpinner:h,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},C.map((function(t,n){var l,u=t.id.toString()===(null===(l=e.selectedInteractionId)||void 0===l?void 0:l.toString()),d=I.some((function(e){return e.id===t.id})),m=(0,i.B)(e.studentResults.user,e.anonymiseUsers),v="p-2 mb-3 rounded";return u&&(v+=" border-2 border-info shadow"),v+=d?" ".concat(g.awaitingMarking):" border",r.createElement("li",{key:n,className:v,ref:u?w:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(c.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:I,markedAnswers:e.markedAnswers,onClickSubmit:A,onClickClose:e.onClickClose,showSubmitButtonSpinner:h,isDemo:e.isDemo}))}},94892:(e,t,n)=>{n.d(t,{T:()=>a,i:()=>r});var r={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var r=n(50242),a=n(81886),i=n(67058),s=n(14553),o=n(49267),c=n(49075),l={notFound:i.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:c._,internalServerError:c._};function u(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 c._))}}},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])}},9447:(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(a.o.getAnonSessions(e));return{items:(null===(t=n.data)||void 0===t?void 0:t.reduce((function(e,t){return Object.assign(Object.assign({},e),(n={},r=t.sessionId,a={sessionId:(s=t).sessionId,name:s.sessionName},(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,s}),{}))||{},hasCompleted:n.hasCompleted}}},5780:(e,t,n)=>{n.d(t,{p:()=>l});var r=n(20354),a=n(2510),i=n(18488),s=n(4594),o=n(3010),c=n(88630);function l(e){var t,n,l,u,d=r.a.useGetFetch(),m=r.a.useBasicFetch(i.o.getShare(e)),v=(null===(t=m.data)||void 0===t?void 0:t.type)===a.y.Classroom&&(null===(u=null===(l=null===(n=m.data)||void 0===n?void 0:n.recipients)||void 0===l?void 0:l.find((function(e){return e.recipientTypeId===s.E.Classroom})))||void 0===u?void 0:u.recipientId),f=function(e){return c.F.getClassroomStudents(v,e)},h=(0,o.i)(v&&f,(function(e){return d(f(e))}));return Object.assign(Object.assign({},h),{hasCompleted:!v||h.hasCompleted})}},52389:(e,t,n)=>{n.d(t,{_:()=>d});var r=n(20354),a=n(41196),i=n(18488),s=n(91286),o=n(9447),c=n(5780);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var u=[{id:"0",attempts:[{id:"0",answeredAt:0,answers:[]}]}];function d(e){var t,n,d=r.a.useBasicFetch(i.o.getShare(e)),m=(0,a.W)(null===(t=d.data)||void 0===t?void 0:t.objectId,null,!0),v=(0,o.Y)(e),f=(0,c.p)(e);(0,s.v)(m);var h=m.hasCompleted&&v.hasCompleted&&f.hasCompleted;if(!h)return{data:null,hasCompleted:!1};var p,y=new Set,b=m.data.students.map((function(e){return e.user?(y.add(e.user.id),e):Object.assign(Object.assign({},e),{user:v.items[e.sessionId]||{sessionId:e.sessionId}})}));return(null===(n=null==f?void 0:f.items)||void 0===n?void 0:n.length)&&b.push.apply(b,function(e){if(Array.isArray(e))return l(e)}(p=f.items.filter((function(e){return!y.has(e.id)})).map((function(e){return{user:e,results:u}})))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(p)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(p)||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.")}()),{hasCompleted:h,data:Object.assign(Object.assign({},m.data),{students:b})}}},2900:(e,t,n)=>{n.r(t),n.d(t,{InsightsStudentResultsView:()=>g});var r=n(32735),a=n(23481),i=n(20354),s=n(2948),o=n(9193),c=n(26136),l=n(18488),u=n(3218),d=n(9111),m=n(38143),v=n(39151),f=n(20768),h=n(91286),p=n(52389);function y(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var b=a.T.encloseNamespace("shared.insightsStudentResults");function g(e){var t,n,a,g,k,w,S,C=(w=(0,s.D)(m.g.ANONYMISE_USERS),S=1,function(e){if(Array.isArray(e))return e}(w)||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=[],c=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(o.push(r.value),o.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw a}}return o}}(w,S)||function(e,t){if(e){if("string"==typeof e)return y(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)?y(e,t):void 0}}(w,S)||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],I=i.a.useBasicFetch(v.L.config()),A=i.a.useBasicFetch(l.o.getShare(e.shareId)),E=i.a.useBasicFetch((null===(t=A.data)||void 0===t?void 0:t.objectId)&&f.b.interactiveMetadata(A.data.objectId)),j=i.a.useBasicFetch((null===(n=E.data)||void 0===n?void 0:n.interactiveId)&&f.b.interactive(E.data.interactiveId)),O=(0,p._)(e.shareId);(0,h.v)([A,j,E]);var N=(0,o.D)(null===(a=j.data)||void 0===a?void 0:a.id,null===(g=E.data)||void 0===g?void 0:g.id,e.closePopup),R=N.markedAnswers,M=N.addMarkedAnswers,B=N.submitMarkedAnswers,F=null===(k=O.data)||void 0===k?void 0:k.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())})),T=F?b("heading",{studentName:(0,c.B)(F.user,C)}):"",U=I.hasCompleted&&A.hasCompleted&&E.hasCompleted&&j.hasCompleted&&O.hasCompleted;return r.createElement(d.G,{title:T,showLoadingSpinner:!U,closePopup:e.closePopup,size:"lg"},U&&r.createElement(u.R,{interactive:j.data,studentResults:F,markedAnswers:R,addMarkedAnswers:M,submitMarkedAnswers:B,imageCdnUrl:I.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:C}))}}}]);
2
- //# sourceMappingURL=7148-432ab72091-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7148-432ab72091-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/share-v2/enums/ShareType.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.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/constants/ScoreThresholds.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useAnonSessions.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsClassroomStudents.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsInteractiveResults.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/insights-student-results/InsightsStudentResultsView.tsx"],"sourcesContent":["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;\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 { animals, colors, Config as UniqueNamesConfig, uniqueNamesGenerator } from 'unique-names-generator';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'shared.analyticsUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction guidToSeed(guid: string): number {\n if (!guid)\n return 0;\n\n // Simple hash function (DJB2-like) for browsers\n let hash = 0;\n for (let i = 0; i < guid.length; i++) {\n const char = guid.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n\nfunction getUniqueNamesConfig(userId: string, sessionId: string): UniqueNamesConfig {\n /**\n * Generate a seed that is unique to each user but changes every 5 minutes.\n * \n * We use a seed so that if the same user's name is anonymised multiple times\n * in quick succession (e.g. multiple renders), the same name will be returned each time.\n * \n * We change the seed every 5 minutes so that students don't always have the same name.\n */\n const seed = +`${userId || guidToSeed(sessionId)}${Math.floor((new Date()).getMinutes() / 5)}`;\n\n return {\n dictionaries: [ colors, animals ],\n separator: ' ',\n length: 2,\n style: 'capital',\n seed\n };\n}\n\nexport function anonymiseUserName(user: AnonUser, shouldAnonymise: boolean): string {\n if (!user) {\n return getPhrase('anonUser');\n }\n\n if (!shouldAnonymise)\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","export enum ShareType {\n Link = 'Link',\n Classroom = 'Classroom',\n Open = 'Open',\n Live = 'Live'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}` ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}` ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2' ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\n };\n }\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 { 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 { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } 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}\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 props.studentResults.user,\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}","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 { 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 { 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 { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonSession } from 'libs/shared/apps/share/interfaces/AnonSession';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nfunction toAnonUser(anonSession: AnonSession) {\n return { sessionId: anonSession.sessionId, name: anonSession.sessionName } as AnonUser;\n}\n\nexport function useAnonSessions(shareId: string) {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(ShareRequests.getAnonSessions(shareId));\n\n const anonSessionMap = anonSessions.data\n ?.reduce<Record<string, AnonUser>>((prev, next) => {\n return {\n ...prev,\n [next.sessionId]: toAnonUser(next)\n };\n }, {});\n\n return {\n items: anonSessionMap || {},\n hasCompleted: anonSessions.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { User } from 'libs/shared/interfaces/models/User';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport function useInsightsClassroomStudents(shareId: string) {\n const fetch = Flight.useGetFetch();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n \n const classroomId = share.data?.type === ShareType.Classroom &&\n share.data?.recipients?.find(r => r.recipientTypeId === MasterType.Classroom)?.recipientId;\n\n const getRequest = (cursor: string) => ClassroomRequests.getClassroomStudents(classroomId, cursor);\n const result = useFetchAll<User>(classroomId && getRequest, cursor => fetch(getRequest(cursor)));\n\n return {\n ...result,\n hasCompleted: !classroomId || result.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { InteractiveResult, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\n\nconst EMPTY_INTERACTIVE_RESULTS: InteractiveResult[] = [\n {\n id: '0',\n attempts: [{ id: '0', answeredAt: 0, answers: []}]\n }\n];\n\nexport function useInsightsInteractiveResults(shareId: string) {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n const results = useFetchInteractiveResults(share.data?.objectId, null, true);\n\n const anonSessions = useAnonSessions(shareId);\n\n const classroomStudents = useInsightsClassroomStudents(shareId);\n\n useHandleObjectError(results);\n\n const hasCompleted = (\n results.hasCompleted &&\n anonSessions.hasCompleted &&\n classroomStudents.hasCompleted\n );\n\n if (!hasCompleted) {\n return {\n data: null as InteractiveResultSet,\n hasCompleted: false\n };\n }\n\n const studentHash = new Set<string>();\n const students = results.data.students.map(s => {\n if (s.user) {\n studentHash.add(s.user.id);\n return s;\n }\n\n /**\n * Set the user to our anon user, so we can display the name they entered\n * when completing the interactive - Sha\n */\n return {\n ...s,\n user: anonSessions.items[s.sessionId] || { sessionId: s.sessionId } as AnonUser\n };\n });\n\n /**\n * If we have classroom students, we're adding any students who haven't attempted to the list\n * with an empty attempt. This is so the student list can show all classroom students - Sha\n */\n if (classroomStudents?.items?.length) {\n students.push(...classroomStudents.items\n .filter(s => !studentHash.has(s.id))\n .map(user => ({ user, results: EMPTY_INTERACTIVE_RESULTS })));\n }\n\n return {\n hasCompleted,\n data: {\n ...results.data,\n students\n }\n };\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 { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\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 { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\n\nconst namespace = 'shared.insightsStudentResults';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveStudentResultsViewProps extends PopupViewProps {\n shareId: string;\n interactionId: string;\n userId: string;\n sessionId: string;\n}\n\nexport function InsightsStudentResultsView(props: InteractiveStudentResultsViewProps): JSX.Element {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n useHandleObjectError([ share, interactive, 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(studentResults.user, anonymiseUsers) })\n : '';\n\n const dataLoaded = (\n config.hasCompleted &&\n share.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.hasCompleted &&\n results.hasCompleted\n );\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 />\n }\n </Popup>\n );\n}\n"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","includePublicResults","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","getPhrase","anonymiseUserName","user","shouldAnonymise","userId","sessionId","seed","guid","hash","i","length","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","ShareType","normalizeOptions","namespace","ShareRequests","createShare","url","key","type","invalidationKeys","objectId","updateShare","shareId","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","sort","join","normalize","getShareLink","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","LanguageService","StudentResponseListFooter","props","numMarkedAnswers","keys","markedAnswers","className","showSubmitButtonSpinner","onClick","onClickClose","interactionsToMark","isDemo","Tooltip","title","spanHack","spanHackClassName","disabled","SpinnerButton","variant","onClickSubmit","showSpinner","StudentResponseListHeader","summary","unanswered","awaitingMarking","round","percentCorrect","StudentResponseList","ref","scrolled","setScrolled","setShowSpinner","selectedInteractionRef","current","requestAnimationFrame","scrollIntoView","behavior","block","studentResults","interactions","questionsToMark","filter","InteractiveCorrectnessHelper","InteractionCorrectness","getInteractionsToMark","submitMarkedAnswers","map","interaction","idx","isSelected","toString","selectedInteractionId","markingRequired","some","q","anonymisedUserName","anonymiseUsers","InteractionLabel","iconClassName","reportsStyling","InteractionResponse","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showFeedback","responseComponentClass","InteractionResponseItem","ScoreThresholdDefaults","HIGH","MODERATE","ScoreThresholdInsights","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","obj","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","useAnonSessions","anonSessions","items","reduce","prev","next","anonSession","name","sessionName","hasCompleted","useInsightsClassroomStudents","fetch","share","classroomId","recipients","find","r","recipientTypeId","recipientId","getRequest","cursor","result","EMPTY_INTERACTIVE_RESULTS","attempts","answeredAt","answers","useInsightsInteractiveResults","results","classroomStudents","studentHash","Set","students","s","add","push","has","InsightsStudentResultsView","config","closePopup","popupTitle","studentName","dataLoaded","showLoadingSpinner","size","interactionId"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7438-88d11bb89a-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/delete-share-content/DeleteShareContent.tsx","file:///app/packages/libs/shared/src/apps/share-v2/enums/SharePrivacy.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.ts","file:///app/packages/libs/shared/src/apps/share-v2/hooks/useShareLinkActions.ts","file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/apps/share-v2/views/delete-open-classroom-confirmation-view/DeleteOpenClassroomConfirmationView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\n\nconst namespace = 'sharev2.deleteShareContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface DeleteShareContentProps {\n loading: boolean;\n phrases: {\n leadingSentence: string;\n bulletPoints: string[];\n acknowledgement: string;\n deleteButton: string;\n backButton?: string;\n };\n onDelete: () => void;\n onBack?: () => void;\n}\n\nexport function DeleteShareContent(props: DeleteShareContentProps) {\n const [ ack, setAck ] = React.useState(false);\n\n function onDelete() {\n if (!ack || props.loading)\n return;\n\n props.onDelete();\n }\n\n return (\n <div className='d-flex flex-column gap-3'>\n <p className='m-0'>{props.phrases.leadingSentence}</p>\n <ul className='m-0'>\n {props.phrases.bulletPoints.map((phrase, index) => (\n <li key={index}>\n {phrase}\n </li>\n ))}\n </ul>\n <Checkbox\n id='ack'\n checked={ack}\n onChange={e => setAck(e.target.checked)}\n label={props.phrases.acknowledgement}\n />\n <PopupButtons>\n {props.onBack && (\n <PopupButtons.Cancel\n onClick={props.onBack}\n text={props.phrases.backButton ?? getPhrase('backButton')}\n variant='link'\n />\n )}\n <PopupButtons.Submit\n onClick={onDelete}\n text={props.phrases.deleteButton}\n variant='danger'\n disabled={!ack || props.loading}\n showSpinner={props.loading}\n />\n </PopupButtons>\n </div>\n );\n}","export enum SharePrivacy {\n Public = 'Public',\n PinCode = 'PinCode',\n PasswordProtected = 'PasswordProtected',\n ProtectedOverrideRestriction = 'ProtectedOverrideRestriction',\n JustMySchoolOverrideRestriction = 'JustMySchoolOverrideRestriction',\n Protected = 'Protected',\n JustMySchool = 'JustMySchool',\n Direct = 'Direct'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}` ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}` ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2' ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\n };\n }\n};\n","import { Flight } from 'libs/common/react/index';\n\nimport { SharePrivacy } from '../enums/SharePrivacy';\nimport { ShareRequests } from '../flight-requests/ShareRequests';\nimport { Share } from '../interfaces/Share';\nimport { SharePrivacyResponse } from '../interfaces/SharePrivacyResponse';\nimport { UpdateShareRequest } from '../interfaces/UpdateShareRequest';\nimport { ShareLinkHelper } from '../utils/ShareLinkHelper';\n\ninterface UseShareLinkActionsOptions {\n entityId: string;\n}\n\nexport function useShareLinkActions(options: UseShareLinkActionsOptions) {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const entityPrivacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(options.entityId));\n\n function getCreateSharePrivacy() {\n const accessType = ShareLinkHelper.getShareLinkAccessType(entityPrivacy.data);\n\n return accessType === 'protected'\n ? SharePrivacy.Protected\n : SharePrivacy.JustMySchool;\n }\n\n function updateShareLink(shareId: string, data: UpdateShareRequest): Promise<Share> {\n return fetchAsync<Share>(ShareRequests.updateShare(shareId, data));\n }\n\n function createShareLink(privacy?: SharePrivacy): Promise<Share> {\n const requestPrivacy = privacy ?? getCreateSharePrivacy();\n return fetchAsync<Share>(ShareRequests.createShareLink({ objectId: options.entityId, privacy: requestPrivacy }));\n }\n\n function deleteShareLink(shareId: string): Promise<void> {\n return fetchAsync(ShareRequests.deleteShare(shareId));\n }\n\n return {\n loaded: !!entityPrivacy.data,\n updateShareLink,\n createShareLink,\n deleteShareLink\n };\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport type { SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport type { 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 = 'sharev2.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacy;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\ninterface GetPrivateIconAndTextOptions {\n privacy: SharePrivacy;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetPrivateIconAndTextOptions) => {\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) {\n case SharePrivacy.Public:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case SharePrivacy.ProtectedOverrideRestriction:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n case SharePrivacy.Protected:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.JustMySchoolOverrideRestriction:\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n case SharePrivacy.JustMySchool:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.PinCode:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('pinDescription') };\n case SharePrivacy.PasswordProtected:\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\n getShareLinkAccessType(privacy: SharePrivacyResponse): 'private' | 'owner' | 'protected' {\n /**\n * If an entity is not a ClickView content and they cannot manage access\n * settings of the entity (which they can if its their private entity)\n * it means that its a TV content\n */\n if (privacy.isTvContent || privacy.isClickViewContent)\n return 'protected';\n\n if (privacy.canManageAccess)\n return 'owner';\n\n return 'private';\n }\n};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { DeleteShareContent } from 'libs/shared/apps/share-v2/components/delete-share-content/DeleteShareContent';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { useShareLinkActions } from 'libs/shared/apps/share-v2/hooks/useShareLinkActions';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'sharev2.deleteOpenClassroomConfirmation';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface DeleteOpenClassroomConfirmationViewProps extends PopupViewProps {\n shareId: string;\n previousAppLink?: Core.AppLink;\n}\n\nexport function DeleteOpenClassroomConfirmationView(props: DeleteOpenClassroomConfirmationViewProps) {\n const alerts = useAlerts();\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const [ loading, setLoading ] = React.useState(false);\n\n const { deleteShareLink: deleteShare } = useShareLinkActions({\n entityId: share.data?.objectId.toString()\n });\n \n function onClickDelete() {\n setLoading(true);\n\n deleteShare(share.data?.shareId).then(() => {\n setLoading(false);\n alerts.success(getPhrase('deleteSuccess'));\n props.closePopup();\n\n if (props.previousAppLink) {\n AppLinkHelper.trigger(props.previousAppLink);\n }\n }).catch(() => {\n alerts.error(getPhrase('deleteFailed'));\n }).finally(() => {\n setLoading(false);\n });\n }\n\n const loaded = share.hasCompleted;\n\n return (\n <Popup\n title={getPhrase('title')}\n closePopup={props.closePopup}\n showLoadingSpinner={!loaded}\n >\n <DeleteShareContent\n loading={loading}\n phrases={{\n leadingSentence: getPhrase('intro'),\n bulletPoints: [\n getPhrase('loseAccessInfo'),\n getPhrase('loseAccessUsage')\n ],\n acknowledgement: getPhrase('acknowledgement'),\n deleteButton: getPhrase('delete')\n }}\n onDelete={onClickDelete}\n />\n </Popup>\n );\n}"],"names":["getPhrase","DeleteShareContent","props","ack","setAck","className","phrases","leadingSentence","bulletPoints","map","phrase","index","key","id","checked","onChange","e","target","label","acknowledgement","onBack","onClick","text","backButton","variant","loading","onDelete","deleteButton","disabled","showSpinner","SharePrivacy","normalizeOptions","namespace","ShareRequests","createShare","data","url","type","invalidationKeys","objectId","updateShare","shareId","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","sort","join","normalize","getShareLink","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","useShareLinkActions","options","fetchAsync","entityPrivacy","entityId","loaded","updateShareLink","privacy","requestPrivacy","deleteShareLink","ShareLinkHelper","getPrivateIconAndText","entityTypeId","hasStudentExp","entity","yearGroups","icon","Array","isArray","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","name","getShareLinkAccessType","isTvContent","isClickViewContent","canManageAccess","DeleteOpenClassroomConfirmationView","alerts","share","setLoading","toString","hasCompleted","title","closePopup","showLoadingSpinner","then","success","previousAppLink","error"],"sourceRoot":""}
@@ -1,3 +0,0 @@
1
- /*! For license information please see 8687-549a2d9278-lite.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8687],{33685:(t,e,r)=>{r.r(e),r.d(e,{RequestingAccessView:()=>j});var n=r(32735),o=r(23481),i=r(20354),a=r(79095),c=r(61807),u=r(15611),s=r(83345),l=r(24833),f=r(23371),h=r(31949),p=r(69883),y=r(79612),v=r(93802),d=r(14070),m=r(97291),g=r(81803),w=r(68598),b=r(71966),E=r(96268);function x(t){return x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},x(t)}function L(){L=function(){return e};var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"")}catch(t){s=function(t,e,r){return t[e]=r}}function l(t,e,r,n){var i=e&&e.prototype instanceof m?e:m,a=Object.create(i.prototype),c=new G(n||[]);return o(a,"_invoke",{value:j(t,r,c)}),a}function f(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=l;var h="suspendedStart",p="suspendedYield",y="executing",v="completed",d={};function m(){}function g(){}function w(){}var b={};s(b,a,(function(){return this}));var E=Object.getPrototypeOf,S=E&&E(E(T([])));S&&S!==r&&n.call(S,a)&&(b=S);var _=w.prototype=m.prototype=Object.create(b);function O(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function r(o,i,a,c){var u=f(t[o],t,i);if("throw"!==u.type){var s=u.arg,l=s.value;return l&&"object"==x(l)&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(l).then((function(t){s.value=t,a(s)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var i;o(this,"_invoke",{value:function(t,n){function o(){return new e((function(e,o){r(t,n,e,o)}))}return i=i?i.then(o,o):o()}})}function j(e,r,n){var o=h;return function(i,a){if(o===y)throw Error("Generator is already running");if(o===v){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=A(c,n);if(u){if(u===d)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=v,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=y;var s=f(e,r,n);if("normal"===s.type){if(o=n.done?v:p,s.arg===d)continue;return{value:s.arg,done:n.done}}"throw"===s.type&&(o=v,n.method="throw",n.arg=s.arg)}}}function A(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator.return&&(r.method="return",r.arg=t,A(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),d;var i=f(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,d;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,d):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,d)}function N(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function F(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function G(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(N,this),this.reset(!0)}function T(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function r(){for(;++o<e.length;)if(n.call(e,o))return r.value=e[o],r.done=!1,r;return r.value=t,r.done=!0,r};return i.next=i}}throw new TypeError(x(e)+" is not iterable")}return g.prototype=w,o(_,"constructor",{value:w,configurable:!0}),o(w,"constructor",{value:g,configurable:!0}),g.displayName=s(w,u,"GeneratorFunction"),e.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},e.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,w):(t.__proto__=w,s(t,u,"GeneratorFunction")),t.prototype=Object.create(_),t},e.awrap=function(t){return{__await:t}},O(k.prototype),s(k.prototype,c,(function(){return this})),e.AsyncIterator=k,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new k(l(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},O(_),s(_,u,"Generator"),s(_,a,(function(){return this})),s(_,"toString",(function(){return"[object Generator]"})),e.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},e.values=T,G.prototype={constructor:G,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(F),!e)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=t)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var r=this;function o(n,o){return c.type="throw",c.arg=e,r.next=n,o&&(r.method="next",r.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var u=n.call(a,"catchLoc"),s=n.call(a,"finallyLoc");if(u&&s){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(u){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!s)throw Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,d):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),d},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),F(r),d}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;F(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:T(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),d}},e}function S(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var _=function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function a(t){try{u(n.next(t))}catch(t){i(t)}}function c(t){try{u(n.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,c)}u((n=n.apply(t,e||[])).next())}))},O="settings.requestingAccess",k=o.T.encloseNamespace(O);function j(){(0,E.W)(),(0,y.M)({title:k("pageTitle")});var t,e,r=i.a.useBasicFetch(h.N.currentUser()),o=r.data.customerId,x=i.a.useBasicFetch(r.data.customerId&&b.B.domains(o)),j=i.a.useGetFetchAsync(),A=(0,p.Z)(),N=(t=n.useState([]),e=2,function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,c=[],u=!0,s=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=i.call(r)).done)&&(c.push(n.value),c.length!==e);u=!0);}catch(t){s=!0,o=t}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return c}}(t,e)||function(t,e){if(t){if("string"==typeof t)return S(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?S(t,e):void 0}}(t,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.")}()),F=N[0],G=N[1];return x.hasCompleted?n.createElement(g.d,{heading:k("heading"),breadcrumbs:[k("breadcrumb")]},n.createElement(c.L,{active:"requesting-access",appLinks:w.W}),n.createElement("p",null,n.createElement(s.x,{namespace:O,phrase:"description"})," ",n.createElement(u.F,{appLink:{application:m.O.USER_MANAGER,action:d.e.UserManager.ACCESS_REQUESTS},className:"text-info"},n.createElement(s.x,{namespace:O,phrase:"manageRequests"}))),n.createElement(a.j,{initialValues:v.y.getInitialJoinRequests(x.data),onSaveChanges:function(t,e){var r;return _(this,void 0,void 0,L().mark((function n(){var i;return L().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return i=v.y.formatRequestData(x.data,t,f.W.Request),n.prev=1,n.next=4,j(b.B.updateDomains(o,i));case 4:A.success(k("success")),n.next=11;break;case 7:n.prev=7,n.t0=n.catch(1),(null===(r=n.t0.responseJSON)||void 0===r?void 0:r.problems)&&G(n.t0.responseJSON.problems),A.error(k("error"));case 11:return n.prev=11,e(),n.finish(11);case 14:case"end":return n.stop()}}),n,null,[[1,7,11,14]])})))},view:l.C.RequestingAccess,options:["none","allowed","any"],errors:F,appLinks:w.W})):n.createElement(n.Fragment,null)}}}]);
3
- //# sourceMappingURL=8687-549a2d9278-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8687-549a2d9278-lite.chunk.js","mappings":";u0OA4BMA,EAAY,4BACZC,EAAY,qBAAiCD,GAE7C,SAAUE,KACd,UAEA,OAAmB,CAAEC,MAAOF,EAAU,eAEtC,QAAMG,EAAc,kBAAkC,mBAC9CC,EAAeD,EAAYE,KAA3BD,WACFE,EAAU,kBACdH,EAAYE,KAAKD,YAAc,YAAuBA,IAElDG,EAAa,uBACbC,GAAS,SACgE,KAAjD,WAA8C,MAAG,s4BAAvEC,EAAM,KAAEC,EAAS,KAyBzB,OAAKJ,EAAQK,aAKX,gBAAC,IAAc,CACbC,QAASZ,EAAU,WACnBa,YAAa,CAACb,EAAU,gBAExB,gBAAC,IAAkB,CAACc,OAAO,oBAAoBC,SAAU,MACzD,yBACE,gBAAC,IAAI,CAAChB,UAAWA,EAAWiB,OAAO,gBAAgB,IAEnD,gBAAC,IAAO,CACNC,QAAS,CACPC,YAAa,iBACbC,OAAQ,iCAEVC,UAAU,aAEV,gBAAC,IAAI,CAACrB,UAAWA,EAAWiB,OAAO,qBAGvC,gBAAC,IAAyB,CACxBK,cAAe,2BAAgDf,EAAQD,MACvEiB,cAhDN,SACEC,EACAC,mIASE,OAPIC,EAAuB,sBAC3BnB,EAAQD,KACRkB,EACA,aACD,kBAGOhB,EAAkB,kBAA6BH,EAAYqB,IAAsB,OACvFjB,EAAOkB,QAAQ1B,EAAU,YAAY,iDAEf,QAAlB,OAAM2B,oBAAY,eAAEC,WACtBlB,EAAU,KAAMiB,aAAaC,UAE/BpB,EAAOqB,MAAM7B,EAAU,UAAU,QAExB,OAFwB,UAEjCwB,IAAS,2EAEZ,EA4BKM,KAAM,qBACNC,QAAS,CACP,OACA,UACA,OAEFtB,OAAQA,EACRM,SAAU,OAhCP,gCAoCX","sources":["file:///app/packages/projects/lite/src/apps/settings/views/requesting-access/RequestingAccessView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { DomainSettingsFormWrapper } from 'libs/shared/apps/domain-settings/domain-settings-form/DomainSettingsForm';\nimport { DomainSettingsTabs } from 'libs/shared/apps/domain-settings/domain-settings-tabs/DomainSettingsTabs';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\nimport { AccessType } from 'libs/shared/enums/AccessType';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser } from 'libs/shared/interfaces';\nimport { ApprovedDomain, DomainSettingsModel } from 'libs/shared/interfaces/domains/ApprovedDomain';\nimport { ApprovedDomainErrorResponse } from 'libs/shared/interfaces/domains/ApprovedDomainErrorResponse';\nimport { DomainSettingsFormHelper } from 'libs/shared/utils/DomainSettingsFormHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { AccessSettingsAppLinks } from 'apps/settings/constants/AccessSettingsAppLinks';\nimport { DomainRequests } from 'apps/settings/flight-requests/DomainRequests';\nimport { useDomainSettingsSwitch } from 'apps/settings/hooks/useDomainSettingsSwitch';\n\nconst namespace = 'settings.requestingAccess';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function RequestingAccessView() {\n useDomainSettingsSwitch();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const { customerId } = currentUser.data;\n const domains = Flight.useBasicFetch<ApprovedDomain[]>(\n currentUser.data.customerId && DomainRequests.domains(customerId)\n );\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n const [ errors, setErrors ] = React.useState<ApprovedDomainErrorResponse[]>([]);\n\n async function onSaveChanges(\n values: DomainSettingsModel,\n onDone: (options?: FormSubmissionOptions<DomainSettingsModel>) => void\n ) {\n const formattedRequestData = DomainSettingsFormHelper.formatRequestData(\n domains.data,\n values,\n AccessType.Request\n );\n \n try {\n await fetchAsync<any[]>(DomainRequests.updateDomains(customerId, formattedRequestData));\n alerts.success(getPhrase('success'));\n } catch (error) {\n if (error.responseJSON?.problems) {\n setErrors(error.responseJSON.problems);\n }\n alerts.error(getPhrase('error'));\n } finally {\n onDone();\n }\n }\n\n if (!domains.hasCompleted) {\n return <></>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <DomainSettingsTabs active='requesting-access' appLinks={AccessSettingsAppLinks}/>\n <p>\n <Text namespace={namespace} phrase='description' />\n &nbsp;\n <AppLink\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.ACCESS_REQUESTS\n }}\n className='text-info'\n >\n <Text namespace={namespace} phrase='manageRequests' />\n </AppLink>\n </p>\n <DomainSettingsFormWrapper\n initialValues={DomainSettingsFormHelper.getInitialJoinRequests(domains.data)}\n onSaveChanges={onSaveChanges}\n view={AccessSettingsGroup.RequestingAccess}\n options={[\n 'none',\n 'allowed',\n 'any'\n ]}\n errors={errors}\n appLinks={AccessSettingsAppLinks}\n />\n </SettingsLayout>\n );\n}\n"],"names":["namespace","getPhrase","RequestingAccessView","title","currentUser","customerId","data","domains","fetchAsync","alerts","errors","setErrors","hasCompleted","heading","breadcrumbs","active","appLinks","phrase","appLink","application","action","className","initialValues","onSaveChanges","values","onDone","formattedRequestData","success","responseJSON","problems","error","view","options"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/8856-02dd2e486c-lite.chunk.js","mappings":"oLAOM,SAAUA,EACdC,EACAC,EACAC,G,MAEMC,EAAc,kBAAkC,mBAEhDC,EAAsB,oBAA4CJ,GACtE,wBAAwCA,IAEpCK,EAAc,qBAA4D,QAAxB,EAAAD,EAAoBE,YAAI,eAAEC,gBAChF,gBAAgCH,EAAoBE,KAAKC,gBAErDC,IAAuBL,EAAYG,QAAUD,EAAYC,KAE/D,OAAO,kBAA2CE,GAChD,EAAAC,EAAA,qBACEL,EAAoBE,KAAKC,cACzBH,EAAoBE,KAAKI,GACzBP,EAAYG,KACZL,EACAC,GAEN,C,6DCrBMS,EAA4C,CAChDC,UAAW,YAUAC,EAAgB,CAC3BC,YAAW,SACTR,GAEA,MAAO,CACLS,IAAK,sBACLC,IAAK,kBACLC,KAAM,SACNX,KAAAA,EACAK,iBAAAA,EACAO,iBAAkB,CAAE,gBAAiB,8BAAF,OAAgCZ,EAAKa,WAE5E,EAEAC,YAAW,SACTC,EACAf,GAEA,MAAO,CACLS,IAAK,uBAAF,OAAyBM,GAC5BL,IAAK,kBACLC,KAAM,QACNX,KAAAA,EACAK,iBAAAA,EACAO,iBAAkB,CAAE,iCAAkC,YAAF,OAAcG,IAEtE,EAEAC,YAAW,SACTD,GAEA,MAAO,CACLJ,KAAM,WACNF,IAAK,uBAAF,OAAyBM,GAC5BL,IAAK,kBACLL,iBAAAA,EACAO,iBAAkB,CAAE,iCAAkC,gBAAiB,YAAF,OAAcG,IAEvF,EAEAE,SAAQ,SACNF,GAEA,MAAO,CACLN,IAAK,uBAAF,OAAyBM,GAC5BL,IAAK,YAAF,OAAcK,GACjBG,cAAe,YAAF,OAAcH,GAC3BJ,KAAM,QACNN,iBAAAA,EAEJ,EAEAc,cAAa,WACqB,IAAhCC,EAAA,uDAA8B,CAAC,EAEzBV,EAAMW,OAAOC,OAAOF,GAAQG,OAAOC,KAAK,KAE9C,MAAO,CACLf,IAAM,eAAqB,2BAA4BW,GACvDV,IAAK,iBAAF,OAAmBA,GACtBC,KAAM,QACNc,WAAW,EAEf,EAEAC,aAAY,SACVtB,GAEA,MAAO,CACLK,IAAK,eAAqB,qCAAsC,CAAEI,SAAUT,IAC5EM,IAAK,kCAAF,OAAoCN,GACvCC,iBAAAA,EAEJ,EAEAsB,gBAAe,SACb3B,GAEA,MAAO,CACLW,KAAM,SACNF,IAAK,eAAqB,qCAAsC,OAAF,UAAOT,IACrEU,IAAK,yCAAF,OAA2CV,EAAKa,UACnDD,iBAAkB,CAAC,kCAAD,OAAoCZ,EAAKa,UAAY,iBACvER,iBAAAA,EAEJ,EAEAuB,WAAU,SAACxB,GACT,MAAO,CACLK,IAAK,wBAAF,OAA0BL,EAAE,WAC/BM,IAAK,WAAF,OAAaN,GAChBqB,WAAW,EAEf,EAEAI,oBAAmB,SACjBhB,GAEA,MAAO,CACLJ,IAAK,+BAAF,OAAiCI,GACpCH,IAAK,8BAAF,OAAgCG,GACnCF,KAAM,QACNN,iBAAAA,EAEJ,EAEAyB,mBAAkB,SAACf,GACjB,MAAO,CACLN,IAAK,uBAAF,OAAyBM,EAAO,YACnCL,IAAK,mBAAF,OAAqBK,EAAO,YAC/BJ,KAAM,SAEV,EAEAoB,oBAAmB,SAAChB,GAClB,MAAO,CACLN,IAAK,uBAAF,OAAyBM,EAAO,YACnCL,IAAK,gBAAF,OAAkBK,EAAO,YAEhC,EAEAiB,iBAAgB,SAACC,GACf,MAAO,CACLxB,IAAK,oCAAF,OAAsCwB,GACzCvB,IAAK,wBAAF,OAA0BuB,GAEjC,E,yGCvHIC,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,IACZC,oBAAqB,KAGjB,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTf,GACAW,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,mBAMfA,IAAe,aAMfA,IAAe,cAUdD,EAAUL,YACb,aAAuB,IAAIQ,EAASR,YAN/BK,EAAUV,WACb,aAAuB,IAAIa,EAASb,UAAUI,SAX3CM,EAAUX,UACb,aAAuB,IAAIc,EAASd,UAPjCW,EAAUJ,qBACb,aAAuB,IAAI,KAvBvB,CA6CV,C,+vDCvFMQ,EAAa,GAkBb,SAAUC,EACdC,EACAC,GAEA,IAEMC,EAFS,UAA0BF,EAASF,GAE1BK,KAAI,SAAAC,GAAK,OAAIH,EAAW,SAAiBG,GAAO,IAElEC,EAAY,qBAA6BH,GAEzCI,EAAW,YAAoBD,EAAUzD,MACzC2D,EAAQF,EAAUzD,KAAK4D,OACzBF,EAASG,QAAO,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGC,EAAK3D,GAAK2D,GAAI,GAAK,CAAC,GAC/D,KAEJ,MAAO,CACLL,SAAAA,EACAC,MAAAA,EACAK,WAAYP,EAAUO,WACtBC,aAAcR,EAAUQ,aAE5B,CAQM,SAAUC,EACdC,EACAd,EACAe,GAEA,IAAMC,EAASD,QAAAA,EAAY,SAACE,GAC1B,MAAmB,WAAf,EAAOA,GACFA,EAAIlE,GAENkE,CACT,EAEM,EAA0BC,EAA8C,CAAElB,WAAAA,EAAYe,QAAAA,IAApFI,EAAU,EAAVA,WAAexE,EAAI,IAArB,gBASN,OAPA,aAAgB,YACTmE,aAAI,EAAJA,EAAMP,SAGXY,EAAWL,EACb,GAAG,CAACA,aAAI,EAAJA,EAAMZ,IAAIc,GAAQ7C,KAAK,OAEpBxB,CACT,CAWM,SAAUuE,EACdE,G,cAEMJ,EAAwB,QAAf,EAAAI,EAAQL,eAAO,QAAK,SAACE,GAClC,MAAmB,WAAf,EAAOA,GACFA,EAAIlE,GAENkE,CACT,EAEMI,EAAe,SAA0B,IAAIC,KACmB,G,EAApC,WAAiC,I,EAAG,E,unBAA9DrB,EAAQ,KAAEsB,EAAW,KAwBvBnB,EAAY,qBAAqCH,GACjDI,EAAW,YAAoBD,EAAUzD,MACzC2D,EAAQF,EAAUzD,KAAK4D,OACzBF,EAASG,QAAkC,SAACC,EAAKC,GAAI,OAAK,+BAAMD,GAAG,KAAGO,EAAON,GAAQA,GAAI,GAAK,CAAC,GAC/F,KAEJ,MAAO,CACLc,4BAAoD,QAAxB,EAAmB,QAAnB,EAAApB,EAAUA,iBAAS,eAAG,UAAE,eAAEQ,cACtDP,SAAAA,EACAC,MAAAA,EACAK,WAAYP,EAAUO,WACtBQ,WAjCF,SAAoBL,GAClB,GAAKA,aAAI,EAAJA,EAAMP,OAAX,CAGA,IAAMkB,EAA6B,GAEnCX,EAAKY,SAAQ,SAAAT,GACX,IAAM5D,EAAM2D,EAAOC,GAEfI,EAAaM,QAAQC,IAAIvE,KAG7BoE,EAAeI,KAAKZ,GACpBI,EAAaM,QAAQG,IAAIzE,GAC3B,IAEKoE,EAAelB,QAGpBgB,GAAY,SAAAQ,GAAC,kBAAUA,GAAC,EAAK,UAA4BN,EAAgB5B,GAAYK,IAAIkB,EAAQpB,aAAW,GAjBpG,CAkBV,EAeF,C,6DCjIA,SAASgC,EAAiBC,GACxB,OAAOA,EAAW/B,KAAI,SAAAe,GAAG,OAAIA,EAAIvB,UAAU,IAAEvB,KAAK,IACpD,CAGM,SAAU+D,EACdC,EACAC,EACAC,GAEA,IAAMJ,EAAaK,MAAMC,QAAQJ,GAAeA,EAAc,CAACA,IAE/D,IAAAK,YAAU,WACRP,EAAWP,SAAQ,SAAAT,IACjB,OAAgBA,EAAIvB,WAAY0C,EAAcC,EAChD,GACF,GAAG,CAAEL,EAAiBC,GAAaG,EAAcC,GACnD,C,mFCdMI,EAAYC,EAAA,mBADA,8BAWZ,SAAUC,EAAyBC,GACvC,MAAqB,kBAAjBA,EAAMC,OAEN,gBAACC,EAAA,EAAU,CAACC,UAAU,gCACpB,gBAACD,EAAA,QAAgB,CAACE,IAAKJ,EAAMK,qBAAsBC,KAAK,UACxD,gBAACJ,EAAA,OAAe,KACbL,EAAU,6BAKE,qBAAjBG,EAAMC,OAEN,gBAACC,EAAA,EAAU,CAACC,UAAU,gCACpB,gBAACD,EAAA,QAAgB,CAACE,IAAKJ,EAAMO,wBAAyBD,KAAK,UAC3D,gBAACJ,EAAA,OAAe,KACbL,EAAU,gCAME,iBAAjBG,EAAMC,OAEN,gBAACC,EAAA,EAAU,CAACC,UAAU,gCACpB,gBAACD,EAAA,QAAgB,CAACE,IAAKJ,EAAMQ,oBAAqBF,KAAK,UACvD,gBAACJ,EAAA,OAAe,KACbL,EAAU,4BAOjB,gBAACK,EAAA,EAAU,CAACC,UAAU,gCACpB,gBAACD,EAAA,QAAgB,CAACE,IAAKJ,EAAMS,mBAAoBH,KAAK,UACtD,gBAACJ,EAAA,UAAkB,KAChBL,EAAU,sBAEb,gBAACK,EAAA,OAAe,KACbL,EAAU,0BAInB,C,eC1DM,EAAY,6BAOZ,SAAUa,EAAiCV,GAC/C,SAASW,EAAaC,GACpB,IAAMC,EAAgBb,EAAMC,SAAWW,EAAiB,KAAOA,EAE/DZ,EAAMc,UAAUD,EAClB,CAMA,SAASE,EAAad,GACpB,MAAO,wBAAP,OALF,SAA0BA,GACxB,OAAOD,EAAMC,SAAWA,CAC1B,CAGiCe,CAAiBf,GAAU,qBAAuB,GACnF,CAEA,OACE,uBAAKE,UAAU,kCACb,qBAAGA,UAAU,WAAU,gBAACc,EAAA,EAAI,CAAC5G,UAAW,EAAW6G,OAAO,aAC1D,uBAAKf,UAAU,uCACb,0BAAQA,UAAWY,EAAa,iBAAkBI,QAAS,WAAF,OAAQR,EAAa,gBAAgB,GAC5F,gBAACM,EAAA,EAAI,CAAC5G,UAAW,EAAW6G,OAAO,wBAErC,0BAAQf,UAAWY,EAAa,oBAAqBI,QAAS,WAAF,OAAQR,EAAa,mBAAmB,GAClG,gBAACM,EAAA,EAAI,CAAC5G,UAAW,EAAW6G,OAAO,2BAErC,0BAAQf,UAAWY,EAAa,gBAAiBI,QAAS,WAAF,OAAQR,EAAa,eAAe,GAC1F,gBAACM,EAAA,EAAI,CAAC5G,UAAW,EAAW6G,OAAO,wBAK7C,C,+iCCnBA,IAAME,EAA8B,CAClCC,MAAO,GAAF,OAAK,eAAiB,+CAC3BC,OAAQ,GAAF,OAAK,WAAa,kBACxBC,UAAW,QACXC,WAAY,kDACZC,IAAK,SAGDC,EAAgC,CACpCJ,OAAQ,GAAF,OAAK,WAAa,YACxBC,UAAW,QACXC,WAAY,GAAF,OAAK,+BAAiC,2BAChDC,IAAK,GAAF,OAAK,QAAU,YAAI,gBACtBE,KAAM,sBA6BF,SAAUC,EAAoB5B,G,MAGjC,IAF6B,YAC5B,OAAgBA,EAAM6B,OAAQ,UAC/B,GAFOA,EAAM,KAAEC,EAAS,KAGqD,IAAhD,WAAiC9B,EAAM+B,UAAS,GAAtE9B,EAAM,KAAEa,EAAS,KAEnBkB,EAAM,SAA6B,MAEnCC,GAAe,QAAmBjC,EAAMkC,QAASlC,EAAMmC,eAA4B,QAAZ,EAAAnC,EAAMoC,cAAM,eAAEC,aACrFC,GAAgB,QACpBtC,EAAMlG,YACNkG,EAAMnG,oBACNmG,EAAMkC,SAyBR,SAAuBK,IACrB,QAAiBP,EAAIjD,QAASwD,EAChC,GAzBEvC,EAAMwC,cAEFzI,GAAO,QACXiG,EAAMlG,YACNkG,EAAMkC,QACNlC,EAAMwC,aACNxC,EAAMmC,eACNM,EAAA,QAAkBZ,GAClB5B,GAmBF,SAASyC,EAAWH,IAClB,QAAcP,EAAIjD,QAASwD,EAC7B,CAEA,OACE,6BACKvC,EAAMkC,QAAQS,SAAShF,QAAU,gBAAC+C,EAAgC,CAACT,OAAQA,EAAQa,UAAWA,KAE/F/G,EAAK4D,QACL,gBAACoC,EAAwB,CACvBU,mBAAoBT,EAAMS,mBAC1BD,oBAAqBR,EAAMQ,oBAC3BD,wBAAyBP,EAAMO,wBAC/BF,qBAAsBL,EAAMK,qBAC5BJ,OAAQA,MAITlG,EAAK4D,QACN,uBAAKqE,IAAKA,EAAK7B,UAAS,gBAAWpG,EAAK4D,OAAS,IAAH,OAAO,gBAAsB,KACzE,gBAACiF,EAAA,EAAK,CACJC,QAASZ,EACTlI,KAAMA,EACN+I,MAAO1B,EACP2B,YAxCV,SAAyB,GAA4C,IAA1CC,EAAQ,EAARA,SACzBhD,EAAMiD,mBAAmBD,EAASE,KAAMlD,EAAMnG,oBAAoBM,GACpE,EAuCUgJ,eAAgB,SAAA1B,GAAG,OAAIiB,EAAWjB,EAAIc,MAAM,EAC5Ca,gBAAiB,WAAF,OAAQV,GAAY,EACnCW,YAAU,EACVC,YAAU,EACVC,OAAQzB,EACR0B,cAAe3B,IAEjB,gBAACe,EAAA,EAAK,CACJC,QAASP,EACTvI,KAAMA,EACN+I,MAAOpB,EACP+B,cAAY,EACZC,gBAAqC,EAApB,KACjBC,aAlDV,SAAiChC,GAC/B3B,EAAMiD,mBACJtB,EAAKF,IAAIuB,SAASE,KAClBlD,EAAMnG,oBAAoBM,GAC1BwH,EAAKiC,OAAOzJ,GAEhB,EA6CU0J,yBAAyB,8CAMrC,C,eCvJA,SAAgB,gBAAkB,SCG5B,SAAUC,IACd,OACE,2BACE,uBAAK3D,UAAU,kCACb,qBAAGA,UAAU,gDAA8C,KAC3D,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,MAE3D,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,MAE3D,uBAAKA,UAAU,SACb,uBAAKA,UAAU,4CAA0C,QAI/D,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,UACb,uBAAKA,UAAS,UAAK,kBAAsB,2CAKnD,CCAM,SAAU4D,EAA4B/D,GAC1C,OACE,iCACIA,EAAMgE,eACN,gBAACF,EAAkC,MAGpC9D,EAAMgE,eACL,gBAACpC,EAAmB,CAClB9H,YAAakG,EAAMlG,YACnBD,oBAAqBmG,EAAMnG,oBAC3BqI,QAASlC,EAAMkC,QACfM,aAAcxC,EAAMjC,WACpBkF,mBAAoBjD,EAAMiD,mBAC1BxC,mBAAoBwD,EAAA,wBACpBpC,OAAQ7B,EAAM6B,OACdE,SAAU/B,EAAM+B,SAChBI,eAAgBnC,EAAMmC,eACtB9B,qBAAsB4D,EAAA,kBACtB1D,wBAAyB0D,EAAA,qBACzBzD,oBAAqByD,EAAA,+BACrB7B,OAAQpC,EAAMoC,SAKxB,C,kSC5CM,SAAU8B,EAAgBpJ,G,MACxBqJ,EAAe,kBAAoC,oBAA8BrJ,IAUvF,MAAO,CACL4C,OATsC,QAAjB,EAAAyG,EAAapK,YAAI,eACpC6D,QAAiC,SAACwG,EAAMC,GACxC,OAAO,OAAP,wBACKD,I,EAAI,G,EACNC,EAAKC,U,EAVL,CAAEA,WADSC,EAWiBF,GAVHC,UAAWE,KAAMD,EAAYE,c,gYAD3CF,CAahB,GAAG,CAAC,KAGqB,CAAC,EAC1BvG,aAAcmG,EAAanG,aAE/B,C,qGCdM,SAAU0G,EAA6B5J,G,YACrC6J,EAAQ,kBAERC,EAAQ,kBAA4B,aAAuB9J,IAE3D+J,GAAwB,QAAV,EAAAD,EAAM7K,YAAI,eAAEW,QAAS,gBACsC,QAA7E,EAAsB,QAAtB,EAAU,QAAV,EAAAkK,EAAM7K,YAAI,eAAE+K,kBAAU,eAAEC,MAAK,SAAA5F,GAAC,OAAIA,EAAE6F,kBAAoB,aAAoB,WAAC,eAAEC,aAE3E7H,EAAa,SAAC8H,GAAc,OAAK,yBAAuCL,EAAaK,EAAO,EAC5FC,GAAS,OAAkBN,GAAezH,GAAY,SAAA8H,GAAM,OAAIP,EAAMvH,EAAW8H,GAAQ,IAE/F,OAAO,OAAP,wBACKC,GAAM,CACTnH,cAAe6G,GAAeM,EAAOnH,cAEzC,C,6MCdA,IAAMoH,EAAiD,CACrD,CACEjL,GAAI,IACJkL,SAAU,CAAC,CAAElL,GAAI,IAAKmL,WAAY,EAAGC,QAAS,OAI5C,SAAUC,EAA8B1K,G,QACtC8J,EAAQ,kBAA4B,aAAuB9J,IAC3DoH,GAAU,OAAqC,QAAV,EAAA0C,EAAM7K,YAAI,eAAEa,SAAU,MAAM,GAEjEuJ,GAAe,OAAgBrJ,GAE/B2K,GAAoB,OAA6B3K,IAEvD,OAAqBoH,GAErB,IAAMlE,EACJkE,EAAQlE,cACRmG,EAAanG,cACbyH,EAAkBzH,aAGpB,IAAKA,EACH,MAAO,CACLjE,KAAM,KACNiE,cAAc,GAIlB,I,EAAM0H,EAAc,IAAIhH,IAClBiE,EAAWT,EAAQnI,KAAK4I,SAASrF,KAAI,SAAAqI,GACzC,OAAIA,EAAEzC,MACJwC,EAAYxG,IAAIyG,EAAEzC,KAAK/I,IAChBwL,GAOF,OAAP,wBACKA,GAAC,CACJzC,KAAMiB,EAAazG,MAAMiI,EAAErB,YAAc,CAAEA,UAAWqB,EAAErB,YAE5D,IAYA,OAN4B,QAAxB,EAAAmB,aAAiB,EAAjBA,EAAmB/H,aAAK,eAAEC,SAC5BgF,EAAS1D,KAAI,MAAb0D,E,+CAAiB8C,EAAkB/H,MAChCuC,QAAO,SAAA0F,GAAC,OAAKD,EAAY1G,IAAI2G,EAAExL,GAAG,IAClCmD,KAAI,SAAA4F,GAAI,MAAK,CAAEA,KAAAA,EAAMhB,QAASkD,EAA2B,M,mjBAGvD,CACLpH,aAAAA,EACAjE,KAAM,OAAF,wBACCmI,EAAQnI,MAAI,CACf4I,SAAAA,IAGN,C,kUCxEaiD,EASK,SAAC9K,EAAiBJ,GAChC,MAAO,CACLF,IAAK,yCAAF,OAA2CM,EAAO,wBAAgBJ,GACrED,IAAK,oCAAF,OAAsCK,EAAO,YAAIJ,GACpDc,WAAW,EAEf,EAfWoK,EAiBC,SAAC9K,GACX,MAAO,CACLN,IAAK,yCAAF,OAA2CM,EAAO,aACrDL,IAAK,gCAAF,OAAkCK,GACrCU,WAAW,EAEf,EAvBWoK,EAyBY,SAAC9K,GACtB,MAAO,CACLN,IAAK,yCAAF,OAA2CM,EAAO,yBACrDL,IAAK,4CAAF,OAA8CK,GACjDU,WAAW,EAEf,E,qBCzBI,SAAUqK,EAAqB/K,G,QAC7BgL,EAAa,kBACjBF,EAAkC9K,IAG9BqJ,GAAe,EAAAD,EAAA,GAAgBpJ,GAE/BiL,GAAyB,QAAf,EAAAD,EAAW/L,YAAI,eAAEuD,KAAI,SAAA0I,GAAC,OAAIA,EAAEC,MAAM,IAAEhG,QAAO,SAAA9F,GAAE,QAAMA,CAAE,MAAK,GACpE+L,GAAQ,QAAwBH,EAASI,EAAA,WAEzCC,EAAU,OAAH,wBACRjC,EAAazG,OACbwI,EAAMxI,OAGL2I,EAAyB,QAAf,EAAAP,EAAW/L,YAAI,eAAEuD,KAAI,SAAAgJ,GACnC,IAAMpD,EAAOkD,EAAQE,EAAEL,QAAUK,EAAEhC,YAAc,CAAEA,UAAWgC,EAAEhC,WAChE,OAAO,+BAAKpB,GAAI,CAAEqD,WAAYD,EAAEE,gBAClC,IAEA,MAAO,CACLV,WAAYA,EAAW/L,KACvBmM,MAAOG,EACPrI,aACE8H,EAAW9H,cACXmG,EAAanG,iBACX+H,aAAO,EAAPA,EAASpI,SAAUuI,EAAMlI,cAGjC,C,+HCLA,IACM6B,EAAYC,EAAA,mBADA,0BAOZ,SAAU2G,EAAoBzG,G,cAC3BmC,G,GAAkB,OAAsB,qB,EAA8B,E,o4BAAxD,IAErB,EAAAuE,EAAA,KAEA,IAAQC,GAAmB,EAAAC,EAAA,KAAnBD,eAEF/B,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE+J,EAAcgC,EAAA,0BAAoCjC,EAAM7K,MACxD+M,EAAY,kBAAgCjC,GAAekC,EAAA,eAA+BlC,IAE1FY,GAAoB,EAAAf,EAAA,GAA6B1E,EAAMlF,SAEvDkM,EAAepC,EAAM7K,MAAQkN,EAAA,kBAA4BrC,EAAM7K,KAAKa,SAAUgK,EAAM7K,KAAKmN,cACzFC,EAAQ,kBAAiCH,GAEzC5E,EAAS,kBAA6BgF,EAAA,YACtCxN,EAAc,kBAAkCuM,EAAA,iBAChDkB,EAAa,kBACjBzN,EAAYG,MAAQuN,EAAA,aAA4B1N,EAAYG,KAAKwN,aAG7DC,EAAsB,kBAC1B5B,EAA6C5F,EAAMlF,UAGrD,EAA4C+K,EAAqB7F,EAAMlF,SAA/DoL,EAAK,EAALA,MAAOJ,EAAU,EAAVA,WAAY9H,EAAY,EAAZA,aAErByJ,EAAkB,kBACtB7B,EAAsC5F,EAAMlF,QAAS,eAGjD4M,EAAU,mBACJ,QAAV,EAAA9C,EAAM7K,YAAI,eAAEa,WACZ+M,EAAA,gBAA6B/C,EAAM7K,KAAKa,SAAUgN,EAAA,kBAGpD,EAAAC,EAAA,GAAmB,CAAEC,MAAOX,EAAMpN,KAAO8F,EAAU,YAAa,CAAEsH,MAAiB,QAAV,EAAAA,EAAMpN,YAAI,eAAEyK,OAAU,QAC/F,OAAqB,CAAEI,EAAOuC,IAE9B,IAAMnD,EACJY,EAAM5G,cACNmJ,EAAMnJ,cACNoE,EAAOpE,cACPwJ,EAAoBxJ,cACpByJ,EAAgBzJ,cAChB0J,EAAQ1J,cACRqJ,EAAWrJ,aASb,OACE,uBAAKmC,UAAU,QACb,gBAAC4H,EAAA,EAAc,CACbZ,MAAOA,EAAMpN,KACbiO,KAXN,W,MACE,OAAc,QAAV,EAAApD,EAAM7K,YAAI,eAAEmN,gBAAiBe,EAAA,eACxB,QAA2BrD,EAAM7K,KAAM,YAEzC,QAAqB6K,EAAM7K,KAAM,UAC1C,CAMYmO,GACNC,aAAcxB,EAAeyB,EAAA,yBAC7BC,gBAA4B,QAAX,EAAAjG,EAAOrI,YAAI,eAAEsO,gBAC9BzD,MAAOA,EAAM7K,KACbsN,WAAYA,EAAWtN,KACvB+M,UAAWA,EAAU/M,OAEvB,gBAACuO,EAAA,EAAe,CACdd,oBAAqBA,EAAoBzN,KACzCwO,qBAAsBzC,EACtBuB,WAAYI,EAAgB1N,KAC5BqI,OAAQA,EAAOrI,KACfmM,MAAOA,EACPwB,QAASA,EAAQ3N,KACjBiK,cAAeA,EACfwE,gBAAiBxK,EACjBmE,eAAgBA,EAChBsD,kBAAmBA,EAAkB/H,QAI7C,C,sJC5FA,IACM,EAAYoC,EAAA,mBADA,4CAOZ,SAAU2I,EAAgCzI,G,gBACvCmC,G,GAAkB,OAAsBuG,EAAA,mB,EAAoC,E,o4BAA9D,IAErB,EAAAhC,EAAA,KAEA,IAAQC,GAAmB,EAAAC,EAAA,KAAnBD,eAEFvE,EAAS,kBAA6BgF,EAAA,YACtCxN,EAAc,kBAAkCuM,EAAA,iBAChDkB,EAAa,kBACjBzN,EAAYG,MAAQuN,EAAA,aAA4B1N,EAAYG,KAAKwN,aAG7D3C,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE+J,EAAcgC,EAAA,0BAAoCjC,EAAM7K,MACxD+M,EAAY,kBAAgCjC,GAAekC,EAAA,eAA+BlC,IAE1FY,GAAoB,EAAAf,EAAA,GAA6B1E,EAAMlF,SAEvDjB,EAAsB,mBAChB,QAAV,EAAA+K,EAAM7K,YAAI,eAAEa,WACZ+N,EAAA,sBAAwC/D,EAAM7K,KAAKa,WAG/Cd,EAAc,mBACM,QAAxB,EAAAD,EAAoBE,YAAI,eAAEC,gBAC1B2O,EAAA,cAAgC9O,EAAoBE,KAAKC,gBAGrDkI,GAAU,EAAAsD,EAAA,GAA8BxF,EAAMlF,SAE9CgL,EAAa,kBACjBF,EAAkC5F,EAAMlF,UAGpC0M,EAAsB,kBAC1B5B,EAA6C5F,EAAMlF,UAG/C8N,EAAU,kBACdhD,EAAsC5F,EAAMlF,QAAS,aAGvD,EAAA+M,EAAA,GAAmB,CAAEC,MAAOjO,EAAoBE,KAAO,EAAU,YAAa,CAAEoN,MAA+B,QAAxB,EAAAtN,EAAoBE,YAAI,eAAEyK,OAAU,QAE3H,OAAqB,CAAEI,EAAO9K,EAAaD,IAE3C,IAAMmK,EACJ5B,EAAOpE,cACPnE,EAAoBmE,cACpBlE,EAAYC,MACZyN,EAAoBxJ,cACpB8H,EAAW9H,cACX4K,EAAQ5K,cACRkE,EAAQlE,cACRqJ,EAAWrJ,aAEP6K,EC1FF,SAAyCjE,EAAczJ,GAC3D,MAAO,CACL2N,gBAAgB,QAA2BlE,EAAOzJ,GAClD4N,kBAAkB,QAA4BnE,EAAOzJ,GACrD6N,gBAAgB,QAA0BpE,EAAOzJ,GAErD,CDoFsC8N,CAA+BrE,EAAM7K,MAEzE,OACE,uBAAKoG,UAAU,QACb,gBAAC4H,EAAA,EAAc,CACbZ,MAAOtN,EAAoBE,KAC3BiO,MAAM,QAA2BpD,EAAM7K,KAAM,YAC7CoO,aAAcxB,EAAeyB,EAAA,yBAC7BC,gBAA4B,QAAX,EAAAjG,EAAOrI,YAAI,eAAEsO,gBAC9BzD,MAAOA,EAAM7K,KACbsN,WAAYA,EAAWtN,KACvB+M,UAAWA,EAAU/M,OAGvB,gBAACmP,EAAA,EAA2B,CAC1B1B,oBAAqBA,EAAoBzN,KACzCwO,qBAAsBzC,EAAW/L,KACjCD,YAAaA,EAAYC,KACzBF,oBAAqBA,EAAoBE,KACzC8O,4BAA6BA,EAC7BpD,kBAAmBA,EAAkB/H,MACrCwE,QAASA,EAAQnI,KACjB6O,QAASA,EAAQ7O,KACjBqI,OAAQA,EAAOrI,KACfoI,eAAgBA,EAChB6B,cAAeA,EACfY,MAAOA,EAAM7K,OAIrB,C,qHElGA,IACM,EAAY+F,EAAA,mBADA,2CASZ,SAAUqJ,EAAiCnJ,G,kBACxCmC,G,GAAkB,OAAsBuG,EAAA,mB,EAAoC,E,o4BAA9D,IAErB,EAAAhC,EAAA,KAEA,IAAQC,GAAmB,EAAAC,EAAA,KAAnBD,eAEF/M,EAAc,kBAAkCuM,EAAA,iBAChD/D,EAAS,kBAA6BgF,EAAA,YACtCC,EAAa,kBACjBzN,EAAYG,MAAQuN,EAAA,aAA4B1N,EAAYG,KAAKwN,aAG7D3C,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE+J,EAAcgC,EAAA,0BAAoCjC,EAAM7K,MACxD+M,EAAY,kBAAgCjC,GAAekC,EAAA,eAA+BlC,IAE1FhL,EAAsB,mBAChB,QAAV,EAAA+K,EAAM7K,YAAI,eAAEa,WACZ+N,EAAA,sBAAkD,QAAV,EAAA/D,EAAM7K,YAAI,eAAEa,WAGhDd,EAAc,mBAA0D,QAAxB,EAAAD,EAAoBE,YAAI,eAAEC,gBAC9E2O,EAAA,cAAgC9O,EAAoBE,KAAKC,gBAErDkI,GAAU,EAAAsD,EAAA,GAA8BxF,EAAMlF,UAGpD,EAAA+M,EAAA,GAAmB,CAAEC,MAAOjO,EAAoBE,KAAO,EAAU,YAAa,CAAEoN,MAA+B,QAAxB,EAAAtN,EAAoBE,YAAI,eAAEyK,OAAU,QAC3H,OAAqB,CAAEI,EAAO9K,EAAaD,IAE3C,IAAMmK,EAAgBlK,EAAYC,MAAQF,EAAoBE,QAAUmI,EAAQnI,QAAUsN,EAAWtN,KAErG,OACE,uBAAKoG,UAAU,QACb,gBAAC4H,EAAA,EAAc,CACbC,MAAM,QAA2BpD,EAAM7K,KAAM,aAC7CoN,MAAOtN,EAAoBE,KAC3BoO,aAAcxB,EAAeyB,EAAA,yBAC7BC,gBAA4B,QAAX,EAAAjG,EAAOrI,YAAI,eAAEsO,gBAC9BzD,MAAOA,EAAM7K,KACbsN,WAAYA,EAAWtN,KACvB+M,UAAWA,EAAU/M,OAGvB,gBAACqP,EAAA,EAA4B,CAC3BtP,YAAaA,EAAYC,KACzBF,oBAAqBA,EAAoBE,KACzCsP,cAAerJ,EAAMqJ,cACrBjH,OAAQA,EAAOrI,KACf8H,OAAQ7B,EAAM6B,OACd9D,YAAamE,EAAQlE,cAAgBlE,EAAYiE,WACjDoE,eAAgBA,EAChBD,QAASA,EAAQnI,KACjBiK,cAAeA,IAIvB,C,2IChEA,IACM,EAAYlE,EAAA,mBADA,wCASZ,SAAUwJ,GAAgCtJ,G,gBACvCmC,G,GAAkB,OAAsBuG,EAAA,mB,EAAoC,E,o4BAA9D,GAEb/B,GAAmB,EAAAC,EAAA,KAAnBD,eAEF/M,EAAc,kBAAkCuM,EAAA,iBAChD/D,EAAS,kBAA6BgF,EAAA,YACtCC,EAAa,kBACjBzN,EAAYG,MAAQuN,EAAA,aAA4B1N,EAAYG,KAAKwN,aAG7D3C,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE+J,EAAcgC,EAAA,0BAAoCjC,EAAM7K,MACxD+M,EAAY,kBAAgCjC,GAAekC,EAAA,eAA+BlC,IAE1FhL,EAAsB,mBAChB,QAAV,EAAA+K,EAAM7K,YAAI,eAAEa,WACZ+N,EAAA,sBAAwC/D,EAAM7K,KAAKa,WAG/Cd,EAAc,mBAA0D,QAAxB,EAAAD,EAAoBE,YAAI,eAAEC,gBAC9E2O,EAAA,cAAgC9O,EAAoBE,KAAKC,gBAErDkI,GAAU,EAAAsD,EAAA,GAA8BxF,EAAMlF,SAE9CkJ,EAAgBlK,EAAYC,MAAQF,EAAoBE,QAAUmI,EAAQnI,QAAUsN,EAAWtN,KAsBrG,OApBA,EAAA8N,EAAA,GAAmB,CAAEC,MAAOjO,EAAoBE,KAAO,EAAU,YAAa,CAAEoN,MAA+B,QAAxB,EAAAtN,EAAoBE,YAAI,eAAEyK,OAAU,QAC3H,OAAqB,CAAEI,EAAO9K,EAAaD,IAoBzC,uBAAKsG,UAAU,QACb,gBAAC4H,EAAA,EAAc,CACbC,MAAM,QAA2BpD,EAAM7K,KAAM,WAC7CoN,MAAOtN,EAAoBE,KAC3BoO,aAAcxB,EAAeyB,EAAA,yBAC7BC,gBAA4B,QAAX,EAAAjG,EAAOrI,YAAI,eAAEsO,gBAC9BzD,MAAOA,EAAM7K,KACbsN,WAAYA,EAAWtN,KACvB+M,UAAWA,EAAU/M,OAGvB,gBAACgK,EAAA,EAA2B,CAC1BlK,oBAAqBA,EAAoBE,KACzCkJ,mBA/BN,SACEC,EACAzJ,EACA4P,GAEA,eAA2B,CACzBE,YAAa,cACbC,OAAQ,yCACRrO,OAAQ,CACNsO,UAAWvG,EAAK/I,GAChBW,QAASkF,EAAMlF,QACfuO,cAAAA,EACA/E,UAAWpB,EAAKoB,YAGtB,EAiBMxK,YAAaA,EAAYC,KACzBmI,QAASA,EAAQnI,KACjBgI,SAAU/B,EAAM+B,SAChBF,OAAQ7B,EAAM6B,OACd9D,YAAamE,EAAQlE,aACrBmE,eAAgBA,EAChB6B,cAAeA,EACf5B,OAAQA,EAAOrI,OAIvB,C,4ECxGM,GAAY+F,EAAA,mBADA,oCAYZ,SAAU4J,GAA0B1J,G,MAClC2J,GAAmC,QAAd,EAAA3J,EAAM2C,gBAAQ,eAAE1C,QAAO,SAAA2J,GAAU,MAAC,QAAiB,QAAhB,EAAA5J,EAAM6J,kBAAU,eAAEC,SAASF,EAAQzP,IAAG,MAAK,GAEzG,OACE,gBAAC4P,GAAA,EAAW,CACVjC,MAAO,GAAU,SACjBkC,QAAS,aACTC,aAAa,2BAEb,gBAACC,GAAA,EAAkB,CACjBvH,SAAUgH,EACVtH,YAAarC,EAAMqC,YACnB8H,SAAUnK,EAAMmK,SAChBC,YAAa,GAAU,mBACvBjI,eAAgBnC,EAAMmC,iBAI9B,CC9BA,IACM,GAAYrC,EAAA,mBADA,iCAWZ,SAAUuK,GAAuBrK,GACrC,OACE,gBAAC+J,GAAA,EAAW,CACVjC,MAAO,GAAU,SACjBkC,QAAS,WACTC,aAAa,8BACbK,MAAOtK,EAAM2C,SAAShF,QAEtB,gBAACuM,GAAA,EAAkB,CACjBvH,SAAU3C,EAAM2C,SAChBN,YAAarC,EAAMqC,YACnB8H,SAAUnK,EAAMmK,SAChBC,YAAa,GAAU,mBACvBG,QAASvK,EAAMgJ,eACfwB,YAAa,GAAU,WACvBrI,eAAgBnC,EAAMmC,iBAI9B,C,mDCvCA,SAAkC,QCG5B,SAAUsI,KACd,OACE,2BACE,sBAAItK,UAAU,sCAAoC,KAClD,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,UACb,uBAAKA,UAAS,UAAK,GAAsB,2CAI7C,sBAAIA,UAAU,sCAAoC,KAClD,uBAAKA,UAAU,gBACb,uBAAKA,UAAU,SACb,uBAAKA,UAAS,UAAK,GAAsB,0CAE3C,uBAAKA,UAAU,SACb,uBAAKA,UAAS,UAAK,GAAsB,2CAKnD,CCLA,IAAM,GAAY,iCAiBZ,SAAUuK,GAAsB1K,G,UAC9B2K,EAAU3K,EAAMgE,kBAAgC,QAAb,EAAAhE,EAAMqG,eAAO,eAAE1I,QAExD,SAASiN,IACP,OAAK5K,EAAMqG,QAEJjL,OAAOC,OAAO2E,EAAMqG,SAFA,EAG7B,CAEA,OACE,iCACIrG,EAAMgE,eAAiB,gBAACyG,GAA4B,MAErDzK,EAAMgE,eACL,gBAAC6G,GAAA,EAAiB,CAAC1D,MAAOnH,EAAMmH,MAAOwD,QAASA,EAAS/F,MAAO5E,EAAM4E,OACpE,2BAASzE,UAAU,QACjB,sBAAIA,UAAU,MACZ,gBAACc,GAAA,EAAI,CAAC5G,UAAW,GAAW6G,OAAO,mBACnC,iCAAS0J,IAAkBjN,OAAQqC,EAAMyF,kBAAoB,IAAH,OAAOzF,EAAMyF,kBAAkB9H,QAAW,KAEtG,uBAAKwC,UAAU,cACa,QAAvB,EAAAH,EAAMyF,yBAAiB,eAAE9H,SAC1B,uBAAKwC,UAAU,iBACb,gBAACuJ,GAAyB,CACxB/G,SAAU3C,EAAMyF,kBAChBoE,WAAyB,QAAb,EAAA7J,EAAMqG,eAAO,eAAE/I,KAAI,SAAA0I,GAAC,OAAIA,EAAE7L,EAAE,IACxCkI,YAAarC,EAAMoC,OAAOC,YAC1B2G,eAAgBhJ,EAAM8K,sBAAsB9B,eAC5CmB,SAAUlG,GAAA,kBACV9B,eAAgBnC,EAAMmC,kBAI5B,uBAAKhC,UAAU,iBACb,gBAACkK,GAAsB,CACrB1H,SAAUiI,IACVvI,YAAarC,EAAMoC,OAAOC,YAC1B2G,eAAgBhJ,EAAM8K,sBAAsB9B,eAC5CmB,SAAUlG,GAAA,kBACV9B,eAAgBnC,EAAMmC,oBAK9B,2BAAShC,UAAU,QACjB,sBAAIA,UAAU,MACZ,gBAACc,GAAA,EAAI,CACH5G,UAAW,GACX6G,OAAQlB,EAAM+K,cAAgB,kBAAoB,gBAGtD,uBAAK5K,UAAU,WACb,uBAAKA,UAAU,mBACb,gBAAC6K,GAAA,EAAc,CACbpC,QAAS5I,EAAM4I,WAGnB,uBAAKzI,UAAU,mBACb,gBAAC8K,GAAA,EAAc,CACbnF,WAAY9F,EAAMwH,oBAClBwB,eAAgBhJ,EAAM8K,sBAAsB9B,eAC5CxC,gBAAgB,QAAkBxG,EAAMuI,4BAS1D,C,uGC3EA,IACM,GAAYzI,EAAA,mBADA,sCAOZ,SAAUoL,GAA0BlL,G,YACjCmC,G,GAAkB,OAAsBuG,EAAA,mB,EAAoC,E,s4BAA9D,IAErB,EAAAhC,EAAA,KAEA,IAAQqE,GAAkB,EAAAI,GAAA,GAAY,MAA9BJ,cAEApE,GAAmB,EAAAC,EAAA,KAAnBD,eAEFvE,EAAS,kBAA6BgF,EAAA,YACtCxN,EAAc,kBAAkCuM,EAAA,iBAChDkB,EAAa,kBACjBzN,EAAYG,MAAQuN,EAAA,aAA4B1N,EAAYG,KAAKwN,aAG7D3C,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE+J,EAAcgC,EAAA,0BAAoCjC,EAAM7K,MACxD+M,EAAY,kBAAgCjC,GAAekC,EAAA,eAA+BlC,IAE1FY,GAAoB,EAAAf,EAAA,GAA6B1E,EAAMlF,SAEvDkM,EAAepC,EAAM7K,MAAQkN,EAAA,kBAA4BrC,EAAM7K,KAAKa,SAAUgK,EAAM7K,KAAKmN,cACzFC,EAAQ,kBAAiCH,IAE/C,EAAAa,EAAA,GAAmB,CAAEC,MAAOX,EAAMpN,KAAO,GAAU,YAAa,CAAEoN,MAAiB,QAAV,EAAAA,EAAMpN,YAAI,eAAEyK,OAAU,QAC/F,OAAqB,CAAEI,EAAOuC,IAE9B,IAAMrB,EAAa,kBACjBF,EAAkC5F,EAAMlF,UAGpC0M,EAAsB,kBAC1B5B,EAA6C5F,EAAMlF,UAG/C8N,EAAU,kBACdhD,EAAsC5F,EAAMlF,QAAS,YAGvD,EAAgC+K,EAAqB7F,EAAMlF,SAAnDoL,EAAK,EAALA,MAAOlI,EAAY,EAAZA,aAETgG,EACJ5B,EAAOpE,cACPmJ,EAAMnJ,cACN8H,EAAW9H,cACXwJ,EAAoBxJ,cACpB4K,EAAQ5K,cACRqJ,EAAWtN,MACXiE,EAEI8M,ECpFF,SAAmClG,GACvC,MAAO,CACLoE,gBAAgB,QAA0BpE,ODkFdwG,GChFhC,CDgFgCA,CAAyBxG,EAAM7K,MAE7D,OACE,uBAAKoG,UAAU,QACb,gBAAC4H,EAAA,EAAc,CACbZ,MAAOA,EAAMpN,KACb+M,UAAWA,EAAU/M,KACrBiO,MAAM,QAAqBpD,EAAM7K,KAAM,YACvCoO,aAAcxB,EAAeyB,EAAA,yBAC7BC,gBAA4B,QAAX,EAAAjG,EAAOrI,YAAI,eAAEsO,gBAC9BzD,MAAOA,EAAM7K,KACbsN,WAAYA,EAAWtN,OAGzB,gBAAC2Q,GAAqB,CACpB1G,gBAAiBA,EACjB+G,cAAeA,EACf5I,eAAgBA,EAChB2I,sBAAuBA,EACvB1I,OAAQA,EAAOrI,KACfoN,MAAOA,EAAMpN,KACb0L,kBAAmBA,EAAkB/H,MACrC2I,QAASH,EACTqC,qBAAsBzC,EAAW/L,KACjCyN,oBAAqBA,EAAoBzN,KACzC6K,MAAOA,EAAM7K,KACb6O,QAASA,EAAQ7O,OAIzB,C,0nBE/FA,IAAMsR,GAAc,YACjBpD,EAAA,QAAmB,CAClBqD,SAAU,SAAAC,GAAG,OAAI,gBAACL,GAAyB,CAACpQ,QAASyQ,EAAI3G,MAAM9J,SAAW,EAC1E0Q,QAAS,SAAAD,GAAG,OAAI,gBAAC9E,EAAmB,CAAC3L,QAASyQ,EAAI3G,MAAM9J,SAAW,IAEpEmN,EAAA,OAAkB,CACjBqD,SAAU,SAAAC,GAAG,OAAI,gBAACL,GAAyB,CAACpQ,QAASyQ,EAAI3G,MAAM9J,SAAW,EAC1E0Q,QAAS,SAAAD,GAAG,OAAI,gBAAC9E,EAAmB,CAAC3L,QAASyQ,EAAI3G,MAAM9J,SAAW,IAEpEmN,EAAA,cAAyB,CACxBqD,SAAU,SAAAC,GAAG,OAAI,gBAAC9C,EAA+B,CAAC3N,QAASyQ,EAAI3G,MAAM9J,SAAW,EAChF0Q,QAAS,SAAAD,GAAG,OAAI,gBAAC9E,EAAmB,CAAC3L,QAASyQ,EAAI3G,MAAM9J,SAAW,EACnE2Q,UAAW,SAAAF,GAAG,OACZ,gBAACpC,EAAgC,CAC/BE,cAAekC,EAAIlC,cACnBxH,OAAQ0J,EAAI1J,OACZ/G,QAASyQ,EAAI3G,MAAM9J,SACnB,EAEJoH,QAAS,SAAAqJ,GAAG,OACV,gBAACjC,GAA+B,CAC9BvH,SAAUwJ,EAAIxJ,SACdF,OAAQ0J,EAAI1J,OACZ/G,QAASyQ,EAAI3G,MAAM9J,SACnB,IClBF,SAAU4Q,GAAiB1L,GAC/B,IAAM4E,EAAQ,kBAA4BtK,EAAA,WAAuB0F,EAAMlF,UAEjE6Q,EDyBF,SAA0BnN,G,MACtBoG,EAAepG,EAAfoG,MAAOgH,EAAQpN,EAARoN,IACTC,EAA4C,QAAnC,EAAAR,GAAezG,aAAK,EAALA,EAAOsC,qBAAa,eAAG0E,GAErD,OAAIC,EACKA,EAAOrN,GAET,gCACT,CCjCesN,CAAgB,CAC3BlH,MAAOA,EAAM7K,KACb6R,IAAK5L,EAAM4L,IACXvC,cAAerJ,EAAMqJ,cACrBxH,OAAQ7B,EAAM6B,OACdE,SAAU/B,EAAM+B,WAclB,OAXA,aAAgB,WACd,GAAK/B,EAAM+L,kBACNnH,EAAM7K,KAAX,CAEA,IAAMwQ,GAAU,QAAuB3F,EAAM7K,MAExCwQ,GAEL,eAA2BA,EANJ,CAOzB,GAAG,CAAE3F,EAAM7K,KAAMiG,EAAM+L,mBAGrB,gCACGJ,EAGP,C","sources":["file:///app/packages/libs/shared/src/apps/analytics/hooks/UseFetchInteractiveResults.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTable.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/partial-interactive-insights-students.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents.tsx","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useAnonSessions.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsClassroomStudents.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightsInteractiveResults.ts","file:///app/packages/projects/lite/src/apps/my-shares/flight-requests/VideoViewsV2Requests.ts","file:///app/packages/projects/lite/src/apps/my-shares/hooks/useInsightEngagement.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/heatmap/InsightsHeatmapView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/insights/students-watched/InsightStudentsWatched.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/video-insights-overview/partial-loading/partial-video-insights-overview.scss","file:///app/packages/projects/lite/src/apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview.tsx","file:///app/packages/projects/lite/src/apps/my-shares/components/video-insights-overview/VideoInsightsOvervew.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/VideoInsightsOverviewView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/video/overview/VideoInsightsOverviewUtils.ts","file:///app/packages/projects/lite/src/apps/my-shares/views/base-insights-view/useInsightsView.tsx","file:///app/packages/projects/lite/src/apps/my-shares/views/base-insights-view/BaseInsightsView.tsx"],"sourcesContent":["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;\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 { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}` ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}` ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2' ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\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 React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n hasCompleted: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching,\n hasCompleted: responses.hasCompleted\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<TResponse, TObjects = string>(\n objs: TObjects[],\n getRequest: (items: TObjects[]) => Flight.Request,\n _getKey?: (obj: TObjects) => string\n) {\n const getKey = _getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const { fetchItems, ...data } = useGrowingBatchFetchFunc<TResponse, TObjects>({ getRequest, _getKey });\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n fetchItems(objs);\n }, [objs?.map(getKey).join(',')]);\n\n return data;\n}\n\ninterface UseGrowingBatchFetchFuncOptions<TObjects> {\n getRequest: (items: TObjects[]) => Flight.Request;\n _getKey?: (obj: TObjects) => string;\n}\n\n/**\n * When you need the useGrowingBatchFetch() behaviour, but need to trigger the\n * fetch manually and update the objects - Nish \n */\nexport function useGrowingBatchFetchFunc<TResponse, TObjects = string>(\n options: UseGrowingBatchFetchFuncOptions<TObjects>\n) {\n const getKey = options._getKey ?? ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n function fetchItems(objs: TObjects[]) {\n if (!objs?.length)\n return;\n\n const unfetchedItems: TObjects[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n \n setRequests(r => ([ ...r, ...ArrayHelper.chunk<TObjects>(unfetchedItems, CHUNK_SIZE).map(options.getRequest) ]));\n }\n\n const responses = Flight.useBasicFetchAll<TResponse[]>(requests);\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce<Record<string, TResponse>>((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching,\n fetchItems\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';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentResultsEmptyStateProps {\n filter: FilterStudentsBy;\n notCompletedImageUrl: string;\n helpingHandImageUrl: string;\n markingRequiredImageUrl: string;\n emptyStateImageUrl: string;\n}\n\nexport function StudentResultsEmptyState(props: StudentResultsEmptyStateProps) {\n if (props.filter === 'not_completed') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.notCompletedImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('notCompletedDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n if (props.filter === 'marking_required') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.markingRequiredImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('markingRequiredDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n if (props.filter === 'helping_hand') {\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.helpingHandImageUrl} size='small' />\n <EmptyState.Info>\n {getPhrase('helpingHandDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n }\n\n return (\n <EmptyState className='bg-white rounded-bottom py-5'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { FilterStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.studentResultsTable';\n\ninterface StudentResultsTableFiltersProps {\n filter: FilterStudentsBy;\n setFilter: (filter: FilterStudentsBy) => void;\n}\n\nexport function StudentResultsTableFilterButtons(props: StudentResultsTableFiltersProps) {\n function toggleFilter(selectedFilter: FilterStudentsBy) {\n const updatedFilter = props.filter === selectedFilter ? null : selectedFilter;\n\n props.setFilter(updatedFilter);\n }\n\n function isFilterSelected(filter: FilterStudentsBy) {\n return props.filter === filter;\n }\n\n function getClassName(filter: FilterStudentsBy) {\n return `btn btn-outline-dark ${isFilterSelected(filter) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 mb-0'><Text namespace={namespace} phrase='filters' /></p>\n <div className='d-flex border-start ps-3 ms-3 gap-2'>\n <button className={getClassName('not_completed')} onClick={() => toggleFilter('not_completed')}>\n <Text namespace={namespace} phrase='notCompletedFilter' />\n </button>\n <button className={getClassName('marking_required')} onClick={() => toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequiredFilter' />\n </button>\n <button className={getClassName('helping_hand')} onClick={() => toggleFilter('helping_hand')}>\n <Text namespace={namespace} phrase='helpingHandFilter' />\n </button>\n </div>\n </div>\n );\n}","import React from 'react';\nimport { Cell, Row, SortingRule } from 'react-table';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { StudentResultsEmptyState } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsEmptyState';\nimport { StudentResultsTableFilterButtons } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTableFilters';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { FilterStudentsBy, getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport {\n highlightColumns,\n highlightRows,\n RESULTS_COL_WIDTH,\n useGetFixedColumns,\n useGetResultColumns,\n useGetResultsTableData\n} from './StudentResultsTableUtils';\n\nimport styles from './student-results-table.scss';\n\nconst fixedTableTheme: TableTheme = {\n table: `${styles.fixedTable} bg-white rounded-start border border-end-0`,\n header: `${styles.header} border-bottom`,\n headerRow: 'h-100',\n headerCell: 'd-flex align-items-center justify-content-start',\n row: styles.row\n};\n\nconst resultsTableTheme: TableTheme = {\n header: `${styles.header} fw-bold`,\n headerRow: 'h-100',\n headerCell: `${styles.interactionHeaderCellOuter} bg-white border-bottom`,\n row: `${styles.row} ${styles.resultsRow}`,\n cell: styles.resultsCellOuter\n};\n\ninterface StudentResultsTableProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n config?: Config;\n selectedStudentId?: string;\n emptyStateImageUrl?: string;\n notCompletedImageUrl?: string;\n helpingHandImageUrl?: string;\n markingRequiredImageUrl?: string;\n anonymiseUsers?: boolean;\n sortBy?: SortStudentsBy;\n filterBy?: FilterStudentsBy;\n viewStudentResults: (\n student: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n}\n\nexport function StudentResultsTable(props: StudentResultsTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<StudentResultsWithSummary>[]>(\n getSortStudents(props.sortBy, 'score')\n );\n const [ filter, setFilter ] = React.useState<FilterStudentsBy>(props.filterBy);\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n const fixedColumns = useGetFixedColumns(props.results, props.anonymiseUsers, props.config?.imageCdnUrl);\n const resultColumns = useGetResultColumns(\n props.interactive,\n props.interactiveMetadata,\n props.results,\n onColumnHover,\n props.refreshTable\n );\n const data = useGetResultsTableData(\n props.interactive,\n props.results,\n props.refreshTable,\n props.anonymiseUsers,\n ArrayHelper.first(sortBy),\n filter\n );\n\n function onSelectStudent({ original }: Row<StudentResultsWithSummary>): void {\n props.viewStudentResults(original.user, props.interactiveMetadata.id);\n }\n\n function onSelectStudentResponse(cell: Cell<StudentResultsWithSummary>): void {\n props.viewStudentResults(\n cell.row.original.user,\n props.interactiveMetadata.id,\n cell.column.id\n );\n }\n\n function onColumnHover(index?: number): void {\n highlightColumns(ref.current, index);\n }\n\n function onRowHover(index?: number): void {\n highlightRows(ref.current, index);\n }\n\n return (\n <div>\n {!!props.results.students.length && <StudentResultsTableFilterButtons filter={filter} setFilter={setFilter} />}\n\n {!data.length && (\n <StudentResultsEmptyState\n emptyStateImageUrl={props.emptyStateImageUrl}\n helpingHandImageUrl={props.helpingHandImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n notCompletedImageUrl={props.notCompletedImageUrl}\n filter={filter}\n />\n )}\n\n {!!data.length && (\n <div ref={ref} className={`d-flex${data.length ? ` ${styles.hasResults}` : ''}`}>\n <Table\n columns={fixedColumns}\n data={data}\n theme={fixedTableTheme}\n onSelectRow={onSelectStudent}\n onRowMouseOver={row => onRowHover(row.index)}\n onRowMouseLeave={() => onRowHover()}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n <Table\n columns={resultColumns}\n data={data}\n theme={resultsTableTheme}\n enableSlider\n scrollIncrement={RESULTS_COL_WIDTH * 8}\n onSelectCell={onSelectStudentResponse}\n scrollContainerClassName='rounded-end border border-start-0 border'\n />\n </div>\n )}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"qSeTe\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-students.scss';\n\nexport function PartialInteractiveInsightsStudents() {\n return (\n <div>\n <div className='d-flex align-items-center mb-3'>\n <p className='h6 px-4 mb-0 me-4 partial-loading-background'>&nbsp;</p>\n <div className='row g-2 w-50'>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n <div className='col-3'>\n <div className='p-2 rounded-1 partial-loading-background'>&nbsp;</div>\n </div>\n </div>\n </div>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { StudentResultsTable } from 'libs/shared/apps/analytics/components/student-results/student-results-table/StudentResultsTable';\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Config, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { PartialInteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/partial-loading/PartialInteractiveInsightsStudents';\n\ninterface InteractiveInsightsStudentsProps {\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n isFetching: boolean;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n anonymiseUsers: boolean;\n config: Config;\n viewStudentResults: (\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) => void;\n hasDataLoaded: boolean;\n}\n\nexport function InteractiveInsightsStudents(props: InteractiveInsightsStudentsProps) {\n return (\n <>\n {!props.hasDataLoaded &&\n <PartialInteractiveInsightsStudents />\n }\n\n {props.hasDataLoaded &&\n <StudentResultsTable\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n refreshTable={props.isFetching}\n viewStudentResults={props.viewStudentResults}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n sortBy={props.sortBy}\n filterBy={props.filterBy}\n anonymiseUsers={props.anonymiseUsers}\n notCompletedImageUrl={ImageUrls.Insights.JIGSAW}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n helpingHandImageUrl={ImageUrls.Insights.SPEECH_BUBBLE_HEART}\n config={props.config}\n />\n }\n </>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareRequests } from 'libs/shared/apps/share/flight-requests/ShareRequests';\nimport { AnonSession } from 'libs/shared/apps/share/interfaces/AnonSession';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nfunction toAnonUser(anonSession: AnonSession) {\n return { sessionId: anonSession.sessionId, name: anonSession.sessionName } as AnonUser;\n}\n\nexport function useAnonSessions(shareId: string) {\n const anonSessions = Flight.useBasicFetch<AnonSession[]>(ShareRequests.getAnonSessions(shareId));\n\n const anonSessionMap = anonSessions.data\n ?.reduce<Record<string, AnonUser>>((prev, next) => {\n return {\n ...prev,\n [next.sessionId]: toAnonUser(next)\n };\n }, {});\n\n return {\n items: anonSessionMap || {},\n hasCompleted: anonSessions.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useFetchAll } from 'libs/shared/hooks/UseFetchAll';\nimport { User } from 'libs/shared/interfaces/models/User';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nexport function useInsightsClassroomStudents(shareId: string) {\n const fetch = Flight.useGetFetch();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n \n const classroomId = share.data?.type === ShareType.Classroom &&\n share.data?.recipients?.find(r => r.recipientTypeId === MasterType.Classroom)?.recipientId;\n\n const getRequest = (cursor: string) => ClassroomRequests.getClassroomStudents(classroomId, cursor);\n const result = useFetchAll<User>(classroomId && getRequest, cursor => fetch(getRequest(cursor)));\n\n return {\n ...result,\n hasCompleted: !classroomId || result.hasCompleted\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { InteractiveResult, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\n\nconst EMPTY_INTERACTIVE_RESULTS: InteractiveResult[] = [\n {\n id: '0',\n attempts: [{ id: '0', answeredAt: 0, answers: []}]\n }\n];\n\nexport function useInsightsInteractiveResults(shareId: string) {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(shareId));\n const results = useFetchInteractiveResults(share.data?.objectId, null, true);\n\n const anonSessions = useAnonSessions(shareId);\n\n const classroomStudents = useInsightsClassroomStudents(shareId);\n\n useHandleObjectError(results);\n\n const hasCompleted = (\n results.hasCompleted &&\n anonSessions.hasCompleted &&\n classroomStudents.hasCompleted\n );\n\n if (!hasCompleted) {\n return {\n data: null as InteractiveResultSet,\n hasCompleted: false\n };\n }\n\n const studentHash = new Set<string>();\n const students = results.data.students.map(s => {\n if (s.user) {\n studentHash.add(s.user.id);\n return s;\n }\n\n /**\n * Set the user to our anon user, so we can display the name they entered\n * when completing the interactive - Sha\n */\n return {\n ...s,\n user: anonSessions.items[s.sessionId] || { sessionId: s.sessionId } as AnonUser\n };\n });\n\n /**\n * If we have classroom students, we're adding any students who haven't attempted to the list\n * with an empty attempt. This is so the student list can show all classroom students - Sha\n */\n if (classroomStudents?.items?.length) {\n students.push(...classroomStudents.items\n .filter(s => !studentHash.has(s.id))\n .map(user => ({ user, results: EMPTY_INTERACTIVE_RESULTS })));\n }\n\n return {\n hasCompleted,\n data: {\n ...results.data,\n students\n }\n };\n}","import { Flight } from 'libs/common/react/index';\n\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\n\nexport const VideoViewsV2Requests = {\n shareViews(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/analytics/streams/shares/${shareId}/users/count`,\n key: `video:views:v2:share:${shareId}`,\n normalize: false\n };\n },\n\n shareAggregation(shareId: string, type: StreamAggregationType): Flight.Request {\n return {\n url: `{gateway}/v2/analytics/streams/shares/${shareId}/aggregation/${type}`,\n key: `video:views:v2:share:aggregation:${shareId}:${type}`,\n normalize: false\n };\n },\n\n shareHeatMap(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/analytics/streams/shares/${shareId}/heat-map`,\n key: `video:views:v2:share:heatmap:${shareId}`,\n normalize: false\n };\n },\n\n shareHeatMapAggregation(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/analytics/streams/shares/${shareId}/aggregation/heat-map`,\n key: `video:views:v2:share:heatmap:aggregation:${shareId}`,\n normalize: false\n };\n }\n};","import { Flight } from 'libs/common/react/index';\n\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Engagement } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { VideoViewsV2Requests } from 'apps/my-shares/flight-requests/VideoViewsV2Requests';\nimport { useAnonSessions } from 'apps/my-shares/hooks/useAnonSessions';\n\nexport function useInsightEngagement(shareId: string) {\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(shareId)\n );\n\n const anonSessions = useAnonSessions(shareId);\n\n const userIds = engagement.data?.map(u => u.userId).filter(id => !!id) || [];\n const users = useBatchFetch<AnonUser>(userIds, UserRequests.getById);\n\n const userMap = {\n ...anonSessions.items,\n ...users.items\n };\n \n const viewers = engagement.data?.map(e => {\n const user = userMap[e.userId || e.sessionId] || { sessionId: e.sessionId } as AnonUser;\n return { ...user, percentage: e.engagementRate } as AnonUser;\n });\n\n return {\n engagement: engagement.data,\n users: viewers,\n hasCompleted: (\n engagement.hasCompleted &&\n anonSessions.hasCompleted &&\n (!userIds?.length || users.hasCompleted)\n )\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\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 { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\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 { Classroom, Config, CurrentUser, Engagement, PlayerViewKey, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ViewModelKeys } from 'shared/constants/LiteViewModels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InsightsHeatmap } from 'apps/my-shares/components/insights-heatmap/InsightsHeatmap';\nimport { VideoViewsV2Requests } from 'apps/my-shares/flight-requests/VideoViewsV2Requests';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsInteractiveTabs, getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.insightsHeatmap';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightsHeatmapViewProps {\n shareId: string;\n}\n\nexport function InsightsHeatmapView(props: InsightsHeatmapViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(ViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions } = usePermissions();\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n \n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const { users, engagement, hasCompleted } = useInsightEngagement(props.shareId);\n\n const yearGroupsCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'year_group')\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n share.data?.objectId &&\n PlayerRequests.createViewKey(share.data.objectId, MediaIdType.MasterObject)\n );\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n\n const hasDataLoaded =\n share.hasCompleted &&\n video.hasCompleted &&\n config.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n yearGroupsCount.hasCompleted &&\n viewKey.hasCompleted &&\n yearGroups.hasCompleted;\n\n function getInsightsTabs() {\n if (share.data?.objectTypeId === MasterType.Interactive)\n return getInsightsInteractiveTabs(share.data, 'heatmap');\n\n return getInsightsVideoTabs(share.data, 'heatmap');\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n tabs={getInsightsTabs()}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n />\n <InsightsHeatmap\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement}\n yearGroups={yearGroupsCount.data}\n config={config.data}\n users={users}\n viewKey={viewKey.data}\n hasDataLoaded={hasDataLoaded}\n tableDataLoaded={hasCompleted}\n anonymiseUsers={anonymiseUsers}\n classroomStudents={classroomStudents.items}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\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 { Classroom, Config, CurrentUser, Engagement, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsOverview } from 'apps/my-shares/components/interactive-insights-overview/InteractiveInsightsOverview';\nimport { VideoViewsV2Requests } from 'apps/my-shares/flight-requests/VideoViewsV2Requests';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getInteractiveInsightsAppLinks } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewUtils';\n\nconst namespace = 'insights.interactiveInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsViewProps {\n shareId: string;\n}\n\nexport function InteractiveInsightsOverviewView(props: InteractiveInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(\n interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId)\n );\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n\n const hasDataLoaded =\n config.hasCompleted &&\n interactiveMetadata.hasCompleted &&\n interactive.data &&\n aggregateEngagement.hasCompleted &&\n engagement.hasCompleted &&\n osCount.hasCompleted &&\n results.hasCompleted &&\n yearGroups.hasCompleted;\n\n const interactiveInsightsAppLinks = getInteractiveInsightsAppLinks(share.data);\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={interactiveMetadata.data}\n tabs={getInsightsInteractiveTabs(share.data, 'insights')}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n />\n\n <InteractiveInsightsOverview\n aggregateEngagement={aggregateEngagement.data}\n individualEngagement={engagement.data}\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactiveInsightsAppLinks={interactiveInsightsAppLinks}\n classroomStudents={classroomStudents.items}\n results={results.data}\n osCount={osCount.data}\n config={config.data}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n share={share.data}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink, getInsightsQuestionsAppLink, getInsightsStudentsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getInteractiveInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n resultsAppLink: getInsightsStudentsAppLink(share, params),\n questionsAppLink: getInsightsQuestionsAppLink(share, params),\n heatmapAppLink: getInsightsHeatmapAppLink(share, params)\n };\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\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 { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsQuestions } from 'apps/my-shares/components/interactive-insights-questions/InteractiveInsightsQuestions';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'shared.interactiveInsightsQuestionsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsQuestionsViewProps {\n shareId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasPermissions } = usePermissions();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data?.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'questions')}\n video={interactiveMetadata.data}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\n />\n\n <InteractiveInsightsQuestions\n interactive={interactive.data}\n interactiveMetadata={interactiveMetadata.data}\n interactionId={props.interactionId}\n config={config.data}\n sortBy={props.sortBy}\n isFetching={!results.hasCompleted || interactive.isFetching}\n anonymiseUsers={anonymiseUsers}\n results={results.data}\n hasDataLoaded={hasDataLoaded}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, Interactive, InteractiveMetadata, YearGroup } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { InteractiveInsightsStudents } from 'apps/my-shares/components/interactive-insights-students/InteractiveInsightsStudents';\nimport { useInsightsInteractiveResults } from 'apps/my-shares/hooks/useInsightsInteractiveResults';\nimport { getInsightsInteractiveTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.interactiveInsightsStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractiveInsightsStudentsViewProps {\n shareId: 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 { hasPermissions } = usePermissions();\n \n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n \n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n share.data?.objectId &&\n InteractiveRequests.interactiveMetadata(share.data.objectId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const results = useInsightsInteractiveResults(props.shareId);\n\n const hasDataLoaded = interactive.data && interactiveMetadata.data && !!results.data && !!yearGroups.data;\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n useHandleObjectError([ share, interactive, interactiveMetadata ]);\n\n function viewStudentResults(\n user: AnonUser,\n interactiveMetadataId: string,\n interactionId?: string\n ) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_STUDENT_RESULTS,\n params: {\n studentId: user.id,\n shareId: props.shareId,\n interactionId,\n sessionId: user.sessionId\n }\n });\n }\n\n return (\n <div className='px-3'>\n <InsightsHeader\n tabs={getInsightsInteractiveTabs(share.data, 'results')}\n video={interactiveMetadata.data}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n classroom={classroom.data}\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.hasCompleted}\n anonymiseUsers={anonymiseUsers}\n hasDataLoaded={hasDataLoaded}\n config={config.data}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsNotWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightStudentsNotWatchedProps {\n students: User[];\n imageCdnUrl: string;\n imageUrl: string;\n heatmapAppLink: Core.AppLink;\n watchedIds: string[];\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsNotWatched(props: InsightStudentsNotWatchedProps) {\n const studentsNotWatched = props.students?.filter(student => !props.watchedIds?.includes(student.id)) || [];\n\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Puzzle}\n svgClassName='bg-light-teal text-teal'\n >\n <InsightStudentList\n students={studentsNotWatched}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InsightCard } from 'libs/shared/apps/analytics/components/insight-card/InsightCard';\nimport { InsightStudentList } from 'libs/shared/apps/analytics/components/insight-student-list/InsightStudentList';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.insightStudentsWatched';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InsightWatchedProps {\n students: AnonUser[];\n imageCdnUrl: string;\n heatmapAppLink: Core.AppLink;\n imageUrl: string;\n anonymiseUsers: boolean;\n}\n\nexport function InsightStudentsWatched(props: InsightWatchedProps) {\n return (\n <InsightCard\n title={getPhrase('title')}\n svgName={cvSvgLibrary.Flag}\n svgClassName='bg-light-indigo text-indigo'\n count={props.students.length}\n >\n <InsightStudentList\n students={props.students}\n imageCdnUrl={props.imageCdnUrl}\n imageUrl={props.imageUrl}\n description={getPhrase('studentsDisplay')}\n appLink={props.heatmapAppLink}\n appLinkText={getPhrase('viewAll')}\n anonymiseUsers={props.anonymiseUsers}\n />\n </InsightCard>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"oHwkx\"};","import React from 'react';\n\nimport styles from './partial-video-insights-overview.scss';\n\nexport function PartialVideoInsightsOverview() {\n return (\n <div>\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-12'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n\n <h2 className='h4 w-25 partial-loading-background'>&nbsp;</h2>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { InsightDevices } from 'libs/shared/apps/analytics/components/insights/devices/InsightDevices';\nimport { InsightHeatmap } from 'libs/shared/apps/analytics/components/insights/heatmap/InsightHeatmap';\nimport { InsightStudentsNotWatched } from 'libs/shared/apps/analytics/components/insights/students-not-watched/InsightStudentsNotWatched';\nimport { InsightStudentsWatched } from 'libs/shared/apps/analytics/components/insights/students-watched/InsightStudentsWatched';\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { getEngagementRate } from 'libs/shared/apps/analytics/utils/EngagementUtils';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Config, Engagement, User, Video } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { InsightsShareMask } from 'apps/my-shares/components/insights-mask/InsightsShareMask';\nimport { PartialVideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/partial-loading/PartialVideoInsightsOverview';\n\nconst namespace = 'insights.videoInsightsOverview';\n\ninterface VideoInsightsOverviewProps {\n hasDataLoaded: boolean;\n hasClassrooms: boolean;\n anonymiseUsers: boolean;\n videoInsightsAppLinks: HashObject;\n config: Config;\n video: Video;\n classroomStudents: User[];\n viewers: AnonUser[];\n individualEngagement: Engagement[];\n aggregateEngagement: Engagement;\n share: Share;\n osCount: GroupedAnalyticsCount[];\n}\n\nexport function VideoInsightsOverview(props: VideoInsightsOverviewProps) {\n const hasData = props.hasDataLoaded && !!props.viewers?.length;\n\n function getStudentsList() {\n if (!props.viewers) return [];\n\n return Object.values(props.viewers);\n }\n\n return (\n <>\n {!props.hasDataLoaded && <PartialVideoInsightsOverview />}\n\n {props.hasDataLoaded &&\n <InsightsShareMask video={props.video} hasData={hasData} share={props.share}>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text namespace={namespace} phrase='studentViewing' />\n <span>: {getStudentsList().length}{props.classroomStudents ? `/${props.classroomStudents.length}` : ''}</span>\n </h2>\n <div className='row g-3'>\n {!!props.classroomStudents?.length && (\n <div className='col-12 col-md'>\n <InsightStudentsNotWatched\n students={props.classroomStudents}\n watchedIds={props.viewers?.map(u => u.id)}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n )}\n <div className='col-12 col-md'>\n <InsightStudentsWatched\n students={getStudentsList()}\n imageCdnUrl={props.config.imageCdnUrl}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n imageUrl={ImageUrls.Insights.AVATAR}\n anonymiseUsers={props.anonymiseUsers}\n />\n </div>\n </div>\n </section>\n <section className='mb-5'>\n <h2 className='h4'>\n <Text\n namespace={namespace}\n phrase={props.hasClassrooms ? 'classEngagement' : 'engagement'}\n />\n </h2>\n <div className='row g-3'>\n <div className='col-12 col-md-6'>\n <InsightDevices\n osCount={props.osCount}\n />\n </div>\n <div className='col-12 col-md-6'>\n <InsightHeatmap\n engagement={props.aggregateEngagement}\n heatmapAppLink={props.videoInsightsAppLinks.heatmapAppLink}\n engagementRate={getEngagementRate(props.individualEngagement)}\n />\n </div>\n </div>\n </section>\n </InsightsShareMask>\n }\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\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 { Classroom, Config, CurrentUser, Engagement, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { VideoInsightsOverview } from 'apps/my-shares/components/video-insights-overview/VideoInsightsOvervew';\nimport { VideoViewsV2Requests } from 'apps/my-shares/flight-requests/VideoViewsV2Requests';\nimport { useInsightEngagement } from 'apps/my-shares/hooks/useInsightEngagement';\nimport { useInsightsClassroomStudents } from 'apps/my-shares/hooks/useInsightsClassroomStudents';\nimport { getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { getVideoInsightsAppLinks } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewUtils';\n\nconst namespace = 'insights.videoInsightsOverviewView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface VideoInsightsViewProps {\n shareId: string;\n}\n\nexport function VideoInsightsOverviewView(props: VideoInsightsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n useLockContentWidth();\n\n const { hasClassrooms } = useSettings(null);\n\n const { hasPermissions } = usePermissions();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const classroomId = ShareHelper.getClassroomIdFromShare(share.data);\n const classroom = Flight.useBasicFetch<Classroom>(classroomId && ClassroomRequests.getClassroom(classroomId));\n\n const classroomStudents = useInsightsClassroomStudents(props.shareId);\n\n const videoRequest = share.data && VideoHelper.getVideoRequest(share.data.objectId, share.data.objectTypeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n useSetPageMetadata({ title: video.data ? getPhrase('pageTitle', { video: video.data?.name }) : null });\n useHandleObjectError([ share, video ]);\n\n const engagement = Flight.useBasicFetch<Engagement[]>(\n VideoViewsV2Requests.shareHeatMap(props.shareId)\n );\n\n const aggregateEngagement = Flight.useBasicFetch<Engagement>(\n VideoViewsV2Requests.shareHeatMapAggregation(props.shareId)\n );\n\n const osCount = Flight.useBasicFetch<GroupedAnalyticsCount[]>(\n VideoViewsV2Requests.shareAggregation(props.shareId, 'os_name')\n );\n\n const { users, hasCompleted } = useInsightEngagement(props.shareId);\n \n const hasDataLoaded =\n config.hasCompleted &&\n video.hasCompleted &&\n engagement.hasCompleted &&\n aggregateEngagement.hasCompleted &&\n osCount.hasCompleted &&\n yearGroups.data &&\n hasCompleted;\n\n const videoInsightsAppLinks = getVideoInsightsAppLinks(share.data);\n\n return (\n <div className='px-3'>\n <InsightsHeader\n video={video.data}\n classroom={classroom.data}\n tabs={getInsightsVideoTabs(share.data, 'insights')}\n hasAnalytics={hasPermissions(PermissionName.ViewCustomerAnalytics)}\n analyticsWebUrl={config.data?.analyticsWebUrl}\n share={share.data}\n yearGroups={yearGroups.data}\n />\n\n <VideoInsightsOverview\n hasDataLoaded={!!hasDataLoaded}\n hasClassrooms={hasClassrooms}\n anonymiseUsers={anonymiseUsers}\n videoInsightsAppLinks={videoInsightsAppLinks}\n config={config.data}\n video={video.data}\n classroomStudents={classroomStudents.items}\n viewers={users}\n individualEngagement={engagement.data}\n aggregateEngagement={aggregateEngagement.data}\n share={share.data}\n osCount={osCount.data}\n />\n </div>\n );\n}","import { HashObject } from 'libs/common/react/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\n\nimport { getInsightsHeatmapAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nexport function getVideoInsightsAppLinks(share: Share, params?: HashObject) {\n return {\n heatmapAppLink: getInsightsHeatmapAppLink(share, params)\n };\n}","import React from 'react';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { InsightsHeatmapView } from 'apps/my-shares/views/heatmap/InsightsHeatmapView';\nimport { InteractiveInsightsOverviewView } from 'apps/my-shares/views/interactive/overview/InteractiveInsightsOverviewView';\nimport { InteractiveInsightsQuestionsView } from 'apps/my-shares/views/interactive/questions/InteractiveInsightsQuestionsView';\nimport { InteractiveInsightsStudentsView } from 'apps/my-shares/views/interactive/students/InteractiveInsightsStudentsView';\nimport { VideoInsightsOverviewView } from 'apps/my-shares/views/video/overview/VideoInsightsOverviewView';\n\ninterface UseInsightsViewOptions {\n share: Share | undefined;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n}\n\ntype ShareContext = Omit<UseInsightsViewOptions, 'tab'>;\ntype ViewFn = (ctx: ShareContext) => JSX.Element;\ntype ViewRegistry = Partial<Record<MasterType, Partial<Record<InsightsTabs, ViewFn>>>>;\n\nconst INSIGHTS_VIEWS: ViewRegistry = {\n [MasterType.Video]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Clip]: {\n insights: ctx => <VideoInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />\n },\n [MasterType.Interactive]: {\n insights: ctx => <InteractiveInsightsOverviewView shareId={ctx.share.shareId} />,\n heatmap: ctx => <InsightsHeatmapView shareId={ctx.share.shareId} />,\n questions: ctx => (\n <InteractiveInsightsQuestionsView\n interactionId={ctx.interactionId}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n ),\n results: ctx => (\n <InteractiveInsightsStudentsView\n filterBy={ctx.filterBy}\n sortBy={ctx.sortBy}\n shareId={ctx.share.shareId}\n />\n )\n }\n};\n\n/**\n * Takes any Share object and a tab, and returns the corresponding \"insights\" view.\n * This is just a utility hook, and as such doesn't need to set the page title directly.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function useInsightsView(options: UseInsightsViewOptions): JSX.Element {\n const { share, tab } = options;\n const viewFn = INSIGHTS_VIEWS[share?.objectTypeId]?.[tab];\n\n if (viewFn)\n return viewFn(options);\n\n return <></>;\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { FilterStudentsBy, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\n\nimport { getShareOptionsAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { InsightsTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\nimport { useInsightsView } from 'apps/my-shares/views/base-insights-view/useInsightsView';\n\ninterface BaseInsightsViewProps {\n shareId: string;\n tab: InsightsTabs;\n interactionId: string;\n sortBy: SortStudentsBy;\n filterBy: FilterStudentsBy;\n showShareOptions?: boolean;\n}\n\n/**\n * BaseInsightsView is a generic component that renders different \"insights\" views based on the provided share.\n * The child views will handle setting the page title and other specific details.\n * \n * It also handles the logic for showing share options if `showShareOptions` is true - which is currently used\n * in our used in our LCE emails.\n */\n// eslint-disable-next-line rulesdir/require-view-title\nexport function BaseInsightsView(props: BaseInsightsViewProps): JSX.Element {\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const view = useInsightsView({\n share: share.data,\n tab: props.tab,\n interactionId: props.interactionId,\n sortBy: props.sortBy,\n filterBy: props.filterBy\n });\n\n React.useEffect(() => {\n if (!props.showShareOptions) return;\n if (!share.data) return;\n\n const appLink = getShareOptionsAppLink(share.data);\n \n if (!appLink) return;\n\n Core.AppLinkHelper.trigger(appLink);\n }, [ share.data, props.showShareOptions ]);\n\n return (\n <>\n {view}\n </>\n );\n}"],"names":["useFetchInteractiveResults","interactiveMetadataId","requestFilter","includePublicResults","currentUser","interactiveMetadata","interactive","data","interactiveId","shouldFetchResults","I","id","normalizeOptions","namespace","ShareRequests","createShare","url","key","type","invalidationKeys","objectId","updateShare","shareId","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","sort","join","normalize","getShareLink","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","items","length","reduce","acc","item","isFetching","hasCompleted","useGrowingBatchFetch","objs","_getKey","getKey","obj","useGrowingBatchFetchFunc","fetchItems","options","fetchedItems","Set","setRequests","hasFirstRequestCompleted","unfetchedItems","forEach","current","has","push","add","r","generateCacheKey","flightObjs","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","getPhrase","LanguageService","StudentResultsEmptyState","props","filter","EmptyState","className","src","notCompletedImageUrl","size","markingRequiredImageUrl","helpingHandImageUrl","emptyStateImageUrl","StudentResultsTableFilterButtons","toggleFilter","selectedFilter","updatedFilter","setFilter","getClassName","isFilterSelected","Text","phrase","onClick","fixedTableTheme","table","header","headerRow","headerCell","row","resultsTableTheme","cell","StudentResultsTable","sortBy","setSortBy","filterBy","ref","fixedColumns","results","anonymiseUsers","config","imageCdnUrl","resultColumns","index","refreshTable","ArrayHelper","onRowHover","students","Table","columns","theme","onSelectRow","original","viewStudentResults","user","onRowMouseOver","onRowMouseLeave","enableSort","manualSort","onSort","initialSortBy","enableSlider","scrollIncrement","onSelectCell","column","scrollContainerClassName","PartialInteractiveInsightsStudents","InteractiveInsightsStudents","hasDataLoaded","ImageUrls","useAnonSessions","anonSessions","prev","next","sessionId","anonSession","name","sessionName","useInsightsClassroomStudents","fetch","share","classroomId","recipients","find","recipientTypeId","recipientId","cursor","result","EMPTY_INTERACTIVE_RESULTS","attempts","answeredAt","answers","useInsightsInteractiveResults","classroomStudents","studentHash","s","VideoViewsV2Requests","useInsightEngagement","engagement","userIds","u","userId","users","UserRequests","userMap","viewers","e","percentage","engagementRate","InsightsHeatmapView","useLockContentWidth","hasPermissions","usePermissions","ShareHelper","classroom","ClassroomRequests","videoRequest","VideoHelper","objectTypeId","video","ConfigRequests","yearGroups","CustomerRequests","customerId","aggregateEngagement","yearGroupsCount","viewKey","PlayerRequests","MediaIdType","useSetPageMetadata","title","InsightsHeader","tabs","MasterType","getInsightsTabs","hasAnalytics","PermissionName","analyticsWebUrl","InsightsHeatmap","individualEngagement","tableDataLoaded","InteractiveInsightsOverviewView","SharedViewModelKeys","InteractiveRequests","osCount","interactiveInsightsAppLinks","resultsAppLink","questionsAppLink","heatmapAppLink","getInteractiveInsightsAppLinks","InteractiveInsightsOverview","InteractiveInsightsQuestionsView","InteractiveInsightsQuestions","interactionId","InteractiveInsightsStudentsView","application","action","studentId","InsightStudentsNotWatched","studentsNotWatched","student","watchedIds","includes","InsightCard","svgName","svgClassName","InsightStudentList","imageUrl","description","InsightStudentsWatched","count","appLink","appLinkText","PartialVideoInsightsOverview","VideoInsightsOverview","hasData","getStudentsList","InsightsShareMask","videoInsightsAppLinks","hasClassrooms","InsightDevices","InsightHeatmap","VideoInsightsOverviewView","useSettings","getVideoInsightsAppLinks","INSIGHTS_VIEWS","insights","ctx","heatmap","questions","BaseInsightsView","view","tab","viewFn","useInsightsView","showShareOptions"],"sourceRoot":""}