@clickview/lite 0.83.0-rc.0 → 0.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/css/2074-lite-ac8da6c78b.chunk.css +4 -0
- package/dist/languages/en.json +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js → 1199-da55d69853-lite.chunk.js} +1 -1
- package/dist/scripts/{1199-01cc084886-lite.chunk.js.map → 1199-da55d69853-lite.chunk.js.map} +1 -1
- package/dist/scripts/1202-d96ad80884-lite.chunk.js +2 -0
- package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +1 -0
- package/dist/scripts/{4208-0706461da6-lite.chunk.js → 1336-1826f6e582-lite.chunk.js} +2 -2
- package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +1 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js +3 -0
- package/dist/scripts/1938-c52383e98d-lite.chunk.js.map +1 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js +2 -0
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +1 -0
- package/dist/scripts/{2664-907153c03b-lite.chunk.js → 2664-87c8cbfa7f-lite.chunk.js} +2 -2
- package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +1 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js +2 -0
- package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +1 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js +2 -0
- package/dist/scripts/289-669c0c8222-lite.chunk.js.map +1 -0
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js → 3612-8c6423bd51-lite.chunk.js} +2 -2
- package/dist/scripts/{9911-8892b6dbfe-lite.chunk.js.map → 3612-8c6423bd51-lite.chunk.js.map} +1 -1
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js +3 -0
- package/dist/scripts/3836-bf1359bed7-lite.chunk.js.map +1 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +2 -0
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +1 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js +2 -0
- package/dist/scripts/3893-2856933742-lite.chunk.js.map +1 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +3 -0
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +1 -0
- package/dist/scripts/{4177-2d876c7b14-lite.chunk.js → 4177-285ddf9ae3-lite.chunk.js} +2 -2
- package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +1 -0
- package/dist/scripts/{4578-27028d26eb-lite.chunk.js → 4578-7578bcf17a-lite.chunk.js} +2 -2
- package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +1 -0
- package/dist/scripts/{4621-7fb0a05bcb-lite.chunk.js → 4621-1f79d94416-lite.chunk.js} +2 -2
- package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js +2 -0
- package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +1 -0
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js → 4948-de1c75e7fb-lite.chunk.js} +1 -1
- package/dist/scripts/{4948-ba684e5f4f-lite.chunk.js.map → 4948-de1c75e7fb-lite.chunk.js.map} +1 -1
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +2 -0
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +1 -0
- package/dist/scripts/{5554-f1f3baf822-lite.chunk.js → 5554-17bb3b86fc-lite.chunk.js} +2 -2
- package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +1 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js +2 -0
- package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +1 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js +2 -0
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +1 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js +2 -0
- package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-ba75701156-lite.chunk.js → 6909-a9b8930e37-lite.chunk.js} +2 -2
- package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +1 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js +2 -0
- package/dist/scripts/7401-833bc4a088-lite.chunk.js.map +1 -0
- package/dist/scripts/{7617-211f084b70-lite.chunk.js → 7617-9d34c841e6-lite.chunk.js} +2 -2
- package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +1 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js +2 -0
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +1 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js +2 -0
- package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +1 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +2 -0
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +1 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js +3 -0
- package/dist/scripts/8077-bfb3530f78-lite.chunk.js.map +1 -0
- package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js → 8133-ffcff3b7fc-lite.chunk.js} +3 -3
- package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +1 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js +3 -0
- package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +1 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js +2 -0
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +1 -0
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js → 9042-fdc5ecb459-lite.chunk.js} +1 -1
- package/dist/scripts/{9042-fd7e79b891-lite.chunk.js.map → 9042-fdc5ecb459-lite.chunk.js.map} +1 -1
- package/dist/scripts/9295-4242401e60-lite.chunk.js +2 -0
- package/dist/scripts/9295-4242401e60-lite.chunk.js.map +1 -0
- package/dist/scripts/{9742-3f6b75484a-lite.chunk.js → 9742-5f99d74bb0-lite.chunk.js} +2 -2
- package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +1 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js +2 -0
- package/dist/scripts/979-4b893e5603-lite.chunk.js.map +1 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js +2 -0
- package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +1 -0
- package/dist/scripts/bundle-dcea87749e.min.js +3 -0
- package/dist/scripts/{bundle-f926852f33.min.js.map → bundle-dcea87749e.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/1074-fdce06d863-lite.chunk.js +0 -2
- package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +0 -1
- package/dist/scripts/1938-e067e06dac-lite.chunk.js +0 -3
- package/dist/scripts/1938-e067e06dac-lite.chunk.js.map +0 -1
- package/dist/scripts/2664-907153c03b-lite.chunk.js.map +0 -1
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js +0 -2
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +0 -1
- package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +0 -1
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js +0 -3
- package/dist/scripts/3836-2c82a9fbf7-lite.chunk.js.map +0 -1
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js +0 -2
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +0 -1
- package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +0 -1
- package/dist/scripts/4208-0706461da6-lite.chunk.js.map +0 -1
- package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +0 -2
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +0 -1
- package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js +0 -2
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +0 -1
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js +0 -2
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +0 -1
- package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +0 -1
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +0 -2
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +0 -1
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +0 -2
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-ba75701156-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +0 -2
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +0 -1
- package/dist/scripts/7568-55e9b01367-lite.chunk.js +0 -3
- package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +0 -1
- package/dist/scripts/7617-211f084b70-lite.chunk.js.map +0 -1
- package/dist/scripts/7742-514844bd1a-lite.chunk.js +0 -2
- package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +0 -1
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js +0 -2
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +0 -1
- package/dist/scripts/8077-870bd8e245-lite.chunk.js +0 -3
- package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +0 -1
- package/dist/scripts/843-4dbc5df109-lite.chunk.js +0 -3
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +0 -1
- package/dist/scripts/8735-e74a148502-lite.chunk.js +0 -2
- package/dist/scripts/8735-e74a148502-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-2d332952ae-lite.chunk.js +0 -2
- package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +0 -1
- package/dist/scripts/904-2784e45cfc-lite.chunk.js +0 -2
- package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +0 -1
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js +0 -2
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +0 -1
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js +0 -2
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +0 -1
- package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +0 -1
- package/dist/scripts/979-6a70a0e616-lite.chunk.js +0 -2
- package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-f926852f33.min.js +0 -3
- /package/dist/css/{9528-lite-4a892bdbf2.chunk.css → 1202-lite-4a892bdbf2.chunk.css} +0 -0
- /package/dist/css/{7148-lite-856c02f000.chunk.css → 2888-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{904-lite-2435a34b13.chunk.css → 289-lite-2435a34b13.chunk.css} +0 -0
- /package/dist/css/{9911-lite-2b4142796a.chunk.css → 3612-lite-2b4142796a.chunk.css} +0 -0
- /package/dist/css/{8856-lite-f8e496136d.chunk.css → 5579-lite-f8e496136d.chunk.css} +0 -0
- /package/dist/css/{6550-lite-45dc286aab.chunk.css → 6070-lite-45dc286aab.chunk.css} +0 -0
- /package/dist/css/{2970-lite-5a317efacd.chunk.css → 787-lite-5a317efacd.chunk.css} +0 -0
- /package/dist/css/{843-lite-db31e36b79.chunk.css → 8364-lite-db31e36b79.chunk.css} +0 -0
- /package/dist/css/{8735-lite-856c02f000.chunk.css → 9911-lite-856c02f000.chunk.css} +0 -0
- /package/dist/scripts/{1938-e067e06dac-lite.chunk.js.LICENSE.txt → 1938-c52383e98d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt → 3836-bf1359bed7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3836-2c82a9fbf7-lite.chunk.js.LICENSE.txt → 4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7568-55e9b01367-lite.chunk.js.LICENSE.txt → 8077-bfb3530f78-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8077-870bd8e245-lite.chunk.js.LICENSE.txt → 8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{843-4dbc5df109-lite.chunk.js.LICENSE.txt → 8364-ff63447d36-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-f926852f33.min.js.LICENSE.txt → bundle-dcea87749e.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! For license information please see 4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt */
|
|
2
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4006],{8233:(e,t,n)=>{n.d(t,{R:()=>g});var r=n(23481),i=n(110),a=n(33518),o=n(4594),s=n(49080),c=n(26361),l=n(35223),u=n(31908);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var m=r.T.encloseNamespace("sharev2.utils"),g={getPrivateIconAndText:function(e){var t=e.entityTypeId,n=e.privacy,r=e.hasStudentExp,i=e.entity,s=e.yearGroups;if(t===o.E.Topic||t===o.E.Series)return{icon:l.vn.VisibleOn,text:m(r?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(n))switch(n){case a.e.Public:return{icon:l.vn.VisibleOn,text:m("publicDescription")};case a.e.ProtectedOverrideRestriction:return{icon:l.vn.VisibleOn,text:m("clickViewOnly")};case a.e.Protected:return{icon:l.vn.Lock,text:g.getRespectRatingText(i,s,r)};case a.e.JustMySchoolOverrideRestriction:return{icon:l.vn.Lock,text:m(r?"justMySchoolTeachers":"justMySchoolDescription")};case a.e.JustMySchool:return{icon:l.vn.Lock,text:g.getRespectRatingText(i,s,r)};case a.e.PinCode:return{icon:l.vn.Lock,text:m("pinDescription")};case a.e.PasswordProtected:return{icon:l.vn.Lock,text:m("password")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,n=e.isPasswordProtected,r=e.status;if(!t&&!n)return g.getPrivateIconAndText(e);if(!t)return{icon:l.vn.Lock,text:m("password")};var a=i.O.isToday(t),o=i.O.diffBetween(t,new Date,"day");if(!n){var c=a?m("expiryToday"):m("expiry",{days:o});return r===s.F.Expired&&(c=m("expired")),{icon:l.vn.Timer,text:c}}var u=a?m("passwordExpiryToday"):m("passwordExpiry",{days:o});return r===s.F.Expired&&(u=m("passwordExpired")),{icon:l.vn.Lock,text:u}},getRespectRatingText:function(e,t,n){var r;if(!e||!t)return null;if(n)return m("justMySchoolTeachers");if(!u.M.isVideoType(e))return m("collectionRating");var i=c.l.getWeightedRestriction(null===(r=e._restrictions)||void 0===r?void 0:r.value);if(i&&!i.yearGroup)return m("onlyAdmins");var a,o,s,l=u.M.getRating(e),g=function(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return d(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}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 a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw a}}}}(t);try{for(g.s();!(s=g.n()).done;){var p=s.value;(!a||p.value>a.value)&&(a=p),i&&p.value<=i.yearGroup||l&&p.rating.value<l.value||(!o||p.value<o.value)&&(o=p)}}catch(e){g.e(e)}finally{g.f()}return o?1===t.length?m("clickViewOnly"):o.value===a.value?m("maxYearGroup",{yearGroup:a.name}):m("yearGroupRange",{yearGroup:o.name}):m("onlyStaff")},getShareLinkAccessType:function(e){return e.isTvContent||e.isClickViewContent?"protected":e.canManageAccess?"owner":"private"}}},53172:(e,t,n)=>{n.d(t,{l:()=>l});var r=n(32735),i=n(31453),a=n(83914),o=n(83345),s=n(35223),c="shared.premiumBadge";function l(e){return r.createElement("span",{className:(0,i.A)("badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center","fw-medium text-indigo","sm"===e.size?"badge-sm":"badge-std",e.invert?"bg-white":"bg-light-indigo",e.className)},r.createElement(a.x,{svgName:s.vn.StarOutline,size:a.S.Medium}),r.createElement(o.x,{phrase:"premium",namespace:c}))}},14006:(e,t,n)=>{n.r(t),n.d(t,{OpenClassroomFlowView:()=>ne});var r=n(32735),i=n(89067),a=n(37241),o=n(68050),s=n(69111),c=n(23481),l=n(15611),u=n(9111),d=n(53172),m=n(83345),g=n(99742),p=n(14070),f=n(97291),b=n(83351),h="assign.hardGateOpenClassroom",v=c.T.encloseNamespace(h);function y(e){return r.createElement(u.G,{size:"lg",animation:e.animate,closePopup:e.closePopup,hideTitle:!0},r.createElement(a.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3",closeButton:!0},r.createElement(a.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},v("title"),r.createElement("span",{className:"d-inline-block me-2"},r.createElement(d.l,{size:"std"})))),r.createElement(o.Z,{className:"mb-3"},r.createElement(s.Z,{xs:12,md:8,className:"offset-md-2 d-flex flex-column align-items-center"},r.createElement("img",{src:g.W.EmptyStates.Share.NO_CLASSROOM,alt:"No Open Classroom",className:"mb-3"}),r.createElement("h2",{className:"h6 text-center mb-3"},r.createElement(m.x,{namespace:h,phrase:"heading"})),r.createElement("p",{className:"text-center"},r.createElement(m.x,{namespace:h,phrase:"description"})),r.createElement(l.F,{appLink:{application:f.O.SIGN_UP,action:p.e.SignUp.INVITE_COLLEAGUE},className:"btn btn-link text-info py-0"},r.createElement(m.x,{namespace:h,phrase:"cta"})))),r.createElement(b.P,{onClickBack:e.goToFlowSelector,hideNextButton:!0,hideCreateClassroomButton:!0}))}var S=n(82664),x=n(65858),T=n(99998),w=n(7786),E=n(8233),R=n(32781),k=n(91693),I=n(12528),C=n(83914),A=n(35223),N="assign.openClassroomFlowInfoHeader";function O(e){return r.createElement(m.D.Provider,{value:N},r.createElement("div",{className:"p-3 bg-light-blue rounded rounded-2 gap-3 d-flex flex-row"},r.createElement("div",{className:"d-none d-md-block"},r.createElement("div",null,r.createElement(I.f,{svgName:A.vn.Classrooms,svgSize:C.S.Standard,variant:"blue",textVariant:"white",svgWrapperClassName:"p-1"}))),r.createElement("div",{className:"position-relative w-100"},r.createElement("h3",{className:"h6"},r.createElement(m.x,{phrase:"title"})),r.createElement("p",{className:"mb-0"},r.createElement(m.x,{phrase:"description"})),r.createElement("div",{className:"position-absolute top-0 end-0"},r.createElement(k.h,{svgName:A.vn.Close,onClick:e.onClose,className:"btn-close p-2"})))))}var j=c.T.encloseNamespace("assign.openClassroomFlowSettings");function P(e){var t=E.R.getRespectRatingText(e.entity,e.yearGroups,e.hasStudentExp);return r.createElement("div",{className:"d-flex flex-column gap-4"},e.showHeader&&r.createElement(O,{onClose:e.closeHeader}),r.createElement(R.m,null,r.createElement(R.m.Input,{title:j("openClassroomNameTitle"),className:"col-lg-6",value:e.openClassroomName,onChange:e.onChangeOpenClassroomName,placeholder:j("openClassroomNamePlaceholder"),error:e.error.name})),r.createElement(R.m.Divider,{hide:e.hidePreventScrubbing&&e.hideImmediateFeedback}),r.createElement(R.m,{name:j("videoSettingsTitle"),hide:e.hidePreventScrubbing&&e.hideImmediateFeedback},r.createElement(R.m.Toggle,{hide:e.hidePreventScrubbing,title:j("preventScrubbingTitle"),description:j("preventScrubbingDescription"),onClick:e.onTogglePreventScrubbing,toggled:e.preventScrubbing,disabled:e.disablePreventScrubbing}),r.createElement(R.m.Toggle,{hide:e.hideImmediateFeedback,title:j("immediateFeedbackTitle"),description:j("immediateFeedbackDescription"),onClick:e.onToggleImmediateFeedback,toggled:e.immediateFeedback,disabled:e.disableImmediateFeedback})),r.createElement(R.m.Divider,{hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions}),r.createElement(R.m,{name:j("studentAccessTitle"),hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions},r.createElement(R.m.Toggle,{hide:e.hideRequiresStudentSignIn,title:j("requiresStudentSignInTitle"),description:j("requiresStudentSignInDescription"),onClick:e.onToggleRequiresStudentSignIn,toggled:e.toggleRequiresStudentSignIn,disabled:e.disableRequiresStudentSignIn}),r.createElement(R.m.Toggle,{hide:e.hideRespectRatingsAndRestrictions,title:j("respectRatingsAndRestrictionsTitle"),description:t,onClick:e.onToggleRespectRatingsAndRestrictions,toggled:e.toggleRespectRatingsAndRestrictions,disabled:e.disableRespectRatingsAndRestrictions})),r.createElement(R.m.Divider,{hide:e.hideRequiresStudentSignIn&&e.hideRespectRatingsAndRestrictions||e.hideMessage}),r.createElement(R.m,{name:j("moreOptionsTitle"),hide:e.hideMessage,childContainerClassName:"d-flex flex-column gap-2"},r.createElement(R.m.Toggle,{hide:e.hideMessage,title:j("messageTitle"),description:j("messageDescription"),onClick:e.onToggleMessage,toggled:e.toggleMessage,disabled:e.disableMessage},r.createElement(R.m.TextArea,{hide:!e.toggleMessage,placeholder:j("messagePlaceholder"),onChange:e.onChangeMessage,value:e.message}))))}var F=n(57900),M=n(2948),G=n(20354),D=n(80687),q=n(1666),B=n(69883),L=n(95890);function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function V(){var e,t,n="function"==typeof Symbol?Symbol:{},r=n.iterator||"@@iterator",i=n.toStringTag||"@@toStringTag";function a(n,r,i,a){var c=r&&r.prototype instanceof s?r:s,l=Object.create(c.prototype);return H(l,"_invoke",function(n,r,i){var a,s,c,l=0,u=i||[],d=!1,m={p:0,n:0,v:e,a:g,f:g.bind(e,4),d:function(t,n){return a=t,s=0,c=e,m.n=n,o}};function g(n,r){for(s=n,c=r,t=0;!d&&l&&!i&&t<u.length;t++){var i,a=u[t],g=m.p,p=a[2];n>3?(i=p===r)&&(c=a[(s=a[4])?5:(s=3,3)],a[4]=a[5]=e):a[0]<=g&&((i=n<2&&g<a[1])?(s=0,m.v=r,m.n=a[1]):g<p&&(i=n<3||a[0]>r||r>p)&&(a[4]=n,a[5]=r,m.n=p,s=0))}if(i||n>1)return o;throw d=!0,r}return function(i,u,p){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&g(u,p),s=u,c=p;(t=s<2?e:c)||!d;){a||(s?s<3?(s>1&&(m.n=-1),g(s,c)):m.n=c:m.v=c);try{if(l=2,a){if(s||(i="next"),t=a[i]){if(!(t=t.call(a,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,s<2&&(s=0)}else 1===s&&(t=a.return)&&t.call(a),s<2&&(c=TypeError("The iterator does not provide a '"+i+"' method"),s=1);a=e}else if((t=(d=m.n<0)?c:n.call(r,m))!==o)break}catch(t){a=e,s=1,c=t}finally{l=1}}return{value:t,done:d}}}(n,i,a),!0),l}var o={};function s(){}function c(){}function l(){}t=Object.getPrototypeOf;var u=[][r]?t(t([][r]())):(H(t={},r,function(){return this}),t),d=l.prototype=s.prototype=Object.create(u);function m(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,l):(e.__proto__=l,H(e,i,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=l,H(d,"constructor",l),H(l,"constructor",c),c.displayName="GeneratorFunction",H(l,i,"GeneratorFunction"),H(d),H(d,i,"Generator"),H(d,r,function(){return this}),H(d,"toString",function(){return"[object Generator]"}),(V=function(){return{w:a,m}})()}function H(e,t,n,r){var i=Object.defineProperty;try{i({},"",{})}catch(e){i=0}H=function(e,t,n,r){if(t)i?i(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n;else{var a=function(t,n){H(e,t,function(e){return this._invoke(t,n,e)})};a("next",0),a("throw",1),a("return",2)}},H(e,t,n,r)}function Z(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return z(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var U=function(e,t,n,r){return new(n||(n=Promise))(function(i,a){function o(e){try{c(r.next(e))}catch(e){a(e)}}function s(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(o,s)}c((r=r.apply(e,t||[])).next())})},W=c.T.encloseNamespace("assign.useOpenClassroomFlowData"),$={immediateFeedback:!1,preventScrubbing:!1,message:!1,requiresStudentSignIn:!1,respectRatingsAndRestrictions:!1},J=128,Y="assign:open:classroom:flow:settings:header";function K(e){var t,n,i,a=(0,B.Z)(),o=Z((0,M.D)(Y,!0,{storage:F.Z1.LocalStorage}),2),s=o[0],c=o[1],l=(0,L._)({entityType:e.entityType,objectId:e.objectId}),u=G.a.useBasicFetch(q.h.yearGroups(null===(t=l.currentUser.data)||void 0===t?void 0:t.customerId)),d=(0,D.t)(e.objectId).createOpenSession,m=Z(r.useState(Object.assign(Object.assign({},$),{preventScrubbing:(null===(n=l.interactive.data)||void 0===n?void 0:n.preventScrubbing)||!1,immediateFeedback:(null===(i=l.interactive.data)||void 0===i?void 0:i.immediateFeedback)||!1})),2),g=m[0],p=m[1],f=Z(r.useState(""),2),b=f[0],h=f[1],v=Z(r.useState(""),2),y=v[0],S=v[1],x=Z(r.useState(!1),2),T=x[0],w=x[1],E=Z(r.useState({}),2),R=E[0],k=E[1],I=0===Object.keys(R).length;return{data:{loaded:l.loaded&&!!u.data,entity:l.entity,yearGroups:u},showHeader:s,hasStudentExp:l.hasStudentExp,shouldShowSpinner:T,nextButtonText:W("nextButton"),name:b,message:y,settings:g,setMessage:S,setShowHeader:c,toggleSetting:function(e){!function(e,t){var n,r,i,a=(n={},i=t,(r=function(e){var t=function(e){if("object"!=_(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==_(t)?t:t+""}(r=e))in n?Object.defineProperty(n,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[r]=i,n);"respectRatingsAndRestrictions"===e&&(a.requiresStudentSignIn=t),p(function(e){return Object.assign(Object.assign({},e),a)})}(e,!g[e])},setOpenClassroomName:function(e){e.length>J?k(function(e){return Object.assign(Object.assign({},e),{name:W("errorNameTooLong")})}):k(function(e){return delete e.name,e}),h(e)},onShare:function(t){return U(this,void 0,void 0,V().m(function n(){var r;return V().w(function(n){for(;;)switch(n.n){case 0:if(I){n.n=1;break}return n.a(2);case 1:return w(!0),n.p=2,n.n=3,d({name:b,objectId:e.objectId,immediateFeedback:g.immediateFeedback,preventScrubbing:g.preventScrubbing,requireSignIn:g.requiresStudentSignIn,respectRatingsAndRestrictions:g.respectRatingsAndRestrictions});case 3:r=n.v,"function"==typeof t&&t(r),w(!1),n.n=5;break;case 4:n.p=4,n.v,a.error(W("createError"));case 5:return n.p=5,w(!1),n.f(5);case 6:return n.a(2)}},n,null,[[2,4,5,6]])}))},error:R,setError:k,isValid:I,openClassroomGatedPermission:l.openClassroomGatedPermission}}var Q=c.T.encloseNamespace("assign.openClassroomFlowSettingsView");function X(e){var t=K({entityType:e.entityType,objectId:e.objectId}),n=(0,T.R)(),i=n.experience,o=n.loading,s=t.data,c=s.loaded,l=s.entity,m=s.yearGroups,g=(0,w.y)({data:{entity:{id:e.objectId,type:e.entityType}},analyticsOptions:{location:x.LZ.Popup}}).log,p=!c||o||e.loading;return r.createElement(u.G,{size:"lg",title:Q("title"),showLoadingSpinner:p,closePopup:e.closePopup,bodyClassName:"d-flex flex-column gap-3",animation:e.animate,hideTitle:"soft-gate"===t.openClassroomGatedPermission},"soft-gate"===t.openClassroomGatedPermission&&r.createElement(a.Z.Header,{className:"d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3 mb-3",closeButton:!0},r.createElement(a.Z.Title,{as:"h2",className:"h4 flex-grow-1 d-flex justify-content-between align-items-center"},Q("title"),r.createElement("span",{className:"d-inline-block me-2"},r.createElement(d.l,{size:"std"})))),r.createElement(P,{entity:l.data,error:t.error,showHeader:t.showHeader,openClassroomName:t.name,onChangeOpenClassroomName:t.setOpenClassroomName,message:t.message,yearGroups:m.data,hasStudentExp:t.hasStudentExp,toggleMessage:t.settings.message,immediateFeedback:t.settings.immediateFeedback,preventScrubbing:t.settings.preventScrubbing,toggleRequiresStudentSignIn:t.settings.requiresStudentSignIn,toggleRespectRatingsAndRestrictions:t.settings.respectRatingsAndRestrictions,hideMessage:!0,onChangeMessage:t.setMessage,onToggleMessage:function(){return t.toggleSetting("message")},hidePreventScrubbing:"interactive"!==e.entityType,hideImmediateFeedback:"interactive"!==e.entityType,hideRequiresStudentSignIn:"full"!==i,hideRespectRatingsAndRestrictions:"full"!==i,onTogglePreventScrubbing:function(){return t.toggleSetting("preventScrubbing")},onToggleImmediateFeedback:function(){return t.toggleSetting("immediateFeedback")},onToggleRequiresStudentSignIn:function(){return t.toggleSetting("requiresStudentSignIn")},onToggleRespectRatingsAndRestrictions:function(){return t.toggleSetting("respectRatingsAndRestrictions")},closeHeader:function(){return t.setShowHeader(!1)},disableRequiresStudentSignIn:t.settings.respectRatingsAndRestrictions}),r.createElement(b.P,{hideCreateClassroomButton:!0,hideBackButton:e.hideBackButton||"soft-gate"===t.openClassroomGatedPermission,onClickBack:e.goToFlowSelector,onClickNext:function(){t.onShare(function(t){g({type:"create-open-classroom",share:t}),g({type:"share-open-classroom",id:t.objectId,shareId:t.shareId,shareType:t.type}),e.setShare(t),e.goToAssignDetails()})},nextButtonText:t.nextButtonText,showSpinner:t.shouldShowSpinner,disableNextButton:!t.isValid}))}function ee(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,a,o,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,i=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw i}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?te(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function ne(e){var t=ee(r.useState(e.openClassroomInitialStep),2),n=t[0],a=t[1],o=ee(r.useState(),2),s=o[0],c=o[1],l={objectId:e.objectId,entityType:e.entityType,closePopup:e.closePopup,goToFlowSelector:e.goToFlowSelector,shareId:null==s?void 0:s.shareId,initialDetailsScreen:"share-link",goToAssignDetails:function(){return a("assign-details")},setShare:c};return r.createElement(i.r,{data:l,animate:!1,step:n,setStep:a,closePopup:e.closePopup,steps:{settings:{view:X},"assign-details":{view:S.AssignDetailsView},"hard-gate":{view:y}}})}}}]);
|
|
3
|
+
//# sourceMappingURL=4006-9dfe9cec1b-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4006-9dfe9cec1b-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/components/premium-badge/PremiumBadge.tsx","file:///app/packages/projects/lite/src/apps/assign/views/hard-gate-open-classroom-view/HardGateOpenClassroomView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-info-header/OpenClassroomFlowInfoHeader.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/components/open-classroom-flow-settings/OpenClassroomFlowSettings.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData.ts","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-settings-view/OpenClassroomFlowSettingsView.tsx","file:///app/packages/projects/lite/src/apps/assign/views/open-classroom-flow-view/OpenClassroomFlowView.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport type { SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport type { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'sharev2.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacy;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\ninterface GetPrivateIconAndTextOptions {\n privacy: SharePrivacy;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetPrivateIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy) {\n case SharePrivacy.Public:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case SharePrivacy.ProtectedOverrideRestriction:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n case SharePrivacy.Protected:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.JustMySchoolOverrideRestriction:\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n case SharePrivacy.JustMySchool:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.PinCode:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('pinDescription') };\n case SharePrivacy.PasswordProtected:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n },\n\n getShareLinkAccessType(privacy: SharePrivacyResponse): 'private' | 'owner' | 'protected' {\n /**\n * If an entity is not a ClickView content and they cannot manage access\n * settings of the entity (which they can if its their private entity)\n * it means that its a TV content\n */\n if (privacy.isTvContent || privacy.isClickViewContent)\n return 'protected';\n\n if (privacy.canManageAccess)\n return 'owner';\n\n return 'private';\n }\n};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'shared.premiumBadge';\n\ninterface PremiumBadgeProps {\n invert?: boolean;\n size: 'sm' | 'std';\n className?: string;\n}\n\nexport function PremiumBadge(props: PremiumBadgeProps): JSX.Element {\n return (\n <span className={classNames(\n 'badge badge-wrapper rounded-pill d-flex align-items-center justify-content-center',\n 'fw-medium text-indigo',\n props.size === 'sm' ? 'badge-sm' : 'badge-std',\n props.invert ? 'bg-white' : 'bg-light-indigo',\n props.className\n )}>\n <SvgContainer svgName={cvSvgLibrary.StarOutline} size={SvgContainerSize.Medium} />\n <Text phrase='premium' namespace={namespace} />\n </span>\n );\n}","import React from 'react';\nimport { Col, Modal, Row } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\nimport { 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\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\n\nconst namespace = 'assign.hardGateOpenClassroom';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface HardGateOpenClassroomViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n}\n\nexport function HardGateOpenClassroomView(props: HardGateOpenClassroomViewProps): JSX.Element {\n return (\n <Popup\n size='lg'\n animation={props.animate}\n closePopup={props.closePopup}\n hideTitle\n >\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase('title')}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n <Row className='mb-3'>\n <Col xs={12} md={8} className='offset-md-2 d-flex flex-column align-items-center'>\n <img src={ImageUrls.EmptyStates.Share.NO_CLASSROOM} alt='No Open Classroom' className='mb-3' />\n <h2 className='h6 text-center mb-3'><Text namespace={namespace} phrase='heading' /></h2>\n <p className='text-center'>\n <Text namespace={namespace} phrase='description' />\n </p>\n <AppLink\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.INVITE_COLLEAGUE\n }}\n className='btn btn-link text-info py-0'\n >\n <Text namespace={namespace} phrase='cta' />\n </AppLink>\n </Col>\n </Row>\n \n <FlowControls\n onClickBack={props.goToFlowSelector}\n hideNextButton\n hideCreateClassroomButton\n />\n </Popup>\n );\n}","import React from 'react';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'assign.openClassroomFlowInfoHeader';\n\ninterface OpenClassroomFlowInfoHeaderProps {\n onClose: () => void;\n}\n\nexport function OpenClassroomFlowInfoHeader(props: OpenClassroomFlowInfoHeaderProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='p-3 bg-light-blue rounded rounded-2 gap-3 d-flex flex-row'>\n <div className='d-none d-md-block'>\n <div>\n <IconCircle\n svgName={cvSvgLibrary.Classrooms}\n svgSize={SvgContainerSize.Standard}\n variant='blue'\n textVariant='white'\n svgWrapperClassName='p-1'\n />\n </div>\n </div>\n <div className='position-relative w-100'>\n <h3 className='h6'><Text phrase='title' /></h3>\n <p className='mb-0'><Text phrase='description' /></p>\n <div className='position-absolute top-0 end-0'>\n <IconButton svgName={cvSvgLibrary.Close} onClick={props.onClose} className='btn-close p-2' />\n </div>\n </div>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ShareLinkHelper } from 'libs/shared/apps/share-v2/utils/ShareLinkHelper';\nimport { SharableEntity } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { FlowSettings } from 'apps/assign/components/flow-settings/FlowSettings';\n\nimport { OpenClassroomFlowSettingsError } from '../../hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData';\nimport { OpenClassroomFlowInfoHeader } from '../open-classroom-flow-info-header/OpenClassroomFlowInfoHeader';\n\nconst namespace = 'assign.openClassroomFlowSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SettingsFieldProps {\n // Open classroom name field\n openClassroomName: string;\n onChangeOpenClassroomName: (name: string) => void;\n \n // Prevent scrubbing field\n hidePreventScrubbing?: boolean;\n disablePreventScrubbing?: boolean;\n onTogglePreventScrubbing: () => void;\n preventScrubbing: boolean;\n \n // Immediate feedback field\n hideImmediateFeedback?: boolean;\n disableImmediateFeedback?: boolean;\n onToggleImmediateFeedback: () => void;\n immediateFeedback: boolean;\n\n // Require student sign in field\n hideRequiresStudentSignIn?: boolean;\n disableRequiresStudentSignIn?: boolean;\n onToggleRequiresStudentSignIn: () => void;\n toggleRequiresStudentSignIn: boolean;\n\n // Respect ratings and restrictions field\n hideRespectRatingsAndRestrictions?: boolean;\n disableRespectRatingsAndRestrictions?: boolean;\n onToggleRespectRatingsAndRestrictions: () => void;\n toggleRespectRatingsAndRestrictions: boolean;\n \n // Message field\n hideMessage?: boolean;\n disableMessage?: boolean;\n message: string;\n onChangeMessage: (message: string) => void;\n onToggleMessage: () => void;\n toggleMessage: boolean;\n}\n\ninterface OpenClassroomFlowSettingsProps extends SettingsFieldProps {\n hasStudentExp: boolean;\n entity: SharableEntity;\n yearGroups: YearGroup[];\n closeHeader: () => void;\n showHeader: boolean;\n error: OpenClassroomFlowSettingsError;\n}\n\nexport function OpenClassroomFlowSettings(props: OpenClassroomFlowSettingsProps): JSX.Element {\n const respectRatingText = ShareLinkHelper.getRespectRatingText(\n props.entity,\n props.yearGroups,\n props.hasStudentExp\n );\n \n return (\n <div className='d-flex flex-column gap-4'>\n {props.showHeader &&\n <OpenClassroomFlowInfoHeader onClose={props.closeHeader} />\n }\n \n <FlowSettings>\n <FlowSettings.Input\n title={getPhrase('openClassroomNameTitle')}\n className='col-lg-6'\n value={props.openClassroomName}\n onChange={props.onChangeOpenClassroomName}\n placeholder={getPhrase('openClassroomNamePlaceholder')}\n error={props.error.name}\n />\n </FlowSettings>\n \n <FlowSettings.Divider hide={props.hidePreventScrubbing && props.hideImmediateFeedback} />\n \n <FlowSettings\n name={getPhrase('videoSettingsTitle')}\n hide={props.hidePreventScrubbing && props.hideImmediateFeedback}\n >\n <FlowSettings.Toggle\n hide={props.hidePreventScrubbing}\n title={getPhrase('preventScrubbingTitle')}\n description={getPhrase('preventScrubbingDescription')}\n onClick={props.onTogglePreventScrubbing}\n toggled={props.preventScrubbing}\n disabled={props.disablePreventScrubbing}\n />\n <FlowSettings.Toggle\n hide={props.hideImmediateFeedback}\n title={getPhrase('immediateFeedbackTitle')}\n description={getPhrase('immediateFeedbackDescription')}\n onClick={props.onToggleImmediateFeedback}\n toggled={props.immediateFeedback}\n disabled={props.disableImmediateFeedback}\n />\n </FlowSettings>\n\n <FlowSettings.Divider hide={props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions} />\n\n <FlowSettings\n name={getPhrase('studentAccessTitle')}\n hide={props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions}\n >\n <FlowSettings.Toggle\n hide={props.hideRequiresStudentSignIn}\n title={getPhrase('requiresStudentSignInTitle')}\n description={getPhrase('requiresStudentSignInDescription')}\n onClick={props.onToggleRequiresStudentSignIn}\n toggled={props.toggleRequiresStudentSignIn}\n disabled={props.disableRequiresStudentSignIn}\n />\n <FlowSettings.Toggle\n hide={props.hideRespectRatingsAndRestrictions}\n title={getPhrase('respectRatingsAndRestrictionsTitle')}\n description={respectRatingText}\n onClick={props.onToggleRespectRatingsAndRestrictions}\n toggled={props.toggleRespectRatingsAndRestrictions}\n disabled={props.disableRespectRatingsAndRestrictions}\n />\n </FlowSettings>\n \n <FlowSettings.Divider hide={\n (props.hideRequiresStudentSignIn && props.hideRespectRatingsAndRestrictions)\n || props.hideMessage}\n />\n \n <FlowSettings\n name={getPhrase('moreOptionsTitle')}\n hide={props.hideMessage}\n childContainerClassName='d-flex flex-column gap-2'\n >\n <FlowSettings.Toggle\n hide={props.hideMessage}\n title={getPhrase('messageTitle')}\n description={getPhrase('messageDescription')}\n onClick={props.onToggleMessage}\n toggled={props.toggleMessage}\n disabled={props.disableMessage}\n >\n <FlowSettings.TextArea\n hide={!props.toggleMessage}\n placeholder={getPhrase('messagePlaceholder')}\n onChange={props.onChangeMessage}\n value={props.message}\n />\n </FlowSettings.Toggle>\n </FlowSettings>\n \n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { StorageType } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { useCreateShare } from 'libs/shared/apps/share-v2/hooks/useCreateShare';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\n\nconst namespace = 'assign.useOpenClassroomFlowData';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseOpenClassroomFlowDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\ntype OpenClassroomFlowSettings = 'preventScrubbing' | 'immediateFeedback' | 'requiresStudentSignIn' | 'respectRatingsAndRestrictions' | 'message';\ntype OpenClassroomFlowSettingsMap = {[key in OpenClassroomFlowSettings]: boolean};\nexport type OpenClassroomFlowSettingsError = {\n name?: string\n};\n\nconst initialSettings: OpenClassroomFlowSettingsMap = {\n immediateFeedback: false,\n preventScrubbing: false,\n message: false,\n requiresStudentSignIn: false,\n respectRatingsAndRestrictions: false\n};\n\nconst MAX_OPEN_CLASSROOM_NAME_LENGTH = 128;\n\nconst VIEW_MODEL_KEY = 'assign:open:classroom:flow:settings:header';\n\nexport function useOpenClassroomFlowSettingsData(options: UseOpenClassroomFlowDataOptions) {\n const alert = useAlerts();\n\n /**\n * We store this in Local storage so that if they user deliberatly\n * closes this we dont show this again\n */\n const [ showHeader, setShowHeader ] = useViewModel(VIEW_MODEL_KEY, true, { storage: StorageType.LocalStorage });\n \n const sharedData = useAssignSharedData({\n entityType: options.entityType,\n objectId: options.objectId\n });\n\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n CustomerRequests.yearGroups(sharedData.currentUser.data?.customerId)\n );\n\n const { createOpenSession } = useCreateShare(options.objectId);\n \n const [ settings, setSettings ] = React.useState<OpenClassroomFlowSettingsMap>({\n ...initialSettings,\n preventScrubbing: sharedData.interactive.data?.preventScrubbing || false,\n immediateFeedback: sharedData.interactive.data?.immediateFeedback || false\n });\n const [ name, setName ] = React.useState('');\n const [ message, setMessage ] = React.useState('');\n const [ loading, setLoading ] = React.useState(false);\n const [ error, setError ] = React.useState<OpenClassroomFlowSettingsError>({});\n\n const isValid = Object.keys(error).length === 0;\n\n function onChangeSetting(setting: OpenClassroomFlowSettings, value: boolean) {\n const newSettings: Partial<OpenClassroomFlowSettingsMap> = {\n [setting]: value\n };\n /*\n * If respect ratings and restrictions is toggled\n * we always toggle requires student sign in option too\n * - Nish\n */\n if (setting === 'respectRatingsAndRestrictions') {\n newSettings['requiresStudentSignIn'] = value;\n }\n \n setSettings(prev => ({\n ...prev,\n ...newSettings\n }));\n }\n\n async function onShare(onSuccess?: (share: Share) => void) {\n if (!isValid) {\n return;\n }\n\n setLoading(true);\n try {\n const share = await createOpenSession({\n name,\n objectId: options.objectId,\n immediateFeedback: settings.immediateFeedback,\n preventScrubbing: settings.preventScrubbing,\n requireSignIn: settings.requiresStudentSignIn,\n respectRatingsAndRestrictions: settings.respectRatingsAndRestrictions\n });\n\n typeof onSuccess === 'function' && onSuccess(share);\n \n setLoading(false);\n } catch (ex: unknown) {\n alert.error(getPhrase('createError'));\n } finally {\n setLoading(false);\n }\n }\n\n function toggleSetting(setting: OpenClassroomFlowSettings) {\n onChangeSetting(setting, !settings[setting]);\n }\n\n function setOpenClassroomName(name: string) {\n if (name.length > MAX_OPEN_CLASSROOM_NAME_LENGTH) {\n setError(prev => ({\n ...prev,\n name: getPhrase('errorNameTooLong')\n }));\n } else {\n setError(prev => {\n delete prev.name;\n return prev;\n });\n }\n setName(name);\n }\n\n const loaded = sharedData.loaded\n && !!yearGroups.data;\n\n return {\n data: {\n loaded,\n entity: sharedData.entity,\n yearGroups: yearGroups\n },\n showHeader,\n hasStudentExp: sharedData.hasStudentExp,\n shouldShowSpinner: loading,\n nextButtonText: getPhrase('nextButton'),\n name,\n message,\n settings,\n setMessage,\n setShowHeader,\n toggleSetting,\n setOpenClassroomName,\n onShare,\n error,\n setError,\n isValid,\n openClassroomGatedPermission: sharedData.openClassroomGatedPermission\n };\n}","import React from 'react';\nimport { Modal } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PremiumBadge } from 'libs/shared/components/premium-badge/PremiumBadge';\n\nimport { useClassroomExperience } from 'shared/hooks/useClassroomExperience';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { getAssignEventLogger } from 'apps/assign/utils/get-assign-event-logger/getAssignEventLogger';\n\nimport { OpenClassroomFlowSettings } from './components/open-classroom-flow-settings/OpenClassroomFlowSettings';\nimport { useOpenClassroomFlowSettingsData } from './hooks/use-open-classroom-flow-settings-data/useOpenClassroomFlowSettingsData';\n\nconst namespace = 'assign.openClassroomFlowSettingsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface OpenClassroomFlowSettingsViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n\n setShare: (share: Share) => void;\n goToFlowSelector: () => void;\n goToAssignDetails: () => void;\n hideBackButton?: boolean;\n}\n\nexport function OpenClassroomFlowSettingsView(props: OpenClassroomFlowSettingsViewProps): JSX.Element {\n const viewModel = useOpenClassroomFlowSettingsData({\n entityType: props.entityType,\n objectId: props.objectId\n });\n\n const { experience, loading: isLoadingExperience } = useClassroomExperience();\n\n const {\n loaded,\n entity,\n yearGroups\n } = viewModel.data;\n\n const { log } = getAssignEventLogger({\n data: {\n entity: {\n id: props.objectId,\n type: props.entityType\n }\n },\n analyticsOptions: {\n location: LocationContext.Popup\n }\n });\n\n function onClickNext() {\n viewModel.onShare(share => {\n // Create event is logged for EventAggregator to send emails - Sha\n log({\n type: 'create-open-classroom',\n share\n });\n // Share event is logged for continuity with the V1 share analytics - Sha\n log({\n type: 'share-open-classroom',\n id: share.objectId,\n shareId: share.shareId,\n shareType: share.type\n });\n \n props.setShare(share);\n props.goToAssignDetails();\n });\n }\n\n const loading = !loaded || isLoadingExperience || props.loading;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n bodyClassName='d-flex flex-column gap-3'\n animation={props.animate}\n hideTitle={viewModel.openClassroomGatedPermission === 'soft-gate'}\n >\n {viewModel.openClassroomGatedPermission === 'soft-gate' &&\n <Modal.Header className='d-flex align-items-center justify-content-between bg-white mx-n3 mt-n3 mb-3' closeButton>\n <Modal.Title as='h2' className='h4 flex-grow-1 d-flex justify-content-between align-items-center'>\n {getPhrase('title')}\n <span className='d-inline-block me-2'><PremiumBadge size='std' /></span>\n </Modal.Title>\n </Modal.Header>\n }\n <OpenClassroomFlowSettings\n entity={entity.data}\n error={viewModel.error}\n showHeader={viewModel.showHeader}\n openClassroomName={viewModel.name}\n onChangeOpenClassroomName={viewModel.setOpenClassroomName}\n message={viewModel.message}\n yearGroups={yearGroups.data}\n hasStudentExp={viewModel.hasStudentExp}\n toggleMessage={viewModel.settings.message}\n immediateFeedback={viewModel.settings.immediateFeedback}\n preventScrubbing={viewModel.settings.preventScrubbing}\n toggleRequiresStudentSignIn={viewModel.settings.requiresStudentSignIn}\n toggleRespectRatingsAndRestrictions={viewModel.settings.respectRatingsAndRestrictions}\n hideMessage={true} // Message field does nothing atm for open classroom\n onChangeMessage={viewModel.setMessage}\n onToggleMessage={() => viewModel.toggleSetting('message')}\n hidePreventScrubbing={props.entityType !== 'interactive'}\n hideImmediateFeedback={props.entityType !== 'interactive'}\n hideRequiresStudentSignIn={experience !== 'full'}\n hideRespectRatingsAndRestrictions={experience !== 'full'}\n onTogglePreventScrubbing={() => viewModel.toggleSetting('preventScrubbing')}\n onToggleImmediateFeedback={() => viewModel.toggleSetting('immediateFeedback')}\n onToggleRequiresStudentSignIn={() => viewModel.toggleSetting('requiresStudentSignIn')}\n onToggleRespectRatingsAndRestrictions={() => viewModel.toggleSetting('respectRatingsAndRestrictions')}\n closeHeader={() => viewModel.setShowHeader(false)}\n disableRequiresStudentSignIn={viewModel.settings.respectRatingsAndRestrictions}\n />\n <FlowControls\n hideCreateClassroomButton\n hideBackButton={props.hideBackButton || viewModel.openClassroomGatedPermission === 'soft-gate'}\n onClickBack={props.goToFlowSelector}\n onClickNext={onClickNext}\n nextButtonText={viewModel.nextButtonText}\n showSpinner={viewModel.shouldShowSpinner}\n disableNextButton={!viewModel.isValid}\n />\n </Popup>\n );\n}","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MultiStepPopup, MultiStepPopupViewProps } from 'libs/shared/components/multistep-popup/MultiStepPopup';\n\nimport { OpenClassroomFlowSteps } from 'apps/assign/interfaces/Assign';\nimport { HardGateOpenClassroomView } from 'apps/assign/views/hard-gate-open-classroom-view/HardGateOpenClassroomView';\n\nimport { AssignDetailsView, AssignDetailsViewProps } from '../assign-details-view/AssignDetailsView';\nimport { OpenClassroomFlowSettingsView, OpenClassroomFlowSettingsViewProps } from '../open-classroom-flow-settings-view/OpenClassroomFlowSettingsView';\n\ntype AllOpenClassroomFlowViewProps =\n & OpenClassroomFlowSettingsViewProps\n & AssignDetailsViewProps;\nexport interface OpenClassroomFlowViewProps extends MultiStepPopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n goToFlowSelector: () => void;\n openClassroomInitialStep: 'settings' | 'hard-gate';\n isEntry?: boolean;\n}\n\nexport function OpenClassroomFlowView(props: OpenClassroomFlowViewProps): JSX.Element {\n const [ flowStep, setFlowStep ] = React.useState<OpenClassroomFlowSteps>(props.openClassroomInitialStep);\n const [ share, setShare ] = React.useState<Share>();\n\n const data: AllOpenClassroomFlowViewProps = {\n objectId: props.objectId,\n entityType: props.entityType,\n closePopup: props.closePopup,\n goToFlowSelector: props.goToFlowSelector,\n \n shareId: share?.shareId,\n initialDetailsScreen: 'share-link',\n goToAssignDetails: () => setFlowStep('assign-details'),\n setShare\n };\n\n return (\n <MultiStepPopup<AllOpenClassroomFlowViewProps, OpenClassroomFlowSteps>\n data={data}\n animate={false}\n step={flowStep}\n setStep={setFlowStep}\n closePopup={props.closePopup}\n steps={{\n 'settings': { view: OpenClassroomFlowSettingsView },\n 'assign-details': { view: AssignDetailsView },\n 'hard-gate': { view: HardGateOpenClassroomView }\n }}\n />\n );\n}"],"names":["getPhrase","ShareLinkHelper","getPrivateIconAndText","options","entityTypeId","privacy","hasStudentExp","entity","yearGroups","icon","text","Array","isArray","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","name","getShareLinkAccessType","isTvContent","isClickViewContent","canManageAccess","namespace","PremiumBadge","props","className","size","invert","svgName","S","phrase","LanguageService","HardGateOpenClassroomView","Popup","animation","animate","closePopup","hideTitle","Modal","closeButton","as","Row","Col","xs","md","src","ImageUrls","alt","Text","AppLink","appLink","application","action","FlowControls","onClickBack","goToFlowSelector","hideNextButton","hideCreateClassroomButton","OpenClassroomFlowInfoHeader","IconCircle","svgSize","SvgContainer","variant","textVariant","svgWrapperClassName","IconButton","onClick","onClose","OpenClassroomFlowSettings","respectRatingText","showHeader","closeHeader","FlowSettings","title","openClassroomName","onChange","onChangeOpenClassroomName","placeholder","error","hide","hidePreventScrubbing","hideImmediateFeedback","description","onTogglePreventScrubbing","toggled","preventScrubbing","disabled","disablePreventScrubbing","onToggleImmediateFeedback","immediateFeedback","disableImmediateFeedback","hideRequiresStudentSignIn","hideRespectRatingsAndRestrictions","onToggleRequiresStudentSignIn","toggleRequiresStudentSignIn","disableRequiresStudentSignIn","onToggleRespectRatingsAndRestrictions","toggleRespectRatingsAndRestrictions","disableRespectRatingsAndRestrictions","hideMessage","childContainerClassName","onToggleMessage","toggleMessage","disableMessage","onChangeMessage","message","initialSettings","requiresStudentSignIn","respectRatingsAndRestrictions","MAX_OPEN_CLASSROOM_NAME_LENGTH","VIEW_MODEL_KEY","useOpenClassroomFlowSettingsData","alert","storage","setShowHeader","sharedData","useAssignSharedData","entityType","objectId","CustomerRequests","currentUser","data","customerId","createOpenSession","useCreateShare","interactive","settings","setSettings","setName","setMessage","loading","setLoading","setError","isValid","Object","keys","loaded","shouldShowSpinner","nextButtonText","toggleSetting","setting","newSettings","prev","onChangeSetting","setOpenClassroomName","onShare","onSuccess","requireSignIn","share","openClassroomGatedPermission","OpenClassroomFlowSettingsView","viewModel","useClassroomExperience","experience","isLoadingExperience","log","getAssignEventLogger","id","type","analyticsOptions","location","showLoadingSpinner","bodyClassName","hideBackButton","onClickNext","shareId","shareType","setShare","goToAssignDetails","showSpinner","disableNextButton","OpenClassroomFlowView","openClassroomInitialStep","flowStep","setFlowStep","initialDetailsScreen","MultiStepPopup","step","setStep","steps","view","AssignDetailsView"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4177],{28469:(e,t,n)=>{n.d(t,{P:()=>o});var a=n(32735),r=n(23481).T.encloseNamespace("rostering.alert");function o(e){var t="classroom"===e.type?r("classroom"):r("hasRostering");return a.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,n)=>{n.d(t,{X:()=>s});var a=n(32735),r=n(69217),o=n(94631),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.idField,s=void 0===n?"id":n,i=t.persistNamespace,l=t.initialState?t.initialState:new Map,c=a.useRef(l),d=(0,r.N)(),u=(0,o.D)(e),m=(0,o.D)(i);function g(){c.current.clear(),d()}function p(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(p)}function v(e){e.forEach(function(e){c.current.set(e,!0)}),d()}return a.useEffect(function(){t.initialState||i&&m===i||(null==u?void 0:u.map(function(e){return e[s]}).join())!==(null==e?void 0:e.map(function(e){return e[s]}).join())&&g()},[u,m,e,t.initialState]),a.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:p,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 p(e)})},setSelected:v,getSelectedCount:function(){return c.current.size},reset:g,getMap:function(){return c.current}}}},36511:(e,t,n)=>{n.d(t,{I:()=>r});var a=n(56644);function r(e){switch(e){case a.R.Pink:return"pink";case a.R.Orange:return"orange";case a.R.Green:return"green";case a.R.Blue:return"blue";case a.R.Purple:return"purple";case a.R.Indigo:return"indigo";default:return"pink"}}},35115:(e,t,n)=>{n.d(t,{p:()=>d});var a=n(32735),r=n(49935),o=n(95278);const s="pJf6R",i="MSvzY",l="IFmvc",c="pOcvk";var d=a.memo(function(){return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"mb-1 partial-loading-background ".concat("YrP_G")}),a.createElement("div",{className:"pb-3"},a.createElement(r.b2,{numItems:2})),a.createElement("div",{className:"pb-2"},a.createElement(o.Z,null)),a.createElement("div",{className:"d-flex align-items-center py-2"},a.createElement("div",{className:"mx-4 partial-loading-background ".concat(s)}),a.createElement("div",{className:"me-2 partial-loading-background ".concat(i)}),a.createElement("div",{className:"me-auto partial-loading-background ".concat(i)}),a.createElement("div",{className:"partial-loading-background ".concat("j62jt")})),a.createElement("ul",{className:"striped-list list-unstyled"},Array(20).fill(null).map(function(e,t){return a.createElement("li",{key:t},a.createElement("div",{className:"d-flex align-items-center py-1 px-4"},a.createElement("div",{className:"me-2 partial-loading-background ".concat(s)}),a.createElement("div",{className:"me-2 partial-loading-background ".concat("droqZ")}),a.createElement("div",{className:"w-25"},a.createElement("div",{className:"partial-loading-background ".concat("gorcb")})),a.createElement("div",{className:"me-auto d-flex"},Math.random()>.5?a.createElement(a.Fragment,null,a.createElement("div",{className:"partial-loading-background rounded-pill me-1 ".concat(l," ").concat("SdQ90")}),a.createElement("div",{className:"partial-loading-background rounded-pill ".concat(l," ").concat(c)})):a.createElement("div",{className:"partial-loading-background rounded-pill ".concat(l," ").concat(c)})),a.createElement("div",{className:"me-2 partial-loading-background ".concat(i)}),a.createElement("div",{className:"partial-loading-background ".concat("S7p4K")})))})))})},79232:(e,t,n)=>{n.r(t),n.d(t,{ClassroomStudentsView:()=>Ne});var a=n(32735),r=n(70680),o=n(23481),s=n(20354),i=n(75896),l=n(49985),c=n(65858),d=n(37395),u=n(28469),m=n(16714),g=n(76881),p=n(39151),f=n(31949),v=n(22902),S=n(79612),E=n(37802),h=n(14070),y=n(97291),b=n(97958),k=n(83345),C=n(35223),N=n(99742),O="classrooms.classroomsEmptyState";function T(e){return a.createElement(k.D.Provider,{value:O},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"noStudentsHeading"})),a.createElement(b.u.Info,{className:"w-33 ".concat(e.canManageUsers?"":"mb-0")},a.createElement(k.x,{phrase:"noStudentsInfo"})),e.canManageUsers&&!e.isRostering&&a.createElement(b.u.Cta,{text:o.T.getPhrase(O,"noStudentsCta"),appLink:{application:y.O.USER_MANAGER,action:h.e.UserManager.STUDENTS}}),!e.canManageUsers&&!e.isRostering&&a.createElement(b.u.Info,null,a.createElement(k.x,{phrase:"askAdmin"})),e.isRostering&&a.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},o.T.getPhrase(O,"rosteringCta"))))}var w="classrooms.manageClassroomStudentsEmptyState",x=o.T.encloseNamespace(w),I="https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf",U="";function A(){return a.createElement(k.D.Provider,{value:w},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"emptyStateHeading"})),a.createElement(b.u.Info,{className:"mb-2"},a.createElement(k.x,{phrase:"emptyStateInfo"})),a.createElement("a",{className:"btn btn-link info-link font-semibold",href:U,target:"_blank"},x("rosteringCta"))))}function M(e){return e.schoolHasNoStudents?a.createElement(T,{canManageUsers:e.canManageUsers}):a.createElement(k.D.Provider,{value:w},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"emptyStateHeading"})),a.createElement(b.u.Info,null,a.createElement(k.x,{phrase:"emptyStateInfo"})),a.createElement(b.u.Cta,{text:o.T.getPhrase(w,"addStudents"),icon:C.vn.Plus,appLink:{application:y.O.CLASSROOMS,action:h.e.Classrooms.ADD_STUDENTS_CHOICES,args:[e.classroom.id]}}),a.createElement("a",{className:"btn btn-link info-link font-semibold",href:I,target:"_blank"},e.classroomIdeasText)))}var R=n(81886),j=n(11607),F=n(89965),G=n(91693),P=n(83914),L=n(36532),D=n(86764),B=n(69883),H=n(299),_=n(3747),V=n(23999),Z=n(15611),W=n(36511);const X={maxWidth:"A0VzW"};function q(e){var t;return e.group?a.createElement("div",{className:"classroom-pill ".concat(X.maxWidth," text-white text-truncate bg-").concat((0,W.I)(null===(t=e.group.metadata)||void 0===t?void 0:t.colour))},a.createElement("p",{className:"text-truncate mb-0",title:e.group.name},e.group.name)):a.createElement(a.Fragment,null)}function Y(e){return e.count?a.createElement(j.L,{onClick:e.onClick,className:"classroom-pill bg-white border border-dark"},"+",e.count):a.createElement(a.Fragment,null)}var $="classrooms.classroomGroupDropdown",z=function(e,t){return{application:y.O.CLASSROOMS,action:h.e.Classrooms.NEW_GROUP,args:[e],params:{addStudents:t.map(function(e){return e.id})}}};function Q(e){var t,n=(0,H.X)(e.groups,{preselectedIds:e.preselections.map(function(e){return e.id})}),r=n.onToggleItem,s=n.isChecked,i=e.groups.reduce(function(t,n){return t[n.id]=function(e,t){var n=new Set(t.users.data.map(function(e){return e.id.toString()}));return e.every(function(e){return n.has(e.id.toString())})}(e.selectedStudents,n),t},{});a.useEffect(function(){e.groups.forEach(function(e){var t=i[e.id];(!t||s(e.id))&&(t||!s(e.id))||r(e.id)})},[Object.entries(i).sort(function(e,t){return e[0].localeCompare(t[0])}).join(",")]);var d={align:e.alignRight?"end":"start"};return e.disabled&&(d.show=!1),a.createElement(V.Z,Object.assign({},d),a.createElement(V.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")},a.createElement(P.x,{svgName:C.vn.Group,title:e.disabled?e.disabledTooltips:o.T.getPhrase($,"addToGroupTooltip"),tooltipPlacement:"top",tooltipSpanHack:!0,tooltipSpanHackClassName:""})),a.createElement(V.Z.Menu,null,!!(null===(t=e.groups)||void 0===t?void 0:t.length)&&a.createElement("div",{className:"px-2 border-bottom mb-1"},a.createElement("p",{className:"mb-0"},a.createElement(k.x,{namespace:$,phrase:"addToGroup"})),a.createElement("ul",{className:"list-unstyled pe-3"},e.groups.map(function(t){var n=function(e,t){var n=new Set(t.users.data.map(function(e){return e.id.toString()}));return e.every(function(e){return!n.has(e.id.toString())})}(e.selectedStudents,t),o=!!e.isBulk&&!i[t.id]&&!n;return a.createElement("li",{key:t.id,className:"d-flex align-items-center bg-white my-1"},a.createElement(F.X,{id:"".concat(e.id,":").concat(t.id),checked:s(t.id),onChange:function(){return function(t){var n=!s(t.id);e.onSelectGroup(t,n),r(t.id)}(t)},indeterminate:o}),a.createElement(q,{group:t}))}))),a.createElement(Z.F,{onClick:function(){e.disabled||l.k.logUserAction({classroom:{id:e.classroom.id,name:e.classroom.name}},l.k.mergeOptions(e.analyticsOptions,{actionType:c.Vw.Create,workflowPhase:c.eu.Start,entity:c.py.ClassroomGroup}))},appLink:z(e.classroom.id,e.selectedStudents),className:e.disabled?"disabled":"text-nowrap d-flex align-items-center px-2"},a.createElement(P.x,{svgName:C.vn.Plus}),a.createElement(k.x,{namespace:$,phrase:"createNew"}))))}Q.defaultProps={preselections:[]};var J=n(91967),K=n(83657),ee=n(97408),te=n(10038),ne=n(64818);const ae={avatarContainer:"rfVnC",name:"RYLWZ"};function re(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o,s,i=[],l=!0,c=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw r}}return i}}(e,t)||oe(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 oe(e,t){if(e){if("string"==typeof e)return se(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?se(e,t):void 0}}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ie=o.T.encloseNamespace("classrooms.manageClassroomStudentItem"),le=function(e){return{application:y.O.USER_MANAGER,action:h.e.UserManager.EDIT_USER,args:[e],params:{userType:g.Y.Learner}}},ce=function(e,t){return{application:y.O.CLASSROOMS,action:h.e.Classrooms.REMOVE_STUDENTS,args:[t],params:{studentIds:[e]}}};function de(e){var t,n=re(a.useState(!1),2),r=n[0],o=n[1],s=re(a.useState(!1),2),i=s[0],d=s[1],u=re(a.useState({}),2),g=u[0],p=u[1],f=a.useRef(null),S=a.useRef(null),E=a.useRef(e.selectedGroups),h=(0,v.T)().hasPermissions;a.useEffect(function(){E.current=e.selectedGroups,k(),i||o(!0)},[e.selectedGroups.length]);var y,b=J.q.throttle(function(){k(),o(!0)},300);function k(){p(E.current.reduce(function(e,t){return e[t.id]=!0,e},{}))}return(0,te.H)(function(){i||b()}),a.useEffect(function(){if(f.current&&S.current&&r){var e=f.current.firstElementChild;if(e){var t,n,a=e.getBoundingClientRect().y,s={},i=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=oe(e))){t&&(e=t);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}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 r,o=!0,s=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return o=e.done,e},e:function(e){s=!0,r=e},f:function(){try{o||null==t.return||t.return()}finally{if(s)throw r}}}}(f.current.children);try{for(i.s();!(n=i.n()).done;){var l=n.value;l.id&&(s[l.id]=l.getBoundingClientRect().y===a,t=s[l.id]?l.id:t)}}catch(e){i.e(e)}finally{i.f()}S.current.getBoundingClientRect().y!==a&&(s[t]=!1),p(s),o(!1)}}},[r]),a.createElement("div",{className:"d-flex align-items-center py-1 px-4"},a.createElement(F.X,{id:e.student.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),a.createElement("div",{className:"".concat(ae.avatarContainer," flex-shrink-0 me-2")},a.createElement(ee.q,{imageCdnUrl:e.config.imageCdnUrl,initials:ne.l.getInitials(e.student.name,e.student.surname),imageUrl:null===(t=e.student.avatar)||void 0===t?void 0:t.url})),a.createElement("p",{className:"me-2 ".concat(ae.name," text-truncate mb-0 text-nowrap")},e.student.name," ",e.student.surname),a.createElement("div",{className:"".concat(r?"invisible":""," me-auto d-flex flex-wrap mt-n1"),ref:f},e.selectedGroups.map(function(e){return g[e.id]?a.createElement("div",{key:e.id,className:"me-1 mt-1",id:e.id},a.createElement(q,{group:e})):a.createElement(a.Fragment,{key:e.id})}),a.createElement("div",{ref:S,className:"me-1 mt-1"},a.createElement(Y,{count:Object.keys(g).reduce(function(e,t){return g[t]||e++,e},0),onClick:function(){d(!0),k()}}))),a.createElement(Q,{id:"add-group-".concat(e.student.id),classroom:e.classroom,groups:e.classroomGroups,selectedStudents:[e.student],preselections:e.selectedGroups,onSelectGroup:function(t,n){return e.onToggleGroup(e.student,t,n)},analyticsOptions:{location:c.LZ.ManageClassroomStudentListItem},alignRight:!0,disabled:e.readOnly,disabledTooltips:e.readOnlyTooltip}),a.createElement(K.e,{actions:(y=[],h(m.C.ManageUsers)&&y.push({label:ie("editStudent"),appLink:le(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:c.Vw.Edit,entity:c.py.User,workflowPhase:c.eu.Start,location:c.LZ.ManageClassroomStudentListItem})}}),y.push({label:ie("removeStudent"),appLink:ce(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,name:e.classroom.name,userId:e.student.id},{actionType:c.Vw.Dissociate,entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,location:c.LZ.ManageClassroomStudentListItem})}}),y),actionsDropdownClassName:"btn"}))}var ue=n(88630),me="classrooms.manageClassroomStudents",ge=o.T.encloseNamespace(me);function pe(e){var t,n=e.classroom,i=e.students,d=e.groups,u=(0,r.I0)(),m=(0,B.Z)(),g=(0,H.X)(i.data),p=g.getSelected().length,f=d.filter(function(e){var t,n;if(!(null===(n=null===(t=e.users)||void 0===t?void 0:t.data)||void 0===n?void 0:n.length))return!1;var a=!0,r=0,o=g.getSelected();if(o.length){var s=function(){var t=o[r];e.users.data.find(function(e){return e.id.toString()===t.toString()})||(a=!1),r++};do{s()}while(r<o.length);return a}}),v=(0,_.a)(D.r.XLDown);if(!(null===(t=i.data)||void 0===t?void 0:t.length))return a.createElement(M,{classroom:e.classroom,classroomIdeasText:ge("classroomIdeasText"),schoolHasNoStudents:e.schoolHasNoStudents,canManageUsers:e.canManageUsers});var S=g.getSelected().map(function(t){return e.students.data.find(function(e){return e.id.toString()===t.toString()})}).filter(function(e){return!!e});return a.createElement(a.Fragment,null,a.createElement("div",{className:"d-flex align-items-center py-2 ".concat(v?"ps-2":"ps-4")},a.createElement(F.X,{id:"manage-classroom-students-bulk",onChange:g.onToggleBulk,checked:g.bulkChecked,className:"me-2",indeterminate:g.hasSomeSelections(),disabled:e.readOnly}),a.createElement(Q,{id:"bulk-add-group",classroom:n,selectedStudents:S,isBulk:!0,groups:d,onSelectGroup:function(t,a){var r=g.getSelected();e.onBulkSelectGroup(i.data.filter(function(e){return r.includes(e.id.toString())}),t,a);var o=a?ue.F.addStudentsToGroup:ue.F.removeStudentsFromGroup;s.a.fetch(u,o(r,t.id,n.id,function(){l.k.logUserAction({id:t.id,studentCount:r.length},{actionType:c.Vw.Associate,entity:c.py.ClassroomGroup,descriptor:c.iF.User,workflowPhase:c.eu.Complete,location:c.LZ.ManageClassroomStudents}),m.success(ge("addSuccess",{groupName:t.name,escapeText:!0}))},function(){m.error(ge("addError",{groupName:t.name,escapeText:!0}))}))},disabled:!p||e.readOnly,preselections:f,analyticsOptions:{location:c.LZ.ManageClassroomStudents},disabledTooltips:e.readOnly&&o.T.getPhrase(me,"disabledByRostering")}),a.createElement(j.L,{className:"me-auto ".concat(!p||e.readOnly?"text-light cursor-default":""),onClick:function(){if(p&&!e.readOnly){var t=g.getSelected();l.k.logUserAction({id:n.id,studentCount:t.length},{entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,actionType:c.Vw.Dissociate,location:c.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:y.O.CLASSROOMS,action:h.e.Classrooms.REMOVE_STUDENTS,args:[n.id],params:{studentIds:t}})}}},a.createElement(L.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(me,"disabledByRostering"):""},a.createElement(P.x,{svgName:C.vn.Delete,title:o.T.getPhrase(me,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0}))),a.createElement(L.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(me,"disabledByRostering"):""},a.createElement(G.h,{onClick:function(){l.k.logUserAction({id:n.id},{entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,actionType:c.Vw.Associate,location:c.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:y.O.CLASSROOMS,action:h.e.Classrooms.ADD_STUDENTS_CHOICES,args:[n.id]})},svgName:C.vn.Plus,className:"btn btn-outline-dark",disabled:e.readOnly},a.createElement(k.x,{namespace:me,phrase:"addStudent"})))),a.createElement("ul",{className:"striped-list list-unstyled"},i.data.map(function(t){return a.createElement("li",{key:t.id},a.createElement(de,{classroom:n,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:g.isChecked(t.id),onToggleCheckbox:function(){return g.onToggleItem(t.id)},onToggleGroup:e.onToggleGroup,readOnly:e.readOnly,readOnlyTooltip:e.readOnly?ge("disabledByRostering"):""}))})))}var fe=n(35115),ve=n(31491),Se=n(22602),Ee=n(47288);function he(e){return function(e){if(Array.isArray(e))return be(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||ye(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ye(e,t){if(e){if("string"==typeof e)return be(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?be(e,t):void 0}}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ke=o.T.encloseNamespace("classrooms.classroomStudents"),Ce={entity:c.py.ClassroomGroup,descriptor:c.iF.User,workflowPhase:c.eu.Complete,location:c.LZ.ManageClassroomStudentListItem};function Ne(e){var t,n,o,b,k,C,N,O,T,w,x,I,U=(0,E.r)(null).hasShareFlowV2,R=s.a.useBasicFetch(f.N.currentUser()),j=s.a.useBasicFetch(R.data&&ue.F.getClassroom(e.id,R.data.id)),F=s.a.useBasicFetch(ue.F.getClassroomStudents(e.id,e.cursor)),G=s.a.useBasicFetch(R.data&&Ee.N.getUsers(R.data.customerId,g.Y.Learner)),P=s.a.useBasicFetch(ue.F.getClassroomGroups(e.id)),L=s.a.useBasicFetch(p.L.config()),D=(x=a.useState(null===(t=P.data)||void 0===t?void 0:t.data),I=2,function(e){if(Array.isArray(e))return e}(x)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o,s,i=[],l=!0,c=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw r}}return i}}(x,I)||ye(x,I)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),B=D[0],H=D[1];a.useEffect(function(){P.hasCompleted&&!P.isFetching&&H(P.data.data)},[P.hasCompleted,P.isFetching]);var _=null===(o=null===(n=j.data)||void 0===n?void 0:n._integrations)||void 0===o?void 0:o.rostered,V=(0,r.I0)(),Z=(0,v.T)().hasPermissions;function W(t,n,a){var r={id:n.id,studentCount:1},o=he(B);o=a?o.map(function(e){return e.id===n.id?Object.assign(Object.assign({},e),{users:Object.assign(Object.assign({},e.users),{data:i.m.uniq([].concat(he(e.users.data),[t]),"id")})}):e}):o.map(function(e){return e.id===n.id?Object.assign(Object.assign({},e),{users:Object.assign(Object.assign({},e.users),{data:e.users.data.filter(function(e){return e.id!==t.id})})}):e}),H(o);var d=a?ue.F.addStudentsToGroup([t.id],n.id,e.id,function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ce),{actionType:c.Vw.Associate}))}):ue.F.removeStudentsFromGroup([t.id],n.id,e.id,function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ce),{actionType:c.Vw.Dissociate}))});s.a.fetch(V,d)}function X(e,t,n){var a=he(B);a=n?a.map(function(n){return n.id!==t.id?n:Object.assign(Object.assign({},n),{users:Object.assign(Object.assign({},n.users),{data:i.m.uniq([].concat(he(n.users.data),he(e)),"id")})})}):a.map(function(n){return n.id!==t.id?n:Object.assign(Object.assign({},n),{users:Object.assign(Object.assign({},n.users),{data:n.users.data.filter(function(t){return!e.some(function(e){return e.id===t.id})})})})}),H(a)}return(0,S.M)({title:ke("pageTitle",{classroomName:null===(b=j.data)||void 0===b?void 0:b.name})}),(0,ve._)(j),j.data&&(null===(k=F.data)||void 0===k?void 0:k.data)&&(null===(C=P.data)||void 0===C?void 0:C.data)&&L.data&&G.data&&B?a.createElement(Se.R,{classroom:j.data,currentUser:R.data,onTogglePin:function(e,t,n){if(!_){var a=e?ue.F.pinClassroom:ue.F.unpinClassroom;s.a.fetch(V,a(j.data,t,n))}},activeTab:"students",isRostered:_,hasShareFlowV2:U},function(){var e,t,n,r,o,s,i,l,c,d;return _?a.createElement(a.Fragment,null,a.createElement(u.P,{type:"classroom"}),(null===(t=null===(e=F.data)||void 0===e?void 0:e.data)||void 0===t?void 0:t.length)?a.createElement(pe,{classroom:j.data,students:F.data,groups:B,onToggleGroup:W,onBulkSelectGroup:X,config:L.data,schoolHasNoStudents:!(null===(r=null===(n=G.data)||void 0===n?void 0:n.data)||void 0===r?void 0:r.length),canManageUsers:Z(m.C.ManageUsers),readOnly:!0}):a.createElement(A,null)):(null===(s=null===(o=F.data)||void 0===o?void 0:o.data)||void 0===s?void 0:s.length)?a.createElement(pe,{classroom:j.data,students:F.data,groups:B,onToggleGroup:W,onBulkSelectGroup:X,config:L.data,schoolHasNoStudents:!(null===(l=null===(i=G.data)||void 0===i?void 0:i.data)||void 0===l?void 0:l.length),canManageUsers:Z(m.C.ManageUsers)}):a.createElement(M,{classroom:j.data,classroomIdeasText:ke("classroomIdeasText"),schoolHasNoStudents:!(null===(d=null===(c=G.data)||void 0===c?void 0:c.data)||void 0===d?void 0:d.length),canManageUsers:Z(m.C.ManageUsers)})}(),!!(null===(O=null===(N=F.data)||void 0===N?void 0:N.pagination)||void 0===O?void 0:O.cursors)&&a.createElement(d.t,{appLink:{application:y.O.CLASSROOMS,action:h.e.Classrooms.CLASSROOM_STUDENTS,args:[e.id]},cursors:null===(w=null===(T=F.data)||void 0===T?void 0:T.pagination)||void 0===w?void 0:w.cursors,buttonVariant:"outline-dark",className:"py-2 float-end",prevHack:!0})):a.createElement(fe.p,null)}},99998:(e,t,n)=>{n.d(t,{R:()=>s});var a=n(16714),r=n(22902),o=n(37802);function s(){var e=(0,o.r)(null),t=e.hasShareFlowV2,n=e.hasClassrooms,s=e.isLoadingSettings,i=(0,r.T)(),l=i.hasPermissions,c=i.isLoaded;return{experience:n?l(a.C.ViewClassrooms)?"full":t?"minimal":void 0:"none",loading:s||!c}}}}]);
|
|
2
|
-
//# sourceMappingURL=4177-
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4177],{28469:(e,t,n)=>{n.d(t,{P:()=>o});var a=n(32735),r=n(23481).T.encloseNamespace("rostering.alert");function o(e){var t="classroom"===e.type?r("classroom"):r("hasRostering");return a.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,n)=>{n.d(t,{X:()=>s});var a=n(32735),r=n(69217),o=n(94631),s=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.idField,s=void 0===n?"id":n,i=t.persistNamespace,l=t.initialState?t.initialState:new Map,c=a.useRef(l),d=(0,r.N)(),u=(0,o.D)(e),m=(0,o.D)(i);function g(){c.current.clear(),d()}function p(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(p)}function v(e){e.forEach(function(e){c.current.set(e,!0)}),d()}return a.useEffect(function(){t.initialState||i&&m===i||(null==u?void 0:u.map(function(e){return e[s]}).join())!==(null==e?void 0:e.map(function(e){return e[s]}).join())&&g()},[u,m,e,t.initialState]),a.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:p,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 p(e)})},setSelected:v,getSelectedCount:function(){return c.current.size},reset:g,getMap:function(){return c.current}}}},36511:(e,t,n)=>{n.d(t,{I:()=>r});var a=n(56644);function r(e){switch(e){case a.R.Pink:return"pink";case a.R.Orange:return"orange";case a.R.Green:return"green";case a.R.Blue:return"blue";case a.R.Purple:return"purple";case a.R.Indigo:return"indigo";default:return"pink"}}},35115:(e,t,n)=>{n.d(t,{p:()=>d});var a=n(32735),r=n(49935),o=n(95278);const s="pJf6R",i="MSvzY",l="IFmvc",c="pOcvk";var d=a.memo(function(){return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"mb-1 partial-loading-background ".concat("YrP_G")}),a.createElement("div",{className:"pb-3"},a.createElement(r.b2,{numItems:2})),a.createElement("div",{className:"pb-2"},a.createElement(o.Z,null)),a.createElement("div",{className:"d-flex align-items-center py-2"},a.createElement("div",{className:"mx-4 partial-loading-background ".concat(s)}),a.createElement("div",{className:"me-2 partial-loading-background ".concat(i)}),a.createElement("div",{className:"me-auto partial-loading-background ".concat(i)}),a.createElement("div",{className:"partial-loading-background ".concat("j62jt")})),a.createElement("ul",{className:"striped-list list-unstyled"},Array(20).fill(null).map(function(e,t){return a.createElement("li",{key:t},a.createElement("div",{className:"d-flex align-items-center py-1 px-4"},a.createElement("div",{className:"me-2 partial-loading-background ".concat(s)}),a.createElement("div",{className:"me-2 partial-loading-background ".concat("droqZ")}),a.createElement("div",{className:"w-25"},a.createElement("div",{className:"partial-loading-background ".concat("gorcb")})),a.createElement("div",{className:"me-auto d-flex"},Math.random()>.5?a.createElement(a.Fragment,null,a.createElement("div",{className:"partial-loading-background rounded-pill me-1 ".concat(l," ").concat("SdQ90")}),a.createElement("div",{className:"partial-loading-background rounded-pill ".concat(l," ").concat(c)})):a.createElement("div",{className:"partial-loading-background rounded-pill ".concat(l," ").concat(c)})),a.createElement("div",{className:"me-2 partial-loading-background ".concat(i)}),a.createElement("div",{className:"partial-loading-background ".concat("S7p4K")})))})))})},79232:(e,t,n)=>{n.r(t),n.d(t,{ClassroomStudentsView:()=>Ne});var a=n(32735),r=n(70680),o=n(23481),s=n(20354),i=n(75896),l=n(49985),c=n(65858),d=n(37395),u=n(28469),m=n(16714),g=n(76881),p=n(39151),f=n(31949),v=n(22902),S=n(79612),E=n(37802),h=n(14070),y=n(97291),b=n(97958),k=n(83345),C=n(35223),N=n(99742),O="classrooms.classroomsEmptyState";function T(e){return a.createElement(k.D.Provider,{value:O},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"noStudentsHeading"})),a.createElement(b.u.Info,{className:"w-33 ".concat(e.canManageUsers?"":"mb-0")},a.createElement(k.x,{phrase:"noStudentsInfo"})),e.canManageUsers&&!e.isRostering&&a.createElement(b.u.Cta,{text:o.T.getPhrase(O,"noStudentsCta"),appLink:{application:y.O.USER_MANAGER,action:h.e.UserManager.STUDENTS}}),!e.canManageUsers&&!e.isRostering&&a.createElement(b.u.Info,null,a.createElement(k.x,{phrase:"askAdmin"})),e.isRostering&&a.createElement("a",{className:"btn btn-link info-link font-semibold",href:"",target:"_blank"},o.T.getPhrase(O,"rosteringCta"))))}var w="classrooms.manageClassroomStudentsEmptyState",x=o.T.encloseNamespace(w),I="https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf",U="";function A(){return a.createElement(k.D.Provider,{value:w},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"emptyStateHeading"})),a.createElement(b.u.Info,{className:"mb-2"},a.createElement(k.x,{phrase:"emptyStateInfo"})),a.createElement("a",{className:"btn btn-link info-link font-semibold",href:U,target:"_blank"},x("rosteringCta"))))}function M(e){return e.schoolHasNoStudents?a.createElement(T,{canManageUsers:e.canManageUsers}):a.createElement(k.D.Provider,{value:w},a.createElement(b.u,null,a.createElement(b.u.Image,{src:N.W.EmptyStates.Classrooms.STUDENTS}),a.createElement(b.u.Heading,null,a.createElement(k.x,{phrase:"emptyStateHeading"})),a.createElement(b.u.Info,null,a.createElement(k.x,{phrase:"emptyStateInfo"})),a.createElement(b.u.Cta,{text:o.T.getPhrase(w,"addStudents"),icon:C.vn.Plus,appLink:{application:y.O.CLASSROOMS,action:h.e.Classrooms.ADD_STUDENTS_CHOICES,args:[e.classroom.id]}}),a.createElement("a",{className:"btn btn-link info-link font-semibold",href:I,target:"_blank"},e.classroomIdeasText)))}var R=n(81886),j=n(11607),G=n(89965),F=n(91693),P=n(83914),L=n(36532),D=n(86764),B=n(69883),H=n(299),_=n(3747),V=n(23999),Z=n(15611),W=n(36511);const X={maxWidth:"A0VzW"};function q(e){var t;return e.group?a.createElement("div",{className:"classroom-pill ".concat(X.maxWidth," text-white text-truncate bg-").concat((0,W.I)(null===(t=e.group.metadata)||void 0===t?void 0:t.colour))},a.createElement("p",{className:"text-truncate mb-0",title:e.group.name},e.group.name)):a.createElement(a.Fragment,null)}function Y(e){return e.count?a.createElement(j.L,{onClick:e.onClick,className:"classroom-pill bg-white border border-dark"},"+",e.count):a.createElement(a.Fragment,null)}var $="classrooms.classroomGroupDropdown",z=function(e,t){return{application:y.O.CLASSROOMS,action:h.e.Classrooms.NEW_GROUP,args:[e],params:{addStudents:t.map(function(e){return e.id})}}};function Q(e){var t,n=(0,H.X)(e.groups,{preselectedIds:e.preselections.map(function(e){return e.id})}),r=n.onToggleItem,s=n.isChecked,i=e.groups.reduce(function(t,n){return t[n.id]=function(e,t){var n=new Set(t.users.data.map(function(e){return e.id.toString()}));return e.every(function(e){return n.has(e.id.toString())})}(e.selectedStudents,n),t},{});a.useEffect(function(){e.groups.forEach(function(e){var t=i[e.id];(!t||s(e.id))&&(t||!s(e.id))||r(e.id)})},[Object.entries(i).sort(function(e,t){return e[0].localeCompare(t[0])}).join(",")]);var d={align:e.alignRight?"end":"start"};return e.disabled&&(d.show=!1),a.createElement(V.Z,Object.assign({},d),a.createElement(V.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")},a.createElement(P.x,{svgName:C.vn.Group,title:e.disabled?e.disabledTooltips:o.T.getPhrase($,"addToGroupTooltip"),tooltipPlacement:"top",tooltipSpanHack:!0,tooltipSpanHackClassName:""})),a.createElement(V.Z.Menu,null,!!(null===(t=e.groups)||void 0===t?void 0:t.length)&&a.createElement("div",{className:"px-2 border-bottom mb-1"},a.createElement("p",{className:"mb-0"},a.createElement(k.x,{namespace:$,phrase:"addToGroup"})),a.createElement("ul",{className:"list-unstyled pe-3"},e.groups.map(function(t){var n=function(e,t){var n=new Set(t.users.data.map(function(e){return e.id.toString()}));return e.every(function(e){return!n.has(e.id.toString())})}(e.selectedStudents,t),o=!!e.isBulk&&!i[t.id]&&!n;return a.createElement("li",{key:t.id,className:"d-flex align-items-center bg-white my-1"},a.createElement(G.X,{id:"".concat(e.id,":").concat(t.id),checked:s(t.id),onChange:function(){return function(t){var n=!s(t.id);e.onSelectGroup(t,n),r(t.id)}(t)},indeterminate:o}),a.createElement(q,{group:t}))}))),a.createElement(Z.F,{onClick:function(){e.disabled||l.k.logUserAction({classroom:{id:e.classroom.id,name:e.classroom.name}},l.k.mergeOptions(e.analyticsOptions,{actionType:c.Vw.Create,workflowPhase:c.eu.Start,entity:c.py.ClassroomGroup}))},appLink:z(e.classroom.id,e.selectedStudents),className:e.disabled?"disabled":"text-nowrap d-flex align-items-center px-2"},a.createElement(P.x,{svgName:C.vn.Plus}),a.createElement(k.x,{namespace:$,phrase:"createNew"}))))}Q.defaultProps={preselections:[]};var J=n(91967),K=n(83657),ee=n(97408),te=n(10038),ne=n(64818);const ae={avatarContainer:"rfVnC",name:"RYLWZ"};function re(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o,s,i=[],l=!0,c=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw r}}return i}}(e,t)||oe(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 oe(e,t){if(e){if("string"==typeof e)return se(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?se(e,t):void 0}}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ie=o.T.encloseNamespace("classrooms.manageClassroomStudentItem"),le=function(e){return{application:y.O.USER_MANAGER,action:h.e.UserManager.EDIT_USER,args:[e],params:{userType:g.Y.Learner}}},ce=function(e,t){return{application:y.O.CLASSROOMS,action:h.e.Classrooms.REMOVE_STUDENTS,args:[t],params:{studentIds:[e]}}};function de(e){var t,n=re(a.useState(!1),2),r=n[0],o=n[1],s=re(a.useState(!1),2),i=s[0],d=s[1],u=re(a.useState({}),2),g=u[0],p=u[1],f=a.useRef(null),S=a.useRef(null),E=a.useRef(e.selectedGroups),h=(0,v.T)().hasPermissions;a.useEffect(function(){E.current=e.selectedGroups,k(),i||o(!0)},[e.selectedGroups.length]);var y,b=J.q.throttle(function(){k(),o(!0)},300);function k(){p(E.current.reduce(function(e,t){return e[t.id]=!0,e},{}))}return(0,te.H)(function(){i||b()}),a.useEffect(function(){if(f.current&&S.current&&r){var e=f.current.firstElementChild;if(e){var t,n,a=e.getBoundingClientRect().y,s={},i=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=oe(e))){t&&(e=t);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}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 r,o=!0,s=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return o=e.done,e},e:function(e){s=!0,r=e},f:function(){try{o||null==t.return||t.return()}finally{if(s)throw r}}}}(f.current.children);try{for(i.s();!(n=i.n()).done;){var l=n.value;l.id&&(s[l.id]=l.getBoundingClientRect().y===a,t=s[l.id]?l.id:t)}}catch(e){i.e(e)}finally{i.f()}S.current.getBoundingClientRect().y!==a&&(s[t]=!1),p(s),o(!1)}}},[r]),a.createElement("div",{className:"d-flex align-items-center py-1 px-4"},a.createElement(G.X,{id:e.student.id,checked:e.checked,onChange:e.onToggleCheckbox,className:"me-2",disabled:e.readOnly}),a.createElement("div",{className:"".concat(ae.avatarContainer," flex-shrink-0 me-2")},a.createElement(ee.q,{imageCdnUrl:e.config.imageCdnUrl,initials:ne.l.getInitials(e.student.name,e.student.surname),imageUrl:null===(t=e.student.avatar)||void 0===t?void 0:t.url})),a.createElement("p",{className:"me-2 ".concat(ae.name," text-truncate mb-0 text-nowrap")},e.student.name," ",e.student.surname),a.createElement("div",{className:"".concat(r?"invisible":""," me-auto d-flex flex-wrap mt-n1"),ref:f},e.selectedGroups.map(function(e){return g[e.id]?a.createElement("div",{key:e.id,className:"me-1 mt-1",id:e.id},a.createElement(q,{group:e})):a.createElement(a.Fragment,{key:e.id})}),a.createElement("div",{ref:S,className:"me-1 mt-1"},a.createElement(Y,{count:Object.keys(g).reduce(function(e,t){return g[t]||e++,e},0),onClick:function(){d(!0),k()}}))),a.createElement(Q,{id:"add-group-".concat(e.student.id),classroom:e.classroom,groups:e.classroomGroups,selectedStudents:[e.student],preselections:e.selectedGroups,onSelectGroup:function(t,n){return e.onToggleGroup(e.student,t,n)},analyticsOptions:{location:c.LZ.ManageClassroomStudentListItem},alignRight:!0,disabled:e.readOnly,disabledTooltips:e.readOnlyTooltip}),a.createElement(K.e,{actions:(y=[],h(m.C.ManageUsers)&&y.push({label:ie("editStudent"),appLink:le(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:c.Vw.Edit,entity:c.py.User,workflowPhase:c.eu.Start,location:c.LZ.ManageClassroomStudentListItem})}}),y.push({label:ie("removeStudent"),appLink:ce(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,name:e.classroom.name,userId:e.student.id},{actionType:c.Vw.Dissociate,entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,location:c.LZ.ManageClassroomStudentListItem})}}),y),actionsDropdownClassName:"btn"}))}var ue=n(88630),me="classrooms.manageClassroomStudents",ge=o.T.encloseNamespace(me);function pe(e){var t,n=e.classroom,i=e.students,d=e.groups,u=(0,r.I0)(),m=(0,B.Z)(),g=(0,H.X)(i.data),p=g.getSelected().length,f=d.filter(function(e){var t,n;if(!(null===(n=null===(t=e.users)||void 0===t?void 0:t.data)||void 0===n?void 0:n.length))return!1;var a=!0,r=0,o=g.getSelected();if(o.length){var s=function(){var t=o[r];e.users.data.find(function(e){return e.id.toString()===t.toString()})||(a=!1),r++};do{s()}while(r<o.length);return a}}),v=(0,_.a)(D.r.XLDown);if(!(null===(t=i.data)||void 0===t?void 0:t.length))return a.createElement(M,{classroom:e.classroom,classroomIdeasText:ge("classroomIdeasText"),schoolHasNoStudents:e.schoolHasNoStudents,canManageUsers:e.canManageUsers});var S=g.getSelected().map(function(t){return e.students.data.find(function(e){return e.id.toString()===t.toString()})}).filter(function(e){return!!e});return a.createElement(a.Fragment,null,a.createElement("div",{className:"d-flex align-items-center py-2 ".concat(v?"ps-2":"ps-4")},a.createElement(G.X,{id:"manage-classroom-students-bulk",onChange:g.onToggleBulk,checked:g.bulkChecked,className:"me-2",indeterminate:g.hasSomeSelections(),disabled:e.readOnly}),a.createElement(Q,{id:"bulk-add-group",classroom:n,selectedStudents:S,isBulk:!0,groups:d,onSelectGroup:function(t,a){var r=g.getSelected();e.onBulkSelectGroup(i.data.filter(function(e){return r.includes(e.id.toString())}),t,a);var o=a?ue.F.addStudentsToGroup:ue.F.removeStudentsFromGroup;s.a.fetch(u,o(r,t.id,n.id,function(){l.k.logUserAction({id:t.id,studentCount:r.length},{actionType:c.Vw.Associate,entity:c.py.ClassroomGroup,descriptor:c.iF.User,workflowPhase:c.eu.Complete,location:c.LZ.ManageClassroomStudents}),m.success(ge("addSuccess",{groupName:t.name,escapeText:!0}))},function(){m.error(ge("addError",{groupName:t.name,escapeText:!0}))}))},disabled:!p||e.readOnly,preselections:f,analyticsOptions:{location:c.LZ.ManageClassroomStudents},disabledTooltips:e.readOnly&&o.T.getPhrase(me,"disabledByRostering")}),a.createElement(j.L,{className:"me-auto ".concat(!p||e.readOnly?"text-light cursor-default":""),onClick:function(){if(p&&!e.readOnly){var t=g.getSelected();l.k.logUserAction({id:n.id,studentCount:t.length},{entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,actionType:c.Vw.Dissociate,location:c.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:y.O.CLASSROOMS,action:h.e.Classrooms.REMOVE_STUDENTS,args:[n.id],params:{studentIds:t}})}}},a.createElement(L.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(me,"disabledByRostering"):""},a.createElement(P.x,{svgName:C.vn.Delete,title:o.T.getPhrase(me,"delete"),tooltipPlacement:"top",tooltipSpanHack:!0}))),a.createElement(L.u,{spanHack:!0,title:e.readOnly?o.T.getPhrase(me,"disabledByRostering"):""},a.createElement(F.h,{onClick:function(){l.k.logUserAction({id:n.id},{entity:c.py.Classroom,descriptor:c.iF.User,workflowPhase:c.eu.Start,actionType:c.Vw.Associate,location:c.LZ.ManageClassroomStudents}),R.Q.C$.trigger({application:y.O.CLASSROOMS,action:h.e.Classrooms.ADD_STUDENTS_CHOICES,args:[n.id]})},svgName:C.vn.Plus,className:"btn btn-outline-dark",disabled:e.readOnly},a.createElement(k.x,{namespace:me,phrase:"addStudent"})))),a.createElement("ul",{className:"striped-list list-unstyled"},i.data.map(function(t){return a.createElement("li",{key:t.id},a.createElement(de,{classroom:n,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:g.isChecked(t.id),onToggleCheckbox:function(){return g.onToggleItem(t.id)},onToggleGroup:e.onToggleGroup,readOnly:e.readOnly,readOnlyTooltip:e.readOnly?ge("disabledByRostering"):""}))})))}var fe=n(35115),ve=n(31491),Se=n(22602),Ee=n(47288);function he(e){return function(e){if(Array.isArray(e))return be(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||ye(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ye(e,t){if(e){if("string"==typeof e)return be(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?be(e,t):void 0}}function be(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ke=o.T.encloseNamespace("classrooms.classroomStudents"),Ce={entity:c.py.ClassroomGroup,descriptor:c.iF.User,workflowPhase:c.eu.Complete,location:c.LZ.ManageClassroomStudentListItem};function Ne(e){var t,n,o,b,k,C,N,O,T,w,x,I,U=(0,E.r)(null).hasShareFlowV2,R=s.a.useBasicFetch(f.N.currentUser()),j=s.a.useBasicFetch(R.data&&ue.F.getClassroom(e.id,R.data.id)),G=s.a.useBasicFetch(ue.F.getClassroomStudents(e.id,e.cursor)),F=s.a.useBasicFetch(R.data&&Ee.N.getUsers(R.data.customerId,g.Y.Learner)),P=s.a.useBasicFetch(ue.F.getClassroomGroups(e.id)),L=s.a.useBasicFetch(p.L.config()),D=(x=a.useState(null===(t=P.data)||void 0===t?void 0:t.data),I=2,function(e){if(Array.isArray(e))return e}(x)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,o,s,i=[],l=!0,c=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(a=o.call(n)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){c=!0,r=e}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(c)throw r}}return i}}(x,I)||ye(x,I)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),B=D[0],H=D[1];a.useEffect(function(){P.hasCompleted&&!P.isFetching&&H(P.data.data)},[P.hasCompleted,P.isFetching]);var _=null===(o=null===(n=j.data)||void 0===n?void 0:n._integrations)||void 0===o?void 0:o.rostered,V=(0,r.I0)(),Z=(0,v.T)().hasPermissions;function W(t,n,a){var r={id:n.id,studentCount:1},o=he(B);o=a?o.map(function(e){return e.id===n.id?Object.assign(Object.assign({},e),{users:Object.assign(Object.assign({},e.users),{data:i.m.uniq([].concat(he(e.users.data),[t]),"id")})}):e}):o.map(function(e){return e.id===n.id?Object.assign(Object.assign({},e),{users:Object.assign(Object.assign({},e.users),{data:e.users.data.filter(function(e){return e.id!==t.id})})}):e}),H(o);var d=a?ue.F.addStudentsToGroup([t.id],n.id,e.id,function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ce),{actionType:c.Vw.Associate}))}):ue.F.removeStudentsFromGroup([t.id],n.id,e.id,function(){l.k.logUserAction(r,Object.assign(Object.assign({},Ce),{actionType:c.Vw.Dissociate}))});s.a.fetch(V,d)}function X(e,t,n){var a=he(B);a=n?a.map(function(n){return n.id!==t.id?n:Object.assign(Object.assign({},n),{users:Object.assign(Object.assign({},n.users),{data:i.m.uniq([].concat(he(n.users.data),he(e)),"id")})})}):a.map(function(n){return n.id!==t.id?n:Object.assign(Object.assign({},n),{users:Object.assign(Object.assign({},n.users),{data:n.users.data.filter(function(t){return!e.some(function(e){return e.id===t.id})})})})}),H(a)}return(0,S.M)({title:ke("pageTitle",{classroomName:null===(b=j.data)||void 0===b?void 0:b.name})}),(0,ve._)(j),j.data&&(null===(k=G.data)||void 0===k?void 0:k.data)&&(null===(C=P.data)||void 0===C?void 0:C.data)&&L.data&&F.data&&B?a.createElement(Se.R,{classroom:j.data,currentUser:R.data,onTogglePin:function(e,t,n){if(!_){var a=e?ue.F.pinClassroom:ue.F.unpinClassroom;s.a.fetch(V,a(j.data,t,n))}},activeTab:"students",isRostered:_,hasShareFlowV2:U},function(){var e,t,n,r,o,s,i,l,c,d;return _?a.createElement(a.Fragment,null,a.createElement(u.P,{type:"classroom"}),(null===(t=null===(e=G.data)||void 0===e?void 0:e.data)||void 0===t?void 0:t.length)?a.createElement(pe,{classroom:j.data,students:G.data,groups:B,onToggleGroup:W,onBulkSelectGroup:X,config:L.data,schoolHasNoStudents:!(null===(r=null===(n=F.data)||void 0===n?void 0:n.data)||void 0===r?void 0:r.length),canManageUsers:Z(m.C.ManageUsers),readOnly:!0}):a.createElement(A,null)):(null===(s=null===(o=G.data)||void 0===o?void 0:o.data)||void 0===s?void 0:s.length)?a.createElement(pe,{classroom:j.data,students:G.data,groups:B,onToggleGroup:W,onBulkSelectGroup:X,config:L.data,schoolHasNoStudents:!(null===(l=null===(i=F.data)||void 0===i?void 0:i.data)||void 0===l?void 0:l.length),canManageUsers:Z(m.C.ManageUsers)}):a.createElement(M,{classroom:j.data,classroomIdeasText:ke("classroomIdeasText"),schoolHasNoStudents:!(null===(d=null===(c=F.data)||void 0===c?void 0:c.data)||void 0===d?void 0:d.length),canManageUsers:Z(m.C.ManageUsers)})}(),!!(null===(O=null===(N=G.data)||void 0===N?void 0:N.pagination)||void 0===O?void 0:O.cursors)&&a.createElement(d.t,{appLink:{application:y.O.CLASSROOMS,action:h.e.Classrooms.CLASSROOM_STUDENTS,args:[e.id]},cursors:null===(w=null===(T=G.data)||void 0===T?void 0:T.pagination)||void 0===w?void 0:w.cursors,buttonVariant:"outline-dark",className:"py-2 float-end",prevHack:!0})):a.createElement(fe.p,null)}},99998:(e,t,n)=>{n.d(t,{R:()=>s});var a=n(16714),r=n(22902),o=n(37802);function s(){var e=(0,o.r)(null),t=e.hasShareFlowV2,n=e.hasClassrooms,s=e.isLoadingSettings,i=(0,r.T)(),l=i.hasPermissions,c=i.isLoaded,d=i.getGatedPermission;return{experience:n?"soft-gate"===d(a.C.ViewClassrooms)?"minimal":l(a.C.ViewClassrooms)?"full":t?"minimal":void 0:"none",loading:s||!c}}}}]);
|
|
2
|
+
//# sourceMappingURL=4177-285ddf9ae3-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4177-285ddf9ae3-lite.chunk.js","mappings":"mJAKMA,E,SAAY,mBADA,mBAOZ,SAAUC,EAAeC,GAC7B,IAAMC,EAAsB,cAAfD,EAAME,KAAuBJ,EAAU,aAAeA,EAAU,gBAE7E,OACE,uBAAKK,UAAU,kFACZF,EAAI,IAWX,C,sECOaG,EAAyB,SAACC,GAAsE,IAA5CC,EAAA,uDAAsC,CAAC,EACtG,EAA6CA,EAArCC,QAAAA,OAAO,IAAG,OAAI,EAAEC,EAAqBF,EAArBE,iBAElBC,EAAUH,EAAQI,aAAeJ,EAAQI,aAAe,IAAIC,IAE5DC,EAAQ,SAAiCH,GAEzCI,GAAc,SAEdC,GAAiB,OAAYT,GAC7BU,GAAgB,OAAYP,GAwClC,SAASQ,IACPJ,EAAMK,QAAQC,QACdL,GACF,CA6BA,SAASM,EAAUC,GAMjB,MALoB,iBAATA,EACTA,EAAOA,EAAKC,WACW,iBAATD,IACdA,EAAOA,EAAKb,GAASc,YAEhBT,EAAMK,QAAQK,IAAIF,EAC3B,CAuBA,SAASG,IACP,SAAKlB,aAAU,EAAVA,EAAYmB,SAGVnB,EAAWoB,MAAMN,EAC1B,CAEA,SAASO,EAAYC,GACnBA,EAAIC,QAAQ,SAAAC,GACVjB,EAAMK,QAAQa,IAAID,GAAI,EACxB,GACAhB,GACF,CAUA,OAtHA,YAAgB,WAIVP,EAAQI,cAORF,GAAoBO,IAAkBP,IAO1BM,aAAc,EAAdA,EAAgBiB,IAAI,SAAAC,GAAC,OAAIA,EAAEzB,EAAQ,GAAE0B,WACzC5B,aAAU,EAAVA,EAAY0B,IAAI,SAAAC,GAAC,OAAIA,EAAEzB,EAAQ,GAAE0B,SAK7CjB,GACF,EAAG,CAAEF,EAAgBC,EAAeV,EAAYC,EAAQI,eAExD,YAAgB,W,OACa,QAAtB,EAAAJ,EAAQ4B,sBAAc,eAAEV,SAG7BE,EAAYpB,EAAQ4B,eACtB,EAAG,IAsFI,CACLC,aA/EF,WACE,IAAMC,GAAYb,IAElBlB,EAAWuB,QAAQ,SAAAR,GACbgB,EACFxB,EAAMK,QAAQa,IAAIV,EAAKb,GAASc,YAAY,GAE5CT,EAAMK,QAAO,OAAQG,EAAKb,GAASc,WACvC,GAEAR,GACF,EAqEEwB,aAlEF,SAAsBR,GACpB,IAAMS,GAAiB1B,EAAMK,QAAQK,IAAIO,EAAGR,YAExCiB,EACF1B,EAAMK,QAAQa,IAAID,EAAGR,WAAYiB,GAEjC1B,EAAMK,QAAO,OAAQY,EAAGR,YAE1BR,GACF,EA0DE0B,YA9CF,WACE,OAAOC,MAAMC,KAAK7B,EAAMK,QAAQyB,OAClC,EA6CEvB,UAAAA,EACAwB,YAAapB,IACbqB,YA7CF,YACOvC,aAAU,EAAVA,EAAYmB,UAEjBnB,EAAWuB,QAAQ,SAAAR,GACjBR,EAAMK,QAAO,OAAQG,EAAKb,GAASc,WACrC,GACAR,IACF,EAuCEgC,kBApCF,WACE,SAAKxC,aAAU,EAAVA,EAAYmB,WAGRnB,EAAWyC,KAAK,SAAA1B,GAAI,OAAID,EAAUC,EAAK,EAClD,EAgCEM,YAAAA,EACAqB,iBAjBF,WACE,OAAOnC,EAAMK,QAAQ+B,IACvB,EAgBEhC,MAAAA,EACAiC,OAfF,WACE,OAAOrC,EAAMK,OACf,EAeF,C,kDCjLM,SAAUiC,EAAqBC,GACnC,OAAQA,GACN,KAAK,SACH,MAAO,OACT,KAAK,WACH,MAAO,SACT,KAAK,UACH,MAAO,QACT,KAAK,SACH,MAAO,OACT,KAAK,WACH,MAAO,SACT,KAAK,WACH,MAAO,SACT,QACE,MAAO,OAEb,C,wECpBA,QAA8D,QAA9D,EAAmF,QAAnF,EAA+I,QAA/I,EAA4J,QCMrJ,IAAMC,EAAiC,OAAW,WACvD,OACE,uBAAKjD,UAAU,QAEb,uBAAKA,UAAS,0CDVM,WCapB,uBAAKA,UAAU,QACb,gBAAC,KAAkB,CAACkD,SAAU,KAIhC,uBAAKlD,UAAU,QACb,gBAACmD,EAAA,EAAsB,OAGzB,uBAAKnD,UAAU,kCAEb,uBAAKA,UAAS,0CAAqC,KAEnD,uBAAKA,UAAS,0CAAqC,KAEnD,uBAAKA,UAAS,6CAAwC,KAGtD,uBAAKA,UAAS,qCD/BmF,YCmCnG,sBAAIA,UAAU,8BACXqC,MAAM,IAAIe,KAAK,MAAMxB,IAAI,SAACyB,EAASxB,GAAC,OACnC,sBAAIyB,IAAKzB,GACP,uBAAK7B,UAAU,uCAEb,uBAAKA,UAAS,0CAAqC,KAGnD,uBAAKA,UAAS,0CD3Ce,WC8C7B,uBAAKA,UAAU,QACb,uBAAKA,UAAS,qCD/CiG,YCmDjH,uBAAKA,UAAU,kBACZuD,KAAKC,SAAW,GAEb,gCACE,uBAAKxD,UAAS,uDAAkD,EAAY,YDvDuE,WCwDnJ,uBAAKA,UAAS,kDAA6C,EAAY,YAAI,MAE3E,uBAAKA,UAAS,kDAA6C,EAAY,YAAI,MAKnF,uBAAKA,UAAS,0CAAqC,KAEnD,uBAAKA,UAAS,qCDjEmK,YCmEhL,IAKf,E,qTC9DMyD,EAAY,kCAOZ,SAAUC,EAA0B7D,GACxC,OACE,gBAAC,aAAiC,CAAC8D,MAAOF,GACxC,gBAACG,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,oCAEvB,gBAACF,EAAA,UAAkB,KAAC,gBAACG,EAAA,EAAI,CAACC,OAAO,uBACjC,gBAACJ,EAAA,OAAe,CAAC5D,UAAS,eAAWH,EAAMoE,eAA0B,GAAT,SAC1D,gBAACF,EAAA,EAAI,CAACC,OAAO,oBAGdnE,EAAMoE,iBAAmBpE,EAAMqE,aAC9B,gBAACN,EAAA,MAAc,CACb9D,KAAMqE,EAAA,YAA0BV,EAAW,iBAC3CW,QAAS,CACPC,YAAa,iBACbC,OAAQ,6BAIZzE,EAAMoE,iBAAmBpE,EAAMqE,aAC/B,gBAACN,EAAA,OAAe,KAAC,gBAACG,EAAA,EAAI,CAACC,OAAO,cAE/BnE,EAAMqE,aACL,qBAAGlE,UAAU,uCAAuCuE,KAAM,GAAIC,OAAO,UAClEL,EAAA,YAA0BV,EAAW,kBAMlD,CClCA,IAAM,EAAY,+CACZ9D,EAAYwE,EAAA,mBAAiC,GAE7CM,EAAgC,iFAChCC,EAA2B,GAS3B,SAAUC,IACd,OACE,gBAAC,aAAiC,CAAChB,MAAO,GACxC,gBAACC,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,oCAEvB,gBAACF,EAAA,UAAkB,KAAC,gBAACG,EAAA,EAAI,CAACC,OAAO,uBAEjC,gBAACJ,EAAA,OAAe,CAAC5D,UAAU,QAAQ,gBAAC+D,EAAA,EAAI,CAACC,OAAO,oBAEhD,qBAAGhE,UAAU,uCAAuCuE,KAAMG,EAA0BF,OAAO,UACxF7E,EAAU,kBAKrB,CAEM,SAAUiF,EAAkC/E,GAChD,OAAIA,EAAMgF,oBACD,gBAACnB,EAAyB,CAACO,eAAgBpE,EAAMoE,iBAGxD,gBAAC,aAAiC,CAACN,MAAO,GACxC,gBAACC,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,oCAEvB,gBAACF,EAAA,UAAkB,KAAC,gBAACG,EAAA,EAAI,CAACC,OAAO,uBAEjC,gBAACJ,EAAA,OAAe,KAAC,gBAACG,EAAA,EAAI,CAACC,OAAO,oBAC9B,gBAACJ,EAAA,MAAc,CACb9D,KAAMqE,EAAA,YAA0B,EAAW,eAC3CW,KAAM,UACNV,QAAS,CACPC,YAAa,eACbC,OAAQ,oCACRS,KAAM,CAAClF,EAAMmF,UAAUtD,OAI3B,qBAAG1B,UAAU,uCAAuCuE,KAAME,EAA+BD,OAAO,UAC7F3E,EAAMoF,qBAKjB,C,gJCzEA,SAAgB,SAAW,SCWrB,SAAUC,EAAmBrF,G,MACjC,OAAKA,EAAMsF,MAIT,uBAAKnF,UAAS,yBAAoB,WAAe,yCAAgC,OAAyC,QAApB,EAAAH,EAAMsF,MAAMC,gBAAQ,eAAEC,UAC1H,qBAAGrF,UAAU,qBAAqBsF,MAAOzF,EAAMsF,MAAMI,MAAO1F,EAAMsF,MAAMI,OAJnE,gCAOX,CAOM,SAAUC,EAAuB3F,GACrC,OAAKA,EAAM4F,MAIT,gBAACC,EAAA,EAAS,CAACC,QAAS9F,EAAM8F,QAAS3F,UAAS,8CAA8C,IACtFH,EAAM4F,OAJH,gCAOX,CCdA,IAAM,EAAY,oCAEZG,EAAqB,SAAClE,EAAYmE,GAAgB,MAAM,CAC5DxB,YAAa,eACbC,OAAQ,yBACRS,KAAM,CAACrD,GACPoE,OAAQ,CACNC,YAAaF,EAASjE,IAAI,SAAAoE,GAAC,OAAIA,EAAEtE,EAAE,IAEtC,EA8BK,SAAUuE,EAAuBpG,G,MACrC,GAAoC,EAAAI,EAAA,GAAuBJ,EAAMqG,OAAQ,CACvEnE,eAAgBlC,EAAMsG,cAAcvE,IAAI,SAAAoE,GAAC,OAAIA,EAAEtE,EAAE,KAD3CQ,EAAY,EAAZA,aAAclB,EAAS,EAATA,UAIhBoF,EAA2BvG,EAAMqG,OAAOG,OAAO,SAACC,EAAKnB,GAEzD,OADAmB,EAAInB,EAAMzD,IAlCd,SAAiCmE,EAAkBV,GACjD,IAAMoB,EAAe,IAAIC,IAAIrB,EAAMsB,MAAMC,KAAK9E,IAAI,SAAA+E,GAAC,OAAIA,EAAEjF,GAAGR,UAAU,IACtE,OAAO2E,EAASvE,MAAM,SAAA+B,GAAO,OAAIkD,EAAaK,IAAIvD,EAAQ3B,GAAGR,WAAW,EAC1E,CA+BoB2F,CAAwBhH,EAAMiH,iBAAkB3B,GACzDmB,CACT,EAAG,CAAC,GAsBJ,YAAgB,WAGdzG,EAAMqG,OAAOzE,QAAQ,SAAAsF,GACnB,IAAMC,EAAuBZ,EAAyBW,EAAErF,MAElDsF,GAAyBhG,EAAU+F,EAAErF,OAMtCsF,IAAwBhG,EAAU+F,EAAErF,MALvCQ,EAAa6E,EAAErF,GASnB,EACF,EAAG,CACDuF,OAAOC,QAAQd,GAA0Be,KAAK,SAACC,EAAGC,GAAC,OAAKD,EAAE,GAAGE,cAAcD,EAAE,GAAG,GAAEvF,KAAK,OAGzF,IAEMyF,EAA4B,CAChCC,MAAO3H,EAAM4H,WAAa,MAAQ,SAWpC,OAHI5H,EAAM6H,WACRH,EAAcI,MAAO,GAGrB,gBAACC,EAAA,EAAQ,iBAAKL,GACZ,gBAACK,EAAA,SAAe,CACdC,GAAG,MACHnG,GAAI7B,EAAM6B,GACV1B,UAAS,UAAKH,EAAM6H,SAAW,aAAe,iBAAgB,YAnB9C,uCAmB+D,cAE/E,gBAACI,EAAA,EAAY,CACXC,QAAS,WACTzC,MAAOzF,EAAM6H,SAAW7H,EAAMmI,iBAAmB7D,EAAA,YAA0B,EAAW,qBACtF8D,iBAAiB,MACjBC,iBAAe,EACfC,yBAAyB,MAG7B,gBAACP,EAAA,OAAa,QACG,QAAZ,EAAA/H,EAAMqG,cAAM,eAAE7E,SACf,uBAAKrB,UAAU,2BACb,qBAAGA,UAAU,QAAO,gBAAC+D,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,gBACvD,sBAAIhE,UAAU,sBACXH,EAAMqG,OAAOtE,IAAI,SAAAuD,GAChB,IAAMiD,EA7GtB,SAAiCvC,EAAkBV,GACjD,IAAMoB,EAAe,IAAIC,IAAIrB,EAAMsB,MAAMC,KAAK9E,IAAI,SAAA+E,GAAC,OAAIA,EAAEjF,GAAGR,UAAU,IACtE,OAAO2E,EAASvE,MAAM,SAAA+B,GAAO,OAAKkD,EAAaK,IAAIvD,EAAQ3B,GAAGR,WAAW,EAC3E,CA0GuCmH,CAAwBxI,EAAMiH,iBAAkB3B,GACjEmD,IAAmBzI,EAAM0I,SAE1BnC,EAAyBjB,EAAMzD,MAAQ0G,EAE5C,OACE,sBAAI9E,IAAK6B,EAAMzD,GAAI1B,UAAU,2CAC3B,gBAACwI,EAAA,EAAQ,CACP9G,GAAE,UAAK7B,EAAM6B,GAAE,YAAIyD,EAAMzD,IACzB+G,QAASzH,EAAUmE,EAAMzD,IACzBgH,SAAU,WAAF,OAtF5B,SAAkBvD,GAChB,IAAMwD,GAAa3H,EAAUmE,EAAMzD,IACnC7B,EAAM+I,cAAczD,EAAOwD,GAE3BzG,EAAaiD,EAAMzD,GACrB,CAiFoC,CAASyD,EAAM,EAC/B0D,cAAeP,IAEjB,gBAACpD,EAAkB,CAACC,MAAOA,IAGjC,KAIN,gBAAC2D,EAAA,EAAO,CACNnD,QA1FR,WACM9F,EAAM6H,UAGVqB,EAAA,gBAA8B,CAC5B/D,UAAW,CAAEtD,GAAI7B,EAAMmF,UAAUtD,GAAI6D,KAAM1F,EAAMmF,UAAUO,OAC1DwD,EAAA,eAA6BlJ,EAAMmJ,iBAAkB,CACtDC,WAAY,YACZC,cAAe,WACfC,OAAQ,sBAEZ,EAgFQ/E,QAASwB,EAAmB/F,EAAMmF,UAAUtD,GAAI7B,EAAMiH,kBACtD9G,UAAWH,EAAM6H,SAAW,WAAa,8CAEzC,gBAACI,EAAA,EAAY,CAACC,QAAS,YACvB,gBAAChE,EAAA,EAAI,CAACN,UAAW,EAAWO,OAAO,gBAK7C,CAzHAiC,EAAuBmD,aAAe,CACpCjD,cAAe,I,8DC1DjB,UAAgB,gBAAkB,QAAQ,KAAO,S,ygCC6BjD,IACM,GAAYhC,EAAA,mBADA,yCAGZkF,GAAwB,SAAC3H,GAAU,MAAM,CAC7C2C,YAAa,iBACbC,OAAQ,0BACRS,KAAM,CAACrD,GACPoE,OAAQ,CAAEwD,SAAUC,EAAA,WACrB,EAEKC,GAA2B,SAACC,EAAmBC,GAAmB,MAAM,CAC5ErF,YAAa,eACbC,OAAQ,+BACRS,KAAM,CAAC2E,GACP5D,OAAQ,CACN6D,WAAY,CAACF,IAEhB,EAeK,SAAUG,GAA2B/J,G,MACwC,KAArB,YAAe,GAAM,GAAzEgK,EAAqB,KAAEC,EAAwB,KACkB,KAArB,YAAe,GAAM,GAAjEC,EAAiB,KAAEC,EAAoB,KAGyD,KAA1C,WAAuC,CAAC,GAAE,GAAhGC,EAAsB,KAAEC,EAAyB,KAEnDC,EAAe,SAA6B,MAC5CC,EAAc,SAA6B,MAC3CC,EAAoB,SAA+BxK,EAAMyK,gBAEvDC,GAAmB,EAAAC,EAAA,KAAnBD,eAGR,YAAgB,WACdF,EAAkBvJ,QAAUjB,EAAMyK,eAClCG,IAEIV,GAGJD,GAAyB,EAC3B,EAAG,CAACjK,EAAMyK,eAAejJ,SAOzB,IAsEQqJ,EAtEFC,EAA0BC,EAAA,WALhC,WACEH,IACAX,GAAyB,EAC3B,EAEkE,KAoDlE,SAASW,IACPP,EAA0BG,EAAkBvJ,QAAQuF,OAAO,SAACC,EAAKnB,GAE/D,OADAmB,EAAInB,EAAMzD,KAAM,EACT4E,CACT,EAAG,CAAC,GACN,CAwDA,OA/GA,QAAkB,WACZyD,GAGJY,GACF,GAMA,YAAgB,WACd,GAAKR,EAAarJ,SAAYsJ,EAAYtJ,SAAY+I,EAAtD,CAGA,IAAMgB,EAAiBV,EAAarJ,QAAQgK,kBAC5C,GAAKD,EAAL,CAEA,IAUIE,EAC6C,EAX3CC,EAAeH,EAAeI,wBAAwBC,EAEtDC,EAAwD,CAAC,EAQrC,E,8lBAAA,CACNhB,EAAarJ,QAAQsK,UAAQ,IAAjD,IAAK,EAAL,qBAAmD,KAAxCC,EAAK,QACVA,EAAM3J,KACRyJ,EAA2BE,EAAM3J,IAAM2J,EAAMJ,wBAAwBC,IAAMF,EAC3ED,EAAgBI,EAA2BE,EAAM3J,IAAM2J,EAAM3J,GAAKqJ,EAErE,CAED,+BACIX,EAAYtJ,QAAQmK,wBAAwBC,IAAMF,IACpDG,EAA2BJ,IAAiB,GAE9Cb,EAA0BiB,GAC1BrB,GAAyB,EAzBE,CAHnB,CA6BV,EAAG,CAACD,IAsEF,uBAAK7J,UAAU,uCACb,gBAACwI,EAAA,EAAQ,CACP9G,GAAI7B,EAAMwD,QAAQ3B,GAClB+G,QAAS5I,EAAM4I,QACfC,SAAU7I,EAAMyL,iBAChBtL,UAAU,OACV0H,SAAU7H,EAAM0L,WAGlB,uBAAKvL,UAAS,UAAK,mBAAsB,wBACvC,gBAACwL,GAAA,EAAM,CACLC,YAAa5L,EAAM6L,OAAOD,YAC1BE,SAAUC,GAAA,cAAuB/L,EAAMwD,QAAQkC,KAAM1F,EAAMwD,QAAQwI,SACnEC,SAA8B,QAApB,EAAAjM,EAAMwD,QAAQ0I,cAAM,eAAEC,OAIpC,qBAAGhM,UAAS,eAAU,QAAW,oCAAoCH,EAAMwD,QAAQkC,KAAI,IAAG1F,EAAMwD,QAAQwI,SAExG,uBAEE7L,UAAS,UAAK6J,EAAwB,YAAc,GAAE,mCACtDoC,IAAK9B,GAEJtK,EAAMyK,eAAe1I,IAAI,SAAAuD,GACxB,OAAK8E,EAAuB9E,EAAMzD,IAIhC,uBAAK4B,IAAK6B,EAAMzD,GAAI1B,UAAU,YAAY0B,GAAIyD,EAAMzD,IAClD,gBAACwD,EAAkB,CAACC,MAAOA,KAJtB,gBAAC,WAAc,CAAC7B,IAAK6B,EAAMzD,IAOtC,GACA,uBAAKuK,IAAK7B,EAAapK,UAAU,aAC/B,gBAACwF,EAAsB,CAACC,MAxFvBwB,OAAO1E,KAAK0H,GAAwB5D,OAAO,SAACZ,EAAOyG,GAIxD,OAHKjC,EAAuBiC,IAC1BzG,IAEKA,CACT,EAAG,GAmF4DE,QAvGjE,WACEqE,GAAqB,GACrBS,GACF,MAwGI,gBAACxE,EAAsB,CACrBvE,GAAE,oBAAe7B,EAAMwD,QAAQ3B,IAC/BsD,UAAWnF,EAAMmF,UACjBkB,OAAQrG,EAAMsM,gBACdrF,iBAAkB,CAACjH,EAAMwD,SACzB8C,cAAetG,EAAMyK,eACrB1B,cAAe,SAACzD,EAAOiH,GAAQ,OAAKvM,EAAMwM,cAAcxM,EAAMwD,QAAS8B,EAAOiH,EAAS,EACvFpD,iBAAkB,CAAEsD,SAAU,qCAC9B7E,YAAU,EACVC,SAAU7H,EAAM0L,SAChBvD,iBAAkBnI,EAAM0M,kBAG1B,gBAAC,IAAW,CACV7B,SAjGEA,EAA2B,GAE7BH,EAAeiC,EAAA,gBACjB9B,EAAQ+B,KAAK,CACXC,MAAO,GAAU,eACjBtI,QAASiF,GAAsBxJ,EAAMwD,QAAQ3B,IAC7CgG,SAAU7H,EAAM0L,SAChBvL,UAAWH,EAAM0L,SAAW,WAAa,GACzCoB,QAAS9M,EAAM0L,SAAW1L,EAAM0M,gBAAkB,GAClD5G,QAAS,WACPoD,EAAA,gBAA8B,CAAErH,GAAI7B,EAAMwD,QAAQ3B,IAAM,CACtDuH,WAAY,UACZE,OAAQ,UACRD,cAAe,WACfoD,SAAU,qCAEd,IAGJ5B,EAAQ+B,KAAK,CACXC,MAAO,GAAU,iBACjBtI,QAASoF,GAAyB3J,EAAMwD,QAAQ3B,GAAI7B,EAAMmF,UAAUtD,IACpEgG,SAAU7H,EAAM0L,SAChBvL,UAAWH,EAAM0L,SAAW,WAAa,cACzCoB,QAAS9M,EAAM0L,SAAW1L,EAAM0M,gBAAkB,GAClD5G,QAAS,WACPoD,EAAA,gBAA8B,CAC5BrH,GAAI7B,EAAMmF,UAAUtD,GACpB6D,KAAM1F,EAAMmF,UAAUO,KACtBqH,OAAQ/M,EAAMwD,QAAQ3B,IACrB,CACDuH,WAAY,gBACZE,OAAQ,eACR0D,WAAY,UACZ3D,cAAe,WACfoD,SAAU,qCAEd,IAGK5B,GA0DHoC,yBAAyB,QAIjC,C,gBCtOM,GAAY,qCACZ,GAAY3I,EAAA,mBAAiC,IAc7C,SAAU4I,GAAwBlN,G,MAC9BmF,EAAgCnF,EAAhCmF,UAAWa,EAAqBhG,EAArBgG,SAAUK,EAAWrG,EAAXqG,OAEvB8G,GAAW,UACXC,GAAS,SAETC,GAAiB,EAAAjN,EAAA,GAAuB4F,EAASa,MACjDyG,EAAiBD,EAAe9K,cAAcf,OAE9C+L,EAAoBlH,EAAOmH,OAAO,SAAAlI,G,QACtC,KAAsB,QAAjB,EAAW,QAAX,EAAAA,EAAMsB,aAAK,eAAEC,YAAI,eAAErF,QACtB,OAAO,EAET,IAAIiM,GAAmB,EACnBC,EAAQ,EAEN5D,EAAauD,EAAe9K,cAElC,GAAKuH,EAAWtI,OAAhB,CACS,iBAGP,IAAMK,EAAKiI,EAAW4D,GACjBpI,EAAMsB,MAAMC,KAAK/D,KAAK,SAAC6K,GAAQ,OAAKA,EAAI9L,GAAGR,aAAeQ,EAAGR,UAAU,KAC1EoM,GAAmB,GAErBC,G,EALF,aAMSA,EAAQ5D,EAAWtI,QAE5B,OAAOiM,CAVC,CAWV,GAyEMG,GAAa,OAAc,YAEjC,KAAkB,QAAb,EAAA5H,EAASa,YAAI,eAAErF,QAClB,OACE,gBAACuD,EAAiC,CAChCI,UAAWnF,EAAMmF,UACjBC,mBAAoB,GAAU,sBAC9BJ,oBAAqBhF,EAAMgF,oBAC3BZ,eAAgBpE,EAAMoE,iBAK5B,IAAM6C,EAAmBoG,EACtB9K,cACAR,IAAI,SAAAF,GACH,OAAO7B,EAAMgG,SAASa,KAAK/D,KAAK,SAAAqD,GAAC,OAAIA,EAAEtE,GAAGR,aAAeQ,EAAGR,UAAU,EACxE,GACCmM,OAAO,SAAArH,GAAC,QAAMA,CAAC,GAElB,OACE,gCACE,uBAAKhG,UAAS,yCAAoCyN,EAAa,OAAS,SACtE,gBAACjF,EAAA,EAAQ,CACP9G,GAAG,iCACHgH,SAAUwE,EAAelL,aACzByG,QAASyE,EAAe1K,YACxBxC,UAAU,OACV6I,cAAeqE,EAAexK,oBAC9BgF,SAAU7H,EAAM0L,WAGlB,gBAACtF,EAAsB,CACrBvE,GAAG,iBACHsD,UAAWA,EACX8B,iBAAkBA,EAClByB,QAAM,EACNrC,OAAQA,EACR0C,cAlER,SAAuBzD,EAAuBwD,GAC5C,IAAM+E,EAAqBR,EAAe9K,cAE1CvC,EAAM8N,kBAAkB9H,EAASa,KAAK2G,OAAO,SAAArH,GAAC,OAAI0H,EAAmBE,SAAS5H,EAAEtE,GAAGR,WAAW,GAAGiE,EAAOwD,GAExG,IAAMkF,EAAUlF,EAAYmF,GAAA,qBAAuCA,GAAA,0BAEnE,UACEd,EACAa,EAAQH,EAAoBvI,EAAMzD,GAAIsD,EAAUtD,GAAI,WAClDqH,EAAA,gBAA8B,CAC5BrH,GAAIyD,EAAMzD,GACVqM,aAAcL,EAAmBrM,QAChC,CACD4H,WAAY,eACZE,OAAQ,oBACR0D,WAAY,UACZ3D,cAAe,cACfoD,SAAU,+BAGZW,EAAOe,QAAQ,GAAU,aAAc,CAAEC,UAAW9I,EAAMI,KAAM2I,YAAY,IAC9E,EAAG,WACDjB,EAAOkB,MAAM,GAAU,WAAY,CAAEF,UAAW9I,EAAMI,KAAM2I,YAAY,IAC1E,GAEJ,EAyCQxG,UAAWyF,GAAkBtN,EAAM0L,SACnCpF,cAAeiH,EACfpE,iBAAkB,CAAEsD,SAAU,8BAC9BtE,iBAAkBnI,EAAM0L,UAAYpH,EAAA,YAA0B,GAAW,yBAE3E,gBAACuB,EAAA,EAAS,CACR1F,UAAS,mBAAcmN,GAAkBtN,EAAM0L,SAAW,4BAA8B,IACxF5F,QArGR,WACE,GAAKwH,IAAkBtN,EAAM0L,SAA7B,CAGA,IAAM5B,EAAauD,EAAe9K,cAElC2G,EAAA,gBAA8B,CAC5BrH,GAAIsD,EAAUtD,GACdqM,aAAcpE,EAAWtI,QACxB,CACD8H,OAAQ,eACR0D,WAAY,UACZ3D,cAAe,WACfD,WAAY,gBACZqD,SAAU,+BAGZ,eAA2B,CACzBjI,YAAa,eACbC,OAAQ,+BACRS,KAAM,CAACC,EAAUtD,IACjBoE,OAAQ,CACN6D,WAAAA,IApBI,CAuBV,GA8EQ,gBAACyE,EAAA,EAAO,CACNC,UAAQ,EACR/I,MAAOzF,EAAM0L,SAAWpH,EAAA,YAA0B,GAAW,uBAAyB,IAEtF,gBAAC2D,EAAA,EAAY,CACXC,QAAS,YACTzC,MAAOnB,EAAA,YAA0B,GAAW,UAC5C8D,iBAAiB,MACjBC,iBAAe,MAIrB,gBAACkG,EAAA,EAAO,CACNC,UAAQ,EACR/I,MAAOzF,EAAM0L,SAAWpH,EAAA,YAA0B,GAAW,uBAAyB,IAEtF,gBAACmK,EAAA,EAAU,CACT3I,QAxIV,WACEoD,EAAA,gBAA8B,CAAErH,GAAIsD,EAAUtD,IAAM,CAClDyH,OAAQ,eACR0D,WAAY,UACZ3D,cAAe,WACfD,WAAY,eACZqD,SAAU,+BAGZ,eAA2B,CACzBjI,YAAa,eACbC,OAAQ,oCACRS,KAAM,CAACC,EAAUtD,KAErB,EA2HUqG,QAAS,UACT/H,UAAU,uBACV0H,SAAU7H,EAAM0L,UAEhB,gBAACxH,EAAA,EAAI,CAACN,UAAW,GAAWO,OAAO,kBAKzC,sBAAIhE,UAAU,8BACX6F,EAASa,KAAK9E,IAAI,SAAAyB,GAAO,OACxB,sBAAIC,IAAKD,EAAQ3B,IACf,gBAACkI,GAA0B,CACzB5E,UAAWA,EACX3B,QAASA,EACT8I,gBAAiBtM,EAAMqG,OACvBwF,OAAQ7L,EAAM6L,OACdpB,eAAgBzK,EAAMqG,OAAOmH,OAAO,SAAAtG,GAAC,OAAIA,EAAEN,MAAMC,KAAK/D,KAAK,SAAAgE,GAAC,OAAIA,EAAEjF,KAAO2B,EAAQ3B,EAAE,EAAC,GACpF+G,QAASyE,EAAelM,UAAUqC,EAAQ3B,IAC1C4J,iBAAkB,WAAF,OAAQ4B,EAAehL,aAAamB,EAAQ3B,GAAG,EAC/D2K,cAAexM,EAAMwM,cACrBd,SAAU1L,EAAM0L,SAChBgB,gBAAiB1M,EAAM0L,SAAW,GAAU,uBAAyB,KAEpE,IAKf,C,4xBCtNA,IACM,GAAYpH,EAAA,mBADA,gCAGZoK,GAAuB,CAC3BpF,OAAQ,oBACR0D,WAAY,UACZ3D,cAAe,cACfoD,SAAU,qCAQN,SAAUkC,GAAsB3O,G,4BAC5B4O,GAAmB,EAAAC,EAAA,GAAY,MAA/BD,eACFE,EAAc,kBAAkCC,EAAA,iBAChD5J,EAAY,kBAAgC2J,EAAYjI,MAC5DoH,GAAA,eAA+BjO,EAAM6B,GAAIiN,EAAYjI,KAAKhF,KACtDmE,EAAW,kBAAqCiI,GAAA,uBAAuCjO,EAAM6B,GAAI7B,EAAMgP,SACvGC,EAAc,kBAAqCH,EAAYjI,MACnEqI,GAAA,WAA6BJ,EAAYjI,KAAKsI,WAAYzF,EAAA,YACtDrD,EAAS,kBAA+C4H,GAAA,qBAAqCjO,EAAM6B,KACnGgK,EAAS,kBAA6BuD,EAAA,YAG+C,G,EAAnD,WAA4C,QAAX,EAAA/I,EAAOQ,YAAI,eAAEA,M,EAAK,E,wnBAAnFwI,EAAW,KAAEC,EAAc,KACnC,YAAgB,WACVjJ,EAAOkJ,eAAiBlJ,EAAOmJ,YACjCF,EAAejJ,EAAOQ,KAAKA,KAC/B,EAAG,CAAER,EAAOkJ,aAAclJ,EAAOmJ,aAEjC,IAAMC,EAA0C,QAA7B,EAAc,QAAd,EAAAtK,EAAU0B,YAAI,eAAE6I,qBAAa,eAAEC,SAE5CxC,GAAW,UACTzC,GAAmB,EAAAC,EAAA,KAAnBD,eAOR,SAAS8B,EAAchJ,EAAe8B,EAAuBiH,GAC3D,IAAMqD,EAAgB,CACpB/N,GAAIyD,EAAMzD,GACVqM,aAAc,GAIZ2B,EAAgB,GAAIR,GAetBQ,EAdGtD,EAcasD,EAAc9N,IAAI,SAAAmF,GAChC,OAAIA,EAAErF,KAAOyD,EAAMzD,GACV,OAAP,wBACKqF,GAAC,CACJN,MAAO,OAAF,wBACAM,EAAEN,OAAK,CACVC,KAAMiJ,EAAA,OAAiB,GAAD,UAAM5I,EAAEN,MAAMC,MAAI,CAAErD,IAAW,UAIpD0D,CACT,GAxBgB2I,EAAc9N,IAAI,SAAAmF,GAChC,OAAIA,EAAErF,KAAOyD,EAAMzD,GACV,OAAP,wBACKqF,GAAC,CACJN,MAAO,OAAF,wBACAM,EAAEN,OAAK,CACVC,KAAMK,EAAEN,MAAMC,KAAK2G,OAAO,SAAArH,GAAC,OAAIA,EAAEtE,KAAO2B,EAAQ3B,EAAE,OAIjDqF,CACT,GAeFoI,EAAeO,GAGf,IAAM7B,EAAUzB,EACZ0B,GAAA,qBAAqC,CAACzK,EAAQ3B,IAAKyD,EAAMzD,GAAI7B,EAAM6B,GAAI,WACvEqH,EAAA,gBAA8B0G,EAAe,OAAF,wBACtClB,IAAoB,CACvBtF,WAAY,iBAEhB,GACE6E,GAAA,0BAA0C,CAACzK,EAAQ3B,IAAKyD,EAAMzD,GAAI7B,EAAM6B,GAAI,WAC5EqH,EAAA,gBAA8B0G,EAAe,OAAF,wBACtClB,IAAoB,CACvBtF,WAAY,kBAEhB,GAEF,UAAa+D,EAAUa,EACzB,CAEA,SAASF,EAAkB9H,EAAkBV,EAAuBwD,GAClE,IAAI+G,EAAgB,GAAIR,GAgBtBQ,EAfG/G,EAea+G,EAAc9N,IAAI,SAAAmF,GAChC,OAAIA,EAAErF,KAAOyD,EAAMzD,GACVqF,EAEF,OAAP,wBACKA,GAAC,CACJN,MAAO,OAAF,wBACAM,EAAEN,OAAK,CACVC,KAAMiJ,EAAA,OAAiB,GAAD,UAAM5I,EAAEN,MAAMC,MAAI,GAAKb,IAAY,SAG/D,GAzBgB6J,EAAc9N,IAAI,SAAAmF,GAChC,OAAIA,EAAErF,KAAOyD,EAAMzD,GACVqF,EAGF,OAAP,wBACKA,GAAC,CACJN,MAAO,OAAF,wBACAM,EAAEN,OAAK,CACVC,KAAMK,EAAEN,MAAMC,KAAK2G,OAAO,SAAArH,GAAC,OAAKH,EAAS+J,KAAK,SAAApC,GAAG,OAAIA,EAAI9L,KAAOsE,EAAEtE,EAAE,EAAC,MAG3E,GAeFyN,EAAeO,EACjB,CAYA,OAvGA,EAAAG,EAAA,GAAmB,CACjBvK,MAAO,GAAU,YAAa,CAAEwK,cAA6B,QAAd,EAAA9K,EAAU0B,YAAI,eAAEnB,UAEjE,EAAAwK,GAAA,GAAyB/K,GAqGtBA,EAAU0B,OACM,QAAb,EAAAb,EAASa,YAAI,eAAEA,QACJ,QAAX,EAAAR,EAAOQ,YAAI,eAAEA,OACbgF,EAAOhF,MACPoI,EAAYpI,MACZwI,EAKJ,gBAACc,GAAA,EAAe,CACdhL,UAAWA,EAAU0B,KACrBiI,YAAaA,EAAYjI,KACzBuJ,YAxBJ,SAAqBC,EAAoBC,EAAuBC,GAC9D,IAAId,EAAJ,CAEA,IAAMzB,EAAUqC,EACZpC,GAAA,eACAA,GAAA,iBAEJ,UAAad,EAAUa,EAAQ7I,EAAU0B,KAAMyJ,EAAWC,GALlD,CAMV,EAiBIC,UAAU,WACVf,WAAYA,EACZb,eAAgBA,GAEd,W,wBACA,OAAIa,EAEA,gCACE,gBAAC1P,EAAA,EAAc,CAACG,KAAK,eACA,QAAnB,EAAa,QAAb,EAAA8F,EAASa,YAAI,eAAEA,YAAI,eAAErF,QAGrB,gBAAC0L,GAAuB,CACtB/H,UAAWA,EAAU0B,KACrBb,SAAUA,EAASa,KACnBR,OAAQgJ,EACR7C,cAAeA,EACfsB,kBAAmBA,EACnBjC,OAAQA,EAAOhF,KACf7B,sBAA4C,QAAtB,EAAgB,QAAhB,EAAAiK,EAAYpI,YAAI,eAAEA,YAAI,eAAErF,QAC9C4C,eAAgBsG,EAAeiC,EAAA,eAC/BjB,UAAQ,IAXV,gBAAC5G,EAAmC,QAiBrB,QAAnB,EAAa,QAAb,EAAAkB,EAASa,YAAI,eAAEA,YAAI,eAAErF,QAErB,gBAAC0L,GAAuB,CACtB/H,UAAWA,EAAU0B,KACrBb,SAAUA,EAASa,KACnBR,OAAQgJ,EACR7C,cAAeA,EACfsB,kBAAmBA,EACnBjC,OAAQA,EAAOhF,KACf7B,sBAA4C,QAAtB,EAAgB,QAAhB,EAAAiK,EAAYpI,YAAI,eAAEA,YAAI,eAAErF,QAC9C4C,eAAgBsG,EAAeiC,EAAA,iBAMnC,gBAAC5H,EAAiC,CAChCI,UAAWA,EAAU0B,KACrBzB,mBAAoB,GAAU,sBAC9BJ,sBAA4C,QAAtB,EAAgB,QAAhB,EAAAiK,EAAYpI,YAAI,eAAEA,YAAI,eAAErF,QAC9C4C,eAAgBsG,EAAeiC,EAAA,gBAGrC,CA9CE,MAgD0B,QAAzB,EAAa,QAAb,EAAA3G,EAASa,YAAI,eAAE4J,kBAAU,eAAEC,UAC5B,gBAACC,EAAA,EAAU,CACTpM,QAAS,CACPC,YAAa,eACbC,OAAQ,kCACRS,KAAM,CAAClF,EAAM6B,KAEf6O,QAAkC,QAAzB,EAAa,QAAb,EAAA1K,EAASa,YAAI,eAAE4J,kBAAU,eAAEC,QACpCE,cAAc,eACdzQ,UAAU,iBACV0Q,UAAQ,KArEP,gBAACzN,GAAA,EAA8B,KA0E1C,C,wECzPM,SAAU0N,IACd,OAA6D,OAAY,MAAjElC,EAAc,EAAdA,eAAgBmC,EAAa,EAAbA,cAAeC,EAAiB,EAAjBA,kBACvC,GAAyD,SAAjDtG,EAAc,EAAdA,eAAgBuG,EAAQ,EAARA,SAAUC,EAAkB,EAAlBA,mBAgBlC,MAAO,CACLC,WAdKJ,EAGqD,cAAtDG,EAAmB,oBACd,UAELxG,EAAe,oBACV,OAELkE,EACK,eADT,EARS,OAcTwC,QAASJ,IAAsBC,EAEnC,C","sources":["file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","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/full-classrooms-experience/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/classroom-group-pill.scss","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/views/classroom-students/ClassroomStudentsView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useClassroomExperience.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text} \n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import { 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","// 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';\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/full-classrooms-experience/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","// extracted by mini-css-extract-plugin\nexport default {\"maxWidth\":\"A0VzW\"};","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\nimport styles from './classroom-group-pill.scss';\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 ${styles.maxWidth} text-white text-truncate bg-${mapColourToBsVariant(props.group.metadata?.colour)}`}>\n <p className='text-truncate mb-0' title={props.group.name}>{props.group.name}</p>\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\nfunction checkStudentsAllInGroup(students: User[], group: ClassroomGroup) {\n const groupUserIds = new Set(group.users.data.map(u => u.id.toString()));\n return students.every(student => groupUserIds.has(student.id.toString()));\n}\n\nfunction checkStudentsNotInGroup(students: User[], group: ClassroomGroup) {\n const groupUserIds = new Set(group.users.data.map(u => u.id.toString()));\n return students.every(student => !groupUserIds.has(student.id.toString()));\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 isBulk?: boolean;\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 const studentsAllInGroupLookup = props.groups.reduce((acc, group) => {\n acc[group.id] = checkStudentsAllInGroup(props.selectedStudents, group);\n return acc;\n }, {} as Record<string, boolean>);\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({\n classroom: { id: props.classroom.id, name: props.classroom.name }\n }, 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 = studentsAllInGroupLookup[g.id];\n // Validate if unchecked checkbox should be checked\n if (!!totalCheckedForGroup && !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 Object.entries(studentsAllInGroupLookup).sort((a, b) => a[0].localeCompare(b[0])).join(',')\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 const isEmptyChecked = checkStudentsNotInGroup(props.selectedStudents, group);\n const isIndeterminate = !props.isBulk\n ? false\n : !studentsAllInGroupLookup[group.id] && !isEmptyChecked;\n\n return (\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={isIndeterminate }\n />\n <ClassroomGroupPill group={group} />\n </li>\n );\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 const selectedGroupsRef = React.useRef<ClassroomGroup[]>(props.selectedGroups);\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 selectedGroupsRef.current = props.selectedGroups;\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(selectedGroupsRef.current.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({\n id: props.classroom.id,\n name: props.classroom.name,\n userId: props.student.id\n }, {\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} flex-shrink-0 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 onBulkSelectGroup: (students: User[], group: ClassroomGroup, shouldAdd: 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 // optimistically update the UI on bulk add/remove\n props.onBulkSelectGroup(students.data.filter(s => selectedStudentIds.includes(s.id.toString())), group, shouldAdd);\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 const selectedStudents = CheckboxHelper\n .getSelected()\n .map(id => {\n return props.students.data.find(s => s.id.toString() === id.toString());\n })\n .filter(s => !!s);\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={selectedStudents}\n isBulk\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","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\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 { useSettings } from 'libs/shared/hooks/useSettings';\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 { hasShareFlowV2 } = useSettings(null);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const 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 // Maintain a localGroups to optimistically update the UI\n const [ localGroups, setLocalGroups ] = React.useState<ClassroomGroup[]>(groups.data?.data);\n React.useEffect(() => {\n if (groups.hasCompleted && !groups.isFetching)\n setLocalGroups(groups.data.data);\n }, [ groups.hasCompleted, groups.isFetching ]);\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 // optimistically update the UI\n let updatedGroups = [...localGroups];\n if (!toggleOn) {\n updatedGroups = updatedGroups.map(g => {\n if (g.id === group.id) {\n return {\n ...g,\n users: {\n ...g.users,\n data: g.users.data.filter(s => s.id !== student.id)\n }\n };\n }\n return g;\n });\n } else {\n updatedGroups = updatedGroups.map(g => {\n if (g.id === group.id) {\n return {\n ...g,\n users: {\n ...g.users,\n data: ArrayHelper.uniq([ ...g.users.data, student ], 'id')\n }\n };\n }\n return g;\n });\n }\n setLocalGroups(updatedGroups);\n\n // send the request\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 // optimistically update the UI on bulk add/remove\n function onBulkSelectGroup(students: User[], group: ClassroomGroup, shouldAdd: boolean): void {\n let updatedGroups = [...localGroups];\n if (!shouldAdd) {\n updatedGroups = updatedGroups.map(g => {\n if (g.id !== group.id) {\n return g;\n }\n\n return {\n ...g,\n users: {\n ...g.users,\n data: g.users.data.filter(s => !students.some(stu => stu.id === s.id))\n }\n };\n });\n } else {\n updatedGroups = updatedGroups.map(g => {\n if (g.id !== group.id) {\n return g;\n }\n return {\n ...g,\n users: {\n ...g.users,\n data: ArrayHelper.uniq([ ...g.users.data, ...students ], 'id')\n }\n };\n });\n }\n setLocalGroups(updatedGroups);\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 || !localGroups\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 hasShareFlowV2={hasShareFlowV2}\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={localGroups}\n onToggleGroup={onToggleGroup}\n onBulkSelectGroup={onBulkSelectGroup}\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={localGroups}\n onToggleGroup={onToggleGroup}\n onBulkSelectGroup={onBulkSelectGroup}\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 prevHack\n />\n )}\n </ClassroomLayout>\n );\n}\n","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\ntype ClassroomExperience = 'none' | 'minimal' | 'full';\n\nexport function useClassroomExperience() {\n const { hasShareFlowV2, hasClassrooms, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded, getGatedPermission } = usePermissions();\n\n function getExperience(): ClassroomExperience {\n if (!hasClassrooms)\n return 'none';\n\n if (getGatedPermission(PermissionName.ViewClassrooms) === 'soft-gate')\n return 'minimal';\n\n if (hasPermissions(PermissionName.ViewClassrooms))\n return 'full';\n \n if (hasShareFlowV2)\n return 'minimal';\n }\n\n return {\n experience: getExperience(),\n loading: isLoadingSettings || !isLoaded\n };\n}"],"names":["getPhrase","RosteringAlert","props","text","type","className","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","current","clear","isChecked","item","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","id","set","map","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","keys","bulkChecked","deselectAll","hasSomeSelections","find","getSelectedCount","size","getMap","mapColourToBsVariant","groupColour","PartialManageClassroomStudents","numItems","PartialPillTabSelector","fill","student","key","Math","random","namespace","ClassroomsNoStudentsState","value","EmptyState","src","ImageUrls","Text","phrase","canManageUsers","isRostering","LanguageService","appLink","application","action","href","target","STUDENT_ENGAGEMENT_IDEAS_LINK","ROSTERING_KB_ARTICLE_URL","RosteredClassroomStudentsEmptyState","ManageClassroomStudentsEmptyState","schoolHasNoStudents","icon","args","classroom","classroomIdeasText","ClassroomGroupPill","group","metadata","colour","title","name","ClassroomGroupExpander","count","DivButton","onClick","getNewGroupAppLink","students","params","addStudents","s","ClassroomGroupDropdown","groups","preselections","studentsAllInGroupLookup","reduce","acc","groupUserIds","Set","users","data","u","has","checkStudentsAllInGroup","selectedStudents","g","totalCheckedForGroup","Object","entries","sort","a","b","localeCompare","dropdownProps","align","alignRight","disabled","show","Dropdown","as","SvgContainer","svgName","disabledTooltips","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","isEmptyChecked","checkStudentsNotInGroup","isIndeterminate","isBulk","Checkbox","checked","onChange","shouldAdd","onSelectGroup","indeterminate","AppLink","AnalyticsHelper","analyticsOptions","actionType","workflowPhase","entity","defaultProps","getEditStudentAppLink","userType","UserGroup","getRemoveStudentsAppLink","studentId","classroomId","studentIds","ManageClassroomStudentItem","isComputingTruncation","setIsComputingTruncation","hasExpandedGroups","setHasExpandedGroups","groupVisibilityMapping","setGroupVisibilityMapping","groupListRef","expanderRef","selectedGroupsRef","selectedGroups","hasPermissions","usePermissions","renderAllGroups","actions","throttledResizeListener","FunctionHelper","firstGroupPill","firstElementChild","lastVisibleId","topRowHeight","getBoundingClientRect","y","nextGroupVisibilityMapping","children","child","onToggleCheckbox","readOnly","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","ref","groupId","classroomGroups","toggleOn","onToggleGroup","location","readOnlyTooltip","PermissionName","push","label","tooltip","userId","descriptor","actionsDropdownClassName","ManageClassroomStudents","dispatch","alerts","CheckboxHelper","selectionCount","bulkPreselections","filter","allStudentsFound","index","stu","edgeToEdge","selectedStudentIds","onBulkSelectGroup","includes","request","ClassroomRequests","studentCount","success","groupName","escapeText","error","Tooltip","spanHack","IconButton","baseAnalyticsOptions","ClassroomStudentsView","hasShareFlowV2","useSettings","currentUser","UserRequests","cursor","allStudents","UserManagerRequests","customerId","ConfigRequests","localGroups","setLocalGroups","hasCompleted","isFetching","isRostered","_integrations","rostered","analyticsData","updatedGroups","ArrayHelper","some","useSetPageMetadata","classroomName","useHandleClassroomErrors","ClassroomLayout","onTogglePin","shouldPin","onSuccess","onError","activeTab","pagination","cursors","Pagination","buttonVariant","prevHack","useClassroomExperience","hasClassrooms","isLoadingSettings","isLoaded","getGatedPermission","experience","loading"],"sourceRoot":""}
|