@clickview/lite 0.60.0-rc.2 → 0.60.0-rc.4

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 CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "appBundle": "bundle-6ac9fc9b87.min.js",
3
- "cssBundle": "lite-app-dcc0d603be.css",
2
+ "appBundle": "bundle-45b8df607d.min.js",
3
+ "cssBundle": "lite-app-3bda1e7846.css",
4
4
  "polyfillBundle": "polyfills-6564e51a1e.min.js"
5
5
  }
@@ -34,7 +34,7 @@
34
34
  .LA65A:before{display:none !important}
35
35
  .eNGKO{width:2rem;height:2rem}.Oi_cl{width:1.75rem;height:1.75rem}.D5FGN{font-size:90%}
36
36
  .YoLOx{z-index:1001;position:relative}.J0v0M{top:1rem;right:1.55rem}
37
- .ieQg3{z-index:1001;position:relative}.L2uDU{margin-top:.75rem}
37
+ .ieQg3{z-index:1001;position:relative;height:4rem}.CBK3S{margin-top:1.4rem}.L2uDU{margin-top:.75rem}
38
38
  .UA0WX{z-index:1001;position:relative}
39
39
  .E4qie{margin-top:.315rem}@media screen and (max-width: 830px){.E4qie{display:none}}
40
40
  .RP_mv{z-index:1001;position:relative}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[2962],{92869:(e,t,r)=>{r.d(t,{t:()=>i});var n=r(48088),a=r(95846),i={preventScrollTop:function(){n.Radio.channel(a.G.SHELL).trigger("prevent:scroll:top")}}},34079:(e,t,r)=>{r.d(t,{O:()=>s});var n=r(32735),a=r(23481),i=r(40782),l=r(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function o(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function s(e){var t=function(){return n.createElement("div",{className:o(e)},!!e.showLabel&&n.createElement("em",null,c("pending")),n.createElement(i.O,null))};return e.title?n.createElement(l.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},n.createElement(t,null)):n.createElement(t,null)}},97364:(e,t,r)=>{r.d(t,{C:()=>i,P:()=>a});var n=r(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=n.T.HIGH||"not_completed"===e&&!t.unanswered}},1704:(e,t,r)=>{r.d(t,{l:()=>s});var n=r(32735),a=r(23481),i=r(9111),l=r(13876);function c(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 o=a.T.encloseNamespace("shared.confirmationPopup");function s(e){var t,r,a=(t=n.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(t,r)||function(e,t){if(e){if("string"==typeof e)return c(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)?c(e,t):void 0}}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=a[0],u=a[1];return n.createElement(i.G,{title:e.title,closePopup:e.closePopup},n.createElement(n.Fragment,null,e.children,n.createElement(l.u,null,n.createElement(l.u.Cancel,{onClick:e.closePopup,variant:e.cancelButtonVariant,text:e.cancelButtonText||o("cancel")}),n.createElement(l.u.Submit,{onClick:function(){u(!0),e.onClickConfirm()},text:e.confirmButtonText||o("confirm"),variant:e.confirmButtonVariant,showSpinner:s,disabled:e.disabledConfirmButton}))))}s.defaultProps={confirmButtonVariant:"primary",cancelButtonVariant:"link"}},17688:(e,t,r)=>{r.r(t),r.d(t,{InteractiveInsightsQuestionsView:()=>Oe});var n=r(32735),a=r(23481),i=r(2948),l=r(20354),c=r(92869),o=r(75896),s=r(9570),u=r(23232),m=r(83345),d="shared.interactionResponseList";function f(e){return n.createElement(n.Fragment,null,n.createElement(u.u,{className:"m-4"},n.createElement(u.u.Image,{src:function(){switch(e.filter){case"correct":return e.correctImageUrl;case"incorrect":return e.incorrectImageUrl;case"marking_required":return e.markingRequiredImageUrl;case"skipped":return e.skippedImageUrl}}(),className:"w-25 h-auto"}),n.createElement(u.u.Info,null,n.createElement(m.x,{namespace:d,phrase:function(){switch(e.filter){case"correct":return"correctEmptyState";case"incorrect":return"incorrectEmptyState";case"marking_required":return"markingRequiredEmptyState";case"skipped":return"skippedEmptyState"}}()}))))}function p(e){function t(t){return"rounded-pill bg-light ".concat(function(t){return t===e.filter}(t)?"bg-dark text-white":"")}return n.createElement("div",{className:"d-flex gap-2 m-3"},n.createElement("button",{className:t("marking_required"),onClick:function(){return e.toggleFilter("marking_required")}},n.createElement(m.x,{namespace:d,phrase:"markingRequired"})),n.createElement("button",{className:t("correct"),onClick:function(){return e.toggleFilter("correct")}},n.createElement(m.x,{namespace:d,phrase:"correct"})),n.createElement("button",{className:t("incorrect"),onClick:function(){return e.toggleFilter("incorrect")}},n.createElement(m.x,{namespace:d,phrase:"incorrect"})),n.createElement("button",{className:t("skipped"),onClick:function(){return e.toggleFilter("skipped")}},n.createElement(m.x,{namespace:d,phrase:"skipped"})))}var g=r(86572),b=a.T.encloseNamespace("interactives.interactionResponseListHeader");function v(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return n.createElement("div",{className:"rounded bg-white"},n.createElement("div",{className:"p-2 position-relative"},n.createElement("div",{className:"d-flex"},n.createElement(g.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),!!r&&n.createElement("div",{className:"mt-2"},n.createElement("strong",null,b("suggestedResponse")),n.createElement("p",{className:"m-0"},r))))}var y=a.T.encloseNamespace("shared.submitMarkedAnswers");function h(e){return n.createElement("div",{className:"d-flex justify-content-end"},n.createElement("button",{className:"btn btn-outline-dark",onClick:e.submit,disabled:e.disabled},y("submitAnswers")))}var E=r(26136),w=r(39157),I=r(44113),k=r(28972),S=r(83140),N=r(80845);const A={awaitingMarking:"PPNkp"};function C(e){return C="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},C(e)}function x(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 U="shared.interactionResponseList",j=a.T.encloseNamespace(U);function O(e){var t,r,a,i,l=(a=n.useState(),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return x(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)?x(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=l[0],o=l[1],d=(r=e.interaction,e.results.students.filter((function(e){return S.A.isInteractionCorrect(r,(0,N.j_)(e))===k.w.AwaitingMarking})).reduce((function(e,t){var r,n;return Object.assign(Object.assign({},e),function(e,t,r){return(t=function(e){var t=function(e){if("object"!=C(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=C(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==C(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},(null===(r=t.user)||void 0===r?void 0:r.id)||(null===(n=t.publicUser)||void 0===n?void 0:n.profileId),!0))}),{})),g=Object.keys(e.markedAnswers).length;if(!(null===(t=e.results.students)||void 0===t?void 0:t.length))return n.createElement("div",{className:"d-flex flex-column h-100"},n.createElement(u.u,{className:"bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center"},n.createElement(u.u.Image,{src:e.emptyStateImageUrl,size:"small"}),n.createElement(u.u.Heading,null,j("emptyStateHeading")),n.createElement(u.u.Info,{className:"w-100"},j("emptyStateDescription"))));var b=e.results.students.filter((function(t){var r=(0,N.j_)(t),n=S.A.isInteractionCorrect(e.interaction,r),a={correct:k.w.Correct,incorrect:k.w.Incorrect,marking_required:k.w.AwaitingMarking,skipped:k.w.UnAnswered};return!c||c in a&&n===a[c]}));return n.createElement(n.Fragment,null,e.reportsStyling&&n.createElement(v,{interaction:e.interaction}),n.createElement("div",{className:e.reportsStyling?"d-flex justify-content-end":"d-flex align-items-center justify-content-between border-bottom border-light px-3 py-2"},!e.reportsStyling&&n.createElement("p",{className:"fw-semibold mb-0"},n.createElement(m.x,{namespace:U,phrase:"studentAnswers"})),!!Object.keys(d).length&&n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g})),n.createElement(n.Fragment,null,!e.reportsStyling&&n.createElement(p,{filter:c,toggleFilter:function(e){o(c===e?null:e)}}),!e.reportsStyling&&!b.length&&c&&n.createElement(f,{filter:c,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl}),b&&n.createElement("ul",{className:"list-unstyled mb-0"},b.map((function(t,r){var a,i,l=(0,E.B)(t.user||t.publicUser,e.anonymiseUsers),c=d[(null===(a=t.user)||void 0===a?void 0:a.id)||(null===(i=t.publicUser)||void 0===i?void 0:i.profileId)],o=e.reportsStyling?"bg-white p-2":"bg-white px-3 pt-3 pb-2";return c&&(o+=" ".concat(A.awaitingMarking)),n.createElement("li",{key:r},e.reportsStyling?n.createElement(I.O,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0,reportsStyling:!0,responseComponentClass:"mx-n2"}):n.createElement(s.d,{interaction:e.interaction,studentResults:t,markedStatus:(0,w.HI)(e.interaction.id,t,e.markedAnswers),markInteraction:e.addMarkedAnswers,imageCdnUrl:e.imageCdnUrl,showStudentDetails:!0,anonymisedUserName:l,className:o,showFeedback:!0}))}))),e.reportsStyling&&!!d.length&&n.createElement("div",{className:"mt-2"},n.createElement(h,{submit:e.submitMarkedAnswers,disabled:!g}))))}var T=r(34079);function M(e){var t;return n.createElement("div",null,n.createElement("p",{className:"mb-0"},(t=e.interaction.data.sentence)?t.split(/({\d+})/).map((function(t,r){var a=t.match(/{(\d+)}/);if(a){var i=a[1],l=e.interaction.actionableItems.find((function(e){return+e.order==+i}));if(l)return n.createElement("span",{className:"bg-white border border-gray-300 rounded p-1 lh-lg",key:r},l.name)}return t})):""))}var R=r(79671);const P={row:"fXno_",answerImage:"pDAuW",answerWidth:"YHK27"};function q(e){var t,r;return(null===(r=o.m.first(null===(t=e.interaction)||void 0===t?void 0:t.actionableItems).data)||void 0===r?void 0:r.imageUrl)?n.createElement("div",{className:P.answerWidth},n.createElement(R.n,{interaction:e.interaction,size:"sm",showFeedback:!1,showCorrectnessIcons:!0,isDisplayOnly:!0})):n.createElement("ul",{className:"".concat(P.answerWidth," list-unstyled row g-2")},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"col-12"},n.createElement("div",{className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border py-1 px-2 m-0")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name)))})))}var W="shared.questionTable";function B(e){var t,r=null===(t=e.interaction.data)||void 0===t?void 0:t.suggestedResponse;return r?n.createElement("div",{className:"".concat(P.answerWidth," bg-light-blue rounded p-2 mb-2")},n.createElement("div",{className:"d-flex justify-content-between"},n.createElement("p",{className:"fw-semibold mb-2"},n.createElement(m.x,{namespace:W,phrase:"suggestedResponse"}))),n.createElement("p",{className:"mb-0"},r)):n.createElement(n.Fragment,null)}function F(e){return n.createElement("ul",{className:"list-unstyled d-flex gap-2"},e.interaction.actionableItems.map((function(t){return n.createElement("li",{key:t.id,className:"".concat(t.isCorrect?"bg-light-green border-green":"bg-light-red border-red"," rounded border px-2 py-1 mb-2 w-50")},n.createElement("span",{className:"fw-semibold"},e.indexToLetter(t.order),". "),n.createElement("span",null,t.name))})))}var L=r(40424);function _(e){var t=function(){switch(e.interaction.typeId){case L.Z9.MultipleChoice:return n.createElement(q,{interaction:e.interaction,indexToLetter:Q});case L.Z9.TrueOrFalse:return n.createElement(F,{interaction:e.interaction,indexToLetter:Q});case L.Z9.ShortAnswer:return n.createElement(B,{interaction:e.interaction});case L.Z9.MissingWord:return n.createElement(M,{interaction:e.interaction});default:return null}}();return t?n.createElement("div",{className:"w-100 mt-3"},t):n.createElement(n.Fragment,null)}var H=r(40782);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)}var Z=a.T.encloseNamespace("shared.questionTable");function K(e,t,r){var n=e.cells.find((function(e){return e.column.id===r})).value,a=t.cells.find((function(e){return e.column.id===r})).value;return n.awaitingMarking?-1:a.awaitingMarking||n.percentCorrect>=a.percentCorrect?1:-1}function V(e){var t;return n.createElement("div",{className:"d-flex ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function G(e){return n.createElement(V,{className:e.column.isSorted&&"fw-bold"},Z(e.phraseKey))}function Q(e){return String.fromCharCode(e+"A".charCodeAt(0))}var z=r(8246),$=a.T.encloseNamespace("shared.questionTable");function J(e,t){var r=e.actionableItems.map((function(t,r){return{id:t.id,label:e.typeId===L.Z9.MultipleChoice?Q(r):t.name,isCorrect:t.isCorrect,count:0}}));return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&t.count++}))})),r}function Y(e,t){var r=e.actionableItems.map((function(e){return{id:e.id,label:e.name,isCorrect:e.isCorrect,count:0}}));return r.push({label:$("incorrect"),count:0,isCorrect:!1}),t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){var t=o.m.findWhere(r,{id:e.id});t&&e.status===z.N.Correct?t.count++:o.m.findWhere(r,{label:$("incorrect")}).count++}))})),r}function X(e,t){var r=[{label:$("correct"),isCorrect:!0,count:0},{label:$("incorrect"),isCorrect:!1,count:0}];return t.students.forEach((function(t){var n=o.m.last(t.results).attempts,a=o.m.findWhere(n,{id:e.id});a&&a.answers.forEach((function(e){if(e.status===z.N.Correct&&o.m.findWhere(r,{label:$("correct")}).count++,e.status===z.N.Incorrect&&o.m.findWhere(r,{label:$("incorrect")}).count++,e.status===z.N.PendingReview){var t=o.m.findWhere(r,{label:$("pending")});t||(r.push({label:$("pending"),count:0,isCorrect:!1}),t=o.m.findWhere(r,{label:$("pending")})),t.count++}}))})),r}var ee=r(83914),te=r(35223),re="shared.questionTable",ne=a.T.encloseNamespace(re);function ae(e){var t=function(){if(e.interaction&&e.results){var t;switch(e.interaction.typeId){case L.Z9.ShortAnswer:case L.Z9.Illustration:t=X;break;case L.Z9.MissingWord:t=Y;break;case L.Z9.MultipleChoice:case L.Z9.TrueOrFalse:t=J}return t(e.interaction,e.results)}}(),r=null==t?void 0:t.reduce((function(e,t){return t.count>e?t.count:e}),0);function a(e){var t="border rounded me-2";return e.count?e.label===ne("pending")?"".concat(t," border-blue bg-light-blue"):e.isCorrect?"".concat(t," border-green bg-light-green"):"".concat(t," border-red bg-light-red"):"".concat(t," border-light bg-light px-1")}return n.createElement("div",{className:"border border-light rounded p-3 mb-3"},n.createElement("div",{className:"d-flex align-items-center gap-2 mb-3"},n.createElement("div",{className:"rounded-circle bg-light-teal text-teal"},n.createElement(ee.x,{svgName:te.vn.Lightbulb,size:ee.S.Large})),n.createElement("h2",{className:"h6 mb-0"},n.createElement("span",null,n.createElement(m.x,{namespace:re,phrase:"questionSummary"})))),n.createElement("div",{className:"d-flex gap-2"},n.createElement("div",{className:"max-w-25"},null==t?void 0:t.map((function(e){return n.createElement("p",{key:e.label,className:"text-truncate mb-2"},e.label)}))),n.createElement("div",{className:"flex-grow-1"},null==t?void 0:t.map((function(e,t){return n.createElement("div",{key:t,className:"d-flex mb-2"},n.createElement("div",{className:a(e),style:{width:"".concat(e.count/r*100,"%"),height:20}}),n.createElement("span",null,e.count))})))))}var ie=a.T.encloseNamespace("shared.selectedInteractionEmptyState");function le(e){return n.createElement(u.u,{className:"rounded h-100 bg-white justify-content-center py-4"},n.createElement(u.u.Image,{src:e.emptyStateUrl,size:"small"}),n.createElement(u.u.Info,{className:"w-100"},ie("emptyStateText")))}var ce=r(97364),oe=r(69674),se=r(57266);function ue(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}function me(e){var t,r,a,i,l=(a=n.useState((0,ce.P)(e.sortBy,"correctlyAnswered")),i=2,function(e){if(Array.isArray(e))return e}(a)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(a,i)||function(e,t){if(e){if("string"==typeof e)return ue(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)?ue(e,t):void 0}}(a,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),s=l[0],u=l[1],m=function(e,t,r,a){return n.useMemo((function(){var r=(0,N.Q)(e),n=r.reduce((function(e,t,r){return Object.assign(Object.assign({},e),function(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}({},t.id,r))}),{}),i=r.map((function(e){return Object.assign(Object.assign({},e),{questionNumber:n[e.id],resultsSummary:(0,w.nq)(e,t)})}));if("correctlyAnswered"===(null==a?void 0:a.id)){var l=o.m.sortBy(i,(function(e){return e.resultsSummary.awaitingMarking?-1:e.resultsSummary.percentCorrect}));return a.desc?l.reverse():l}return i}),[r,a])}(e.interactive,e.results,e.refreshTable,o.m.first(s)),d=e.selectedInteractionId&&(0,w.Zs)(e.interactive,e.selectedInteractionId);return n.createElement("div",{className:"row"},n.createElement("div",{className:"col-6 flex-grow-1"},n.createElement(oe.i,{key:e.selectedInteractionId,columns:(r=e.showAnswersInTable,[{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"#"})},accessor:"questionNumber",id:"index",Cell:function(e){var t=e.row.original.questionNumber;return n.createElement(V,null,t+1,".")},width:15,disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"question"})},accessor:"data",Cell:function(e){var t=e.row.original,a=e.initialState.selectedRowIds,i=null==a?void 0:a[null==t?void 0:t.id];return n.createElement(V,{className:"flex-column"},n.createElement("div",{className:"".concat(i?"":"clamp-1"," pe-2")},n.createElement(g.y,{interaction:t,containerClassName:"d-flex"})),r&&i&&n.createElement(_,{interaction:t}))},disableSortBy:!0},{Header:function(e){var t=e.column;return n.createElement(G,{column:t,phraseKey:"score"})},accessor:"resultsSummary",id:"correctlyAnswered",Cell:function(e){var t=e.value,r=t.percentCorrect;return t.awaitingMarking?n.createElement(T.O,{title:Z("markingRequired"),className:"flex-grow-1",tooltipClassName:"d-block",showLabel:!0}):n.createElement(H.O,{percentage:r,layout:H.I.LabelBefore})},width:60,sortDescFirst:!0,sortType:K}]),data:m,theme:e.theme,onSelectRow:function(e){var t=e.original;c.t.preventScrollTop(),se.e.updateParams({interactionId:t.id},{merge:!0})},initialSelectedRowIds:d?[d.id]:null,getRowId:function(e){return e.id},enableSort:!0,manualSort:!0,onSort:u,initialSortBy:s})),n.createElement("div",{className:"col-6 d-flex flex-column"},!e.reportsStyling&&e.selectedInteractionId&&!!(null===(t=e.results.students)||void 0===t?void 0:t.length)&&n.createElement(ae,{interaction:d,results:e.results}),n.createElement("div",{className:"border border-light rounded flex-grow-1"},!!d&&n.createElement(O,{interaction:d,results:e.results,markedAnswers:e.markedAnswers,addMarkedAnswers:e.addMarkedAnswers,submitMarkedAnswers:e.submitMarkedAnswers,imageCdnUrl:e.imageCdnUrl,anonymiseUsers:e.anonymiseUsers,emptyStateImageUrl:e.emptyStateImageUrl,markingRequiredImageUrl:e.markingRequiredImageUrl,correctImageUrl:e.correctImageUrl,incorrectImageUrl:e.incorrectImageUrl,skippedImageUrl:e.skippedImageUrl,reportsStyling:e.reportsStyling}),!d&&n.createElement(le,{emptyStateUrl:e.selectQuestionImageUrl}))))}var de=r(41196),fe=r(9193),pe=r(26025),ge=r(74901),be=r(40003),ve=r(1704),ye=r(38143),he=r(39151),Ee=r(20768),we=r(79612),Ie=r(99742),ke=r(5672),Se=r(93116);const Ne={partialInsights:"bk68v"};function Ae(){return n.createElement("div",null,n.createElement("div",{className:"row g-3 mb-5"},n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ne.partialInsights," rounded partial-loading-background")})),n.createElement("div",{className:"col-6"},n.createElement("div",{className:"".concat(Ne.partialInsights," rounded partial-loading-background")}))))}function Ce(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,i,l,c=[],o=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;o=!1}else for(;!(o=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);o=!0);}catch(e){s=!0,a=e}finally{try{if(!o&&null!=r.return&&(l=r.return(),Object(l)!==l))return}finally{if(s)throw a}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return xe(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)?xe(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 xe(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 Ue=a.T.encloseNamespace("shared.interactiveInsightsQuestions"),je={table:"bg-white rounded border border-light h-100 pb-2",header:"border-bottom px-3 py-2 mb-2",headerCell:"d-flex align-items-center",cell:"",row:"px-3 py-2 bg-light-blue-hover",selectedRow:"bg-gray-100",sortIndicator:"ms-2"};function Oe(e){var t,r,a,c,o,s=Ce((0,i.D)(ye.g.ANONYMISE_USERS),1)[0],u=Ce(n.useState(!1),2),m=u[0],d=u[1],f=l.a.useBasicFetch(he.L.config()),p=l.a.useBasicFetch(Ee.b.interactiveMetadata(e.interactiveId)),g=l.a.useBasicFetch((null===(t=p.data)||void 0===t?void 0:t.interactiveId)&&Ee.b.interactive(p.data.interactiveId)),b=pe.B.getAudienceAppLinkParams(),v=pe.B.getDateRangeAppLinkParams(),y=(0,de.W)(e.interactiveId,Object.assign(Object.assign({},(0,be.wO)((0,be.Hb)(),v)),(0,ge.K)(b)),!0),h=(0,fe.D)(null===(r=g.data)||void 0===r?void 0:r.id,null===(a=p.data)||void 0===a?void 0:a.id,(function(){return d(!1)})),E=h.markedAnswers,w=h.addMarkedAnswers,I=h.submitMarkedAnswers;(0,we.M)({title:p.data?Ue("pageTitle",{video:null===(c=p.data)||void 0===c?void 0:c.name}):null});var k=g.data&&p.data&&y.data,S=Object.assign(Object.assign({},b),v);return n.createElement("div",{className:"px-3"},n.createElement(Se.m,{audienceAppLinkParams:b,dateRangeAppLinkParams:v,tabs:(0,ke.kj)(e.interactiveId,"questions",S),video:p.data}),!k&&n.createElement(Ae,null),k&&n.createElement(me,{interactive:g.data,results:y.data,markedAnswers:E,addMarkedAnswers:w,submitMarkedAnswers:function(){return d(!0)},imageCdnUrl:f.data.imageCdnUrl,selectedInteractionId:e.interactionId,refreshTable:y.isFetching||g.isFetching,emptyStateImageUrl:Ie.W.Insights.NO_RESPONSES,selectQuestionImageUrl:Ie.W.Insights.NO_DATA,anonymiseUsers:s,sortBy:e.sortBy,showAnswersInTable:!0,theme:je,correctImageUrl:Ie.W.Insights.JIGSAW,incorrectImageUrl:Ie.W.Insights.RED_JIGSAW,skippedImageUrl:Ie.W.Insights.SKIPPED,markingRequiredImageUrl:Ie.W.Insights.CLIPBOARD}),m&&n.createElement(ve.l,{title:Ue("markPopupTitle",{smartCount:null!==(o=Object.keys(E).length)&&void 0!==o?o:0}),closePopup:function(){return d(!1)},confirmButtonText:Ue("submit"),confirmButtonVariant:"dark",onClickConfirm:I},n.createElement("p",null,Ue("markPopupBody"))))}}}]);
2
+ //# sourceMappingURL=2962-cd169fb047-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/2962-cd169fb047-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/backbone/utils/ScrollHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","file:///app/packages/libs/shared/src/components/confirmation-popup/ConfirmationPopup.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListFilters.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/interaction-response-list.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMissingWord.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/question-table-answers.scss","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMultipleChoice.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableShortAnswer.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableTrueOrFalse.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummaryUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/questions-list/question-table/QuestionTable.tsx","file:///app/packages/projects/lite/src/apps/insights/views/interactive/questions/partial-loading/partial-interactive-insights-questions.scss","file:///app/packages/projects/lite/src/apps/insights/views/interactive/questions/partial-loading/PartialInteractiveInsightsQuestions.tsx","file:///app/packages/projects/lite/src/apps/insights/views/interactive/questions/InteractiveInsightsQuestionsView.tsx"],"sourcesContent":["import { Radio } from 'backbone';\n\nimport { CommonChannels } from '../constants/CommonChannels';\n\nexport const ScrollHelper = {\n // Will prevent scrolling to the top of the page when applinks are triggered\n preventScrollTop(): void {\n Radio.channel(CommonChannels.SHELL).trigger('prevent:scroll:top');\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'interactives.pendingIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(props: PendingIndicatorProps): string {\n let className = 'd-flex align-items-center h-100';\n\n className += props.showLabel ? ' justify-content-between' : ' justify-content-center';\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface PendingIndicatorProps {\n title?: string;\n className?: string;\n showLabel?: boolean;\n tooltipClassName?: string;\n}\n\nexport function PendingIndicator(props: PendingIndicatorProps): JSX.Element {\n const Indicator = () => (\n <div className={getClassName(props)}>\n {!!props.showLabel &&\n <em>{getPhrase('pending')}</em>\n }\n <PercentageIndicator />\n </div>\n );\n\n if (!props.title)\n return <Indicator />;\n\n return (\n <Tooltip title={props.title} spanHack spanHackClassName={props.tooltipClassName || 'h-100 w-100 d-flex align-items-center'}>\n <Indicator />\n </Tooltip>\n );\n}","import { SortingRule } from 'react-table';\n\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}\n\nexport type FilterStudentsBy = 'not_completed' | 'marking_required' | 'helping_hand';\n\nexport function shouldFilterStudent(filter: FilterStudentsBy, summary: ResultsSummary): boolean {\n if (filter === 'marking_required' && !summary.awaitingMarking)\n return true;\n\n if (filter === 'helping_hand' && summary.percentCorrect >= ScoreThresholdInsights.HIGH)\n return true;\n\n if (filter === 'not_completed' && !summary.unanswered)\n return true;\n \n return false;\n}\n\n","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.confirmationPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ConfirmationPopupProps {\n title: string;\n onClickConfirm: () => void;\n confirmButtonText?: string;\n cancelButtonText?: string;\n confirmButtonVariant?: ButtonProps['variant'];\n cancelButtonVariant?: ButtonProps['variant'];\n disabledConfirmButton?: boolean;\n}\n\nConfirmationPopup.defaultProps = {\n confirmButtonVariant: 'primary',\n cancelButtonVariant: 'link'\n};\n\ntype PropTypes = React.PropsWithChildren<ConfirmationPopupProps & PopupViewProps>;\n\nexport function ConfirmationPopup(props: PropTypes): React.ReactElement {\n const [ showButtonSpinner, setShowButtonSpinner ] = React.useState(false);\n\n return (\n <Popup title={props.title} closePopup={props.closePopup}>\n <>\n {props.children}\n <PopupButtons>\n <PopupButtons.Cancel\n onClick={props.closePopup}\n variant={props.cancelButtonVariant}\n text={props.cancelButtonText || getPhrase('cancel')}\n />\n <PopupButtons.Submit\n onClick={() => { setShowButtonSpinner(true); props.onClickConfirm(); }}\n text={props.confirmButtonText || getPhrase('confirm')}\n variant={props.confirmButtonVariant}\n showSpinner={showButtonSpinner}\n disabled={props.disabledConfirmButton}\n />\n </PopupButtons>\n </>\n </Popup>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.interactionResponseList';\n\nexport type InteractionResponseFilterType = 'marking_required' | 'correct' | 'incorrect' | 'skipped';\n\ninterface InteractionResponseListFiltersEmptyStatesProps {\n filter: InteractionResponseFilterType;\n markingRequiredImageUrl: string;\n correctImageUrl: string;\n incorrectImageUrl: string;\n skippedImageUrl: string;\n}\n\nexport function InteractionResponseListFiltersEmptyStates(props: InteractionResponseListFiltersEmptyStatesProps) {\n function getFilterEmptyStateImageUrl() {\n switch (props.filter) {\n case 'correct': return props.correctImageUrl;\n case 'incorrect': return props.incorrectImageUrl;\n case 'marking_required': return props.markingRequiredImageUrl;\n case 'skipped': return props.skippedImageUrl;\n }\n }\n\n function getFilterEmptyStatePhrase() {\n switch (props.filter) {\n case 'correct': return 'correctEmptyState';\n case 'incorrect': return 'incorrectEmptyState';\n case 'marking_required': return 'markingRequiredEmptyState';\n case 'skipped': return 'skippedEmptyState';\n }\n }\n\n return (\n <>\n <EmptyState className='m-4'>\n <EmptyState.Image src={getFilterEmptyStateImageUrl()} className='w-25 h-auto' />\n <EmptyState.Info>\n <Text namespace={namespace} phrase={getFilterEmptyStatePhrase()} />\n </EmptyState.Info>\n </EmptyState>\n </>\n );\n}\n\ninterface InteractionResponseListFiltersProps {\n filter: InteractionResponseFilterType;\n toggleFilter: (filter: InteractionResponseFilterType) => void\n}\n\nexport function InteractionResponseListFilters(props: InteractionResponseListFiltersProps) {\n function isFilterSelected(filterButton: InteractionResponseFilterType) {\n return filterButton === props.filter;\n }\n\n function getFilterClassName(filterButton: InteractionResponseFilterType) {\n return `rounded-pill bg-light ${isFilterSelected(filterButton) ? 'bg-dark text-white' : ''}`;\n }\n\n return (\n\n <div className='d-flex gap-2 m-3'>\n <button className={getFilterClassName('marking_required')} onClick={() => props.toggleFilter('marking_required')}>\n <Text namespace={namespace} phrase='markingRequired' />\n </button>\n <button className={getFilterClassName('correct')} onClick={() => props.toggleFilter('correct')}>\n <Text namespace={namespace} phrase='correct' />\n </button>\n <button className={getFilterClassName('incorrect')} onClick={() => props.toggleFilter('incorrect')}>\n <Text namespace={namespace} phrase='incorrect' />\n </button>\n <button className={getFilterClassName('skipped')} onClick={() => props.toggleFilter('skipped')}>\n <Text namespace={namespace} phrase='skipped' />\n </button>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { Interaction } from 'libs/shared/interfaces';\n\nconst namespace = 'interactives.interactionResponseListHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface InteractionResponseListHeaderProps {\n interaction: Interaction;\n}\n\nexport function InteractionResponseListHeader(props: InteractionResponseListHeaderProps): JSX.Element {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n return (\n <div className='rounded bg-white'>\n <div className='p-2 position-relative'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n {!!suggestedResponse &&\n <div className='mt-2'>\n <strong>{getPhrase('suggestedResponse')}</strong>\n <p className='m-0'>{suggestedResponse}</p>\n </div>\n }\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'shared.submitMarkedAnswers';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SubmitMarkedAnswersProps {\n submit: () => void;\n disabled: boolean\n}\n\nexport function SubmitMarkedAnswers(props: SubmitMarkedAnswersProps): JSX.Element {\n return (\n <div className='d-flex justify-content-end'>\n <button\n className='btn btn-outline-dark'\n onClick={props.submit}\n disabled={props.disabled}\n >\n {getPhrase('submitAnswers')}\n </button>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"awaitingMarking\":\"PPNkp\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { InteractionResponseItem } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-item/InteractionResponseItem';\nimport { InteractionResponseFilterType, InteractionResponseListFilters, InteractionResponseListFiltersEmptyStates } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListFilters';\nimport { InteractionResponseListHeader } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseListHeader';\nimport { SubmitMarkedAnswers } from 'libs/shared/apps/analytics/components/questions-list/submit-marked-answers/SubmitMarkedAnswers';\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getMarkedStatus } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { InteractionResponse } from 'libs/shared/components/interaction-response/InteractionResponse';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractiveResultSet, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\nimport styles from './interaction-response-list.scss';\n\nconst namespace = 'shared.interactionResponseList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getResponsesToMark(\n interaction: Interaction,\n studentResults: StudentResults[]\n): HashObject {\n const responsesToMark = studentResults.filter(s => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n interaction,\n getStudentResult(s)\n );\n return correctness === InteractionCorrectness.AwaitingMarking;\n });\n\n return responsesToMark.reduce((acc, s) => ({\n ...acc,\n [s.user?.id || s.publicUser?.profileId]: true\n }), {});\n}\n\ninterface InteractionResponseListProps {\n interaction: Interaction\n results: InteractiveResultSet;\n markedAnswers: MarkedAnswerHash;\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n imageCdnUrl: string;\n anonymiseUsers: boolean;\n reportsStyling?: boolean;\n emptyStateImageUrl: string;\n markingRequiredImageUrl: string;\n correctImageUrl: string;\n incorrectImageUrl: string;\n skippedImageUrl: string;\n}\n\nexport function InteractionResponseList(props: InteractionResponseListProps): JSX.Element {\n const [ filter, setFilter ] = React.useState<InteractionResponseFilterType>();\n\n const responsesToMark = getResponsesToMark(props.interaction, props.results.students);\n const numMarkedAnswers = Object.keys(props.markedAnswers).length;\n\n if (!props.results.students?.length)\n return (\n <div className='d-flex flex-column h-100'>\n <EmptyState className='bg-white rounded mt-2 py-5 flex-grow-1 justify-content-center'>\n <EmptyState.Image src={props.emptyStateImageUrl} size='small' />\n <EmptyState.Heading>\n {getPhrase('emptyStateHeading')}\n </EmptyState.Heading>\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateDescription')}\n </EmptyState.Info>\n </EmptyState>\n </div>\n );\n\n\n function toggleFilter(selectedFilter: InteractionResponseFilterType) {\n setFilter(filter === selectedFilter ? null : selectedFilter);\n }\n\n function filterStudentResults() {\n return props.results.students.filter(s => {\n const result = getStudentResult(s);\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(props.interaction, result);\n\n const filterMap = {\n correct: InteractionCorrectness.Correct,\n incorrect: InteractionCorrectness.Incorrect,\n marking_required: InteractionCorrectness.AwaitingMarking,\n skipped: InteractionCorrectness.UnAnswered\n };\n\n return !filter || (filter in filterMap && correctness === filterMap[filter]);\n });\n }\n\n const filteredStudentResults = filterStudentResults();\n\n return (\n <>\n {props.reportsStyling && <InteractionResponseListHeader interaction={props.interaction} />}\n <div className={props.reportsStyling\n ? 'd-flex justify-content-end'\n : 'd-flex align-items-center justify-content-between border-bottom border-light px-3 py-2'\n }>\n {!props.reportsStyling && <p className='fw-semibold mb-0'><Text namespace={namespace} phrase='studentAnswers' /></p>}\n {!!Object.keys(responsesToMark).length &&\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n }\n </div>\n <>\n {!props.reportsStyling && <InteractionResponseListFilters filter={filter} toggleFilter={toggleFilter} />}\n\n {!props.reportsStyling && !filteredStudentResults.length && filter && (\n <InteractionResponseListFiltersEmptyStates\n filter={filter}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n correctImageUrl={props.correctImageUrl}\n incorrectImageUrl={props.incorrectImageUrl}\n skippedImageUrl={props.skippedImageUrl}\n />\n )}\n \n {filteredStudentResults && (\n <ul className='list-unstyled mb-0'>\n {filteredStudentResults.map((s, idx) => {\n const anonymisedUserName = anonymiseUserName(s.user || s.publicUser, props.anonymiseUsers);\n const markingRequired = responsesToMark[s.user?.id || s.publicUser?.profileId];\n\n let className = props.reportsStyling ? 'bg-white p-2' : 'bg-white px-3 pt-3 pb-2';\n\n if (markingRequired)\n className += ` ${styles.awaitingMarking}`;\n\n return (\n <li key={idx}>\n {props.reportsStyling ? (\n <InteractionResponse\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={anonymisedUserName}\n className={className}\n showFeedback\n reportsStyling\n responseComponentClass='mx-n2'\n />\n ) : (\n <InteractionResponseItem\n interaction={props.interaction}\n studentResults={s}\n markedStatus={getMarkedStatus(props.interaction.id, s, props.markedAnswers)}\n markInteraction={props.addMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n showStudentDetails\n anonymisedUserName={anonymisedUserName}\n className={className}\n showFeedback\n />\n )}\n </li>\n );\n })}\n </ul>\n )}\n {props.reportsStyling && !!responsesToMark.length &&\n <div className='mt-2'>\n <SubmitMarkedAnswers submit={props.submitMarkedAnswers} disabled={!numMarkedAnswers} />\n </div>\n }\n </>\n </>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\n\nexport function QuestionTableMissingWord(props: QuestionTableAnswersProps) {\n const replacePlaceholders = (str: string) => {\n if (!str) return '';\n\n return str.split(/({\\d+})/).map((part, index) => {\n const match = part.match(/{(\\d+)}/);\n\n if (match) {\n const key = match[1];\n\n const replacement = props.interaction.actionableItems.find(answer => +answer.order === +key);\n\n\n if (replacement) {\n return <span className='bg-white border border-gray-300 rounded p-1 lh-lg' key={index}>{replacement.name}</span>;\n }\n }\n\n return part;\n });\n };\n\n return (\n <div>\n <p className='mb-0'>{replacePlaceholders(props.interaction.data.sentence)}</p>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"row\":\"fXno_\",\"answerImage\":\"pDAuW\",\"answerWidth\":\"YHK27\"};","import React from 'react';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { MultipleChoiceInteractionAnswers } from 'libs/shared/components/interaction-answers/multiple-choice/MultipleChoiceInteractionAnswers';\n\nimport styles from './question-table-answers.scss';\n\nexport function QuestionTableMultipleChoice(props: QuestionTableAnswersProps) {\n const hasImages = !!ArrayHelper.first(props.interaction?.actionableItems).data?.imageUrl;\n\n if (!hasImages) {\n return (\n <ul className={`${styles.answerWidth} list-unstyled row g-2`}>\n {props.interaction.actionableItems.map(option => {\n return (\n <li key={option.id} className='col-12'>\n <div className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border py-1 px-2 m-0`}>\n <span className='fw-semibold'>{props.indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </div>\n </li>\n );\n })}\n </ul>\n );\n }\n\n return (\n <div className={styles.answerWidth}>\n <MultipleChoiceInteractionAnswers\n interaction={props.interaction}\n size='sm'\n showFeedback={false}\n showCorrectnessIcons\n isDisplayOnly\n />\n </div>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './question-table-answers.scss';\n\nconst namespace = 'shared.questionTable';\n\nexport function QuestionTableShortAnswer(props: QuestionTableAnswersProps) {\n const suggestedResponse = props.interaction.data?.suggestedResponse;\n\n if (!suggestedResponse) return <></>;\n\n return (\n <div className={`${styles.answerWidth} bg-light-blue rounded p-2 mb-2`}>\n <div className='d-flex justify-content-between'>\n <p className='fw-semibold mb-2'>\n <Text namespace={namespace} phrase='suggestedResponse' />\n </p>\n </div>\n\n <p className='mb-0'>{suggestedResponse}</p>\n </div>\n );\n}","import React from 'react';\n\nimport { QuestionTableAnswersProps } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\n\n\nexport function QuestionTableTrueOrFalse(props: QuestionTableAnswersProps) {\n return (\n <ul className='list-unstyled d-flex gap-2'>\n {props.interaction.actionableItems.map(option => {\n return (\n <li\n key={option.id}\n className={`${option.isCorrect ? 'bg-light-green border-green' : 'bg-light-red border-red'} rounded border px-2 py-1 mb-2 w-50`}\n >\n <span className='fw-semibold'>{props.indexToLetter(option.order)}. </span>\n <span>{option.name}</span>\n </li>\n );\n })}\n </ul>\n );\n}","import React from 'react';\n\nimport { QuestionTableMissingWord } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMissingWord';\nimport { QuestionTableMultipleChoice } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableMultipleChoice';\nimport { QuestionTableShortAnswer } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableShortAnswer';\nimport { QuestionTableTrueOrFalse } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableTrueOrFalse';\nimport { indexToLetter } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTableUtils';\nimport { Interaction, InteractionTypeId } from 'libs/shared/interfaces';\n\nexport interface QuestionTableAnswersProps {\n interaction: Interaction;\n indexToLetter?: (index: number) => string;\n}\n\nexport function QuestionTableAnswers(props: QuestionTableAnswersProps) {\n function getQuestionTableAnswerComponent(): JSX.Element {\n switch (props.interaction.typeId) {\n case InteractionTypeId.MultipleChoice:\n return <QuestionTableMultipleChoice interaction={props.interaction} indexToLetter={indexToLetter} />;\n case InteractionTypeId.TrueOrFalse:\n return <QuestionTableTrueOrFalse interaction={props.interaction} indexToLetter={indexToLetter} />;\n case InteractionTypeId.ShortAnswer:\n return <QuestionTableShortAnswer interaction={props.interaction} />;\n case InteractionTypeId.MissingWord:\n return <QuestionTableMissingWord interaction={props.interaction} />;\n default: return null;\n }\n }\n\n const QuestionTableAnswerComponent = getQuestionTableAnswerComponent();\n\n if (!QuestionTableAnswerComponent) return <></>;\n\n return (\n <div className='w-100 mt-3'>\n {QuestionTableAnswerComponent}\n </div>\n );\n}","import React from 'react';\nimport { Column, ColumnInstance, Row, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { QuestionTableAnswers } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-table-answers/QuestionTableAnswers';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction sortScore(\n rowA: Row<InteractionWithResultsSummary>,\n rowB: Row<InteractionWithResultsSummary>,\n columnId: string\n): 1 | -1 {\n const cellA = rowA.cells.find(cell => cell.column.id === columnId).value;\n const cellB = rowB.cells.find(cell => cell.column.id === columnId).value;\n\n if (cellA.awaitingMarking)\n return -1;\n\n if (cellB.awaitingMarking)\n return 1;\n\n return cellA.percentCorrect >= cellB.percentCorrect\n ? 1\n : -1;\n}\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<InteractionWithResultsSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function getColumns(\n showAnswersInTable: boolean\n): Column<InteractionWithResultsSummary>[] {\n return [\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='#' />,\n accessor: 'questionNumber',\n id: 'index',\n Cell: ({ row: { original: { questionNumber } } }) => {\n return <CellWrapper>{questionNumber + 1}.</CellWrapper>;\n },\n width: 15,\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='question' />,\n accessor: 'data', // This isn't used but it's needed for the typings on row,\n Cell: ({ row: { original: interaction }, initialState: { selectedRowIds } }) => {\n const selectedRow = selectedRowIds?.[interaction?.id];\n\n return (\n <CellWrapper className='flex-column'>\n <div className={`${!selectedRow ? 'clamp-1' : ''} pe-2`}>\n <InteractionLabel interaction={interaction} containerClassName='d-flex' />\n </div>\n\n {showAnswersInTable && selectedRow && (\n <QuestionTableAnswers interaction={interaction} />\n )}\n </CellWrapper>\n );\n },\n disableSortBy: true\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'resultsSummary',\n id: 'correctlyAnswered',\n Cell: ({ value: { percentCorrect, awaitingMarking } }) => {\n if (awaitingMarking) {\n return (\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n tooltipClassName='d-block'\n showLabel\n />\n );\n }\n\n return (\n <PercentageIndicator\n percentage={percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n />\n );\n },\n width: 60,\n sortDescFirst: true,\n sortType: sortScore\n }\n ];\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n sortBy?: SortingRule<InteractionWithResultsSummary>\n): InteractionWithResultsSummary[] {\n return React.useMemo(() => {\n const flattenedInteractions = getInteractions(interactive);\n const questionNumbers: HashObject = flattenedInteractions.reduce((acc, interaction, index) => ({\n ...acc, [interaction.id]: index\n }), {});\n\n const interactions = flattenedInteractions.map(i => ({\n ...i,\n questionNumber: questionNumbers[i.id],\n resultsSummary: getInteractionResultsSummary(i, results)\n }));\n\n if (sortBy?.id === 'correctlyAnswered') {\n const sorted = ArrayHelper.sortBy(interactions, interaction => {\n if (interaction.resultsSummary.awaitingMarking)\n return -1;\n\n return interaction.resultsSummary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return interactions;\n }, [ refreshData, sortBy ]);\n}\n\nexport function indexToLetter(index: number) {\n return String.fromCharCode(index + 'A'.charCodeAt(0));\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { indexToLetter } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTableUtils';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResultSet } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface QuestionSummary {\n id?: string;\n count: number;\n isCorrect: boolean;\n label?: string | number;\n}\n\nexport function multipleChoiceSummary(\n interaction: Interaction,\n studentResults: InteractiveResultSet\n): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = interaction.actionableItems.map((item, i) => {\n return {\n id: item.id,\n label: interaction.typeId === InteractionTypeId.MultipleChoice ? indexToLetter(i) : item.name,\n isCorrect: item.isCorrect,\n count: 0\n };\n });\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n const questionSummary = ArrayHelper.findWhere(questionsSummary, { id: answer.id });\n\n if (questionSummary)\n questionSummary.count++;\n });\n });\n\n return questionsSummary;\n}\n\nexport function missingWordSummary(interaction: Interaction, studentResults: InteractiveResultSet): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = interaction.actionableItems.map(item => {\n return {\n id: item.id,\n label: item.name,\n isCorrect: item.isCorrect,\n count: 0\n };\n });\n\n questionsSummary.push({\n label: getPhrase('incorrect'),\n count: 0,\n isCorrect: false\n });\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n const questionSummary = ArrayHelper.findWhere(questionsSummary, { id: answer.id });\n\n if (questionSummary && answer.status === InteractiveAnswerStatus.Correct) {\n questionSummary.count++;\n } else {\n const incorrectSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('incorrect') });\n\n incorrectSummary.count++;\n }\n });\n });\n\n return questionsSummary;\n}\n\nexport function markedSummary(interaction: Interaction, studentResults: InteractiveResultSet): QuestionSummary[] {\n const questionsSummary: QuestionSummary[] = [\n {\n label: getPhrase('correct'),\n isCorrect: true,\n count: 0\n },\n {\n label: getPhrase('incorrect'),\n isCorrect: false,\n count: 0\n }\n ];\n\n studentResults.students.forEach(student => {\n const latestAttempts = ArrayHelper.last(student.results).attempts;\n const response = ArrayHelper.findWhere(latestAttempts, { id: interaction.id });\n\n if (!response) return;\n\n response.answers.forEach(answer => {\n if (answer.status === InteractiveAnswerStatus.Correct) {\n const correctSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('correct') });\n correctSummary.count++;\n }\n if (answer.status === InteractiveAnswerStatus.Incorrect) {\n const incorrectSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('incorrect') });\n incorrectSummary.count++;\n }\n if (answer.status === InteractiveAnswerStatus.PendingReview) {\n let pendingSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('pending') });\n\n if (!pendingSummary) {\n questionsSummary.push({\n label: getPhrase('pending'),\n count: 0,\n isCorrect: false\n });\n pendingSummary = ArrayHelper.findWhere(questionsSummary, { label: getPhrase('pending') });\n }\n\n pendingSummary.count++;\n }\n });\n });\n\n return questionsSummary;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { markedSummary, missingWordSummary, multipleChoiceSummary, QuestionSummary } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummaryUtils';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Interaction, InteractionTypeId, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.questionTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface QuestionResultsSummaryProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n}\n\nexport function QuestionResultsSummary(props: QuestionResultsSummaryProps) {\n const questionSummary = getQuestionSummary();\n const maxResponseCount = getMaxResponseCount();\n\n function getQuestionSummary(): QuestionSummary[] {\n if (!props.interaction || !props.results) return;\n\n let summaryMethod: (\n interaction: Interaction,\n results: InteractiveResultSet,\n interactionTypeId?: InteractionTypeId\n ) => QuestionSummary[];\n\n switch (props.interaction.typeId) {\n case InteractionTypeId.ShortAnswer:\n case InteractionTypeId.Illustration:\n summaryMethod = markedSummary;\n break;\n case InteractionTypeId.MissingWord:\n summaryMethod = missingWordSummary;\n break;\n case InteractionTypeId.MultipleChoice:\n case InteractionTypeId.TrueOrFalse:\n summaryMethod = multipleChoiceSummary;\n break;\n }\n\n return summaryMethod(props.interaction, props.results);\n }\n\n function getMaxResponseCount() {\n return questionSummary?.reduce((acc, summary) => summary.count > acc ? summary.count : acc, 0);\n }\n\n function getBarClassName(summary: QuestionSummary) {\n const className = 'border rounded me-2';\n\n if (!summary.count)\n return `${className} border-light bg-light px-1`;\n\n if (summary.label === getPhrase('pending'))\n return `${className} border-blue bg-light-blue`;\n\n if (summary.isCorrect)\n return `${className} border-green bg-light-green`;\n\n return `${className} border-red bg-light-red`;\n }\n\n return (\n <div className='border border-light rounded p-3 mb-3'>\n <div className='d-flex align-items-center gap-2 mb-3'>\n <div className='rounded-circle bg-light-teal text-teal'>\n <SvgContainer svgName={cvSvgLibrary.Lightbulb} size={SvgContainerSize.Large} />\n </div>\n <h2 className='h6 mb-0'>\n <span><Text namespace={namespace} phrase='questionSummary' /></span>\n </h2>\n </div>\n <div className='d-flex gap-2'>\n <div className='max-w-25'>\n {questionSummary?.map(summary => {\n return (\n <p key={summary.label} className='text-truncate mb-2'>{summary.label}</p>\n );\n })}\n </div>\n <div className='flex-grow-1'>\n {questionSummary?.map((summary, i) => {\n return (\n <div key={i} className='d-flex mb-2'>\n <div\n className={getBarClassName(summary)}\n style={{ width: `${(summary.count / maxResponseCount) * 100}%`, height: 20 }}>\n </div>\n <span>{summary.count}</span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\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';\n\nconst namespace = 'shared.selectedInteractionEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SelectedInteractionEmptyStateProps {\n emptyStateUrl: string;\n}\n\nexport function SelectedInteractionEmptyState(props: SelectedInteractionEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='rounded h-100 bg-white justify-content-center py-4'>\n <EmptyState.Image\n src={props.emptyStateUrl}\n size='small'\n />\n <EmptyState.Info className='w-100'>\n {getPhrase('emptyStateText')}\n </EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\nimport { Row, SortingRule } from 'react-table';\n\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { InteractionResponseList } from 'libs/shared/apps/analytics/components/questions-list/interaction-response-list/InteractionResponseList';\nimport { QuestionResultsSummary } from 'libs/shared/apps/analytics/components/questions-list/question-table/question-results-summary/QuestionResultsSummary';\nimport { SelectedInteractionEmptyState } from 'libs/shared/apps/analytics/components/questions-list/selected-interaction-empty-state/SelectedInteractionEmptyState';\nimport { InteractionWithResultsSummary } from 'libs/shared/apps/analytics/interfaces/InteractionWithResultsSummary';\nimport { getInteractionById } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { getSortStudents, SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interactive, InteractiveResultSet, StudentAnswer } from 'libs/shared/interfaces';\nimport { AppRouteHelper } from 'libs/shared/utils/AppRouteHelper';\n\nimport { getColumns, useGetTableData } from './QuestionTableUtils';\n\ninterface QuestionTableProps {\n interactive: Interactive;\n results: InteractiveResultSet;\n markedAnswers: { [id: string]: StudentAnswer };\n addMarkedAnswers: (answer: StudentAnswer[], status: InteractiveAnswerStatus) => void;\n submitMarkedAnswers: () => void;\n editSuggestedResponse?: () => void;\n imageCdnUrl: string;\n selectQuestionImageUrl: string;\n anonymiseUsers: boolean;\n sortBy?: SortStudentsBy;\n emptyStateImageUrl: string;\n markingRequiredImageUrl?: string;\n correctImageUrl?: string;\n incorrectImageUrl?: string;\n skippedImageUrl?: string;\n\n /**\n * As the table data is memoized, it must be prompted to recalculate.\n * Toggle `refreshTable` to do so.\n */\n refreshTable: boolean;\n selectedInteractionId?: string;\n showAnswersInTable?: boolean;\n theme: TableTheme;\n reportsStyling?: boolean;\n}\n\nexport function QuestionTable(props: QuestionTableProps): JSX.Element {\n const [ sortBy, setSortBy ] = React.useState<SortingRule<InteractionWithResultsSummary>[]>(\n getSortStudents(props.sortBy, 'correctlyAnswered')\n );\n const data = useGetTableData(props.interactive, props.results, props.refreshTable, ArrayHelper.first(sortBy));\n\n const selectedInteraction = props.selectedInteractionId &&\n getInteractionById(props.interactive, props.selectedInteractionId);\n\n function onSelectRow({ original: interaction }: Row<InteractionWithResultsSummary>): void {\n ScrollHelper.preventScrollTop();\n\n AppRouteHelper.updateParams(\n { interactionId: interaction.id },\n { merge: true }\n );\n }\n\n return (\n <div className='row'>\n <div className='col-6 flex-grow-1'>\n <Table\n key={props.selectedInteractionId}\n columns={getColumns(props.showAnswersInTable)}\n data={data}\n theme={props.theme}\n onSelectRow={onSelectRow}\n initialSelectedRowIds={selectedInteraction ? [selectedInteraction.id] : null}\n getRowId={(row: InteractionWithResultsSummary) => row.id}\n enableSort\n manualSort\n onSort={setSortBy}\n initialSortBy={sortBy}\n />\n </div>\n <div className='col-6 d-flex flex-column'>\n {!props.reportsStyling && props.selectedInteractionId && !!props.results.students?.length && (\n <QuestionResultsSummary\n interaction={selectedInteraction}\n results={props.results}\n />\n )}\n\n <div className='border border-light rounded flex-grow-1'>\n {!!selectedInteraction &&\n <InteractionResponseList\n interaction={selectedInteraction}\n results={props.results}\n markedAnswers={props.markedAnswers}\n addMarkedAnswers={props.addMarkedAnswers}\n submitMarkedAnswers={props.submitMarkedAnswers}\n imageCdnUrl={props.imageCdnUrl}\n anonymiseUsers={props.anonymiseUsers}\n emptyStateImageUrl={props.emptyStateImageUrl}\n markingRequiredImageUrl={props.markingRequiredImageUrl}\n correctImageUrl={props.correctImageUrl}\n incorrectImageUrl={props.incorrectImageUrl}\n skippedImageUrl={props.skippedImageUrl}\n reportsStyling={props.reportsStyling}\n />\n }\n {!selectedInteraction && <SelectedInteractionEmptyState emptyStateUrl={props.selectQuestionImageUrl} />}\n </div>\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialInsights\":\"bk68v\"};","import React from 'react';\n\nimport styles from './partial-interactive-insights-questions.scss';\n\nexport function PartialInteractiveInsightsQuestions() {\n return (\n <div>\n <div className='row g-3 mb-5'>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n <div className='col-6'>\n <div className={`${styles.partialInsights} rounded partial-loading-background`}></div>\n </div>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { QuestionTable } from 'libs/shared/apps/analytics/components/questions-list/question-table/QuestionTable';\nimport { useFetchInteractiveResults } from 'libs/shared/apps/analytics/hooks/UseFetchInteractiveResults';\nimport { useMarkAnswers } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { AnalyticsFilterHelper } from 'libs/shared/apps/analytics/utils/AnalyticsFilterUtils';\nimport { getAudienceParams } from 'libs/shared/apps/analytics/utils/AudienceUtils';\nimport { getInsightsDateRangePresets, getStartEndParams } from 'libs/shared/apps/analytics/utils/DateRangeUtils';\nimport { SortStudentsBy } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { ConfirmationPopup } from 'libs/shared/components/confirmation-popup/ConfirmationPopup';\nimport { TableTheme } from 'libs/shared/components/table/Table';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport { getInsightsInteractiveTabs } from 'apps/insights/utils/InsightsAppLinkUtils';\nimport { InsightsHeaderView } from 'apps/insights/views/header/InsightsHeaderView';\nimport { PartialInteractiveInsightsQuestions } from 'apps/insights/views/interactive/questions/partial-loading/PartialInteractiveInsightsQuestions';\n\nconst namespace = 'shared.interactiveInsightsQuestions';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\nconst theme: TableTheme = {\n table: 'bg-white rounded border border-light h-100 pb-2',\n header: 'border-bottom px-3 py-2 mb-2',\n headerCell: 'd-flex align-items-center',\n cell: '',\n row: `px-3 py-2 bg-light-blue-hover`,\n selectedRow: 'bg-gray-100',\n sortIndicator: 'ms-2'\n};\n\ninterface InteractiveInsightsQuestionsViewProps {\n interactiveId: string;\n interactionId: string;\n sortBy: SortStudentsBy;\n}\n\nexport function InteractiveInsightsQuestionsView(props: InteractiveInsightsQuestionsViewProps) {\n const [anonymiseUsers] = useViewModel<boolean>(SharedViewModelKeys.ANONYMISE_USERS);\n\n const [ showMarkConfirmationPopup, setShowMarkConfirmationPopup ] = React.useState(false);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const interactiveMetadata = Flight.useBasicFetch<InteractiveMetadata>(\n InteractiveRequests.interactiveMetadata(props.interactiveId)\n );\n\n const interactive = Flight.useBasicFetch<Interactive>(interactiveMetadata.data?.interactiveId &&\n InteractiveRequests.interactive(interactiveMetadata.data.interactiveId));\n\n const audienceAppLinkParams = AnalyticsFilterHelper.getAudienceAppLinkParams();\n const dateRangeAppLinkParams = AnalyticsFilterHelper.getDateRangeAppLinkParams();\n\n const results = useFetchInteractiveResults(props.interactiveId, {\n ...getStartEndParams(getInsightsDateRangePresets(), dateRangeAppLinkParams),\n ...getAudienceParams(audienceAppLinkParams)\n }, true);\n\n const { markedAnswers, addMarkedAnswers, submitMarkedAnswers } = useMarkAnswers(\n interactive.data?.id,\n interactiveMetadata.data?.id,\n () => setShowMarkConfirmationPopup(false)\n );\n\n useSetPageMetadata({ title: interactiveMetadata.data ? getPhrase('pageTitle', { video: interactiveMetadata.data?.name }) : null });\n\n const dataLoaded = interactive.data && interactiveMetadata.data && results.data;\n\n const params = {\n ...audienceAppLinkParams,\n ...dateRangeAppLinkParams\n };\n\n return (\n <div className='px-3'>\n <InsightsHeaderView\n audienceAppLinkParams={audienceAppLinkParams}\n dateRangeAppLinkParams={dateRangeAppLinkParams}\n tabs={getInsightsInteractiveTabs(props.interactiveId, 'questions', params)}\n video={interactiveMetadata.data}\n />\n\n {!dataLoaded && <PartialInteractiveInsightsQuestions />}\n\n {dataLoaded &&\n <QuestionTable\n interactive={interactive.data}\n results={results.data}\n markedAnswers={markedAnswers}\n addMarkedAnswers={addMarkedAnswers}\n submitMarkedAnswers={() => setShowMarkConfirmationPopup(true)}\n imageCdnUrl={config.data.imageCdnUrl}\n selectedInteractionId={props.interactionId}\n refreshTable={results.isFetching || interactive.isFetching}\n emptyStateImageUrl={ImageUrls.Insights.NO_RESPONSES}\n selectQuestionImageUrl={ImageUrls.Insights.NO_DATA}\n anonymiseUsers={anonymiseUsers}\n sortBy={props.sortBy}\n showAnswersInTable\n theme={theme}\n correctImageUrl={ImageUrls.Insights.JIGSAW}\n incorrectImageUrl={ImageUrls.Insights.RED_JIGSAW}\n skippedImageUrl={ImageUrls.Insights.SKIPPED}\n markingRequiredImageUrl={ImageUrls.Insights.CLIPBOARD}\n />\n }\n\n {showMarkConfirmationPopup &&\n <ConfirmationPopup\n title={getPhrase('markPopupTitle', { smartCount: Object.keys(markedAnswers).length ?? 0 })}\n closePopup={() => setShowMarkConfirmationPopup(false)}\n confirmButtonText={getPhrase('submit')}\n confirmButtonVariant='dark'\n onClickConfirm={submitMarkedAnswers}\n >\n <p>{getPhrase('markPopupBody')}</p>\n </ConfirmationPopup>\n }\n </div>\n );\n}"],"names":["ScrollHelper","preventScrollTop","Radio","trigger","getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","getSortStudents","sortBy","id","desc","shouldFilterStudent","filter","summary","awaitingMarking","percentCorrect","unanswered","ConfirmationPopup","showButtonSpinner","setShowButtonSpinner","closePopup","children","onClick","variant","cancelButtonVariant","text","cancelButtonText","onClickConfirm","confirmButtonText","confirmButtonVariant","showSpinner","disabled","disabledConfirmButton","defaultProps","namespace","InteractionResponseListFiltersEmptyStates","EmptyState","src","correctImageUrl","incorrectImageUrl","markingRequiredImageUrl","skippedImageUrl","getFilterEmptyStateImageUrl","Text","phrase","getFilterEmptyStatePhrase","InteractionResponseListFilters","getFilterClassName","filterButton","isFilterSelected","toggleFilter","LanguageService","InteractionResponseListHeader","suggestedResponse","interaction","data","InteractionLabel","iconClassName","SubmitMarkedAnswers","submit","InteractionResponseList","setFilter","responsesToMark","results","students","s","InteractiveCorrectnessHelper","InteractionCorrectness","reduce","acc","user","publicUser","profileId","numMarkedAnswers","Object","keys","markedAnswers","length","emptyStateImageUrl","size","filteredStudentResults","result","correctness","filterMap","correct","incorrect","marking_required","skipped","reportsStyling","submitMarkedAnswers","selectedFilter","map","idx","anonymisedUserName","anonymiseUsers","markingRequired","key","InteractionResponse","studentResults","markedStatus","markInteraction","addMarkedAnswers","imageCdnUrl","showStudentDetails","showFeedback","responseComponentClass","InteractionResponseItem","QuestionTableMissingWord","str","sentence","split","part","index","match","replacement","actionableItems","find","answer","order","name","QuestionTableMultipleChoice","ArrayHelper","imageUrl","MultipleChoiceInteractionAnswers","showCorrectnessIcons","isDisplayOnly","option","isCorrect","indexToLetter","QuestionTableShortAnswer","QuestionTableTrueOrFalse","QuestionTableAnswers","QuestionTableAnswerComponent","typeId","getQuestionTableAnswerComponent","sortScore","rowA","rowB","columnId","cellA","cells","cell","column","value","cellB","CellWrapper","HeaderCell","isSorted","phraseKey","String","fromCharCode","charCodeAt","multipleChoiceSummary","questionsSummary","item","i","label","count","forEach","student","latestAttempts","attempts","response","answers","questionSummary","missingWordSummary","push","status","InteractiveAnswerStatus","markedSummary","pendingSummary","QuestionResultsSummary","summaryMethod","getQuestionSummary","maxResponseCount","getBarClassName","SvgContainer","svgName","S","style","width","height","SelectedInteractionEmptyState","emptyStateUrl","QuestionTable","showAnswersInTable","setSortBy","interactive","refreshData","flattenedInteractions","questionNumbers","interactions","questionNumber","resultsSummary","sorted","reverse","useGetTableData","refreshTable","selectedInteraction","selectedInteractionId","Table","columns","Header","accessor","Cell","row","original","disableSortBy","selectedRowIds","initialState","selectedRow","containerClassName","PercentageIndicator","percentage","layout","sortDescFirst","sortType","theme","onSelectRow","AppRouteHelper","interactionId","merge","initialSelectedRowIds","getRowId","enableSort","manualSort","onSort","initialSortBy","selectQuestionImageUrl","PartialInteractiveInsightsQuestions","table","header","headerCell","sortIndicator","InteractiveInsightsQuestionsView","SharedViewModelKeys","showMarkConfirmationPopup","setShowMarkConfirmationPopup","config","ConfigRequests","interactiveMetadata","InteractiveRequests","interactiveId","audienceAppLinkParams","dateRangeAppLinkParams","useSetPageMetadata","video","dataLoaded","params","InsightsHeaderView","tabs","isFetching","ImageUrls","smartCount"],"sourceRoot":""}
@@ -0,0 +1,3 @@
1
+ /*! For license information please see 5870-a80bca5d7b-lite.chunk.js.LICENSE.txt */
2
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5870],{2968:(e,t,n)=>{n.d(t,{H:()=>te});var r=n(32735),a=n(92802),i=n(23481),o=n(75896),l=n(70226),s=n(98461),c=n(66122),u=n(12778),m=i.T.encloseNamespace("userManager.userEmailContactSupport");function d(e){var t=e.error.validationCode===l.x.Rostered;return r.createElement(c.A,{name:e.name},r.createElement("span",null,m(t?"rostering":"alreadyExists")," "),e.isInBulkEditing?r.createElement("span",null,m("contactSupport")):r.createElement(s.d,{className:"info-link",href:u.o.getSupportRequestUrl(),newTab:!0},m("contactSupport")),r.createElement("span",null," ",m("forAssistance")))}var f=i.T.encloseNamespace("userManager.editingUserExists");function p(e){return r.createElement(c.A,{name:e.name},r.createElement("span",null,f("alreadyExists")," "))}var h=n(36848),v=n(82644),y=n(76881),g=i.T.encloseNamespace("userManager.userExistsInSchool");function b(e){var t=(0,v.b)(),n=e.appLinks.studentManager.params||{};return e.error.user.userType===y.Y.Learner?r.createElement(c.A,{name:e.name},r.createElement("span",null,g("emailExistsSameSchoolStudent")," "),e.isInBulkEditing?r.createElement("span",null,g("studentManager")):r.createElement(h.F,{appLink:Object.assign(Object.assign({},e.appLinks.studentManager),{params:Object.assign(Object.assign({},n),{query:t.values.email})}),className:"info-link",onClick:e.onClickCancel},g("studentManager"))):r.createElement(c.A,{name:e.name},r.createElement("span",null,g("emailExistsSameSchoolStaff")," "),e.isInBulkEditing?r.createElement("span",null,g("staffManager")):r.createElement(h.F,{appLink:Object.assign(Object.assign({},e.appLinks.staffManager),{params:Object.assign(Object.assign({},n),{query:t.values.email})}),className:"info-link",onClick:e.onClickCancel},g("staffManager")))}var E=i.T.encloseNamespace("userManager.userTypeMismatch");function w(e){return e.error.user.userType===y.Y.Learner?r.createElement(c.A,{name:e.name},r.createElement("span",null,E("alreadyExistsStudent")," "),e.isInBulkEditing?r.createElement("span",null,E("studentManager")):r.createElement(h.F,{appLink:e.appLinks.studentManager,className:"info-link",onClick:e.onClickCancel},E("studentManager"))):r.createElement(c.A,{name:e.name},r.createElement("span",null,E("alreadyExistsStaff")," "),e.isInBulkEditing?r.createElement("span",null,E("staffManager")):r.createElement(h.F,{appLink:e.appLinks.staffManager,className:"info-link",onClick:e.onClickCancel},E("staffManager")))}function x(e){if(!e.isNew)return r.createElement(p,Object.assign({},e));switch(e.error.validationCode){case l.x.UserAlreadyExistsInCustomer:return r.createElement(b,Object.assign({},e));case l.x.UserTypeMismatch:return r.createElement(w,Object.assign({},e));case l.x.UserInCustomerWithOnline:case l.x.CustomerFoundInOnline:case l.x.InvalidUserStatus:case l.x.Rostered:return r.createElement(d,Object.assign({},e))}return r.createElement(r.Fragment,null)}var S=n(69843),k=n(26055),N=n(43820),C=n(38365),O=n(13876),T=n(83523),L=n(32045),j=n(86613),I=n(64818);function A(e){return A="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},A(e)}function F(){F=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,a=Object.defineProperty||function(e,t,n){e[t]=n.value},i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",l=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var i=t&&t.prototype instanceof y?t:y,o=Object.create(i.prototype),l=new j(r||[]);return a(o,"_invoke",{value:C(e,n,l)}),o}function m(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var d="suspendedStart",f="suspendedYield",p="executing",h="completed",v={};function y(){}function g(){}function b(){}var E={};c(E,o,(function(){return this}));var w=Object.getPrototypeOf,x=w&&w(w(I([])));x&&x!==n&&r.call(x,o)&&(E=x);var S=b.prototype=y.prototype=Object.create(E);function k(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function N(e,t){function n(a,i,o,l){var s=m(e[a],e,i);if("throw"!==s.type){var c=s.arg,u=c.value;return u&&"object"==A(u)&&r.call(u,"__await")?t.resolve(u.__await).then((function(e){n("next",e,o,l)}),(function(e){n("throw",e,o,l)})):t.resolve(u).then((function(e){c.value=e,o(c)}),(function(e){return n("throw",e,o,l)}))}l(s.arg)}var i;a(this,"_invoke",{value:function(e,r){function a(){return new t((function(t,a){n(e,r,t,a)}))}return i=i?i.then(a,a):a()}})}function C(t,n,r){var a=d;return function(i,o){if(a===p)throw Error("Generator is already running");if(a===h){if("throw"===i)throw o;return{value:e,done:!0}}for(r.method=i,r.arg=o;;){var l=r.delegate;if(l){var s=O(l,r);if(s){if(s===v)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(a===d)throw a=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);a=p;var c=m(t,n,r);if("normal"===c.type){if(a=r.done?h:f,c.arg===v)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(a=h,r.method="throw",r.arg=c.arg)}}}function O(t,n){var r=n.method,a=t.iterator[r];if(a===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,O(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),v;var i=m(a,t.iterator,n.arg);if("throw"===i.type)return n.method="throw",n.arg=i.arg,n.delegate=null,v;var o=i.arg;return o?o.done?(n[t.resultName]=o.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,v):o:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,v)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function L(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function j(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function I(t){if(t||""===t){var n=t[o];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var a=-1,i=function n(){for(;++a<t.length;)if(r.call(t,a))return n.value=t[a],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(A(t)+" is not iterable")}return g.prototype=b,a(S,"constructor",{value:b,configurable:!0}),a(b,"constructor",{value:g,configurable:!0}),g.displayName=c(b,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===g||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,c(e,s,"GeneratorFunction")),e.prototype=Object.create(S),e},t.awrap=function(e){return{__await:e}},k(N.prototype),c(N.prototype,l,(function(){return this})),t.AsyncIterator=N,t.async=function(e,n,r,a,i){void 0===i&&(i=Promise);var o=new N(u(e,n,r,a),i);return t.isGeneratorFunction(n)?o:o.next().then((function(e){return e.done?e.value:o.next()}))},k(S),c(S,s,"Generator"),c(S,o,(function(){return this})),c(S,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=I,j.prototype={constructor:j,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(L),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function a(r,a){return l.type="throw",l.arg=t,n.next=r,a&&(n.method="next",n.arg=e),!!a}for(var i=this.tryEntries.length-1;i>=0;--i){var o=this.tryEntries[i],l=o.completion;if("root"===o.tryLoc)return a("end");if(o.tryLoc<=this.prev){var s=r.call(o,"catchLoc"),c=r.call(o,"finallyLoc");if(s&&c){if(this.prev<o.catchLoc)return a(o.catchLoc,!0);if(this.prev<o.finallyLoc)return a(o.finallyLoc)}else if(s){if(this.prev<o.catchLoc)return a(o.catchLoc,!0)}else{if(!c)throw Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return a(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var a=this.tryEntries[n];if(a.tryLoc<=this.prev&&r.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var i=a;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var o=i?i.completion:{};return o.type=e,o.arg=t,i?(this.method="next",this.next=i.finallyLoc,v):this.complete(o)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),v},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),L(n),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;L(n)}return a}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:I(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),v}},t}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,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return R(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)?R(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 R(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 V=function(e,t,n,r){return new(n||(n=Promise))((function(a,i){function o(e){try{s(r.next(e))}catch(e){i(e)}}function l(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,l)}s((r=r.apply(e,t||[])).next())}))},_="userManager.userDetailsForm",U=i.T.encloseNamespace(_),G=[l.x.UserAlreadyExistsInCustomer,l.x.CustomerFoundInOnline,l.x.UserInCustomerWithOnline,l.x.UserTypeMismatch,l.x.InvalidUserStatus,l.x.UserCanBeAddedInCustomer,l.x.Rostered],M="firstName";function z(e){var t,n,s,c,u,m,d=e.onClickCancel,f=e.isNew,p=e.userType,h=e.yearGroups,g=e.submitText,b=e.currentUser,E=P(r.useState(null),2),w=E[0],A=E[1],R=P(r.useState(!1),2),z=R[0],q=R[1],W=P(r.useState(!1),2),Y=W[0],B=W[1],Z=r.useRef({}),D=r.useContext(k.A),$=(0,v.b)();r.useEffect((function(){$.values.password&&$.values.email&&$.setFieldValue("password","")}),[$.values.email,$.values.password]),r.useEffect((function(){if($.touched.email&&!z){var e=document.getElementById(M);e&&e.focus()}}),[z]);var H=(null===(t=e.user)||void 0===t?void 0:t.status)===L.w.Disabled,J=!e.isNew&&b.id.toString()===(null===(n=$.values.userId)||void 0===n?void 0:n.toString());return r.createElement(a.l0,null,r.createElement(C.W,{label:U("emailAddress"),type:"text",name:"email",id:"email",placeholder:U("emailAddressPlaceholder"),value:$.values.email,showRequiredStar:e.emailRequired,disabled:!e.canEditEmail||H,formSize:e.formSize,infoText:function(){if(D===N.a.Curator&&!e.isNew&&$.initialValues.email)return U(e.canEditEmail?"emailNotVerified":"cannotEditVerifiedEmail")}(),onBlur:function(t){return V(this,void 0,void 0,F().mark((function n(){var r,a;return F().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if((r=t.currentTarget.value)!==$.initialValues.email){n.next=3;break}return n.abrupt("return");case 3:if($.setFieldTouched("email",!0),D===N.a.Primary&&e.validateEmail){n.next=6;break}return n.abrupt("return");case 6:return n.next=8,$.validateForm();case 8:if(!n.sent.email&&r){n.next=12;break}return w&&A(null),n.abrupt("return");case 12:if(q(!0),n.prev=13,a=Z.current[r]){n.next=21;break}return n.t0=o.m,n.next=19,e.validateEmail(r);case 19:n.t1=n.sent,a=n.t0.first.call(n.t0,n.t1);case 21:if(Z.current[r]=a,!e.isNew||a.validationCode!==l.x.UserCanBeAddedInCustomer){n.next=25;break}return e.onDetectValidUser(a.user),n.abrupt("return");case 25:if(G.includes(a.validationCode)){n.next=29;break}return w&&A(null),q(!1),n.abrupt("return");case 29:A(a),q(!1),n.next=36;break;case 33:n.prev=33,n.t2=n.catch(13),q(!1);case 36:case"end":return n.stop()}}),n,null,[[13,33]])})))},onChange:function(e){var t=e.currentTarget.value;$.setFieldValue("email",t),w&&A(null)},showLoadingSpinner:z,className:w?"is-invalid":"",autoFocus:!0}),!!w&&r.createElement("div",{className:"mt-n2 mb-2"},r.createElement(x,{name:"email",isNew:e.isNew,error:w,appLinks:e.appLinks,emailRequired:e.emailRequired,onClickCancel:e.onClickCancel,isInBulkEditing:e.isInBulkEditing})),r.createElement(C.W,{label:U("firstName"),type:"text",name:"firstName",id:M,placeholder:U("firstNamePlaceholder"),value:$.values.firstName,showRequiredStar:!0,formSize:e.formSize,disabled:H||z||I.l.hasLegacySso(e.user)&&!Y}),r.createElement(C.W,{label:U("lastName"),type:"text",name:"surname",id:"surname",placeholder:U("lastNamePlaceholder"),value:$.values.surname,showRequiredStar:!0,formSize:e.formSize,disabled:H||z||I.l.hasLegacySso(e.user)&&!Y}),e.showDisplayNameField&&r.createElement(C.W,{label:U("displayName"),type:"text",name:"displayName",id:"displayName",placeholder:U("displayNamePlaceholder"),formSize:e.formSize,disabled:H||z,infoText:U("displayNameInfo")}),r.createElement(C.W,{label:U("username"),type:"text",name:"username",id:"username",placeholder:U("usernamePlaceholder"),value:$.values.username,infoTooltip:f?U("usernameInfo"):null,formSize:e.formSize,disabled:!f||H||z}),e.showPasswordField&&r.createElement(C.W,{label:U("password"),type:"password",name:"password",id:"password",placeholder:U("passwordPlaceholder"),value:$.values.password,disabled:!!$.values.email||z,infoTooltip:$.values.email?U("passwordDisabledInfo"):U("passwordGenerateInfo"),formSize:e.formSize}),p===y.Y.Learner&&r.createElement(C.W,{as:"select",label:U("yearGroup"),name:"masterYearGroup",value:null!==(c=null===(s=$.values.masterYearGroup)||void 0===s?void 0:s.id)&&void 0!==c?c:"",className:(null===(u=$.values.masterYearGroup)||void 0===u?void 0:u.id)?"":"text-secondary",showRequiredStar:!0,disabled:H||z||I.l.hasSso(e.user)&&!Y&&0!==(null===(m=$.initialValues.masterYearGroup)||void 0===m?void 0:m.value),onChange:function(e){var t=e.target.value,n=h.find((function(e){return e.id.toString()===(null==t?void 0:t.toString())}));n?$.setFieldValue("masterYearGroup",{id:n.id,name:n.name,description:n.description,value:n.value}):$.setFieldValue("masterYearGroup",null)}},r.createElement("option",{className:"text-secondary",value:""},i.T.getPhrase(_,"selectYearGroup")),h.map((function(e){return r.createElement("option",{key:e.id,value:e.id,className:"text-dark"},e.name)}))),r.createElement("div",{className:"d-flex justify-content-between align-items-center"},p!==y.Y.Staff||J?r.createElement("div",null," "):r.createElement(C.W,{id:"masterRole",name:"masterRole",disabled:H||z||I.l.hasNonLegacySso(e.user)&&!Y},(function(){return r.createElement("div",{className:"d-flex align-items-center"},r.createElement(T.Z,{onClick:function(){return $.setFieldValue("masterRole",$.values.masterRole===j.i.User?j.i.Admin:j.i.User)},on:$.values.masterRole===j.i.Admin,disabled:H||I.l.hasNonLegacySso(e.user)&&!Y,showStateWhenDisabled:!0}),r.createElement("span",{className:"fw-semibold ms-2"},U("admin")))})),function(e){return!(e.isNew||!e.showActions||!e.appLinks||!e.user||!e.onClickResendActivationEmail)}(e)&&r.createElement(S.c,{user:e.user,userType:p,appLinks:e.appLinks,onClickSendResetEmail:e.onClickSendResetEmail,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,currentUser:b,products:e.products,isEditUserForm:!0})),r.createElement(O.u,null,!!e.onToggleNextCheckbox&&r.createElement(O.u.Checkbox,{id:"edit-next-user",onToggle:e.onToggleNextCheckbox,label:e.goToNextText||U("goToNext"),checked:e.shouldGoToNext}),!!e.canEditSsoFields&&r.createElement(O.u.Toggle,{on:Y,onClick:function(){return B((function(e){return!e}))},label:U("editSsoFields"),disabled:!I.l.hasSso(e.user),tooltip:I.l.hasSso(e.user)?"":"This user doesn't sign in with SSO"}),r.createElement(O.u.Cancel,{onClick:d}),r.createElement(O.u.Submit,{isNew:f,text:g,variant:"dark",disabled:!!w||void 0})))}var q=n(39739),W=n(5173),Y=/^(?![._])(?!.*[._]$)(?!.*?\.\.)(?!.*?__)[a-zA-Z0-9_.]+$/,B=/^[\w0-9'\-,.():;&][^_!¡?÷¿/\\+=@#$%ˆ*{}|~<>[\]]{0,}$/,Z=i.T.encloseNamespace("userManager.validation"),D=function(e){return(0,W.Z_)().max(255,(function(){return Z("nameExceeds")})).required((function(){return Z("nameRequired")})).default("").test({name:"name-invalid",message:Z("nameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.firstName!==t)||B.test(t)}})},$=function(e){return(0,W.Z_)().max(255,(function(){return Z("surnameExceeds")})).required((function(){return Z("surnameRequired")})).default("").test({name:"surname-invalid",message:Z("surnameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.surname!==t)||B.test(t)}})},H=function(e,t){var n=(0,W.Z_)().max(255,(function(){return Z("emailExceeds")})).email((function(){return Z("emailInvalidLong")})).default("");return e!==y.Y.Staff||(null==t?void 0:t.userId)&&!t.email||(n=n.required((function(){return Z("emailRequired")}))),n},J=function(e){var t=!(null==e?void 0:e.userId);return(0,W.Z_)().default("").test({name:"username-too-long",message:Z("usernameExceeds"),test:function(n){return!t&&e.username===n||n.length<=200}}).test({name:"username-too-short",message:Z("usernameTooShort"),test:function(n){return!t&&e.username===n||!(!t||n)||n.length>=5}}).test({name:"username-invalid",message:Z("usernameInvalidLong"),test:function(n){return!(!t||n)||!t&&e.username===n||Y.test(n)}})},K=function(e,t){var n=(0,W.Z_)().default("");return(null==t?void 0:t.userId)||(n=n.test({name:"password-short",message:Z("passwordTooShort",{minLength:e}),test:function(t){return!t||t.length>=e}})),n},Q=function(e){if(e!==y.Y.Staff)return(0,W.Ry)().required((function(){return Z("yearGroupRequired")})).nullable()},X=function(e,t,n){return(0,W.Ry)().shape({firstName:D(n),surname:$(n),email:H(e,n),username:J(n),password:K(t,n),displayName:(0,W.Z_)().max(70,(function(){return Z("displayNameExceeds")})).notRequired().nullable().default("").test({name:"display-name-short",message:Z("displayNameTooShort"),test:function(e){return!e||e.length>=2}}),masterYearGroup:Q(e)})},ee=n(95815);function te(e){var t={};Object.keys(e.initialErrors||{}).forEach((function(e){t[e]=!0}));var n,a,i=!e.initialValues.userId,o=!!i||!(null===(a=null===(n=e.user)||void 0===n?void 0:n.metadata)||void 0===a?void 0:a.isEmailVerified),l=q.P.getMinimumPasswordLength(e.passwordPolicy,e.userType,j.i.User);return r.createElement("div",null,!i&&I.l.hasSso(e.user)&&r.createElement(ee.D,{helpArticle:e.editSsoUserHelpArticle,userType:e.userType,isNew:i}),r.createElement(v.n,{initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:t,onSubmit:e.onSubmit,validationSchema:X(e.userType,l,e.initialValues)},r.createElement(z,{isNew:i,user:e.user,userType:e.userType,yearGroups:e.yearGroups,onClickCancel:e.onClickCancel,submitText:e.submitText,shouldGoToNext:e.shouldGoToNext,onToggleNextCheckbox:e.onToggleNextCheckbox,goToNextText:e.goToNextText,currentUser:e.currentUser,formSize:e.formSize,showPasswordField:e.showPasswordField,canEditEmail:o,showActions:e.showActions,appLinks:e.appLinks,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendResetEmail:e.onClickSendResetEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,emailRequired:e.emailRequired,showDisplayNameField:e.showDisplayNameField,canEditSsoFields:e.canEditSsoFields,validateEmail:e.validateEmail,onDetectValidUser:e.onDetectValidUser,isInBulkEditing:e.isInBulkEditing,products:e.products})))}},95815:(e,t,n)=>{n.d(t,{D:()=>u});var r=n(32735),a=n(83345),i=n(76881),o=n(26055),l=n(43820),s=n(86685),c="userManager.editSsoUserWarning";function u(e){var t=r.useContext(o.A);return r.createElement(s.W,null,r.createElement(a.x,{namespace:c,phrase:e.isNew?t===l.a.Curator?"ssoWarningCreateCurator":e.userType===i.Y.Learner?"ssoWarningCreateStudent":"ssoWarningCreateStaff":t===l.a.Curator?"ssoWarningEditCurator":"ssoWarningEditUser"}),!!e.helpArticle&&r.createElement("a",{className:"info-link d-block",href:e.helpArticle,target:"_blank"},r.createElement(a.x,{namespace:c,phrase:e.isNew?"kbArticleEdit":"kbArticleCreate"})))}},66122:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(32735);function a(e){return r.createElement("span",{id:"".concat(e.name,"Error"),className:"".concat(e.className," invalid-feedback d-block"),role:"status"},e.children)}},38365:(e,t,n)=>{n.d(t,{n:()=>w,W:()=>x});var r=n(32735),a=n(80247),i=n(80130),o=n(92802),l=n(91967),s=n(1048),c=n(36848),u=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};function m(e){var t=e.label,n=e.checkboxLabelClassName,a=e.checkboxLabelFontWeight,o=e.className,l=u(e,["label","checkboxLabelClassName","checkboxLabelFontWeight","className"]);return r.createElement(i.Z.Group,{className:"form-group"},r.createElement("div",{className:"form-check ".concat(o||"")},r.createElement(w,Object.assign({className:"form-check-input"},l)),r.createElement(i.Z.Label,{className:"form-check-label cursor-pointer ".concat("normal"===a?"fw-normal":""," \n ").concat(n),htmlFor:l.id},t),e.checkboxAppLink&&e.checkboxAppLinkText&&r.createElement(r.Fragment,null,r.createElement("span",null," "),r.createElement(c.F,{appLink:e.checkboxAppLink,className:"info-link"},e.checkboxAppLinkText))))}var d=n(83914),f=n(83345),p=n(73814),h=n(35223);function v(e){var t=(0,o.u6)().values[e.fieldName];return"string"!=typeof t?r.createElement(r.Fragment,null):r.createElement("div",{className:"float-end text-secondary fw-normal"},t.length,"/",e.limit," characters")}const y={revealPassword:"jCfI0",passwordInput:"RBJnf",passwordContainer:"d78lK",passwordContainerDisabled:"asbVo",infoTooltip:"wzyOG",spinner:"CycFx"};function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var b=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n},E="shared.formField";function w(e){var t,n,i=e.children,c=e.showLoadingSpinner,u=b(e,["children","showLoadingSpinner"]),m=(t=r.useState(e.type),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return g(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)?g(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),f=m[0],p=m[1],v=l.q.isFunction(i)?function(e){return i(e)}:r.Children.count(i)?i:null;if("password"!==u.type)return c?r.createElement("div",{className:"position-relative"},r.createElement(o.gN,Object.assign({},s.t.omit(u,["formSize"])),v),r.createElement("div",{className:y.spinner},r.createElement(a.Z,{animation:"border",size:"sm"}))):r.createElement(o.gN,Object.assign({},s.t.omit(u,["formSize"])),v);var E="position-relative ".concat(y.passwordContainer);return u.className&&(E+=" ".concat(u.className)),u.disabled&&(E+=" ".concat(y.passwordContainerDisabled)),r.createElement("div",{className:E},r.createElement(o.gN,Object.assign({},s.t.omit(u,["formSize","type","className"]),{type:f,className:"".concat(y.passwordInput," border-0 w-100 h-100 outline-none rounded")}),v),"password"===u.type&&r.createElement(d.x,{svgName:"password"===f?h.vn.VisibleOn:h.vn.VisibleOff,className:"svg-container cursor-pointer ".concat(y.revealPassword),onClick:function(){p("password"===f?"text":"password")}}))}function x(e){var t=e.label,n=e.className,a=e.showCharacterCounter,l=e.showRequiredStar,c=e.infoTooltip,u=e.infoTooltipPlacement,g=e.infoText,x=e.formSize,S=e.showOptionalLabel,k=b(e,["label","className","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel"]),N=(0,o.u6)(),C=N.errors,O=N.touched,T=function(){};if("checkbox"===k.type){var L=s.t.omit(e,["formSize","infoTooltipPlacement"]);return e.disabled&&(L.onChange=T),r.createElement(m,Object.assign({},L))}var j=Object.assign(Object.assign({},k),{className:p.w.getCustomFormControlClassName(C,O,k.name,x,n,"string"==typeof e.as?e.as:null)});return e.disabled&&(j.onChange=T),r.createElement(i.Z.Group,{className:"form-group"},!!t&&r.createElement(i.Z.Label,{htmlFor:k.id,className:"d-flex align-items-center"},t,l&&r.createElement("span",{className:"text-danger"},"*"),c&&r.createElement(d.x,{className:"svg-container text-secondary ".concat(y.infoTooltip),svgName:h.vn.Info,title:c,tooltipPlacement:u,tooltipSpanHack:!0}),S&&r.createElement("span",{className:"text-secondary"}," ",r.createElement(f.x,{namespace:E,phrase:"optional"})),!!a&&!!k.maxLength&&r.createElement("div",{className:"ms-auto"},r.createElement(v,{fieldName:k.name,limit:k.maxLength}))),r.createElement(w,Object.assign({},j,{"aria-errormessage":"".concat(k.name,"Error")})),!!g&&r.createElement(i.Z.Text,{className:"text-secondary"},g),r.createElement(o.Bc,{name:k.name},(function(e){return r.createElement(i.Z.Control.Feedback,{id:"".concat(k.name,"Error"),type:"invalid",role:"status"},e)})))}w.defaultProps={autoComplete:"off"},x.defaultProps={autoComplete:"off",infoTooltipPlacement:"top"}},82644:(e,t,n)=>{n.d(t,{b:()=>u,n:()=>c});var r=n(32735),a=n(92802),i=n(91967),o=n(1048);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var s=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n};function c(e){var t=e.castInitialValues,n=e.castValuesOnSubmit,c=e.initialValues,u=e.onSubmit,m=s(e,["castInitialValues","castValuesOnSubmit","initialValues","onSubmit"]),d=t&&e.validationSchema?e.validationSchema.cast(function(e){if(!e)return{};var t=o.t.deepClone(e);return function e(n){Object.keys(t).forEach((function(r){t.hasOwnProperty(r)&&(o.t.isObject(n[r])?e(n[r]):null===t[r]&&delete t[r])}))}(t),t}(c)):c,f={allowInitialSubmit:e.allowInitialSubmit};return r.createElement(a.J9,Object.assign({enableReinitialize:!0},m,{initialValues:d,onSubmit:function(t,r){var a=r.setSubmitting,i=r.resetForm,o=r.setFieldError,s=n&&e.validationSchema?e.validationSchema.cast(t):t;u(s,(function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(n.reset&&i(),n.errors)for(var r=0,s=Object.entries(n.errors);r<s.length;r++){var c=(e=s[r],t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw a}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(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.")}()),u=c[0],m=c[1];o(u,m)}a(!1)}))},initialStatus:f}),i.q.isFunction(e.children)?function(t){return e.children(t)}:r.Children.count(e.children)?e.children:null)}function u(){return(0,a.u6)()}c.defaultProps={castInitialValues:!0,castValuesOnSubmit:!0}},73814:(e,t,n)=>{n.d(t,{w:()=>a});var r=n(92802),a={getCustomFormControlClassName:function(e,t,n,a,i,o){var l="";return l=function(e,t){var n="";return n="select"===e?"form-select":"form-control","sm"===t&&(n+=" ".concat(n,"-sm")),"lg"===t&&(n+=" ".concat(n,"-lg")),n}(o,a),(0,r.u9)(t,n)&&(0,r.u9)(e,n)&&(l+=" is-invalid"),i&&(l+=" ".concat(i)),l}}},80658:(e,t,n)=>{n.d(t,{F:()=>a});var r=n(99940),a={getCustomerSecuritySettings:function(e,t,n){return{url:"{gateway}/v1/customers/".concat(e,"/settings/security"),key:"customers:security:settings",normalize:!1,success:t,error:n}},setCustomerSecuritySettings:function(e,t,n,a){return{url:"{gateway}/v1/customers/".concat(e,"/settings/security"),key:"update:security:settings",invalidationKeys:"customers:security:settings",type:r.k.PUT,normalize:!1,data:t,success:n,error:a}}}}}]);
3
+ //# sourceMappingURL=5870-a80bca5d7b-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/5870-a80bca5d7b-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/contact-support/UserEmailContactSupportMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/editing-user-exists/EditingUserExistsErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/exists-in-school/UserExistsInSchoolErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/email-error-messages/user-type-mismatch/UserTypeMismatchErrorMessage.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/UserEmailExistsError.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-details-form/UserDetailsForm.tsx","file:///app/packages/libs/shared/src/apps/user-manager/validation/UserValidationHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/validation/UserValidationSchema.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/edit-user-details/EditUserDetails.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/edit-user-details/components/EditSsoUserWarning.tsx","file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/settings/flight-requests/SecuritySettingsRequests.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nconst namespace = 'userManager.userEmailContactSupport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserEmailContactSupportMessage(props: UserEmailExistsErrorProps): JSX.Element {\n const isRostered = props.error.validationCode === UserValidationCode.Rostered;\n\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase(isRostered ? 'rostering' : 'alreadyExists')}&nbsp;\n </span>\n\n\n {!props.isInBulkEditing ? (\n <ExternalLink className='info-link' href={ArticleHelper.getSupportRequestUrl()} newTab>\n {getPhrase('contactSupport')}\n </ExternalLink>\n ) : (\n <span>{getPhrase('contactSupport')}</span>\n )}\n\n <span>\n &nbsp;{getPhrase('forAssistance')}\n </span>\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\n\nconst namespace = 'userManager.editingUserExists';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function EditingUserExistsErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExists')}&nbsp;\n </span>\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.userExistsInSchool';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserExistsInSchoolErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n const formikProps = useFormikContextWrapper<EditUserRequest>();\n\n const appLinkParams = (props.appLinks.studentManager.params || {}) as HashObject;\n\n /**\n * If the existing user is a student\n */\n if (props.error.user.userType === UserGroup.Learner) {\n return (\n <FormFeedback name={props.name}>\n <span>{getPhrase('emailExistsSameSchoolStudent')}&nbsp;</span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={{\n ...props.appLinks.studentManager,\n params: {\n ...appLinkParams,\n query: formikProps.values.email\n }\n }}\n className={'info-link'}\n onClick={props.onClickCancel}\n >\n {getPhrase('studentManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('studentManager')}</span>\n )}\n </FormFeedback>\n );\n }\n\n return (\n <FormFeedback name={props.name}>\n <span>{getPhrase('emailExistsSameSchoolStaff')}&nbsp;</span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={{\n ...props.appLinks.staffManager,\n params: {\n ...appLinkParams,\n query: formikProps.values.email\n }\n }}\n className={'info-link'}\n onClick={props.onClickCancel}\n >\n {getPhrase('staffManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('staffManager')}</span>\n )}\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserEmailExistsErrorProps } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.userTypeMismatch';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function UserTypeMismatchErrorMessage(props: UserEmailExistsErrorProps): JSX.Element {\n if (props.error.user.userType === UserGroup.Learner) {\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExistsStudent')}&nbsp;\n </span>\n {!props.isInBulkEditing ? (\n <AppLink\n appLink={props.appLinks.studentManager}\n className='info-link'\n onClick={props.onClickCancel}\n >\n {getPhrase('studentManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('studentManager')}</span>\n )}\n </FormFeedback>\n );\n }\n\n return (\n <FormFeedback name={props.name}>\n <span>\n {getPhrase('alreadyExistsStaff')}&nbsp;\n </span>\n {!props.isInBulkEditing ? (<AppLink\n appLink={props.appLinks.staffManager}\n className='info-link'\n onClick={props.onClickCancel}\n >\n {getPhrase('staffManager')}\n </AppLink>\n ) : (\n <span>{getPhrase('staffManager')}</span>\n )}\n </FormFeedback>\n );\n}","import React from 'react';\n\nimport { UserEmailContactSupportMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/contact-support/UserEmailContactSupportMessage';\nimport { EditingUserExistsErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/editing-user-exists/EditingUserExistsErrorMessage';\nimport { UserExistsInSchoolErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/exists-in-school/UserExistsInSchoolErrorMessage';\nimport { UserTypeMismatchErrorMessage } from 'libs/shared/apps/user-manager/components/user-details-form/email-error-messages/user-type-mismatch/UserTypeMismatchErrorMessage';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\n\nexport interface UserEmailExistsErrorProps {\n isNew: boolean;\n error: UserEmailCheckResponse;\n name: string;\n appLinks: UserManagerAppLinks;\n emailRequired: boolean;\n onClickCancel: () => void;\n isInBulkEditing?: boolean;\n}\n\nexport function UserEmailExistsError(props: UserEmailExistsErrorProps): JSX.Element {\n // When editing a user, if the email is already taken, we just display a generic error message\n if (!props.isNew) {\n return <EditingUserExistsErrorMessage {...props} />;\n }\n\n switch (props.error.validationCode) {\n // This means the user exists already in the current school\n case UserValidationCode.UserAlreadyExistsInCustomer:\n return <UserExistsInSchoolErrorMessage {...props} />;\n\n // This means the user exists in another school, but the user type is dfiferent\n case UserValidationCode.UserTypeMismatch:\n return <UserTypeMismatchErrorMessage {...props} />;\n \n // This means the user is in an Online school, and cannot be invited\n case UserValidationCode.UserInCustomerWithOnline:\n // This means the user is in multiple schools, and one of them has online, so they cannot be invited\n case UserValidationCode.CustomerFoundInOnline:\n // This means the user is disabled\n case UserValidationCode.InvalidUserStatus:\n // This means the user is crated by rostering\n case UserValidationCode.Rostered:\n return <UserEmailContactSupportMessage {...props}/>;\n }\n\n return <></>;\n}","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserEmailExistsError } from 'libs/shared/apps/user-manager/components/user-details-form/UserEmailExistsError';\nimport { UserItemActions } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemActions';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkUserEmailCheckResponse, EditUserRequest, UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst namespace = 'userManager.userDetailsForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst EMAIL_ERROR_CODES = [\n UserValidationCode.UserAlreadyExistsInCustomer,\n UserValidationCode.CustomerFoundInOnline,\n UserValidationCode.UserInCustomerWithOnline,\n UserValidationCode.UserTypeMismatch,\n UserValidationCode.InvalidUserStatus,\n UserValidationCode.UserCanBeAddedInCustomer,\n UserValidationCode.Rostered\n];\n\nconst FIRST_NAME_FIELD_ID = 'firstName';\n\nfunction shouldShowActions(props: UserDetailsFormProps): boolean {\n return !props.isNew\n && !!props.showActions\n && !!props.appLinks\n && !!props.user\n && !!props.onClickResendActivationEmail;\n}\n\ninterface UserDetailsFormProps {\n user?: User;\n onClickCancel: () => void;\n userType: UserGroup;\n yearGroups: YearGroup[];\n products?: ProductId[];\n isNew?: boolean;\n submitText?: string;\n currentUser: CurrentUser;\n formSize?: FormSize;\n canEditEmail?: boolean;\n emailRequired: boolean;\n showPasswordField?: boolean;\n showDisplayNameField?: boolean;\n canEditSsoFields?: boolean;\n isInBulkEditing?: boolean;\n\n shouldGoToNext?: boolean;\n onToggleNextCheckbox?: () => void;\n goToNextText?: string;\n\n // All of the below props are required for the actions to be shown\n showActions?: boolean;\n appLinks?: UserManagerAppLinks;\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n onDetectValidUser?: (detectedUser: UserEmailCheckResponse['user']) => void;\n}\n\nexport function UserDetailsForm(props: UserDetailsFormProps): React.ReactElement {\n const { onClickCancel, isNew, userType, yearGroups, submitText, currentUser } = props;\n\n const [ emailError, setEmailError ] = React.useState<UserEmailCheckResponse>(null);\n const [ isValidatingEmail, setIsValidatingEmail ] = React.useState(false);\n\n const [ editSsoFields, setEditSsoFields ] = React.useState(false);\n\n const emailValidationCache = React.useRef<Record<string, UserEmailCheckResponse>>({});\n\n const client = React.useContext(UserManagerClientContext);\n const formikProps = useFormikContextWrapper<EditUserRequest>();\n\n React.useEffect(() => {\n if (formikProps.values.password && formikProps.values.email)\n formikProps.setFieldValue('password', '');\n }, [ formikProps.values.email, formikProps.values.password ]);\n\n function getEmailFieldInfoText(): string {\n /**\n * Return message to explain that the email address is either unverified (and hence can be edited)\n * or that it is verified and can't be edited.\n * \n * Only show this when:\n * 1. The user is being edited in Curator\n * 2. The user has an existing email address\n */\n if (client === UserManagerClient.Curator && !props.isNew && !!formikProps.initialValues.email)\n return getPhrase(props.canEditEmail ? 'emailNotVerified' : 'cannotEditVerifiedEmail');\n }\n\n async function onBlurEmail(e: React.FormEvent<HTMLInputElement>): Promise<void> {\n const email = e.currentTarget.value;\n\n /**\n * Email has not been changed. No need to validate it.\n */\n if (email === formikProps.initialValues.email)\n return;\n\n formikProps.setFieldTouched('email', true);\n\n if (client !== UserManagerClient.Primary || !props.validateEmail)\n return;\n\n const formErrors = await formikProps.validateForm();\n\n if (formErrors.email || !email) {\n if (emailError)\n setEmailError(null);\n\n return;\n }\n\n setIsValidatingEmail(true);\n\n try {\n let emailValidation = emailValidationCache.current[email];\n\n if (!emailValidation)\n emailValidation = ArrayHelper.first(await props.validateEmail(email));\n\n emailValidationCache.current[email] = emailValidation;\n\n if (props.isNew && emailValidation.validationCode === UserValidationCode.UserCanBeAddedInCustomer) {\n props.onDetectValidUser(emailValidation.user);\n return;\n }\n \n if (!EMAIL_ERROR_CODES.includes(emailValidation.validationCode)) {\n if (emailError)\n setEmailError(null);\n\n setIsValidatingEmail(false);\n \n return;\n }\n \n setEmailError(emailValidation);\n setIsValidatingEmail(false);\n } catch {\n setIsValidatingEmail(false);\n }\n }\n\n /**\n * This addresses a UX issue where if you enter an email, then\n * that email is validated, all inputs are unfocused as all fields are\n * set to \"disabled\". Once validation completed, the first name\n * input should be focused\n */\n React.useEffect(() => {\n if (!formikProps.touched.email || isValidatingEmail)\n return;\n\n const firstNameEl = document.getElementById(FIRST_NAME_FIELD_ID);\n\n if (!firstNameEl)\n return;\n\n firstNameEl.focus();\n }, [isValidatingEmail]);\n\n function onChangeEmail(e: React.FormEvent<HTMLInputElement>): void {\n const email = e.currentTarget.value;\n\n formikProps.setFieldValue('email', email);\n\n if (emailError)\n setEmailError(null);\n }\n\n const isDisabled = props.user?.status === ObjectStatus.Disabled;\n const isEditingCurrentUser = !props.isNew && (currentUser.id.toString() === formikProps.values.userId?.toString());\n\n return (\n <Form>\n <FormField\n label={getPhrase('emailAddress')}\n type='text'\n name='email'\n id='email'\n placeholder={getPhrase('emailAddressPlaceholder')}\n value={formikProps.values.email}\n showRequiredStar={props.emailRequired}\n disabled={!props.canEditEmail || isDisabled}\n formSize={props.formSize}\n infoText={getEmailFieldInfoText()}\n onBlur={onBlurEmail}\n onChange={onChangeEmail}\n showLoadingSpinner={isValidatingEmail}\n className={emailError ? 'is-invalid' : ''}\n autoFocus\n />\n {!!emailError && (\n <div className='mt-n2 mb-2'>\n <UserEmailExistsError\n name='email'\n isNew={props.isNew}\n error={emailError}\n appLinks={props.appLinks}\n emailRequired={props.emailRequired}\n onClickCancel={props.onClickCancel}\n isInBulkEditing={props.isInBulkEditing}\n />\n </div>\n )}\n\n <FormField\n label={getPhrase('firstName')}\n type='text'\n name='firstName'\n id={FIRST_NAME_FIELD_ID}\n placeholder={getPhrase('firstNamePlaceholder')}\n value={formikProps.values.firstName}\n showRequiredStar\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail || (UserHelper.hasLegacySso(props.user) && !editSsoFields)}\n />\n\n <FormField\n label={getPhrase('lastName')}\n type='text'\n name='surname'\n id='surname'\n placeholder={getPhrase('lastNamePlaceholder')}\n value={formikProps.values.surname}\n showRequiredStar\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail || (UserHelper.hasLegacySso(props.user) && !editSsoFields)}\n />\n\n {props.showDisplayNameField && (\n <FormField\n label={getPhrase('displayName')}\n type='text'\n name='displayName'\n id='displayName'\n placeholder={getPhrase('displayNamePlaceholder')}\n formSize={props.formSize}\n disabled={isDisabled || isValidatingEmail}\n infoText={getPhrase('displayNameInfo')}\n />\n )}\n\n <FormField\n label={getPhrase('username')}\n type='text'\n name='username'\n id='username'\n placeholder={getPhrase('usernamePlaceholder')}\n value={formikProps.values.username}\n infoTooltip={isNew ? getPhrase('usernameInfo') : null}\n formSize={props.formSize}\n disabled={!isNew || isDisabled || isValidatingEmail}\n />\n\n {/* Only primary students can have a custom password. Other users must set their own during activation */}\n {props.showPasswordField && (\n <FormField\n label={getPhrase('password')}\n type='password'\n name='password'\n id='password'\n placeholder={getPhrase('passwordPlaceholder')}\n value={formikProps.values.password}\n disabled={!!formikProps.values.email || isValidatingEmail}\n infoTooltip={formikProps.values.email ? getPhrase('passwordDisabledInfo') : getPhrase('passwordGenerateInfo')}\n formSize={props.formSize}\n />\n )}\n\n {userType === UserGroup.Learner && (\n <FormField\n as='select'\n label={getPhrase('yearGroup')}\n name='masterYearGroup'\n value={formikProps.values.masterYearGroup?.id ?? ''}\n className={!formikProps.values.masterYearGroup?.id ? 'text-secondary' : ''}\n showRequiredStar\n disabled={\n isDisabled ||\n isValidatingEmail ||\n // For SSO users, we only allow setting the year group if they have the \"Unknown\" year group. I.e. value is 0\n (UserHelper.hasSso(props.user) && !editSsoFields && formikProps.initialValues.masterYearGroup?.value !== 0)\n }\n onChange={(e: any) => {\n const yearGroupId = e.target.value;\n const yearGroup = yearGroups.find(y => y.id.toString() === yearGroupId?.toString());\n\n if (!yearGroup) {\n formikProps.setFieldValue('masterYearGroup', null);\n return;\n }\n\n formikProps.setFieldValue('masterYearGroup', {\n id: yearGroup.id,\n name: yearGroup.name,\n description: yearGroup.description,\n value: yearGroup.value\n });\n }}\n >\n <option className='text-secondary' value=''>{LanguageService.getPhrase(namespace, 'selectYearGroup')}</option>\n {yearGroups.map(yearGroup =>\n <option key={yearGroup.id} value={yearGroup.id} className='text-dark'>{yearGroup.name}</option>)}\n </FormField>\n )}\n\n <div className='d-flex justify-content-between align-items-center'>\n {(userType === UserGroup.Staff && !isEditingCurrentUser) ? (\n <FormField\n id='masterRole'\n name='masterRole'\n disabled={isDisabled || isValidatingEmail || (UserHelper.hasNonLegacySso(props.user) && !editSsoFields)}\n >\n {() => (\n <div className='d-flex align-items-center'>\n <ToggleSwitch\n onClick={() => formikProps.setFieldValue(\n 'masterRole',\n formikProps.values.masterRole === UserRole.User ? UserRole.Admin : UserRole.User\n )}\n on={formikProps.values.masterRole === UserRole.Admin}\n disabled={isDisabled || (UserHelper.hasNonLegacySso(props.user) && !editSsoFields)}\n showStateWhenDisabled\n />\n <span className='fw-semibold ms-2'>{getPhrase('admin')}</span>\n </div>\n )}\n </FormField>\n ) : <div>&nbsp;</div>}\n\n {shouldShowActions(props) && (\n <UserItemActions\n user={props.user}\n userType={userType}\n appLinks={props.appLinks}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n currentUser={currentUser}\n products={props.products}\n isEditUserForm\n />\n )}\n </div>\n\n <PopupButtons>\n {!!props.onToggleNextCheckbox && (\n <PopupButtons.Checkbox\n id='edit-next-user'\n onToggle={props.onToggleNextCheckbox}\n label={props.goToNextText || getPhrase('goToNext')}\n checked={props.shouldGoToNext}\n />\n )}\n\n {!!props.canEditSsoFields && (\n <PopupButtons.Toggle\n on={editSsoFields}\n onClick={() => setEditSsoFields(v => !v)}\n label={getPhrase('editSsoFields')}\n disabled={!UserHelper.hasSso(props.user)}\n tooltip={!UserHelper.hasSso(props.user) ? 'This user doesn\\'t sign in with SSO' : ''}\n />\n )}\n\n <PopupButtons.Cancel onClick={onClickCancel} />\n <PopupButtons.Submit\n isNew={isNew}\n text={submitText}\n variant='dark'\n disabled={emailError ? true : undefined}\n />\n </PopupButtons>\n </Form>\n );\n}\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { EditUserRequest } from '../interfaces';\n\n/**\n * Regex's here are copied directly from User API. These are used to do the same validation on the backend.\n */\nconst USERNAME_REGEX = /^(?![._])(?!.*[._]$)(?!.*?\\.\\.)(?!.*?__)[a-zA-Z0-9_.]+$/;\nconst NAME_REGEX = /^[\\w0-9'\\-,.():;&][^_!¡?÷¿/\\\\+=@#$%ˆ*{}|~<>[\\]]{0,}$/;\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.validation');\n\nexport const UserValidationHelper = {\n getFirstNameSchema: (existingUser?: EditUserRequest) => {\n return string()\n .max(255, () => getPhrase('nameExceeds'))\n .required(() => getPhrase('nameRequired'))\n .default('')\n .test({\n name: 'name-invalid',\n message: getPhrase('nameInvalid'),\n test: (val: string) => {\n if (existingUser?.userId && existingUser.firstName === val)\n return true;\n\n return NAME_REGEX.test(val);\n }\n });\n },\n\n getSurnameSchema: (existingUser?: EditUserRequest) => {\n return string()\n .max(255, () => getPhrase('surnameExceeds'))\n .required(() => getPhrase('surnameRequired'))\n .default('')\n .test({\n name: 'surname-invalid',\n message: getPhrase('surnameInvalid'),\n test: (val: string) => {\n if (existingUser?.userId && existingUser.surname === val)\n return true;\n\n return NAME_REGEX.test(val);\n }\n });\n },\n\n getEmailSchema: (userType: UserGroup, existingUser?: EditUserRequest) => {\n let schema = string()\n .max(255, () => getPhrase('emailExceeds'))\n .email(() => getPhrase('emailInvalidLong'))\n .default('');\n\n // New staff and old staff who have an email are required to have an email set.\n // Learners and old staff who don't have an email are not required.\n if (userType === UserGroup.Staff && (!existingUser?.userId || existingUser.email))\n schema = schema.required(() => getPhrase('emailRequired'));\n\n return schema;\n },\n\n getUsernameSchema: (existingUser?: EditUserRequest) => {\n const isNewUser = !existingUser?.userId;\n\n return string()\n .default('')\n .test({\n name: 'username-too-long',\n message: getPhrase('usernameExceeds'),\n test: (val: string) => {\n if (!isNewUser && existingUser.username === val)\n return true;\n \n return val.length <= 200;\n }\n })\n .test({\n name: 'username-too-short',\n message: getPhrase('usernameTooShort'),\n test: (val: string) => {\n if (!isNewUser && existingUser.username === val)\n return true;\n \n if (isNewUser && !val)\n return true;\n \n return val.length >= 5;\n }\n })\n .test({\n name: 'username-invalid',\n message: getPhrase('usernameInvalidLong'),\n test: (val: string) => {\n if (isNewUser && !val)\n return true;\n\n if (!isNewUser && existingUser.username === val)\n return true;\n\n return USERNAME_REGEX.test(val);\n }\n });\n },\n\n getPasswordSchema: (minPasswordLength: number, existingUser?: EditUserRequest) => {\n let schema = string().default('');\n\n if (!existingUser?.userId) {\n schema = schema.test({\n name: 'password-short',\n message: getPhrase('passwordTooShort', { minLength: minPasswordLength }),\n test: (val: string) => {\n if (!val)\n return true;\n \n return val.length >= minPasswordLength;\n }\n });\n }\n\n return schema;\n },\n\n getDisplayNameSchema: () => {\n return string()\n .max(70, () => getPhrase('displayNameExceeds'))\n .notRequired()\n .nullable()\n .default('')\n .test({\n name: 'display-name-short',\n message: getPhrase('displayNameTooShort'),\n test: (val: string) => {\n if (!val)\n return true;\n\n return val.length >= 2;\n }\n });\n },\n\n getYearGroupSchema: (userType: UserGroup) => {\n if (userType === UserGroup.Staff)\n return;\n\n return object()\n .required(() => getPhrase('yearGroupRequired'))\n .nullable();\n }\n};","import { object } from 'yup';\n\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { UserValidationHelper } from './UserValidationHelper';\n\nexport const getUserValidationSchema = (\n userType: UserGroup,\n minPasswordLength: number,\n existingUser?: EditUserRequest\n) => {\n return object().shape({\n firstName: UserValidationHelper.getFirstNameSchema(existingUser),\n\n surname: UserValidationHelper.getSurnameSchema(existingUser),\n\n email: UserValidationHelper.getEmailSchema(userType, existingUser),\n\n username: UserValidationHelper.getUsernameSchema(existingUser),\n\n password: UserValidationHelper.getPasswordSchema(minPasswordLength, existingUser),\n\n displayName: UserValidationHelper.getDisplayNameSchema(),\n\n masterYearGroup: UserValidationHelper.getYearGroupSchema(userType)\n });\n};","import React from 'react';\nimport { FormikErrors, FormikTouched } from 'formik';\n\nimport { UserDetailsForm } from 'libs/shared/apps/user-manager/components/user-details-form/UserDetailsForm';\nimport { BulkUserEmailCheckResponse, EditUserRequest, UserEmailCheckResponse, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { getUserValidationSchema } from 'libs/shared/apps/user-manager/validation/UserValidationSchema';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { SecuritySettingsResponse } from '../../interfaces/SecuritySettingsResponse';\n\nimport { EditSsoUserWarning } from './components/EditSsoUserWarning';\n\nexport interface EditUserDetailsProps {\n user?: User;\n userType: UserGroup;\n yearGroups: YearGroup[];\n currentUser: CurrentUser;\n initialValues: EditUserRequest;\n initialErrors?: FormikErrors<EditUserRequest>;\n onSubmit: (data: EditUserRequest, callback?: () => void) => void;\n onClickCancel: () => void;\n passwordPolicy: SecuritySettingsResponse;\n products?: ProductId[];\n\n editSsoUserHelpArticle?: string;\n canEditSsoFields?: boolean;\n\n submitText?: string;\n formSize?: FormSize;\n showPasswordField?: boolean;\n showDisplayNameField?: boolean;\n emailRequired: boolean;\n\n shouldGoToNext?: boolean;\n onToggleNextCheckbox?: () => void;\n goToNextText?: string;\n isInBulkEditing?: boolean;\n\n // All of the below props are required for the actions to be shown\n showActions?: boolean;\n appLinks?: UserManagerAppLinks;\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n validateEmail?: (email: string) => Promise<BulkUserEmailCheckResponse>;\n onDetectValidUser?: (detectedUser: UserEmailCheckResponse['user']) => void;\n}\n\nexport function EditUserDetails(props: EditUserDetailsProps): React.ReactElement {\n const initialTouched: FormikTouched<EditUserRequest> = {};\n Object.keys(props.initialErrors || {}).forEach((err: keyof EditUserRequest) => {\n initialTouched[err] = true;\n });\n\n const isNew = !props.initialValues.userId;\n\n const canEditEmail = (() => {\n if (isNew)\n return true;\n\n /**\n * If a user's email address is not verified, allow it to be edited.\n */\n if (!props.user?.metadata?.isEmailVerified)\n return true;\n\n return false;\n })();\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n props.passwordPolicy,\n props.userType,\n UserRole.User\n );\n\n function showSsoWarning(): boolean {\n if (isNew)\n return false;\n\n return UserHelper.hasSso(props.user);\n }\n\n return (\n <div>\n {showSsoWarning() && (\n <EditSsoUserWarning helpArticle={props.editSsoUserHelpArticle} userType={props.userType} isNew={isNew} />\n )}\n\n <FormWrapper<EditUserRequest>\n initialValues={props.initialValues}\n initialErrors={props.initialErrors}\n initialTouched={initialTouched}\n onSubmit={props.onSubmit}\n validationSchema={getUserValidationSchema(props.userType, minPasswordLength, props.initialValues)}\n >\n <UserDetailsForm\n isNew={isNew}\n user={props.user}\n userType={props.userType}\n yearGroups={props.yearGroups}\n onClickCancel={props.onClickCancel}\n submitText={props.submitText}\n shouldGoToNext={props.shouldGoToNext}\n onToggleNextCheckbox={props.onToggleNextCheckbox}\n goToNextText={props.goToNextText}\n currentUser={props.currentUser}\n formSize={props.formSize}\n showPasswordField={props.showPasswordField}\n canEditEmail={canEditEmail}\n showActions={props.showActions}\n appLinks={props.appLinks}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n emailRequired={props.emailRequired}\n showDisplayNameField={props.showDisplayNameField}\n canEditSsoFields={props.canEditSsoFields}\n validateEmail={props.validateEmail}\n onDetectValidUser={props.onDetectValidUser}\n isInBulkEditing={props.isInBulkEditing}\n products={props.products}\n />\n </FormWrapper>\n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nimport { UserManagerClientContext } from '../../../context/UserManagerClientContext';\nimport { UserManagerClient } from '../../../enums/UserManagerClient';\nimport { WarningAlert } from '../../warning-alert/WarningAlert';\n\nconst namespace = 'userManager.editSsoUserWarning';\n\ninterface EditSsoUserWarningProps {\n isNew: boolean;\n userType: UserGroup;\n helpArticle?: string;\n}\n\nexport function EditSsoUserWarning(props: EditSsoUserWarningProps): JSX.Element {\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n\n function getPhraseKey(): string {\n if (props.isNew) {\n if (client === UserManagerClient.Curator)\n return 'ssoWarningCreateCurator';\n\n return props.userType === UserGroup.Learner ? 'ssoWarningCreateStudent' : 'ssoWarningCreateStaff';\n }\n\n return client === UserManagerClient.Curator ? 'ssoWarningEditCurator' : 'ssoWarningEditUser';\n }\n\n return (\n <WarningAlert>\n <Text\n namespace={namespace}\n phrase={getPhraseKey()}\n />\n {!!props.helpArticle && (\n <a\n className='info-link d-block'\n href={props.helpArticle}\n target='_blank'\n >\n <Text namespace={namespace} phrase={props.isNew ? 'kbArticleEdit' : 'kbArticleCreate'} />\n </a>\n )}\n </WarningAlert>\n );\n}","import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} aria-errormessage={`${fieldProps.name}Error`} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback id={`${fieldProps.name}Error`} type='invalid' role='status'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};"],"names":["getPhrase","LanguageService","UserEmailContactSupportMessage","props","isRostered","error","validationCode","UserValidationCode","FormFeedback","name","isInBulkEditing","ExternalLink","className","href","ArticleHelper","newTab","EditingUserExistsErrorMessage","UserExistsInSchoolErrorMessage","formikProps","appLinkParams","appLinks","studentManager","params","user","userType","UserGroup","AppLink","appLink","query","values","email","onClick","onClickCancel","staffManager","UserTypeMismatchErrorMessage","UserEmailExistsError","isNew","EMAIL_ERROR_CODES","FIRST_NAME_FIELD_ID","UserDetailsForm","yearGroups","submitText","currentUser","emailError","setEmailError","isValidatingEmail","setIsValidatingEmail","editSsoFields","setEditSsoFields","emailValidationCache","client","UserManagerClientContext","password","setFieldValue","touched","firstNameEl","document","getElementById","focus","isDisabled","status","ObjectStatus","isEditingCurrentUser","id","toString","userId","FormField","label","type","placeholder","value","showRequiredStar","emailRequired","disabled","canEditEmail","formSize","infoText","UserManagerClient","initialValues","getEmailFieldInfoText","onBlur","e","currentTarget","setFieldTouched","validateEmail","validateForm","emailValidation","current","ArrayHelper","first","onDetectValidUser","includes","onChange","showLoadingSpinner","autoFocus","firstName","UserHelper","surname","showDisplayNameField","username","infoTooltip","showPasswordField","as","masterYearGroup","yearGroupId","target","yearGroup","find","y","description","map","key","ToggleSwitch","masterRole","UserRole","User","on","showStateWhenDisabled","showActions","onClickResendActivationEmail","shouldShowActions","UserItemActions","onClickSendResetEmail","onClickSendVerificationEmail","products","isEditUserForm","PopupButtons","onToggleNextCheckbox","onToggle","goToNextText","checked","shouldGoToNext","canEditSsoFields","v","tooltip","text","variant","undefined","USERNAME_REGEX","NAME_REGEX","UserValidationHelper","existingUser","max","required","test","message","val","schema","isNewUser","length","minPasswordLength","minLength","nullable","getUserValidationSchema","shape","displayName","notRequired","EditUserDetails","initialTouched","Object","keys","initialErrors","forEach","err","metadata","isEmailVerified","UserManagerHelper","passwordPolicy","EditSsoUserWarning","helpArticle","editSsoUserHelpArticle","FormWrapper","onSubmit","validationSchema","namespace","W","phrase","role","children","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","Form","FieldWrapper","htmlFor","checkboxAppLink","checkboxAppLinkText","CharacterCounter","field","fieldName","limit","setType","resolvedChildren","FunctionHelper","f","ObjectHelper","Spinner","animation","size","containerClassName","SvgContainer","svgName","showCharacterCounter","infoTooltipPlacement","showOptionalLabel","errors","disabledOnChange","_props","fieldWrapperProps","FormHelper","title","tooltipPlacement","tooltipSpanHack","Text","maxLength","errorMessage","defaultProps","autoComplete","castInitialValues","castValuesOnSubmit","formattedInitialValues","cast","omitChildValues","child","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","useFormikContextWrapper","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","SecuritySettingsRequests","getCustomerSecuritySettings","customerId","success","url","normalize","setCustomerSecuritySettings","data","invalidationKeys"],"sourceRoot":""}