@clickview/lite 0.79.0-rc.0 → 0.79.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{4806-c40538eb7e-lite.chunk.js → 4806-13b069ccd9-lite.chunk.js} +2 -2
- package/dist/scripts/{4806-c40538eb7e-lite.chunk.js.map → 4806-13b069ccd9-lite.chunk.js.map} +1 -1
- package/dist/scripts/8933-b36bfd7ad1-lite.chunk.js +3 -0
- package/dist/scripts/8933-b36bfd7ad1-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-31696a071e.min.js → bundle-f96efba07b.min.js} +3 -3
- package/dist/scripts/{bundle-31696a071e.min.js.map → bundle-f96efba07b.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/8933-ce4b13f568-lite.chunk.js +0 -3
- package/dist/scripts/8933-ce4b13f568-lite.chunk.js.map +0 -1
- /package/dist/scripts/{8933-ce4b13f568-lite.chunk.js.LICENSE.txt → 8933-b36bfd7ad1-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-31696a071e.min.js.LICENSE.txt → bundle-f96efba07b.min.js.LICENSE.txt} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>o});var r=n(32735),a=n(23481),i=n(40782),l=n(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function s(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 o(e){var t=function(){return r.createElement("div",{className:s(e)},!!e.showLabel&&r.createElement("em",null,c("pending")),r.createElement(i.O,null))};return e.title?r.createElement(l.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},r.createElement(t,null)):r.createElement(t,null)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>Z,bB:()=>j,l8:()=>A,R7:()=>B,lE:()=>L,Fx:()=>U});var r=n(32735),a=n(23481),i=n(75896),l=n(34079),c=n(26136),s=n(39157),o=n(97364),u=n(77640),m=n(40782),d=n(80845),v=n(26378),f=n(71151),g=n(93264),p=n(84120);function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map(function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,i,l=(a=t,i=e.selectedInteraction,a.interactions.find(function(e){return e.id===i.id})||a.interactions[0]),c=l.id===e.selectedInteraction.id,s=c?p.w.getTypeInfo(l.typeId).bgClassName:"bg-gray-500",o=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(o,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(s)}),!!c&&r.createElement("div",null,g.T.ToDisplayDuration(t.visibleAt)))})):r.createElement(r.Fragment,null)}var h=n(86572);var E=a.T.encloseNamespace("shared.interactionResultsSummary");function y(e){var t,n=r.useMemo(function(){return(0,s.nq)(e.interaction,e.results)},[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(h.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,E("correctlyAnswered")),r.createElement(m.O,{percentage:n.percentCorrect,layout:m.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,E("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,E("unanswered")),r.createElement("span",null,n.unanswered)))))}var b=r.forwardRef(function(e,t){var n=e.interaction,a=e.interactive,i=e.interactiveMetadata,l=e.results,c=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,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(f.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},c),r.createElement(f.Z.Body,null,r.createElement(y,{interaction:n,interactive:a,interactiveMetadata:i,results:l}))))}),N=n(19912);function C(e){var t;return r.createElement(v.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(b,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(N.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var x=n(83914),M=n(28972),k=n(83140),R=n(35223);function I(e){var t="".concat(N.Z.resultsCellInner," h-100 position-relative");return e===M.w.Correct&&(t+=" ".concat(N.Z.correct)),e===M.w.Incorrect&&(t+=" ".concat(N.Z.incorrect," text-danger")),e===M.w.AwaitingMarking&&(t+=" ".concat(N.Z.awaitingMarking)),e===M.w.UnAnswered&&(t+=" ".concat(N.Z.unanswered," text-warning")),t}function O(e){var t=k.A.isInteractionCorrect(e.interaction,(0,d.j_)(e.studentResults)),n=function(e){return e===M.w.Correct?R.vn.Check:e===M.w.Incorrect?R.vn.Close:e===M.w.UnAnswered?R.vn.Minus:void 0}(t);return r.createElement("div",{className:I(t)},!!n&&r.createElement(x.x,{svgName:n}),t===M.w.AwaitingMarking&&r.createElement(l.O,null))}var S=a.T.encloseNamespace("shared.studentResultsTable"),Z=60;function T(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function _(e){return r.createElement(T,{className:e.column.isSorted&&"fw-bold"},S(e.phraseKey))}function B(e,t,n){var a,i=!!(null===(a=e.students)||void 0===a?void 0:a.length);return r.useMemo(function(){return[{id:"name",Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"name"})},accessor:function(e){return e},width:n?175:void 0,Cell:function(e){var a=e.value;return n?r.createElement(T,null,r.createElement(u.t,{user:a.user,imageCdnUrl:n,anonymiseUsers:t,detailsClassName:"ms-2 overflow-hidden",nameClassName:"text-truncate",showDisplayName:!0,avatarClassName:"p-1",showSubText:!1})):r.createElement(T,null,r.createElement("span",{className:"text-truncate"},(0,c.B)(a.user,t)))},disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!i,Cell:function(e){var t=e.value;return r.createElement(T,null,t)}},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(T,null,r.createElement(l.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(T,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(T,null,r.createElement(l.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(T,null,r.createElement(m.O,{percentage:t.percentCorrect,layout:m.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!i}]},[t,i])}function L(e,t,n,a,i){return r.useMemo(function(){return(0,d.Q)(e).map(function(i,l){return{Header:function(){return r.createElement(C,{interaction:i,results:n,interactive:e,interactiveMetadata:t,interactionNumber:l+1,onMouseEnter:function(){return a(l)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:i.id,disableSortBy:!0,width:Z,Cell:function(e){var t=e.row.original;return r.createElement(O,{interaction:i,studentResults:t})}}})},[i])}function U(e,t,n,a,l,u){return r.useMemo(function(){var n=[];if(null==t||t.students.forEach(function(t){var r=(0,s.Rt)(e,t);u&&(0,o.C)(u,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))}),"user"===(null==l?void 0:l.id)){var r=i.m.sortBy(n,function(e){return(0,c.B)(e.user,a)});return l.desc?r.reverse():r}if("summary.unanswered"===(null==l?void 0:l.id)){var m=i.m.sortBy(n,function(e){return e.summary.unanswered});return l.desc?m.reverse():m}if("score"===(null==l?void 0:l.id)||"percentage"===(null==l?void 0:l.id)){var d=i.m.sortBy(n,function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect});return l.desc?d.reverse():d}return n},[n,l,a,u])}function j(e,t){if(e){var n=e.querySelectorAll(".".concat(N.Z.resultsRow));null==n||n.forEach(function(e){e.childNodes.forEach(function(e,n){e.classList.remove(N.Z.highlightColumn),n===t&&e.classList.add(N.Z.highlightColumn)})})}}function A(e,t){if(e){var n=e.querySelectorAll(".".concat(N.Z.resultsRow));null==n||n.forEach(function(e,n){e.classList.remove(N.Z.highlightResultsRow),n===t&&e.classList.add(N.Z.highlightResultsRow)})}}},97364:(e,t,n)=>{n.d(t,{C:()=>i,P:()=>a});var r=n(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>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},77640:(e,t,n)=>{n.d(t,{t:()=>f});var r=n(32735),a=n(23481),i=n(31453),l=n(26136),c=n(97408),s=n(83914),o=n(76881),u=n(86613),m=n(64818),d=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function f(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var i=(0,l.B)(n,r),c=i.split(" ").filter(function(e){return!!e});return{name:i,surname:c.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,l.B)(n,!0):a?m.l.getDisplayName(n):m.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,f=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(d.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(c.q,{imageUrl:f,imageCdnUrl:e.imageCdnUrl,initials:m.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:s.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,i.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=m.l.getUserType(e),n=m.l.getUserRole(e);if(t===o.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=m.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}f.defaults={showSubText:!0}},19912:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}}}]);
|
|
2
|
-
//# sourceMappingURL=4806-
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>o});var r=n(32735),a=n(23481),i=n(40782),l=n(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function s(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 o(e){var t=function(){return r.createElement("div",{className:s(e)},!!e.showLabel&&r.createElement("em",null,c("pending")),r.createElement(i.O,null))};return e.title?r.createElement(l.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},r.createElement(t,null)):r.createElement(t,null)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>Z,bB:()=>j,l8:()=>A,R7:()=>B,lE:()=>L,Fx:()=>U});var r=n(32735),a=n(23481),i=n(75896),l=n(34079),c=n(26136),s=n(39157),o=n(97364),u=n(77640),m=n(40782),d=n(80845),v=n(26378),f=n(71151),g=n(93264),p=n(84120);function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map(function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,i,l=(a=t,i=e.selectedInteraction,a.interactions.find(function(e){return e.id===i.id})||a.interactions[0]),c=l.id===e.selectedInteraction.id,s=c?p.w.getTypeInfo(l.typeId).bgClassName:"bg-gray-500",o=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(o,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(s)}),!!c&&r.createElement("div",null,g.T.ToDisplayDuration(t.visibleAt)))})):r.createElement(r.Fragment,null)}var h=n(86572);var E=a.T.encloseNamespace("shared.interactionResultsSummary");function y(e){var t,n=r.useMemo(function(){return(0,s.nq)(e.interaction,e.results)},[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(h.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,E("correctlyAnswered")),r.createElement(m.O,{percentage:n.percentCorrect,layout:m.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,E("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,E("unanswered")),r.createElement("span",null,n.unanswered)))))}var b=r.forwardRef(function(e,t){var n=e.interaction,a=e.interactive,i=e.interactiveMetadata,l=e.results,c=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,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(f.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},c),r.createElement(f.Z.Body,null,r.createElement(y,{interaction:n,interactive:a,interactiveMetadata:i,results:l}))))}),N=n(19912);function C(e){var t;return r.createElement(v.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(b,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(N.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var x=n(83914),M=n(28972),k=n(83140),R=n(35223);function I(e){var t="".concat(N.Z.resultsCellInner," h-100 position-relative");return e===M.w.Correct&&(t+=" ".concat(N.Z.correct)),e===M.w.Incorrect&&(t+=" ".concat(N.Z.incorrect," text-danger")),e===M.w.AwaitingMarking&&(t+=" ".concat(N.Z.awaitingMarking)),e===M.w.UnAnswered&&(t+=" ".concat(N.Z.unanswered," text-warning")),t}function O(e){var t=k.A.isInteractionCorrect(e.interaction,(0,d.j_)(e.studentResults)),n=function(e){return e===M.w.Correct?R.vn.Check:e===M.w.Incorrect?R.vn.Close:e===M.w.UnAnswered?R.vn.Minus:void 0}(t);return r.createElement("div",{className:I(t)},!!n&&r.createElement(x.x,{svgName:n}),t===M.w.AwaitingMarking&&r.createElement(l.O,null))}var S=a.T.encloseNamespace("shared.studentResultsTable"),Z=60;function T(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function _(e){return r.createElement(T,{className:e.column.isSorted&&"fw-bold"},S(e.phraseKey))}function B(e,t,n){var a,i=!!(null===(a=e.students)||void 0===a?void 0:a.length);return r.useMemo(function(){return[{id:"name",Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"name"})},accessor:function(e){return e},width:n?175:void 0,Cell:function(e){var a=e.value;return n?r.createElement(T,null,r.createElement(u.t,{user:a.user,imageCdnUrl:n,anonymiseUsers:t,detailsClassName:"ms-2 overflow-hidden",nameClassName:"text-truncate",showDisplayName:!0,avatarClassName:"p-1",showSubText:!1})):r.createElement(T,null,r.createElement("span",{className:"text-truncate"},(0,c.B)(a.user,t)))},disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!i,Cell:function(e){var t=e.value;return r.createElement(T,null,t)}},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(T,null,r.createElement(l.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(T,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!i},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(T,null,r.createElement(l.O,{title:S("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(T,null,r.createElement(m.O,{percentage:t.percentCorrect,layout:m.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!i}]},[t,i])}function L(e,t,n,a,i){return r.useMemo(function(){return(0,d.Q)(e).map(function(i,l){return{Header:function(){return r.createElement(C,{interaction:i,results:n,interactive:e,interactiveMetadata:t,interactionNumber:l+1,onMouseEnter:function(){return a(l)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:i.id,disableSortBy:!0,width:Z,Cell:function(e){var t=e.row.original;return r.createElement(O,{interaction:i,studentResults:t})}}})},[i])}function U(e,t,n,a,l,u){return r.useMemo(function(){var n=[];if(null==t||t.students.forEach(function(t){var r=(0,s.Rt)(e,t);u&&(0,o.C)(u,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))}),"name"===(null==l?void 0:l.id)){var r=i.m.sortBy(n,function(e){return(0,c.B)(e.user,a)});return l.desc?r.reverse():r}if("summary.unanswered"===(null==l?void 0:l.id)){var m=i.m.sortBy(n,function(e){return e.summary.unanswered});return l.desc?m.reverse():m}if("score"===(null==l?void 0:l.id)||"percentage"===(null==l?void 0:l.id)){var d=i.m.sortBy(n,function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect});return l.desc?d.reverse():d}return n},[n,l,a,u])}function j(e,t){if(e){var n=e.querySelectorAll(".".concat(N.Z.resultsRow));null==n||n.forEach(function(e){e.childNodes.forEach(function(e,n){e.classList.remove(N.Z.highlightColumn),n===t&&e.classList.add(N.Z.highlightColumn)})})}}function A(e,t){if(e){var n=e.querySelectorAll(".".concat(N.Z.resultsRow));null==n||n.forEach(function(e,n){e.classList.remove(N.Z.highlightResultsRow),n===t&&e.classList.add(N.Z.highlightResultsRow)})}}},97364:(e,t,n)=>{n.d(t,{C:()=>i,P:()=>a});var r=n(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>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},77640:(e,t,n)=>{n.d(t,{t:()=>f});var r=n(32735),a=n(23481),i=n(31453),l=n(26136),c=n(97408),s=n(83914),o=n(76881),u=n(86613),m=n(64818),d=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function f(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var i=(0,l.B)(n,r),c=i.split(" ").filter(function(e){return!!e});return{name:i,surname:c.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,l.B)(n,!0):a?m.l.getDisplayName(n):m.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,f=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(d.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(c.q,{imageUrl:f,imageCdnUrl:e.imageCdnUrl,initials:m.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:s.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,i.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=m.l.getUserType(e),n=m.l.getUserRole(e);if(t===o.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=m.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}f.defaults={showSubText:!0}},19912:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}}}]);
|
|
2
|
+
//# sourceMappingURL=4806-13b069ccd9-lite.chunk.js.map
|
package/dist/scripts/{4806-c40538eb7e-lite.chunk.js.map → 4806-13b069ccd9-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/4806-c40538eb7e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/interactions-bar.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/interaction-results-summary.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/InteractionHeaderCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/student-results-table.scss","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["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 React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\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 { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","// extracted by mini-css-extract-plugin\nexport default {\"bar\":\"FCXQd\"};","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport { InteractionResultsSummary } from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './student-results-table.scss';\n\nfunction getSvgName(correctness: InteractionCorrectness): string {\n if (correctness === InteractionCorrectness.Correct)\n return cvSvgLibrary.Check;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return cvSvgLibrary.Close;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return cvSvgLibrary.Minus;\n\n return;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct}`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svgName = getSvgName(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svgName && <SvgContainer svgName={svgName} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, shouldFilterStudent } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.scss';\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\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 useGetFixedColumns(\n results: InteractiveResultSet,\n anonymiseUsers: boolean,\n imageCdnUrl?: string\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n id: 'name',\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: (u: StudentResultsWithSummary) => u,\n width: imageCdnUrl ? 175 : undefined,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, StudentResultsWithSummary>) => {\n if (!imageCdnUrl) {\n return (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(value.user, anonymiseUsers)}</span>\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <UserRecipientItemMetadata\n user={value.user}\n imageCdnUrl={imageCdnUrl}\n anonymiseUsers={anonymiseUsers}\n detailsClassName='ms-2 overflow-hidden'\n nameClassName='text-truncate'\n showDisplayName\n avatarClassName='p-1'\n showSubText={false}\n />\n </CellWrapper>\n );\n },\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n anonymiseUsers: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>,\n filterBy?: FilterStudentsBy\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results?.students.forEach(s => {\n const summary = getStudentResultsSummary(interactive, s);\n\n if (filterBy && shouldFilterStudent(filterBy, summary)) return;\n\n students.push({ ...s, summary });\n });\n\n if (sortBy?.id === 'user') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers, filterBy ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n \n /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId || user.deleted) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && (!!props.user.sessionId || !!props.user.deleted)}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"hnMke\",\"row\":\"ILLa_\",\"fixedTable\":\"_fdpt\",\"interactionHeaderCellOuter\":\"kjXYB\",\"hasResults\":\"M4qgr\",\"interactionHeaderCellInner\":\"cnFvB\",\"resultsCellOuter\":\"bdzRb\",\"correct\":\"xANR6\",\"incorrect\":\"_44sb\",\"awaitingMarking\":\"eQ9sh\",\"unanswered\":\"xRUK8\",\"highlightColumn\":\"f9Zqr\",\"resultsCellInner\":\"LAFwi\",\"highlightResultsRow\":\"TwwLO\",\"resultsRow\":\"xZ5iP\"};","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","InteractionsBar","duration","interactive","timepoints","map","t","i","interactions","length","timepoint","selectedInteraction","interaction","find","id","isSelected","bgClassName","InteractionTypeHelper","typeId","left","visibleAt","key","style","DurationHelper","LanguageService","InteractionResultsSummary","interactiveMetadata","summary","results","InteractionLabel","iconClassName","_parentClip","endTime","startTime","_parentVideo","awaitingMarking","PercentageIndicator","percentage","percentCorrect","layout","unanswered","InteractionResultsSummaryPopover","ref","popoverProps","Popover","InteractionHeaderCell","OverlayTrigger","trigger","students","placement","overlay","rootClose","onMouseEnter","onMouseLeave","interactionNumber","correctness","InteractionCorrectness","StudentResultCell","InteractiveCorrectnessHelper","studentResults","svgName","getSvgName","SvgContainer","RESULTS_COL_WIDTH","CellWrapper","children","HeaderCell","column","isSorted","phraseKey","useGetFixedColumns","anonymiseUsers","imageCdnUrl","hasResults","Header","accessor","u","width","undefined","Cell","value","UserRecipientItemMetadata","user","detailsClassName","nameClassName","showDisplayName","avatarClassName","showSubText","disableSortBy","sortType","sortDescFirst","correct","answered","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","filterBy","forEach","s","push","sorted","ArrayHelper","student","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","getSortStudents","shouldFilterStudent","filter","sessionId","deleted","anonName","nameParts","split","n","name","surname","slice","join","avatarUrl","avatar","url","getUserProps","imageUrl","initials","showAnonymousUser","anonymousSvgSize","S","getSubText","userType","role","yearGroup","defaults"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/4806-13b069ccd9-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/interactions-bar.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/interaction-results-summary.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/InteractionHeaderCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/student-results-table.scss","file:///app/packages/libs/shared/src/apps/share/components/recipient-item/recipient-item.scss"],"sourcesContent":["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 React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\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 { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","// extracted by mini-css-extract-plugin\nexport default {\"bar\":\"FCXQd\"};","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport { InteractionResultsSummary } from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './student-results-table.scss';\n\nfunction getSvgName(correctness: InteractionCorrectness): string {\n if (correctness === InteractionCorrectness.Correct)\n return cvSvgLibrary.Check;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return cvSvgLibrary.Close;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return cvSvgLibrary.Minus;\n\n return;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct}`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svgName = getSvgName(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svgName && <SvgContainer svgName={svgName} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, shouldFilterStudent } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { UserRecipientItemMetadata } from 'libs/shared/apps/share/components/recipient-item/user-recipient-item-metadata/UserRecipientItemMetadata';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.scss';\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\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 useGetFixedColumns(\n results: InteractiveResultSet,\n anonymiseUsers: boolean,\n imageCdnUrl?: string\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n id: 'name',\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: (u: StudentResultsWithSummary) => u,\n width: imageCdnUrl ? 175 : undefined,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, StudentResultsWithSummary>) => {\n if (!imageCdnUrl) {\n return (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(value.user, anonymiseUsers)}</span>\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <UserRecipientItemMetadata\n user={value.user}\n imageCdnUrl={imageCdnUrl}\n anonymiseUsers={anonymiseUsers}\n detailsClassName='ms-2 overflow-hidden'\n nameClassName='text-truncate'\n showDisplayName\n avatarClassName='p-1'\n showSubText={false}\n />\n </CellWrapper>\n );\n },\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n anonymiseUsers: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>,\n filterBy?: FilterStudentsBy\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results?.students.forEach(s => {\n const summary = getStudentResultsSummary(interactive, s);\n\n if (filterBy && shouldFilterStudent(filterBy, summary)) return;\n\n students.push({ ...s, summary });\n });\n\n if (sortBy?.id === 'name') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers, filterBy ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\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 React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { BaseObject, User } from 'libs/shared/interfaces';\nimport { AnonUser } from 'libs/shared/interfaces/models/interactive-results/AnonUser';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from '../recipient-item.scss';\n\nconst namespace = 'shared.userRecipientItemMetadata';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSubText(user: User): string {\n const userType = UserHelper.getUserType(user);\n const role = UserHelper.getUserRole(user);\n\n if (userType === UserGroup.Staff) {\n if (role === UserRole.Admin)\n return getPhrase('admin');\n\n return getPhrase('staff');\n }\n\n const yearGroup = UserHelper.getYearGroup(user);\n \n /**\n * Tertiary puts all students into a single group called 'Learners'.\n * When a student is in the 'Learners' group, we don't want to display the group name,\n * but instead we want to just show \"Student\". - Sha\n */\n if (yearGroup?.name && yearGroup.name !== 'Learners')\n return yearGroup.name;\n\n return getPhrase('student');\n}\n\nfunction getUserProps({\n user, anonymiseUsers, showDisplayName\n}: {\n user: AnonUser,\n showDisplayName: boolean;\n anonymiseUsers?: boolean;\n}) {\n if (user.sessionId || user.deleted) {\n const anonName = anonymiseUserName(user, anonymiseUsers);\n const nameParts = anonName.split(' ').filter(n => !!n);\n\n return {\n name: anonName,\n surname: nameParts.slice(1).join(' '),\n avatarUrl: null\n };\n }\n\n return {\n name: anonymiseUsers\n ? anonymiseUserName(user, true)\n : showDisplayName\n ? UserHelper.getDisplayName(user)\n : UserHelper.getFullName(user),\n surname: user.surname,\n avatarUrl: user.avatar?.url\n };\n}\n\nUserRecipientItemMetadata.defaults = {\n showSubText: true\n};\n\ninterface UserRecipientItemMetadataProps {\n user: AnonUser;\n imageCdnUrl: string;\n detailsClassName?: string;\n avatarClassName?: string;\n showDisplayName: boolean;\n nameClassName?: string;\n showSubText?: boolean;\n anonymiseUsers?: boolean;\n getSubText?: (user: BaseObject) => string;\n}\n\nexport function UserRecipientItemMetadata(props: UserRecipientItemMetadataProps): JSX.Element {\n const { name, surname, avatarUrl } = getUserProps(props);\n\n return (\n <>\n <div className={`${styles.avatarContainer} ${props.avatarClassName} d-inline-block flex-shrink-0`}>\n <Avatar\n imageUrl={avatarUrl}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(name, surname)}\n showAnonymousUser={!props.anonymiseUsers && (!!props.user.sessionId || !!props.user.deleted)}\n anonymiseUsers={props.anonymiseUsers}\n anonymousSvgSize={SvgContainerSize.Small}\n />\n </div>\n\n <div className={props.detailsClassName}>\n <h4 className={classNames('font-size-normal fw-normal m-0', props.nameClassName)}>\n {name}\n </h4>\n {props.showSubText && `id` in props.user && <p className='text-secondary m-0'>{props.getSubText ? props.getSubText(props.user) : getSubText(props.user)}</p>}\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"hnMke\",\"row\":\"ILLa_\",\"fixedTable\":\"_fdpt\",\"interactionHeaderCellOuter\":\"kjXYB\",\"hasResults\":\"M4qgr\",\"interactionHeaderCellInner\":\"cnFvB\",\"resultsCellOuter\":\"bdzRb\",\"correct\":\"xANR6\",\"incorrect\":\"_44sb\",\"awaitingMarking\":\"eQ9sh\",\"unanswered\":\"xRUK8\",\"highlightColumn\":\"f9Zqr\",\"resultsCellInner\":\"LAFwi\",\"highlightResultsRow\":\"TwwLO\",\"resultsRow\":\"xZ5iP\"};","// extracted by mini-css-extract-plugin\nexport default {\"removeRecipient\":\"mCbMC\",\"recipientItem\":\"kdcb0\",\"showSpinner\":\"xH6Mu\",\"avatarContainer\":\"Zcpg3\",\"recipientDetails\":\"v5EmV\",\"recipientDetailsWithRemoveButton\":\"_V928\"};"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","InteractionsBar","duration","interactive","timepoints","map","t","i","interactions","length","timepoint","selectedInteraction","interaction","find","id","isSelected","bgClassName","InteractionTypeHelper","typeId","left","visibleAt","key","style","DurationHelper","LanguageService","InteractionResultsSummary","interactiveMetadata","summary","results","InteractionLabel","iconClassName","_parentClip","endTime","startTime","_parentVideo","awaitingMarking","PercentageIndicator","percentage","percentCorrect","layout","unanswered","InteractionResultsSummaryPopover","ref","popoverProps","Popover","InteractionHeaderCell","OverlayTrigger","trigger","students","placement","overlay","rootClose","onMouseEnter","onMouseLeave","interactionNumber","correctness","InteractionCorrectness","StudentResultCell","InteractiveCorrectnessHelper","studentResults","svgName","getSvgName","SvgContainer","RESULTS_COL_WIDTH","CellWrapper","children","HeaderCell","column","isSorted","phraseKey","useGetFixedColumns","anonymiseUsers","imageCdnUrl","hasResults","Header","accessor","u","width","undefined","Cell","value","UserRecipientItemMetadata","user","detailsClassName","nameClassName","showDisplayName","avatarClassName","showSubText","disableSortBy","sortType","sortDescFirst","correct","answered","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","filterBy","forEach","s","push","sorted","ArrayHelper","student","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","getSortStudents","shouldFilterStudent","filter","sessionId","deleted","anonName","nameParts","split","n","name","surname","slice","join","avatarUrl","avatar","url","getUserProps","imageUrl","initials","showAnonymousUser","anonymousSvgSize","S","getSubText","userType","role","yearGroup","defaults"],"sourceRoot":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 8933-b36bfd7ad1-lite.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8933],{58859:(e,t,n)=>{n.d(t,{H:()=>le});var a=n(32735),r=n(92802),i=n(23481),l=n(75896),s=n(70226),o=n(98461),c=n(66122),u=n(12778),m=i.T.encloseNamespace("userManager.userEmailContactSupport");function d(e){var t=e.error.validationCode===s.x.Rostered;return a.createElement(c.A,{name:e.name},a.createElement("span",null,m(t?"rostering":"alreadyExists")," "),e.isInBulkEditing?a.createElement("span",null,m("contactSupport")):a.createElement(o.d,{className:"info-link",href:u.o.getSupportRequestUrl(),newTab:!0},m("contactSupport")),a.createElement("span",null," ",m("forAssistance")))}var f=i.T.encloseNamespace("userManager.editingUserExists");function p(e){return a.createElement(c.A,{name:e.name},a.createElement("span",null,f("alreadyExists")," "))}var v=n(15611),g=n(82644),h=n(76881),b=i.T.encloseNamespace("userManager.userExistsInSchool");function y(e){var t=(0,g.b)(),n=e.appLinks.studentManager.params||{};return e.error.user.userType===h.Y.Learner?a.createElement(c.A,{name:e.name},a.createElement("span",null,b("emailExistsSameSchoolStudent")," "),e.isInBulkEditing?a.createElement("span",null,b("studentManager")):a.createElement(v.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},b("studentManager"))):a.createElement(c.A,{name:e.name},a.createElement("span",null,b("emailExistsSameSchoolStaff")," "),e.isInBulkEditing?a.createElement("span",null,b("staffManager")):a.createElement(v.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},b("staffManager")))}var E=i.T.encloseNamespace("userManager.userTypeMismatch");function S(e){return e.error.user.userType===h.Y.Learner?a.createElement(c.A,{name:e.name},a.createElement("span",null,E("alreadyExistsStudent")," "),e.isInBulkEditing?a.createElement("span",null,E("studentManager")):a.createElement(v.F,{appLink:e.appLinks.studentManager,className:"info-link",onClick:e.onClickCancel},E("studentManager"))):a.createElement(c.A,{name:e.name},a.createElement("span",null,E("alreadyExistsStaff")," "),e.isInBulkEditing?a.createElement("span",null,E("staffManager")):a.createElement(v.F,{appLink:e.appLinks.staffManager,className:"info-link",onClick:e.onClickCancel},E("staffManager")))}function k(e){if(!e.isNew)return a.createElement(p,Object.assign({},e));switch(e.error.validationCode){case s.x.UserAlreadyExistsInCustomer:return a.createElement(y,Object.assign({},e));case s.x.UserTypeMismatch:return a.createElement(S,Object.assign({},e));case s.x.UserInCustomerWithOnline:case s.x.CustomerFoundInOnline:case s.x.InvalidUserStatus:case s.x.Rostered:return a.createElement(d,Object.assign({},e))}return a.createElement(a.Fragment,null)}var C=n(69843),w=n(80130),x=n(11607),N=n(29057),O=n(83523),T=n(36532),A=n(86613),j=n(64818);const I={checkWrapper:"OzB20"};var F=i.T.encloseNamespace("userManager.userRoleField");function R(e){var t=[{value:A.i.Admin,label:F("admin")},{value:A.i.SuperAdmin,label:"US"===e.countryCode?F("superAdminUs"):F("superAdmin")}],n=(0,r.u6)(),i=!e.hasOrg||!e.canEditSuperAdmin;if(e.userType===h.Y.Learner||e.isEditingCurrentUser)return null;var l=e.isDisabled||e.isValidatingEmail||j.l.hasNonLegacySso(e.user)&&!e.editSsoFields;return n.values.masterRole!==A.i.SuperAdmin||e.canEditSuperAdmin?i?a.createElement("div",{className:"d-flex justify-content-between align-items-center"},a.createElement(N.W,{id:"masterRole",name:"masterRole",disabled:l},function(){return a.createElement("div",{className:"d-flex align-items-center"},a.createElement(O.Z,{onClick:function(){var t,a=n.values.masterRole===A.i.User?A.i.Admin:A.i.User;n.setFieldValue("masterRole",a),null===(t=e.onRoleChange)||void 0===t||t.call(e,a)},on:n.values.masterRole===A.i.Admin,disabled:l,showStateWhenDisabled:!0}),!e.hideLabel&&a.createElement("span",{className:"fw-semibold ms-2"},F("admin")))})):a.createElement("div",null,a.createElement(N.W,{id:"masterRole",name:"masterRole",disabled:l,label:!e.hideLabel&&"Role"},function(){return t.map(function(t){return a.createElement("div",{className:"".concat(I.checkWrapper," mb-2"),key:t.value},a.createElement(w.Z.Check,{className:"form-check",id:t.value,type:"radio",label:t.label,checked:n.values.masterRole===t.value,onChange:function(a){var r;a.target.checked&&(n.setFieldValue("masterRole",t.value),null===(r=e.onRoleChange)||void 0===r||r.call(e,t.value))},disabled:l}))})}),(n.values.masterRole===A.i.Admin||n.values.masterRole===A.i.SuperAdmin)&&a.createElement(x.L,{className:"text-info mb-2 mt-n2",onClick:function(){var t;n.setFieldValue("masterRole",A.i.User),null===(t=e.onRoleChange)||void 0===t||t.call(e,A.i.User)}},F("clear"))):a.createElement("div",{className:"mb-3"},a.createElement("label",null,F("role")),a.createElement(T.u,{title:F("superAdminTooltip"),spanHack:!0},a.createElement("div",{className:"border rounded-pill border-dark"},F("superAdmin"))))}var L=n(26055),P=n(43820),V=n(13876),U=n(40424);function G(){var e,t,n="function"==typeof Symbol?Symbol:{},a=n.iterator||"@@iterator",r=n.toStringTag||"@@toStringTag";function i(n,a,r,i){var o=a&&a.prototype instanceof s?a:s,c=Object.create(o.prototype);return z(c,"_invoke",function(n,a,r){var i,s,o,c=0,u=r||[],m=!1,d={p:0,n:0,v:e,a:f,f:f.bind(e,4),d:function(t,n){return i=t,s=0,o=e,d.n=n,l}};function f(n,a){for(s=n,o=a,t=0;!m&&c&&!r&&t<u.length;t++){var r,i=u[t],f=d.p,p=i[2];n>3?(r=p===a)&&(o=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=e):i[0]<=f&&((r=n<2&&f<i[1])?(s=0,d.v=a,d.n=i[1]):f<p&&(r=n<3||i[0]>a||a>p)&&(i[4]=n,i[5]=a,d.n=p,s=0))}if(r||n>1)return l;throw m=!0,a}return function(r,u,p){if(c>1)throw TypeError("Generator is already running");for(m&&1===u&&f(u,p),s=u,o=p;(t=s<2?e:o)||!m;){i||(s?s<3?(s>1&&(d.n=-1),f(s,o)):d.n=o:d.v=o);try{if(c=2,i){if(s||(r="next"),t=i[r]){if(!(t=t.call(i,o)))throw TypeError("iterator result is not an object");if(!t.done)return t;o=t.value,s<2&&(s=0)}else 1===s&&(t=i.return)&&t.call(i),s<2&&(o=TypeError("The iterator does not provide a '"+r+"' method"),s=1);i=e}else if((t=(m=d.n<0)?o:n.call(a,d))!==l)break}catch(t){i=e,s=1,o=t}finally{c=1}}return{value:t,done:m}}}(n,r,i),!0),c}var l={};function s(){}function o(){}function c(){}t=Object.getPrototypeOf;var u=[][a]?t(t([][a]())):(z(t={},a,function(){return this}),t),m=c.prototype=s.prototype=Object.create(u);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,z(e,r,"GeneratorFunction")),e.prototype=Object.create(m),e}return o.prototype=c,z(m,"constructor",c),z(c,"constructor",o),o.displayName="GeneratorFunction",z(c,r,"GeneratorFunction"),z(m),z(m,r,"Generator"),z(m,a,function(){return this}),z(m,"toString",function(){return"[object Generator]"}),(G=function(){return{w:i,m:d}})()}function z(e,t,n,a){var r=Object.defineProperty;try{r({},"",{})}catch(e){r=0}z=function(e,t,n,a){if(t)r?r(e,t,{value:n,enumerable:!a,configurable:!a,writable:!a}):e[t]=n;else{var i=function(t,n){z(e,t,function(e){return this._invoke(t,n,e)})};i("next",0),i("throw",1),i("return",2)}},z(e,t,n,a)}function M(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 a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return q(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)?q(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 q(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var _=function(e,t,n,a){return new(n||(n=Promise))(function(r,i){function l(e){try{o(a.next(e))}catch(e){i(e)}}function s(e){try{o(a.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(l,s)}o((a=a.apply(e,t||[])).next())})},Y="userManager.userDetailsForm",W=i.T.encloseNamespace(Y),B=[s.x.UserAlreadyExistsInCustomer,s.x.CustomerFoundInOnline,s.x.UserInCustomerWithOnline,s.x.UserTypeMismatch,s.x.InvalidUserStatus,s.x.UserCanBeAddedInCustomer,s.x.Rostered],Z="firstName";function D(e){var t,n,o,c,u,m,d=e.onClickCancel,f=e.isNew,p=e.userType,v=e.yearGroups,b=e.submitText,y=e.currentUser,E=j.l.getValidYearGroups(v),S=M(a.useState(null),2),w=S[0],x=S[1],O=M(a.useState(!1),2),T=O[0],A=O[1],I=M(a.useState(e.canEditSsoFields||!1),2),F=I[0],z=I[1],q=a.useRef({}),D=a.useContext(L.A),$=(0,g.b)();a.useEffect(function(){$.values.password&&$.values.email&&$.setFieldValue("password","")},[$.values.email,$.values.password]),a.useEffect(function(){if($.touched.email&&!T){var e=document.getElementById(Z);e&&e.focus()}},[T]);var H=(null===(t=e.user)||void 0===t?void 0:t.status)===U.w.Disabled,J=!e.isNew&&y.id.toString()===(null===(n=$.values.userId)||void 0===n?void 0:n.toString());return a.createElement(r.l0,null,a.createElement(N.W,{label:W("emailAddress"),type:"text",name:"email",id:"email",placeholder:W("emailAddressPlaceholder"),value:$.values.email,showRequiredStar:e.emailRequired,disabled:!e.canEditEmail||H,formSize:e.formSize,infoText:function(){if(D===P.a.Curator&&!e.isNew&&$.initialValues.email)return W(e.canEditEmail?"emailNotVerified":"cannotEditVerifiedEmail")}(),onBlur:function(t){return _(this,void 0,void 0,G().m(function n(){var a,r,i,o;return G().w(function(n){for(;;)switch(n.n){case 0:if((a=t.currentTarget.value)!==$.initialValues.email){n.n=1;break}return n.a(2);case 1:if($.setFieldTouched("email",!0),D===P.a.Primary&&e.validateEmail){n.n=2;break}return n.a(2);case 2:return n.n=3,$.validateForm();case 3:if(!n.v.email&&a){n.n=4;break}return w&&x(null),n.a(2);case 4:if(A(!0),n.p=5,r=q.current[a]){n.n=7;break}return i=l.m,n.n=6,e.validateEmail(a);case 6:o=n.v,r=i.first.call(i,o);case 7:if(q.current[a]=r,!e.isNew||r.validationCode!==s.x.UserCanBeAddedInCustomer){n.n=8;break}return e.onDetectValidUser(r.user),n.a(2);case 8:if(B.includes(r.validationCode)){n.n=9;break}return w&&x(null),A(!1),n.a(2);case 9:x(r),A(!1),n.n=11;break;case 10:n.p=10,n.v,A(!1);case 11:return n.a(2)}},n,null,[[5,10]])}))},onChange:function(e){var t=e.currentTarget.value;$.setFieldValue("email",t),w&&x(null)},showLoadingSpinner:T,className:w?"is-invalid":"",autoFocus:!0}),!!w&&a.createElement("div",{className:"mt-n2 mb-2"},a.createElement(k,{name:"email",isNew:e.isNew,error:w,appLinks:e.appLinks,emailRequired:e.emailRequired,onClickCancel:e.onClickCancel,isInBulkEditing:e.isInBulkEditing})),a.createElement(N.W,{label:W("firstName"),type:"text",name:"firstName",id:Z,placeholder:W("firstNamePlaceholder"),value:$.values.firstName,showRequiredStar:!0,formSize:e.formSize,disabled:H||T||j.l.hasLegacySso(e.user)&&!F}),a.createElement(N.W,{label:W("lastName"),type:"text",name:"surname",id:"surname",placeholder:W("lastNamePlaceholder"),value:$.values.surname,showRequiredStar:!0,formSize:e.formSize,disabled:H||T||j.l.hasLegacySso(e.user)&&!F}),e.showDisplayNameField&&a.createElement(N.W,{label:W("displayName"),type:"text",name:"displayName",id:"displayName",placeholder:W("displayNamePlaceholder"),formSize:e.formSize,disabled:H||T,infoText:W("displayNameInfo")}),a.createElement(N.W,{label:W("username"),type:"text",name:"username",id:"username",placeholder:W("usernamePlaceholder"),value:$.values.username,infoTooltip:f?W("usernameInfo"):null,formSize:e.formSize,disabled:!f||H||T}),e.showPasswordField&&a.createElement(N.W,{label:W("password"),type:"password",name:"password",id:"password",placeholder:W("passwordPlaceholder"),value:$.values.password,disabled:!!$.values.email||T,infoTooltip:$.values.email?W("passwordDisabledInfo"):W("passwordGenerateInfo"),formSize:e.formSize}),e.userType===h.Y.Learner&&!e.hideYearLevel&&a.createElement(N.W,{as:"select",label:W("yearGroup"),name:"masterYearGroup",value:null!==(c=null===(o=$.values.masterYearGroup)||void 0===o?void 0:o.id)&&void 0!==c?c:"",className:(null===(u=$.values.masterYearGroup)||void 0===u?void 0:u.id)?"":"text-secondary",showRequiredStar:!0,disabled:H||T||j.l.hasSso(e.user)&&!F&&0!==(null===(m=$.initialValues.masterYearGroup)||void 0===m?void 0:m.value),onChange:function(e){var t=e.target.value,n=v.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)}},a.createElement("option",{className:"text-secondary",value:""},i.T.getPhrase(Y,"selectYearGroup")),E.map(function(e){return a.createElement("option",{key:e.id,value:e.id,className:"text-dark"},e.name)})),a.createElement("div",{className:"d-flex justify-content-between align-items-center"},!e.hideAdminToggle&&a.createElement(R,{user:e.user,userType:p,countryCode:e.countryCode,isEditingCurrentUser:J,isDisabled:H,isValidatingEmail:T,editSsoFields:F,hasOrg:e.hasOrg,canEditSuperAdmin:e.canEditSuperAdmin}),function(e){return!(e.isNew||!e.showActions||!e.appLinks||!e.user||!e.onClickResendActivationEmail)}(e)&&a.createElement(C.c,{user:e.user,userType:p,appLinks:e.appLinks,onClickSendResetEmail:e.onClickSendResetEmail,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,currentUser:y,products:e.products,isEditUserForm:!0,hasUserCredit:e.hasUserCredit})),a.createElement(V.u,null,!!e.onToggleNextCheckbox&&a.createElement(V.u.Checkbox,{id:"edit-next-user",onToggle:e.onToggleNextCheckbox,label:e.goToNextText||W("goToNext"),checked:e.shouldGoToNext}),!!e.canEditSsoFields&&!e.hideSsoToggle&&a.createElement(V.u.Toggle,{on:F,onClick:function(){return z(function(e){return!e})},label:W("editSsoFields"),disabled:!j.l.hasSso(e.user),tooltip:j.l.hasSso(e.user)?"":"This user doesn't sign in with SSO"}),a.createElement(V.u.Cancel,{onClick:d}),a.createElement(V.u.Submit,{isNew:f,text:b,variant:"dark",disabled:!!w||void 0})))}var $=n(39739),H=n(5173),J=/^(?![._])(?!.*[._]$)(?!.*?\.\.)(?!.*?__)[a-zA-Z0-9_.]+$/,K=/^[\w0-9'\-,.():;&][^_!¡?÷¿/\\+=@#$%ˆ*{}|~<>[\]]{0,}$/,Q=i.T.encloseNamespace("userManager.validation"),X=function(e){return(0,H.Z_)().max(255,function(){return Q("nameExceeds")}).required(function(){return Q("nameRequired")}).default("").test({name:"name-invalid",message:Q("nameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.firstName!==t)||K.test(t)}})},ee=function(e){return(0,H.Z_)().max(255,function(){return Q("surnameExceeds")}).required(function(){return Q("surnameRequired")}).default("").test({name:"surname-invalid",message:Q("surnameInvalid"),test:function(t){return!(!(null==e?void 0:e.userId)||e.surname!==t)||K.test(t)}})},te=function(e,t){var n=(0,H.Z_)().max(255,function(){return Q("emailExceeds")}).email(function(){return Q("emailInvalidLong")}).default("");return e!==h.Y.Staff||(null==t?void 0:t.userId)&&!t.email||(n=n.required(function(){return Q("emailRequired")})),n},ne=function(e){var t=!(null==e?void 0:e.userId);return(0,H.Z_)().default("").test({name:"username-too-long",message:Q("usernameExceeds"),test:function(n){return!t&&e.username===n||n.length<=200}}).test({name:"username-too-short",message:Q("usernameTooShort"),test:function(n){return!t&&e.username===n||!(!t||n)||n.length>=5}}).test({name:"username-invalid",message:Q("usernameInvalidLong"),test:function(n){return!(!t||n)||!t&&e.username===n||J.test(n)}})},ae=function(e,t){var n=(0,H.Z_)().default("");return(null==t?void 0:t.userId)||(n=n.test({name:"password-short",message:Q("passwordTooShort",{minLength:e}),test:function(t){return!t||t.length>=e}})),n},re=function(e){if(e!==h.Y.Staff)return(0,H.Ry)().required(function(){return Q("yearGroupRequired")}).nullable()},ie=function(e,t,n){return(0,H.Ry)().shape({firstName:X(n),surname:ee(n),email:te(e,n),username:ne(n),password:ae(t,n),displayName:(0,H.Z_)().max(70,function(){return Q("displayNameExceeds")}).notRequired().nullable().default("").test({name:"display-name-short",message:Q("displayNameTooShort"),test:function(e){return!e||e.length>=2}}),masterYearGroup:re(e)})};function le(e){var t={};Object.keys(e.initialErrors||{}).forEach(function(e){t[e]=!0});var n,r,i=!e.initialValues.userId,l=!!i||!(null===(r=null===(n=e.user)||void 0===n?void 0:n.metadata)||void 0===r?void 0:r.isEmailVerified),s=$.P.getMinimumPasswordLength(e.passwordPolicy,e.userType,A.i.User),o=j.l.getValidYearGroups(e.yearGroups);return a.createElement("div",null,a.createElement(g.n,{initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:t,onSubmit:e.onSubmit,validationSchema:ie(e.userType,s,e.initialValues)},a.createElement(D,{isNew:i,user:e.user,userType:e.userType,yearGroups:o,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:l,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,hasUserCredit:e.hasUserCredit,hideAdminToggle:e.hideAdminToggle,hideSsoToggle:e.hideSsoToggle,hideYearLevel:e.hideYearLevel,hasOrg:e.hasOrg,countryCode:e.countryCode,canEditSuperAdmin:e.canEditSuperAdmin})))}},66122:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(32735);function r(e){return a.createElement("span",{id:"".concat(e.name,"Error"),className:"".concat(e.className," invalid-feedback d-block"),role:"status"},e.children)}},29057:(e,t,n)=>{n.d(t,{n:()=>S,W:()=>k});var a=n(32735),r=n(80247),i=n(80130),l=n(92802),s=n(91967),o=n(1048),c=n(15611),u=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function m(e){var t=e.label,n=e.checkboxLabelClassName,r=e.checkboxLabelFontWeight,l=e.className,s=u(e,["label","checkboxLabelClassName","checkboxLabelFontWeight","className"]);return a.createElement(i.Z.Group,{className:"form-group"},a.createElement("div",{className:"form-check ".concat(l||"")},a.createElement(S,Object.assign({className:"form-check-input"},s)),a.createElement(i.Z.Label,{className:"form-check-label cursor-pointer ".concat("normal"===r?"fw-normal":""," \n ").concat(n),htmlFor:s.id},t),e.checkboxAppLink&&e.checkboxAppLinkText&&a.createElement(a.Fragment,null,a.createElement("span",null," "),a.createElement(c.F,{appLink:e.checkboxAppLink,className:"info-link"},e.checkboxAppLinkText))))}var d=n(83914),f=n(83345),p=n(73814),v=n(35223);function g(e){var t=(0,l.u6)().values,n=o.t.get(t,e.fieldName);return"string"!=typeof n?a.createElement(a.Fragment,null):a.createElement("div",{className:"float-end text-secondary fw-normal"},n.length,"/",e.limit," characters")}const h={revealPassword:"jCfI0",passwordInput:"RBJnf",passwordContainer:"d78lK",passwordContainerDisabled:"asbVo",infoTooltip:"wzyOG",spinner:"CycFx"};function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var y=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n},E="shared.formField";function S(e){var t,n,i=e.children,c=e.showLoadingSpinner,u=y(e,["children","showLoadingSpinner"]),m=(t=a.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 a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(t,n)||function(e,t){if(e){if("string"==typeof e)return b(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)?b(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],g=s.q.isFunction(i)?function(e){return i(e)}:a.Children.count(i)?i:null;if("password"!==u.type)return c?a.createElement("div",{className:"position-relative"},a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize"])),g),a.createElement("div",{className:h.spinner},a.createElement(r.Z,{animation:"border",size:"sm"}))):a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize"])),g);var E="position-relative ".concat(h.passwordContainer);return u.className&&(E+=" ".concat(u.className)),u.disabled&&(E+=" ".concat(h.passwordContainerDisabled)),a.createElement("div",{className:E},a.createElement(l.gN,Object.assign({},o.t.omit(u,["formSize","type","className"]),{type:f,className:"".concat(h.passwordInput," border-0 w-100 h-100 outline-none rounded")}),g),"password"===u.type&&a.createElement(d.x,{svgName:"password"===f?v.vn.VisibleOn:v.vn.VisibleOff,className:"svg-container cursor-pointer ".concat(h.revealPassword),onClick:function(){p("password"===f?"text":"password")}}))}function k(e){var t=e.label,n=e.className,r=e.showCharacterCounter,s=e.showRequiredStar,c=e.infoTooltip,u=e.infoTooltipPlacement,b=e.infoText,k=e.formSize,C=e.showOptionalLabel,w=e.formGroupClassname,x=e.labelClassName,N=y(e,["label","className","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname","labelClassName"]),O=(0,l.u6)(),T=O.errors,A=O.touched,j=function(){};if("checkbox"===N.type){var I=o.t.omit(e,["formSize","infoTooltipPlacement"]);return e.disabled&&(I.onChange=j),a.createElement(m,Object.assign({},I))}var F=Object.assign(Object.assign({},N),{className:p.w.getCustomFormControlClassName(T,A,N.name,k,n,"string"==typeof e.as?e.as:null)});return e.disabled&&(F.onChange=j),a.createElement(i.Z.Group,{className:"form-group ".concat(w)},!!t&&a.createElement(i.Z.Label,{htmlFor:N.id,className:"d-flex align-items-center ".concat(x)},t,s&&a.createElement("span",{className:"text-danger"},"*"),c&&a.createElement(d.x,{className:"svg-container text-secondary ".concat(h.infoTooltip),svgName:v.vn.Info,title:c,tooltipPlacement:u,tooltipSpanHack:!0}),C&&a.createElement("span",{className:"text-secondary"}," ",a.createElement(f.x,{namespace:E,phrase:"optional"})),!!r&&!!N.maxLength&&a.createElement("div",{className:"ms-auto"},a.createElement(g,{fieldName:N.name,limit:N.maxLength}))),e.description&&a.createElement("p",null,e.description),a.createElement(S,Object.assign({},F,{"aria-errormessage":"".concat(N.name,"Error")})),!!b&&a.createElement(i.Z.Text,{className:"text-secondary"},b),a.createElement(l.Bc,{name:N.name},function(e){return a.createElement(i.Z.Control.Feedback,{id:"".concat(N.name,"Error"),type:"invalid",role:"status"},e)}))}S.defaultProps={autoComplete:"off"},k.defaultProps={autoComplete:"off",infoTooltipPlacement:"top"}},82644:(e,t,n)=>{n.d(t,{b:()=>m,n:()=>u});var a=n(32735),r=n(92802),i=n(91967),l=n(1048);function s(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 a,r,i,l,s=[],o=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;o=!1}else for(;!(o=(a=i.call(n)).done)&&(s.push(a.value),s.length!==t);o=!0);}catch(e){c=!0,r=e}finally{try{if(!o&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(c)throw r}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(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 o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var c=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function u(e){var t=e.castInitialValues,n=e.castValuesOnSubmit,o=e.initialValues,u=e.onSubmit,m=c(e,["castInitialValues","castValuesOnSubmit","initialValues","onSubmit"]),d=t&&e.validationSchema?e.validationSchema.cast(function(e){if(!e)return{};var t=l.t.deepClone(e);return function e(n){Object.keys(t).forEach(function(a){t.hasOwnProperty(a)&&(l.t.isObject(n[a])?e(n[a]):null===t[a]&&delete t[a])})}(t),t}(o)):o,f={allowInitialSubmit:e.allowInitialSubmit};return a.createElement(r.J9,Object.assign({enableReinitialize:!0},m,{initialValues:d,onSubmit:function(t,a){var r=a.setSubmitting,i=a.resetForm,l=a.setFieldError,o=n&&e.validationSchema?e.validationSchema.cast(t):t;u(o,function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(e.reset&&i(),e.errors)for(var t=0,n=Object.entries(e.errors);t<n.length;t++){var a=s(n[t],2),o=a[0],c=a[1];l(o,c)}r(!1)})},initialStatus:f}),i.q.isFunction(e.children)?function(t){return e.children(t)}:a.Children.count(e.children)?e.children:null)}function m(){return(0,r.u6)()}u.defaultProps={castInitialValues:!0,castValuesOnSubmit:!0}},73814:(e,t,n)=>{n.d(t,{w:()=>r});var a=n(92802),r={getCustomFormControlClassName:function(e,t,n,r,i,l){var s="";return s=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}(l,r),(0,a.u9)(t,n)&&(0,a.u9)(e,n)&&(s+=" is-invalid"),i&&(s+=" ".concat(i)),s}}},80658:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(99940),r={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,r){return{url:"{gateway}/v1/customers/".concat(e,"/settings/security"),key:"update:security:settings",invalidationKeys:"customers:security:settings",type:a.k.PUT,normalize:!1,data:t,success:n,error:r}}}}}]);
|
|
3
|
+
//# sourceMappingURL=8933-b36bfd7ad1-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/8933-b36bfd7ad1-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-role/user-role-field.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-role/UserRoleField.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/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')} \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 {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')} \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')} </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')} </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')} \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')} \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}","// extracted by mini-css-extract-plugin\nexport default {\"checkWrapper\":\"OzB20\"};","import React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces/EditUserRequest';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { User } from 'libs/shared/interfaces/models/User';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-role-field.scss';\n\nconst namespace = 'userManager.userRoleField';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UserRoleProps {\n user: User;\n userType: UserGroup;\n isEditingCurrentUser: boolean;\n isDisabled: boolean;\n isValidatingEmail: boolean;\n editSsoFields: boolean;\n hasOrg: boolean;\n countryCode: string;\n canEditSuperAdmin: boolean;\n hideLabel?: boolean;\n onRoleChange?: (newRole: UserRole) => void;\n}\n\nexport function UserRoleField(props: UserRoleProps) {\n const ROLE_OPTIONS = [\n { value: UserRole.Admin, label: getPhrase('admin') },\n { value: UserRole.SuperAdmin, label: props.countryCode === 'US' ? getPhrase('superAdminUs') : getPhrase('superAdmin') }\n ];\n\n const formikProps = useFormikContext<EditUserRequest>();\n\n // for customer don't have org OR the current user cannot edit super admin role,\n const showAdminToggle = !props.hasOrg || !props.canEditSuperAdmin;\n\n if (props.userType === UserGroup.Learner || props.isEditingCurrentUser) {\n return null;\n }\n\n const isDisabled = props.isDisabled\n || props.isValidatingEmail\n || (UserHelper.hasNonLegacySso(props.user) && !props.editSsoFields);\n\n const showReadOnlySuperAdmin = formikProps.values.masterRole === UserRole.SuperAdmin\n && !props.canEditSuperAdmin;\n if (showReadOnlySuperAdmin) {\n return (\n <div className='mb-3'>\n <label>{getPhrase('role')}</label>\n <Tooltip title={getPhrase('superAdminTooltip')} spanHack>\n <div className='border rounded-pill border-dark'>{getPhrase('superAdmin')}</div>\n </Tooltip>\n </div>\n );\n }\n\n if (showAdminToggle) {\n return (\n <div className='d-flex justify-content-between align-items-center'>\n <FormField\n id='masterRole'\n name='masterRole'\n disabled={isDisabled}\n >\n {() => (\n <div className='d-flex align-items-center'>\n <ToggleSwitch\n onClick={() => {\n const newRole = formikProps.values.masterRole === UserRole.User ? UserRole.Admin : UserRole.User;\n formikProps.setFieldValue('masterRole', newRole);\n props.onRoleChange?.(newRole);\n }}\n on={formikProps.values.masterRole === UserRole.Admin}\n disabled={isDisabled}\n showStateWhenDisabled\n />\n {!props.hideLabel && <span className='fw-semibold ms-2'>{getPhrase('admin')}</span>}\n </div>\n )}\n </FormField>\n </div>\n );\n }\n\n return (\n <div>\n <FormField\n id='masterRole'\n name='masterRole'\n disabled={isDisabled}\n label={!props.hideLabel && 'Role'}\n >\n {() => ROLE_OPTIONS.map(option => (\n <div className={`${styles.checkWrapper} mb-2`} key={option.value}>\n <Form.Check\n className='form-check'\n id={option.value}\n type='radio'\n label={option.label}\n checked={formikProps.values.masterRole === option.value}\n onChange={e => {\n if (e.target.checked) {\n formikProps.setFieldValue('masterRole', option.value);\n props.onRoleChange?.(option.value);\n }\n }}\n disabled={isDisabled}\n />\n </div>\n ))}\n </FormField>\n {(formikProps.values.masterRole === UserRole.Admin || formikProps.values.masterRole === UserRole.SuperAdmin) && (\n <DivButton\n className='text-info mb-2 mt-n2'\n onClick={() => {\n formikProps.setFieldValue('masterRole', UserRole.User);\n props.onRoleChange?.(UserRole.User);\n }}\n >\n {getPhrase('clear')}\n </DivButton>\n )}\n </div>\n );\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 { UserRoleField } from 'libs/shared/apps/user-manager/components/user-role/UserRoleField';\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 { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\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 countryCode?: string;\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 hasUserCredit?: boolean;\n hideSsoToggle?: boolean;\n hideAdminToggle?: boolean;\n hasOrg: boolean;\n hideYearLevel?: boolean;\n canEditSuperAdmin: 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 validYearGroups = UserHelper.getValidYearGroups(yearGroups);\n\n const [ emailError, setEmailError ] = React.useState<UserEmailCheckResponse>(null);\n const [ isValidatingEmail, setIsValidatingEmail ] = React.useState(false);\n\n const [ editSsoFields, setEditSsoFields ] = React.useState(props.canEditSsoFields || 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 {props.userType === UserGroup.Learner && !props.hideYearLevel && (\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 {validYearGroups.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 {!props.hideAdminToggle && (\n <UserRoleField\n user={props.user}\n userType={userType}\n countryCode={props.countryCode}\n isEditingCurrentUser={isEditingCurrentUser}\n isDisabled={isDisabled}\n isValidatingEmail={isValidatingEmail}\n editSsoFields={editSsoFields}\n hasOrg={props.hasOrg}\n canEditSuperAdmin={props.canEditSuperAdmin}\n />\n )}\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 hasUserCredit={props.hasUserCredit}\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 && !props.hideSsoToggle && (\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\nexport interface EditUserDetailsProps {\n user?: User;\n userType: UserGroup;\n yearGroups: YearGroup[];\n countryCode?: string;\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 hasUserCredit?: boolean;\n hideSsoToggle?: boolean;\n hideAdminToggle?: boolean;\n hasOrg?: boolean;\n hideYearLevel?: boolean;\n canEditSuperAdmin?: 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 const validYearGroups = UserHelper.getValidYearGroups(props.yearGroups);\n\n return (\n <div>\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={validYearGroups}\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 hasUserCredit={props.hasUserCredit}\n hideAdminToggle={props.hideAdminToggle}\n hideSsoToggle={props.hideSsoToggle}\n hideYearLevel={props.hideYearLevel}\n hasOrg={props.hasOrg}\n countryCode={props.countryCode}\n canEditSuperAdmin={props.canEditSuperAdmin}\n />\n </FormWrapper>\n </div>\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> </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';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\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 = ObjectHelper.get(values, props.fieldName as string);\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 description?: 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 formGroupClassname?: string;\n labelClassName?: string;\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 formGroupClassname,\n labelClassName: labelGlassName,\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 ${formGroupClassname}`}>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className={`d-flex align-items-center ${labelGlassName}`}>\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'> <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 {props.description &&\n <p>\n {props.description}\n </p>\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","UserRoleField","ROLE_OPTIONS","value","UserRole","label","countryCode","showAdminToggle","hasOrg","canEditSuperAdmin","isEditingCurrentUser","isDisabled","isValidatingEmail","UserHelper","editSsoFields","masterRole","FormField","id","disabled","ToggleSwitch","newRole","User","setFieldValue","onRoleChange","on","showStateWhenDisabled","hideLabel","map","option","key","Form","type","checked","onChange","e","target","DivButton","Tooltip","title","spanHack","EMAIL_ERROR_CODES","FIRST_NAME_FIELD_ID","UserDetailsForm","yearGroups","submitText","currentUser","validYearGroups","emailError","setEmailError","setIsValidatingEmail","canEditSsoFields","setEditSsoFields","emailValidationCache","client","UserManagerClientContext","password","touched","firstNameEl","document","getElementById","focus","status","ObjectStatus","toString","userId","placeholder","showRequiredStar","emailRequired","canEditEmail","formSize","infoText","UserManagerClient","initialValues","getEmailFieldInfoText","onBlur","currentTarget","setFieldTouched","validateEmail","validateForm","emailValidation","current","ArrayHelper","first","onDetectValidUser","includes","showLoadingSpinner","autoFocus","firstName","surname","showDisplayNameField","username","infoTooltip","showPasswordField","hideYearLevel","as","masterYearGroup","yearGroupId","yearGroup","find","y","description","hideAdminToggle","showActions","onClickResendActivationEmail","shouldShowActions","UserItemActions","onClickSendResetEmail","onClickSendVerificationEmail","products","isEditUserForm","hasUserCredit","PopupButtons","onToggleNextCheckbox","onToggle","goToNextText","shouldGoToNext","hideSsoToggle","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","FormWrapper","onSubmit","validationSchema","role","children","FormCheckbox","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","FieldWrapper","htmlFor","checkboxAppLink","checkboxAppLinkText","CharacterCounter","field","ObjectHelper","fieldName","limit","namespace","setType","resolvedChildren","FunctionHelper","f","Spinner","animation","size","containerClassName","SvgContainer","svgName","showCharacterCounter","infoTooltipPlacement","showOptionalLabel","formGroupClassname","labelGlassName","labelClassName","errors","disabledOnChange","_props","fieldWrapperProps","FormHelper","tooltipPlacement","tooltipSpanHack","Text","phrase","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":""}
|