@clickview/lite 0.50.0-rc.1 → 0.50.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{355-lite-7e76df6ab5.chunk.css → 355-lite-e474c8ddce.chunk.css} +1 -1
  3. package/dist/css/{7715-lite-671ee43c49.chunk.css → 7715-lite-25809cdd3d.chunk.css} +1 -1
  4. package/dist/css/{8139-lite-10c11c0722.chunk.css → 8139-lite-5511af77bf.chunk.css} +1 -1
  5. package/dist/css/{8960-lite-d45f2332e6.chunk.css → 8960-lite-a80ad92ea7.chunk.css} +1 -1
  6. package/dist/css/{9395-lite-01ed62af75.chunk.css → 9395-lite-e7ca0b1320.chunk.css} +1 -1
  7. package/dist/css/lite-app-f2595ac365.css +53 -0
  8. package/dist/languages/en.json +1 -1
  9. package/dist/scripts/{1285-086e83fddf-lite.chunk.js → 1285-f4b56a47c2-lite.chunk.js} +2 -2
  10. package/dist/scripts/{1285-086e83fddf-lite.chunk.js.map → 1285-f4b56a47c2-lite.chunk.js.map} +1 -1
  11. package/dist/scripts/{355-81c86415d9-lite.chunk.js → 355-eaf55dc95f-lite.chunk.js} +1 -1
  12. package/dist/scripts/{355-81c86415d9-lite.chunk.js.map → 355-eaf55dc95f-lite.chunk.js.map} +1 -1
  13. package/dist/scripts/{4395-2e9e72a400-lite.chunk.js → 4395-322f459cb0-lite.chunk.js} +2 -2
  14. package/dist/scripts/4395-322f459cb0-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{5562-42375ce894-lite.chunk.js → 5562-09db6be3de-lite.chunk.js} +3 -3
  16. package/dist/scripts/{5562-42375ce894-lite.chunk.js.map → 5562-09db6be3de-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{6480-06435aaa46-lite.chunk.js → 6480-60a0ad2ff5-lite.chunk.js} +1 -1
  18. package/dist/scripts/{6480-06435aaa46-lite.chunk.js.map → 6480-60a0ad2ff5-lite.chunk.js.map} +1 -1
  19. package/dist/scripts/{679-a58b19729d-lite.chunk.js → 679-51a0b936e0-lite.chunk.js} +2 -2
  20. package/dist/scripts/{679-a58b19729d-lite.chunk.js.map → 679-51a0b936e0-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/{6863-562ff82f45-lite.chunk.js → 6863-670092eaa5-lite.chunk.js} +1 -1
  22. package/dist/scripts/{6863-562ff82f45-lite.chunk.js.map → 6863-670092eaa5-lite.chunk.js.map} +1 -1
  23. package/dist/scripts/{6948-8c8d9131eb-lite.chunk.js → 6948-e7a16d8c0b-lite.chunk.js} +2 -2
  24. package/dist/scripts/{6948-8c8d9131eb-lite.chunk.js.map → 6948-e7a16d8c0b-lite.chunk.js.map} +1 -1
  25. package/dist/scripts/{7052-32d8266e82-lite.chunk.js → 7052-a4d79c9f20-lite.chunk.js} +3 -3
  26. package/dist/scripts/{7052-32d8266e82-lite.chunk.js.map → 7052-a4d79c9f20-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/{7715-e5380d1440-lite.chunk.js → 7715-634be84dc5-lite.chunk.js} +2 -2
  28. package/dist/scripts/{7715-e5380d1440-lite.chunk.js.map → 7715-634be84dc5-lite.chunk.js.map} +1 -1
  29. package/dist/scripts/7855-04bc8e52e3-lite.chunk.js +2 -0
  30. package/dist/scripts/7855-04bc8e52e3-lite.chunk.js.map +1 -0
  31. package/dist/scripts/{8055-f4de552821-lite.chunk.js → 8055-a6d102b953-lite.chunk.js} +3 -3
  32. package/dist/scripts/{8055-f4de552821-lite.chunk.js.map → 8055-a6d102b953-lite.chunk.js.map} +1 -1
  33. package/dist/scripts/{8139-37635f8bcd-lite.chunk.js → 8139-2a36098eae-lite.chunk.js} +3 -3
  34. package/dist/scripts/{8139-37635f8bcd-lite.chunk.js.map → 8139-2a36098eae-lite.chunk.js.map} +1 -1
  35. package/dist/scripts/8243-e4baf0ae31-lite.chunk.js +2 -0
  36. package/dist/scripts/8243-e4baf0ae31-lite.chunk.js.map +1 -0
  37. package/dist/scripts/{8419-70c7a44baa-lite.chunk.js → 8419-510dc22a69-lite.chunk.js} +1 -1
  38. package/dist/scripts/{8419-70c7a44baa-lite.chunk.js.map → 8419-510dc22a69-lite.chunk.js.map} +1 -1
  39. package/dist/scripts/{9395-181720391d-lite.chunk.js → 9395-77dfcbad18-lite.chunk.js} +2 -2
  40. package/dist/scripts/{9395-181720391d-lite.chunk.js.map → 9395-77dfcbad18-lite.chunk.js.map} +1 -1
  41. package/dist/scripts/950-68255d3086-lite.chunk.js +2 -0
  42. package/dist/scripts/950-68255d3086-lite.chunk.js.map +1 -0
  43. package/dist/scripts/{bundle-be1688b50c.min.js → bundle-0187039e1a.min.js} +3 -3
  44. package/dist/scripts/bundle-0187039e1a.min.js.map +1 -0
  45. package/package.json +1 -1
  46. package/dist/css/lite-app-5b9f4761e1.css +0 -53
  47. package/dist/scripts/4395-2e9e72a400-lite.chunk.js.map +0 -1
  48. package/dist/scripts/7855-1c7a0adeab-lite.chunk.js +0 -2
  49. package/dist/scripts/7855-1c7a0adeab-lite.chunk.js.map +0 -1
  50. package/dist/scripts/8243-5d673b616d-lite.chunk.js +0 -2
  51. package/dist/scripts/8243-5d673b616d-lite.chunk.js.map +0 -1
  52. package/dist/scripts/950-4b9770bfe3-lite.chunk.js +0 -2
  53. package/dist/scripts/950-4b9770bfe3-lite.chunk.js.map +0 -1
  54. package/dist/scripts/bundle-be1688b50c.min.js.map +0 -1
  55. /package/dist/scripts/{5562-42375ce894-lite.chunk.js.LICENSE.txt → 5562-09db6be3de-lite.chunk.js.LICENSE.txt} +0 -0
  56. /package/dist/scripts/{7052-32d8266e82-lite.chunk.js.LICENSE.txt → 7052-a4d79c9f20-lite.chunk.js.LICENSE.txt} +0 -0
  57. /package/dist/scripts/{8055-f4de552821-lite.chunk.js.LICENSE.txt → 8055-a6d102b953-lite.chunk.js.LICENSE.txt} +0 -0
  58. /package/dist/scripts/{8139-37635f8bcd-lite.chunk.js.LICENSE.txt → 8139-2a36098eae-lite.chunk.js.LICENSE.txt} +0 -0
  59. /package/dist/scripts/{9395-181720391d-lite.chunk.js.LICENSE.txt → 9395-77dfcbad18-lite.chunk.js.LICENSE.txt} +0 -0
  60. /package/dist/scripts/{bundle-be1688b50c.min.js.LICENSE.txt → bundle-0187039e1a.min.js.LICENSE.txt} +0 -0
@@ -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":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[355,8960],{36199:(t,e,n)=>{var r;n.d(e,{V:()=>r}),function(t){t[t.Original=0]="Original",t[t.Copy=1]="Copy"}(r||(r={}))},94644:(t,e,n)=>{n.d(e,{r:()=>s});var r=n(50242),o=n(81886),i=n(67058),a=n(14553),c=n(49267),u=n(49075),l={notFound:i.d,forbidden:{rating:a.q,yearLevel:a.q,region:c.a,privacy:a.q},badRequest:u._};function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(t){var i;i="number"==typeof t?t:t.status;var a=Object.assign(Object.assign({},l),e);i&&o.Q.Ry.isStatusCodeError(i)&&(i!==r.o.NotFound?i!==r.o.Forbidden?n.badRequest||o.Q.Ry.throw(new a.badRequest):n.forbidden||o.Q.Ry.throw(new a.forbidden.privacy):n.notFound||o.Q.Ry.throw(new a.notFound))}}},91286:(t,e,n)=>{n.d(e,{v:()=>a});var r=n(32735),o=n(94644);function i(t){return t.map((function(t){return t.statusCode})).join(":")}function a(t,e,n){var a=Array.isArray(t)?t:[t];(0,r.useEffect)((function(){a.forEach((function(t){(0,o.r)(t.statusCode,e,n)}))}),[i(a),e,n])}},63649:(t,e,n)=>{n.d(e,{X:()=>i});var r=n(32735);const o={video:"ekpg6",notice:"lQs4F",heading:"Gt6uV",interaction:"LEfYX",button:"caHP7",edit:"de4DP",questions:"XelbS"};function i(t){var e=t.isEdit;return r.createElement("div",{className:"px-3 w-100 ".concat(e?o.edit:"")},e?r.createElement("div",{className:"d-flex justify-content-between align-items-center mb-3"},r.createElement("div",{className:"partial-loading-background ".concat(o.heading)}),r.createElement("div",null,r.createElement("div",{className:"partial-loading-background d-inline-block ".concat(o.button)}),r.createElement("div",{className:"partial-loading-background d-inline-block ms-2 ".concat(o.button)}))):r.createElement("div",{className:"partial-loading-background ".concat(o.notice)}),r.createElement("div",{className:"partial-loading-background mb-3 ".concat(o.video)},r.createElement("div",{className:"partial-loading-background ".concat(o.questions)})),r.createElement("div",{className:"partial-loading-background mb-3 ".concat(o.heading)}),r.createElement("div",null,Array(5).fill(null).map((function(t,e){return r.createElement("div",{key:e,className:"partial-loading-background my-2 ".concat(o.interaction)})}))))}},9064:(t,e,n)=>{function r(t){var e,n,r,o,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return null;var a=Object.assign(Object.assign({},i),{id:t.id,interactiveId:t.interactiveId,name:t.name,status:t.status,originType:t.originType});return(null===(e=null==t?void 0:t._parentClip)||void 0===e?void 0:e.id)&&(a.clip={id:null===(n=null==t?void 0:t._parentClip)||void 0===n?void 0:n.id}),(null===(r=null==t?void 0:t._parentVideo)||void 0===r?void 0:r.id)&&(a.video={id:null===(o=null==t?void 0:t._parentVideo)||void 0===o?void 0:o.id}),a}n.d(e,{T:()=>r})},9897:(t,e,n)=>{n.r(e),n.d(e,{EditInteractiveView:()=>tt});var r=n(32735),o=n(17082),i=n(81886),a=n(20354),c=n(49985),u=n(65858),l=n(5960),s=n(60051),f=n(61990),d=n(33803),y=n(39151),p=n(20768),b=n(47812),v=n(31949),m=n(91286),g=n(72596),h=n(38314),w=n(57052),E=n(14070),O=n(97291),j=n(23481),k=n(64364);function P(t){return P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},P(t)}function S(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,T(r.key),r)}}function T(t){var e=function(t,e){if("object"!=P(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!=P(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==P(e)?e:e+""}function I(t,e,n){return e=A(e),function(t,e){if(e&&("object"==P(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,_()?Reflect.construct(e,n||[],A(t).constructor):e.apply(t,n))}function _(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(_=function(){return!!t})()}function A(t){return A=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},A(t)}function C(t,e){return C=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},C(t,e)}var R="shared.cannotEditPublishedInteractive",N=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),I(this,e,[j.T.getPhrase(R,"title")])}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&C(t,e)}(e,t),n=e,(r=[{key:"name",get:function(){return"CannotEditPublishedInteractiveError"}},{key:"heading",get:function(){return j.T.getPhrase(R,"heading")}},{key:"description",get:function(){return j.T.getPhrase(R,"description")}}])&&S(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(k.H),F=n(63649),V=n(9064),x=n(70680),L=n(36199);function Q(t){return Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Q(t)}function U(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,q(r.key),r)}}function q(t){var e=function(t,e){if("object"!=Q(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!=Q(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Q(e)?e:e+""}function B(t,e,n){return e=M(e),function(t,e){if(e&&("object"==Q(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,D()?Reflect.construct(e,n||[],M(t).constructor):e.apply(t,n))}function D(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(D=function(){return!!t})()}function M(t){return M=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},M(t)}function X(t,e){return X=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},X(t,e)}var $="shared.cannotEditInteractive",H=function(t){function e(){return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),B(this,e,[j.T.getPhrase($,"title")])}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&X(t,e)}(e,t),n=e,(r=[{key:"name",get:function(){return"CannnotEditInteractiveError"}},{key:"heading",get:function(){return j.T.getPhrase($,"heading")}},{key:"description",get:function(){return j.T.getPhrase($,"description")}}])&&U(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,r}(k.H);function K(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,o,i,a,c=[],u=!0,l=!1;try{if(i=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=i.call(n)).done)&&(c.push(r.value),c.length!==e);u=!0);}catch(t){l=!0,o=t}finally{try{if(!u&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(t,e)||function(t,e){if(t){if("string"==typeof t)return G(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?G(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function G(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}var Z=function(t){var e=(0,x.I0)(),n=K(r.useState(!1),2),o=n[0],c=n[1],u=K(r.useState(!1),2),l=u[0],s=u[1];return r.useEffect((function(){if(t&&!l&&!o)if(t.originType!==L.V.Original){var n=function(){i.Q.Ry.throw(new H)};c(!0),a.a.fetch(e,p.b.copyInteractive(t.interactiveId,(function(r){var o={originType:L.V.Original,interactiveId:r.id};a.a.fetch(e,p.b.updateInteractiveMetadata(t.id,o,(function(){return s(!0)}),n))}),n))}else s(!0)}),[t]),l};function Y(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,o,i,a,c=[],u=!0,l=!1;try{if(i=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;u=!1}else for(;!(u=(r=i.call(n)).done)&&(c.push(r.value),c.length!==e);u=!0);}catch(t){l=!0,o=t}finally{try{if(!u&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(t,e)||function(t,e){if(t){if("string"==typeof t)return z(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}var J={application:O.O.INTERACTIVES,action:E.e.Interactives.EDIT_INTERACTIVE_DETAILS},W={notFound:f.l,forbidden:{privacy:d.G}};function tt(t){var e=Y(r.useState(!1),2),n=e[0],f=e[1],d=Y(r.useState(!1),2),E=d[0],O=d[1],j=r.useRef(),k=a.a.useBasicFetch(y.L.config()),P=a.a.useBasicFetch(v.N.currentUser()),S=a.a.useBasicFetch(!!P.data&&p.b.interactiveMetadata(t.id)),T=Z(S.data),I=a.a.useBasicFetch(T?b.k.createViewKey(S.data.id,s.f.MasterObject):null),_=a.a.useBasicFetch(v.N.token()),A=r.useMemo((function(){return(0,o.oD)()}),[]),C=r.useMemo((function(){return(0,o.oD)()}),[]),R=r.useRef();if((0,m.v)(S,W),!(I.data&&k.data&&S.data&&_.data))return r.createElement(F.X,{isEdit:!0});if(!E&&(O(!0),S.data.status!==l.X.Draft))return i.Q.Ry.throw(new N),null;var x=(0,V.T)(S.data),L={entity:u.py.Interactive,location:u.LZ.EditInteractive,workflowPhase:u.eu.Start};return r.createElement(r.Fragment,null,!n&&r.createElement(F.X,{isEdit:!0}),r.createElement("div",{className:"px-3 ".concat(n?"":"d-none")},r.createElement("div",{className:"d-flex justify-content-between align-items-center mb-3"},r.createElement("h1",{className:"h3 text-truncate mb-0 pb-1"},S.data.name),r.createElement("div",{className:"flex-shrink-0"},r.createElement(o.t0,{node:A}))),r.createElement(w.ClickViewInteractivePlayer,{viewKey:I.data.viewKey,imageApi:new URL(k.data.imageCdnUrl),playerApi:new URL(k.data.playerApiUrl),hotkeyElQuerySelector:"body",autoplay:!0,onReady:function(t){j.current=t,f(!0),R.current=new g.M({player:t,video:S.data,analyticsLocation:u.LZ.EditInteractive})},currentUser:P.data,mode:h.A.Create,actionsPortalNode:A,questionListPortalNode:C,authToken:_.data.value,onClickEditDetails:function(){c.k.logUserAction(x,Object.assign({actionType:u.Vw.Edit},L)),i.Q.C$.trigger(Object.assign(Object.assign({},J),{args:[t.id]}))},onClickPublish:function(){c.k.logUserAction(x,Object.assign({actionType:u.Vw.Publish},L)),i.Q.C$.trigger(Object.assign(Object.assign({},J),{args:[t.id],params:{publish:!0}}))},enableImmersiveReader:!0}),r.createElement(o.t0,{node:C})))}}}]);
2
- //# sourceMappingURL=355-81c86415d9-lite.chunk.js.map
2
+ //# sourceMappingURL=355-eaf55dc95f-lite.chunk.js.map