@clickview/lite 0.83.0-rc.0 → 0.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/2074-lite-ac8da6c78b.chunk.css +4 -0
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js → 1199-da55d69853-lite.chunk.js} +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js.map → 1199-da55d69853-lite.chunk.js.map} +1 -1
- package/dist/scripts/1202-d96ad80884-lite.chunk.js +2 -0
- package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +1 -0
- package/dist/scripts/{4208-0706461da6-lite.chunk.js → 1336-1826f6e582-lite.chunk.js} +2 -2
- package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +1 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js +3 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js.map +1 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js +2 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +1 -0
- package/dist/scripts/{2664-907153c03b-lite.chunk.js → 2664-87c8cbfa7f-lite.chunk.js} +2 -2
- package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +1 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js +2 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +1 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js +2 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js.map +1 -0
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js → 3612-8c6423bd51-lite.chunk.js} +2 -2
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js.map → 3612-8c6423bd51-lite.chunk.js.map} +1 -1
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js +3 -0
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js.map +1 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +2 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +1 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js +2 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js.map +1 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +3 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +1 -0
- package/dist/scripts/{4177-2d876c7b14-lite.chunk.js → 4177-285ddf9ae3-lite.chunk.js} +2 -2
- package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +1 -0
- package/dist/scripts/{4578-27028d26eb-lite.chunk.js → 4578-7578bcf17a-lite.chunk.js} +2 -2
- package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +1 -0
- package/dist/scripts/{4621-7fb0a05bcb-lite.chunk.js → 4621-1f79d94416-lite.chunk.js} +2 -2
- package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js +2 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +1 -0
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js → 4948-de1c75e7fb-lite.chunk.js} +1 -1
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js.map → 4948-de1c75e7fb-lite.chunk.js.map} +1 -1
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +2 -0
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +1 -0
- package/dist/scripts/{5554-f1f3baf822-lite.chunk.js → 5554-17bb3b86fc-lite.chunk.js} +2 -2
- package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +1 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js +2 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +1 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js +2 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +1 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js +2 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-ba75701156-lite.chunk.js → 6909-a9b8930e37-lite.chunk.js} +2 -2
- package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +1 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js +2 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +1 -0
- package/dist/scripts/{7617-211f084b70-lite.chunk.js → 7617-9d34c841e6-lite.chunk.js} +2 -2
- package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +1 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js +2 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +1 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js +2 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +1 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +2 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +1 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js +3 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js.map +1 -0
- package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js → 8133-ffcff3b7fc-lite.chunk.js} +3 -3
- package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +1 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js +3 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +1 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js +2 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +1 -0
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js → 9042-fdc5ecb459-lite.chunk.js} +1 -1
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js.map → 9042-fdc5ecb459-lite.chunk.js.map} +1 -1
- package/dist/scripts/9295-4242401e60-lite.chunk.js +2 -0
- package/dist/scripts/9295-4242401e60-lite.chunk.js.map +1 -0
- package/dist/scripts/{9742-3f6b75484a-lite.chunk.js → 9742-5f99d74bb0-lite.chunk.js} +2 -2
- package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +1 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js +2 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js.map +1 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js +2 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-dcea87749e.min.js +3 -0
- package/dist/scripts/{bundle-f926852f33.min.js.map → bundle-dcea87749e.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1074-fdce06d863-lite.chunk.js +0 -2
- package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +0 -1
- package/dist/scripts/1938-e067e06dac-lite.chunk.js +0 -3
- package/dist/scripts/1938-e067e06dac-lite.chunk.js.map +0 -1
- package/dist/scripts/2664-907153c03b-lite.chunk.js.map +0 -1
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js +0 -2
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +0 -1
- package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +0 -1
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js +0 -3
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js.map +0 -1
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js +0 -2
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +0 -1
- package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +0 -1
- package/dist/scripts/4208-0706461da6-lite.chunk.js.map +0 -1
- package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +0 -1
- package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js +0 -2
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +0 -1
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js +0 -2
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +0 -1
- package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +0 -1
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +0 -2
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +0 -1
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +0 -2
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-ba75701156-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +0 -2
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +0 -1
- package/dist/scripts/7568-55e9b01367-lite.chunk.js +0 -3
- package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +0 -1
- package/dist/scripts/7617-211f084b70-lite.chunk.js.map +0 -1
- package/dist/scripts/7742-514844bd1a-lite.chunk.js +0 -2
- package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +0 -1
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js +0 -2
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +0 -1
- package/dist/scripts/8077-870bd8e245-lite.chunk.js +0 -3
- package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +0 -1
- package/dist/scripts/843-4dbc5df109-lite.chunk.js +0 -3
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +0 -1
- package/dist/scripts/8735-e74a148502-lite.chunk.js +0 -2
- package/dist/scripts/8735-e74a148502-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-2d332952ae-lite.chunk.js +0 -2
- package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +0 -1
- package/dist/scripts/904-2784e45cfc-lite.chunk.js +0 -2
- package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +0 -1
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js +0 -2
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +0 -1
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js +0 -2
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +0 -1
- package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +0 -1
- package/dist/scripts/979-6a70a0e616-lite.chunk.js +0 -2
- package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-f926852f33.min.js +0 -3
- /package/dist/css/{9528-lite-4a892bdbf2.chunk.css → 1202-lite-4a892bdbf2.chunk.css} +0 -0
- /package/dist/css/{7148-lite-856c02f000.chunk.css → 2888-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{904-lite-2435a34b13.chunk.css → 289-lite-2435a34b13.chunk.css} +0 -0
- /package/dist/css/{9911-lite-2b4142796a.chunk.css → 3612-lite-2b4142796a.chunk.css} +0 -0
- /package/dist/css/{8856-lite-f8e496136d.chunk.css → 5579-lite-f8e496136d.chunk.css} +0 -0
- /package/dist/css/{6550-lite-45dc286aab.chunk.css → 6070-lite-45dc286aab.chunk.css} +0 -0
- /package/dist/css/{2970-lite-5a317efacd.chunk.css → 787-lite-5a317efacd.chunk.css} +0 -0
- /package/dist/css/{843-lite-db31e36b79.chunk.css → 8364-lite-db31e36b79.chunk.css} +0 -0
- /package/dist/css/{8735-lite-856c02f000.chunk.css → 9911-lite-856c02f000.chunk.css} +0 -0
- /package/dist/scripts/{1938-e067e06dac-lite.chunk.js.LICENSE.txt → 1938-c52383e98d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt → 3836-bf1359bed7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3836-2c82a9fbf7-lite.chunk.js.LICENSE.txt → 4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7568-55e9b01367-lite.chunk.js.LICENSE.txt → 8077-bfb3530f78-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8077-870bd8e245-lite.chunk.js.LICENSE.txt → 8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{843-4dbc5df109-lite.chunk.js.LICENSE.txt → 8364-ff63447d36-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-f926852f33.min.js.LICENSE.txt → bundle-dcea87749e.min.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4208],{69087:(e,t,r)=>{r.d(t,{d:()=>C});var n=r(32735),a=r(56644),s=r(23481),i=r(75896),o=r(83914),c=r(8246),u=r(35223);function l(e){var t=e.answer;return n.createElement("div",{key:t.id,className:"".concat(function(e){switch(e){case c.N.Correct:return"bg-light-green";case c.N.Incorrect:return"bg-light-red";case c.N.PendingReview:return"bg-light-blue"}}(t.status)," rounded p-2 mb-2")},n.createElement("div",{className:"d-flex align-items-center gap-2"},t.status===c.N.Correct&&n.createElement(o.x,{svgName:u.vn.Check,className:"svg-container flex-shrink-0 text-success"}),t.status===c.N.Incorrect&&n.createElement(o.x,{svgName:u.vn.Close,className:"svg-container flex-shrink-0 text-danger"}),!e.customAnswer&&n.createElement("span",{className:e.textClassName},t.text)),e.children)}var m=s.T.encloseNamespace("shared.interactionResponses");function d(e){return d="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},d(e)}function v(e,t,r){return(t=function(e){var t=function(e){if("object"!=d(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=d(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==d(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){return n.createElement(n.Fragment,null)},y=v(v(v(v(v(v(v({},a.Z9.Annotation,f),a.Z9.Image,f),a.Z9.MissingWord,function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map(function(e){return n.createElement("li",{key:e.id},n.createElement(l,{answer:e,textClassName:"bg-white p-1 border border-gray-300 rounded"}))})):n.createElement(n.Fragment,null)}),a.Z9.MultipleChoice,function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map(function(e){return n.createElement("li",{key:e.id},n.createElement(l,{answer:e}))})):n.createElement(n.Fragment,null)}),a.Z9.TrueOrFalse,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t}):n.createElement(n.Fragment,null)}),a.Z9.ShortAnswer,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t},e.children):n.createElement(n.Fragment,null)}),a.Z9.Illustration,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t,customAnswer:!0},n.createElement("div",{className:"ratio ratio-16x9"},n.createElement("img",{className:"img-fluid bg-white border rounded h-100 w-100",src:t.text,alt:"".concat(m("illustrationAlt"),": ").concat(e.interaction.name)})),e.children):n.createElement(n.Fragment,null)}),g=r(97408),p=r(44526),w=r(56151),h=r(3894),b=r(69737),I=r(83140),E=r(80845),S=r(64818);const k={avatarContainer:"O7oaA"};function C(e){var t,r,a,s,i,o,c,u=y[e.interaction.typeId];if(!u)return n.createElement(n.Fragment,null);var l=(0,E.j_)(e.studentResults),m=(0,E.f6)(e.interaction.id,l),d=I.A.isInteractionCorrect(e.interaction,l);return n.createElement("div",{className:"position-relative"},n.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},n.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&n.createElement("div",{className:"me-2"},n.createElement("div",{className:k.avatarContainer},n.createElement(g.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?S.l.getInitialsFromFullName(e.anonymisedUserName):S.l.getInitials(null===(r=e.studentResults.user)||void 0===r?void 0:r.name,null===(a=e.studentResults.user)||void 0===a?void 0:a.surname),imageUrl:e.anonymisedUserName?null:null===(i=null===(s=e.studentResults.user)||void 0===s?void 0:s.avatar)||void 0===i?void 0:i.url,showAnonymousUser:!!(null===(c=null===(o=e.studentResults)||void 0===o?void 0:o.user)||void 0===c?void 0:c.sessionId)}))),n.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&n.createElement(w.U,{studentResults:e.studentResults,correctness:d,anonymisedUserName:e.anonymisedUserName}),n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("div",{className:"flex-grow-1 mb-2 ".concat(e.responseComponentClass?e.responseComponentClass:"")},m?n.createElement(u,{interaction:e.interaction,answers:m.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar},n.createElement(h.Z,{studentAttempt:m,correctness:d,markInteraction:e.markInteraction,markedStatus:e.markedStatus})):n.createElement(b.R,null)),!e.showStudentDetails&&n.createElement(p.Y,{correctness:d}))))))}},93479:(e,t,r)=>{r.d(t,{I:()=>i});var n=r(99940);function a(e,t,r){if(!t)return e;var n="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId,i=Array.isArray(t.customerId)?t.customerId.sort().join(":"):t.customerId;return a&&(n+=":".concat(a)),s&&(n+=":".concat(s)),i&&(n+=":".concat(i)),r&&(n+=":".concat(r)),n}function s(e,t,r){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:t?{start:t.start,end:t.end}:void 0,userIds:null==t?void 0:t.userId,classroomsAndGroups:null==t?void 0:t.groupId,shareId:r}}var i={interactiveResultSet:function(e,t,r,i,o,c,u,l){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:a("interactive:result:set:".concat(e,":").concat(t,":").concat(o),i),data:s(r,i,o),type:n.k.POST,normalize:!1,success:c,error:u,always:l}},mark:function(e,t,r,a,s,i,o){return{url:"/api/domain/v1/analytics/answers/".concat(r),key:"mark:answer:".concat(r,":").concat(a.resultId),type:n.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:o}},pendingReviews:function(e){var t=e.interactives.map(function(e){return"".concat(e.interactiveId,":").concat(e.metadataId,":").concat(e.shareId)}).join(",");return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews:".concat(t),type:n.k.POST,data:e,normalize:!1}},interactiveResultsReport:function(e){return{url:"/api/domain/v3/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},9193:(e,t,r)=>{r.d(t,{D:()=>v});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(93479),c=r(39157),u=r(69883);function l(e){return l="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},l(e)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var d=s.T.encloseNamespace("reportsShared.dataHooks"),v=function(e,t,r){var s,v,f=(s=(0,n.useState)({}),v=2,function(e){if(Array.isArray(e))return e}(s)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],c=!0,u=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(s,v)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(e,t):void 0}}(s,v)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),y=f[0],g=f[1],p=(0,a.I0)(),w=(0,u.Z)();return{markedAnswers:y,addMarkedAnswers:function(e,t){e.forEach(function(e){g(function(r){return Object.assign(Object.assign({},r),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=l(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(0,c.UU)(e),Object.assign(Object.assign({},e),{status:t})))})})},submitMarkedAnswers:function(){var n=Object.keys(y).map(function(e){return y[e]});if(n.length){var a=0,s=0;n.forEach(function(r){var n=r.id,a=r.resultId,s=r.questionId,l=r.status;i.a.fetch(p,o.I.mark(e,t,n,{id:n,resultId:a,questionId:s,status:l},c,null,u))})}function c(){s++}function u(){var e,t;++a===n.length&&(e="",t=!1,0===s&&(e=d("error",{smartCount:n.length}),t=!0),s<a&&(e=d("success",{smartCount:s})+" ".concat(d("partialError",{smartCount:a-s}))),s===a&&(e=d("success",{smartCount:s})),t?w.error(e):w.success(e),g({}),r&&r())}}}}},39157:(e,t,r)=>{r.d(t,{HI:()=>d,R6:()=>u,Rt:()=>f,UU:()=>m,Zs:()=>l,nq:()=>v});var n=r(75896),a=r(94892),s=r(28972),i=r(8246),o=r(83140),c=r(80845);function u(e,t,r){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,c.Q)(e),o=new Set(i.map(function(e){return e.id}));t.students.forEach(function(t){var i=Object.assign(Object.assign({},t),{summary:f(e,t)});i.summary.awaitingMarking?s.markingRequired.push(i):n.m.last(t.results).attempts.filter(function(e){var t;return!!o.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===o.size?(s.completed.push(i),i.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&s.highScore.push(i),i.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&s.lowScore.push(i)):s.notCompleted.push(i)});var u=n.m.sortBy(s.lowScore,function(e){return e.summary.percentCorrect}),l=n.m.sortBy(s.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},s),{lowScore:u,highScore:l})}function l(e,t){return(0,c.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Correct}))?i.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect}))?i.N.Incorrect:void 0}function v(e,t){var r=t.students.length,n=0,a=0,i=0,u=0,l=0;return t.students.forEach(function(t){var r=(0,c.j_)(t);if(r){l+=t.results.length;var m=o.A.isInteractionCorrect(e,r);m===s.w.Correct&&n++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&u++,m!==s.w.UnAnswered&&a++}}),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:i,awaitingMarking:u,attempts:l}}function f(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,i=0,u=0;n.forEach(function(e){var t=o.A.isInteractionCorrect(e,r);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&u++});var l=a>0?i/a:0,m=new Set(n.map(function(e){return e.id})),d=r.attempts.filter(function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:d,attempts:t.results.length,unanswered:a-d,percentCorrect:l,correct:i,awaitingMarking:u}}}}]);
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1336],{69087:(e,t,r)=>{r.d(t,{d:()=>C});var n=r(32735),a=r(56644),s=r(23481),i=r(75896),o=r(83914),c=r(8246),u=r(35223);function l(e){var t=e.answer;return n.createElement("div",{key:t.id,className:"".concat(function(e){switch(e){case c.N.Correct:return"bg-light-green";case c.N.Incorrect:return"bg-light-red";case c.N.PendingReview:return"bg-light-blue"}}(t.status)," rounded p-2 mb-2")},n.createElement("div",{className:"d-flex align-items-center gap-2"},t.status===c.N.Correct&&n.createElement(o.x,{svgName:u.vn.Check,className:"svg-container flex-shrink-0 text-success"}),t.status===c.N.Incorrect&&n.createElement(o.x,{svgName:u.vn.Close,className:"svg-container flex-shrink-0 text-danger"}),!e.customAnswer&&n.createElement("span",{className:e.textClassName},t.text)),e.children)}var m=s.T.encloseNamespace("shared.interactionResponses");function d(e){return d="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},d(e)}function v(e,t,r){return(t=function(e){var t=function(e){if("object"!=d(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=d(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==d(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var f=function(){return n.createElement(n.Fragment,null)},y=v(v(v(v(v(v(v({},a.Z9.Annotation,f),a.Z9.Image,f),a.Z9.MissingWord,function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map(function(e){return n.createElement("li",{key:e.id},n.createElement(l,{answer:e,textClassName:"bg-white p-1 border border-gray-300 rounded"}))})):n.createElement(n.Fragment,null)}),a.Z9.MultipleChoice,function(e){return e.answers.length?n.createElement("ul",{className:"list-unstyled"},e.answers.map(function(e){return n.createElement("li",{key:e.id},n.createElement(l,{answer:e}))})):n.createElement(n.Fragment,null)}),a.Z9.TrueOrFalse,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t}):n.createElement(n.Fragment,null)}),a.Z9.ShortAnswer,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t},e.children):n.createElement(n.Fragment,null)}),a.Z9.Illustration,function(e){var t=i.m.first(e.answers);return t?n.createElement(l,{answer:t,customAnswer:!0},n.createElement("div",{className:"ratio ratio-16x9"},n.createElement("img",{className:"img-fluid bg-white border rounded h-100 w-100",src:t.text,alt:"".concat(m("illustrationAlt"),": ").concat(e.interaction.name)})),e.children):n.createElement(n.Fragment,null)}),g=r(97408),p=r(44526),w=r(56151),h=r(3894),b=r(69737),I=r(83140),E=r(80845),S=r(64818);const k={avatarContainer:"O7oaA"};function C(e){var t,r,a,s,i,o,c,u=y[e.interaction.typeId];if(!u)return n.createElement(n.Fragment,null);var l=(0,E.j_)(e.studentResults),m=(0,E.f6)(e.interaction.id,l),d=I.A.isInteractionCorrect(e.interaction,l);return n.createElement("div",{className:"position-relative"},n.createElement("div",{className:"rounded ".concat(null!==(t=e.className)&&void 0!==t?t:"")},n.createElement("div",{className:"d-flex"},!!e.showStudentDetails&&n.createElement("div",{className:"me-2"},n.createElement("div",{className:k.avatarContainer},n.createElement(g.q,{imageCdnUrl:e.imageCdnUrl,initials:e.anonymisedUserName?S.l.getInitialsFromFullName(e.anonymisedUserName):S.l.getInitials(null===(r=e.studentResults.user)||void 0===r?void 0:r.name,null===(a=e.studentResults.user)||void 0===a?void 0:a.surname),imageUrl:e.anonymisedUserName?null:null===(i=null===(s=e.studentResults.user)||void 0===s?void 0:s.avatar)||void 0===i?void 0:i.url,showAnonymousUser:!!(null===(c=null===(o=e.studentResults)||void 0===o?void 0:o.user)||void 0===c?void 0:c.sessionId)}))),n.createElement("div",{className:"flex-grow-1"},!!e.showStudentDetails&&n.createElement(w.U,{studentResults:e.studentResults,correctness:d,anonymisedUserName:e.anonymisedUserName}),n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("div",{className:"flex-grow-1 mb-2 ".concat(e.responseComponentClass?e.responseComponentClass:"")},m?n.createElement(u,{interaction:e.interaction,answers:m.answers,imageCdnUrl:e.imageCdnUrl,user:e.studentResults.user,showFeedback:e.showFeedback,showAvatar:e.showAvatar},n.createElement(h.Z,{studentAttempt:m,correctness:d,markInteraction:e.markInteraction,markedStatus:e.markedStatus})):n.createElement(b.R,null)),!e.showStudentDetails&&n.createElement(p.Y,{correctness:d}))))))}},93479:(e,t,r)=>{r.d(t,{I:()=>i});var n=r(99940);function a(e,t,r){if(!t)return e;var n="".concat(e,":").concat(t.start,":").concat(t.end),a=Array.isArray(t.userId)?t.userId.sort().join(":"):t.userId,s=Array.isArray(t.groupId)?t.groupId.sort().join(":"):t.groupId,i=Array.isArray(t.customerId)?t.customerId.sort().join(":"):t.customerId;return a&&(n+=":".concat(a)),s&&(n+=":".concat(s)),i&&(n+=":".concat(i)),r&&(n+=":".concat(r)),n}function s(e,t,r){return{currentUserId:e.id,currentCustomerId:e.customerId,dateRange:t?{start:t.start,end:t.end}:void 0,userIds:null==t?void 0:t.userId,classroomsAndGroups:null==t?void 0:t.groupId,shareId:r}}var i={interactiveResultSet:function(e,t,r,i,o,c,u,l){return{url:o?"/api/domain/v3/analytics/interactives/".concat(e,"/metadata/").concat(t):"/api/domain/v2/analytics/interactives/".concat(e,"/metadata/").concat(t),key:a("interactive:result:set:".concat(e,":").concat(t,":").concat(o),i),data:s(r,i,o),type:n.k.POST,normalize:!1,success:c,error:u,always:l}},mark:function(e,t,r,a,s,i,o){return{url:"/api/domain/v1/analytics/answers/".concat(r),key:"mark:answer:".concat(r,":").concat(a.resultId),type:n.k.PUT,data:a,normalize:!1,invalidationKeys:"interactive:result:set:".concat(e,":").concat(t),success:s,error:i,always:o}},pendingReviews:function(e){var t=e.interactives.map(function(e){return"".concat(e.interactiveId,":").concat(e.metadataId,":").concat(e.shareId)}).join(",");return{url:"/api/domain/v1/analytics/interactives/pending-reviews/summary",key:"interactives:pending:reviews:".concat(t),type:n.k.POST,data:e,normalize:!1}},interactiveResultsReport:function(e){return{url:"/api/domain/v3/analytics/interactives/report",key:"interactive:results:report",data:e,type:n.k.POST,normalize:!1}}}},9193:(e,t,r)=>{r.d(t,{D:()=>v});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(93479),c=r(39157),u=r(69883);function l(e){return l="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},l(e)}function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var d=s.T.encloseNamespace("reportsShared.dataHooks"),v=function(e,t,r){var s,v,f=(s=(0,n.useState)({}),v=2,function(e){if(Array.isArray(e))return e}(s)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],c=!0,u=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(u)throw a}}return o}}(s,v)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?m(e,t):void 0}}(s,v)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),y=f[0],g=f[1],p=(0,a.I0)(),w=(0,u.Z)();return{markedAnswers:y,addMarkedAnswers:function(e,t){e.forEach(function(e){g(function(r){return Object.assign(Object.assign({},r),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=l(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(0,c.UU)(e),Object.assign(Object.assign({},e),{status:t})))})})},submitMarkedAnswers:function(){var n=Object.keys(y).map(function(e){return y[e]});if(n.length){var a=0,s=0;n.forEach(function(r){var n=r.id,a=r.resultId,s=r.questionId,l=r.status;i.a.fetch(p,o.I.mark(e,t,n,{id:n,resultId:a,questionId:s,status:l},c,null,u))})}function c(){s++}function u(){var e,t;++a===n.length&&(e="",t=!1,0===s&&(e=d("error",{smartCount:n.length}),t=!0),s<a&&(e=d("success",{smartCount:s})+" ".concat(d("partialError",{smartCount:a-s}))),s===a&&(e=d("success",{smartCount:s})),t?w.error(e):w.success(e),g({}),r&&r())}}}}},26136:(e,t,r)=>{r.d(t,{B:()=>o});var n=r(76198),a=r(23481),s=r(64818),i=a.T.encloseNamespace("shared.analyticsUtils");function o(e,t){return e?t?(0,n._8)((r=e.id,a=e.sessionId,o=+"".concat(r||function(e){if(!e)return 0;for(var t=0,r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r),t|=0;return Math.abs(t)}(a)).concat(Math.floor((new Date).getMinutes()/5)),{dictionaries:[n.O9,n.yd],separator:" ",length:2,style:"capital",seed:o})):e.deleted?i("deleted"):s.l.getFullName(e)||i("anonUser"):i("anonUser");var r,a,o}},39157:(e,t,r)=>{r.d(t,{HI:()=>d,R6:()=>u,Rt:()=>f,UU:()=>m,Zs:()=>l,nq:()=>v});var n=r(75896),a=r(94892),s=r(28972),i=r(8246),o=r(83140),c=r(80845);function u(e,t,r){var s={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},i=(0,c.Q)(e),o=new Set(i.map(function(e){return e.id}));t.students.forEach(function(t){var i=Object.assign(Object.assign({},t),{summary:f(e,t)});i.summary.awaitingMarking?s.markingRequired.push(i):n.m.last(t.results).attempts.filter(function(e){var t;return!!o.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length===o.size?(s.completed.push(i),i.summary.percentCorrect>=((null==r?void 0:r.HIGH)||a.i.HIGH)&&s.highScore.push(i),i.summary.percentCorrect<((null==r?void 0:r.MODERATE)||a.i.MODERATE)&&s.lowScore.push(i)):s.notCompleted.push(i)});var u=n.m.sortBy(s.lowScore,function(e){return e.summary.percentCorrect}),l=n.m.sortBy(s.highScore,function(e){return-e.summary.percentCorrect});return Object.assign(Object.assign({},s),{lowScore:u,highScore:l})}function l(e,t){return(0,c.Wn)(e).find(function(e){return e.id.toString()===t.toString()})}function m(e){return"".concat(e.questionId,":").concat(e.resultId)}function d(e,t,r){var n=(0,c.j_)(t),a=(0,c.f6)(e,n);return(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Correct}))?i.N.Correct:(null==a?void 0:a.answers.every(function(e){var t;return(null===(t=r[m(e)])||void 0===t?void 0:t.status)===i.N.Incorrect}))?i.N.Incorrect:void 0}function v(e,t){var r=t.students.length,n=0,a=0,i=0,u=0,l=0;return t.students.forEach(function(t){var r=(0,c.j_)(t);if(r){l+=t.results.length;var m=o.A.isInteractionCorrect(e,r);m===s.w.Correct&&n++,m===s.w.UnAnswered&&i++,m===s.w.AwaitingMarking&&u++,m!==s.w.UnAnswered&&a++}}),{percentCorrect:r>0?n/r:0,correct:n,answered:a,unanswered:i,awaitingMarking:u,attempts:l}}function f(e,t){var r=(0,c.j_)(t),n=(0,c.Q)(e),a=n.length,i=0,u=0;n.forEach(function(e){var t=o.A.isInteractionCorrect(e,r);t===s.w.Correct&&i++,t===s.w.AwaitingMarking&&u++});var l=a>0?i/a:0,m=new Set(n.map(function(e){return e.id})),d=r.attempts.filter(function(e){var t;return!!m.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)}).length;return{answered:d,attempts:t.results.length,unanswered:a-d,percentCorrect:l,correct:i,awaitingMarking:u}}},94892:(e,t,r)=>{r.d(t,{T:()=>a,i:()=>n});var n={HIGH:.75,MODERATE:.5},a={HIGH:.7,MODERATE:.7}}}]);
|
|
2
|
+
//# sourceMappingURL=1336-1826f6e582-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/1336-1826f6e582-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/IllustrationResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MissingWordResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/MultipleChoiceResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/TrueOrFalseResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/components/ShortAnswerResponse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/interaction-response-item.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem.tsx","file:///app/packages/libs/shared/src/utils/AnalyticsRequestUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/flight-requests/InteractiveResultsRequests.ts","file:///app/packages/libs/shared/src/apps/analytics/hooks/UseMarkAnswers.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/AnonymiseUserUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/constants/ScoreThresholds.ts"],"sourcesContent":["import React from 'react';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { StudentAnswer } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface AnswerContainerProps extends React.PropsWithChildren {\n answer: StudentAnswer;\n textClassName?: string;\n customAnswer?: boolean;\n}\n\nexport function AnswerContainer(props: AnswerContainerProps) {\n const { answer } = props;\n\n function getBgColour(status: InteractiveAnswerStatus) {\n switch (status) {\n case InteractiveAnswerStatus.Correct: return 'bg-light-green';\n case InteractiveAnswerStatus.Incorrect: return 'bg-light-red';\n case InteractiveAnswerStatus.PendingReview: return 'bg-light-blue';\n }\n }\n\n return (\n <div key={answer.id} className={`${getBgColour(answer.status)} rounded p-2 mb-2`}>\n <div className='d-flex align-items-center gap-2'>\n {answer.status === InteractiveAnswerStatus.Correct && <SvgContainer svgName={cvSvgLibrary.Check} className='svg-container flex-shrink-0 text-success' />}\n {answer.status === InteractiveAnswerStatus.Incorrect && <SvgContainer svgName={cvSvgLibrary.Close} className='svg-container flex-shrink-0 text-danger' />}\n {!props.customAnswer && <span className={props.textClassName}>{answer.text}</span>}\n </div>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nconst namespace = 'shared.interactionResponses';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function IllustrationResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} customAnswer>\n <div className='ratio ratio-16x9'>\n <img\n className='img-fluid bg-white border rounded h-100 w-100'\n src={answer.text}\n alt={`${getPhrase('illustrationAlt')}: ${props.interaction.name}`}\n />\n </div>\n {props.children}\n </AnswerContainer>\n );\n}","import React from 'react';\n\nimport { Interaction, InteractionTypeId, StudentAnswer, User } from 'libs/shared/interfaces';\n\nimport { IllustrationResponse } from './components/IllustrationResponse';\nimport { MissingWordResponse } from './components/MissingWordResponse';\nimport { MultipleChoiceResponse } from './components/MultipleChoiceResponse';\nimport { ShortAnswerResponse } from './components/ShortAnswerResponse';\nimport { TrueOrFalseResponse } from './components/TrueOrFalseResponse';\n\nexport interface ResponseItemComponentProps extends React.PropsWithChildren {\n interaction: Interaction;\n answers: StudentAnswer[];\n imageCdnUrl: string;\n user: User;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n}\nconst NoResponseRequired = () => <></>;\n\nexport const ResponseItemComponentLookup: {\n [typeId: number]: (props: ResponseItemComponentProps) => JSX.Element\n} = {\n [InteractionTypeId.Annotation]: NoResponseRequired,\n [InteractionTypeId.Image]: NoResponseRequired,\n [InteractionTypeId.MissingWord]: MissingWordResponse,\n [InteractionTypeId.MultipleChoice]: MultipleChoiceResponse,\n [InteractionTypeId.TrueOrFalse]: TrueOrFalseResponse,\n [InteractionTypeId.ShortAnswer]: ShortAnswerResponse,\n [InteractionTypeId.Illustration]: IllustrationResponse\n};","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\n\nexport function MissingWordResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer\n answer={answer}\n textClassName='bg-white p-1 border border-gray-300 rounded'\n />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function MultipleChoiceResponse(props: ResponseItemComponentProps) {\n if (!props.answers.length) return <></>;\n\n return (\n <ul className='list-unstyled'>\n {props.answers.map(answer => (\n <li key={answer.id}>\n <AnswerContainer answer={answer} />\n </li>\n ))}\n </ul>\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function TrueOrFalseResponse(props: ResponseItemComponentProps) {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer} />\n );\n}","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnswerContainer } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/components/AnswerContainer';\nimport { ResponseItemComponentProps } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\n\nexport function ShortAnswerResponse(props: ResponseItemComponentProps): JSX.Element {\n const answer = ArrayHelper.first(props.answers);\n\n if (!answer)\n return <></>;\n\n return (\n <AnswerContainer answer={answer}>\n {props.children}\n </AnswerContainer>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"O7oaA\"};","import React from 'react';\n\nimport { ResponseItemComponentLookup } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/ResponseItemComponentLookup';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { InteractionResponseCorrectness } from 'libs/shared/components/interaction-response/InteractionResponseCorrectness';\nimport { InteractionStudentDetailsHeader } from 'libs/shared/components/interaction-response/InteractionStudentDetailsHeader';\nimport { MarkResponse } from 'libs/shared/components/interaction-response/MarkResponse';\nimport { NoResponse } from 'libs/shared/components/interaction-response/response-types/NoResponse';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './interaction-response-item.scss';\n\ninterface InteractionResponseProps {\n interaction: Interaction;\n studentResults: StudentResults;\n imageCdnUrl: string;\n markInteraction: (answers: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n markedStatus?: InteractiveAnswerStatus;\n showStudentDetails?: boolean;\n className?: string;\n showFeedback?: boolean;\n showAvatar?: boolean;\n anonymisedUserName?: string;\n responseComponentClass?: string;\n}\n\nexport function InteractionResponseItem(props: InteractionResponseProps): JSX.Element {\n const ResponseItemComponent = ResponseItemComponentLookup[props.interaction.typeId];\n\n if (!ResponseItemComponent)\n return <></>;\n\n const result = getStudentResult(props.studentResults);\n\n const studentAttempt = getStudentAttempt(props.interaction.id, result);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n return (\n <div className='position-relative'>\n <div className={`rounded ${props.className ?? ''}`}>\n <div className='d-flex'>\n {!!props.showStudentDetails &&\n <div className='me-2'>\n <div className={styles.avatarContainer}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={props.anonymisedUserName\n ? UserHelper.getInitialsFromFullName(props.anonymisedUserName)\n : UserHelper.getInitials(props.studentResults.user?.name, props.studentResults.user?.surname)\n }\n imageUrl={props.anonymisedUserName ? null : props.studentResults.user?.avatar?.url}\n showAnonymousUser={!!props.studentResults?.user?.sessionId}\n />\n </div>\n \n </div>\n }\n <div className='flex-grow-1'>\n {!!props.showStudentDetails &&\n <InteractionStudentDetailsHeader\n studentResults={props.studentResults}\n correctness={correctness}\n anonymisedUserName={props.anonymisedUserName}\n />\n }\n <div className='d-flex justify-content-between'>\n <div className={`flex-grow-1 mb-2 ${props.responseComponentClass ? props.responseComponentClass : ''}`}>\n {studentAttempt\n ? <ResponseItemComponent\n interaction={props.interaction}\n answers={studentAttempt.answers}\n imageCdnUrl={props.imageCdnUrl}\n user={props.studentResults.user}\n showFeedback={props.showFeedback}\n showAvatar={props.showAvatar}\n >\n <MarkResponse\n studentAttempt={studentAttempt}\n correctness={correctness}\n markInteraction={props.markInteraction}\n markedStatus={props.markedStatus}\n />\n </ResponseItemComponent>\n : <NoResponse />\n }\n </div>\n {!props.showStudentDetails &&\n <InteractionResponseCorrectness correctness={correctness} />\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, extra?: string): string {\n if (!filter)\n return baseKey;\n\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n const customerIdKey = Array.isArray(filter.customerId) ? filter.customerId.sort().join(':') : filter.customerId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (customerIdKey)\n key += `:${customerIdKey}`;\n\n if (extra)\n key += `:${extra}`;\n\n return key;\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\n\nimport { MarkInteractiveAnswer } from 'libs/shared/apps/analytics/interfaces/MarkInteractiveAnswer';\nimport { InteractiveResultsReport } from 'libs/shared/apps/analytics/interfaces/requests/InteractiveResultsReport';\nimport { InteractivesPendingReviewsRequest } from 'libs/shared/apps/analytics/interfaces/requests/InteractivesPendingReviewsRequest';\nimport { AnalyticsRequestFilter, CurrentUser, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\ninterface InteractiveResultFilters {\n currentUserId: string;\n currentCustomerId: string;\n dateRange?: { start: string, end: string }\n userIds?: string | string[];\n classroomsAndGroups?: string | string[];\n shareId?: string;\n}\n\nfunction getInteractiveResultFilters(\n currentUser: CurrentUser,\n filter: AnalyticsRequestFilter,\n shareId?: string\n): InteractiveResultFilters {\n return {\n currentUserId: currentUser.id,\n currentCustomerId: currentUser.customerId,\n dateRange: filter ? { start: filter.start, end: filter.end } : undefined,\n userIds: filter?.userId,\n classroomsAndGroups: filter?.groupId,\n shareId: shareId\n };\n}\n\nexport const InteractiveResultsRequests = {\n /** \n * This endpoint returns data with a lot of duplicated ids,\n * e.g. student answers to the same question will have the same id.\n * Because of that, we don't normalize.\n */\n interactiveResultSet(\n interactiveId: string,\n interactiveMetadataId: string,\n currentUser: CurrentUser,\n filter?: AnalyticsRequestFilter,\n shareId?: string,\n success?: (data: InteractiveResultSet) => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: shareId ?\n `/api/domain/v3/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}` :\n `/api/domain/v2/analytics/interactives/${interactiveId}/metadata/${interactiveMetadataId}`,\n key: getAnalyticsRequestKey(`interactive:result:set:${interactiveId}:${interactiveMetadataId}:${shareId}`, filter),\n data: getInteractiveResultFilters(currentUser, filter, shareId),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n },\n \n /**\n * As the response from `interactiveResultSet` isn't normalised, we need to invalidate the cache\n * to update the results data.\n */\n mark(\n interactiveId: string,\n interactiveMetadataId: string,\n answerId: string,\n data: MarkInteractiveAnswer,\n success?: () => void,\n error?: (data: any) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: `/api/domain/v1/analytics/answers/${answerId}`,\n key: `mark:answer:${answerId}:${data.resultId}`,\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: `interactive:result:set:${interactiveId}:${interactiveMetadataId}`,\n success,\n error,\n always\n };\n },\n\n pendingReviews(data: InteractivesPendingReviewsRequest): Flight.Request {\n const key = data.interactives.map(interactive => `${interactive.interactiveId}:${interactive.metadataId}:${interactive.shareId}`).join(',');\n return {\n url: `/api/domain/v1/analytics/interactives/pending-reviews/summary`,\n key: `interactives:pending:reviews:${key}`,\n type: HttpVerbs.POST,\n data,\n normalize: false\n };\n },\n\n interactiveResultsReport(data: InteractiveResultsReport): Flight.Request {\n return {\n url: '/api/domain/v3/analytics/interactives/report',\n key: 'interactive:results:report',\n data,\n type: HttpVerbs.POST,\n normalize: false\n };\n }\n};","import { useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { InteractiveResultsRequests } from 'libs/shared/apps/analytics/flight-requests/InteractiveResultsRequests';\nimport { getMarkedAnswerId } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { StudentAnswer } from 'libs/shared/interfaces';\n\nconst getPhrase = LanguageService.encloseNamespace('reportsShared.dataHooks');\n\nexport type MarkedAnswerHash = { [id: string]: StudentAnswer };\n\n/**\n * This hook manages the storing of a marked answer hash in state and then the submitting\n * of those answers via an api call.\n */\nexport const useMarkAnswers = (interactiveId: string, interactiveMetadataId: string, onDone?: () => void) => {\n const [ markedAnswers, setMarkedAnswers ] = useState<MarkedAnswerHash>({});\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n function addMarkedAnswers(answers: StudentAnswer[], status: InteractiveAnswerStatus): void {\n answers.forEach(a => {\n setMarkedAnswers(m => ({ ...m, [getMarkedAnswerId(a)]: { ...a, status } }));\n });\n }\n\n function submitMarkedAnswers(): void {\n const answers = Object.keys(markedAnswers).map(key => markedAnswers[key]);\n\n if (!answers.length)\n return;\n\n let completeCount = 0;\n let successCount = 0;\n\n function onSuccess(): void {\n successCount++;\n }\n\n function onAlways(): void {\n completeCount++;\n\n if (completeCount === answers.length)\n onComplete();\n }\n\n function onComplete(): void {\n let alertMessage = '';\n let useErrorAlert = false;\n\n if (successCount === 0) {\n alertMessage = getPhrase('error', { smartCount: answers.length });\n useErrorAlert = true;\n }\n\n if (successCount < completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount })\n + ` ${getPhrase('partialError', { smartCount: completeCount - successCount })}`;\n }\n\n if (successCount === completeCount) {\n alertMessage = getPhrase('success', { smartCount: successCount });\n }\n\n useErrorAlert\n ? alerts.error(alertMessage)\n : alerts.success(alertMessage);\n\n setMarkedAnswers({});\n\n onDone && onDone();\n }\n\n answers.forEach(({ id, resultId, questionId, status }) => {\n Flight.fetch(dispatch, InteractiveResultsRequests.mark(\n interactiveId,\n interactiveMetadataId,\n id,\n { id, resultId, questionId, status },\n onSuccess,\n null,\n onAlways\n ));\n });\n }\n\n return {\n markedAnswers,\n addMarkedAnswers,\n submitMarkedAnswers\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 if (user.deleted)\n return getPhrase('deleted');\n\n return UserHelper.getFullName(user) || getPhrase('anonUser');\n }\n\n return uniqueNamesGenerator(getUniqueNamesConfig(user.id, user.sessionId));\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n const interactionIds = new Set(interactions.map(i => i.id));\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n const result = ArrayHelper.last(s.results);\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n if (answeredInteractions === interactionIds.size) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","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};"],"names":["AnswerContainer","props","answer","key","id","className","status","InteractiveAnswerStatus","getBgColour","SvgContainer","svgName","customAnswer","textClassName","text","children","getPhrase","LanguageService","NoResponseRequired","ResponseItemComponentLookup","answers","length","map","ArrayHelper","src","alt","interaction","name","InteractionResponseItem","ResponseItemComponent","typeId","result","studentResults","studentAttempt","correctness","InteractiveCorrectnessHelper","showStudentDetails","Avatar","imageCdnUrl","initials","anonymisedUserName","UserHelper","user","surname","imageUrl","avatar","url","showAnonymousUser","sessionId","InteractionStudentDetailsHeader","responseComponentClass","showFeedback","showAvatar","MarkResponse","markInteraction","markedStatus","NoResponse","InteractionResponseCorrectness","getAnalyticsRequestKey","baseKey","filter","extra","start","end","userIdKey","Array","isArray","userId","sort","join","groupIdKey","groupId","customerIdKey","customerId","getInteractiveResultFilters","currentUser","shareId","currentUserId","currentCustomerId","dateRange","undefined","userIds","classroomsAndGroups","InteractiveResultsRequests","interactiveResultSet","interactiveId","interactiveMetadataId","success","error","always","data","type","HttpVerbs","normalize","mark","answerId","resultId","invalidationKeys","pendingReviews","interactives","interactive","metadataId","interactiveResultsReport","useMarkAnswers","onDone","useState","markedAnswers","setMarkedAnswers","dispatch","alerts","addMarkedAnswers","forEach","a","m","submitMarkedAnswers","Object","keys","completeCount","successCount","questionId","I","onSuccess","onAlways","alertMessage","useErrorAlert","smartCount","anonymiseUserName","shouldAnonymise","seed","guid","hash","i","charCodeAt","Math","abs","guidToSeed","floor","Date","getMinutes","dictionaries","separator","style","deleted","groupStudents","results","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","interactions","interactionIds","Set","students","s","withSummary","summary","getStudentResultsSummary","awaitingMarking","push","attempts","has","size","percentCorrect","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","find","toString","getMarkedAnswerId","getMarkedStatus","studentResponse","every","getInteractionResultsSummary","numStudents","numCorrect","answered","unanswered","correct","numInteractions","answeredInteractions","ScoreThresholdDefaults","ScoreThresholdInsights"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 1938-c52383e98d-lite.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1938],{86877:(e,t,n)=>{n.d(t,{Z:()=>f});var r=n(23481);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function u(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}function a(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(a=function(){return!!e})()}function c(e){return c=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},c(e)}function l(e,t){return l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},l(e,t)}var f=function(e){function t(e){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t,n){return t=c(t),function(e,t){if(t&&("object"==o(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,a()?Reflect.construct(t,n||[],c(e).constructor):t.apply(e,n))}(this,t,[e])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&l(e,t)}(t,e),n=t,(u=[{key:"name",get:function(){return"FileTypeError"}},{key:"lang",get:function(){return"upload.fileType"}},{key:"dialogOptions",get:function(){return{title:r.T.getPhrase(this.lang,"heading"),text:r.T.getPhrase(this.lang,"body"),buttons:[{text:r.T.getPhrase(this.lang,"okay"),className:"btn btn-dark",success:!0},{text:r.T.getPhrase(this.lang,"close"),className:"btn btn-link",close:!0}]}}}])&&i(n.prototype,u),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,u}(n(47663).S)},91938:(e,t,n)=>{n.r(t),n.d(t,{BaseVideoUploadService:()=>me,LearningResourceUploadService:()=>Se,MixedMediaUploadService:()=>Oe,SubtitleUploadService:()=>we,UploadType:()=>de});var r,o=n(43823),i=n(21161),u=n(46865),a=n(79976),c=n(37433),l=n(54149),f=n(71365),s=n(23481),p=n(70794),y=n(81886),d=n(20354),h=n(49985),b=n(65858),v=n(29555);!function(e){e[e.Permanent=0]="Permanent",e[e.Temporary=1]="Temporary"}(r||(r={}));var g=n(86877),m=n(28046),w=n(52003),S=n(60735),O=n(99940),k=n(110),P=function(e,t){var n=e.name.split("."),o=t===r.Permanent?null:k.O.add(new Date,7,"days").toISOString(),i={name:n.join("."),extension:n.length>1?n.pop():"",size:e.size,lifestyle:t,dateExpires:o,contentType:e.type||"application/octet-stream",chunkUploadEnabled:!0};return{url:"{gateway}/v1/files/upload",key:"upload:file",type:O.k.POST,data:i}},j=n(53301),T=n.n(j),E=n(47663);function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function _(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,I(r.key),r)}}function I(e){var t=function(e){if("object"!=U(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=U(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==U(t)?t:t+""}function x(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(x=function(){return!!e})()}function R(e){return R=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},R(e)}function F(e,t){return F=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},F(e,t)}var C="upload.internetConnectivityError",D=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t,n){return t=R(t),function(e,t){if(t&&("object"==U(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,x()?Reflect.construct(t,n||[],R(e).constructor):t.apply(e,n))}(this,t,[s.T.getPhrase(C,"title")])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&F(e,t)}(t,e),n=t,(r=[{key:"name",get:function(){return"InternetConnectivityError"}},{key:"dialogOptions",get:function(){return{title:s.T.getPhrase(C,"heading"),text:s.T.getPhrase(C,"body"),buttons:[{text:s.T.getPhrase(C,"okay"),className:"btn btn-outline-dark",success:!0}]}}}])&&_(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(E.S),A=n(44331);function L(e){return L="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},L(e)}function z(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,M(r.key),r)}}function M(e){var t=function(e){if("object"!=L(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=L(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==L(t)?t:t+""}function V(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(V=function(){return!!e})()}function N(e){return N=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},N(e)}function B(e,t){return B=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},B(e,t)}var Q="upload.slowInternetError",q=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t,n){return t=N(t),function(e,t){if(t&&("object"==L(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,V()?Reflect.construct(t,n||[],N(e).constructor):t.apply(e,n))}(this,t,[s.T.getPhrase(Q,"title")])}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&B(e,t)}(t,e),n=t,(r=[{key:"name",get:function(){return"SlowInternetError"}},{key:"dialogOptions",get:function(){return{title:s.T.getPhrase(Q,"heading"),text:s.T.getPhrase(Q,"body"),buttons:[{text:s.T.getPhrase(Q,"okay"),className:"btn btn-outline-dark",success:!0}]}}}])&&z(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(E.S);function G(e){return G="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},G(e)}function Z(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,J(r.key),r)}}function J(e){var t=function(e){if("object"!=G(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=G(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==G(t)?t:t+""}function X(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(X=function(){return!!e})()}function $(e){return $=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},$(e)}function H(e,t){return H=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},H(e,t)}var W=[],K=function(e){function t(e){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),(n=function(e,t,n){return t=$(t),function(e,t){if(t&&("object"==G(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,X()?Reflect.construct(t,n||[],$(e).constructor):t.apply(e,n))}(this,t,[e])).slowInternetTimeout={},n.showSlowInternetTimeout=!0,n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&H(e,t)}(t,e),n=t,r=[{key:"name",get:function(){return"DropzoneWrapper"}},{key:"initialize",value:function(e){var t=this.options.loggingEnabled,n=o.Radio.channel(e.channelName),r=this;this.dropzone=new(T())(document.createElement("div"),{url:function(e){return e[0].cvUpload.ingestUrl},chunking:this.options.chunkingEnabled,chunkSize:this.options.chunkSize,forceChunking:!0,autoProcessQueue:!0,maxFilesize:this.options.maxFileSize,acceptedFiles:this.options.acceptedFiles,paramName:"content",timeout:18e4,init:function(){var e=this;t&&(i.each(W,function(t){e.on(t,function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];var o=n[0]instanceof File?n[0].name:n[0];console.info(t,o,n)})}),this.on("uploadprogress",function(e,t,o){var i=o/e.size*100;n.trigger("progress",r.getId(e),i,o)}),this.on("success",function(e){var t=e.upload.chunks,r=i.last(t),o=r.xhr;o||(o=r.file.xhr);var u=JSON.parse(o.response);e.cvUpload.fileId=u.id,n.trigger(v.S.UPLOAD_SUCCESS,e,u)}),this.on("error",function(e,t,n){n&&0===n.status?y.Q.Ry.throw(new D):"canceled"!==e.status&&y.Q.Ry.throw(new A.n(s.T.getPhrase("upload.services","uploadError",{fileName:e.name,message:t.message})))}),this.on("sending",function(e){window.clearTimeout(r.slowInternetTimeout[e.path]),r.showSlowInternetTimeout&&(r.slowInternetTimeout[e.path]=window.setTimeout(function(){r.showSlowInternetTimeout&&y.Q.Ry.throw(new q),r.showSlowInternetTimeout=!1},3e4))}),this.on("complete",function(e){return window.clearTimeout(r.slowInternetTimeout[e.path])}))},params:function(e,t,n){if(n)return{chunk_index:n.index,upload_length:n.file.size}},addedfile:function(){},thumbnail:function(){},uploadprogress:function(){}})}},{key:"getId",value:function(e){return e.upload.uuid}},{key:"addFile",value:function(e){this.dropzone.addFile(e)}},{key:"removeFile",value:function(e){this.dropzone.removeFile(e)}},{key:"start",value:function(){this.dropzone.processQueue()}},{key:"destroy",value:function(){this.dropzone.destroy()}}],u=[{key:"isValidFile",value:function(e,t){return T().isValidFile(e,t)}}],r&&Z(n.prototype,r),u&&Z(n,u),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r,u}(y.Q.t6);function Y(e){return Y="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},Y(e)}function ee(){var e,t,n="function"==typeof Symbol?Symbol:{},r=n.iterator||"@@iterator",o=n.toStringTag||"@@toStringTag";function i(n,r,o,i){var c=r&&r.prototype instanceof a?r:a,l=Object.create(c.prototype);return te(l,"_invoke",function(n,r,o){var i,a,c,l=0,f=o||[],s=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(t,n){return i=t,a=0,c=e,p.n=n,u}};function y(n,r){for(a=n,c=r,t=0;!s&&l&&!o&&t<f.length;t++){var o,i=f[t],y=p.p,d=i[2];n>3?(o=d===r)&&(c=i[(a=i[4])?5:(a=3,3)],i[4]=i[5]=e):i[0]<=y&&((o=n<2&&y<i[1])?(a=0,p.v=r,p.n=i[1]):y<d&&(o=n<3||i[0]>r||r>d)&&(i[4]=n,i[5]=r,p.n=d,a=0))}if(o||n>1)return u;throw s=!0,r}return function(o,f,d){if(l>1)throw TypeError("Generator is already running");for(s&&1===f&&y(f,d),a=f,c=d;(t=a<2?e:c)||!s;){i||(a?a<3?(a>1&&(p.n=-1),y(a,c)):p.n=c:p.v=c);try{if(l=2,i){if(a||(o="next"),t=i[o]){if(!(t=t.call(i,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,a<2&&(a=0)}else 1===a&&(t=i.return)&&t.call(i),a<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),a=1);i=e}else if((t=(s=p.n<0)?c:n.call(r,p))!==u)break}catch(t){i=e,a=1,c=t}finally{l=1}}return{value:t,done:s}}}(n,o,i),!0),l}var u={};function a(){}function c(){}function l(){}t=Object.getPrototypeOf;var f=[][r]?t(t([][r]())):(te(t={},r,function(){return this}),t),s=l.prototype=a.prototype=Object.create(f);function p(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,te(e,o,"GeneratorFunction")),e.prototype=Object.create(s),e}return c.prototype=l,te(s,"constructor",l),te(l,"constructor",c),c.displayName="GeneratorFunction",te(l,o,"GeneratorFunction"),te(s),te(s,o,"Generator"),te(s,r,function(){return this}),te(s,"toString",function(){return"[object Generator]"}),(ee=function(){return{w:i,m:p}})()}function te(e,t,n,r){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}te=function(e,t,n,r){if(t)o?o(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n;else{var i=function(t,n){te(e,t,function(e){return this._invoke(t,n,e)})};i("next",0),i("throw",1),i("return",2)}},te(e,t,n,r)}function ne(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return re(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)?re(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){a=!0,i=e},f:function(){try{u||null==n.return||n.return()}finally{if(a)throw i}}}}function re(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 oe(e,t,n){return(t=ce(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ie(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ue(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,ce(r.key),r)}}function ae(e,t,n){return t&&ue(e.prototype,t),n&&ue(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function ce(e){var t=function(e){if("object"!=Y(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=Y(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==Y(t)?t:t+""}function le(e,t,n){return t=se(t),function(e,t){if(t&&("object"==Y(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,fe()?Reflect.construct(t,n||[],se(e).constructor):t.apply(e,n))}function fe(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(fe=function(){return!!e})()}function se(e){return se=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},se(e)}function pe(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&ye(e,t)}function ye(e,t){return ye=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},ye(e,t)}var de,he=function(e){function t(){var e;return ie(this,t),(e=le(this,t,[{dataProvider:f.u.getInstance(c.R.Ajax),cache:f.u.getInstance(u.p.Fifo),alertService:f.u.getInstance(a.P.ALERT)}])).incrementingUploadId=0,e}return pe(t,e),ae(t,[{key:"name",get:function(){return"UploadDataService"}},{key:"channelName",get:function(){return"private:upload:data:service"}},{key:"requestUploads",value:function(e,t,n,r,o){var u=this,a=this.chain();i.each(t,function(t){u.incrementingUploadId++,a.create({resource:e,eventPrefix:"request:upload:".concat(u.incrementingUploadId),data:u.getFileUploadRequest(t,n),callback:function(e){r(t,e)},errorHandler:u.alertService.error("Something went wrong while we were uploading your video. Please try again.")})}),a.func(function(){o()}).run()}},{key:"cancelUpload",value:function(e,t,n){this.create({resource:"/api/upload/cancel",eventPrefix:"cancel:upload",data:{uploadId:e,ingestUrl:t},callback:n})}},{key:"getFileUploadRequest",value:function(e,t){var n=e.name.split(".");return{name:n.join("."),extension:n.length>1?n.pop():"",fileSize:e.size,fileLifestyle:t}}},{key:"onDestroy",value:function(){f.u.releaseInstance(c.R.Ajax).releaseInstance(u.p.Fifo)}}])}(l.B);!function(e){e[e.Video=0]="Video",e[e.LearningResource=1]="LearningResource",e[e.Subtitle=2]="Subtitle",e[e.MixedMedia=3]="MixedMedia"}(de||(de={}));var be=oe(oe(oe(oe({},de.Video,m.l.VIDEO),de.LearningResource,m.l.RESOURCES),de.Subtitle,m.l.SUBTITLES),de.MixedMedia,m.l.MIXED_MEDIA),ve=oe(oe(oe(oe({},de.Video,w.Q4.VIDEO_UPLOAD),de.LearningResource,w.Q4.RESOURCE_UPLOAD),de.Subtitle,w.Q4.SUBTITLE_UPLOAD),de.MixedMedia,w.Q4.MIXED_MEDIA_UPLOAD),ge=function(e){function t(){return ie(this,t),le(this,t,arguments)}return pe(t,e),ae(t,[{key:"initialize",value:function(){this.uploadDataService=new he,this.progressViewModel=p.r.get("upload:progress:".concat(this.uploadType)),this.bindListeners()}},{key:"channelName",get:function(){return ve[this.uploadType]}},{key:"lang",get:function(){return"uploadShared.services"}},{key:"initUploader",value:function(e,t){if(!this.uploader){var n=4194304;e&&n<e&&(n=e),t&&n>t&&(n=t),this.uploader=new K({chunkingEnabled:!0,loggingEnabled:!0,chunkSize:n,maxFileSize:53687091200,acceptedFiles:this.getAcceptedFiles(),channelName:this.channelName})}}},{key:"bindListeners",value:function(){this.listenTo(this.channelName,"progress",this.onProgress),this.listenTo(this.channelName,v.S.UPLOAD_SUCCESS,this.onSuccess)}},{key:"onProgress",value:function(e,t,n){var r=this.collection.get(e);r&&(r.set({progress:t>100?100:t,totalUploaded:n}),this.setOverallProgress())}},{key:"isUploading",value:function(){return!!this.getCollection().length}},{key:"getCollection",value:function(){return this.collection||(this.collection=new y.Q.FE),this.collection}},{key:"setOverallProgress",value:function(){var e=this,t=0,n=0,r=this.getCollection();if(r.length){r.each(function(e){t+=e.get("totalUploaded")||0,n+=e.get("file").size||0});var o=t/n*100,i=o>=100,u=function(){e.progressViewModel.set({progress:i?100:o,done:i})};i?window.setTimeout(u,2e3):u()}else this.progressViewModel.set({progress:0})}},{key:"isValidFile",value:function(e){return K.isValidFile(e,this.getAcceptedFiles())}},{key:"addFiles",value:function(e,t){var n=this;i.any(e,function(e){return!n.isValidFile(e)})?y.Q.Ry.throw(new g.Z(s.T.getPhrase(this.lang,"invalidFileType"))):this.requestUploads(e,t)}},{key:"requestUploads",value:function(e,t){return n=this,r=void 0,i=void 0,u=ee().m(function n(){var r,i,u,a,c,l,f,s,p;return ee().w(function(n){for(;;)switch(n.n){case 0:r=this.isUploading(),i=this.getCollection(),u=ne(e),n.p=1,u.s();case 2:if((a=u.n()).done){n.n=5;break}return c=a.value,n.n=3,d.a.fetchAsync(this.options.store.dispatch,P(c,this.fileLifestyle));case 3:"minChunkSize"in(l=n.v)&&"maxChunkSize"in l&&this.initUploader(l.minChunkSize,l.maxChunkSize),c.cvUpload={uploadId:l.uploadId,ingestUrl:l.uploadUrl},this.uploader.addFile(c),f=c.name,this.uploadType===de.Video&&(f=f.replace(/\.[^/.]+$/,"")),s=this.uploader.getId(c),i.add(Object.assign({id:s,file:c,name:f},this.getAdditionalFileInfo(c,l)),{at:i.length-1});case 4:n.n=2;break;case 5:n.n=7;break;case 6:n.p=6,p=n.v,u.e(p);case 7:return n.p=7,u.f(),n.f(7);case 8:t&&h.k.logUserAction({uploadCount:e.length},t),o.Radio.channel(this.channelName).trigger(v.S.FILES_ADDED,e,r);case 9:return n.a(2)}},n,this,[[1,6,7,8]])}),new(i||(i=Promise))(function(e,t){function o(e){try{c(u.next(e))}catch(e){t(e)}}function a(e){try{c(u.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i(function(e){e(n)})).then(o,a)}c((u=u.apply(n,r||[])).next())});var n,r,i,u}},{key:"addFile",value:function(e,t){this.addFiles([e],t)}},{key:"cancelUpload",value:function(e){var t=this,n=this.getCollection(),r=n.get(e);if(r){var i=r.get("file");this.uploader.removeFile(i),n.remove(r),this.uploadDataService.cancelUpload(i.cvUpload.uploadId,i.cvUpload.ingestUrl,function(){h.k.logUserAction(r.toJSON(),{entity:b.py.Video,actionType:b.Vw.Upload,workflowPhase:b.eu.Discard,descriptor:b.yh.Single,location:b.LZ.MyUploads}),o.Radio.channel(t.channelName).trigger(v.S.UPLOAD_CANCELLED)}),this.setOverallProgress()}}},{key:"onSuccess",value:function(e,t){var n=this.uploader.getId(e),r=this.getCollection().get(n);r.set("fileInfo",t),h.k.logUserAction({id:e.cvUpload.uploadId},{entity:b.py.Video,actionType:b.Vw.Upload,workflowPhase:b.eu.Complete,descriptor:b.yh.Single,location:b.LZ.VideoUpload}),o.Radio.channel(this.channelName).trigger(v.S.UPLOAD_COMPLETE,r)}},{key:"cancelAllUploads",value:function(){var e=this,t=this.getCollection().map(function(e){return e.get("id")});i.each(t,function(t){return e.cancelUpload(t)})}},{key:"getUpload",value:function(e){var t=this.uploader.getId(e);return this.getCollection().get(t)}},{key:"getAcceptedFiles",value:function(){return be[this.uploadType]}},{key:"getAdditionalFileInfo",value:function(e,t){return{}}}])}(y.Q.t6),me=function(e){function t(){return ie(this,t),le(this,t,arguments)}return pe(t,e),ae(t,[{key:"uploadType",get:function(){return de.Video}},{key:"name",get:function(){return S.D.VideoUpload}},{key:"fileLifestyle",get:function(){return r.Temporary}}])}(ge),we=function(e){function t(){return ie(this,t),le(this,t,arguments)}return pe(t,e),ae(t,[{key:"uploadType",get:function(){return de.Subtitle}},{key:"name",get:function(){return S.D.SubtitleUpload}},{key:"fileLifestyle",get:function(){return r.Permanent}}])}(ge),Se=function(e){function t(){return ie(this,t),le(this,t,arguments)}return pe(t,e),ae(t,[{key:"uploadType",get:function(){return de.LearningResource}},{key:"name",get:function(){return S.D.ResourceUpload}},{key:"fileLifestyle",get:function(){return r.Permanent}}])}(ge),Oe=function(e){function t(){return ie(this,t),le(this,t,arguments)}return pe(t,e),ae(t,[{key:"uploadType",get:function(){return de.MixedMedia}},{key:"name",get:function(){return S.D.MixedMediaUpload}},{key:"fileLifestyle",get:function(){return r.Temporary}}])}(ge)}}]);
|
|
3
|
+
//# sourceMappingURL=1938-c52383e98d-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/1938-c52383e98d-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/upload/errors/file-type/FileTypeError.ts","file:///app/packages/libs/shared/src/apps/upload/enums/FileLifestyle.ts","file:///app/packages/libs/shared/src/apps/upload/flight-requests/UploadRequests.ts","file:///app/packages/libs/shared/src/apps/upload/errors/internet-connectivity/InternetConnectivityError.ts","file:///app/packages/libs/shared/src/apps/upload/errors/slow-internet/SlowInternetError.ts","file:///app/packages/libs/shared/src/apps/upload/services/DropzoneWrapper.ts","file:///app/packages/libs/shared/src/apps/upload/services/UploadService.ts"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\n/**\n * TODO: Create a more useful message here.\n * Perhaps using the mime types listen on MDN\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types\n * or in the list of all the official mime types\n * https://www.iana.org/assignments/media-types/media-types.xhtml\n */\nexport class FileTypeError extends DialogError {\n constructor(message: string) {\n super(message);\n }\n\n // @ts-ignore\n public get name(): string {\n return 'FileTypeError';\n }\n\n // @ts-ignore\n public get lang(): string {\n return 'upload.fileType';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(this.lang, 'heading'),\n text: LanguageService.getPhrase(this.lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(this.lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }, {\n text: LanguageService.getPhrase(this.lang, 'close'),\n className: 'btn btn-link',\n close: true\n }]\n };\n }\n}","export enum FileLifestyle {\n Permanent = 0,\n Temporary = 1\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/react/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FileLifestyle } from '../enums/FileLifestyle';\n\nexport const UploadRequests = {\n requestUpload(file: File, fileLifestyle: FileLifestyle): Flight.Request {\n const splitName = file.name.split('.');\n\n const dateExpires = fileLifestyle === FileLifestyle.Permanent\n ? null\n : DateHelper.add(new Date(), 7, 'days').toISOString();\n\n const data = {\n name: splitName.join('.'),\n extension: splitName.length > 1 ? splitName.pop() : '',\n size: file.size,\n lifestyle: fileLifestyle,\n dateExpires,\n contentType: file.type || 'application/octet-stream',\n chunkUploadEnabled: true\n };\n\n return {\n url: `{gateway}/v1/files/upload`,\n key: 'upload:file',\n type: HttpVerbs.POST,\n data\n };\n }\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'upload.internetConnectivityError';\n\nexport class InternetConnectivityError extends DialogError {\n constructor() {\n super(LanguageService.getPhrase(lang, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'InternetConnectivityError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-outline-dark',\n success: true\n }]\n };\n }\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst lang = 'upload.slowInternetError';\n\nexport class SlowInternetError extends DialogError {\n constructor() {\n super(LanguageService.getPhrase(lang, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'SlowInternetError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'body'),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-outline-dark',\n success: true\n }]\n };\n }\n}","import { ObjectHash, Radio } from 'backbone';\nimport Dropzone from 'dropzone';\nimport * as _ from 'underscore';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InternetConnectivityError } from 'libs/shared/apps/upload/errors/internet-connectivity/InternetConnectivityError';\nimport { AlertError } from 'libs/shared/errors/primitives/AlertError';\n\nimport { UploadEventNames } from '../constants/UploadConstants';\nimport { SlowInternetError } from '../errors/slow-internet/SlowInternetError';\n\nexport interface UploadApiWrapperOptions extends Core.ServiceOptions {\n maxFileSize: number;\n chunkSize: number;\n chunkingEnabled: boolean;\n loggingEnabled: boolean;\n acceptedFiles: string;\n channelName: string;\n}\n\nexport interface UploadApiWrapper {\n addFile(file: File): void;\n destroy(): void;\n start(): void;\n getId(file: File): string;\n removeFile(file: File): void;\n}\n\nconst dropzoneEvents: string[] = [\n // 'uploadprogress', 'totaluploadprogress',\n // 'addedfile', 'removedfile', 'thumbnail', 'error', 'processing',\n // 'sending', 'success', 'complete', 'addedfile',\n // 'maxfilesreached', 'maxfilesexceeded', 'processingmultiple',\n // 'sendingmultiple', 'completemultiple', 'canceledmultiple',\n // 'reset', 'queuecomplete'\n];\n\nexport class DropzoneWrapper extends Core.Service implements UploadApiWrapper {\n private dropzone: Dropzone;\n public options: UploadApiWrapperOptions;\n\n private slowInternetTimeout: {[uploadId: string]: number} = {};\n private showSlowInternetTimeout: boolean = true;\n\n // @ts-ignore\n public get name(): string {\n return 'DropzoneWrapper';\n }\n\n constructor(options: UploadApiWrapperOptions) {\n super(options);\n }\n\n public initialize(options: UploadApiWrapperOptions): void {\n const { loggingEnabled } = this.options;\n\n const uploadChannel = Radio.channel(options.channelName);\n\n /**\n * Thought I wouldn't see this in any of our TS\n * Guess I was wrong - sha\n */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n this.dropzone = new Dropzone(document.createElement('div'), {\n url: ((files: Dropzone.DropzoneFile[]) => {\n const file = files[0] as any;\n\n const { ingestUrl } = file.cvUpload;\n\n return ingestUrl;\n }) as any,\n\n chunking: this.options.chunkingEnabled,\n chunkSize: this.options.chunkSize,\n forceChunking: true,\n autoProcessQueue: true,\n maxFilesize: this.options.maxFileSize,\n acceptedFiles: this.options.acceptedFiles,\n paramName: 'content',\n timeout: 180000, // 3 mins in milliseconds\n\n init: function (): void {\n if (!loggingEnabled)\n return;\n\n _.each(dropzoneEvents, (eventName: string) => {\n this.on(eventName, (...args: any[]) => {\n const file = args[0] instanceof File ? args[0].name : args[0];\n console.info(eventName, file, args);\n });\n });\n\n this.on('uploadprogress', (file: File, percentage: number, totalBytes: number) => {\n const progress = totalBytes / file.size * 100;\n uploadChannel.trigger('progress', self.getId(file), progress, totalBytes);\n });\n\n this.on('success', (file: File) => {\n /**\n * This is sort of a hack. It assumes the last chunk will be the last chunk that is uploaded\n * which may not necessarily be the case\n */\n const chunks = (file as any).upload.chunks;\n\n const lastChunk = _.last(chunks) as any;\n\n let xhr = lastChunk.xhr;\n\n if (!xhr)\n xhr = lastChunk.file.xhr;\n\n const response = JSON.parse(xhr.response);\n\n (file as any).cvUpload.fileId = response.id;\n\n uploadChannel.trigger(UploadEventNames.UPLOAD_SUCCESS, file, response);\n });\n\n this.on('error', (file: File, messageObj: ObjectHash, xhr: XMLHttpRequest) => {\n if (xhr && xhr.status === 0) {\n Core.ErrorHelper.throw(new InternetConnectivityError());\n return;\n }\n\n /**\n * Don't throw if the error was caused by canceling\n * the chunk upload. this will happen when the user cancels\n * an upload themselves.\n */\n if ((file as Dropzone.DropzoneFile).status !== 'canceled')\n Core.ErrorHelper.throw(\n new AlertError(LanguageService.getPhrase('upload.services', 'uploadError', {\n fileName: file.name,\n message: messageObj.message\n }))\n );\n });\n\n /**\n * We've increased the upload timeout from 30s to 3mins. This means that the upload\n * will not timeout with an upload speed as slow as 200Kbps. However if a single chunk takes\n * longer than 30s, which is an upload speed of 1Mbps. We'll show a dialog letting the user\n * know that their internet speed is very slow, and the upload may take quite some time.\n * - Sha\n */\n this.on('sending', (file: File) => {\n window.clearTimeout(self.slowInternetTimeout[(file as any).path]);\n\n if (!self.showSlowInternetTimeout)\n return;\n\n self.slowInternetTimeout[(file as any).path] = window.setTimeout(() => {\n if (self.showSlowInternetTimeout)\n Core.ErrorHelper.throw(new SlowInternetError());\n\n self.showSlowInternetTimeout = false;\n }, 30000); // 30s\n });\n\n /**\n * Complete will trigger both on successful uploads and on a cancelled upload.\n */\n this.on('complete', (file: File) => window.clearTimeout(self.slowInternetTimeout[(file as any).path]));\n },\n\n params: (files: Dropzone.DropzoneFile[], xhr: XMLHttpRequest, chunk: any) => {\n if (!chunk)\n return;\n\n return {\n chunk_index: chunk.index,\n upload_length: chunk.file.size\n };\n },\n\n /**\n * These methods are here to disable Dropzone's UI related features\n */\n addedfile: () => {},\n thumbnail: () => {},\n uploadprogress: () => {}\n });\n }\n\n public getId(file: File): string {\n return (file as any).upload.uuid;\n }\n\n public addFile(file: Dropzone.DropzoneFile): void {\n this.dropzone.addFile(file);\n }\n\n public removeFile(file: Dropzone.DropzoneFile): void {\n this.dropzone.removeFile(file);\n }\n\n public start(): void {\n this.dropzone.processQueue();\n }\n\n public destroy(): void {\n this.dropzone.destroy();\n }\n\n public static isValidFile(file: File, acceptedFiles: string): boolean {\n return Dropzone.isValidFile(file, acceptedFiles);\n }\n}","import { Radio } from 'backbone';\nimport { Store } from 'redux';\nimport * as _ from 'underscore';\n\nimport { Caches } from 'libs/common/backbone/constants/Caches';\nimport { CommonServices } from 'libs/common/backbone/constants/CommonServices';\nimport { DataProviders } from 'libs/common/backbone/constants/DataProviders';\nimport { BaseDataService } from 'libs/common/backbone/services/BaseDataService';\nimport { InstanceManager } from 'libs/common/backbone/services/InstanceManager';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ViewModelService } from 'libs/common/backbone/services/ViewModelService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { UploadEventNames } from 'libs/shared/apps/upload/constants/UploadConstants';\nimport { FileLifestyle } from 'libs/shared/apps/upload/enums/FileLifestyle';\nimport { FileTypeError } from 'libs/shared/apps/upload/errors/file-type/FileTypeError';\nimport { FileExtensions } from 'libs/shared/apps/upload/utils/FileExtensionsHelper';\nimport { SharedServiceChannels } from 'libs/shared/constants/RadioChannels';\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\n\nimport { UploadRequests } from '../flight-requests/UploadRequests';\n\nimport { DropzoneWrapper, UploadApiWrapper } from './DropzoneWrapper';\n\ntype FileUploadRequestResponse = {\n maxChunkSize: number;\n minChunkSize: number;\n uploadExpireDate: string;\n uploadId: string;\n uploadUrl: string;\n}\n\n/**\n * This data service is locally private and is only\n * used by the UploadService to request/cancel uploads from\n * FileApi\n */\nclass UploadDataService extends BaseDataService {\n constructor() {\n super({\n dataProvider: InstanceManager.getInstance(DataProviders.Ajax),\n cache: InstanceManager.getInstance(Caches.Fifo),\n alertService: InstanceManager.getInstance(CommonServices.ALERT)\n });\n }\n\n private incrementingUploadId: number = 0;\n\n // @ts-ignore\n public get name(): string {\n /**\n * This string is not in DataServices because this data service is private.\n */\n return 'UploadDataService';\n }\n\n /**\n * This is not sitting in RadioChannels\n * because it is only used in this file\n */\n // @ts-ignore\n public get channelName(): string {\n return 'private:upload:data:service';\n }\n\n public requestUploads(\n resource: string,\n files: File[],\n fileLifestyle: FileLifestyle,\n fileCallback: (file: File, response: any) => void,\n callback: () => void\n ): void {\n const chain = this.chain();\n\n _.each(files, file => {\n this.incrementingUploadId++;\n\n chain.create({\n resource,\n eventPrefix: `request:upload:${this.incrementingUploadId}`,\n data: this.getFileUploadRequest(file, fileLifestyle),\n callback: (response: any) => {\n fileCallback(file, response);\n },\n errorHandler: this.alertService.error(`Something went wrong while we were uploading your video. Please try again.`)\n });\n });\n\n chain.func(() => {\n callback();\n }).run();\n }\n\n public cancelUpload(uploadId: string, ingestUrl: string, callback?: (response: any) => void): void {\n this.create({\n resource: '/api/upload/cancel',\n eventPrefix: 'cancel:upload',\n data: {\n uploadId, ingestUrl\n },\n callback\n });\n }\n\n private getFileUploadRequest(file: File, fileLifestyle: FileLifestyle): HashObject {\n const splitName = file.name.split('.');\n\n /**\n * TODO: We may need to set the file permanence in file api to\n * permanent for resources and subtitles\n * Check what Prad/Cam say in\n * https://app.asana.com/0/720933954350984/735809491718142\n */\n return {\n name: splitName.join('.'),\n extension: splitName.length > 1 ? splitName.pop() : '',\n fileSize: file.size,\n fileLifestyle\n };\n }\n\n public onDestroy(): void {\n InstanceManager\n .releaseInstance(DataProviders.Ajax)\n .releaseInstance(Caches.Fifo);\n }\n}\n\n\nexport interface UploadItem extends Core.Model {\n file: File;\n name: string;\n progress: number;\n}\n\nexport enum UploadType {\n Video,\n LearningResource,\n Subtitle,\n MixedMedia\n}\n\nconst AcceptedFiles = {\n [UploadType.Video]: FileExtensions.VIDEO,\n [UploadType.LearningResource]: FileExtensions.RESOURCES,\n [UploadType.Subtitle]: FileExtensions.SUBTITLES,\n [UploadType.MixedMedia]: FileExtensions.MIXED_MEDIA\n};\n\nconst ChannelNames = {\n [UploadType.Video]: SharedServiceChannels.VIDEO_UPLOAD,\n [UploadType.LearningResource]: SharedServiceChannels.RESOURCE_UPLOAD,\n [UploadType.Subtitle]: SharedServiceChannels.SUBTITLE_UPLOAD,\n [UploadType.MixedMedia]: SharedServiceChannels.MIXED_MEDIA_UPLOAD\n};\n\nconst CHUNK_SIZE = 1024 * 1024 * 4; // 4mb\nconst MAX_FILE_SIZE = 1024 * 1024 * 1024 * 50; // 50gb\n\nexport interface UploadServiceOptions {\n store?: Store;\n}\n\nclass UploadService extends Core.Service {\n protected options: UploadServiceOptions;\n protected uploadType: UploadType;\n protected fileLifestyle: FileLifestyle;\n\n protected uploader: UploadApiWrapper;\n\n private progressViewModel: Core.Model;\n\n private uploadDataService: UploadDataService;\n\n private collection: Core.Collection<UploadItem>;\n\n public initialize(): void {\n this.uploadDataService = new UploadDataService();\n\n this.progressViewModel = ViewModelService.get(`upload:progress:${this.uploadType}`);\n\n this.bindListeners();\n }\n\n // @ts-ignore\n public get channelName(): string {\n return ChannelNames[this.uploadType];\n }\n\n // @ts-ignore\n public get lang(): string {\n return 'uploadShared.services';\n }\n\n /**\n * Dropzone is initialized once after the first upload is requested and it's chunk size\n * is set for the rest of the uploads. If we happen to have multiple ingest\n * servers that have different chunk max / min sizes, this may voilate those\n * sizes.\n */\n private initUploader(minChunkSize: number, maxChunkSize: number): void {\n if (this.uploader)\n return;\n\n let chunkSize = CHUNK_SIZE;\n\n if (minChunkSize && chunkSize < minChunkSize)\n chunkSize = minChunkSize;\n\n if (maxChunkSize && chunkSize > maxChunkSize)\n chunkSize = maxChunkSize;\n\n this.uploader = new DropzoneWrapper({\n chunkingEnabled: true,\n loggingEnabled: true,\n chunkSize,\n maxFileSize: MAX_FILE_SIZE,\n acceptedFiles: this.getAcceptedFiles(),\n channelName: this.channelName\n });\n }\n\n private bindListeners(): void {\n this.listenTo(this.channelName, 'progress', this.onProgress);\n\n this.listenTo(this.channelName, UploadEventNames.UPLOAD_SUCCESS, this.onSuccess);\n }\n\n private onProgress(id: string, percentage: number, totalUploaded: number): void {\n const model = this.collection.get(id);\n\n if (!model)\n return;\n\n model.set({\n progress: percentage > 100 ? 100 : percentage,\n totalUploaded\n });\n\n this.setOverallProgress();\n }\n\n public isUploading(): boolean {\n return !!this.getCollection().length;\n }\n\n public getCollection(): Core.Collection<UploadItem> {\n if (this.collection)\n return this.collection;\n\n this.collection = new Core.Collection<UploadItem>();\n return this.collection;\n }\n\n public setOverallProgress(): void {\n let totalUploaded = 0;\n let totalFileSize = 0;\n\n const collection = this.getCollection();\n\n if (!collection.length) {\n this.progressViewModel.set({ progress: 0 });\n return;\n }\n\n collection.each((model: Core.Model) => {\n totalUploaded += model.get('totalUploaded') || 0;\n totalFileSize += model.get('file').size || 0;\n });\n\n const percentage = totalUploaded / totalFileSize * 100;\n\n const done = percentage >= 100;\n\n const updateProgress = () => {\n this.progressViewModel.set({\n progress: done ? 100 : percentage,\n done\n });\n };\n\n if (!done) {\n updateProgress();\n return;\n }\n \n /**\n * The ingest backend takes a short while after an upload is done\n * before the complete endpoint will actually response successfully.\n * So this prevents the eager beavers from clicking \"finish\" immediately\n * and having their entire upload session break.\n * - Sha\n */\n window.setTimeout(updateProgress, 2000);\n }\n\n public isValidFile(file: File): boolean {\n return DropzoneWrapper.isValidFile(file, this.getAcceptedFiles());\n }\n\n /**\n * Request uploads from fileApi and starts uploading.\n * @param files Array of browser File objects\n * @returns Returns false if any of the files did not match the accepted file list.\n */\n public addFiles(files: File[], analyticsOptions?: AnalyticsOptions): void {\n if (_.any(files, file => !this.isValidFile(file))) {\n Core.ErrorHelper.throw(\n new FileTypeError(LanguageService.getPhrase(this.lang, 'invalidFileType'))\n );\n return;\n }\n\n this.requestUploads(files, analyticsOptions);\n }\n\n private async requestUploads(files: File[], analyticsOptions?: AnalyticsOptions): Promise<void> {\n const wasUploading = this.isUploading();\n\n const collection = this.getCollection();\n\n for (const file of files) {\n const response = await Flight.fetchAsync<FileUploadRequestResponse>(\n this.options.store.dispatch,\n UploadRequests.requestUpload(file, this.fileLifestyle)\n );\n\n if ('minChunkSize' in response && 'maxChunkSize' in response) {\n this.initUploader(response.minChunkSize, response.maxChunkSize);\n }\n\n (file as any).cvUpload = {\n uploadId: response.uploadId,\n ingestUrl: response.uploadUrl\n };\n\n this.uploader.addFile(file);\n\n let fileName = file.name;\n\n // Remove file extension from filename if video\n if (this.uploadType === UploadType.Video)\n fileName = fileName.replace(/\\.[^/.]+$/, '');\n\n const id = this.uploader.getId(file);\n collection.add({\n id,\n file,\n name: fileName,\n ...this.getAdditionalFileInfo(file, response)\n }, { at: collection.length - 1 });\n }\n\n if (analyticsOptions) {\n AnalyticsHelper.logUserAction({\n uploadCount: files.length\n }, analyticsOptions);\n }\n\n const channel = Radio.channel(this.channelName);\n channel.trigger(UploadEventNames.FILES_ADDED, files, wasUploading);\n }\n\n public addFile(file: File, analyticsOptions: AnalyticsOptions): void {\n this.addFiles([file], analyticsOptions);\n }\n\n public cancelUpload(id: string): void {\n const collection = this.getCollection();\n const model = collection.get(id);\n\n if (!model)\n return;\n\n const file = model.get('file') as any;\n\n this.uploader.removeFile(file);\n collection.remove(model);\n\n this.uploadDataService.cancelUpload(file.cvUpload.uploadId, file.cvUpload.ingestUrl, () => {\n AnalyticsHelper.logUserAction(model.toJSON(), {\n entity: EntityType.Video,\n actionType: UserAction.Upload,\n workflowPhase: WorkflowPhase.Discard,\n descriptor: OperationDescriptor.Single,\n location: LocationContext.MyUploads\n });\n\n Radio.channel(this.channelName).trigger(UploadEventNames.UPLOAD_CANCELLED);\n });\n\n this.setOverallProgress();\n }\n\n protected onSuccess(file: File, response: any): void {\n const fileId = this.uploader.getId(file);\n\n const upload = this.getCollection().get(fileId);\n\n upload.set('fileInfo', response);\n\n AnalyticsHelper.logUserAction({\n id: (file as any).cvUpload.uploadId\n }, {\n entity: EntityType.Video,\n actionType: UserAction.Upload,\n workflowPhase: WorkflowPhase.Complete,\n descriptor: OperationDescriptor.Single,\n location: LocationContext.VideoUpload\n });\n\n const channel = Radio.channel(this.channelName);\n channel.trigger(UploadEventNames.UPLOAD_COMPLETE, upload);\n }\n\n public cancelAllUploads(): void {\n /**\n * We're using model ids and _.each\n * instead of collection.each because this.cancelUpload\n * removes items from the collection which breaks collection.each\n */\n const models = this.getCollection().map(m => m.get('id'));\n _.each(models, m => this.cancelUpload(m));\n }\n\n public getUpload(file: File): Core.Model {\n const fileId = this.uploader.getId(file);\n\n return this.getCollection().get(fileId);\n }\n\n protected getAcceptedFiles(): string {\n return AcceptedFiles[this.uploadType];\n }\n\n // eslint-disable-next-line\n protected getAdditionalFileInfo(file: File, response: any): HashObject {\n return {};\n }\n}\n\nexport class BaseVideoUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.Video;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.VideoUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Temporary;\n }\n}\n\nexport class SubtitleUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.Subtitle;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.SubtitleUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Permanent;\n }\n}\n\nexport class LearningResourceUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.LearningResource;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.ResourceUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Permanent;\n }\n}\n\nexport class MixedMediaUploadService extends UploadService {\n // @ts-ignore\n protected get uploadType(): UploadType {\n return UploadType.MixedMedia;\n }\n\n // @ts-ignore\n public get name(): string {\n return SharedServices.MixedMediaUpload;\n }\n\n // @ts-ignore\n public get fileLifestyle(): FileLifestyle {\n return FileLifestyle.Temporary;\n }\n}"],"names":["FileTypeError","message","title","this","lang","text","buttons","className","success","close","FileLifestyle","UploadRequests","file","fileLifestyle","splitName","name","split","dateExpires","Permanent","DateHelper","Date","toISOString","data","join","extension","length","pop","size","lifestyle","contentType","type","chunkUploadEnabled","url","key","HttpVerbs","InternetConnectivityError","LanguageService","DialogError","SlowInternetError","dropzoneEvents","DropzoneWrapper","options","slowInternetTimeout","showSlowInternetTimeout","loggingEnabled","uploadChannel","Radio","channelName","self","dropzone","document","createElement","files","cvUpload","ingestUrl","chunking","chunkingEnabled","chunkSize","forceChunking","autoProcessQueue","maxFilesize","maxFileSize","acceptedFiles","paramName","timeout","init","eventName","on","args","File","console","info","percentage","totalBytes","progress","trigger","getId","chunks","upload","lastChunk","xhr","response","JSON","parse","fileId","id","messageObj","status","AlertError","fileName","window","clearTimeout","path","setTimeout","params","chunk","chunk_index","index","upload_length","addedfile","thumbnail","uploadprogress","uuid","addFile","removeFile","processQueue","destroy","UploadType","UploadDataService","dataProvider","InstanceManager","DataProviders","cache","Caches","alertService","CommonServices","incrementingUploadId","resource","fileCallback","callback","chain","create","eventPrefix","getFileUploadRequest","errorHandler","error","func","run","uploadId","fileSize","releaseInstance","BaseDataService","B","AcceptedFiles","Video","LearningResource","Subtitle","MixedMedia","ChannelNames","UploadService","uploadDataService","progressViewModel","ViewModelService","uploadType","bindListeners","minChunkSize","maxChunkSize","uploader","getAcceptedFiles","listenTo","onProgress","onSuccess","totalUploaded","model","collection","get","set","setOverallProgress","getCollection","totalFileSize","each","done","updateProgress","isValidFile","analyticsOptions","requestUploads","wasUploading","isUploading","store","dispatch","initUploader","uploadUrl","replace","add","getAdditionalFileInfo","at","AnalyticsHelper","uploadCount","addFiles","remove","cancelUpload","toJSON","entity","actionType","workflowPhase","descriptor","location","models","map","m","BaseVideoUploadService","SharedServices","Temporary","SubtitleUploadService","LearningResourceUploadService","MixedMediaUploadService"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2074],{44746:(e,a,t)=>{t.r(a),t.d(a,{HardGateInsightsView:()=>F});var s=t(32735),i=t(23481),n=t(20354),c=t(18488),r=t(21789),l=t(97958),d=t(83345),o=t(16714),h=t(39151),m=t(1666),u=t(31949),p=t(93322),E=t(22902),g=t(79612),I=t(35223),v=t(31908),b=t(99742),w=t(14070),C=t(97291),N=t(88630),_=t(74049),k=t(10447),V="insights.hardGateInsightsView",y=i.T.encloseNamespace(V);function F(e){var a,t;(0,p.F)();var i=(0,E.T)(),F=i.hasPermissions,S=i.getGatedPermission,G=n.a.useBasicFetch(h.L.config()),x=n.a.useBasicFetch(u.N.currentUser()),A=n.a.useBasicFetch(x.data&&m.h.yearGroups(x.data.customerId)),P=n.a.useBasicFetch(c.o.getShare(e.shareId)),T=r.x.getClassroomIdFromShare(P.data),f=n.a.useBasicFetch(T&&N.F.getClassroom(T)),B=P.data&&v.M.getVideoRequest(P.data.objectId,P.data.objectTypeId),L=n.a.useBasicFetch(B);return(0,g.M)({title:L.data?y("pageTitle",{video:null===(a=L.data)||void 0===a?void 0:a.name}):null}),s.createElement("div",{className:"px-3"},s.createElement(_.j,{video:L.data,classroom:f.data,tabs:(0,k.$6)(P.data,"insights"),hasAnalytics:F(o.C.ViewCustomerAnalytics),analyticsWebUrl:null===(t=G.data)||void 0===t?void 0:t.analyticsWebUrl,share:P.data,yearGroups:A.data,hasData:!1,viewInsightsGatedPermission:S(o.C.ViewInsights)}),s.createElement(l.u,null,s.createElement(l.u.Image,{src:b.W.Insights.SEND_PAPER_PLANE}),s.createElement(l.u.Heading,null,s.createElement(d.x,{namespace:V,phrase:"heading"})),s.createElement(l.u.Info,{className:"w-75"},s.createElement(d.x,{namespace:V,phrase:"description"})," "),s.createElement(l.u.Cta,{text:y("cta"),appLink:{application:C.O.SIGN_UP,action:w.e.SignUp.INVITE_COLLEAGUE},icon:I.vn.Share,className:"btn btn-dark mb-3"}),s.createElement(l.u.Cta,{text:"View demo data",appLink:{application:C.O.MY_SHARES,action:w.e.MyShares.INTERACTIVE_OVERVIEW_DEMO},className:"btn btn-link text-info py-0"})))}}}]);
|
|
2
|
+
//# sourceMappingURL=2074-39b86b9a22-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/2074-39b86b9a22-lite.chunk.js","mappings":"mZA6BMA,EAAY,gCACZC,EAAY,qBAAiCD,GAM7C,SAAUE,EAAqBC,G,SACnC,SAEA,OAA+C,SAAvCC,EAAc,EAAdA,eAAgBC,EAAkB,EAAlBA,mBAElBC,EAAS,kBAA6B,cACtCC,EAAc,kBAAkC,mBAChDC,EAAa,kBACjBD,EAAYE,MAAQ,eAA4BF,EAAYE,KAAKC,aAG7DC,EAAQ,kBAA4B,aAAuBR,EAAMS,UAEjEC,EAAc,4BAAoCF,EAAMF,MACxDK,EAAY,kBAAgCD,GAAe,iBAA+BA,IAE1FE,EAAeJ,EAAMF,MAAQ,oBAA4BE,EAAMF,KAAKO,SAAUL,EAAMF,KAAKQ,cACzFC,EAAQ,kBAAiCH,GAI/C,OAFA,OAAmB,CAAEI,MAAOD,EAAMT,KAAOR,EAAU,YAAa,CAAEiB,MAAiB,QAAV,EAAAA,EAAMT,YAAI,eAAEW,OAAU,OAG7F,uBAAKC,UAAU,QACb,gBAAC,IAAc,CACbH,MAAOA,EAAMT,KACbK,UAAWA,EAAUL,KACrBa,MAAM,QAAqBX,EAAMF,KAAM,YACvCc,aAAcnB,EAAe,2BAC7BoB,gBAA4B,QAAX,EAAAlB,EAAOG,YAAI,eAAEe,gBAC9Bb,MAAOA,EAAMF,KACbD,WAAYA,EAAWC,KACvBgB,SAAS,EACTC,4BAA6BrB,EAAmB,oBAElD,gBAAC,IAAU,KACT,gBAAC,UAAgB,CAACsB,IAAK,gCACvB,gBAAC,YAAkB,KACjB,gBAAC,IAAI,CAAC3B,UAAWA,EAAW4B,OAAO,aAErC,gBAAC,SAAe,CAACP,UAAU,QACzB,gBAAC,IAAI,CAACrB,UAAWA,EAAW4B,OAAO,gBAAgB,KAErD,gBAAC,QAAc,CACbC,KAAM5B,EAAU,OAChB6B,QAAS,CACPC,YAAa,YACbC,OAAQ,6BAEVC,KAAM,WACNZ,UAAU,sBAEZ,gBAAC,QAAc,CACbQ,KAAM,iBACNC,QAAS,CACPC,YAAa,cACbC,OAAQ,wCAEVX,UAAU,iCAKpB,C","sources":["file:///app/packages/projects/lite/src/apps/my-shares/views/hard-gate-insights-view/HardGateInsightsView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\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 { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\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 { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { InsightsHeader } from 'apps/my-shares/components/insights-header/InsightsHeader';\nimport { getInsightsVideoTabs } from 'apps/my-shares/utils/InsightsAppLinkUtils';\n\nconst namespace = 'insights.hardGateInsightsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface HardGateInsightsViewProps {\n shareId: string;\n}\n\nexport function HardGateInsightsView(props: HardGateInsightsViewProps) {\n useLockContentWidth();\n\n const { hasPermissions, getGatedPermission } = 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 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\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 hasData={false}\n viewInsightsGatedPermission={getGatedPermission(PermissionName.ViewInsights)}\n />\n <EmptyState>\n <EmptyState.Image src={ImageUrls.Insights.SEND_PAPER_PLANE} />\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='heading' />\n </EmptyState.Heading>\n <EmptyState.Info className='w-75'>\n <Text namespace={namespace} phrase='description' /> \n </EmptyState.Info>\n <EmptyState.Cta\n text={getPhrase('cta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n icon={cvSvgLibrary.Share}\n className='btn btn-dark mb-3'\n />\n <EmptyState.Cta\n text={'View demo data'}\n appLink={{\n application: AppChannels.MY_SHARES,\n action: Actions.MyShares.INTERACTIVE_OVERVIEW_DEMO\n }}\n className='btn btn-link text-info py-0'\n />\n </EmptyState>\n </div>\n );\n}"],"names":["namespace","getPhrase","HardGateInsightsView","props","hasPermissions","getGatedPermission","config","currentUser","yearGroups","data","customerId","share","shareId","classroomId","classroom","videoRequest","objectId","objectTypeId","video","title","name","className","tabs","hasAnalytics","analyticsWebUrl","hasData","viewInsightsGatedPermission","src","phrase","text","appLink","application","action","icon"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2664],{28469:(e,a,t)=>{t.d(a,{P:()=>s});var r=t(32735),n=t(23481).T.encloseNamespace("rostering.alert");function s(e){var a="classroom"===e.type?n("classroom"):n("hasRostering");return r.createElement("div",{className:"alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap"},a," ")}},299:(e,a,t)=>{t.d(a,{X:()=>l});var r=t(32735),n=t(69217),s=t(94631),l=function(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=a.idField,l=void 0===t?"id":t,o=a.persistNamespace,i=a.initialState?a.initialState:new Map,c=r.useRef(i),d=(0,n.N)(),m=(0,s.D)(e),u=(0,s.D)(o);function g(){c.current.clear(),d()}function p(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[l].toString()),c.current.get(e)}function h(){return!!(null==e?void 0:e.length)&&e.every(p)}function E(e){e.forEach(function(e){c.current.set(e,!0)}),d()}return r.useEffect(function(){a.initialState||o&&u===o||(null==m?void 0:m.map(function(e){return e[l]}).join())!==(null==e?void 0:e.map(function(e){return e[l]}).join())&&g()},[m,u,e,a.initialState]),r.useEffect(function(){var e;(null===(e=a.preselectedIds)||void 0===e?void 0:e.length)&&E(a.preselectedIds)},[]),{onToggleBulk:function(){var a=!h();e.forEach(function(e){a?c.current.set(e[l].toString(),!0):c.current.delete(e[l].toString())}),d()},onToggleItem:function(e){var a=!c.current.get(e.toString());a?c.current.set(e.toString(),a):c.current.delete(e.toString()),d()},getSelected:function(){return Array.from(c.current.keys())},isChecked:p,bulkChecked:h(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach(function(e){c.current.delete(e[l].toString())}),d())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find(function(e){return p(e)})},setSelected:E,getSelectedCount:function(){return c.current.size},reset:g,getMap:function(){return c.current}}}},83924:(e,a,t)=>{t.r(a),t.d(a,{ClassroomTeachersView:()=>te});var r=t(32735),n=t(70680),s=t(23481),l=t(20354),o=t(28469),i=t(39151),c=t(31949),d=t(79612),m=t(37802),u=t(97958),g=t(83345),p=t(35223),h=t(99742),E=t(14070),f=t(97291),v="classrooms.manageClassroomTeachersEmptyState";function y(){return r.createElement(g.D.Provider,{value:v},r.createElement(u.u,null,r.createElement(u.u.Image,{src:h.W.EmptyStates.Classrooms.TEACHERS}),r.createElement(u.u.Heading,null,r.createElement(g.x,{phrase:"emptyStateHeading"})),r.createElement(u.u.Info,{className:"mb-2"},r.createElement(g.x,{phrase:"emptyStateInfo"})),r.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},s.T.getPhrase(v,"rosteringCta"))))}function S(e){return r.createElement(g.D.Provider,{value:v},r.createElement(u.u,null,r.createElement(u.u.Image,{src:h.W.EmptyStates.Classrooms.TEACHERS}),r.createElement(u.u.Heading,null,r.createElement(g.x,{phrase:"emptyStateHeading"})),r.createElement(u.u.Info,null,r.createElement(g.x,{phrase:"emptyStateInfo"})),r.createElement(u.u.Cta,{text:s.T.getPhrase(v,"addTeachers"),icon:p.vn.Plus,appLink:{application:f.O.CLASSROOMS,action:E.e.Classrooms.ADD_TEACHERS,args:[e.classroom.id]}})))}var C=t(81886),O=t(49985),k=t(65858),w=t(11607),b=t(89965),T=t(91693),N=t(83914),x=t(36532),A=t(86764),R=t(299),I=t(3747),F=t(83657),U=t(97408),L=t(16714),P=t(86613),D=t(22902),M=t(64818);const _={avatarContainer:"kTynd",name:"UWi4G"};var V="classrooms.manageClassroomTeacherItem",H=s.T.encloseNamespace(V),B=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_TEACHERS,args:[a],params:{teacherIds:[e]}}},W=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.ASSIGN_AS_OWNER,args:[a,e]}},Z=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.REVOKE_OWNERSHIP,args:[a,e]}};function X(e){var a,t=(0,D.T)().hasPermissions,n=M.l.getUserRole(e.teacher)===P.i.Admin,s=e.currentUser.id===e.teacher.id||!!t(L.C.ManageAllClassrooms)||!n&&e.isOwner(e.currentUser.id),l=!s||e.readOnly;return r.createElement("div",{className:"d-flex align-items-center py-1 px-4"},e.isOwner(e.currentUser.id)&&r.createElement(b.X,{id:e.teacher.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),r.createElement("div",{className:"".concat(_.avatarContainer," me-2")},r.createElement(U.q,{imageCdnUrl:e.config.imageCdnUrl,initials:M.l.getInitials(e.teacher.name,e.teacher.surname),imageUrl:null===(a=e.teacher.avatar)||void 0===a?void 0:a.url})),r.createElement("p",{className:"".concat(_.name," me-2 text-truncate mb-0 text-nowrap")},M.l.getFullName(e.teacher)),!!n&&r.createElement("div",{className:"classroom-pill text-white bg-navy"},r.createElement(g.x,{namespace:V,phrase:"admin"})),!n&&e.isOwner(e.teacher.id)&&r.createElement("div",{className:"classroom-pill text-white bg-indigo"},r.createElement(g.x,{namespace:V,phrase:"owner"})),r.createElement(F.e,{actions:function(){if(!e.isOwner(e.currentUser.id))return[];var a=[],t="text-secondary disabled cursor-default",r=e.currentUser.id===e.teacher.id;return r||(e.isOwner(e.teacher.id)?a.push({order:0,label:H("revokeOwnership"),appLink:Z(e.teacher.id,e.classroom.id),analyticsData:{id:e.teacher.id,classroomId:e.classroom.id},analyticsOptions:{actionType:k.Vw.Demote,entity:k.py.User,descriptor:k.iF.Classroom,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotRevokeOwnershipFromAdmin")}):a.push({order:0,label:H("assignAsOwner"),appLink:W(e.teacher.id,e.classroom.id),analyticsData:{id:e.teacher.id,classroomId:e.classroom.id},analyticsOptions:{actionType:k.Vw.Promote,entity:k.py.User,descriptor:k.iF.Classroom,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotAssignAdminAsOwner")})),a.push({order:10,label:H(r?"leaveClassroom":"removeTeacher"),appLink:B(e.teacher.id,e.classroom.id),analyticsData:{id:e.classroom.id,userId:e.teacher.id},analyticsOptions:{actionType:k.Vw.Dissociate,entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"text-danger",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotRemoveAdmin")}),a}(),className:"ms-auto",actionsDropdownClassName:"btn btn-link"}))}var j="classrooms.manageClassroomTeachers";function G(e){var a,t=(0,R.X)(e.teachers),n=t.getSelected().length,l=(0,I.a)(A.r.XLDown);return(null===(a=e.teachers)||void 0===a?void 0:a.length)?r.createElement(r.Fragment,null,r.createElement("div",{className:"d-flex align-items-center py-2 ".concat(l?"ps-2":"ps-4")},e.isOwner(e.currentUser.id)&&r.createElement(r.Fragment,null,r.createElement(b.X,{id:"manage-classroom-teachers-bulk",onChange:t.onToggleBulk,checked:t.bulkChecked,className:"me-2",indeterminate:t.hasSomeSelections(),disabled:e.readOnly}),r.createElement(w.L,{className:!n||e.readOnly?"me-auto text-light cursor-default":"me-auto",onClick:function(){if(n&&e.isOwner(e.currentUser.id)&&!e.readOnly){var a=t.getSelected();O.k.logUserAction({id:e.classroom.id,teacherCount:a.length},{entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,actionType:k.Vw.Dissociate,location:k.LZ.ManageClassroomTeachers}),C.Q.C$.trigger({application:f.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_TEACHERS,args:[e.classroom.id],params:{teacherIds:a}})}}},r.createElement(N.x,{svgName:p.vn.Delete,title:e.readOnly?s.T.getPhrase(j,"disabledByRostering"):s.T.getPhrase(j,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0})),r.createElement(x.u,{spanHack:!0,title:e.readOnly?s.T.getPhrase(j,"disabledByRostering"):""},r.createElement(T.h,{disabled:e.readOnly,svgName:p.vn.Plus,className:"btn btn-outline-dark ms-auto",appLink:e.readOnly?null:{application:f.O.CLASSROOMS,action:E.e.Classrooms.ADD_TEACHERS,args:[e.classroom.id]},analyticsData:{id:e.classroom.id},analyticsOptions:{entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,actionType:k.Vw.Associate,location:k.LZ.ManageClassroomTeachers}},r.createElement(g.x,{namespace:j,phrase:"addTeacher"}))))),r.createElement("ul",{className:"striped-list list-unstyled"},e.teachers.map(function(a){return r.createElement("li",{key:a.id},r.createElement(X,{classroom:e.classroom,teacher:a,config:e.config,checked:t.isChecked(a.id),onToggleCheckbox:function(){return t.onToggleItem(a.id)},currentUser:e.currentUser,isOwner:e.isOwner,readOnly:e.readOnly,readonlyTooltip:e.readOnly?s.T.getPhrase(j,"disabledByRostering"):""}))}))):r.createElement(S,{classroom:e.classroom})}var Q=t(49935),q=t(95278);const K="svGp0";var Y=r.memo(function(){return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"mb-1 partial-loading-background ".concat("FQwVf")}),r.createElement("div",{className:"pb-3"},r.createElement(Q.b2,{numItems:2})),r.createElement("div",{className:"pb-2"},r.createElement(q.Z,null)),r.createElement("div",{className:"d-flex align-items-center py-2"},r.createElement("div",{className:"ms-2 me-4 partial-loading-background ".concat(K)}),r.createElement("div",{className:"me-auto partial-loading-background ".concat("rKbj_")}),r.createElement("div",{className:"partial-loading-background ".concat("qigWD")})),r.createElement("ul",{className:"striped-list list-unstyled"},Array(3).fill(null).map(function(e,a){return r.createElement("li",{key:a},r.createElement("div",{className:"d-flex align-items-center py-1 px-4"},r.createElement("div",{className:"me-2 partial-loading-background ".concat(K)}),r.createElement("div",{className:"me-2 partial-loading-background ".concat("mYQWy")}),r.createElement("div",{className:"w-25"},r.createElement("div",{className:"partial-loading-background ".concat("SiD8n")})),r.createElement("div",{className:"ms-auto partial-loading-background ".concat("sAUZY")})))})))}),z=t(88630),$=t(46009),J=t(31491),ee=t(22602),ae=s.T.encloseNamespace("classrooms.classroomTeachers");function te(e){var a,t,s,u,g=(0,m.r)(null).hasShareFlowV2,p=l.a.useBasicFetch(c.N.currentUser()),h=l.a.useBasicFetch(p.data&&z.F.getClassroom(e.id,p.data.id)),E=l.a.useBasicFetch(z.F.getClassroomOwners(e.id)),f=l.a.useBasicFetch((null===(a=p.data)||void 0===a?void 0:a.customerId)&&z.F.getClassroomStaff(e.id,p.data.customerId)),v=l.a.useBasicFetch(i.L.config()),C=(0,n.I0)(),O=(0,$.p)(e.id).isOwner,k=null===(s=null===(t=h.data)||void 0===t?void 0:t._integrations)||void 0===s?void 0:s.rostered;function w(e){return e===p.data.id?O:E.data.some(function(a){return a.id.toString()===e.toString()})}return(0,d.M)({title:ae("pageTitle",{classroomName:null===(u=h.data)||void 0===u?void 0:u.name})}),(0,J._)(h),h.data&&f.hasCompleted&&E.hasCompleted&&v.data?r.createElement(ee.R,{classroom:h.data,currentUser:p.data,onTogglePin:function(e,a,t){if(!k){var r=e?z.F.pinClassroom:z.F.unpinClassroom;l.a.fetch(C,r(h.data,a,t))}},activeTab:"teachers",isRostered:k,hasShareFlowV2:g},function(){var e,a;return k?r.createElement(r.Fragment,null,r.createElement(o.P,{type:"classroom"}),(null===(e=f.data)||void 0===e?void 0:e.length)?r.createElement(G,{classroom:h.data,teachers:f.data,config:v.data,currentUser:p.data,isOwner:w,readOnly:!0}):r.createElement(y,null)):(null===(a=f.data)||void 0===a?void 0:a.length)?r.createElement(G,{config:v.data,classroom:h.data,teachers:f.data,currentUser:p.data,isOwner:w,readOnly:k}):r.createElement(S,{classroom:h.data})}()):r.createElement(Y,null)}},99998:(e,a,t)=>{t.d(a,{R:()=>l});var r=t(16714),n=t(22902),s=t(37802);function l(){var e=(0,s.r)(null),a=e.hasShareFlowV2,t=e.hasClassrooms,l=e.isLoadingSettings,o=(0,n.T)(),i=o.hasPermissions,c=o.isLoaded;return{experience:t?i(r.C.ViewClassrooms)?"full":a?"minimal":void 0:"none",loading:l||!c}}}}]);
|
|
2
|
-
//# sourceMappingURL=2664-
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2664],{28469:(e,a,t)=>{t.d(a,{P:()=>s});var r=t(32735),n=t(23481).T.encloseNamespace("rostering.alert");function s(e){var a="classroom"===e.type?n("classroom"):n("hasRostering");return r.createElement("div",{className:"alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap"},a," ")}},299:(e,a,t)=>{t.d(a,{X:()=>l});var r=t(32735),n=t(69217),s=t(94631),l=function(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=a.idField,l=void 0===t?"id":t,o=a.persistNamespace,i=a.initialState?a.initialState:new Map,c=r.useRef(i),m=(0,n.N)(),d=(0,s.D)(e),u=(0,s.D)(o);function g(){c.current.clear(),m()}function p(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[l].toString()),c.current.get(e)}function h(){return!!(null==e?void 0:e.length)&&e.every(p)}function E(e){e.forEach(function(e){c.current.set(e,!0)}),m()}return r.useEffect(function(){a.initialState||o&&u===o||(null==d?void 0:d.map(function(e){return e[l]}).join())!==(null==e?void 0:e.map(function(e){return e[l]}).join())&&g()},[d,u,e,a.initialState]),r.useEffect(function(){var e;(null===(e=a.preselectedIds)||void 0===e?void 0:e.length)&&E(a.preselectedIds)},[]),{onToggleBulk:function(){var a=!h();e.forEach(function(e){a?c.current.set(e[l].toString(),!0):c.current.delete(e[l].toString())}),m()},onToggleItem:function(e){var a=!c.current.get(e.toString());a?c.current.set(e.toString(),a):c.current.delete(e.toString()),m()},getSelected:function(){return Array.from(c.current.keys())},isChecked:p,bulkChecked:h(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach(function(e){c.current.delete(e[l].toString())}),m())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find(function(e){return p(e)})},setSelected:E,getSelectedCount:function(){return c.current.size},reset:g,getMap:function(){return c.current}}}},83924:(e,a,t)=>{t.r(a),t.d(a,{ClassroomTeachersView:()=>te});var r=t(32735),n=t(70680),s=t(23481),l=t(20354),o=t(28469),i=t(39151),c=t(31949),m=t(79612),d=t(37802),u=t(97958),g=t(83345),p=t(35223),h=t(99742),E=t(14070),f=t(97291),v="classrooms.manageClassroomTeachersEmptyState";function y(){return r.createElement(g.D.Provider,{value:v},r.createElement(u.u,null,r.createElement(u.u.Image,{src:h.W.EmptyStates.Classrooms.TEACHERS}),r.createElement(u.u.Heading,null,r.createElement(g.x,{phrase:"emptyStateHeading"})),r.createElement(u.u.Info,{className:"mb-2"},r.createElement(g.x,{phrase:"emptyStateInfo"})),r.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},s.T.getPhrase(v,"rosteringCta"))))}function C(e){return r.createElement(g.D.Provider,{value:v},r.createElement(u.u,null,r.createElement(u.u.Image,{src:h.W.EmptyStates.Classrooms.TEACHERS}),r.createElement(u.u.Heading,null,r.createElement(g.x,{phrase:"emptyStateHeading"})),r.createElement(u.u.Info,null,r.createElement(g.x,{phrase:"emptyStateInfo"})),r.createElement(u.u.Cta,{text:s.T.getPhrase(v,"addTeachers"),icon:p.vn.Plus,appLink:{application:f.O.CLASSROOMS,action:E.e.Classrooms.ADD_TEACHERS,args:[e.classroom.id]}})))}var S=t(81886),O=t(49985),k=t(65858),w=t(11607),b=t(89965),T=t(91693),N=t(83914),x=t(36532),A=t(86764),R=t(299),I=t(3747),F=t(83657),U=t(97408),L=t(16714),P=t(86613),D=t(22902),M=t(64818);const V={avatarContainer:"kTynd",name:"UWi4G"};var _="classrooms.manageClassroomTeacherItem",H=s.T.encloseNamespace(_),B=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_TEACHERS,args:[a],params:{teacherIds:[e]}}},W=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.ASSIGN_AS_OWNER,args:[a,e]}},Z=function(e,a){return{application:f.O.CLASSROOMS,action:E.e.Classrooms.REVOKE_OWNERSHIP,args:[a,e]}};function X(e){var a,t=(0,D.T)().hasPermissions,n=M.l.getUserRole(e.teacher)===P.i.Admin,s=e.currentUser.id===e.teacher.id||!!t(L.C.ManageAllClassrooms)||!n&&e.isOwner(e.currentUser.id),l=!s||e.readOnly;return r.createElement("div",{className:"d-flex align-items-center py-1 px-4"},e.isOwner(e.currentUser.id)&&r.createElement(b.X,{id:e.teacher.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),r.createElement("div",{className:"".concat(V.avatarContainer," me-2")},r.createElement(U.q,{imageCdnUrl:e.config.imageCdnUrl,initials:M.l.getInitials(e.teacher.name,e.teacher.surname),imageUrl:null===(a=e.teacher.avatar)||void 0===a?void 0:a.url})),r.createElement("p",{className:"".concat(V.name," me-2 text-truncate mb-0 text-nowrap")},M.l.getFullName(e.teacher)),!!n&&r.createElement("div",{className:"classroom-pill text-white bg-navy"},r.createElement(g.x,{namespace:_,phrase:"admin"})),!n&&e.isOwner(e.teacher.id)&&r.createElement("div",{className:"classroom-pill text-white bg-indigo"},r.createElement(g.x,{namespace:_,phrase:"owner"})),r.createElement(F.e,{actions:function(){if(!e.isOwner(e.currentUser.id))return[];var a=[],t="text-secondary disabled cursor-default",r=e.currentUser.id===e.teacher.id;return r||(e.isOwner(e.teacher.id)?a.push({order:0,label:H("revokeOwnership"),appLink:Z(e.teacher.id,e.classroom.id),analyticsData:{id:e.teacher.id,classroomId:e.classroom.id},analyticsOptions:{actionType:k.Vw.Demote,entity:k.py.User,descriptor:k.iF.Classroom,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotRevokeOwnershipFromAdmin")}):a.push({order:0,label:H("assignAsOwner"),appLink:W(e.teacher.id,e.classroom.id),analyticsData:{id:e.teacher.id,classroomId:e.classroom.id},analyticsOptions:{actionType:k.Vw.Promote,entity:k.py.User,descriptor:k.iF.Classroom,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotAssignAdminAsOwner")})),a.push({order:10,label:H(r?"leaveClassroom":"removeTeacher"),appLink:B(e.teacher.id,e.classroom.id),analyticsData:{id:e.classroom.id,userId:e.teacher.id},analyticsOptions:{actionType:k.Vw.Dissociate,entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,location:k.LZ.ManageClassroomTeacherListItem},className:l?t:"text-danger",disabled:l,tooltip:e.readOnly?e.readonlyTooltip:s?"":H("cannotRemoveAdmin")}),a}(),className:"ms-auto",actionsDropdownClassName:"btn btn-link"}))}var G="classrooms.manageClassroomTeachers";function j(e){var a,t=(0,R.X)(e.teachers),n=t.getSelected().length,l=(0,I.a)(A.r.XLDown);return(null===(a=e.teachers)||void 0===a?void 0:a.length)?r.createElement(r.Fragment,null,r.createElement("div",{className:"d-flex align-items-center py-2 ".concat(l?"ps-2":"ps-4")},e.isOwner(e.currentUser.id)&&r.createElement(r.Fragment,null,r.createElement(b.X,{id:"manage-classroom-teachers-bulk",onChange:t.onToggleBulk,checked:t.bulkChecked,className:"me-2",indeterminate:t.hasSomeSelections(),disabled:e.readOnly}),r.createElement(w.L,{className:!n||e.readOnly?"me-auto text-light cursor-default":"me-auto",onClick:function(){if(n&&e.isOwner(e.currentUser.id)&&!e.readOnly){var a=t.getSelected();O.k.logUserAction({id:e.classroom.id,teacherCount:a.length},{entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,actionType:k.Vw.Dissociate,location:k.LZ.ManageClassroomTeachers}),S.Q.C$.trigger({application:f.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_TEACHERS,args:[e.classroom.id],params:{teacherIds:a}})}}},r.createElement(N.x,{svgName:p.vn.Delete,title:e.readOnly?s.T.getPhrase(G,"disabledByRostering"):s.T.getPhrase(G,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0})),r.createElement(x.u,{spanHack:!0,title:e.readOnly?s.T.getPhrase(G,"disabledByRostering"):""},r.createElement(T.h,{disabled:e.readOnly,svgName:p.vn.Plus,className:"btn btn-outline-dark ms-auto",appLink:e.readOnly?null:{application:f.O.CLASSROOMS,action:E.e.Classrooms.ADD_TEACHERS,args:[e.classroom.id]},analyticsData:{id:e.classroom.id},analyticsOptions:{entity:k.py.Classroom,descriptor:k.iF.User,workflowPhase:k.eu.Start,actionType:k.Vw.Associate,location:k.LZ.ManageClassroomTeachers}},r.createElement(g.x,{namespace:G,phrase:"addTeacher"}))))),r.createElement("ul",{className:"striped-list list-unstyled"},e.teachers.map(function(a){return r.createElement("li",{key:a.id},r.createElement(X,{classroom:e.classroom,teacher:a,config:e.config,checked:t.isChecked(a.id),onToggleCheckbox:function(){return t.onToggleItem(a.id)},currentUser:e.currentUser,isOwner:e.isOwner,readOnly:e.readOnly,readonlyTooltip:e.readOnly?s.T.getPhrase(G,"disabledByRostering"):""}))}))):r.createElement(C,{classroom:e.classroom})}var Q=t(49935),q=t(95278);const K="svGp0";var Y=r.memo(function(){return r.createElement("div",{className:"px-3"},r.createElement("div",{className:"mb-1 partial-loading-background ".concat("FQwVf")}),r.createElement("div",{className:"pb-3"},r.createElement(Q.b2,{numItems:2})),r.createElement("div",{className:"pb-2"},r.createElement(q.Z,null)),r.createElement("div",{className:"d-flex align-items-center py-2"},r.createElement("div",{className:"ms-2 me-4 partial-loading-background ".concat(K)}),r.createElement("div",{className:"me-auto partial-loading-background ".concat("rKbj_")}),r.createElement("div",{className:"partial-loading-background ".concat("qigWD")})),r.createElement("ul",{className:"striped-list list-unstyled"},Array(3).fill(null).map(function(e,a){return r.createElement("li",{key:a},r.createElement("div",{className:"d-flex align-items-center py-1 px-4"},r.createElement("div",{className:"me-2 partial-loading-background ".concat(K)}),r.createElement("div",{className:"me-2 partial-loading-background ".concat("mYQWy")}),r.createElement("div",{className:"w-25"},r.createElement("div",{className:"partial-loading-background ".concat("SiD8n")})),r.createElement("div",{className:"ms-auto partial-loading-background ".concat("sAUZY")})))})))}),z=t(88630),$=t(46009),J=t(31491),ee=t(22602),ae=s.T.encloseNamespace("classrooms.classroomTeachers");function te(e){var a,t,s,u,g=(0,d.r)(null).hasShareFlowV2,p=l.a.useBasicFetch(c.N.currentUser()),h=l.a.useBasicFetch(p.data&&z.F.getClassroom(e.id,p.data.id)),E=l.a.useBasicFetch(z.F.getClassroomOwners(e.id)),f=l.a.useBasicFetch((null===(a=p.data)||void 0===a?void 0:a.customerId)&&z.F.getClassroomStaff(e.id,p.data.customerId)),v=l.a.useBasicFetch(i.L.config()),S=(0,n.I0)(),O=(0,$.p)(e.id).isOwner,k=null===(s=null===(t=h.data)||void 0===t?void 0:t._integrations)||void 0===s?void 0:s.rostered;function w(e){return e===p.data.id?O:E.data.some(function(a){return a.id.toString()===e.toString()})}return(0,m.M)({title:ae("pageTitle",{classroomName:null===(u=h.data)||void 0===u?void 0:u.name})}),(0,J._)(h),h.data&&f.hasCompleted&&E.hasCompleted&&v.data?r.createElement(ee.R,{classroom:h.data,currentUser:p.data,onTogglePin:function(e,a,t){if(!k){var r=e?z.F.pinClassroom:z.F.unpinClassroom;l.a.fetch(S,r(h.data,a,t))}},activeTab:"teachers",isRostered:k,hasShareFlowV2:g},function(){var e,a;return k?r.createElement(r.Fragment,null,r.createElement(o.P,{type:"classroom"}),(null===(e=f.data)||void 0===e?void 0:e.length)?r.createElement(j,{classroom:h.data,teachers:f.data,config:v.data,currentUser:p.data,isOwner:w,readOnly:!0}):r.createElement(y,null)):(null===(a=f.data)||void 0===a?void 0:a.length)?r.createElement(j,{config:v.data,classroom:h.data,teachers:f.data,currentUser:p.data,isOwner:w,readOnly:k}):r.createElement(C,{classroom:h.data})}()):r.createElement(Y,null)}},99998:(e,a,t)=>{t.d(a,{R:()=>l});var r=t(16714),n=t(22902),s=t(37802);function l(){var e=(0,s.r)(null),a=e.hasShareFlowV2,t=e.hasClassrooms,l=e.isLoadingSettings,o=(0,n.T)(),i=o.hasPermissions,c=o.isLoaded,m=o.getGatedPermission;return{experience:t?"soft-gate"===m(r.C.ViewClassrooms)?"minimal":i(r.C.ViewClassrooms)?"full":a?"minimal":void 0:"none",loading:l||!c}}}}]);
|
|
2
|
+
//# sourceMappingURL=2664-87c8cbfa7f-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/2664-87c8cbfa7f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teachers/empty-state/ManageClassroomTeachersEmptyState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teacher-item/manage-classroom-teacher-item.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teacher-item/ManageClassroomTeacherItem.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teachers/ManageClassroomTeachers.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teachers/partial-loading/partial-manage-classroom-teachers.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-teachers/partial-loading/PartialManageClassroomTeachers.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-teachers/ClassroomTeachersView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useClassroomExperience.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text} \n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.manageClassroomTeachersEmptyState';\n\ninterface ManageClassroomTeachersEmptyStateProps {\n classroom: Classroom;\n}\n\nexport function RosteredClassroomTeachersEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.TEACHERS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info className='mb-2'><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n {/* todo add kb link */}\n <a className='btn btn-link info-link font-semibold' href={''} target='_blank'>\n {LanguageService.getPhrase(namespace, 'rosteringCta')}\n </a>\n\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function ManageClassroomTeachersEmptyState(props: ManageClassroomTeachersEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.TEACHERS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info ><Text phrase='emptyStateInfo' /></EmptyState.Info>\n \n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addTeachers')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_TEACHERS,\n args: [props.classroom.id]\n }}\n />\n\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kTynd\",\"name\":\"UWi4G\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions as MoreActions } from 'libs/shared/components/actions/Actions';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser } from 'libs/shared/interfaces';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './manage-classroom-teacher-item.scss';\n\nconst namespace = 'classrooms.manageClassroomTeacherItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getRemoveTeachersAppLink = (teacherId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_TEACHERS,\n args: [classroomId],\n params: {\n teacherIds: [teacherId]\n }\n});\n\nconst getAssignAsOwnerAppLink = (teacherId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ASSIGN_AS_OWNER,\n args: [ classroomId, teacherId ]\n});\n\nconst getRevokeOwnershipAppLink = (teacherId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REVOKE_OWNERSHIP,\n args: [ classroomId, teacherId ]\n});\n\ninterface ManageClassroomTeacherItemProps {\n classroom: Classroom;\n teacher: User;\n config: Config;\n onToggleCheckbox: () => void;\n checked: boolean;\n isOwner: (userId: string) => boolean;\n currentUser: CurrentUser;\n readOnly?: boolean;\n readonlyTooltip?: string;\n}\n\nexport function ManageClassroomTeacherItem(props: ManageClassroomTeacherItemProps): JSX.Element {\n const { hasPermissions } = usePermissions();\n\n const teacherIsAdmin = UserHelper.getUserRole(props.teacher) === UserRole.Admin;\n\n function getCanManageTeacher(): boolean {\n // Current user can perform any action on themselves\n if (props.currentUser.id === props.teacher.id)\n return true;\n\n // This permission allows total control over a classroom\n if (hasPermissions(PermissionName.ManageAllClassrooms))\n return true;\n\n // Regular teachers or owners cannot perform actions on admins in the classroom\n if (teacherIsAdmin)\n return false;\n\n return props.isOwner(props.currentUser.id);\n }\n\n const canManageTeacher = getCanManageTeacher();\n\n const actionDisabled = !canManageTeacher || props.readOnly;\n\n function getActions(): ActionOptions[] {\n // Non-owners cannot perform any actions on other classroom teachers\n if (!props.isOwner(props.currentUser.id))\n return [];\n\n const actions: ActionOptions[] = [];\n\n const disabledClassName = 'text-secondary disabled cursor-default';\n\n // Actions are different if the user item is for the current user\n const isManagingCurrentUser = props.currentUser.id === props.teacher.id;\n\n if (!isManagingCurrentUser) {\n if (props.isOwner(props.teacher.id)) {\n actions.push({\n order: 0,\n label: getPhrase('revokeOwnership'),\n appLink: getRevokeOwnershipAppLink(props.teacher.id, props.classroom.id),\n analyticsData: {\n id: props.teacher.id,\n classroomId: props.classroom.id\n },\n analyticsOptions: {\n actionType: UserAction.Demote,\n entity: EntityType.User,\n descriptor: AssocDescriptor.Classroom,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomTeacherListItem\n },\n className: actionDisabled ? disabledClassName : '',\n disabled: actionDisabled,\n tooltip: props.readOnly ? props.readonlyTooltip : !canManageTeacher ? getPhrase('cannotRevokeOwnershipFromAdmin') : ''\n });\n } else {\n actions.push({\n order: 0,\n label: getPhrase('assignAsOwner'),\n appLink: getAssignAsOwnerAppLink(props.teacher.id, props.classroom.id),\n analyticsData: {\n id: props.teacher.id,\n classroomId: props.classroom.id\n },\n analyticsOptions: {\n actionType: UserAction.Promote,\n entity: EntityType.User,\n descriptor: AssocDescriptor.Classroom,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomTeacherListItem\n },\n className: actionDisabled ? disabledClassName : '',\n disabled: actionDisabled,\n tooltip: props.readOnly ? props.readonlyTooltip : !canManageTeacher ? getPhrase('cannotAssignAdminAsOwner') : ''\n });\n }\n }\n\n actions.push({\n order: 10,\n label: isManagingCurrentUser ? getPhrase('leaveClassroom') : getPhrase('removeTeacher'),\n appLink: getRemoveTeachersAppLink(props.teacher.id, props.classroom.id),\n analyticsData: {\n id: props.classroom.id,\n userId: props.teacher.id\n },\n analyticsOptions: {\n actionType: UserAction.Dissociate,\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomTeacherListItem\n },\n className: actionDisabled ? disabledClassName : 'text-danger',\n disabled: actionDisabled,\n tooltip: props.readOnly ? props.readonlyTooltip : !canManageTeacher ? getPhrase('cannotRemoveAdmin') : ''\n });\n\n return actions;\n }\n\n return (\n <div className='d-flex align-items-center py-1 px-4'>\n {props.isOwner(props.currentUser.id) && (\n <Checkbox\n id={props.teacher.id}\n checked={props.checked}\n onChange={props.onToggleCheckbox}\n className='me-2'\n disabled={props.readOnly}\n />\n )}\n\n <div className={`${styles.avatarContainer} me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.teacher.name, props.teacher.surname)}\n imageUrl={props.teacher.avatar?.url}\n />\n </div>\n\n <p className={`${styles.name} me-2 text-truncate mb-0 text-nowrap`}>{UserHelper.getFullName(props.teacher)}</p>\n\n {!!teacherIsAdmin && (\n <div className={`classroom-pill text-white bg-navy`}>\n <Text namespace={namespace} phrase='admin' />\n </div>\n )}\n\n {(!teacherIsAdmin && props.isOwner(props.teacher.id)) && (\n <div className={`classroom-pill text-white bg-indigo`}>\n <Text namespace={namespace} phrase='owner' />\n </div>\n )}\n\n <MoreActions\n actions={getActions()}\n className='ms-auto'\n actionsDropdownClassName='btn btn-link'\n />\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classroom, Config, CurrentUser, User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ManageClassroomTeacherItem } from 'apps/classrooms/components/manage-classroom-teacher-item/ManageClassroomTeacherItem';\n\nimport { ManageClassroomTeachersEmptyState } from './empty-state/ManageClassroomTeachersEmptyState';\n\nconst namespace = 'classrooms.manageClassroomTeachers';\n\ninterface ManageClassroomTeachersProps {\n classroom: Classroom;\n isOwner: (teacherId: string) => boolean;\n currentUser: CurrentUser;\n teachers: User[];\n config: Config;\n readOnly?: boolean;\n}\n\nexport function ManageClassroomTeachers(props: ManageClassroomTeachersProps): JSX.Element {\n const CheckboxHelper = useBulkCheckboxManager(props.teachers);\n const selectionCount = CheckboxHelper.getSelected().length;\n\n function onClickBulkRemoveTeachers(): void {\n if (!selectionCount || !props.isOwner(props.currentUser.id) || props.readOnly)\n return;\n\n const teacherIds = CheckboxHelper.getSelected();\n\n AnalyticsHelper.logUserAction({\n id: props.classroom.id,\n teacherCount: teacherIds.length\n }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Dissociate,\n location: LocationContext.ManageClassroomTeachers\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_TEACHERS,\n args: [props.classroom.id],\n params: {\n teacherIds\n }\n });\n }\n\n const edgeToEdge = useMediaQuery(MediaQueryStrings.XLDown);\n\n if (!props.teachers?.length)\n return <ManageClassroomTeachersEmptyState classroom={props.classroom} />;\n\n return (\n <>\n <div className={`d-flex align-items-center py-2 ${edgeToEdge ? 'ps-2' : 'ps-4'}`}>\n {props.isOwner(props.currentUser.id) && (\n <>\n <Checkbox\n id='manage-classroom-teachers-bulk'\n onChange={CheckboxHelper.onToggleBulk}\n checked={CheckboxHelper.bulkChecked}\n className='me-2'\n indeterminate={CheckboxHelper.hasSomeSelections()}\n disabled={props.readOnly}\n />\n\n <DivButton\n className={!selectionCount || props.readOnly ? 'me-auto text-light cursor-default' : 'me-auto'}\n onClick={onClickBulkRemoveTeachers}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Delete}\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : LanguageService.getPhrase(namespace, 'delete')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <IconButton\n disabled={props.readOnly}\n svgName={cvSvgLibrary.Plus}\n className='btn btn-outline-dark ms-auto'\n appLink={props.readOnly\n ? null\n : {\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_TEACHERS,\n args: [props.classroom.id]\n }}\n analyticsData={{ id: props.classroom.id }}\n analyticsOptions={{\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Associate,\n location: LocationContext.ManageClassroomTeachers\n }}\n >\n <Text namespace={namespace} phrase='addTeacher' />\n </IconButton>\n </Tooltip>\n </>\n )}\n </div>\n\n <ul className='striped-list list-unstyled'>\n {props.teachers.map(teacher => (\n <li key={teacher.id}>\n <ManageClassroomTeacherItem\n classroom={props.classroom}\n teacher={teacher}\n config={props.config}\n checked={CheckboxHelper.isChecked(teacher.id)}\n onToggleCheckbox={() => CheckboxHelper.onToggleItem(teacher.id)}\n currentUser={props.currentUser}\n isOwner={props.isOwner}\n readOnly={props.readOnly}\n readonlyTooltip={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"FQwVf\",\"avatar\":\"mYQWy\",\"checkbox\":\"svGp0\",\"actionIcon\":\"rKbj_\",\"addTeachers\":\"qigWD\",\"teacherName\":\"SiD8n\",\"moreActions\":\"sAUZY\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\n\nimport styles from './partial-manage-classroom-teachers.scss';\n\nexport const PartialManageClassroomTeachers = React.memo(function(): JSX.Element {\n return (\n <div className='px-3'>\n {/* Heading */}\n <div className={`mb-1 partial-loading-background ${styles.heading}`} />\n\n {/* Breadcrumbs */}\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n {/* Pill tab selector */}\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n\n <div className='d-flex align-items-center py-2'>\n {/* Checkbox */}\n <div className={`ms-2 me-4 partial-loading-background ${styles.checkbox}`} />\n {/* Delete action */}\n <div className={`me-auto partial-loading-background ${styles.actionIcon}`} />\n\n {/* Add new teachers button */}\n <div className={`partial-loading-background ${styles.addTeachers}`} />\n </div>\n\n {/* Teachers list */}\n <ul className='striped-list list-unstyled'>\n {Array(3).fill(null).map((teacher, i) => (\n <li key={i}>\n <div className='d-flex align-items-center py-1 px-4'>\n {/* Checkbox */}\n <div className={`me-2 partial-loading-background ${styles.checkbox}`} />\n\n {/* Avatar */}\n <div className={`me-2 partial-loading-background ${styles.avatar}`} />\n\n {/* Teacher name */}\n <div className='w-25'>\n <div className={`partial-loading-background ${styles.teacherName}`} />\n </div>\n\n {/* More actions */}\n <div className={`ms-auto partial-loading-background ${styles.moreActions}`} />\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n});","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, Config, CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { ManageClassroomTeachersEmptyState, RosteredClassroomTeachersEmptyState } from 'apps/classrooms/components/manage-classroom-teachers/empty-state/ManageClassroomTeachersEmptyState';\nimport { ManageClassroomTeachers } from 'apps/classrooms/components/manage-classroom-teachers/ManageClassroomTeachers';\nimport { PartialManageClassroomTeachers } from 'apps/classrooms/components/manage-classroom-teachers/partial-loading/PartialManageClassroomTeachers';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useCheckClassroomPermissions } from 'apps/classrooms/hooks/useClassroomPermissions';\nimport { useHandleClassroomErrors } from 'apps/classrooms/hooks/useHandleClassroomErrors';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\n\nconst namespace = 'classrooms.classroomTeachers';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomTeachersViewProps {\n id: string;\n}\n\nexport function ClassroomTeachersView(props: ClassroomTeachersViewProps): JSX.Element {\n const { hasShareFlowV2 } = useSettings(null);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const owners = Flight.useBasicFetch<User[]>(ClassroomRequests.getClassroomOwners(props.id));\n const staff = Flight.useBasicFetch<User[]>(\n currentUser.data?.customerId && ClassroomRequests.getClassroomStaff(props.id, currentUser.data.customerId)\n );\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const dispatch = useDispatch();\n const { isOwner: currentUserIsOwner } = useCheckClassroomPermissions(props.id);\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n useSetPageMetadata({\n title: getPhrase('pageTitle', { classroomName: classroom.data?.name })\n });\n useHandleClassroomErrors(classroom);\n \n function isOwner(teacherId: string): boolean {\n if (teacherId === currentUser.data.id)\n return currentUserIsOwner;\n\n return owners.data.some(owner => owner.id.toString() === teacherId.toString());\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n if (!classroom.data || !staff.hasCompleted || !owners.hasCompleted || !config.data)\n return <PartialManageClassroomTeachers />;\n\n return (\n <ClassroomLayout\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n activeTab='teachers'\n isRostered={isRostered}\n hasShareFlowV2={hasShareFlowV2}\n >\n {(() => {\n if (isRostered) {\n return (\n <>\n <RosteringAlert type='classroom'/>\n {!staff.data?.length ? (\n <RosteredClassroomTeachersEmptyState />\n ) : (\n <ManageClassroomTeachers\n classroom={classroom.data}\n teachers={staff.data}\n config={config.data}\n currentUser={currentUser.data}\n isOwner={isOwner}\n readOnly\n />\n )}\n </>\n );\n }\n\n if (staff.data?.length) {\n return (\n <ManageClassroomTeachers\n config={config.data}\n classroom={classroom.data}\n teachers={staff.data}\n currentUser={currentUser.data}\n isOwner={isOwner}\n readOnly={isRostered}\n />\n );\n }\n\n return <ManageClassroomTeachersEmptyState classroom={classroom.data}/>;\n })()}\n\n </ClassroomLayout>\n );\n}\n","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\ntype ClassroomExperience = 'none' | 'minimal' | 'full';\n\nexport function useClassroomExperience() {\n const { hasShareFlowV2, hasClassrooms, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded, getGatedPermission } = usePermissions();\n\n function getExperience(): ClassroomExperience {\n if (!hasClassrooms)\n return 'none';\n\n if (getGatedPermission(PermissionName.ViewClassrooms) === 'soft-gate')\n return 'minimal';\n\n if (hasPermissions(PermissionName.ViewClassrooms))\n return 'full';\n \n if (hasShareFlowV2)\n return 'minimal';\n }\n\n return {\n experience: getExperience(),\n loading: isLoadingSettings || !isLoaded\n };\n}"],"names":["getPhrase","RosteringAlert","props","text","type","className","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","current","clear","isChecked","item","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","id","set","map","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","keys","bulkChecked","deselectAll","hasSomeSelections","find","getSelectedCount","size","getMap","namespace","RosteredClassroomTeachersEmptyState","value","EmptyState","src","ImageUrls","Text","phrase","href","target","LanguageService","ManageClassroomTeachersEmptyState","icon","appLink","application","action","args","classroom","getRemoveTeachersAppLink","teacherId","classroomId","params","teacherIds","getAssignAsOwnerAppLink","getRevokeOwnershipAppLink","ManageClassroomTeacherItem","hasPermissions","usePermissions","teacherIsAdmin","UserHelper","teacher","UserRole","canManageTeacher","currentUser","PermissionName","isOwner","actionDisabled","readOnly","Checkbox","checked","onChange","onToggleCheckbox","disabled","Avatar","imageCdnUrl","config","initials","name","surname","imageUrl","avatar","url","actions","disabledClassName","isManagingCurrentUser","push","order","label","analyticsData","analyticsOptions","actionType","entity","descriptor","workflowPhase","location","tooltip","readonlyTooltip","userId","getActions","actionsDropdownClassName","ManageClassroomTeachers","CheckboxHelper","teachers","selectionCount","edgeToEdge","indeterminate","DivButton","onClick","AnalyticsHelper","teacherCount","SvgContainer","svgName","title","tooltipPlacement","tooltipSpanHack","Tooltip","spanHack","IconButton","key","PartialManageClassroomTeachers","numItems","PartialPillTabSelector","fill","ClassroomTeachersView","hasShareFlowV2","useSettings","UserRequests","data","ClassroomRequests","owners","staff","customerId","ConfigRequests","dispatch","currentUserIsOwner","isRostered","_integrations","rostered","some","owner","useSetPageMetadata","classroomName","useHandleClassroomErrors","hasCompleted","ClassroomLayout","onTogglePin","shouldPin","onSuccess","onError","request","activeTab","useClassroomExperience","hasClassrooms","isLoadingSettings","isLoaded","getGatedPermission","experience","loading"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2888],{3218:(e,t,n)=>{n.d(t,{R:()=>S});var r=n(32735),i=n(69087),a=n(26136),s=n(39157),o=n(69186),l=n(86572),u=n(28972),c=n(83140),d=n(80845),m=n(23481),v=n(2102),f=n(36532),b=m.T.encloseNamespace("interactives.studentResponseList");function g(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-end pt-3"},r.createElement("div",null,!e.showSubmitButtonSpinner&&r.createElement("button",{className:"btn btn-link",onClick:e.onClickClose},b("close")),!!e.interactionsToMark.length&&r.createElement(r.Fragment,null,e.isDemo?r.createElement(f.u,{id:"submitAnswers",title:b("demoOnly"),spanHack:!0,spanHackClassName:"d-inline-flex"},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},b("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},b("submitAnswers")))))}var k=m.T.encloseNamespace("interactives.studentResponseList");function y(e){var t=Object.keys(e.markedAnswers).length;return r.createElement("div",{className:"d-flex justify-content-between pb-3"},r.createElement("div",{className:"d-flex"},!!e.summary.unanswered&&r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},k("unanswered")),e.summary.unanswered),r.createElement("div",{className:"bg-light rounded p-2 me-2"},r.createElement("strong",{className:"me-2"},k("score")),e.summary.awaitingMarking?r.createElement("em",null,k("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:k("demoOnly"),spanHack:!0},r.createElement("button",{className:"btn btn-outline-dark pointer-events-none",disabled:!t},k("submitAnswers"))):r.createElement(v.m,{variant:"outline-dark",onClick:e.onClickSubmit,disabled:!t,showSpinner:e.showSubmitButtonSpinner},k("submitAnswers"))))}const h={awaitingMarking:"MvGb5"};function p(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,i,a,s,o=[],l=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}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=p(r.useState(!1),2),b=f[0],k=f[1],w=(t=r.useRef(null),n=p(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),A=(0,d.Q)(e.interactive),E=function(e,t){return e.filter(function(e){return c.A.isInteractionCorrect(e,(0,d.j_)(t))===u.w.AwaitingMarking})}(A,e.studentResults);function C(){k(!0),e.submitMarkedAnswers()}return r.createElement(r.Fragment,null,r.createElement(y,{summary:S,interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:C,showSubmitButtonSpinner:b,isDemo:e.isDemo}),r.createElement("ul",{className:"list-unstyled"},A.map(function(t,n){var u,c=t.id.toString()===(null===(u=e.selectedInteractionId)||void 0===u?void 0:u.toString()),d=E.some(function(e){return e.id===t.id}),m=(0,a.B)(e.studentResults.user,e.anonymiseUsers),v="p-2 mb-3 rounded";return c&&(v+=" border-2 border-info shadow"),v+=d?" ".concat(h.awaitingMarking):" border",r.createElement("li",{key:n,className:v,ref:c?w:null},r.createElement("div",{className:"d-flex mb-2"},r.createElement(l.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(i.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(g,{interactionsToMark:E,markedAnswers:e.markedAnswers,onClickSubmit:C,onClickClose:e.onClickClose,showSubmitButtonSpinner:b,isDemo:e.isDemo}))}},94644:(e,t,n)=>{n.d(t,{r:()=>c});var r=n(50242),i=n(81886),a=n(67058),s=n(14553),o=n(49267),l=n(49075),u={notFound:a.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:l._,internalServerError:l._};function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var a;a="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},u),t);a&&i.Q.Ry.isStatusCodeError(a)&&(a!==r.o.InternalServer?a!==r.o.NotFound?a!==r.o.Forbidden?n.badRequest||i.Q.Ry.throw(new s.badRequest):n.forbidden||i.Q.Ry.throw(new s.forbidden.privacy):n.notFound||i.Q.Ry.throw(new s.notFound):n.internalServerError||i.Q.Ry.throw(new l._))}}},54405:(e,t,n)=>{n.d(t,{X:()=>r});var r={interactive:function(){return{url:"/mocks/insights/interactive.json",key:"demo:interactive",normalize:!1}},interactiveMetadata:function(){return{url:"/mocks/insights/interactive-metadata.json",key:"demo:interactive:metadata",normalize:!1}},interactiveResults:function(){return{url:"/mocks/insights/interactive-results.json",key:"demo:interactive:results",normalize:!1}},videoViews:function(){return{url:"/mocks/insights/video-views.json",key:"demo:video:views",normalize:!1}},users:function(){return{url:"/mocks/insights/users.json",key:"demo:users",normalize:!1}},individualHeatmap:function(){return{url:"/mocks/insights/individual-heatmap.json",key:"demo:individual:heatmap",normalize:!1}},aggregateHeatmap:function(){return{url:"/mocks/insights/aggregate-heatmap.json",key:"demo:aggregate:heatmap",normalize:!1}}}},91286:(e,t,n)=>{n.d(t,{v:()=>s});var r=n(32735),i=n(94644);function a(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,i.r)(e.statusCode,t,n)})},[a(s),t,n])}},93322:(e,t,n)=>{n.d(t,{F:()=>a});var r=n(32735),i=n(13126);function a(){r.useEffect(function(){return i.e.lockContentWidth(),function(){return i.e.unlockContentWidth()}},[])}},55588:(e,t,n)=>{n.r(t),n.d(t,{InteractiveStudentResultsDemoView:()=>h});var r=n(32735),i=n(23481),a=n(20354),s=n(2948),o=n(9193),l=n(26136),u=n(3218),c=n(9111),d=n(38143),m=n(39151),v=n(54405),f=n(82541),b=n(91286),g=n(93322);function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var y=i.T.encloseNamespace("shared.interactiveStudentResults");function h(e){var t,n,i,h,p,w=(h=(0,s.D)(d.g.ANONYMISE_USERS),p=1,function(e){if(Array.isArray(e))return e}(h)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,s,o=[],l=!0,u=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(o.push(r.value),o.length!==t);l=!0);}catch(e){u=!0,i=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw i}}return o}}(h,p)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}(h,p)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];(0,g.F)();var S=a.a.useBasicFetch(v.X.interactiveMetadata()),A=a.a.useBasicFetch(v.X.interactive()),E=a.a.useBasicFetch(v.X.interactiveResults()),C=a.a.useBasicFetch(m.L.config());(0,b.v)([S,E]),(0,f.b)(S);var R=(0,o.D)(null===(t=A.data)||void 0===t?void 0:t.id,null===(n=S.data)||void 0===n?void 0:n.id,e.closePopup),I=R.markedAnswers,N=R.addMarkedAnswers,j=R.submitMarkedAnswers,M=null===(i=E.data)||void 0===i?void 0:i.students.find(function(t){var n,r,i,a,s,o;return e.userId?(null===(r=null===(n=t.user)||void 0===n?void 0:n.id)||void 0===r?void 0:r.toString())===(null===(i=e.userId)||void 0===i?void 0:i.toString()):!!e.sessionId&&(null===(s=null===(a=t.user)||void 0===a?void 0:a.sessionId)||void 0===s?void 0:s.toString())===(null===(o=e.sessionId)||void 0===o?void 0:o.toString())}),F=M?y("heading",{studentName:(0,l.B)(M.user,w)}):"",O=!!A.data&&!!E.data&&!!C.data;return r.createElement(c.G,{title:F,showLoadingSpinner:!O,closePopup:e.closePopup,size:"lg"},O&&r.createElement(u.R,{interactive:A.data,studentResults:M,markedAnswers:I,addMarkedAnswers:N,submitMarkedAnswers:j,imageCdnUrl:C.data.imageCdnUrl,selectedInteractionId:e.interactionId,onClickClose:e.closePopup,anonymiseUsers:w,reportsStyling:e.reportsStyling,isDemo:!0}))}}}]);
|
|
2
|
+
//# sourceMappingURL=2888-2596e106a5-lite.chunk.js.map
|