@clickview/lite 0.50.0-rc.1 → 0.50.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 CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "appBundle": "bundle-be1688b50c.min.js",
2
+ "appBundle": "bundle-541e1ff041.min.js",
3
3
  "cssBundle": "lite-app-5b9f4761e1.css",
4
4
  "polyfillBundle": "polyfills-365f92d668.min.js"
5
5
  }
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1285],{92869:(e,t,a)=>{a.d(t,{t:()=>o});var n=a(48088),r=a(95846),o={preventScrollTop:function(){n.Radio.channel(r.G.SHELL).trigger("prevent:scroll:top")}}},37395:(e,t,a)=>{a.d(t,{t:()=>u});var n=a(32735),r=a(98269),o=a(92869),s=a(49985),l=a(65858),i=a(36848),c=a(83345);function d(e,t,a){var n;if(!t)return null;var r=null!==(n=e.params)&&void 0!==n?n:{};return a?(null==r?void 0:r.previous)?{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:null==r?void 0:r.previous,previous:null})}:{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:null,previous:null})}:{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:t,previous:r.cursor})}}function u(e){var t=e.appLink,a=e.cursors,u=e.className,m=e.buttonVariant,p=e.prevHack,g=e.scrollTop,f=e.onClick;function v(e){t&&!g&&o.t.preventScrollTop(),s.k.logUserAction({page:e},{location:l.LZ.Pagination,entity:l.py.Pagination,actionType:l.Vw.Navigate}),f&&f(a[e])}return t?n.createElement(c.D.Provider,{value:"shared.pagination"},n.createElement("div",{className:u},n.createElement(i.F,{appLink:d(t,a.previous,p),className:"btn btn-".concat(m," me-1 ").concat(a.previous?"":"disabled"),onClick:function(){return v("previous")},style:{display:"inline-block"}},n.createElement(c.x,{phrase:"previous"})),n.createElement(i.F,{appLink:d(t,a.next),className:"btn btn-".concat(m," ").concat(a.next?"":"disabled"),onClick:function(){return v("next")},style:{display:"inline-block"}},n.createElement(c.x,{phrase:"next"})))):n.createElement(c.D.Provider,{value:"shared.pagination"},n.createElement("div",{className:u},n.createElement(r.Z,{variant:m,className:"me-1 ".concat(a.previous?"":"disabled"),onClick:function(){return v("previous")}},n.createElement(c.x,{phrase:"previous"})),n.createElement(r.Z,{variant:m,className:"btn ".concat(a.next?"":"disabled"),onClick:function(){return v("next")}},n.createElement(c.x,{phrase:"next"}))))}u.defaultProps={className:"py-2",buttonVariant:"secondary"}},28469:(e,t,a)=>{a.d(t,{P:()=>o});var n=a(32735),r=a(23481).T.encloseNamespace("rostering.alert");function o(e){var t="classroom"===e.type?r("classroom"):r("hasRostering");return n.createElement("div",{className:"alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap"},t," ")}},299:(e,t,a)=>{a.d(t,{X:()=>s});var n=a(32735),r=a(69217),o=a(94631),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.idField,s=void 0===a?"id":a,l=t.persistNamespace,i=t.initialState?t.initialState:new Map,c=n.useRef(i),d=(0,r.N)(),u=(0,o.D)(e),m=(0,o.D)(l);function p(){c.current.clear(),d()}function g(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[s].toString()),c.current.get(e)}function f(){return!!(null==e?void 0:e.length)&&e.every(g)}function v(e){e.forEach((function(e){c.current.set(e,!0)})),d()}return n.useEffect((function(){t.initialState||l&&m===l||(null==u?void 0:u.map((function(e){return e[s]})).join())!==(null==e?void 0:e.map((function(e){return e[s]})).join())&&p()}),[u,m,e,t.initialState]),n.useEffect((function(){var e;(null===(e=t.preselectedIds)||void 0===e?void 0:e.length)&&v(t.preselectedIds)}),[]),{onToggleBulk:function(){var t=!f();e.forEach((function(e){t?c.current.set(e[s].toString(),!0):c.current.delete(e[s].toString())})),d()},onToggleItem:function(e){var t=!c.current.get(e.toString());t?c.current.set(e.toString(),t):c.current.delete(e.toString()),d()},getSelected:function(){return Array.from(c.current.keys())},isChecked:g,bulkChecked:f(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach((function(e){c.current.delete(e[s].toString())})),d())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find((function(e){return g(e)}))},setSelected:v,getSelectedCount:function(){return c.current.size},reset:p,getMap:function(){return c.current}}}},94631:(e,t,a)=>{a.d(t,{D:()=>r});var n=a(32735);function r(e){var t=n.useRef();return n.useEffect((function(){t.current=e})),t.current}},36511:(e,t,a)=>{a.d(t,{I:()=>r});var n=a(40424);function r(e){switch(e){case n.R.Pink:return"pink";case n.R.Orange:return"orange";case n.R.Green:return"green";case n.R.Blue:return"blue";case n.R.Purple:return"purple";case n.R.Indigo:return"indigo";default:return"pink"}}},6925:(e,t,a)=>{a.r(t),a.d(t,{ClassroomStudentsView:()=>Te});var n=a(32735),r=a(70680),o=a(23481),s=a(20354),l=a(49985),i=a(65858),c=a(37395),d=a(28469),u=a(16714),m=a(76881),p=a(39151),g=a(31949),f=a(22902),v=a(79612),E=a(14070),S=a(97291),h=a(23232),b=a(83345),y=a(35223),k=a(99742),C="classrooms.classroomsEmptyState";function N(e){return n.createElement(b.D.Provider,{value:C},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"noStudentsHeading"})),n.createElement(h.u.Info,{className:"w-33 ".concat(e.canManageUsers?"":"mb-0")},n.createElement(b.x,{phrase:"noStudentsInfo"})),e.canManageUsers&&!e.isRostering&&n.createElement(h.u.Cta,{text:o.T.getPhrase(C,"noStudentsCta"),appLink:{application:S.O.USER_MANAGER,action:E.e.UserManager.STUDENTS}}),!e.canManageUsers&&!e.isRostering&&n.createElement(h.u.Info,null,n.createElement(b.x,{phrase:"askAdmin"})),e.isRostering&&n.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},o.T.getPhrase(C,"rosteringCta"))))}var T="classrooms.manageClassroomStudentsEmptyState",O=o.T.encloseNamespace(T),x="https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf",w="";function U(){return n.createElement(b.D.Provider,{value:T},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"emptyStateHeading"})),n.createElement(h.u.Info,{className:"mb-2"},n.createElement(b.x,{phrase:"emptyStateInfo"})),n.createElement("a",{className:"btn btn-link info-link font-semibold",href:w,target:"_blank"},O("rosteringCta"))))}function I(e){return e.schoolHasNoStudents?n.createElement(N,{canManageUsers:e.canManageUsers}):n.createElement(b.D.Provider,{value:T},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"emptyStateHeading"})),n.createElement(h.u.Info,null,n.createElement(b.x,{phrase:"emptyStateInfo"})),n.createElement(h.u.Cta,{text:o.T.getPhrase(T,"addStudents"),icon:y.vn.Plus,appLink:{application:S.O.CLASSROOMS,action:E.e.Classrooms.ADD_STUDENTS_CHOICES,args:[e.classroom.id]}}),n.createElement("a",{className:"btn btn-link info-link font-semibold",href:x,target:"_blank"},e.classroomIdeasText)))}var R=a(81886),M=a(11607),P=a(89965),L=a(10874),A=a(83914),F=a(76177),G=a(86764),D=a(69883),H=a(299),j=a(3747),_=a(34509),Z=a(36848),B=a(36511);function V(e){var t;return e.group?n.createElement("div",{className:"classroom-pill text-white bg-".concat((0,B.I)(null===(t=e.group.metadata)||void 0===t?void 0:t.colour))},e.group.name):n.createElement(n.Fragment,null)}function X(e){return e.count?n.createElement(M.L,{onClick:e.onClick,className:"classroom-pill bg-white border border-dark"},"+",e.count):n.createElement(n.Fragment,null)}var W="classrooms.classroomGroupDropdown",Y=function(e,t){return{application:S.O.CLASSROOMS,action:E.e.Classrooms.NEW_GROUP,args:[e],params:{addStudents:t.map((function(e){return e.id}))}}},q=function(e,t){return e.filter((function(e){return t.users.data.find((function(t){return t.id.toString()===e.id.toString()}))})).length};function Q(e){var t,a=(0,H.X)(e.groups,{preselectedIds:e.preselections.map((function(e){return e.id}))}),r=a.onToggleItem,s=a.isChecked;n.useEffect((function(){e.groups.forEach((function(t){var a=q(e.selectedStudents,t);(!a||a!==e.selectedStudents.length||s(t.id))&&(a||!s(t.id))||r(t.id)}))}));var c={align:e.alignRight?"end":"start"};return e.disabled&&(c.show=!1),n.createElement(_.Z,Object.assign({},c),n.createElement(_.Z.Toggle,{as:"div",id:e.id,className:"".concat(e.disabled?"text-light":"cursor-pointer"," ").concat("me-2 d-inline-block svg-container sm"," no-caret")},n.createElement(A.x,{svgName:y.vn.Group,title:e.disabled?e.disabledTooltips:o.T.getPhrase(W,"addToGroupTooltip"),tooltipPlacement:"top",tooltipSpanHack:!0,tooltipSpanHackClassName:""})),n.createElement(_.Z.Menu,null,!!(null===(t=e.groups)||void 0===t?void 0:t.length)&&n.createElement("div",{className:"px-2 border-bottom mb-1"},n.createElement("p",{className:"mb-0"},n.createElement(b.x,{namespace:W,phrase:"addToGroup"})),n.createElement("ul",{className:"list-unstyled pe-3"},e.groups.map((function(t){return n.createElement("li",{key:t.id,className:"d-flex align-items-center bg-white my-1"},n.createElement(P.X,{id:"".concat(e.id,":").concat(t.id),checked:s(t.id),onChange:function(){return function(t){var a=!s(t.id);e.onSelectGroup(t,a),r(t.id)}(t)},indeterminate:!!q(e.selectedStudents,t)}),n.createElement(V,{group:t}))})))),n.createElement(Z.F,{onClick:function(){e.disabled||l.k.logUserAction({},l.k.mergeOptions(e.analyticsOptions,{actionType:i.Vw.Create,workflowPhase:i.eu.Start,entity:i.py.ClassroomGroup}))},appLink:Y(e.classroom.id,e.selectedStudents),className:e.disabled?"disabled":"text-nowrap d-flex align-items-center px-2"},n.createElement(A.x,{svgName:y.vn.Plus}),n.createElement(b.x,{namespace:W,phrase:"createNew"}))))}Q.defaultProps={preselections:[]};var $=a(91967),z=a(83657),J=a(20789),K=a(10038),ee=a(64818);const te={avatarContainer:"rfVnC",name:"RYLWZ"};function ae(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,o,s,l=[],i=!0,c=!1;try{if(o=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;i=!1}else for(;!(i=(n=o.call(a)).done)&&(l.push(n.value),l.length!==t);i=!0);}catch(e){c=!0,r=e}finally{try{if(!i&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw r}}return l}}(e,t)||ne(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 ne(e,t){if(e){if("string"==typeof e)return re(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?re(e,t):void 0}}function re(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var oe=o.T.encloseNamespace("classrooms.manageClassroomStudentItem"),se=function(e){return{application:S.O.USER_MANAGER,action:E.e.UserManager.EDIT_USER,args:[e],params:{userType:m.Y.Learner}}},le=function(e,t){return{application:S.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_STUDENTS,args:[t],params:{studentIds:[e]}}};function ie(e){var t,a=ae(n.useState(!1),2),r=a[0],o=a[1],s=ae(n.useState(!1),2),c=s[0],d=s[1],m=ae(n.useState({}),2),p=m[0],g=m[1],v=n.useRef(null),E=n.useRef(null),S=(0,f.T)().hasPermissions;n.useEffect((function(){y(),c||o(!0)}),[e.selectedGroups.length]);var h,b=$.q.throttle((function(){y(),o(!0)}),300);function y(){g(e.selectedGroups.reduce((function(e,t){return e[t.id]=!0,e}),{}))}return(0,K.H)((function(){c||b()})),n.useEffect((function(){if(v.current&&E.current&&r){var e=v.current.firstElementChild;if(e){var t,a,n=e.getBoundingClientRect().y,s={},l=function(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=ne(e))){a&&(e=a);var n=0,r=function(){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,l=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return s=e.done,e},e:function(e){l=!0,o=e},f:function(){try{s||null==a.return||a.return()}finally{if(l)throw o}}}}(v.current.children);try{for(l.s();!(a=l.n()).done;){var i=a.value;i.id&&(s[i.id]=i.getBoundingClientRect().y===n,t=s[i.id]?i.id:t)}}catch(e){l.e(e)}finally{l.f()}E.current.getBoundingClientRect().y!==n&&(s[t]=!1),g(s),o(!1)}}}),[r]),n.createElement("div",{className:"d-flex align-items-center py-1 px-4"},n.createElement(P.X,{id:e.student.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),n.createElement("div",{className:"".concat(te.avatarContainer," me-2")},n.createElement(J.q,{imageCdnUrl:e.config.imageCdnUrl,initials:ee.l.getInitials(e.student.name,e.student.surname),imageUrl:null===(t=e.student.avatar)||void 0===t?void 0:t.url})),n.createElement("p",{className:"me-2 ".concat(te.name," text-truncate mb-0 text-nowrap")},e.student.name," ",e.student.surname),n.createElement("div",{className:"".concat(r?"invisible":""," me-auto d-flex flex-wrap mt-n1"),ref:v},e.selectedGroups.map((function(e){return p[e.id]?n.createElement("div",{key:e.id,className:"me-1 mt-1",id:e.id},n.createElement(V,{group:e})):n.createElement(n.Fragment,{key:e.id})})),n.createElement("div",{ref:E,className:"me-1 mt-1"},n.createElement(X,{count:Object.keys(p).reduce((function(e,t){return p[t]||e++,e}),0),onClick:function(){d(!0),y()}}))),n.createElement(Q,{id:"add-group-".concat(e.student.id),classroom:e.classroom,groups:e.classroomGroups,selectedStudents:[e.student],preselections:e.selectedGroups,onSelectGroup:function(t,a){return e.onToggleGroup(e.student,t,a)},analyticsOptions:{location:i.LZ.ManageClassroomStudentListItem},alignRight:!0,disabled:e.readOnly,disabledTooltips:e.readOnlyTooltip}),n.createElement(z.e,{actions:(h=[],S(u.C.ManageUsers)&&h.push({label:oe("editStudent"),appLink:se(e.student.id),disabled:e.readOnly,className:e.readOnly?"disabled":"",tooltip:e.readOnly?e.readOnlyTooltip:"",onClick:function(){l.k.logUserAction({id:e.student.id},{actionType:i.Vw.Edit,entity:i.py.User,workflowPhase:i.eu.Start,location:i.LZ.ManageClassroomStudentListItem})}}),h.push({label:oe("removeStudent"),appLink:le(e.student.id,e.classroom.id),disabled:e.readOnly,className:e.readOnly?"disabled":"text-danger",tooltip:e.readOnly?e.readOnlyTooltip:"",onClick:function(){l.k.logUserAction({id:e.classroom.id,userId:e.student.id},{actionType:i.Vw.Dissociate,entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,location:i.LZ.ManageClassroomStudentListItem})}}),h),actionsDropdownClassName:"btn"}))}var ce=a(88630),de="classrooms.manageClassroomStudents",ue=o.T.encloseNamespace(de);function me(e){var t,a=e.classroom,c=e.students,d=e.groups,u=(0,r.I0)(),m=(0,D.Z)(),p=(0,H.X)(c.data),g=p.getSelected().length,f=d.filter((function(e){var t,a;if(!(null===(a=null===(t=e.users)||void 0===t?void 0:t.data)||void 0===a?void 0:a.length))return!1;var n=!0,r=0,o=p.getSelected();if(o.length){var s=function(){var t=o[r];e.users.data.find((function(e){return e.id.toString()===t.toString()}))||(n=!1),r++};do{s()}while(r<o.length);return n}})),v=(0,j.a)(G.r.XLDown);return(null===(t=c.data)||void 0===t?void 0:t.length)?n.createElement(n.Fragment,null,n.createElement("div",{className:"d-flex align-items-center py-2 ".concat(v?"ps-2":"ps-4")},n.createElement(P.X,{id:"manage-classroom-students-bulk",onChange:p.onToggleBulk,checked:p.bulkChecked,className:"me-2",indeterminate:p.hasSomeSelections(),disabled:e.readOnly}),n.createElement(Q,{id:"bulk-add-group",classroom:a,selectedStudents:p.getSelected().map((function(t){return e.students.data.find((function(e){return e.id.toString()===t.toString()}))})),groups:d,onSelectGroup:function(e,t){var n=p.getSelected(),r=t?ce.F.addStudentsToGroup:ce.F.removeStudentsFromGroup;s.a.fetch(u,r(n,e.id,a.id,(function(){l.k.logUserAction({id:e.id,studentCount:n.length},{actionType:i.Vw.Associate,entity:i.py.ClassroomGroup,descriptor:i.iF.User,workflowPhase:i.eu.Complete,location:i.LZ.ManageClassroomStudents}),m.success(ue("addSuccess",{groupName:e.name,escapeText:!0}))}),(function(){m.error(ue("addError",{groupName:e.name,escapeText:!0}))})))},disabled:!g||e.readOnly,preselections:f,analyticsOptions:{location:i.LZ.ManageClassroomStudents},disabledTooltips:e.readOnly&&o.T.getPhrase(de,"disabledByRostering")}),n.createElement(M.L,{className:"me-auto ".concat(!g||e.readOnly?"text-light cursor-default":""),onClick:function(){if(g&&!e.readOnly){var t=p.getSelected();l.k.logUserAction({id:a.id,studentCount:t.length},{entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,actionType:i.Vw.Dissociate,location:i.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:S.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_STUDENTS,args:[a.id],params:{studentIds:t}})}}},n.createElement(F.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(de,"disabledByRostering"):""},n.createElement(A.x,{svgName:y.vn.Delete,title:o.T.getPhrase(de,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0}))),n.createElement(F.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(de,"disabledByRostering"):""},n.createElement(L.h,{onClick:function(){l.k.logUserAction({id:a.id},{entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,actionType:i.Vw.Associate,location:i.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:S.O.CLASSROOMS,action:E.e.Classrooms.ADD_STUDENTS_CHOICES,args:[a.id]})},svgName:y.vn.Plus,className:"btn btn-outline-dark",disabled:e.readOnly},n.createElement(b.x,{namespace:de,phrase:"addStudent"})))),n.createElement("ul",{className:"striped-list list-unstyled"},c.data.map((function(t){return n.createElement("li",{key:t.id},n.createElement(ie,{classroom:a,student:t,classroomGroups:e.groups,config:e.config,selectedGroups:e.groups.filter((function(e){return e.users.data.find((function(e){return e.id===t.id}))})),checked:p.isChecked(t.id),onToggleCheckbox:function(){return p.onToggleItem(t.id)},onToggleGroup:e.onToggleGroup,readOnly:e.readOnly,readOnlyTooltip:e.readOnly?ue("disabledByRostering"):""}))})))):n.createElement(I,{classroom:e.classroom,classroomIdeasText:ue("classroomIdeasText"),schoolHasNoStudents:e.schoolHasNoStudents,canManageUsers:e.canManageUsers})}var pe=a(49935),ge=a(5062);const fe="pJf6R",ve="MSvzY",Ee="IFmvc",Se="pOcvk";var he=n.memo((function(){return n.createElement("div",{className:"px-3"},n.createElement("div",{className:"mb-1 partial-loading-background ".concat("YrP_G")}),n.createElement("div",{className:"pb-3"},n.createElement(pe.b2,{numItems:2})),n.createElement("div",{className:"pb-2"},n.createElement(ge.Z,null)),n.createElement("div",{className:"d-flex align-items-center py-2"},n.createElement("div",{className:"mx-4 partial-loading-background ".concat(fe)}),n.createElement("div",{className:"me-2 partial-loading-background ".concat(ve)}),n.createElement("div",{className:"me-auto partial-loading-background ".concat(ve)}),n.createElement("div",{className:"partial-loading-background ".concat("j62jt")})),n.createElement("ul",{className:"striped-list list-unstyled"},Array(20).fill(null).map((function(e,t){return n.createElement("li",{key:t},n.createElement("div",{className:"d-flex align-items-center py-1 px-4"},n.createElement("div",{className:"me-2 partial-loading-background ".concat(fe)}),n.createElement("div",{className:"me-2 partial-loading-background ".concat("droqZ")}),n.createElement("div",{className:"w-25"},n.createElement("div",{className:"partial-loading-background ".concat("gorcb")})),n.createElement("div",{className:"me-auto d-flex"},Math.random()>.5?n.createElement(n.Fragment,null,n.createElement("div",{className:"partial-loading-background rounded-pill me-1 ".concat(Ee," ").concat("SdQ90")}),n.createElement("div",{className:"partial-loading-background rounded-pill ".concat(Ee," ").concat(Se)})):n.createElement("div",{className:"partial-loading-background rounded-pill ".concat(Ee," ").concat(Se)})),n.createElement("div",{className:"me-2 partial-loading-background ".concat(ve)}),n.createElement("div",{className:"partial-loading-background ".concat("S7p4K")})))}))))})),be=a(31491),ye=a(5289),ke=a(47288),Ce=o.T.encloseNamespace("classrooms.classroomStudents"),Ne={entity:i.py.ClassroomGroup,descriptor:i.iF.User,workflowPhase:i.eu.Complete,location:i.LZ.ManageClassroomStudentListItem};function Te(e){var t,a,o,h,b,y,k,C,N,T=s.a.useBasicFetch(g.N.currentUser()),O=s.a.useBasicFetch(T.data&&ce.F.getClassroom(e.id,T.data.id)),x=s.a.useBasicFetch(ce.F.getClassroomStudents(e.id)),w=s.a.useBasicFetch(T.data&&ke.N.getUsers(T.data.customerId,m.Y.Learner,{},e.cursor)),R=s.a.useBasicFetch(ce.F.getClassroomGroups(e.id)),M=s.a.useBasicFetch(p.L.config()),P=null===(a=null===(t=O.data)||void 0===t?void 0:t._integrations)||void 0===a?void 0:a.rostered,L=(0,r.I0)(),A=(0,f.T)().hasPermissions;function F(t,a,n){var r={id:a.id,studentCount:1},o=n?ce.F.addStudentsToGroup([t.id],a.id,e.id,(function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ne),{actionType:i.Vw.Associate}))})):ce.F.removeStudentsFromGroup([t.id],a.id,e.id,(function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ne),{actionType:i.Vw.Dissociate}))}));s.a.fetch(L,o)}return(0,v.M)({title:Ce("pageTitle",{classroomName:null===(o=O.data)||void 0===o?void 0:o.name})}),(0,be._)(O),O.data&&(null===(h=x.data)||void 0===h?void 0:h.data)&&(null===(b=R.data)||void 0===b?void 0:b.data)&&M.data&&w.data?n.createElement(ye.R,{classroom:O.data,currentUser:T.data,onTogglePin:function(e,t,a){if(!P){var n=e?ce.F.pinClassroom:ce.F.unpinClassroom;s.a.fetch(L,n(O.data,t,a))}},activeTab:"students",isRostered:P},function(){var e,t,a,r,o,s,l,i,c,m;return P?n.createElement(n.Fragment,null,n.createElement(d.P,{type:"classroom"}),(null===(t=null===(e=x.data)||void 0===e?void 0:e.data)||void 0===t?void 0:t.length)?n.createElement(me,{classroom:O.data,students:x.data,groups:R.data.data,onToggleGroup:F,config:M.data,schoolHasNoStudents:!(null===(r=null===(a=w.data)||void 0===a?void 0:a.data)||void 0===r?void 0:r.length),canManageUsers:A(u.C.ManageUsers),readOnly:!0}):n.createElement(U,null)):(null===(s=null===(o=x.data)||void 0===o?void 0:o.data)||void 0===s?void 0:s.length)?n.createElement(me,{classroom:O.data,students:x.data,groups:R.data.data,onToggleGroup:F,config:M.data,schoolHasNoStudents:!(null===(i=null===(l=w.data)||void 0===l?void 0:l.data)||void 0===i?void 0:i.length),canManageUsers:A(u.C.ManageUsers)}):n.createElement(I,{classroom:O.data,classroomIdeasText:Ce("classroomIdeasText"),schoolHasNoStudents:!(null===(m=null===(c=w.data)||void 0===c?void 0:c.data)||void 0===m?void 0:m.length),canManageUsers:A(u.C.ManageUsers)})}(),!!(null===(k=null===(y=x.data)||void 0===y?void 0:y.pagination)||void 0===k?void 0:k.cursors)&&n.createElement(c.t,{appLink:{application:S.O.CLASSROOMS,action:E.e.Classrooms.CLASSROOM_STUDENTS,args:[e.id]},cursors:null===(N=null===(C=x.data)||void 0===C?void 0:C.pagination)||void 0===N?void 0:N.cursors,buttonVariant:"outline-dark",className:"py-2 float-end",scrollTop:!0})):n.createElement(he,null)}}}]);
2
- //# sourceMappingURL=1285-086e83fddf-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1285],{92869:(e,t,a)=>{a.d(t,{t:()=>o});var n=a(48088),r=a(95846),o={preventScrollTop:function(){n.Radio.channel(r.G.SHELL).trigger("prevent:scroll:top")}}},37395:(e,t,a)=>{a.d(t,{t:()=>u});var n=a(32735),r=a(98269),o=a(92869),s=a(49985),l=a(65858),i=a(36848),c=a(83345);function d(e,t,a){var n;if(!t)return null;var r=null!==(n=e.params)&&void 0!==n?n:{};return a?(null==r?void 0:r.previous)?{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:null==r?void 0:r.previous,previous:null})}:{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:null,previous:null})}:{application:e.application,action:e.action,args:e.args,params:Object.assign(Object.assign({},r),{cursor:t,previous:r.cursor})}}function u(e){var t=e.appLink,a=e.cursors,u=e.className,m=e.buttonVariant,p=e.prevHack,g=e.scrollTop,f=e.onClick;function v(e){t&&!g&&o.t.preventScrollTop(),s.k.logUserAction({page:e},{location:l.LZ.Pagination,entity:l.py.Pagination,actionType:l.Vw.Navigate}),f&&f(a[e])}return t?n.createElement(c.D.Provider,{value:"shared.pagination"},n.createElement("div",{className:u},n.createElement(i.F,{appLink:d(t,a.previous,p),className:"btn btn-".concat(m," me-1 ").concat(a.previous?"":"disabled"),onClick:function(){return v("previous")},style:{display:"inline-block"}},n.createElement(c.x,{phrase:"previous"})),n.createElement(i.F,{appLink:d(t,a.next),className:"btn btn-".concat(m," ").concat(a.next?"":"disabled"),onClick:function(){return v("next")},style:{display:"inline-block"}},n.createElement(c.x,{phrase:"next"})))):n.createElement(c.D.Provider,{value:"shared.pagination"},n.createElement("div",{className:u},n.createElement(r.Z,{variant:m,className:"me-1 ".concat(a.previous?"":"disabled"),onClick:function(){return v("previous")}},n.createElement(c.x,{phrase:"previous"})),n.createElement(r.Z,{variant:m,className:"btn ".concat(a.next?"":"disabled"),onClick:function(){return v("next")}},n.createElement(c.x,{phrase:"next"}))))}u.defaultProps={className:"py-2",buttonVariant:"secondary"}},28469:(e,t,a)=>{a.d(t,{P:()=>o});var n=a(32735),r=a(23481).T.encloseNamespace("rostering.alert");function o(e){var t="classroom"===e.type?r("classroom"):r("hasRostering");return n.createElement("div",{className:"alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap"},t," ")}},299:(e,t,a)=>{a.d(t,{X:()=>s});var n=a(32735),r=a(69217),o=a(94631),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.idField,s=void 0===a?"id":a,l=t.persistNamespace,i=t.initialState?t.initialState:new Map,c=n.useRef(i),d=(0,r.N)(),u=(0,o.D)(e),m=(0,o.D)(l);function p(){c.current.clear(),d()}function g(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[s].toString()),c.current.get(e)}function f(){return!!(null==e?void 0:e.length)&&e.every(g)}function v(e){e.forEach((function(e){c.current.set(e,!0)})),d()}return n.useEffect((function(){t.initialState||l&&m===l||(null==u?void 0:u.map((function(e){return e[s]})).join())!==(null==e?void 0:e.map((function(e){return e[s]})).join())&&p()}),[u,m,e,t.initialState]),n.useEffect((function(){var e;(null===(e=t.preselectedIds)||void 0===e?void 0:e.length)&&v(t.preselectedIds)}),[]),{onToggleBulk:function(){var t=!f();e.forEach((function(e){t?c.current.set(e[s].toString(),!0):c.current.delete(e[s].toString())})),d()},onToggleItem:function(e){var t=!c.current.get(e.toString());t?c.current.set(e.toString(),t):c.current.delete(e.toString()),d()},getSelected:function(){return Array.from(c.current.keys())},isChecked:g,bulkChecked:f(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach((function(e){c.current.delete(e[s].toString())})),d())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find((function(e){return g(e)}))},setSelected:v,getSelectedCount:function(){return c.current.size},reset:p,getMap:function(){return c.current}}}},94631:(e,t,a)=>{a.d(t,{D:()=>r});var n=a(32735);function r(e){var t=n.useRef();return n.useEffect((function(){t.current=e})),t.current}},36511:(e,t,a)=>{a.d(t,{I:()=>r});var n=a(40424);function r(e){switch(e){case n.R.Pink:return"pink";case n.R.Orange:return"orange";case n.R.Green:return"green";case n.R.Blue:return"blue";case n.R.Purple:return"purple";case n.R.Indigo:return"indigo";default:return"pink"}}},6925:(e,t,a)=>{a.r(t),a.d(t,{ClassroomStudentsView:()=>Te});var n=a(32735),r=a(70680),o=a(23481),s=a(20354),l=a(49985),i=a(65858),c=a(37395),d=a(28469),u=a(16714),m=a(76881),p=a(39151),g=a(31949),f=a(22902),v=a(79612),E=a(14070),S=a(97291),h=a(23232),b=a(83345),y=a(35223),k=a(99742),C="classrooms.classroomsEmptyState";function N(e){return n.createElement(b.D.Provider,{value:C},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"noStudentsHeading"})),n.createElement(h.u.Info,{className:"w-33 ".concat(e.canManageUsers?"":"mb-0")},n.createElement(b.x,{phrase:"noStudentsInfo"})),e.canManageUsers&&!e.isRostering&&n.createElement(h.u.Cta,{text:o.T.getPhrase(C,"noStudentsCta"),appLink:{application:S.O.USER_MANAGER,action:E.e.UserManager.STUDENTS}}),!e.canManageUsers&&!e.isRostering&&n.createElement(h.u.Info,null,n.createElement(b.x,{phrase:"askAdmin"})),e.isRostering&&n.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},o.T.getPhrase(C,"rosteringCta"))))}var T="classrooms.manageClassroomStudentsEmptyState",O=o.T.encloseNamespace(T),x="https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf",w="";function U(){return n.createElement(b.D.Provider,{value:T},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"emptyStateHeading"})),n.createElement(h.u.Info,{className:"mb-2"},n.createElement(b.x,{phrase:"emptyStateInfo"})),n.createElement("a",{className:"btn btn-link info-link font-semibold",href:w,target:"_blank"},O("rosteringCta"))))}function I(e){return e.schoolHasNoStudents?n.createElement(N,{canManageUsers:e.canManageUsers}):n.createElement(b.D.Provider,{value:T},n.createElement(h.u,null,n.createElement(h.u.Image,{src:k.W.EmptyStates.Classrooms.STUDENTS}),n.createElement(h.u.Heading,null,n.createElement(b.x,{phrase:"emptyStateHeading"})),n.createElement(h.u.Info,null,n.createElement(b.x,{phrase:"emptyStateInfo"})),n.createElement(h.u.Cta,{text:o.T.getPhrase(T,"addStudents"),icon:y.vn.Plus,appLink:{application:S.O.CLASSROOMS,action:E.e.Classrooms.ADD_STUDENTS_CHOICES,args:[e.classroom.id]}}),n.createElement("a",{className:"btn btn-link info-link font-semibold",href:x,target:"_blank"},e.classroomIdeasText)))}var R=a(81886),M=a(11607),P=a(89965),L=a(10874),A=a(83914),F=a(76177),G=a(86764),D=a(69883),H=a(299),j=a(3747),_=a(34509),Z=a(36848),B=a(36511);function V(e){var t;return e.group?n.createElement("div",{className:"classroom-pill text-white bg-".concat((0,B.I)(null===(t=e.group.metadata)||void 0===t?void 0:t.colour))},e.group.name):n.createElement(n.Fragment,null)}function X(e){return e.count?n.createElement(M.L,{onClick:e.onClick,className:"classroom-pill bg-white border border-dark"},"+",e.count):n.createElement(n.Fragment,null)}var W="classrooms.classroomGroupDropdown",Y=function(e,t){return{application:S.O.CLASSROOMS,action:E.e.Classrooms.NEW_GROUP,args:[e],params:{addStudents:t.map((function(e){return e.id}))}}},q=function(e,t){return e.filter((function(e){return t.users.data.find((function(t){return t.id.toString()===e.id.toString()}))})).length};function Q(e){var t,a=(0,H.X)(e.groups,{preselectedIds:e.preselections.map((function(e){return e.id}))}),r=a.onToggleItem,s=a.isChecked;n.useEffect((function(){e.groups.forEach((function(t){var a=q(e.selectedStudents,t);(!a||a!==e.selectedStudents.length||s(t.id))&&(a||!s(t.id))||r(t.id)}))}));var c={align:e.alignRight?"end":"start"};return e.disabled&&(c.show=!1),n.createElement(_.Z,Object.assign({},c),n.createElement(_.Z.Toggle,{as:"div",id:e.id,className:"".concat(e.disabled?"text-light":"cursor-pointer"," ").concat("me-2 d-inline-block svg-container sm"," no-caret")},n.createElement(A.x,{svgName:y.vn.Group,title:e.disabled?e.disabledTooltips:o.T.getPhrase(W,"addToGroupTooltip"),tooltipPlacement:"top",tooltipSpanHack:!0,tooltipSpanHackClassName:""})),n.createElement(_.Z.Menu,null,!!(null===(t=e.groups)||void 0===t?void 0:t.length)&&n.createElement("div",{className:"px-2 border-bottom mb-1"},n.createElement("p",{className:"mb-0"},n.createElement(b.x,{namespace:W,phrase:"addToGroup"})),n.createElement("ul",{className:"list-unstyled pe-3"},e.groups.map((function(t){return n.createElement("li",{key:t.id,className:"d-flex align-items-center bg-white my-1"},n.createElement(P.X,{id:"".concat(e.id,":").concat(t.id),checked:s(t.id),onChange:function(){return function(t){var a=!s(t.id);e.onSelectGroup(t,a),r(t.id)}(t)},indeterminate:!!q(e.selectedStudents,t)}),n.createElement(V,{group:t}))})))),n.createElement(Z.F,{onClick:function(){e.disabled||l.k.logUserAction({},l.k.mergeOptions(e.analyticsOptions,{actionType:i.Vw.Create,workflowPhase:i.eu.Start,entity:i.py.ClassroomGroup}))},appLink:Y(e.classroom.id,e.selectedStudents),className:e.disabled?"disabled":"text-nowrap d-flex align-items-center px-2"},n.createElement(A.x,{svgName:y.vn.Plus}),n.createElement(b.x,{namespace:W,phrase:"createNew"}))))}Q.defaultProps={preselections:[]};var $=a(91967),z=a(83657),J=a(20789),K=a(10038),ee=a(64818);const te={avatarContainer:"rfVnC",name:"RYLWZ"};function ae(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,r,o,s,l=[],i=!0,c=!1;try{if(o=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;i=!1}else for(;!(i=(n=o.call(a)).done)&&(l.push(n.value),l.length!==t);i=!0);}catch(e){c=!0,r=e}finally{try{if(!i&&null!=a.return&&(s=a.return(),Object(s)!==s))return}finally{if(c)throw r}}return l}}(e,t)||ne(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 ne(e,t){if(e){if("string"==typeof e)return re(e,t);var a={}.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?re(e,t):void 0}}function re(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=Array(t);a<t;a++)n[a]=e[a];return n}var oe=o.T.encloseNamespace("classrooms.manageClassroomStudentItem"),se=function(e){return{application:S.O.USER_MANAGER,action:E.e.UserManager.EDIT_USER,args:[e],params:{userType:m.Y.Learner}}},le=function(e,t){return{application:S.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_STUDENTS,args:[t],params:{studentIds:[e]}}};function ie(e){var t,a=ae(n.useState(!1),2),r=a[0],o=a[1],s=ae(n.useState(!1),2),c=s[0],d=s[1],m=ae(n.useState({}),2),p=m[0],g=m[1],v=n.useRef(null),E=n.useRef(null),S=(0,f.T)().hasPermissions;n.useEffect((function(){y(),c||o(!0)}),[e.selectedGroups.length]);var h,b=$.q.throttle((function(){y(),o(!0)}),300);function y(){g(e.selectedGroups.reduce((function(e,t){return e[t.id]=!0,e}),{}))}return(0,K.H)((function(){c||b()})),n.useEffect((function(){if(v.current&&E.current&&r){var e=v.current.firstElementChild;if(e){var t,a,n=e.getBoundingClientRect().y,s={},l=function(e,t){var a="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!a){if(Array.isArray(e)||(a=ne(e))){a&&(e=a);var n=0,r=function(){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,l=!1;return{s:function(){a=a.call(e)},n:function(){var e=a.next();return s=e.done,e},e:function(e){l=!0,o=e},f:function(){try{s||null==a.return||a.return()}finally{if(l)throw o}}}}(v.current.children);try{for(l.s();!(a=l.n()).done;){var i=a.value;i.id&&(s[i.id]=i.getBoundingClientRect().y===n,t=s[i.id]?i.id:t)}}catch(e){l.e(e)}finally{l.f()}E.current.getBoundingClientRect().y!==n&&(s[t]=!1),g(s),o(!1)}}}),[r]),n.createElement("div",{className:"d-flex align-items-center py-1 px-4"},n.createElement(P.X,{id:e.student.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),n.createElement("div",{className:"".concat(te.avatarContainer," me-2")},n.createElement(J.q,{imageCdnUrl:e.config.imageCdnUrl,initials:ee.l.getInitials(e.student.name,e.student.surname),imageUrl:null===(t=e.student.avatar)||void 0===t?void 0:t.url})),n.createElement("p",{className:"me-2 ".concat(te.name," text-truncate mb-0 text-nowrap")},e.student.name," ",e.student.surname),n.createElement("div",{className:"".concat(r?"invisible":""," me-auto d-flex flex-wrap mt-n1"),ref:v},e.selectedGroups.map((function(e){return p[e.id]?n.createElement("div",{key:e.id,className:"me-1 mt-1",id:e.id},n.createElement(V,{group:e})):n.createElement(n.Fragment,{key:e.id})})),n.createElement("div",{ref:E,className:"me-1 mt-1"},n.createElement(X,{count:Object.keys(p).reduce((function(e,t){return p[t]||e++,e}),0),onClick:function(){d(!0),y()}}))),n.createElement(Q,{id:"add-group-".concat(e.student.id),classroom:e.classroom,groups:e.classroomGroups,selectedStudents:[e.student],preselections:e.selectedGroups,onSelectGroup:function(t,a){return e.onToggleGroup(e.student,t,a)},analyticsOptions:{location:i.LZ.ManageClassroomStudentListItem},alignRight:!0,disabled:e.readOnly,disabledTooltips:e.readOnlyTooltip}),n.createElement(z.e,{actions:(h=[],S(u.C.ManageUsers)&&h.push({label:oe("editStudent"),appLink:se(e.student.id),disabled:e.readOnly,className:e.readOnly?"disabled":"",tooltip:e.readOnly?e.readOnlyTooltip:"",onClick:function(){l.k.logUserAction({id:e.student.id},{actionType:i.Vw.Edit,entity:i.py.User,workflowPhase:i.eu.Start,location:i.LZ.ManageClassroomStudentListItem})}}),h.push({label:oe("removeStudent"),appLink:le(e.student.id,e.classroom.id),disabled:e.readOnly,className:e.readOnly?"disabled":"text-danger",tooltip:e.readOnly?e.readOnlyTooltip:"",onClick:function(){l.k.logUserAction({id:e.classroom.id,userId:e.student.id},{actionType:i.Vw.Dissociate,entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,location:i.LZ.ManageClassroomStudentListItem})}}),h),actionsDropdownClassName:"btn"}))}var ce=a(88630),de="classrooms.manageClassroomStudents",ue=o.T.encloseNamespace(de);function me(e){var t,a=e.classroom,c=e.students,d=e.groups,u=(0,r.I0)(),m=(0,D.Z)(),p=(0,H.X)(c.data),g=p.getSelected().length,f=d.filter((function(e){var t,a;if(!(null===(a=null===(t=e.users)||void 0===t?void 0:t.data)||void 0===a?void 0:a.length))return!1;var n=!0,r=0,o=p.getSelected();if(o.length){var s=function(){var t=o[r];e.users.data.find((function(e){return e.id.toString()===t.toString()}))||(n=!1),r++};do{s()}while(r<o.length);return n}})),v=(0,j.a)(G.r.XLDown);return(null===(t=c.data)||void 0===t?void 0:t.length)?n.createElement(n.Fragment,null,n.createElement("div",{className:"d-flex align-items-center py-2 ".concat(v?"ps-2":"ps-4")},n.createElement(P.X,{id:"manage-classroom-students-bulk",onChange:p.onToggleBulk,checked:p.bulkChecked,className:"me-2",indeterminate:p.hasSomeSelections(),disabled:e.readOnly}),n.createElement(Q,{id:"bulk-add-group",classroom:a,selectedStudents:p.getSelected().map((function(t){return e.students.data.find((function(e){return e.id.toString()===t.toString()}))})),groups:d,onSelectGroup:function(e,t){var n=p.getSelected(),r=t?ce.F.addStudentsToGroup:ce.F.removeStudentsFromGroup;s.a.fetch(u,r(n,e.id,a.id,(function(){l.k.logUserAction({id:e.id,studentCount:n.length},{actionType:i.Vw.Associate,entity:i.py.ClassroomGroup,descriptor:i.iF.User,workflowPhase:i.eu.Complete,location:i.LZ.ManageClassroomStudents}),m.success(ue("addSuccess",{groupName:e.name,escapeText:!0}))}),(function(){m.error(ue("addError",{groupName:e.name,escapeText:!0}))})))},disabled:!g||e.readOnly,preselections:f,analyticsOptions:{location:i.LZ.ManageClassroomStudents},disabledTooltips:e.readOnly&&o.T.getPhrase(de,"disabledByRostering")}),n.createElement(M.L,{className:"me-auto ".concat(!g||e.readOnly?"text-light cursor-default":""),onClick:function(){if(g&&!e.readOnly){var t=p.getSelected();l.k.logUserAction({id:a.id,studentCount:t.length},{entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,actionType:i.Vw.Dissociate,location:i.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:S.O.CLASSROOMS,action:E.e.Classrooms.REMOVE_STUDENTS,args:[a.id],params:{studentIds:t}})}}},n.createElement(F.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(de,"disabledByRostering"):""},n.createElement(A.x,{svgName:y.vn.Delete,title:o.T.getPhrase(de,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0}))),n.createElement(F.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(de,"disabledByRostering"):""},n.createElement(L.h,{onClick:function(){l.k.logUserAction({id:a.id},{entity:i.py.Classroom,descriptor:i.iF.User,workflowPhase:i.eu.Start,actionType:i.Vw.Associate,location:i.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:S.O.CLASSROOMS,action:E.e.Classrooms.ADD_STUDENTS_CHOICES,args:[a.id]})},svgName:y.vn.Plus,className:"btn btn-outline-dark",disabled:e.readOnly},n.createElement(b.x,{namespace:de,phrase:"addStudent"})))),n.createElement("ul",{className:"striped-list list-unstyled"},c.data.map((function(t){return n.createElement("li",{key:t.id},n.createElement(ie,{classroom:a,student:t,classroomGroups:e.groups,config:e.config,selectedGroups:e.groups.filter((function(e){return e.users.data.find((function(e){return e.id===t.id}))})),checked:p.isChecked(t.id),onToggleCheckbox:function(){return p.onToggleItem(t.id)},onToggleGroup:e.onToggleGroup,readOnly:e.readOnly,readOnlyTooltip:e.readOnly?ue("disabledByRostering"):""}))})))):n.createElement(I,{classroom:e.classroom,classroomIdeasText:ue("classroomIdeasText"),schoolHasNoStudents:e.schoolHasNoStudents,canManageUsers:e.canManageUsers})}var pe=a(49935),ge=a(5062);const fe="pJf6R",ve="MSvzY",Ee="IFmvc",Se="pOcvk";var he=n.memo((function(){return n.createElement("div",{className:"px-3"},n.createElement("div",{className:"mb-1 partial-loading-background ".concat("YrP_G")}),n.createElement("div",{className:"pb-3"},n.createElement(pe.b2,{numItems:2})),n.createElement("div",{className:"pb-2"},n.createElement(ge.Z,null)),n.createElement("div",{className:"d-flex align-items-center py-2"},n.createElement("div",{className:"mx-4 partial-loading-background ".concat(fe)}),n.createElement("div",{className:"me-2 partial-loading-background ".concat(ve)}),n.createElement("div",{className:"me-auto partial-loading-background ".concat(ve)}),n.createElement("div",{className:"partial-loading-background ".concat("j62jt")})),n.createElement("ul",{className:"striped-list list-unstyled"},Array(20).fill(null).map((function(e,t){return n.createElement("li",{key:t},n.createElement("div",{className:"d-flex align-items-center py-1 px-4"},n.createElement("div",{className:"me-2 partial-loading-background ".concat(fe)}),n.createElement("div",{className:"me-2 partial-loading-background ".concat("droqZ")}),n.createElement("div",{className:"w-25"},n.createElement("div",{className:"partial-loading-background ".concat("gorcb")})),n.createElement("div",{className:"me-auto d-flex"},Math.random()>.5?n.createElement(n.Fragment,null,n.createElement("div",{className:"partial-loading-background rounded-pill me-1 ".concat(Ee," ").concat("SdQ90")}),n.createElement("div",{className:"partial-loading-background rounded-pill ".concat(Ee," ").concat(Se)})):n.createElement("div",{className:"partial-loading-background rounded-pill ".concat(Ee," ").concat(Se)})),n.createElement("div",{className:"me-2 partial-loading-background ".concat(ve)}),n.createElement("div",{className:"partial-loading-background ".concat("S7p4K")})))}))))})),be=a(31491),ye=a(5289),ke=a(47288),Ce=o.T.encloseNamespace("classrooms.classroomStudents"),Ne={entity:i.py.ClassroomGroup,descriptor:i.iF.User,workflowPhase:i.eu.Complete,location:i.LZ.ManageClassroomStudentListItem};function Te(e){var t,a,o,h,b,y,k,C,N,T=s.a.useBasicFetch(g.N.currentUser()),O=s.a.useBasicFetch(T.data&&ce.F.getClassroom(e.id,T.data.id)),x=s.a.useBasicFetch(ce.F.getClassroomStudents(e.id,e.cursor)),w=s.a.useBasicFetch(T.data&&ke.N.getUsers(T.data.customerId,m.Y.Learner)),R=s.a.useBasicFetch(ce.F.getClassroomGroups(e.id)),M=s.a.useBasicFetch(p.L.config()),P=null===(a=null===(t=O.data)||void 0===t?void 0:t._integrations)||void 0===a?void 0:a.rostered,L=(0,r.I0)(),A=(0,f.T)().hasPermissions;function F(t,a,n){var r={id:a.id,studentCount:1},o=n?ce.F.addStudentsToGroup([t.id],a.id,e.id,(function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ne),{actionType:i.Vw.Associate}))})):ce.F.removeStudentsFromGroup([t.id],a.id,e.id,(function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ne),{actionType:i.Vw.Dissociate}))}));s.a.fetch(L,o)}return(0,v.M)({title:Ce("pageTitle",{classroomName:null===(o=O.data)||void 0===o?void 0:o.name})}),(0,be._)(O),O.data&&(null===(h=x.data)||void 0===h?void 0:h.data)&&(null===(b=R.data)||void 0===b?void 0:b.data)&&M.data&&w.data?n.createElement(ye.R,{classroom:O.data,currentUser:T.data,onTogglePin:function(e,t,a){if(!P){var n=e?ce.F.pinClassroom:ce.F.unpinClassroom;s.a.fetch(L,n(O.data,t,a))}},activeTab:"students",isRostered:P},function(){var e,t,a,r,o,s,l,i,c,m;return P?n.createElement(n.Fragment,null,n.createElement(d.P,{type:"classroom"}),(null===(t=null===(e=x.data)||void 0===e?void 0:e.data)||void 0===t?void 0:t.length)?n.createElement(me,{classroom:O.data,students:x.data,groups:R.data.data,onToggleGroup:F,config:M.data,schoolHasNoStudents:!(null===(r=null===(a=w.data)||void 0===a?void 0:a.data)||void 0===r?void 0:r.length),canManageUsers:A(u.C.ManageUsers),readOnly:!0}):n.createElement(U,null)):(null===(s=null===(o=x.data)||void 0===o?void 0:o.data)||void 0===s?void 0:s.length)?n.createElement(me,{classroom:O.data,students:x.data,groups:R.data.data,onToggleGroup:F,config:M.data,schoolHasNoStudents:!(null===(i=null===(l=w.data)||void 0===l?void 0:l.data)||void 0===i?void 0:i.length),canManageUsers:A(u.C.ManageUsers)}):n.createElement(I,{classroom:O.data,classroomIdeasText:Ce("classroomIdeasText"),schoolHasNoStudents:!(null===(m=null===(c=w.data)||void 0===c?void 0:c.data)||void 0===m?void 0:m.length),canManageUsers:A(u.C.ManageUsers)})}(),!!(null===(k=null===(y=x.data)||void 0===y?void 0:y.pagination)||void 0===k?void 0:k.cursors)&&n.createElement(c.t,{appLink:{application:S.O.CLASSROOMS,action:E.e.Classrooms.CLASSROOM_STUDENTS,args:[e.id]},cursors:null===(N=null===(C=x.data)||void 0===C?void 0:C.pagination)||void 0===N?void 0:N.cursors,buttonVariant:"outline-dark",className:"py-2 float-end",scrollTop:!0,prevHack:!0})):n.createElement(he,null)}}}]);
2
+ //# sourceMappingURL=1285-f4b56a47c2-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/1285-086e83fddf-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/backbone/utils/ScrollHelper.ts","file:///app/packages/libs/shared/src/components/pagination/Pagination.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classrooms/empty-state/ClassroomsNoStudentsState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-pill/ClassroomGroupPill.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/manage-classroom-student-item.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/ManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/partial-manage-classroom-students.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-students/ClassroomStudentsView.tsx"],"sourcesContent":["import { Radio } from 'backbone';\n\nimport { CommonChannels } from '../constants/CommonChannels';\n\nexport const ScrollHelper = {\n // Will prevent scrolling to the top of the page when applinks are triggered\n preventScrollTop(): void {\n Radio.channel(CommonChannels.SHELL).trigger('prevent:scroll:top');\n }\n};","import * as React from 'react';\nimport { Button, ButtonProps } from 'react-bootstrap';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nfunction buildCursor(appLink: Core.AppLink, cursorParam: string, prevHack?: boolean): Core.AppLink {\n if (!cursorParam)\n return null;\n\n const currentParams = appLink.params as HashObject ?? {};\n /* \n Currently the pagination for My Videos shows the previous cursor in the first page cursor,\n so instead of using the previous cursor from the response, the current cursor is being passed\n as the previous cursor in the app link\n */\n\n if (prevHack) {\n if (!currentParams?.previous) {\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: null,\n previous: null\n }\n };\n }\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: currentParams?.previous,\n previous: null\n }\n };\n }\n\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: cursorParam,\n previous: currentParams.cursor\n }\n };\n}\n\ninterface CursorPaginationProps {\n cursors: Cursors;\n appLink?: Core.AppLink;\n className?: string;\n buttonVariant?: ButtonProps['variant'];\n prevHack?: boolean;\n scrollTop?: boolean;\n onClick?: (cursor: string) => void;\n}\n\nPagination.defaultProps = {\n className: 'py-2',\n buttonVariant: 'secondary'\n};\n\nexport function Pagination(\n { appLink, cursors, className, buttonVariant, prevHack, scrollTop, onClick }: CursorPaginationProps\n): JSX.Element {\n function onClickButton(page: 'next' | 'previous'): void {\n if (appLink && !scrollTop)\n ScrollHelper.preventScrollTop();\n\n AnalyticsHelper.logUserAction({ page }, {\n location: LocationContext.Pagination,\n entity: EntityType.Pagination,\n actionType: UserAction.Navigate\n });\n\n if (onClick)\n onClick(cursors[page]);\n }\n\n if (appLink) {\n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <AppLink\n appLink={buildCursor(appLink, cursors.previous, prevHack)}\n className={`btn btn-${buttonVariant} me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='previous' />\n </AppLink>\n \n <AppLink\n appLink={buildCursor(appLink, cursors.next)}\n className={`btn btn-${buttonVariant} ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='next' />\n </AppLink>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n }\n \n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <Button\n variant={buttonVariant}\n className={`me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n >\n <Text phrase='previous' />\n </Button>\n <Button\n variant={buttonVariant}\n className={`btn ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n >\n <Text phrase='next' />\n </Button>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text}&nbsp;\n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.classroomsEmptyState';\n\ninterface ClassroomsNoStudentsStateProps {\n canManageUsers: boolean;\n isRostering?: boolean;\n}\n\nexport function ClassroomsNoStudentsState(props: ClassroomsNoStudentsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='noStudentsHeading' /></EmptyState.Heading>\n <EmptyState.Info className={`w-33 ${!props.canManageUsers ? 'mb-0' : ''}`}>\n <Text phrase='noStudentsInfo' />\n </EmptyState.Info>\n\n {props.canManageUsers && !props.isRostering && (\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'noStudentsCta')}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS\n }}\n />\n )}\n {!props.canManageUsers && !props.isRostering && (\n <EmptyState.Info><Text phrase='askAdmin' /></EmptyState.Info>\n )}\n {props.isRostering && (\n <a className='btn btn-link info-link font-semibold' href={''} target='_blank'>\n {LanguageService.getPhrase(namespace, 'rosteringCta')}\n </a>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomsNoStudentsState } from 'apps/classrooms/views/classrooms/empty-state/ClassroomsNoStudentsState';\n\nconst namespace = 'classrooms.manageClassroomStudentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst STUDENT_ENGAGEMENT_IDEAS_LINK = 'https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf';\nconst ROSTERING_KB_ARTICLE_URL = '';\n\ninterface ManageClassroomStudentsEmptyStateProps {\n classroom: Classroom;\n classroomIdeasText: string;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n}\n\nexport function RosteredClassroomStudentsEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info className='mb-2' ><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n <a className='btn btn-link info-link font-semibold' href={ROSTERING_KB_ARTICLE_URL} target='_blank'>\n {getPhrase('rosteringCta')}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function ManageClassroomStudentsEmptyState(props: ManageClassroomStudentsEmptyStateProps): JSX.Element {\n if (props.schoolHasNoStudents)\n return <ClassroomsNoStudentsState canManageUsers={props.canManageUsers} />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='emptyStateInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addStudents')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [props.classroom.id]\n }}\n />\n\n <a className='btn btn-link info-link font-semibold' href={STUDENT_ENGAGEMENT_IDEAS_LINK} target='_blank'>\n {props.classroomIdeasText}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ClassroomGroup } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\n\ninterface ClassroomGroupProps {\n group: ClassroomGroup;\n}\n\nexport function ClassroomGroupPill(props: ClassroomGroupProps): JSX.Element {\n if (!props.group)\n return <></>;\n\n return (\n <div className={`classroom-pill text-white bg-${mapColourToBsVariant(props.group.metadata?.colour)}`}>\n {props.group.name}\n </div>\n );\n}\n\ninterface ClassroomGroupExpanderProps {\n count: number;\n onClick: () => void;\n}\n\nexport function ClassroomGroupExpander(props: ClassroomGroupExpanderProps): JSX.Element {\n if (!props.count)\n return <></>;\n\n return (\n <DivButton onClick={props.onClick} className={`classroom-pill bg-white border border-dark`}>\n +{props.count}\n </DivButton>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { PropsWithAnalyticsOptions, User } from 'libs/shared/interfaces';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nconst namespace = 'classrooms.classroomGroupDropdown';\n\nconst getNewGroupAppLink = (id: string, students: User[]) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_GROUP,\n args: [id],\n params: {\n addStudents: students.map(s => s.id)\n }\n});\n\nconst getCheckedStudentsForGroup = (students: User[], group: ClassroomGroup) => {\n const studentsInGroup = students.filter(student => {\n return group.users.data.find(u => u.id.toString() === student.id.toString());\n });\n\n return studentsInGroup.length;\n};\n\ntype ClassroomGroupDropdownProps = PropsWithAnalyticsOptions<{\n id: string;\n classroom: Classroom;\n selectedStudents: User[];\n groups: ClassroomGroup[];\n onSelectGroup: (group: ClassroomGroup, toggleOn?: boolean) => void;\n preselections?: ClassroomGroup[];\n\n alignRight?: boolean;\n disabled?: boolean;\n disabledTooltips?: string;\n}>;\n\nClassroomGroupDropdown.defaultProps = {\n preselections: []\n};\n\nexport function ClassroomGroupDropdown(props: ClassroomGroupDropdownProps): JSX.Element {\n const { onToggleItem, isChecked } = useBulkCheckboxManager(props.groups, {\n preselectedIds: props.preselections.map(s => s.id)\n });\n\n function onChange(group: ClassroomGroup): void {\n const shouldAdd = !isChecked(group.id);\n props.onSelectGroup(group, shouldAdd);\n\n onToggleItem(group.id);\n }\n\n function onClickCreateNewGroup(): void {\n if (props.disabled)\n return;\n\n AnalyticsHelper.logUserAction({}, AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Start,\n entity: EntityType.ClassroomGroup\n }));\n }\n\n React.useEffect(() => {\n // On each passthrough, validate that the checkbox states are valid\n // This is needed because the group/student state is managed in 2 separate places on the same page\n props.groups.forEach(g => {\n const totalCheckedForGroup = getCheckedStudentsForGroup(props.selectedStudents, g);\n\n // Validate if unchecked checkbox should be checked\n if (!!totalCheckedForGroup && totalCheckedForGroup === props.selectedStudents.length && !isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n\n // Validate if checked checkbox should be unchecked\n if (!totalCheckedForGroup && isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n });\n });\n\n const buttonClasses = 'me-2 d-inline-block svg-container sm';\n\n const dropdownProps: HashObject = {\n align: props.alignRight ? 'end' : 'start'\n };\n\n /**\n * This prop is applied like this so that when `props.disabled` it false, the prop is omitted altogether.\n * This is because we want `react-bootstrap` to control the open state, and if we used the `show` prop\n * at all times we'd be preventing that.\n */\n if (props.disabled)\n dropdownProps.show = false;\n\n return (\n <Dropdown {...dropdownProps}>\n <Dropdown.Toggle\n as='div'\n id={props.id}\n className={`${props.disabled ? 'text-light' : 'cursor-pointer'} ${buttonClasses} no-caret`}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Group}\n title={props.disabled ? props.disabledTooltips : LanguageService.getPhrase(namespace, 'addToGroupTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName=''\n />\n </Dropdown.Toggle>\n <Dropdown.Menu>\n {!!props.groups?.length && (\n <div className='px-2 border-bottom mb-1'>\n <p className='mb-0'><Text namespace={namespace} phrase='addToGroup' /></p>\n <ul className='list-unstyled pe-3'>\n {props.groups.map(group => (\n <li key={group.id} className='d-flex align-items-center bg-white my-1'>\n <Checkbox\n id={`${props.id}:${group.id}`}\n checked={isChecked(group.id)}\n onChange={() => onChange(group)}\n indeterminate={!!getCheckedStudentsForGroup(props.selectedStudents, group)}\n />\n <ClassroomGroupPill group={group} />\n </li>\n ))}\n </ul>\n </div>\n )}\n <AppLink\n onClick={onClickCreateNewGroup}\n appLink={getNewGroupAppLink(props.classroom.id, props.selectedStudents)}\n className={props.disabled ? 'disabled' : 'text-nowrap d-flex align-items-center px-2'}\n >\n <SvgContainer svgName={cvSvgLibrary.Plus} />\n <Text namespace={namespace} phrase='createNew' />\n </AppLink>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"rfVnC\",\"name\":\"RYLWZ\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions as MoreActions } from 'libs/shared/components/actions/Actions';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { ClassroomGroup, Config } from 'libs/shared/interfaces';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ClassroomGroupExpander, ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nimport styles from './manage-classroom-student-item.scss';\n\ntype GroupVisibilityMapping = { [id: string]: boolean };\n\nconst namespace = 'classrooms.manageClassroomStudentItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getEditStudentAppLink = (id: string) => ({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.EDIT_USER,\n args: [id],\n params: { userType: UserGroup.Learner }\n});\n\nconst getRemoveStudentsAppLink = (studentId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroomId],\n params: {\n studentIds: [studentId]\n }\n});\n\ninterface ManageClassroomStudentItemProps {\n classroom: Classroom;\n student: User;\n classroomGroups: ClassroomGroup[];\n selectedGroups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n onToggleCheckbox: () => void;\n checked: boolean;\n readOnly?: boolean;\n readOnlyTooltip?: string;\n}\n\nexport function ManageClassroomStudentItem(props: ManageClassroomStudentItemProps): JSX.Element {\n const [ isComputingTruncation, setIsComputingTruncation ] = React.useState(false);\n const [ hasExpandedGroups, setHasExpandedGroups ] = React.useState(false);\n\n // Maps a group to it's visibility state.\n const [ groupVisibilityMapping, setGroupVisibilityMapping ] = React.useState<GroupVisibilityMapping>({});\n\n const groupListRef = React.useRef<HTMLDivElement>(null);\n const expanderRef = React.useRef<HTMLDivElement>(null);\n\n const { hasPermissions } = usePermissions();\n\n // Every time the selected groups array changes, we want to re-compute which groups should be truncated\n React.useEffect(() => {\n renderAllGroups();\n\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n setIsComputingTruncation(true);\n }, [props.selectedGroups.length]);\n\n function onResize(): void {\n renderAllGroups();\n setIsComputingTruncation(true);\n }\n\n const throttledResizeListener = FunctionHelper.throttle(onResize, 300);\n\n useResizeListener(() => {\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n throttledResizeListener();\n });\n\n /**\n * This iterates through each group element, and detects if any of them don't\n * fit on the first row of items. The elements that don't will be hidden.\n */\n React.useEffect(() => {\n if (!groupListRef.current || !expanderRef.current || !isComputingTruncation)\n return;\n\n const firstGroupPill = groupListRef.current.firstElementChild as HTMLDivElement;\n if (!firstGroupPill) return;\n\n const topRowHeight = firstGroupPill.getBoundingClientRect().y;\n\n const nextGroupVisibilityMapping: { [id: string]: boolean } = {};\n\n /**\n * Here we're checking if the y-coordinate of any groups\n * don't match the y-coordinate of the first group (which should\n * always be on the first row). This way we know if they should be\n * hidden or not.\n */\n let lastVisibleId: string;\n for (const child of groupListRef.current.children) {\n if (child.id) {\n nextGroupVisibilityMapping[child.id] = child.getBoundingClientRect().y === topRowHeight;\n lastVisibleId = nextGroupVisibilityMapping[child.id] ? child.id : lastVisibleId;\n }\n }\n\n // If the expander button has also wrapped, we hide the last element that we were going to make visible.\n if (expanderRef.current.getBoundingClientRect().y !== topRowHeight)\n nextGroupVisibilityMapping[lastVisibleId] = false;\n\n setGroupVisibilityMapping(nextGroupVisibilityMapping);\n setIsComputingTruncation(false);\n }, [isComputingTruncation]);\n\n function onClickShowAllGroups(): void {\n setHasExpandedGroups(true);\n renderAllGroups();\n }\n\n // Updates the group visibility mapping to display all groups\n function renderAllGroups(): void {\n setGroupVisibilityMapping(props.selectedGroups.reduce((acc, group) => {\n acc[group.id] = true;\n return acc;\n }, {} as GroupVisibilityMapping));\n }\n\n // Returns the number of groups that are invisible\n function getInvisibleGroupCount(): number {\n return Object.keys(groupVisibilityMapping).reduce((count, groupId) => {\n if (!groupVisibilityMapping[groupId])\n count++;\n \n return count;\n }, 0);\n }\n\n function getActions(): ActionOptions[] {\n const actions: ActionOptions[] = [];\n\n if (hasPermissions(PermissionName.ManageUsers))\n actions.push({\n label: getPhrase('editStudent'),\n appLink: getEditStudentAppLink(props.student.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : '',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({ id: props.student.id }, {\n actionType: UserAction.Edit,\n entity: EntityType.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n actions.push({\n label: getPhrase('removeStudent'),\n appLink: getRemoveStudentsAppLink(props.student.id, props.classroom.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : 'text-danger',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({ id: props.classroom.id, userId: props.student.id }, {\n actionType: UserAction.Dissociate,\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n return actions;\n }\n\n return (\n <div className='d-flex align-items-center py-1 px-4'>\n <Checkbox\n id={props.student.id}\n checked={props.checked}\n onChange={props.onToggleCheckbox}\n className='me-2'\n disabled={props.readOnly}\n />\n\n <div className={`${styles.avatarContainer} me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.student.name, props.student.surname)}\n imageUrl={props.student.avatar?.url}\n />\n </div>\n\n <p className={`me-2 ${styles.name} text-truncate mb-0 text-nowrap`}>{props.student.name} {props.student.surname}</p>\n\n <div\n // When we are computing the truncation, we want all group elements to be rendered but invisible.\n className={`${isComputingTruncation ? 'invisible' : ''} me-auto d-flex flex-wrap mt-n1`}\n ref={groupListRef}\n >\n {props.selectedGroups.map(group => {\n if (!groupVisibilityMapping[group.id]) // Don't render any groups that are marked as hidden\n return <React.Fragment key={group.id}></React.Fragment>;\n\n return (\n <div key={group.id} className='me-1 mt-1' id={group.id}>\n <ClassroomGroupPill group={group} />\n </div>\n );\n })}\n <div ref={expanderRef} className='me-1 mt-1'>\n <ClassroomGroupExpander count={getInvisibleGroupCount()} onClick={onClickShowAllGroups} />\n </div>\n </div>\n\n <ClassroomGroupDropdown\n id={`add-group-${props.student.id}`}\n classroom={props.classroom}\n groups={props.classroomGroups}\n selectedStudents={[props.student]}\n preselections={props.selectedGroups}\n onSelectGroup={(group, toggleOn) => props.onToggleGroup(props.student, group, toggleOn)}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudentListItem }}\n alignRight\n disabled={props.readOnly}\n disabledTooltips={props.readOnlyTooltip}\n />\n\n <MoreActions\n actions={getActions()}\n actionsDropdownClassName='btn'\n />\n </div>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classroom, Config } from 'libs/shared/interfaces';\nimport { ClassroomGroup, User, UserCollection } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ManageClassroomStudentItem } from 'apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nimport { ManageClassroomStudentsEmptyState } from './empty-state/ManageClassroomStudentsEmptyState';\n\nconst namespace = 'classrooms.manageClassroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ManageClassroomStudentsProps {\n classroom: Classroom;\n students: UserCollection;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n groups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n readOnly?: boolean;\n}\n\nexport function ManageClassroomStudents(props: ManageClassroomStudentsProps): JSX.Element {\n const { classroom, students, groups } = props;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const CheckboxHelper = useBulkCheckboxManager(students.data);\n const selectionCount = CheckboxHelper.getSelected().length;\n\n const bulkPreselections = groups.filter(group => {\n if (!group.users?.data?.length)\n return false;\n\n let allStudentsFound = true;\n let index = 0;\n\n const studentIds = CheckboxHelper.getSelected();\n\n if (!studentIds.length)\n return;\n\n do {\n const id = studentIds[index];\n if (!group.users.data.find((stu: any) => stu.id.toString() === id.toString()))\n allStudentsFound = false;\n\n index++;\n } while (index < studentIds.length);\n\n return allStudentsFound;\n });\n\n function onClickAddStudents(): void {\n AnalyticsHelper.logUserAction({ id: classroom.id }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Associate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [classroom.id]\n });\n }\n\n function onClickBulkRemoveStudents(): void {\n if (!selectionCount || props.readOnly)\n return;\n\n const studentIds = CheckboxHelper.getSelected();\n\n AnalyticsHelper.logUserAction({\n id: classroom.id,\n studentCount: studentIds.length\n }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Dissociate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroom.id],\n params: {\n studentIds\n }\n });\n }\n\n function onSelectGroup(group: ClassroomGroup, shouldAdd: boolean): void {\n const selectedStudentIds = CheckboxHelper.getSelected();\n\n const request = shouldAdd ? ClassroomRequests.addStudentsToGroup : ClassroomRequests.removeStudentsFromGroup;\n\n Flight.fetch(\n dispatch,\n request(selectedStudentIds, group.id, classroom.id, () => {\n AnalyticsHelper.logUserAction({\n id: group.id,\n studentCount: selectedStudentIds.length\n }, {\n actionType: UserAction.Associate,\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudents\n });\n\n alerts.success(getPhrase('addSuccess', { groupName: group.name, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('addError', { groupName: group.name, escapeText: true }));\n })\n );\n }\n\n const edgeToEdge = useMediaQuery(MediaQueryStrings.XLDown);\n\n if (!students.data?.length) {\n return (\n <ManageClassroomStudentsEmptyState\n classroom={props.classroom}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={props.schoolHasNoStudents}\n canManageUsers={props.canManageUsers}\n />\n );\n }\n\n return (\n <>\n <div className={`d-flex align-items-center py-2 ${edgeToEdge ? 'ps-2' : 'ps-4'}`}>\n <Checkbox\n id='manage-classroom-students-bulk'\n onChange={CheckboxHelper.onToggleBulk}\n checked={CheckboxHelper.bulkChecked}\n className='me-2'\n indeterminate={CheckboxHelper.hasSomeSelections()}\n disabled={props.readOnly}\n />\n\n <ClassroomGroupDropdown\n id='bulk-add-group'\n classroom={classroom}\n selectedStudents={CheckboxHelper.getSelected().map(id => {\n return props.students.data.find(s => s.id.toString() === id.toString());\n })}\n groups={groups}\n onSelectGroup={onSelectGroup}\n disabled={!selectionCount || props.readOnly}\n preselections={bulkPreselections}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudents }}\n disabledTooltips={props.readOnly && LanguageService.getPhrase(namespace, 'disabledByRostering')}\n />\n <DivButton\n className={`me-auto ${!selectionCount || props.readOnly ? 'text-light cursor-default' : ''}`}\n onClick={onClickBulkRemoveStudents}\n >\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Delete}\n title={LanguageService.getPhrase(namespace, 'delete')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </Tooltip>\n </DivButton>\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <IconButton\n onClick={onClickAddStudents}\n svgName={cvSvgLibrary.Plus}\n className='btn btn-outline-dark'\n disabled={props.readOnly}\n >\n <Text namespace={namespace} phrase='addStudent' />\n </IconButton>\n </Tooltip>\n </div>\n\n <ul className='striped-list list-unstyled'>\n {students.data.map(student => (\n <li key={student.id}>\n <ManageClassroomStudentItem\n classroom={classroom}\n student={student}\n classroomGroups={props.groups}\n config={props.config}\n selectedGroups={props.groups.filter(g => g.users.data.find(u => u.id === student.id))}\n checked={CheckboxHelper.isChecked(student.id)}\n onToggleCheckbox={() => CheckboxHelper.onToggleItem(student.id)}\n onToggleGroup={props.onToggleGroup}\n readOnly={props.readOnly}\n readOnlyTooltip={props.readOnly ? getPhrase('disabledByRostering') : ''}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"YrP_G\",\"avatar\":\"droqZ\",\"checkbox\":\"pJf6R\",\"actionIcon\":\"MSvzY\",\"addStudents\":\"j62jt\",\"studentName\":\"gorcb\",\"group\":\"IFmvc\",\"sm\":\"pOcvk\",\"lg\":\"SdQ90\",\"moreActions\":\"S7p4K\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\n\nimport styles from './partial-manage-classroom-students.scss';\n\nexport const PartialManageClassroomStudents = React.memo(function(): JSX.Element {\n return (\n <div className='px-3'>\n {/* Heading */}\n <div className={`mb-1 partial-loading-background ${styles.heading}`} />\n\n {/* Breadcrumbs */}\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n {/* Pill tab selector */}\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n\n <div className='d-flex align-items-center py-2'>\n {/* Checkbox */}\n <div className={`mx-4 partial-loading-background ${styles.checkbox}`} />\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* Delete action */}\n <div className={`me-auto partial-loading-background ${styles.actionIcon}`} />\n\n {/* Add new students button */}\n <div className={`partial-loading-background ${styles.addStudents}`} />\n </div>\n\n {/* Students list */}\n <ul className='striped-list list-unstyled'>\n {Array(20).fill(null).map((student, i) => (\n <li key={i}>\n <div className='d-flex align-items-center py-1 px-4'>\n {/* Checkbox */}\n <div className={`me-2 partial-loading-background ${styles.checkbox}`} />\n\n {/* Avatar */}\n <div className={`me-2 partial-loading-background ${styles.avatar}`} />\n\n {/* Student name */}\n <div className='w-25'>\n <div className={`partial-loading-background ${styles.studentName}`} />\n </div>\n\n {/* Groups list. Randomly renders either 1 or 2 groups. Group widths are randomly generated */}\n <div className='me-auto d-flex'>\n {Math.random() > 0.5\n ? (\n <>\n <div className={`partial-loading-background rounded-pill me-1 ${styles.group} ${styles.lg}`} />\n <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n </>\n ) : <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n }\n </div>\n\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* More actions */}\n <div className={`partial-loading-background ${styles.moreActions}`} />\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n});","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, ClassroomGroup, ClassroomGroupCollection, Config, CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ManageClassroomStudentsEmptyState, RosteredClassroomStudentsEmptyState } from 'apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState';\nimport { ManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/ManageClassroomStudents';\nimport { PartialManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useHandleClassroomErrors } from 'apps/classrooms/hooks/useHandleClassroomErrors';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nconst namespace = 'classrooms.classroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst baseAnalyticsOptions = {\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudentListItem\n};\n\ninterface ClassroomStudentsViewProps {\n id: string;\n cursor: string;\n}\n\nexport function ClassroomStudentsView(props: ClassroomStudentsViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const students = Flight.useBasicFetch<UserCollection>(ClassroomRequests.getClassroomStudents(props.id));\n const allStudents = Flight.useBasicFetch<UserCollection>(currentUser.data &&\n UserManagerRequests.getUsers(currentUser.data.customerId, UserGroup.Learner, {}, props.cursor));\n const groups = Flight.useBasicFetch<ClassroomGroupCollection>(ClassroomRequests.getClassroomGroups(props.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const dispatch = useDispatch();\n const { hasPermissions } = usePermissions();\n\n useSetPageMetadata({\n title: getPhrase('pageTitle', { classroomName: classroom.data?.name })\n });\n useHandleClassroomErrors(classroom);\n\n function onToggleGroup(student: User, group: ClassroomGroup, toggleOn: boolean): void {\n const analyticsData = {\n id: group.id,\n studentCount: 1\n };\n\n const request = toggleOn\n ? ClassroomRequests.addStudentsToGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Associate\n });\n })\n : ClassroomRequests.removeStudentsFromGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Dissociate\n });\n });\n\n Flight.fetch(dispatch, request);\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n if (\n !classroom.data\n || !students.data?.data\n || !groups.data?.data\n || !config.data\n || !allStudents.data\n )\n return <PartialManageClassroomStudents />;\n\n return (\n <ClassroomLayout\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n activeTab='students'\n isRostered={isRostered}\n >\n {(() => {\n if (isRostered)\n return (\n <>\n <RosteringAlert type='classroom'/>\n {!students.data?.data?.length ? (\n <RosteredClassroomStudentsEmptyState />\n ) : (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={groups.data.data}\n onToggleGroup={onToggleGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n readOnly\n />\n )}\n </>\n );\n\n if (students.data?.data?.length) {\n return (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={groups.data.data}\n onToggleGroup={onToggleGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n }\n\n return (\n <ManageClassroomStudentsEmptyState\n classroom={classroom.data}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n })()}\n\n {!!students.data?.pagination?.cursors && (\n <Pagination\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.id]\n }}\n cursors={students.data?.pagination?.cursors}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n scrollTop\n />\n )}\n </ClassroomLayout>\n );\n}\n"],"names":["ScrollHelper","preventScrollTop","Radio","trigger","buildCursor","appLink","cursorParam","prevHack","currentParams","params","previous","application","action","args","cursor","Pagination","cursors","className","buttonVariant","scrollTop","onClick","onClickButton","page","location","entity","actionType","value","style","display","phrase","next","variant","defaultProps","getPhrase","RosteringAlert","props","text","type","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","current","clear","isChecked","item","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","id","set","map","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","keys","bulkChecked","deselectAll","hasSomeSelections","find","getSelectedCount","size","getMap","usePrevious","ref","mapColourToBsVariant","groupColour","namespace","ClassroomsNoStudentsState","EmptyState","src","ImageUrls","Text","canManageUsers","isRostering","LanguageService","href","target","STUDENT_ENGAGEMENT_IDEAS_LINK","ROSTERING_KB_ARTICLE_URL","RosteredClassroomStudentsEmptyState","ManageClassroomStudentsEmptyState","schoolHasNoStudents","icon","classroom","classroomIdeasText","ClassroomGroupPill","group","metadata","colour","name","ClassroomGroupExpander","count","DivButton","getNewGroupAppLink","students","addStudents","s","getCheckedStudentsForGroup","filter","student","users","data","u","ClassroomGroupDropdown","groups","preselections","g","totalCheckedForGroup","selectedStudents","dropdownProps","align","alignRight","disabled","show","Dropdown","as","SvgContainer","svgName","title","disabledTooltips","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","key","Checkbox","checked","onChange","shouldAdd","onSelectGroup","indeterminate","AppLink","AnalyticsHelper","analyticsOptions","workflowPhase","getEditStudentAppLink","userType","UserGroup","getRemoveStudentsAppLink","studentId","classroomId","studentIds","ManageClassroomStudentItem","isComputingTruncation","setIsComputingTruncation","hasExpandedGroups","setHasExpandedGroups","groupVisibilityMapping","setGroupVisibilityMapping","groupListRef","expanderRef","hasPermissions","usePermissions","renderAllGroups","selectedGroups","actions","throttledResizeListener","FunctionHelper","reduce","acc","firstGroupPill","firstElementChild","lastVisibleId","topRowHeight","getBoundingClientRect","y","nextGroupVisibilityMapping","children","child","onToggleCheckbox","readOnly","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","Object","groupId","classroomGroups","toggleOn","onToggleGroup","readOnlyTooltip","PermissionName","push","label","tooltip","userId","descriptor","actionsDropdownClassName","ManageClassroomStudents","dispatch","alerts","CheckboxHelper","selectionCount","bulkPreselections","allStudentsFound","index","stu","edgeToEdge","selectedStudentIds","request","ClassroomRequests","studentCount","success","groupName","escapeText","error","Tooltip","spanHack","IconButton","PartialManageClassroomStudents","numItems","PartialPillTabSelector","fill","Math","random","baseAnalyticsOptions","ClassroomStudentsView","currentUser","UserRequests","allStudents","UserManagerRequests","customerId","ConfigRequests","isRostered","_integrations","rostered","analyticsData","useSetPageMetadata","classroomName","useHandleClassroomErrors","ClassroomLayout","onTogglePin","shouldPin","onSuccess","onError","activeTab","pagination"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/1285-f4b56a47c2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/common/src/backbone/utils/ScrollHelper.ts","file:///app/packages/libs/shared/src/components/pagination/Pagination.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/hooks/usePrevious.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classrooms/empty-state/ClassroomsNoStudentsState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-pill/ClassroomGroupPill.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/manage-classroom-student-item.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/ManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/partial-manage-classroom-students.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-students/ClassroomStudentsView.tsx"],"sourcesContent":["import { Radio } from 'backbone';\n\nimport { CommonChannels } from '../constants/CommonChannels';\n\nexport const ScrollHelper = {\n // Will prevent scrolling to the top of the page when applinks are triggered\n preventScrollTop(): void {\n Radio.channel(CommonChannels.SHELL).trigger('prevent:scroll:top');\n }\n};","import * as React from 'react';\nimport { Button, ButtonProps } from 'react-bootstrap';\n\nimport { Cursors } from 'libs/common/backbone/interfaces';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nfunction buildCursor(appLink: Core.AppLink, cursorParam: string, prevHack?: boolean): Core.AppLink {\n if (!cursorParam)\n return null;\n\n const currentParams = appLink.params as HashObject ?? {};\n /* \n Currently the pagination for My Videos shows the previous cursor in the first page cursor,\n so instead of using the previous cursor from the response, the current cursor is being passed\n as the previous cursor in the app link\n */\n\n if (prevHack) {\n if (!currentParams?.previous) {\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: null,\n previous: null\n }\n };\n }\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: currentParams?.previous,\n previous: null\n }\n };\n }\n\n return {\n application: appLink.application,\n action: appLink.action,\n args: appLink.args,\n params: {\n ...currentParams,\n cursor: cursorParam,\n previous: currentParams.cursor\n }\n };\n}\n\ninterface CursorPaginationProps {\n cursors: Cursors;\n appLink?: Core.AppLink;\n className?: string;\n buttonVariant?: ButtonProps['variant'];\n prevHack?: boolean;\n scrollTop?: boolean;\n onClick?: (cursor: string) => void;\n}\n\nPagination.defaultProps = {\n className: 'py-2',\n buttonVariant: 'secondary'\n};\n\nexport function Pagination(\n { appLink, cursors, className, buttonVariant, prevHack, scrollTop, onClick }: CursorPaginationProps\n): JSX.Element {\n function onClickButton(page: 'next' | 'previous'): void {\n if (appLink && !scrollTop)\n ScrollHelper.preventScrollTop();\n\n AnalyticsHelper.logUserAction({ page }, {\n location: LocationContext.Pagination,\n entity: EntityType.Pagination,\n actionType: UserAction.Navigate\n });\n\n if (onClick)\n onClick(cursors[page]);\n }\n\n if (appLink) {\n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <AppLink\n appLink={buildCursor(appLink, cursors.previous, prevHack)}\n className={`btn btn-${buttonVariant} me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='previous' />\n </AppLink>\n \n <AppLink\n appLink={buildCursor(appLink, cursors.next)}\n className={`btn btn-${buttonVariant} ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n // make sure disabled button and clickable button looks the same\n style={{ display: 'inline-block' }}\n >\n <Text phrase='next' />\n </AppLink>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n }\n \n return (\n <LanguageNamespaceContext.Provider value='shared.pagination'>\n <div className={className}>\n <Button\n variant={buttonVariant}\n className={`me-1 ${!cursors.previous ? 'disabled' : ''}`}\n onClick={() => onClickButton('previous')}\n >\n <Text phrase='previous' />\n </Button>\n <Button\n variant={buttonVariant}\n className={`btn ${!cursors.next ? 'disabled' : ''}`}\n onClick={() => onClickButton('next')}\n >\n <Text phrase='next' />\n </Button>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text}&nbsp;\n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import React from 'react';\n\n// https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state\nexport function usePrevious<T>(value: T): T {\n const ref = React.useRef<T>();\n React.useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.classroomsEmptyState';\n\ninterface ClassroomsNoStudentsStateProps {\n canManageUsers: boolean;\n isRostering?: boolean;\n}\n\nexport function ClassroomsNoStudentsState(props: ClassroomsNoStudentsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='noStudentsHeading' /></EmptyState.Heading>\n <EmptyState.Info className={`w-33 ${!props.canManageUsers ? 'mb-0' : ''}`}>\n <Text phrase='noStudentsInfo' />\n </EmptyState.Info>\n\n {props.canManageUsers && !props.isRostering && (\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'noStudentsCta')}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS\n }}\n />\n )}\n {!props.canManageUsers && !props.isRostering && (\n <EmptyState.Info><Text phrase='askAdmin' /></EmptyState.Info>\n )}\n {props.isRostering && (\n <a className='btn btn-link info-link font-semibold' href={''} target='_blank'>\n {LanguageService.getPhrase(namespace, 'rosteringCta')}\n </a>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomsNoStudentsState } from 'apps/classrooms/views/classrooms/empty-state/ClassroomsNoStudentsState';\n\nconst namespace = 'classrooms.manageClassroomStudentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst STUDENT_ENGAGEMENT_IDEAS_LINK = 'https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf';\nconst ROSTERING_KB_ARTICLE_URL = '';\n\ninterface ManageClassroomStudentsEmptyStateProps {\n classroom: Classroom;\n classroomIdeasText: string;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n}\n\nexport function RosteredClassroomStudentsEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info className='mb-2' ><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n <a className='btn btn-link info-link font-semibold' href={ROSTERING_KB_ARTICLE_URL} target='_blank'>\n {getPhrase('rosteringCta')}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function ManageClassroomStudentsEmptyState(props: ManageClassroomStudentsEmptyStateProps): JSX.Element {\n if (props.schoolHasNoStudents)\n return <ClassroomsNoStudentsState canManageUsers={props.canManageUsers} />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='emptyStateInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addStudents')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [props.classroom.id]\n }}\n />\n\n <a className='btn btn-link info-link font-semibold' href={STUDENT_ENGAGEMENT_IDEAS_LINK} target='_blank'>\n {props.classroomIdeasText}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ClassroomGroup } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\n\ninterface ClassroomGroupProps {\n group: ClassroomGroup;\n}\n\nexport function ClassroomGroupPill(props: ClassroomGroupProps): JSX.Element {\n if (!props.group)\n return <></>;\n\n return (\n <div className={`classroom-pill text-white bg-${mapColourToBsVariant(props.group.metadata?.colour)}`}>\n {props.group.name}\n </div>\n );\n}\n\ninterface ClassroomGroupExpanderProps {\n count: number;\n onClick: () => void;\n}\n\nexport function ClassroomGroupExpander(props: ClassroomGroupExpanderProps): JSX.Element {\n if (!props.count)\n return <></>;\n\n return (\n <DivButton onClick={props.onClick} className={`classroom-pill bg-white border border-dark`}>\n +{props.count}\n </DivButton>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { PropsWithAnalyticsOptions, User } from 'libs/shared/interfaces';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nconst namespace = 'classrooms.classroomGroupDropdown';\n\nconst getNewGroupAppLink = (id: string, students: User[]) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_GROUP,\n args: [id],\n params: {\n addStudents: students.map(s => s.id)\n }\n});\n\nconst getCheckedStudentsForGroup = (students: User[], group: ClassroomGroup) => {\n const studentsInGroup = students.filter(student => {\n return group.users.data.find(u => u.id.toString() === student.id.toString());\n });\n\n return studentsInGroup.length;\n};\n\ntype ClassroomGroupDropdownProps = PropsWithAnalyticsOptions<{\n id: string;\n classroom: Classroom;\n selectedStudents: User[];\n groups: ClassroomGroup[];\n onSelectGroup: (group: ClassroomGroup, toggleOn?: boolean) => void;\n preselections?: ClassroomGroup[];\n\n alignRight?: boolean;\n disabled?: boolean;\n disabledTooltips?: string;\n}>;\n\nClassroomGroupDropdown.defaultProps = {\n preselections: []\n};\n\nexport function ClassroomGroupDropdown(props: ClassroomGroupDropdownProps): JSX.Element {\n const { onToggleItem, isChecked } = useBulkCheckboxManager(props.groups, {\n preselectedIds: props.preselections.map(s => s.id)\n });\n\n function onChange(group: ClassroomGroup): void {\n const shouldAdd = !isChecked(group.id);\n props.onSelectGroup(group, shouldAdd);\n\n onToggleItem(group.id);\n }\n\n function onClickCreateNewGroup(): void {\n if (props.disabled)\n return;\n\n AnalyticsHelper.logUserAction({}, AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Start,\n entity: EntityType.ClassroomGroup\n }));\n }\n\n React.useEffect(() => {\n // On each passthrough, validate that the checkbox states are valid\n // This is needed because the group/student state is managed in 2 separate places on the same page\n props.groups.forEach(g => {\n const totalCheckedForGroup = getCheckedStudentsForGroup(props.selectedStudents, g);\n\n // Validate if unchecked checkbox should be checked\n if (!!totalCheckedForGroup && totalCheckedForGroup === props.selectedStudents.length && !isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n\n // Validate if checked checkbox should be unchecked\n if (!totalCheckedForGroup && isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n });\n });\n\n const buttonClasses = 'me-2 d-inline-block svg-container sm';\n\n const dropdownProps: HashObject = {\n align: props.alignRight ? 'end' : 'start'\n };\n\n /**\n * This prop is applied like this so that when `props.disabled` it false, the prop is omitted altogether.\n * This is because we want `react-bootstrap` to control the open state, and if we used the `show` prop\n * at all times we'd be preventing that.\n */\n if (props.disabled)\n dropdownProps.show = false;\n\n return (\n <Dropdown {...dropdownProps}>\n <Dropdown.Toggle\n as='div'\n id={props.id}\n className={`${props.disabled ? 'text-light' : 'cursor-pointer'} ${buttonClasses} no-caret`}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Group}\n title={props.disabled ? props.disabledTooltips : LanguageService.getPhrase(namespace, 'addToGroupTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName=''\n />\n </Dropdown.Toggle>\n <Dropdown.Menu>\n {!!props.groups?.length && (\n <div className='px-2 border-bottom mb-1'>\n <p className='mb-0'><Text namespace={namespace} phrase='addToGroup' /></p>\n <ul className='list-unstyled pe-3'>\n {props.groups.map(group => (\n <li key={group.id} className='d-flex align-items-center bg-white my-1'>\n <Checkbox\n id={`${props.id}:${group.id}`}\n checked={isChecked(group.id)}\n onChange={() => onChange(group)}\n indeterminate={!!getCheckedStudentsForGroup(props.selectedStudents, group)}\n />\n <ClassroomGroupPill group={group} />\n </li>\n ))}\n </ul>\n </div>\n )}\n <AppLink\n onClick={onClickCreateNewGroup}\n appLink={getNewGroupAppLink(props.classroom.id, props.selectedStudents)}\n className={props.disabled ? 'disabled' : 'text-nowrap d-flex align-items-center px-2'}\n >\n <SvgContainer svgName={cvSvgLibrary.Plus} />\n <Text namespace={namespace} phrase='createNew' />\n </AppLink>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"rfVnC\",\"name\":\"RYLWZ\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions as MoreActions } from 'libs/shared/components/actions/Actions';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { ClassroomGroup, Config } from 'libs/shared/interfaces';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ClassroomGroupExpander, ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nimport styles from './manage-classroom-student-item.scss';\n\ntype GroupVisibilityMapping = { [id: string]: boolean };\n\nconst namespace = 'classrooms.manageClassroomStudentItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getEditStudentAppLink = (id: string) => ({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.EDIT_USER,\n args: [id],\n params: { userType: UserGroup.Learner }\n});\n\nconst getRemoveStudentsAppLink = (studentId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroomId],\n params: {\n studentIds: [studentId]\n }\n});\n\ninterface ManageClassroomStudentItemProps {\n classroom: Classroom;\n student: User;\n classroomGroups: ClassroomGroup[];\n selectedGroups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n onToggleCheckbox: () => void;\n checked: boolean;\n readOnly?: boolean;\n readOnlyTooltip?: string;\n}\n\nexport function ManageClassroomStudentItem(props: ManageClassroomStudentItemProps): JSX.Element {\n const [ isComputingTruncation, setIsComputingTruncation ] = React.useState(false);\n const [ hasExpandedGroups, setHasExpandedGroups ] = React.useState(false);\n\n // Maps a group to it's visibility state.\n const [ groupVisibilityMapping, setGroupVisibilityMapping ] = React.useState<GroupVisibilityMapping>({});\n\n const groupListRef = React.useRef<HTMLDivElement>(null);\n const expanderRef = React.useRef<HTMLDivElement>(null);\n\n const { hasPermissions } = usePermissions();\n\n // Every time the selected groups array changes, we want to re-compute which groups should be truncated\n React.useEffect(() => {\n renderAllGroups();\n\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n setIsComputingTruncation(true);\n }, [props.selectedGroups.length]);\n\n function onResize(): void {\n renderAllGroups();\n setIsComputingTruncation(true);\n }\n\n const throttledResizeListener = FunctionHelper.throttle(onResize, 300);\n\n useResizeListener(() => {\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n throttledResizeListener();\n });\n\n /**\n * This iterates through each group element, and detects if any of them don't\n * fit on the first row of items. The elements that don't will be hidden.\n */\n React.useEffect(() => {\n if (!groupListRef.current || !expanderRef.current || !isComputingTruncation)\n return;\n\n const firstGroupPill = groupListRef.current.firstElementChild as HTMLDivElement;\n if (!firstGroupPill) return;\n\n const topRowHeight = firstGroupPill.getBoundingClientRect().y;\n\n const nextGroupVisibilityMapping: { [id: string]: boolean } = {};\n\n /**\n * Here we're checking if the y-coordinate of any groups\n * don't match the y-coordinate of the first group (which should\n * always be on the first row). This way we know if they should be\n * hidden or not.\n */\n let lastVisibleId: string;\n for (const child of groupListRef.current.children) {\n if (child.id) {\n nextGroupVisibilityMapping[child.id] = child.getBoundingClientRect().y === topRowHeight;\n lastVisibleId = nextGroupVisibilityMapping[child.id] ? child.id : lastVisibleId;\n }\n }\n\n // If the expander button has also wrapped, we hide the last element that we were going to make visible.\n if (expanderRef.current.getBoundingClientRect().y !== topRowHeight)\n nextGroupVisibilityMapping[lastVisibleId] = false;\n\n setGroupVisibilityMapping(nextGroupVisibilityMapping);\n setIsComputingTruncation(false);\n }, [isComputingTruncation]);\n\n function onClickShowAllGroups(): void {\n setHasExpandedGroups(true);\n renderAllGroups();\n }\n\n // Updates the group visibility mapping to display all groups\n function renderAllGroups(): void {\n setGroupVisibilityMapping(props.selectedGroups.reduce((acc, group) => {\n acc[group.id] = true;\n return acc;\n }, {} as GroupVisibilityMapping));\n }\n\n // Returns the number of groups that are invisible\n function getInvisibleGroupCount(): number {\n return Object.keys(groupVisibilityMapping).reduce((count, groupId) => {\n if (!groupVisibilityMapping[groupId])\n count++;\n \n return count;\n }, 0);\n }\n\n function getActions(): ActionOptions[] {\n const actions: ActionOptions[] = [];\n\n if (hasPermissions(PermissionName.ManageUsers))\n actions.push({\n label: getPhrase('editStudent'),\n appLink: getEditStudentAppLink(props.student.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : '',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({ id: props.student.id }, {\n actionType: UserAction.Edit,\n entity: EntityType.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n actions.push({\n label: getPhrase('removeStudent'),\n appLink: getRemoveStudentsAppLink(props.student.id, props.classroom.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : 'text-danger',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({ id: props.classroom.id, userId: props.student.id }, {\n actionType: UserAction.Dissociate,\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n return actions;\n }\n\n return (\n <div className='d-flex align-items-center py-1 px-4'>\n <Checkbox\n id={props.student.id}\n checked={props.checked}\n onChange={props.onToggleCheckbox}\n className='me-2'\n disabled={props.readOnly}\n />\n\n <div className={`${styles.avatarContainer} me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.student.name, props.student.surname)}\n imageUrl={props.student.avatar?.url}\n />\n </div>\n\n <p className={`me-2 ${styles.name} text-truncate mb-0 text-nowrap`}>{props.student.name} {props.student.surname}</p>\n\n <div\n // When we are computing the truncation, we want all group elements to be rendered but invisible.\n className={`${isComputingTruncation ? 'invisible' : ''} me-auto d-flex flex-wrap mt-n1`}\n ref={groupListRef}\n >\n {props.selectedGroups.map(group => {\n if (!groupVisibilityMapping[group.id]) // Don't render any groups that are marked as hidden\n return <React.Fragment key={group.id}></React.Fragment>;\n\n return (\n <div key={group.id} className='me-1 mt-1' id={group.id}>\n <ClassroomGroupPill group={group} />\n </div>\n );\n })}\n <div ref={expanderRef} className='me-1 mt-1'>\n <ClassroomGroupExpander count={getInvisibleGroupCount()} onClick={onClickShowAllGroups} />\n </div>\n </div>\n\n <ClassroomGroupDropdown\n id={`add-group-${props.student.id}`}\n classroom={props.classroom}\n groups={props.classroomGroups}\n selectedStudents={[props.student]}\n preselections={props.selectedGroups}\n onSelectGroup={(group, toggleOn) => props.onToggleGroup(props.student, group, toggleOn)}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudentListItem }}\n alignRight\n disabled={props.readOnly}\n disabledTooltips={props.readOnlyTooltip}\n />\n\n <MoreActions\n actions={getActions()}\n actionsDropdownClassName='btn'\n />\n </div>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classroom, Config } from 'libs/shared/interfaces';\nimport { ClassroomGroup, User, UserCollection } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ManageClassroomStudentItem } from 'apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nimport { ManageClassroomStudentsEmptyState } from './empty-state/ManageClassroomStudentsEmptyState';\n\nconst namespace = 'classrooms.manageClassroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ManageClassroomStudentsProps {\n classroom: Classroom;\n students: UserCollection;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n groups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n readOnly?: boolean;\n}\n\nexport function ManageClassroomStudents(props: ManageClassroomStudentsProps): JSX.Element {\n const { classroom, students, groups } = props;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const CheckboxHelper = useBulkCheckboxManager(students.data);\n const selectionCount = CheckboxHelper.getSelected().length;\n\n const bulkPreselections = groups.filter(group => {\n if (!group.users?.data?.length)\n return false;\n\n let allStudentsFound = true;\n let index = 0;\n\n const studentIds = CheckboxHelper.getSelected();\n\n if (!studentIds.length)\n return;\n\n do {\n const id = studentIds[index];\n if (!group.users.data.find((stu: any) => stu.id.toString() === id.toString()))\n allStudentsFound = false;\n\n index++;\n } while (index < studentIds.length);\n\n return allStudentsFound;\n });\n\n function onClickAddStudents(): void {\n AnalyticsHelper.logUserAction({ id: classroom.id }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Associate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [classroom.id]\n });\n }\n\n function onClickBulkRemoveStudents(): void {\n if (!selectionCount || props.readOnly)\n return;\n\n const studentIds = CheckboxHelper.getSelected();\n\n AnalyticsHelper.logUserAction({\n id: classroom.id,\n studentCount: studentIds.length\n }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Dissociate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroom.id],\n params: {\n studentIds\n }\n });\n }\n\n function onSelectGroup(group: ClassroomGroup, shouldAdd: boolean): void {\n const selectedStudentIds = CheckboxHelper.getSelected();\n\n const request = shouldAdd ? ClassroomRequests.addStudentsToGroup : ClassroomRequests.removeStudentsFromGroup;\n\n Flight.fetch(\n dispatch,\n request(selectedStudentIds, group.id, classroom.id, () => {\n AnalyticsHelper.logUserAction({\n id: group.id,\n studentCount: selectedStudentIds.length\n }, {\n actionType: UserAction.Associate,\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudents\n });\n\n alerts.success(getPhrase('addSuccess', { groupName: group.name, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('addError', { groupName: group.name, escapeText: true }));\n })\n );\n }\n\n const edgeToEdge = useMediaQuery(MediaQueryStrings.XLDown);\n\n if (!students.data?.length) {\n return (\n <ManageClassroomStudentsEmptyState\n classroom={props.classroom}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={props.schoolHasNoStudents}\n canManageUsers={props.canManageUsers}\n />\n );\n }\n\n return (\n <>\n <div className={`d-flex align-items-center py-2 ${edgeToEdge ? 'ps-2' : 'ps-4'}`}>\n <Checkbox\n id='manage-classroom-students-bulk'\n onChange={CheckboxHelper.onToggleBulk}\n checked={CheckboxHelper.bulkChecked}\n className='me-2'\n indeterminate={CheckboxHelper.hasSomeSelections()}\n disabled={props.readOnly}\n />\n\n <ClassroomGroupDropdown\n id='bulk-add-group'\n classroom={classroom}\n selectedStudents={CheckboxHelper.getSelected().map(id => {\n return props.students.data.find(s => s.id.toString() === id.toString());\n })}\n groups={groups}\n onSelectGroup={onSelectGroup}\n disabled={!selectionCount || props.readOnly}\n preselections={bulkPreselections}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudents }}\n disabledTooltips={props.readOnly && LanguageService.getPhrase(namespace, 'disabledByRostering')}\n />\n <DivButton\n className={`me-auto ${!selectionCount || props.readOnly ? 'text-light cursor-default' : ''}`}\n onClick={onClickBulkRemoveStudents}\n >\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Delete}\n title={LanguageService.getPhrase(namespace, 'delete')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </Tooltip>\n </DivButton>\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <IconButton\n onClick={onClickAddStudents}\n svgName={cvSvgLibrary.Plus}\n className='btn btn-outline-dark'\n disabled={props.readOnly}\n >\n <Text namespace={namespace} phrase='addStudent' />\n </IconButton>\n </Tooltip>\n </div>\n\n <ul className='striped-list list-unstyled'>\n {students.data.map(student => (\n <li key={student.id}>\n <ManageClassroomStudentItem\n classroom={classroom}\n student={student}\n classroomGroups={props.groups}\n config={props.config}\n selectedGroups={props.groups.filter(g => g.users.data.find(u => u.id === student.id))}\n checked={CheckboxHelper.isChecked(student.id)}\n onToggleCheckbox={() => CheckboxHelper.onToggleItem(student.id)}\n onToggleGroup={props.onToggleGroup}\n readOnly={props.readOnly}\n readOnlyTooltip={props.readOnly ? getPhrase('disabledByRostering') : ''}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"YrP_G\",\"avatar\":\"droqZ\",\"checkbox\":\"pJf6R\",\"actionIcon\":\"MSvzY\",\"addStudents\":\"j62jt\",\"studentName\":\"gorcb\",\"group\":\"IFmvc\",\"sm\":\"pOcvk\",\"lg\":\"SdQ90\",\"moreActions\":\"S7p4K\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\n\nimport styles from './partial-manage-classroom-students.scss';\n\nexport const PartialManageClassroomStudents = React.memo(function(): JSX.Element {\n return (\n <div className='px-3'>\n {/* Heading */}\n <div className={`mb-1 partial-loading-background ${styles.heading}`} />\n\n {/* Breadcrumbs */}\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n {/* Pill tab selector */}\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n\n <div className='d-flex align-items-center py-2'>\n {/* Checkbox */}\n <div className={`mx-4 partial-loading-background ${styles.checkbox}`} />\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* Delete action */}\n <div className={`me-auto partial-loading-background ${styles.actionIcon}`} />\n\n {/* Add new students button */}\n <div className={`partial-loading-background ${styles.addStudents}`} />\n </div>\n\n {/* Students list */}\n <ul className='striped-list list-unstyled'>\n {Array(20).fill(null).map((student, i) => (\n <li key={i}>\n <div className='d-flex align-items-center py-1 px-4'>\n {/* Checkbox */}\n <div className={`me-2 partial-loading-background ${styles.checkbox}`} />\n\n {/* Avatar */}\n <div className={`me-2 partial-loading-background ${styles.avatar}`} />\n\n {/* Student name */}\n <div className='w-25'>\n <div className={`partial-loading-background ${styles.studentName}`} />\n </div>\n\n {/* Groups list. Randomly renders either 1 or 2 groups. Group widths are randomly generated */}\n <div className='me-auto d-flex'>\n {Math.random() > 0.5\n ? (\n <>\n <div className={`partial-loading-background rounded-pill me-1 ${styles.group} ${styles.lg}`} />\n <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n </>\n ) : <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n }\n </div>\n\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* More actions */}\n <div className={`partial-loading-background ${styles.moreActions}`} />\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n});","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Classroom, ClassroomGroup, ClassroomGroupCollection, Config, CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ManageClassroomStudentsEmptyState, RosteredClassroomStudentsEmptyState } from 'apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState';\nimport { ManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/ManageClassroomStudents';\nimport { PartialManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useHandleClassroomErrors } from 'apps/classrooms/hooks/useHandleClassroomErrors';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nconst namespace = 'classrooms.classroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst baseAnalyticsOptions = {\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudentListItem\n};\n\ninterface ClassroomStudentsViewProps {\n id: string;\n cursor: string;\n}\n\nexport function ClassroomStudentsView(props: ClassroomStudentsViewProps): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const students = Flight.useBasicFetch<UserCollection>(ClassroomRequests.getClassroomStudents(props.id, props.cursor));\n const allStudents = Flight.useBasicFetch<UserCollection>(currentUser.data &&\n UserManagerRequests.getUsers(currentUser.data.customerId, UserGroup.Learner));\n const groups = Flight.useBasicFetch<ClassroomGroupCollection>(ClassroomRequests.getClassroomGroups(props.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const dispatch = useDispatch();\n const { hasPermissions } = usePermissions();\n\n useSetPageMetadata({\n title: getPhrase('pageTitle', { classroomName: classroom.data?.name })\n });\n useHandleClassroomErrors(classroom);\n\n function onToggleGroup(student: User, group: ClassroomGroup, toggleOn: boolean): void {\n const analyticsData = {\n id: group.id,\n studentCount: 1\n };\n\n const request = toggleOn\n ? ClassroomRequests.addStudentsToGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Associate\n });\n })\n : ClassroomRequests.removeStudentsFromGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Dissociate\n });\n });\n\n Flight.fetch(dispatch, request);\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n if (\n !classroom.data\n || !students.data?.data\n || !groups.data?.data\n || !config.data\n || !allStudents.data\n )\n return <PartialManageClassroomStudents />;\n\n return (\n <ClassroomLayout\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n activeTab='students'\n isRostered={isRostered}\n >\n {(() => {\n if (isRostered)\n return (\n <>\n <RosteringAlert type='classroom'/>\n {!students.data?.data?.length ? (\n <RosteredClassroomStudentsEmptyState />\n ) : (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={groups.data.data}\n onToggleGroup={onToggleGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n readOnly\n />\n )}\n </>\n );\n\n if (students.data?.data?.length) {\n return (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={groups.data.data}\n onToggleGroup={onToggleGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n }\n\n return (\n <ManageClassroomStudentsEmptyState\n classroom={classroom.data}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n })()}\n\n {!!students.data?.pagination?.cursors && (\n <Pagination\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.id]\n }}\n cursors={students.data?.pagination?.cursors}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n scrollTop\n prevHack\n />\n )}\n </ClassroomLayout>\n );\n}\n"],"names":["ScrollHelper","preventScrollTop","Radio","trigger","buildCursor","appLink","cursorParam","prevHack","currentParams","params","previous","application","action","args","cursor","Pagination","cursors","className","buttonVariant","scrollTop","onClick","onClickButton","page","location","entity","actionType","value","style","display","phrase","next","variant","defaultProps","getPhrase","RosteringAlert","props","text","type","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","current","clear","isChecked","item","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","id","set","map","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","keys","bulkChecked","deselectAll","hasSomeSelections","find","getSelectedCount","size","getMap","usePrevious","ref","mapColourToBsVariant","groupColour","namespace","ClassroomsNoStudentsState","EmptyState","src","ImageUrls","Text","canManageUsers","isRostering","LanguageService","href","target","STUDENT_ENGAGEMENT_IDEAS_LINK","ROSTERING_KB_ARTICLE_URL","RosteredClassroomStudentsEmptyState","ManageClassroomStudentsEmptyState","schoolHasNoStudents","icon","classroom","classroomIdeasText","ClassroomGroupPill","group","metadata","colour","name","ClassroomGroupExpander","count","DivButton","getNewGroupAppLink","students","addStudents","s","getCheckedStudentsForGroup","filter","student","users","data","u","ClassroomGroupDropdown","groups","preselections","g","totalCheckedForGroup","selectedStudents","dropdownProps","align","alignRight","disabled","show","Dropdown","as","SvgContainer","svgName","title","disabledTooltips","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","key","Checkbox","checked","onChange","shouldAdd","onSelectGroup","indeterminate","AppLink","AnalyticsHelper","analyticsOptions","workflowPhase","getEditStudentAppLink","userType","UserGroup","getRemoveStudentsAppLink","studentId","classroomId","studentIds","ManageClassroomStudentItem","isComputingTruncation","setIsComputingTruncation","hasExpandedGroups","setHasExpandedGroups","groupVisibilityMapping","setGroupVisibilityMapping","groupListRef","expanderRef","hasPermissions","usePermissions","renderAllGroups","selectedGroups","actions","throttledResizeListener","FunctionHelper","reduce","acc","firstGroupPill","firstElementChild","lastVisibleId","topRowHeight","getBoundingClientRect","y","nextGroupVisibilityMapping","children","child","onToggleCheckbox","readOnly","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","Object","groupId","classroomGroups","toggleOn","onToggleGroup","readOnlyTooltip","PermissionName","push","label","tooltip","userId","descriptor","actionsDropdownClassName","ManageClassroomStudents","dispatch","alerts","CheckboxHelper","selectionCount","bulkPreselections","allStudentsFound","index","stu","edgeToEdge","selectedStudentIds","request","ClassroomRequests","studentCount","success","groupName","escapeText","error","Tooltip","spanHack","IconButton","PartialManageClassroomStudents","numItems","PartialPillTabSelector","fill","Math","random","baseAnalyticsOptions","ClassroomStudentsView","currentUser","UserRequests","allStudents","UserManagerRequests","customerId","ConfigRequests","isRostered","_integrations","rostered","analyticsData","useSetPageMetadata","classroomName","useHandleClassroomErrors","ClassroomLayout","onTogglePin","shouldPin","onSuccess","onError","activeTab","pagination"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7855],{75314:(e,t,n)=>{n.d(t,{j:()=>w});var a=n(32735),r=n(80247),o=n(23481),i=n(91967),c=n(76177),l=n(4594),s=n(45778),m=n(60376),u=n(36511),d=n(35223);const p={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"};var v="shared.classroomGroupRecipientItemMetadata";function g(e){var t;return a.createElement(a.Fragment,null,a.createElement("div",{className:"".concat(p.avatarContainer," d-inline-block")},a.createElement(m.f,{svgName:d.vn.Group,variant:(0,u.I)(null===(t=e.classroomGroup.metadata)||void 0===t?void 0:t.colour)})),a.createElement("div",{className:e.detailsClassName},a.createElement("h4",{className:"font-size-normal fw-normal m-0"},e.classroomGroup.name),a.createElement("p",{className:"text-secondary m-0"},function(e){var t,n,a,r=null!==(n=null===(t=e.users)||void 0===t?void 0:t.count)&&void 0!==n?n:0,i=null===(a=e.classroom)||void 0===a?void 0:a.name;return i?o.T.getPhrase(v,"subheading",{classroomName:i,smartCount:r}):""}(e.classroomGroup))))}var f="shared.classroomRecipientItemMetadata";function E(e){return a.createElement(a.Fragment,null,a.createElement("div",{className:"".concat(p.avatarContainer," d-inline-block")},a.createElement(m.f,{svgName:d.vn.Classrooms,variant:"teal"})),a.createElement("div",{className:e.detailsClassName},a.createElement("h4",{className:"font-size-normal fw-normal m-0"},e.classroom.name),a.createElement("p",{className:"text-secondary m-0"},(i=(null===(n=(t=e.classroom).users)||void 0===n?void 0:n.count)||(null===(r=t.enrolments)||void 0===r?void 0:r.count),Number.isInteger(i)?o.T.getPhrase(f,"subheading",{smartCount:i}):""))));var t,n,r,i}var h=n(20789),y=n(76881),C=n(86613),x=n(64818),b=o.T.encloseNamespace("shared.userRecipientItemMetadata");function N(e){var t;return a.createElement(a.Fragment,null,a.createElement("div",{className:"".concat(p.avatarContainer," d-inline-block")},a.createElement(h.q,{imageUrl:null===(t=e.user.avatar)||void 0===t?void 0:t.url,imageCdnUrl:e.imageCdnUrl,initials:x.l.getInitials(e.user.name,e.user.surname)})),a.createElement("div",{className:e.detailsClassName},a.createElement("h4",{className:"font-size-normal fw-normal m-0"},e.showDisplayName?x.l.getDisplayName(e.user):x.l.getFullName(e.user)),a.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=x.l.getUserType(e),n=x.l.getUserRole(e);if(t===y.Y.Staff)return n===C.i.Admin?b("admin"):b("staff");var a=x.l.getYearGroup(e);return(null==a?void 0:a.name)?a.name:b("student")}(e.user))))}function S(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 k=o.T.encloseNamespace("share.recipientItem");function I(e){switch(e){case l.E.User:return k("removeUser");case l.E.Classroom:return k("removeClassroom");case l.E.ClassroomGroup:return k("removeGroup")}return null}function w(e){var t,n,o=(t=a.useState(!1),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,o,i,c=[],l=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(c.push(a.value),c.length!==t);l=!0);}catch(e){s=!0,r=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return c}}(t,n)||function(e,t){if(e){if("string"==typeof e)return S(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)?S(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.")}()),m=o[0],u=o[1],d="".concat(p.recipientItem," d-flex");m&&(d+=" ".concat(p.showSpinner));var v="".concat(e.removeRecipient?p.recipientDetailsWithRemoveButton:p.recipientDetails," d-inline-block ms-2");return a.createElement("div",{className:d},s.G.isType(e.entity,l.E.User)?a.createElement(N,{user:e.entity,imageCdnUrl:e.imageCdnUrl,detailsClassName:v,showDisplayName:e.showDisplayName,getSubText:e.getSubText}):s.G.isType(e.entity,l.E.Classroom)?a.createElement(E,{classroom:e.entity,detailsClassName:v}):s.G.isType(e.entity,l.E.ClassroomGroup)?a.createElement(g,{classroomGroup:e.entity,detailsClassName:v}):void 0,i.q.isFunction(e.removeRecipient)&&a.createElement("div",{className:"".concat(p.removeRecipient," d-inline-flex justify-content-center align-items-center")},m?a.createElement(r.Z,{as:"div",size:"sm",animation:"border",role:"status"}):a.createElement(c.u,{title:I(e.entity.typeId),spanHack:!0},a.createElement("div",{className:"btn-close cursor-pointer",role:"button","aria-label":"Close",onClick:function(){u(!0),e.removeRecipient(e.entity.id,(function(){return u(!1)}))}}))))}},82872:(e,t,n)=>{n.d(t,{t:()=>k,D:()=>I});var a=n(32735),r=n(91967),o=n(11607),i=n(83914),c=n(4594),l=n(76881),s=n(36511),m=n(45778),u=n(35223),d=n(64818),p=n(80247),v=n(23481);const g={avatar:"srrS3"};function f(e){var t=e.imageUrl,n=e.initials,r={};return t&&(r.backgroundImage="url('".concat(t,"')")),a.createElement("div",{className:g.avatar,style:r},t?a.createElement(a.Fragment,null," "):n)}var E=n(76177);const h={svgContainer:"laVU4",selection:"vEOCt",expander:"d1NHd",iconContainer:"rFH4W",icon:"BarYz",bubble:"HF0E8",spinnerContainer:"iKeXW",remove:"pyzCM",removeBubble:"mgt6Y"};var y=v.T.encloseNamespace("shared.inputSelection");function C(e){var t,n="".concat(h.svgContainer," ").concat(h.icon);return e.typeId===c.E.Classroom?n+=" text-teal":n+=" text-".concat((0,s.I)(null===(t=e.metadata)||void 0===t?void 0:t.colour)),n}function x(e){var t,n=function(e){var t;switch(e.typeId){case c.E.Classroom:return"text-teal-hover";case c.E.ClassroomGroup:return"text-".concat((0,s.I)(null===(t=e.metadata)||void 0===t?void 0:t.colour),"-hover")}}(e.selection),r=e.selection.typeId===c.E.Classroom;if(!e.canExpand){if(!e.selection.typeId||e.selection.typeId===c.E.User){var l=e.selection;return a.createElement("div",{className:h.svgContainer},a.createElement(f,{imageUrl:null===(t=l.avatar)||void 0===t?void 0:t.url,initials:d.l.getInitials(e.selection.name,e.selection.surname)}))}return a.createElement(E.u,{title:y(r?"emptyClassroom":"emptyGroup")},a.createElement("div",{className:"align-items-center border border-white bg-white ".concat(h.iconContainer)},a.createElement(i.x,{className:C(e.selection),svgName:r?u.vn.Classrooms:u.vn.Group})))}return e.hasExpanded?a.createElement("div",{className:"d-flex align-items-center text-white ".concat(h.spinnerContainer," ").concat(h.svgContainer)},a.createElement(p.Z,{as:"div",size:"sm",animation:"border",role:"status"})):a.createElement(a.Fragment,null,a.createElement(o.L,{className:"align-items-center cursor-pointer text-white border border-white rounded-circle ".concat(h.expander," ").concat(n),onClick:e.onClickExpand},a.createElement(i.x,{svgName:u.vn.Plus,className:"d-flex align-items-center ".concat(h.svgContainer)})),a.createElement("div",{className:"align-items-center border border-white bg-white ".concat(h.iconContainer)},a.createElement(i.x,{className:C(e.selection),svgName:r?u.vn.Classrooms:u.vn.Group})))}function b(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,o,i,c=[],l=!0,s=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(c.push(a.value),c.length!==t);l=!0);}catch(e){s=!0,r=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(s)throw r}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return N(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)?N(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 N(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}function S(e){var t;if(!e.typeId)return"dark-blue";switch(e.typeId){case c.E.User:return"number"==typeof e.userType?2===e.userType?"dark-blue":"indigo":e.userType===l.Y.Learner?"dark-blue":"indigo";case c.E.Classroom:return"teal";case c.E.ClassroomGroup:return(0,s.I)(null===(t=e.metadata)||void 0===t?void 0:t.colour)}}function k(e){var t,n,r,l=m.G.isType(e.selection,c.E.Classroom),s=m.G.isType(e.selection,c.E.ClassroomGroup),d=e.onClickExpand&&(l||s),p=!!(null===(t=e.selection.users||e.selection.enrolments)||void 0===t?void 0:t.count),v=!!(null===(r=null===(n=e.selection.users)||void 0===n?void 0:n.data)||void 0===r?void 0:r.length),g=b(a.useState(!1),2),f=g[0],E=g[1],y=b(a.useState(d&&p),2),C=y[0],x=y[1];if(a.useEffect((function(){x(d&&p)}),[d,p]),v){var N=e.selection,k=S(e.selection);return a.createElement("div",{className:"d-flex align-items-center flex-wrap me-1 mt-1 pb-1 ps-1 pe-4 position-relative border-".concat(k," text-").concat(k," ").concat(h.bubble)},N.users.data.map((function(t){return a.createElement(I,{key:"".concat(t.id,":").concat(e.selection.id),selection:t,colourVariant:k,hasStudentExperience:e.hasStudentExperience})})),a.createElement(o.L,{className:"cursor-pointer position-absolute text-".concat(k," ").concat(h.removeBubble),onClick:function(){return e.onClickRemove(e.selection)}},a.createElement(i.x,{svgName:u.vn.Close,className:"d-flex align-items-center ".concat(h.svgContainer)})))}return a.createElement(I,{selection:e.selection,canExpand:C,hasExpanded:f,onClickExpand:function(){E(!0),e.onClickExpand(e.selection.id)},onClickRemove:e.onClickRemove,colourVariant:S(e.selection),hasStudentExperience:e.hasStudentExperience})}function I(e){var t=e.colourVariant||S(e.selection),n=e.selection.name;return e.selection.typeId===c.E.User&&(n=e.hasStudentExperience?d.l.getDisplayName(e.selection):d.l.getFullName(e.selection)),a.createElement("div",{className:"".concat(h.selection," bg-").concat(t," rounded-pill text-").concat(t," d-flex align-items-center me-1 mt-1 overflow-hidden")},!e.hideExpander&&a.createElement(x,{canExpand:e.canExpand,hasExpanded:e.hasExpanded,onClickExpand:e.onClickExpand,selection:e.selection}),a.createElement("span",{className:"mx-1 text-white text-truncate"},n),r.q.isFunction(e.onClickRemove)&&a.createElement(o.L,{className:"d-flex align-items-center cursor-pointer align-self-stretch text-white ".concat(h.remove),onClick:function(){return e.onClickRemove(e.selection)}},a.createElement(i.x,{svgName:u.vn.Close,className:"d-flex align-items-center ".concat(h.svgContainer)})))}},7855:(e,t,n)=>{n.d(t,{d:()=>g,R:()=>f});var a=n(32735),r=n(23481),o=n(75896),i=n(75314),c=n(2136),l=n(83914),s=n(89589),m=n(97481),u=n(35223),d=n(82872);const p={container:"Dc3kX",suggestionsContainerOpen:"c5t3e",selectionContainer:"kFjoN",sectionContainer:"mLrE3"};var v="shared.tokenizedTypeahead",g=10;function f(e){var t;return a.createElement("div",{className:"form-control h-auto d-flex align-items-top position-relative ".concat(e.hideIcon?"":"py-1 px-0"," ").concat(e.className)},!e.hideIcon&&a.createElement(l.x,{className:"svg-container m-1",svgName:u.vn.Search}),a.createElement("div",{className:"".concat(p.selectionContainer," d-flex flex-wrap align-items-center mt-n1")},e.selections.map((function(t){return e.getInputTokenComponent?e.getInputTokenComponent(t):a.createElement(d.t,{key:t.id,selection:t,onClickRemove:e.removeSelection,onClickExpand:e.fetchSelectionMembers,hasStudentExperience:e.hasStudentExperience})})),a.createElement(c.E,Object.assign({},e,{onBackspace:function(){e.selections.length&&e.removeSelection(o.m.last(e.selections))},recentSearchHeading:e.recentSearchHeading||r.T.getPhrase(v,"recentSearchHeading"),placeholder:(null===(t=e.selections)||void 0===t?void 0:t.length)?" ":e.placeholder,searchIconPlacement:!1,clearQueryOnSelect:!0,getSuggestionComponent:function(t){return e.getSuggestionComponent?e.getSuggestionComponent(t):a.createElement(i.j,{entity:t,imageCdnUrl:e.imageCdnUrl,showDisplayName:e.hasStudentExperience})},getEmptyStateComponent:function(t){return a.createElement(s.x,{query:t,imageUrl:e.emptyStateImageUrl})},getErrorStateComponent:function(t){return a.createElement(m.d,{imageUrl:e.errorStateImageUrl,onClickTryAgain:t})},theme:{container:p.container,suggestionsContainerOpen:"bg-white py-1 rounded border mt-1 ".concat(p.suggestionsContainerOpen),sectionContainer:"border-bottom py-1 ".concat(p.sectionContainer)},sectionTitleClassName:"ps-2",renderSuggestionsOnInputFocus:e.renderSuggestionsOnInputFocus,onSuggestionDependencies:[e.selections]}))),!!e.sharePermissionsDescription&&a.createElement("span",{className:"px-2 text-secondary text-nowrap"},e.sharePermissionsDescription))}f.defaultProps={renderSuggestionsOnInputFocus:!0}},89589:(e,t,n)=>{n.d(t,{x:()=>l});var a=n(32735),r=n(83345),o=n(28329);const i={emptyState:"bKTf0"};var c="shared.typeaheadEmptyState";function l(e){var t=e.query,n=void 0===t?"":t,l=e.imageUrl,s=(0,o.N)(n,300);return a.createElement("div",{className:"d-flex flex-column align-items-center text-center",onClick:function(e){e.stopPropagation()}},a.createElement("img",{alt:"",role:"presentation",src:l,className:"pb-2 ".concat(i.emptyState)}),a.createElement("h2",{className:"h6"},a.createElement(r.x,{namespace:c,phrase:"noResults",options:{query:s,smartCount:s.length}})))}},97481:(e,t,n)=>{n.d(t,{d:()=>l});var a=n(32735),r=n(11607),o=n(83345);const i={emptyState:"k5mEG"};var c="shared.typeaheadErrorState";function l(e){return a.createElement("div",{className:"d-flex flex-column align-items-center text-center",onClick:function(e){e.stopPropagation()}},a.createElement("img",{alt:"",role:"presentation",src:e.imageUrl,className:"pb-2 ".concat(i.emptyState)}),a.createElement("h2",{className:"h6"},a.createElement(o.x,{namespace:c,phrase:"error"})),a.createElement(r.L,{onClick:function(t){t.stopPropagation(),e.onClickTryAgain()},className:"btn btn-link info-link p-0"},a.createElement(o.x,{namespace:c,phrase:"tryAgain"})))}},36511:(e,t,n)=>{n.d(t,{I:()=>r});var a=n(40424);function r(e){switch(e){case a.R.Pink:return"pink";case a.R.Orange:return"orange";case a.R.Green:return"green";case a.R.Blue:return"blue";case a.R.Purple:return"purple";case a.R.Indigo:return"indigo";default:return"pink"}}}}]);
2
+ //# sourceMappingURL=7855-04bc8e52e3-lite.chunk.js.map