@clickview/lite 0.50.1-rc.1 → 0.50.1-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{1820-lite-ebb89eab7a.chunk.css → 1820-lite-8008c78ef7.chunk.css} +1 -1
  3. package/dist/css/{2120-lite-dd1595051d.chunk.css → 2120-lite-b1876117b4.chunk.css} +1 -1
  4. package/dist/css/{2137-lite-7045732fc8.chunk.css → 2137-lite-6e9d11bd5b.chunk.css} +1 -1
  5. package/dist/css/{2795-lite-1641e6fbf9.chunk.css → 2795-lite-34f8ca5018.chunk.css} +1 -1
  6. package/dist/css/{3515-lite-66473d08ed.chunk.css → 3515-lite-10695a1950.chunk.css} +1 -1
  7. package/dist/css/{458-lite-66473d08ed.chunk.css → 458-lite-10695a1950.chunk.css} +1 -1
  8. package/dist/css/{5242-lite-3e960b685e.chunk.css → 5242-lite-30642a9642.chunk.css} +1 -1
  9. package/dist/css/{5446-lite-ae2395342f.chunk.css → 5446-lite-2e956685f4.chunk.css} +1 -1
  10. package/dist/css/{6850-lite-c1a8731a93.chunk.css → 6850-lite-0bf8514497.chunk.css} +2 -2
  11. package/dist/css/{7987-lite-94679244a2.chunk.css → 7987-lite-fd431fbaf2.chunk.css} +1 -1
  12. package/dist/css/{9620-lite-d77e9ad59b.chunk.css → 9620-lite-111c825071.chunk.css} +1 -1
  13. package/dist/scripts/1169-5a0d974a94-lite.chunk.js +2 -0
  14. package/dist/scripts/1169-5a0d974a94-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1820-68114ca994-lite.chunk.js → 1820-9a1f618969-lite.chunk.js} +2 -2
  16. package/dist/scripts/1820-9a1f618969-lite.chunk.js.map +1 -0
  17. package/dist/scripts/{2120-88f6dd6652-lite.chunk.js → 2120-82a7b90997-lite.chunk.js} +1 -1
  18. package/dist/scripts/{2120-88f6dd6652-lite.chunk.js.map → 2120-82a7b90997-lite.chunk.js.map} +1 -1
  19. package/dist/scripts/{2137-093f479ff9-lite.chunk.js → 2137-2e78e535ad-lite.chunk.js} +1 -1
  20. package/dist/scripts/{2137-093f479ff9-lite.chunk.js.map → 2137-2e78e535ad-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/{2795-0616748349-lite.chunk.js → 2795-eb3a51adc2-lite.chunk.js} +1 -1
  22. package/dist/scripts/{2795-0616748349-lite.chunk.js.map → 2795-eb3a51adc2-lite.chunk.js.map} +1 -1
  23. package/dist/scripts/3070-63e0a6b63e-lite.chunk.js +2 -0
  24. package/dist/scripts/3070-63e0a6b63e-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{3515-0d5feefbe3-lite.chunk.js → 3515-72a31e0bbd-lite.chunk.js} +1 -1
  26. package/dist/scripts/{3515-0d5feefbe3-lite.chunk.js.map → 3515-72a31e0bbd-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/{458-e3aaac093b-lite.chunk.js → 458-1ca8abf829-lite.chunk.js} +1 -1
  28. package/dist/scripts/{458-e3aaac093b-lite.chunk.js.map → 458-1ca8abf829-lite.chunk.js.map} +1 -1
  29. package/dist/scripts/4718-b3cfb276a7-lite.chunk.js +2 -0
  30. package/dist/scripts/4718-b3cfb276a7-lite.chunk.js.map +1 -0
  31. package/dist/scripts/{5242-e2f40bdd0e-lite.chunk.js → 5242-e5cc8311eb-lite.chunk.js} +1 -1
  32. package/dist/scripts/{5242-e2f40bdd0e-lite.chunk.js.map → 5242-e5cc8311eb-lite.chunk.js.map} +1 -1
  33. package/dist/scripts/{5446-1ef1639ef6-lite.chunk.js → 5446-5a2f719a6f-lite.chunk.js} +1 -1
  34. package/dist/scripts/{5446-1ef1639ef6-lite.chunk.js.map → 5446-5a2f719a6f-lite.chunk.js.map} +1 -1
  35. package/dist/scripts/{5940-511beff2ee-lite.chunk.js → 5940-5731abccf3-lite.chunk.js} +2 -2
  36. package/dist/scripts/5940-5731abccf3-lite.chunk.js.map +1 -0
  37. package/dist/scripts/6309-f5bb1c14dc-lite.chunk.js +3 -0
  38. package/dist/scripts/6309-f5bb1c14dc-lite.chunk.js.map +1 -0
  39. package/dist/scripts/6450-2745feb746-lite.chunk.js +2 -0
  40. package/dist/scripts/6450-2745feb746-lite.chunk.js.map +1 -0
  41. package/dist/scripts/6850-393de993b8-lite.chunk.js +3 -0
  42. package/dist/scripts/6850-393de993b8-lite.chunk.js.map +1 -0
  43. package/dist/scripts/{7987-db0037709c-lite.chunk.js → 7987-ff7de6531f-lite.chunk.js} +1 -1
  44. package/dist/scripts/{7987-db0037709c-lite.chunk.js.map → 7987-ff7de6531f-lite.chunk.js.map} +1 -1
  45. package/dist/scripts/9016-0c078a39cb-lite.chunk.js +3 -0
  46. package/dist/scripts/9016-0c078a39cb-lite.chunk.js.map +1 -0
  47. package/dist/scripts/9620-d0f04eeccd-lite.chunk.js +3 -0
  48. package/dist/scripts/9620-d0f04eeccd-lite.chunk.js.map +1 -0
  49. package/dist/scripts/{bundle-bb2e18c8ca.min.js → bundle-815f926b0f.min.js} +3 -3
  50. package/dist/scripts/bundle-815f926b0f.min.js.map +1 -0
  51. package/package.json +1 -1
  52. package/dist/scripts/1169-3df974a8eb-lite.chunk.js +0 -2
  53. package/dist/scripts/1169-3df974a8eb-lite.chunk.js.map +0 -1
  54. package/dist/scripts/1820-68114ca994-lite.chunk.js.map +0 -1
  55. package/dist/scripts/3070-b148205227-lite.chunk.js +0 -2
  56. package/dist/scripts/3070-b148205227-lite.chunk.js.map +0 -1
  57. package/dist/scripts/4718-2b58aa560d-lite.chunk.js +0 -2
  58. package/dist/scripts/4718-2b58aa560d-lite.chunk.js.map +0 -1
  59. package/dist/scripts/5940-511beff2ee-lite.chunk.js.map +0 -1
  60. package/dist/scripts/6309-36ea0c9f2c-lite.chunk.js +0 -3
  61. package/dist/scripts/6309-36ea0c9f2c-lite.chunk.js.map +0 -1
  62. package/dist/scripts/6450-6819d42c15-lite.chunk.js +0 -2
  63. package/dist/scripts/6450-6819d42c15-lite.chunk.js.map +0 -1
  64. package/dist/scripts/6850-16bec85d3c-lite.chunk.js +0 -3
  65. package/dist/scripts/6850-16bec85d3c-lite.chunk.js.map +0 -1
  66. package/dist/scripts/9016-c359251f82-lite.chunk.js +0 -3
  67. package/dist/scripts/9016-c359251f82-lite.chunk.js.map +0 -1
  68. package/dist/scripts/9620-630f9e6344-lite.chunk.js +0 -3
  69. package/dist/scripts/9620-630f9e6344-lite.chunk.js.map +0 -1
  70. package/dist/scripts/bundle-bb2e18c8ca.min.js.map +0 -1
  71. /package/dist/scripts/{6309-36ea0c9f2c-lite.chunk.js.LICENSE.txt → 6309-f5bb1c14dc-lite.chunk.js.LICENSE.txt} +0 -0
  72. /package/dist/scripts/{6850-16bec85d3c-lite.chunk.js.LICENSE.txt → 6850-393de993b8-lite.chunk.js.LICENSE.txt} +0 -0
  73. /package/dist/scripts/{9016-c359251f82-lite.chunk.js.LICENSE.txt → 9016-0c078a39cb-lite.chunk.js.LICENSE.txt} +0 -0
  74. /package/dist/scripts/{9620-630f9e6344-lite.chunk.js.LICENSE.txt → 9620-d0f04eeccd-lite.chunk.js.LICENSE.txt} +0 -0
  75. /package/dist/scripts/{bundle-bb2e18c8ca.min.js.LICENSE.txt → bundle-815f926b0f.min.js.LICENSE.txt} +0 -0
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5446],{28694:(e,a,t)=>{t.r(a),t.d(a,{StudentManagerView:()=>G});var r=t(32735),s=t(70680),n=t(23481),c=t(20354),o=t(88822),u=t(46456),i=t(26055),l=t(43820),d=t(56138),p=t(39739),m=t(37395),y=t(99705),v=t(76881),g=t(39151),E=t(70145),h=t(44538),b=t(31949),f=t(69883),T=t(91286),k=t(79612),S=t(12778),A=t(99742),P=t(29613),N=t(48327),j=t(47288),R=t(51180),U=t(18087),w=t(23232),x=t(83345),C=t(35223),I=t(14070),M=t(97291),q="userManager.studentManagerEmptyState",B=v.Y.Learner;function L(){return r.createElement(x.D.Provider,{value:q},r.createElement(w.u,null,r.createElement(w.u.Image,{src:A.W.EmptyStates.UserManager.STUDENTS,size:"small"}),r.createElement(w.u.Heading,null,r.createElement(x.x,{phrase:"heading"})),r.createElement(w.u.Info,null,r.createElement(x.x,{phrase:"info"})),r.createElement("div",{className:"d-flex justify-content-center align-items-center"},r.createElement("div",{className:"px-1"},r.createElement(w.u.Cta,{text:n.T.getPhrase(q,"addNew"),icon:C.vn.Plus,appLink:{application:M.O.USER_MANAGER,action:I.e.UserManager.CREATE_USER,params:{userType:B}}})),r.createElement("div",{className:"px-1"},r.createElement(w.u.Cta,{text:n.T.getPhrase(q,"uploadAList"),icon:C.vn.Upload,appLink:{application:M.O.USER_MANAGER,action:I.e.UserManager.USER_UPLOAD_POPUP,params:{userType:B}}})))))}var _=n.T.encloseNamespace("userManager.studentManager"),F=v.Y.Learner;function G(e){var a,t,n,v,w,x,C,I;(0,k.M)({title:_("pageTitle")});var M=(0,U.Y)(F,e.queryParams),q=(0,s.I0)(),B=(0,f.Z)(),G=c.a.useBasicFetch(h.K.getRostering()),J=c.a.useBasicFetch(b.N.currentUser()),O=c.a.useBasicFetch(g.L.config()),V=c.a.useBasicFetch(J.data&&j.N.yearGroups(J.data.customerId)),Y=c.a.useBasicFetch(!!J.data&&P.q.getYearGroupRolloverStatus(J.data.customerId)),D=c.a.useBasicFetch(!!J.data&&j.N.getIdentityProviders(J.data.customerId)),H=c.a.useBasicFetch(E.h.userProducts()),W=(null===(a=G.data)||void 0===a?void 0:a.status)&&"None"!==G.data.status,K=(0,R.T)(J.data,e.queryParams,F),z=K.data?"results"in K.data?K.data.results:K.data.data:null;c.a.useBasicFetch(j.N.authenticationMethods(null!==(n=null===(t=null==z?void 0:z.map((function(e){return e.id})))||void 0===t?void 0:t.sort())&&void 0!==n?n:[]));var Q=(0,d.x)({userType:F,queryParams:e.queryParams,getUserCountRequest:j.N.userCount});(0,T.v)(K);var Z=p.P.showEmptyState(K,e.queryParams);return r.createElement(i.A.Provider,{value:l.a.Primary},r.createElement("div",{className:"px-3"},r.createElement(u.g,{userType:F,appLinks:M,users:z,userCount:Q.data,hasRostering:W}),Z?r.createElement(L,null):r.createElement("main",{className:"py-3 clearfix"},r.createElement(o.G,{users:z,userType:F,config:O.data,currentUser:J.data,appLinks:M,searchEmptyState:A.W.EmptyStates.UserManager.SEARCH,totalUsers:null===(v=Q.data)||void 0===v?void 0:v.count,queryParams:e.queryParams,yearGroups:V.data,yearGroupRolloverStatus:Y.data,fetchUserIds:function(a){c.a.fetch(q,j.N.getSearchUserIds(J.data.customerId,J.data.id,F,e.queryParams,a))},ssoHelpArticle:S.o.getLiteArticle(y.b.EditSsoAccounts),onClickSendVerificationEmail:function(e){c.a.fetch(q,j.N.resendVerificationEmail(e.id,J.data.customerId,(function(){B.success(_("resendVerificationEmailSuccess",{email:e.email,escapeText:!0}))}),(function(){B.error(_("resendVerificationEmailError",{email:e.email,escapeText:!0}))})))},onClickResendActivationEmail:function(e){c.a.fetch(q,j.N.resendActivationEmail(e.id,(function(){B.success(_("resendActivationEmailSuccess",{email:e.email,escapeText:!0}))}),(function(){B.error(_("resendActivationEmailError",{email:e.email,escapeText:!0}))})))},hasSso:!!(null===(w=D.data)||void 0===w?void 0:w.length),userRequest:b.N.getUserIdByQuery,selectWithSpreadsheetTemplate:N.d,hasRostering:W,products:null!==(x=H.data.map((function(e){return e.id})))&&void 0!==x?x:[]}),!!(null===(I=null===(C=K.data)||void 0===C?void 0:C.pagination)||void 0===I?void 0:I.cursors)&&r.createElement(m.t,{appLink:M.search,cursors:K.data.pagination.cursors,buttonVariant:"outline-dark",className:"py-2 float-end"}))))}},29613:(e,a,t)=>{t.d(a,{q:()=>c});var r=t(99940),s=t(97395),n=t(149),c={createJob:function(e,a,t){return{url:"{gateway}/v1/batch/jobs",key:"create:job",type:r.k.POST,data:e,success:a,error:t}},getJobs:function(e){var a={},t=[],r=[];return e.cursor&&(a.cursor=e.cursor),e.sort&&("oldest"===e.sort?a.order="ASC":a.order="DESC"),e.bulkActionType?(t=Array.isArray(e.bulkActionType)?e.bulkActionType:[e.bulkActionType],a.type=t):a.type=n.O,e.userType&&(r=Array.isArray(e.userType)?e.userType:[e.userType],a.dataType=r),{url:s._.urlBuilder("{gateway}/v1/batch/jobs",a),key:"batch:jobs:".concat(e.cursor,":").concat(e.sort,":").concat(t.sort().join(":"),":").concat(r.sort().join(":"))}},getJob:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e),key:"job:".concat(e)}},getJobProgress:function(e,a,t){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/progress"),key:"job:".concat(e,":progress"),invalidationKeys:"job:".concat(e,":progress"),success:a,error:t}},getJobResults:function(e,a,t,r,n){var c={status:a};return t&&(c.cursor=t),{url:s._.urlBuilder("{gateway}/v1/batch/jobs/".concat(e,"/results"),c),key:"job:".concat(e,":results:").concat(a,":").concat(t),success:r,error:n}},getYearGroupRolloverStatus:function(e){return{url:"{gateway}/v1/batch/validations/customers/".concat(e,"/year-group-roll-over"),key:"year:group:rollover:status"}},sendJobReports:function(e){return{url:"{gateway}/v1/batch/results/export",key:"send:job:reports:".concat(e.sort().join(":")),type:r.k.POST,data:{jobIds:e}}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}}}}}]);
2
- //# sourceMappingURL=5446-1ef1639ef6-lite.chunk.js.map
2
+ //# sourceMappingURL=5446-5a2f719a6f-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/5446-1ef1639ef6-lite.chunk.js","mappings":"ggBAaMA,EAAY,uCACZC,EAAWC,EAAA,UAEX,SAAUC,IACd,OACE,gBAAC,aAAiC,CAACC,MAAOJ,GACxC,gBAACK,EAAA,EAAU,KACT,gBAACA,EAAA,QAAgB,CAACC,IAAKC,EAAA,mCAA4CC,KAAK,UAExE,gBAACH,EAAA,UAAkB,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,aAEjC,gBAACL,EAAA,OAAe,KAAC,gBAACI,EAAA,EAAI,CAACC,OAAO,UAE9B,uBAAKC,UAAU,oDACb,uBAAKA,UAAU,QACb,gBAACN,EAAA,MAAc,CACbO,KAAMC,EAAA,YAA0Bb,EAAW,UAC3Cc,KAAM,UACNC,QAAS,CACPC,YAAa,iBACbC,OAAQ,4BACRC,OAAQ,CAAEjB,SAAAA,OAKhB,uBAAKU,UAAU,QACb,gBAACN,EAAA,MAAc,CACbO,KAAMC,EAAA,YAA0Bb,EAAW,eAC3Cc,KAAM,YACNC,QAAS,CACPC,YAAa,iBACbC,OAAQ,kCACRC,OAAQ,CAAEjB,SAAAA,SAQ1B,CChBA,IAAMkB,EAAYN,EAAA,mBAAiC,8BAE7C,EAAWX,EAAA,UAMX,SAAUkB,EAAmBC,G,qBACjC,EAAAC,EAAA,GAAmB,CAAEC,MAAOJ,EAAU,eACtC,IAAMK,GAAW,OAAuB,EAAUH,EAAMI,aAClDC,GAAW,UACXC,GAAS,SAETC,EAAY,kBAAwCC,EAAA,kBACpDC,EAAc,kBAAkCC,EAAA,iBAChDC,EAAS,kBAA6BC,EAAA,YACtCC,EAAa,kBACjBJ,EAAYK,MAAQC,EAAA,aAA+BN,EAAYK,KAAKE,aAEhEC,EAA0B,oBAAgDR,EAAYK,MAC1FI,EAAA,6BAAuCT,EAAYK,KAAKE,aACpDG,EAAoB,oBAAqDV,EAAYK,MACzFC,EAAA,uBAAyCN,EAAYK,KAAKE,aACtDI,EAAW,kBAAgCC,EAAA,kBAE3CC,GAA6B,QAAd,EAAAf,EAAUO,YAAI,eAAES,SAAoC,SAA1BhB,EAAUO,KAAKS,OAExDC,GAAkB,EAAAC,EAAA,GACtBhB,EAAYK,KACZd,EAAMI,YACN,GAGIsB,EAAWF,EAAgBV,KAAS,YAAaU,EAAgBV,KAAQU,EAAgBV,KAAKa,QAAUH,EAAgBV,KAAKA,KAAQ,KAE3I,kBAAqBC,EAAA,wBAA0E,QAAhC,EAAwB,QAAxB,EAAAW,aAAQ,EAARA,EAAUE,KAAI,SAAAC,GAAC,OAAIA,EAAEC,EAAE,WAAC,eAAEC,cAAM,QAAI,KAEnG,IAAMC,GAAY,EAAAC,EAAA,GAAkB,CAClCrD,SAAA,EACAwB,YAAaJ,EAAMI,YACnB8B,oBAAqBnB,EAAA,eAGvB,OAAqBS,GA4BrB,IAAMW,EAAiBC,EAAA,iBAAiCZ,EAAiBxB,EAAMI,aAE/E,OACE,gBAACiC,EAAA,WAAiC,CAACtD,MAAOuD,EAAA,WACxC,uBAAKhD,UAAU,QACb,gBAACiD,EAAA,EAAiB,CAChB3D,SAAU,EACVuB,SAAUA,EACVqC,MAAOd,EACPM,UAAWA,EAAUlB,KACrBQ,aAAcA,IAGda,EAgCA,gBAACrD,EAAwB,MA/BzB,wBAAMQ,UAAU,iBACd,gBAACmD,EAAA,EAAW,CACVD,MAAOd,EACP9C,SAAU,EACV+B,OAAQA,EAAOG,KACfL,YAAaA,EAAYK,KACzBX,SAAUA,EACVuC,iBAAkBxD,EAAA,iCAClByD,WAA0B,QAAd,EAAAX,EAAUlB,YAAI,eAAE8B,MAC5BxC,YAAaJ,EAAMI,YACnBS,WAAYA,EAAWC,KACvBG,wBAAyBA,EAAwBH,KACjD+B,aApDZ,SAAsBC,GACpB,UAAazC,EAAUU,EAAA,mBACrBN,EAAYK,KAAKE,WACjBP,EAAYK,KAAKgB,GACjB,EACA9B,EAAMI,YACN0C,GAEJ,EA6CYC,eAAgBC,EAAA,iBAA6B,qBAC7CC,6BApCZ,SAAwCC,GACtC,UAAa7C,EAAUU,EAAA,0BAA4CmC,EAAKpB,GAAIrB,EAAYK,KAAKE,YAAY,WACvGV,EAAOwC,QAAQhD,EAAU,iCAAkC,CAAEqD,MAAOD,EAAKC,MAAOC,YAAY,IAC9F,IAAG,WACD9C,EAAO+C,MAAMvD,EAAU,+BAAgC,CAAEqD,MAAOD,EAAKC,MAAOC,YAAY,IAC1F,IACF,EA+BYE,6BA7CZ,SAAsCJ,GACpC,UAAa7C,EAAUU,EAAA,wBAA0CmC,EAAKpB,IAAI,WACxExB,EAAOwC,QAAQhD,EAAU,+BAAgC,CAAEqD,MAAOD,EAAKC,MAAOC,YAAY,IAC5F,IAAG,WACD9C,EAAO+C,MAAMvD,EAAU,6BAA8B,CAAEqD,MAAOD,EAAKC,MAAOC,YAAY,IACxF,IACF,EAwCYG,UAAgC,QAAtB,EAAApC,EAAkBL,YAAI,eAAE0C,QAClCC,YAAa/C,EAAA,mBACbgD,8BAA+BC,EAAA,EAC/BrC,aAAcA,EACdF,SAAsC,QAA5B,EAAAA,EAASN,KAAKc,KAAI,SAAAgC,GAAC,OAAIA,EAAE9B,EAAE,WAAC,QAAI,QAET,QAAhC,EAAoB,QAApB,EAAAN,EAAgBV,YAAI,eAAE+C,kBAAU,eAAEC,UACnC,gBAACC,EAAA,EAAU,CACTrE,QAASS,EAAS6D,OAClBF,QAAStC,EAAgBV,KAAK+C,WAAWC,QACzCG,cAAc,eACd3E,UAAU,qBAS1B,C,sECnJa4B,EAAc,CACzBgD,UAAS,SACPpD,EACAgC,EACAO,GAEA,MAAO,CACLc,IAAK,0BACLC,IAAK,aACLC,KAAM,SACNvD,KAAAA,EACAgC,QAAAA,EACAO,MAAAA,EAEJ,EAEAiB,QAAO,SAAClE,GACN,IAAMP,EAAqB,CAAC,EAExB0E,EAAkC,GAClCC,EAAyB,GA+B7B,OA7BIpE,EAAYqE,SACd5E,EAAO4E,OAASrE,EAAYqE,QAE1BrE,EAAY2B,OACW,WAArB3B,EAAY2B,KACdlC,EAAO6E,MAAQ,MAEf7E,EAAO6E,MAAQ,QAGftE,EAAYuE,gBACdJ,EAAkBK,MAAMC,QAAQzE,EAAYuE,gBACxCvE,EAAYuE,eACZ,CAACvE,EAAYuE,gBAEjB9E,EAAOwE,KAAOE,GAGd1E,EAAOwE,KAAO,IAGZjE,EAAYxB,WACd4F,EAAYI,MAAMC,QAAQzE,EAAYxB,UAClCwB,EAAYxB,SACZ,CAACwB,EAAYxB,UAEjBiB,EAAOiF,SAAWN,GAGb,CACLL,IAAK,eAAqB,0BAA2BtE,GACrDuE,IAAK,cAAF,OAAgBhE,EAAYqE,OAAM,YAAIrE,EAAY2B,KAAI,YAAIwC,EAAgBxC,OAAOgD,KAAK,KAAI,YAAIP,EAAUzC,OAAOgD,KAAK,MAE3H,EAEAC,OAAM,SAAClD,GACL,MAAO,CACLqC,IAAK,2BAAF,OAA6BrC,GAChCsC,IAAK,OAAF,OAAStC,GAEhB,EAEAmD,eAAc,SACZnD,EACAgB,EACAO,GAEA,MAAO,CACLc,IAAK,2BAAF,OAA6BrC,EAAE,aAClCsC,IAAK,OAAF,OAAStC,EAAE,aACdoD,iBAAkB,OAAF,OAASpD,EAAE,aAC3BgB,QAAAA,EACAO,MAAAA,EAEJ,EAEA8B,cAAa,SACXrD,EACAP,EACAkD,EACA3B,EACAO,GAEA,IAAMxD,EAAqB,CACzB0B,OAAAA,GAMF,OAHIkD,IACF5E,EAAO4E,OAASA,GAEX,CACLN,IAAK,eAAqB,2BAAD,OAA4BrC,EAAE,YAAYjC,GACnEuE,IAAK,OAAF,OAAStC,EAAE,oBAAYP,EAAM,YAAIkD,GACpC3B,QAAAA,EACAO,MAAAA,EAEJ,EAEA+B,2BAA0B,SAACpE,GACzB,MAAO,CACLmD,IAAK,4CAAF,OAA8CnD,EAAU,yBAC3DoD,IAAK,6BAET,EAEAiB,eAAc,SAACC,GACb,MAAO,CACLnB,IAAK,oCACLC,IAAK,oBAAF,OAAsBkB,EAAIvD,OAAOgD,KAAK,MACzCV,KAAM,SACNvD,KAAM,CACJyE,OAAQD,GAGd,EAEAE,cAAa,SAAC1D,GACZ,MAAO,CACLqC,IAAK,2BAAF,OAA6BrC,EAAE,YAClCsC,IAAK,eAAF,OAAiBtC,GAExB,E","sources":["file:///app/packages/projects/lite/src/apps/user-manager/views/student-manager/empty-state/LiteStudentManagerEmptyState.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/student-manager/LiteStudentManagerView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts"],"sourcesContent":["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 { UserGroup } from 'libs/shared/enums/UserGroup';\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\nconst namespace = 'userManager.studentManagerEmptyState';\nconst userType = UserGroup.Learner;\n\nexport function StudentManagerEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.UserManager.STUDENTS} size='small' />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n <div className='d-flex justify-content-center align-items-center'>\n <div className='px-1'>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addNew')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.CREATE_USER,\n params: { userType }\n }}\n />\n </div>\n\n <div className='px-1'>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'uploadAList')}\n icon={cvSvgLibrary.Upload}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.USER_UPLOAD_POPUP,\n params: { userType }\n }}\n />\n </div>\n </div>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { ManageUsers } from 'libs/shared/apps/user-manager/components/manage-users/ManageUsers';\nimport { UserManagerHeader } from 'libs/shared/apps/user-manager/components/user-manager-header/UserManagerHeader';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useFetchUserCount } from 'libs/shared/apps/user-manager/hooks/useFetchUserCount';\nimport { GetIdentityProvidersResponse } from 'libs/shared/apps/user-manager/interfaces/GetIdentityProvidersResponse';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Product, RosteringResponse, User, YearGroup } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SelectWithSpreadsheetTemplates } from 'apps/user-manager/constants/SelectWithSpreadsheetTemplate';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\nimport { useFetchUsers } from 'apps/user-manager/hooks/useFetchUsers';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nimport { StudentManagerEmptyState } from './empty-state/LiteStudentManagerEmptyState';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.studentManager');\n\nconst userType = UserGroup.Learner;\n\ninterface StudentManagerViewProps {\n queryParams: UserManagerQueryParams;\n}\n\nexport function StudentManagerView(props: StudentManagerViewProps): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n const appLinks = getUserManagerAppLinks(userType, props.queryParams);\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const yearGroupRolloverStatus = Flight.useBasicFetch<YearGroupRolloverStatus>(!!currentUser.data &&\n JobRequests.getYearGroupRolloverStatus(currentUser.data.customerId));\n const identityProviders = Flight.useBasicFetch<GetIdentityProvidersResponse>(!!currentUser.data &&\n UserManagerRequests.getIdentityProviders(currentUser.data.customerId));\n const products = Flight.useBasicFetch<Product[]>(ProductRequests.userProducts());\n\n const hasRostering = rostering.data?.status && rostering.data.status !== 'None';\n\n const studentResponse = useFetchUsers(\n currentUser.data,\n props.queryParams,\n userType\n );\n\n const students = studentResponse.data ? (('results' in studentResponse.data) ? studentResponse.data.results : studentResponse.data.data) : null;\n\n Flight.useBasicFetch(UserManagerRequests.authenticationMethods(students?.map(s => s.id)?.sort() ?? []));\n\n const userCount = useFetchUserCount({\n userType,\n queryParams: props.queryParams,\n getUserCountRequest: UserManagerRequests.userCount\n });\n\n useHandleObjectError(studentResponse);\n\n function fetchUserIds(success: (userIds: string[]) => void): void {\n Flight.fetch(dispatch, UserManagerRequests.getSearchUserIds(\n currentUser.data.customerId,\n currentUser.data.id,\n userType,\n props.queryParams,\n success\n ));\n }\n\n function onClickResendActivationEmail(user: User): void {\n Flight.fetch(dispatch, UserManagerRequests.resendActivationEmail(user.id, () => {\n alerts.success(getPhrase('resendActivationEmailSuccess', { email: user.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('resendActivationEmailError', { email: user.email, escapeText: true }));\n }));\n }\n\n function onClickResendVerificationEmail(user: User): void {\n Flight.fetch(dispatch, UserManagerRequests.resendVerificationEmail(user.id, currentUser.data.customerId, () => {\n alerts.success(getPhrase('resendVerificationEmailSuccess', { email: user.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('resendVerificationEmailError', { email: user.email, escapeText: true }));\n }));\n }\n\n const showEmptyState = UserManagerHelper.showEmptyState(studentResponse, props.queryParams);\n \n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <div className='px-3'>\n <UserManagerHeader\n userType={userType}\n appLinks={appLinks}\n users={students}\n userCount={userCount.data}\n hasRostering={hasRostering}\n />\n\n {!showEmptyState ? (\n <main className='py-3 clearfix'>\n <ManageUsers\n users={students}\n userType={userType}\n config={config.data}\n currentUser={currentUser.data}\n appLinks={appLinks}\n searchEmptyState={ImageUrls.EmptyStates.UserManager.SEARCH}\n totalUsers={userCount.data?.count}\n queryParams={props.queryParams}\n yearGroups={yearGroups.data}\n yearGroupRolloverStatus={yearGroupRolloverStatus.data}\n fetchUserIds={fetchUserIds}\n ssoHelpArticle={ArticleHelper.getLiteArticle(LiteSupportArticle.EditSsoAccounts)}\n onClickSendVerificationEmail={onClickResendVerificationEmail}\n onClickResendActivationEmail={onClickResendActivationEmail}\n hasSso={!!identityProviders.data?.length}\n userRequest={UserRequests.getUserIdByQuery}\n selectWithSpreadsheetTemplate={SelectWithSpreadsheetTemplates}\n hasRostering={hasRostering}\n products={products.data.map(p => p.id) ?? []}\n />\n {!!studentResponse.data?.pagination?.cursors && (\n <Pagination\n appLink={appLinks.search}\n cursors={studentResponse.data.pagination.cursors}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n />\n )}\n </main>) :\n <StudentManagerEmptyState />\n }\n </div>\n </UserManagerClientContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};"],"names":["namespace","userType","UserGroup","StudentManagerEmptyState","value","EmptyState","src","ImageUrls","size","Text","phrase","className","text","LanguageService","icon","appLink","application","action","params","getPhrase","StudentManagerView","props","useSetPageMetadata","title","appLinks","queryParams","dispatch","alerts","rostering","RosteringRequests","currentUser","UserRequests","config","ConfigRequests","yearGroups","data","UserManagerRequests","customerId","yearGroupRolloverStatus","JobRequests","identityProviders","products","ProductRequests","hasRostering","status","studentResponse","useFetchUsers","students","results","map","s","id","sort","userCount","useFetchUserCount","getUserCountRequest","showEmptyState","UserManagerHelper","UserManagerClientContext","UserManagerClient","UserManagerHeader","users","ManageUsers","searchEmptyState","totalUsers","count","fetchUserIds","success","ssoHelpArticle","ArticleHelper","onClickSendVerificationEmail","user","email","escapeText","error","onClickResendActivationEmail","hasSso","length","userRequest","selectWithSpreadsheetTemplate","SelectWithSpreadsheetTemplate","p","pagination","cursors","Pagination","search","buttonVariant","createJob","url","key","type","getJobs","bulkActionTypes","userTypes","cursor","order","bulkActionType","Array","isArray","dataType","join","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","sendJobReports","ids","jobIds","getJobSummary"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/5446-5a2f719a6f-lite.chunk.js","mappings":"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","sources":["file:///app/packages/projects/lite/src/apps/user-manager/views/student-manager/empty-state/LiteStudentManagerEmptyState.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/student-manager/LiteStudentManagerView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts"],"sourcesContent":["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 { UserGroup } from 'libs/shared/enums/UserGroup';\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\nconst namespace = 'userManager.studentManagerEmptyState';\nconst userType = UserGroup.Learner;\n\nexport function StudentManagerEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.UserManager.STUDENTS} size='small' />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n <div className='d-flex justify-content-center align-items-center'>\n <div className='px-1'>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addNew')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.CREATE_USER,\n params: { userType }\n }}\n />\n </div>\n\n <div className='px-1'>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'uploadAList')}\n icon={cvSvgLibrary.Upload}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.USER_UPLOAD_POPUP,\n params: { userType }\n }}\n />\n </div>\n </div>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { ManageUsers } from 'libs/shared/apps/user-manager/components/manage-users/ManageUsers';\nimport { UserManagerHeader } from 'libs/shared/apps/user-manager/components/user-manager-header/UserManagerHeader';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { useFetchUserCount } from 'libs/shared/apps/user-manager/hooks/useFetchUserCount';\nimport { GetIdentityProvidersResponse } from 'libs/shared/apps/user-manager/interfaces/GetIdentityProvidersResponse';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Product, RosteringResponse, User, YearGroup } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SelectWithSpreadsheetTemplates } from 'apps/user-manager/constants/SelectWithSpreadsheetTemplate';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\nimport { useFetchUsers } from 'apps/user-manager/hooks/useFetchUsers';\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nimport { StudentManagerEmptyState } from './empty-state/LiteStudentManagerEmptyState';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.studentManager');\n\nconst userType = UserGroup.Learner;\n\ninterface StudentManagerViewProps {\n queryParams: UserManagerQueryParams;\n}\n\nexport function StudentManagerView(props: StudentManagerViewProps): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n const appLinks = getUserManagerAppLinks(userType, props.queryParams);\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data && UserManagerRequests.yearGroups(currentUser.data.customerId)\n );\n const yearGroupRolloverStatus = Flight.useBasicFetch<YearGroupRolloverStatus>(!!currentUser.data &&\n JobRequests.getYearGroupRolloverStatus(currentUser.data.customerId));\n const identityProviders = Flight.useBasicFetch<GetIdentityProvidersResponse>(!!currentUser.data &&\n UserManagerRequests.getIdentityProviders(currentUser.data.customerId));\n const products = Flight.useBasicFetch<Product[]>(ProductRequests.userProducts());\n\n const hasRostering = rostering.data?.status && rostering.data.status !== 'None';\n\n const studentResponse = useFetchUsers(\n currentUser.data,\n props.queryParams,\n userType\n );\n\n const students = studentResponse.data ? (('results' in studentResponse.data) ? studentResponse.data.results : studentResponse.data.data) : null;\n\n Flight.useBasicFetch(UserManagerRequests.authenticationMethods(students?.map(s => s.id)?.sort() ?? []));\n\n const userCount = useFetchUserCount({\n userType,\n queryParams: props.queryParams,\n getUserCountRequest: UserManagerRequests.userCount\n });\n\n useHandleObjectError(studentResponse);\n\n function fetchUserIds(success: (userIds: string[]) => void): void {\n Flight.fetch(dispatch, UserManagerRequests.getSearchUserIds(\n currentUser.data.customerId,\n currentUser.data.id,\n userType,\n props.queryParams,\n success\n ));\n }\n\n function onClickResendActivationEmail(user: User): void {\n Flight.fetch(dispatch, UserManagerRequests.resendActivationEmail(user.id, () => {\n alerts.success(getPhrase('resendActivationEmailSuccess', { email: user.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('resendActivationEmailError', { email: user.email, escapeText: true }));\n }));\n }\n\n function onClickResendVerificationEmail(user: User): void {\n Flight.fetch(dispatch, UserManagerRequests.resendVerificationEmail(user.id, currentUser.data.customerId, () => {\n alerts.success(getPhrase('resendVerificationEmailSuccess', { email: user.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('resendVerificationEmailError', { email: user.email, escapeText: true }));\n }));\n }\n\n const showEmptyState = UserManagerHelper.showEmptyState(studentResponse, props.queryParams);\n \n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <div className='px-3'>\n <UserManagerHeader\n userType={userType}\n appLinks={appLinks}\n users={students}\n userCount={userCount.data}\n hasRostering={hasRostering}\n />\n\n {!showEmptyState ? (\n <main className='py-3 clearfix'>\n <ManageUsers\n users={students}\n userType={userType}\n config={config.data}\n currentUser={currentUser.data}\n appLinks={appLinks}\n searchEmptyState={ImageUrls.EmptyStates.UserManager.SEARCH}\n totalUsers={userCount.data?.count}\n queryParams={props.queryParams}\n yearGroups={yearGroups.data}\n yearGroupRolloverStatus={yearGroupRolloverStatus.data}\n fetchUserIds={fetchUserIds}\n ssoHelpArticle={ArticleHelper.getLiteArticle(LiteSupportArticle.EditSsoAccounts)}\n onClickSendVerificationEmail={onClickResendVerificationEmail}\n onClickResendActivationEmail={onClickResendActivationEmail}\n hasSso={!!identityProviders.data?.length}\n userRequest={UserRequests.getUserIdByQuery}\n selectWithSpreadsheetTemplate={SelectWithSpreadsheetTemplates}\n hasRostering={hasRostering}\n products={products.data.map(p => p.id) ?? []}\n />\n {!!studentResponse.data?.pagination?.cursors && (\n <Pagination\n appLink={appLinks.search}\n cursors={studentResponse.data.pagination.cursors}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n />\n )}\n </main>) :\n <StudentManagerEmptyState />\n }\n </div>\n </UserManagerClientContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};"],"names":["namespace","userType","UserGroup","StudentManagerEmptyState","value","EmptyState","src","ImageUrls","size","Text","phrase","className","text","LanguageService","icon","appLink","application","action","params","getPhrase","StudentManagerView","props","useSetPageMetadata","title","appLinks","queryParams","dispatch","alerts","rostering","RosteringRequests","currentUser","UserRequests","config","ConfigRequests","yearGroups","data","UserManagerRequests","customerId","yearGroupRolloverStatus","JobRequests","identityProviders","products","ProductRequests","hasRostering","status","studentResponse","useFetchUsers","students","results","map","s","id","sort","userCount","useFetchUserCount","getUserCountRequest","showEmptyState","UserManagerHelper","UserManagerClientContext","UserManagerClient","UserManagerHeader","users","ManageUsers","searchEmptyState","totalUsers","count","fetchUserIds","success","ssoHelpArticle","ArticleHelper","onClickSendVerificationEmail","user","email","escapeText","error","onClickResendActivationEmail","hasSso","length","userRequest","selectWithSpreadsheetTemplate","SelectWithSpreadsheetTemplate","p","pagination","cursors","Pagination","search","buttonVariant","createJob","url","key","type","getJobs","bulkActionTypes","userTypes","cursor","order","bulkActionType","Array","isArray","dataType","join","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","sendJobReports","ids","jobIds","getJobSummary"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5940],{91200:(e,t,n)=>{n.d(t,{Y:()=>s});var a=n(32735),r=n(68050),i=n(69111),o=n(84231);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function s(e){var t,n=function(e){if(Array.isArray(e))return l(e)}(t=Array(e.numItems))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(t)||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.")}(),s=e.itemClassName||"";return a.createElement(a.Fragment,null,e.showHeading&&a.createElement("div",{className:"".concat(o.Z.partialHeading," mb-1 partial-loading-background")}),a.createElement(r.Z,{className:"mx-n1 mb-n2"},n.map((function(e,t){return a.createElement(i.Z,{key:t,xs:6,sm:4,lg:3,className:"".concat(s," px-1 pb-2")},a.createElement("div",{className:"".concat(o.Z.playlistItem," partial-loading-background rounded-3")}))}))))}s.defaultProps={numItems:8}},48745:(e,t,n)=>{n.d(t,{t:()=>A});var a=n(32735),r=n(82602),i=n(23481),o=n(110),l=n(65858),s=n(83345);const c={fontSmall:"OYBRp"};var u="playlists.playlistCount";function d(e){var t=function(e){var t,n,a,r,i,o;return!!e&&(null!==(n=null===(t=e.videos)||void 0===t?void 0:t.count)&&void 0!==n?n:0)+(null!==(r=null===(a=e.interactives)||void 0===a?void 0:a.count)&&void 0!==r?r:0)+(null!==(o=null===(i=e.clips)||void 0===i?void 0:i.count)&&void 0!==o?o:0)}(e.playlist);return!1===t||Number.isNaN(t)?a.createElement(a.Fragment,null):a.createElement("span",{className:c.fontSmall},a.createElement(s.x,{namespace:u,phrase:"count",options:{smartCount:t}}))}var m=n(20789),p=n(89725),f=n(64818);function v(e){var t,n,r,i=e.playlist._liteOwner;if(null===(t=e.playlist._isClickViewCurated)||void 0===t?void 0:t.value)return a.createElement(p.F,null);if(!(null==i?void 0:i.id)||!(null===(n=e.currentUser)||void 0===n?void 0:n.id))return a.createElement(a.Fragment,null);if(i.id.toString()===e.currentUser.id.toString())return a.createElement(a.Fragment,null);var o="string"==typeof i.avatar?i.avatar:null===(r=i.avatar)||void 0===r?void 0:r.url;return a.createElement(m.q,{imageUrl:o,imageCdnUrl:e.imageCdnUrl,initials:f.l.getInitials(i.name,i.surname)})}var g=n(36848),y=n(40955),h=n(75163),b=n(5465),E=n(54610),N=n(80143),w=n(9085),C=n(67453),S=n(84231),P="playlists.playlistList";function A(e){var t,n,s=C.j.createUrl(e.data.cover&&e.data.cover.url,{size:E.h2.Medium,resizeType:E.Nq.Cover}),c=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,u=(0,N.n)(c,e.presentationAudiences),m=S.Z.playlistItem,p=!!s||!!e.showFallbackImage;p&&(m+=" ".concat(S.Z.playlistItemGradient)),!p&&e.bgColourClassNames&&(m+=" ".concat(S.Z.playlistItem," ").concat((0,w.x)(e.data.name,e.bgColourClassNames))),"round"===e.itemStyle&&(m+=" rounded-3 overflow-hidden"),"round-left"===e.itemStyle&&(m+=" rounded-start-lg overflow-hidden");var f=Object.assign(Object.assign({},e.analyticsData),{id:null===(t=e.data)||void 0===t?void 0:t.id,name:null===(n=e.data)||void 0===n?void 0:n.name}),A=Object.assign(Object.assign({},e.analyticsOptions),{entity:l.py.Playlist});return a.createElement(g.F,{appLink:e.appLink,analyticsData:f,analyticsOptions:A,title:function(){var t;return!e.data.contentModifiedDate||(null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value)?"":i.T.getPhrase(P,"lastUpdated",{timeago:(0,r.WU)(o.O.convertUTCToLocal(e.data.contentModifiedDate))})}()},a.createElement(h.Z,{data:s,alt:e.data.name,className:m},!!e.showFallbackImage&&a.createElement(b.oy,{type:b.mS.Playlist}),a.createElement("div",{className:"text-white ".concat(S.Z.playlistMetadata)},!!e.showCount&&a.createElement(d,{playlist:e.data}),a.createElement("h5",{className:"mb-0 ".concat(e.titleClassName||"")},a.createElement("span",{className:"clamp-2"},e.data.name)),!!c&&!!c.length&&!!u&&a.createElement(y.P,{className:"".concat(e.audienceLabelClass?e.audienceLabelClass:""," mt-1"),audience:u,border:"white"})),!!e.showOwner&&!!e.imageCdnUrl&&a.createElement("div",{className:S.Z.ownerAvatarContainer},a.createElement(v,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl}))))}A.defaultProps={itemStyle:"square"}},31273:(e,t,n)=>{n.d(t,{P:()=>c});var a=n(32735),r=n(68050),i=n(69111),o=n(65858),l=n(48745),s={actionType:o.Vw.Click,entity:o.py.Playlist,location:o.LZ.PlaylistListItem,descriptor:o._S.Cover};function c(e){return a.createElement(r.Z,{className:"mx-n1"},e.extraPlaylistItem&&a.createElement(i.Z,{key:"extra-playlist-item",xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},e.extraPlaylistItem),e.playlists.map((function(t){return a.createElement(i.Z,{key:t.id,xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},a.createElement(l.t,{data:t,appLink:e.getPlaylistAppLink(t),imageCdnUrl:e.imageCdnUrl,currentUser:e.currentUser,presentationAudiences:e.presentationAudiences,bgColourClassNames:e.bgColourClassNames,showCount:e.showCount,showOwner:e.showOwner,showFallbackImage:e.showFallbackImage,titleClassName:e.itemTitleClassName,itemStyle:e.itemStyle,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({},e.analyticsOptions),s)}))})))}},83657:(e,t,n)=>{n.d(t,{e:()=>c});var a=n(32735),r=n(91967),i=n(10874),o=n(76177),l=n(42735),s=n(86509);function c(e){var t=a.useMemo((function(){return e.actions.sort((function(e,t){return e.order-t.order}))}),[e.actions]),n=[],c=[];t.forEach((function(e){e.button?n.push(e):c.push(e)}));var u="d-flex";return e.className&&(u+=" ".concat(e.className)),n.length||c.length?a.createElement("div",{className:u},a.createElement(a.Fragment,null,a.createElement("span",{className:"d-flex align-items-center"},n.length?n.map((function(e,t){return a.createElement(a.Fragment,{key:t},function(){if(e.label){var t=r.q.isFunction(e.label)?e.label:function(){return a.createElement(a.Fragment,null,e.label)};return a.createElement(l.K,{appLink:e.appLink,href:e.href,onClick:e.onClick,svgName:e.svgName,className:e.className,tooltip:e.tooltip,showSpinner:e.showSpinner,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,openInNewTab:e.openInNewTab,disabled:e.disabled},t())}var n=a.createElement(i.h,{appLink:e.appLink,href:e.href,onClick:e.onClick,svgName:e.svgName,className:e.className,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,openInNewTab:e.openInNewTab,disabled:e.disabled,showBorder:e.showBorder});return e.tooltip?a.createElement(o.u,{title:e.tooltip,spanHack:!0},n):n}())})):a.createElement(a.Fragment,null),e.sortComponent&&e.sortComponent,c.length?a.createElement(s.m,{actions:c,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):a.createElement(a.Fragment,null)))):a.createElement(a.Fragment,null)}},86509:(e,t,n)=>{n.d(t,{m:()=>g});var a=n(32735),r=n(91967),i=n(81886),o=n(45157),l=n(49985),s=n(36848),c=n(83914),u=n(76177),d=n(35223);const m={dropdownToggle:"UCAnJ"};function p(){return a.createElement(a.Fragment,null,a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"8rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"12rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"11rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"9rem"}})))}function f(e){var t="dropdown-item";return e&&(t+=" ".concat(e)),t}function v(e){var t=r.q.isFunction(e.action.label)?e.action.label:function(){return a.createElement(a.Fragment,null,e.action.label)};if(e.action.appLink)return a.createElement(s.F,{appLink:e.action.appLink,onClick:e.action.onClick,className:f(e.action.className),analyticsData:e.action.analyticsData,analyticsOptions:e.action.analyticsOptions,openInNewTab:e.action.openInNewTab,disabled:e.action.disabled},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t()));function n(t){t.preventDefault(),e.action.analyticsData&&e.action.analyticsOptions&&l.k.logUserAction(e.action.analyticsData,e.action.analyticsOptions),r.q.isFunction(e.action.onClick)&&e.action.onClick(),e.action.href&&i.Q.Ab.PageLoad(e.action.href,e.action.openInNewTab)}return e.action.href?a.createElement("a",{className:f(e.action.className),onClick:n,href:e.action.href},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t())):a.createElement("span",{className:"cursor-pointer ".concat(f(e.action.className)),onClick:n,role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&n(e)}},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2"}),t())}function g(e){if(!e.actions||!e.actions.length)return a.createElement(a.Fragment,null);var t=e.actions.some((function(e){return e.lazyPlaceholder})),n="dropdown";e.className&&(n+=" ".concat(e.className));var r,i="actions-dropdown-".concat(o.Y.getRandomInt()),l="dropdown-toggle px-0 ".concat(m.dropdownToggle);return e.dropdownToggleClassName&&(l+=" ".concat(e.dropdownToggleClassName)),a.createElement("div",{className:n},a.createElement("button",{className:l,type:"button",id:i,"data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",onClick:t?e.fetchMore:null},a.createElement(c.x,{svgName:d.vn.More,size:e.dropdownToggleSvgSize})),a.createElement("div",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":i},t?a.createElement(p,null):e.actions.map((function(e,t){var n=void 0!==r&&r!==e.group;return r=e.group,e.tooltip?a.createElement(a.Fragment,{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(u.u,{title:e.tooltip,spanHack:!0},a.createElement(v,{action:e}))):a.createElement(a.Fragment,{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(v,{action:e}))}))))}g.defaultProps={dropdownToggleClassName:"btn btn-light",dropdownToggleSvgSize:c.S.Small}},40955:(e,t,n)=>{n.d(t,{P:()=>r});var a=n(32735);function r(e){return e.audience?a.createElement("div",{className:"audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ".concat("border-"+e.border," ").concat(e.className?e.className:"")},e.audience.name):a.createElement(a.Fragment,null)}},71020:(e,t,n)=>{n.d(t,{_:()=>u});var a=n(32735),r=n(80247),i=n(34152),o=n(83914),l=n(35223);const s={container:"VwD1b",spinner:"eJ85e"};function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function u(e){var t,n,u=(t=(0,i.YD)(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return c(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)?c(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=u[0],m=u[1];return a.useEffect((function(){var t;e.fetchOnScroll&&m&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[m,e.isFetching]),a.createElement("div",{className:"p-3 text-center ".concat(s.container),ref:d},e.isFetching?a.createElement(r.Z,{as:"span",animation:"border",role:"status",className:s.spinner}):a.createElement(o.x,{svgName:l.vn.ChevronDown,className:"svg-container cursor-pointer",size:o.S.Large,onClick:function(){var t;return null===(t=e.fetchNext)||void 0===t?void 0:t.call(e,e.nextCursor)}}))}u.defaultProps={fetchOnScroll:!1}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var a=n(50242),r=n(81886),i=n(67058),o=n(14553),l=n(49267),s=n(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:l.a,privacy:o.q},badRequest:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==a.o.NotFound?i!==a.o.Forbidden?n.badRequest||r.Q.Ry.throw(new o.badRequest):n.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):n.notFound||r.Q.Ry.throw(new o.notFound))}}},60115:(e,t,n)=>{n.d(t,{K:()=>c});var a=n(32735),r=n(50242),i=n(91967),o=400,l=n(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(e,t,n,c,u,d){var m,p,f,v,g=(m=(0,a.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(m,p)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(m,p)||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.")}()),y=g[0],h=g[1],b=t,E=(0,l.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),c,u);return f={fetchNextPage:function(){if(t&&e&&E)return h((function(e){return e+1})),b(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},v=function(){if(!f.isFetching){if(f.scrollContainer){var e=f.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;f.fetchNextPage()}},(0,a.useEffect)((function(){var e=i.q.throttle(v,200),t=f.scrollContainer||window;return f.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[f.hasMore,f.fetchNextPage,f.scrollContainer]),(0,a.useEffect)((function(){E&&E.shouldInitialFetch&&t&&(b(),h((function(e){return e+1})))}),[null==E?void 0:E.shouldInitialFetch,t]),(0,a.useEffect)((function(){var e,t;if((null==E?void 0:E.statusCode)&&i.q.isFunction(n)){var a=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));a!==r.k.ClientError&&a!==r.k.ServerError||n(y,E.statusCode)}}),[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},80143:(e,t,n)=>{n.d(t,{n:()=>i});var a=n(32735),r=n(69454);function i(e,t){var n=a.useMemo((function(){return(null==e?void 0:e.length)&&t&&r.T.shouldShowAudiences(t)?r.T.getSortedPresentationAudiences(e,t):null}),[e]);return a.useMemo((function(){return(null==n?void 0:n.length)?r.T.getMergedPresentationAudienceString(n):null}),[n])}},69454:(e,t,n)=>{n.d(t,{T:()=>d});var a=n(75896),r=n(1048),i=n(55171);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var l=/\d/,s=function(e){var t,n,r=a.m.first(e),i=a.m.last(e);return r.name===i.name?r.name:"Advanced"===i.name?"lower"===(t=r.name.split(" "),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},c=/([0-9]+)/gi,u=/\s|\+/gi,d={getSortedPresentationAudiences:function(e,t){var n=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return t.filter((function(e){return n.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var t,n,r,o="";switch(+a.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];o=function(e){var t=e.map((function(e){return e.name})).join(" "),n=t.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],a=t.split(" ").filter((function(e){return isNaN(+e)}))||[],r=e.find((function(e){return!l.test(e.name)})),i=a.find((function(e){return e!==(null==r?void 0:r.name)}));if(e.length>1&&(i+="s"),r&&n.length)return"".concat(i," ").concat(r.name.charAt(0)," - ").concat(n.pop());var o=function(e){var t,n,a,r,i=!1,o=[];for(e=e.sort((function(e,t){return e-t})),a=0;a<e.length;a++)r=a+1,i||(t=e[a]),n=e[r],e[a]+1===n?i=!0:i?(o.push("".concat(t," - ").concat(e[a])),i=!1):(o.push("".concat(e[a])),i=!1);return o}(n);return"".concat(i," ").concat(o.join(", "))}(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_PRIMARY:case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];o=function(e){var t=e.map((function(e){return e.name})),n={};t.forEach((function(e,t){if(0!==t){var a=e.split(" ");Object.keys(n).forEach((function(e){a.includes(e)||delete n[e]}))}else e.split(" ").forEach((function(e,t){n[e]=0===t?"start":"end"}))}));var a=Object.keys(n)[0],r=n[a];if(!a)return e[0].name;var i=e[0].name,o=e[e.length-1].name,l=function(e){return e.split(a)[0]},s="".concat(l(i)," - ").concat(l(o));return"start"===r?"".concat(a," ").concat(s):"".concat(s," ").concat(a)}(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:o=s(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:t=e,n=a.m.first(t),r=a.m.last(t),o=n.name===r.name?n.name:"Senior Phase"===r.name?"".concat(n.name," - Senior"):"Third - Fourth Level";break;case i.e.PresentationIds.ENGLAND_PRIMARY:o=function(e){var t=a.m.first(e),n=a.m.last(e),r=a.m.first(t.name.split(" ")),i=a.m.first(n.name.split(" ")),o=t.name.split(" ").find((function(e){return!isNaN(+e)})),l=n.name.split(" ").find((function(e){return!isNaN(+e)}));if(t===n)return"Key"===r||"Reception"===r?t.name:"".concat(r," KS").concat(o);var s="",c="";return s="Reception"===r?"R":"KS".concat(o),c="KS".concat(l),"Lower"===r&&"Upper"===i?"L ".concat(s," - U ").concat(c):("Lower"===r&&(s="Lower ".concat(s)),"Upper"===i&&(c="Upper ".concat(c)),"Key"===i&&(c=n.name),"".concat(s," - ").concat(c))}(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:}return o?{name:o}:null},sortMembersWithDuplicateNamesByAudience:function(e){var t=function(e){return e.length?(e.forEach((function(e){var r=+a.m.first(e.name.match(c));if(!t)return t=e,void(n=r);r<n&&(t=e)})),t):null;var t,n},n={},r=[];return e.forEach((function(e){if(!n[e.name])return n[e.name]=1,void r.push(e);r.push(e),n[e.name]++;var a=r.splice(r.length-n[e.name]).sort((function(e,n){var a=t(e.subjectPresentationAudiences.data),r=t(n.subjectPresentationAudiences.data);if(!a&&r)return 1;if(!r)return-1;var i=a.name.localeCompare(r.name);return 0===i?i:i>0?-1:1}));r=r.concat(a)})),r},getActiveAudiencesFromParams:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r.t.isObject(t)&&!r.t.isEmpty(t)&&e&&e.length&&d.shouldShowAudiences(e)){var n=t.a;if(n){"string"==typeof n&&(n=[n]);var a=function(e){return e.replace(u,"").toLowerCase()},i=n.reduce((function(e,t){return e[a(t)]=t,e}),{});return e.filter((function(e){return i[a(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}},5940:(e,t,n)=>{n.r(t),n.d(t,{PlaylistsView:()=>J});var a=n(32735),r=n(70680),i=n(23481),o=n(20354),l=n(65858),s=n(91200),c=n(31273),u=n(91967),d=n(76611),m=n(36848);function p(e){return p="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},p(e)}function f(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=p(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==p(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v="playlists.playlistSortSelect",g=u.q.memoize((function(){return f(f(f(f(f({},d.o.RecentlyUpdated,{name:i.T.getPhrase(v,"recentlyUpdated")}),d.o.AtoZ,{name:i.T.getPhrase(v,"atoz")}),d.o.ZtoA,{name:i.T.getPhrase(v,"ztoa")}),d.o.Newest,{name:i.T.getPhrase(v,"newest")}),d.o.Oldest,{name:i.T.getPhrase(v,"oldest")})}));function y(e){var t=e.type,n=e.getSortAppLink,r=e.variant,i=g();return a.createElement("div",{className:"dropdown"},a.createElement("a",{className:"btn btn-".concat(r," ms-2 dropdown-toggle"),type:"button",id:"sort-select","data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},i[t].name),a.createElement("div",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":"sort-select"},Object.values(d.o).map((function(e){var r="dropdown-item";return e===t&&(r+=" active"),a.createElement(m.F,{key:e,className:r,appLink:n(e),analyticsData:{sort:i[e].name},analyticsOptions:{location:l.LZ.PlaylistListHeader,entity:l.py.Playlists,actionType:l.Vw.Sort,workflowPhase:l.eu.Complete}},i[e].name)}))))}y.defaultProps={variant:"light"};var h=n(23257),b=n(70006),E=n(71521),N=n(83657),w=n(71020),C=n(83345),S=n(7733),P=n(16714),A=n(94644),I=n(39151),L=n(5112),k=n(31949),T=n(69883),O=n(60115),F=n(22902),x=n(79612),U=n(35223),D=n(14070),j=n(97291),M=n(44110),R=n(26323),_=n(99742);const Y={playlistMetadata:"vv8fW"};var Z="playlists.favouritesPlaylistItem",B=i.T.encloseNamespace(Z);function V(e){var t={entity:l.py.Playlist,actionType:l.Vw.Click,location:l.LZ.PlaylistListItem},n=_.W.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER,r={application:j.O.MY_FAVOURITES,action:D.e.MyFavourites.MY_FAVOURITES};return a.createElement(m.F,{appLink:r,analyticsData:{name:"Favourites",extraItem:"user-favourites"},analyticsOptions:t,title:B("favouritesTitle")},a.createElement("div",{className:"position-relative"},a.createElement("div",{className:"text-white ".concat(Y.playlistMetadata)},!e.isLoadingCount&&a.createElement("span",null,a.createElement(C.x,{namespace:Z,phrase:"count",options:{smartCount:e.count}})),a.createElement("h5",{className:"mb-0"},a.createElement("span",{className:"clamp-2"},B("favouritesTitle")))),a.createElement("img",{src:n,className:"w-100 h-100 rounded-3"})))}var q=n(23232),H="playlists.playlistsEmptyState",$=i.T.encloseNamespace(H);function z(e){return a.createElement(C.D.Provider,{value:H},a.createElement(q.u,null,a.createElement(q.u.Image,{src:_.W.EmptyStates.Playlists.PLAYLISTS,altText:$("info")}),a.createElement(q.u.Heading,null,a.createElement(C.x,{phrase:"heading"})),a.createElement(q.u.Info,null,a.createElement(C.x,{phrase:e.isStudent?"studentInfo":"info"})),a.createElement(q.u.Cta,{text:i.T.getPhrase(H,"cta"),icon:U.vn.Plus,appLink:{application:j.O.PLAYLISTS,action:D.e.Playlists.NEW_PLAYLIST}})))}function W(){return a.createElement(C.D.Provider,{value:H},a.createElement(q.u,null,a.createElement(q.u.Image,{src:_.W.EmptyStates.Playlists.PLAYLISTS_PUBLIC,altText:$("info")}),a.createElement(q.u.Heading,null,a.createElement(C.x,{phrase:"heading"})),a.createElement(q.u.Info,null,a.createElement(C.x,{phrase:"info"})),a.createElement(q.u.Cta,{text:i.T.getPhrase(H,"publicCta"),appLink:{application:j.O.SIGN_UP,action:D.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.PlaylistsLanding,entity:l.py.AppLink,workflowPhase:l.eu.Start,descriptor:l.Yu.SignUp}})))}var G="playlists.playlists",K=i.T.encloseNamespace(G);function Q(e){return{application:j.O.PLAYLISTS,action:D.e.Playlists.HOME,params:{sort:e}}}function J(e){var t,n=(0,r.I0)(),i=(0,T.Z)(),u=(0,F.T)(),d=u.hasLocalPermissions,m=u.hasPermissions,p=u.isLoaded,f=m(P.C.StudentExperience),v=o.a.useBasicFetch(I.L.config()),g=o.a.useBasicFetch(k.N.currentUser()),_=(0,M.i)(),Y=!!g.data&&E.A.getOrSetSortType(g.data.id,e.sort),Z=(0,R.B)(null===(t=g.data)||void 0===t?void 0:t.id),B=Z.count,q=Z.favourites,H={count:B,isLoadingCount:Z.isLoading,data:q},$=!!Y&&function(e){return L.C.getUserPlaylists(new b.l(Y,e,h.e.All))},J=!!$&&function(e){o.a.getFetch(n)($(e))};(0,x.M)({title:K("pageTitle"),description:K("pageDescription")});var X=!d(P.E.ViewPlaylistsLanding)&&Y,ee=(0,O.K)(!!X&&$,J,(function(e,t){if(1===e)return(0,A.r)(t);i.error(K("error"))})),te=ee.items,ne=ee.hasMore,ae=ee.isFetching,re=[{label:K("createPlaylist"),appLink:{application:j.O.PLAYLISTS,action:D.e.Playlists.NEW_PLAYLIST},svgName:U.vn.Plus,className:"btn btn-outline-dark",button:!0,analyticsData:{},analyticsOptions:{location:l.LZ.Banner,entity:l.py.Playlist,workflowPhase:l.eu.Start,actionType:l.Vw.Create}}],ie=!!te&&!!g.data&&!!v.data&&(!!_.data||_.hasError)&&!!p;return d(P.E.ViewPlaylistsLanding)?a.createElement(W,null):!ie||H.count||(null==te?void 0:te.length)?a.createElement("div",{className:"bg-white px-3"},a.createElement("div",{className:"d-flex justify-content-between align-items-end pb-3"},a.createElement("h1",{className:"h2 mb-0"},a.createElement(C.x,{namespace:G,phrase:"headerTitle"})),!!Y&&a.createElement(N.e,{actions:re,sortComponent:a.createElement(y,{variant:"outline-dark",type:Y,getSortAppLink:Q})})),ie?a.createElement(c.P,{playlists:te,getPlaylistAppLink:e.getPlaylistAppLink,imageCdnUrl:v.data.imageCdnUrl,currentUser:g.data,presentationAudiences:_.data||[],bgColourClassNames:S.o,itemContainerClassName:"columns-of-five",itemStyle:"round",showCount:!0,showOwner:!0,extraPlaylistItem:H.count?a.createElement(V,Object.assign({},H)):null}):a.createElement(s.Y,{itemClassName:"columns-of-five"}),ie&&(ne||ae)&&a.createElement(w._,{isFetching:ae,fetchNext:J})):a.createElement(z,{isStudent:f})}},44110:(e,t,n)=>{n.d(t,{i:()=>o});var a=n(20354),r=n(89454),i=n(86698),o=function(){var e=(0,i.y)({redirectOnError:!0}),t=e.activePresentation,n=e.getFallbackPresentation,o=t||n();return a.a.useBasicFetch(!!o&&r.O.presentationAudiences(o.id))}},26323:(e,t,n)=>{n.d(t,{B:()=>l});var a=n(20354),r=n(63419);function i(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e)||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 o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function l(e){var t,n,o,l,s,c,u,d,m,p=a.a.useBasicFetch(e&&r.P.getFavouritesVideosCount(e)),f=a.a.useBasicFetch(e&&r.P.getFavouritesClipsCount(e)),v=a.a.useBasicFetch(e&&r.P.getFavouritesInteractivesCount(e));return{count:(null===(t=p.data)||void 0===t?void 0:t.count)+(null===(n=v.data)||void 0===n?void 0:n.count)+(null===(o=f.data)||void 0===o?void 0:o.count),favourites:[].concat(i((null===(l=p.data)||void 0===l?void 0:l.data)||[]),i((null===(s=f.data)||void 0===s?void 0:s.data)||[]),i((null===(c=v.data)||void 0===c?void 0:c.data)||[])),isLoading:!(null===(u=p.data)||void 0===u?void 0:u.data)||!(null===(d=f.data)||void 0===d?void 0:d.data)||!(null===(m=v.data)||void 0===m?void 0:m.data)}}},84231:(e,t,n)=>{n.d(t,{Z:()=>a});const a={playlistItem:"CaRJx",playlistItemGradient:"BI7p2",playlistMetadata:"eDk1l",partialHeading:"w4lWh",ownerAvatarContainer:"JImqE"}},68050:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(95685),r=n.n(a),i=n(32735),o=n(46304),l=n(74512);const s=i.forwardRef((({bsPrefix:e,className:t,as:n="div",...a},i)=>{const s=(0,o.vE)(e,"row"),c=(0,o.pi)(),u=(0,o.zG)(),d=`${s}-cols`,m=[];return c.forEach((e=>{const t=a[e];let n;delete a[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const r=e!==u?`-${e}`:"";null!=n&&m.push(`${d}${r}-${n}`)})),(0,l.jsx)(n,{ref:i,...a,className:r()(t,s,...m)})}));s.displayName="Row";const c=s},82602:(e,t,n)=>{n.d(t,{WU:()=>c});var a=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],i={},o=function(e,t){i[e]=t},l=[60,60,24,7,365/7/12,12];function s(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var c=function(e,t,n){var a=function(e,t){return(+(t?s(t):new Date)-+s(e))/1e3}(e,n&&n.relativeDate);return function(e,t){for(var n=e<0?1:0,a=e=Math.abs(e),r=0;e>=l[r]&&r<l.length;r++)e/=l[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,a)[n].replace("%s",e.toString())}(a,function(e){return i[e]||i.en_US}(t))};o("en_US",(function(e,t){if(0===t)return["just now","right now"];var n=a[Math.floor(t/2)];return e>1&&(n+="s"),[e+" "+n+" ago","in "+e+" "+n]})),o("zh_CN",(function(e,t){if(0===t)return["刚刚","片刻后"];var n=r[~~(t/2)];return[e+" "+n+"前",e+" "+n+"后"]}))}}]);
2
- //# sourceMappingURL=5940-511beff2ee-lite.chunk.js.map
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[5940],{91200:(e,t,n)=>{n.d(t,{Y:()=>s});var a=n(32735),r=n(68050),i=n(69111),o=n(84231);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function s(e){var t,n=function(e){if(Array.isArray(e))return l(e)}(t=Array(e.numItems))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(t)||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.")}(),s=e.itemClassName||"";return a.createElement(a.Fragment,null,e.showHeading&&a.createElement("div",{className:"".concat(o.Z.partialHeading," mb-1 partial-loading-background")}),a.createElement(r.Z,{className:"mx-n1 mb-n2"},n.map((function(e,t){return a.createElement(i.Z,{key:t,xs:6,sm:4,lg:3,className:"".concat(s," px-1 pb-2")},a.createElement("div",{className:"".concat(o.Z.playlistItem," partial-loading-background rounded-3")}))}))))}s.defaultProps={numItems:8}},48745:(e,t,n)=>{n.d(t,{t:()=>A});var a=n(32735),r=n(82602),i=n(23481),o=n(110),l=n(65858),s=n(83345);const c={fontSmall:"OYBRp"};var u="playlists.playlistCount";function d(e){var t=function(e){var t,n,a,r,i,o;return!!e&&(null!==(n=null===(t=e.videos)||void 0===t?void 0:t.count)&&void 0!==n?n:0)+(null!==(r=null===(a=e.interactives)||void 0===a?void 0:a.count)&&void 0!==r?r:0)+(null!==(o=null===(i=e.clips)||void 0===i?void 0:i.count)&&void 0!==o?o:0)}(e.playlist);return!1===t||Number.isNaN(t)?a.createElement(a.Fragment,null):a.createElement("span",{className:c.fontSmall},a.createElement(s.x,{namespace:u,phrase:"count",options:{smartCount:t}}))}var m=n(20789),p=n(89725),f=n(64818);function v(e){var t,n,r,i=e.playlist._liteOwner;if(null===(t=e.playlist._isClickViewCurated)||void 0===t?void 0:t.value)return a.createElement(p.F,null);if(!(null==i?void 0:i.id)||!(null===(n=e.currentUser)||void 0===n?void 0:n.id))return a.createElement(a.Fragment,null);if(i.id.toString()===e.currentUser.id.toString())return a.createElement(a.Fragment,null);var o="string"==typeof i.avatar?i.avatar:null===(r=i.avatar)||void 0===r?void 0:r.url;return a.createElement(m.q,{imageUrl:o,imageCdnUrl:e.imageCdnUrl,initials:f.l.getInitials(i.name,i.surname)})}var g=n(36848),y=n(40955),h=n(75163),b=n(5465),E=n(54610),N=n(80143),w=n(9085),S=n(67453),C=n(84231),P="playlists.playlistList";function A(e){var t,n,s=S.j.createUrl(e.data.cover&&e.data.cover.url,{size:E.h2.Medium,resizeType:E.Nq.Cover}),c=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,u=(0,N.n)(c,e.presentationAudiences),m=C.Z.playlistItem,p=!!s||!!e.showFallbackImage;p&&(m+=" ".concat(C.Z.playlistItemGradient)),!p&&e.bgColourClassNames&&(m+=" ".concat(C.Z.playlistItem," ").concat((0,w.x)(e.data.name,e.bgColourClassNames))),"round"===e.itemStyle&&(m+=" rounded-3 overflow-hidden"),"round-left"===e.itemStyle&&(m+=" rounded-start-lg overflow-hidden");var f=Object.assign(Object.assign({},e.analyticsData),{id:null===(t=e.data)||void 0===t?void 0:t.id,name:null===(n=e.data)||void 0===n?void 0:n.name}),A=Object.assign(Object.assign({},e.analyticsOptions),{entity:l.py.Playlist});return a.createElement(g.F,{appLink:e.appLink,analyticsData:f,analyticsOptions:A,title:function(){var t;return!e.data.contentModifiedDate||(null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value)?"":i.T.getPhrase(P,"lastUpdated",{timeago:(0,r.WU)(o.O.convertUTCToLocal(e.data.contentModifiedDate))})}()},a.createElement(h.Z,{data:s,alt:e.data.name,className:m},!!e.showFallbackImage&&a.createElement(b.oy,{type:b.mS.Playlist}),a.createElement("div",{className:"text-white ".concat(C.Z.playlistMetadata)},!!e.showCount&&a.createElement(d,{playlist:e.data}),a.createElement("h5",{className:"mb-0 ".concat(e.titleClassName||"")},a.createElement("span",{className:"clamp-2"},e.data.name)),!!c&&!!c.length&&!!u&&a.createElement(y.P,{className:"".concat(e.audienceLabelClass?e.audienceLabelClass:""," mt-1"),audience:u,border:"white"})),!!e.showOwner&&!!e.imageCdnUrl&&a.createElement("div",{className:C.Z.ownerAvatarContainer},a.createElement(v,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl}))))}A.defaultProps={itemStyle:"square"}},31273:(e,t,n)=>{n.d(t,{P:()=>c});var a=n(32735),r=n(68050),i=n(69111),o=n(65858),l=n(48745),s={actionType:o.Vw.Click,entity:o.py.Playlist,location:o.LZ.PlaylistListItem,descriptor:o._S.Cover};function c(e){return a.createElement(r.Z,{className:"mx-n1"},e.extraPlaylistItem&&a.createElement(i.Z,{key:"extra-playlist-item",xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},e.extraPlaylistItem),e.playlists.map((function(t){return a.createElement(i.Z,{key:t.id,xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},a.createElement(l.t,{data:t,appLink:e.getPlaylistAppLink(t),imageCdnUrl:e.imageCdnUrl,currentUser:e.currentUser,presentationAudiences:e.presentationAudiences,bgColourClassNames:e.bgColourClassNames,showCount:e.showCount,showOwner:e.showOwner,showFallbackImage:e.showFallbackImage,titleClassName:e.itemTitleClassName,itemStyle:e.itemStyle,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({},e.analyticsOptions),s)}))})))}},83657:(e,t,n)=>{n.d(t,{e:()=>c});var a=n(32735),r=n(91967),i=n(10874),o=n(76177),l=n(42735),s=n(86509);function c(e){var t=a.useMemo((function(){return e.actions.sort((function(e,t){return e.order-t.order}))}),[e.actions]),n=[],c=[];t.forEach((function(e){e.button?n.push(e):c.push(e)}));var u="d-flex";return e.className&&(u+=" ".concat(e.className)),n.length||c.length?a.createElement("div",{className:u},a.createElement(a.Fragment,null,a.createElement("span",{className:"d-flex align-items-center"},n.length?n.map((function(e,t){return a.createElement(a.Fragment,{key:t},function(){if(e.label){var t=r.q.isFunction(e.label)?e.label:function(){return a.createElement(a.Fragment,null,e.label)};return a.createElement(l.K,{appLink:e.appLink,href:e.href,onClick:e.onClick,svgName:e.svgName,className:e.className,tooltip:e.tooltip,showSpinner:e.showSpinner,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,openInNewTab:e.openInNewTab,disabled:e.disabled},t())}var n=a.createElement(i.h,{appLink:e.appLink,href:e.href,onClick:e.onClick,svgName:e.svgName,className:e.className,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,openInNewTab:e.openInNewTab,disabled:e.disabled,showBorder:e.showBorder});return e.tooltip?a.createElement(o.u,{title:e.tooltip,spanHack:!0},n):n}())})):a.createElement(a.Fragment,null),e.sortComponent&&e.sortComponent,c.length?a.createElement(s.m,{actions:c,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):a.createElement(a.Fragment,null)))):a.createElement(a.Fragment,null)}},86509:(e,t,n)=>{n.d(t,{m:()=>g});var a=n(32735),r=n(91967),i=n(81886),o=n(45157),l=n(49985),s=n(36848),c=n(83914),u=n(76177),d=n(35223);const m={dropdownToggle:"UCAnJ"};function p(){return a.createElement(a.Fragment,null,a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"8rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"12rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"11rem"}})),a.createElement("div",{style:{padding:"0.53125rem 1rem"}},a.createElement("div",{className:"partial-loading-background",style:{height:"1.0625rem",width:"9rem"}})))}function f(e){var t="dropdown-item";return e&&(t+=" ".concat(e)),t}function v(e){var t=r.q.isFunction(e.action.label)?e.action.label:function(){return a.createElement(a.Fragment,null,e.action.label)};if(e.action.appLink)return a.createElement(s.F,{appLink:e.action.appLink,onClick:e.action.onClick,className:f(e.action.className),analyticsData:e.action.analyticsData,analyticsOptions:e.action.analyticsOptions,openInNewTab:e.action.openInNewTab,disabled:e.action.disabled},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t()));function n(t){t.preventDefault(),e.action.analyticsData&&e.action.analyticsOptions&&l.k.logUserAction(e.action.analyticsData,e.action.analyticsOptions),r.q.isFunction(e.action.onClick)&&e.action.onClick(),e.action.href&&i.Q.Ab.PageLoad(e.action.href,e.action.openInNewTab)}return e.action.href?a.createElement("a",{className:f(e.action.className),onClick:n,href:e.action.href},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2 align-middle"}),a.createElement("span",{className:"align-middle"},t())):a.createElement("span",{className:"cursor-pointer ".concat(f(e.action.className)),onClick:n,role:"button",tabIndex:0,onKeyDown:function(e){return"Enter"===e.key&&n(e)}},e.action.svgName&&a.createElement(c.x,{svgName:e.action.svgName,className:"d-inline-block svg-container me-2"}),t())}function g(e){if(!e.actions||!e.actions.length)return a.createElement(a.Fragment,null);var t=e.actions.some((function(e){return e.lazyPlaceholder})),n="dropdown";e.className&&(n+=" ".concat(e.className));var r,i="actions-dropdown-".concat(o.Y.getRandomInt()),l="dropdown-toggle px-0 ".concat(m.dropdownToggle);return e.dropdownToggleClassName&&(l+=" ".concat(e.dropdownToggleClassName)),a.createElement("div",{className:n},a.createElement("button",{className:l,type:"button",id:i,"data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",onClick:t?e.fetchMore:null},a.createElement(c.x,{svgName:d.vn.More,size:e.dropdownToggleSvgSize})),a.createElement("div",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":i},t?a.createElement(p,null):e.actions.map((function(e,t){var n=void 0!==r&&r!==e.group;return r=e.group,e.tooltip?a.createElement(a.Fragment,{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(u.u,{title:e.tooltip,spanHack:!0},a.createElement(v,{action:e}))):a.createElement(a.Fragment,{key:t},n&&a.createElement("hr",{className:"dropdown-divider",role:"separator"}),a.createElement(v,{action:e}))}))))}g.defaultProps={dropdownToggleClassName:"btn btn-light",dropdownToggleSvgSize:c.S.Small}},40955:(e,t,n)=>{n.d(t,{P:()=>r});var a=n(32735);function r(e){return e.audience?a.createElement("div",{className:"audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ".concat("border-"+e.border," ").concat(e.className?e.className:"")},e.audience.name):a.createElement(a.Fragment,null)}},71020:(e,t,n)=>{n.d(t,{_:()=>u});var a=n(32735),r=n(80247),i=n(34152),o=n(83914),l=n(35223);const s={container:"VwD1b",spinner:"eJ85e"};function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function u(e){var t,n,u=(t=(0,i.YD)(),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return c(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)?c(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=u[0],m=u[1];return a.useEffect((function(){var t;e.fetchOnScroll&&m&&!e.isFetching&&(null===(t=e.fetchNext)||void 0===t||t.call(e,e.nextCursor))}),[m,e.isFetching]),a.createElement("div",{className:"p-3 text-center ".concat(s.container),ref:d},e.isFetching?a.createElement(r.Z,{as:"span",animation:"border",role:"status",className:s.spinner}):a.createElement(o.x,{svgName:l.vn.ChevronDown,className:"svg-container cursor-pointer",size:o.S.Large,onClick:function(){var t;return null===(t=e.fetchNext)||void 0===t?void 0:t.call(e,e.nextCursor)}}))}u.defaultProps={fetchOnScroll:!1}},94644:(e,t,n)=>{n.d(t,{r:()=>u});var a=n(50242),r=n(81886),i=n(67058),o=n(14553),l=n(49267),s=n(49075),c={notFound:i.d,forbidden:{rating:o.q,yearLevel:o.q,region:l.a,privacy:o.q},badRequest:s._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var i;i="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);i&&r.Q.Ry.isStatusCodeError(i)&&(i!==a.o.NotFound?i!==a.o.Forbidden?n.badRequest||r.Q.Ry.throw(new o.badRequest):n.forbidden||r.Q.Ry.throw(new o.forbidden.privacy):n.notFound||r.Q.Ry.throw(new o.notFound))}}},60115:(e,t,n)=>{n.d(t,{K:()=>c});var a=n(32735),r=n(50242),i=n(91967),o=400,l=n(45719);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(e,t,n,c,u,d){var m,p,f,v,g=(m=(0,a.useState)(0),p=2,function(e){if(Array.isArray(e))return e}(m)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(m,p)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(m,p)||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.")}()),y=g[0],h=g[1],b=t,E=(0,l.P)((function(t){if(!e)return null;var n=e(t);return n?n.key:null}),c,u);return f={fetchNextPage:function(){if(t&&e&&E)return h((function(e){return e+1})),b(E.nextCursor)},hasMore:!!(null==E?void 0:E.nextCursor),isFetching:null==E?void 0:E.isFetching,scrollContainer:d},v=function(){if(!f.isFetching){if(f.scrollContainer){var e=f.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;f.fetchNextPage()}},(0,a.useEffect)((function(){var e=i.q.throttle(v,200),t=f.scrollContainer||window;return f.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}}),[f.hasMore,f.fetchNextPage,f.scrollContainer]),(0,a.useEffect)((function(){E&&E.shouldInitialFetch&&t&&(b(),h((function(e){return e+1})))}),[null==E?void 0:E.shouldInitialFetch,t]),(0,a.useEffect)((function(){var e,t;if((null==E?void 0:E.statusCode)&&i.q.isFunction(n)){var a=+(null===(t=null===(e=E.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));a!==r.k.ClientError&&a!==r.k.ServerError||n(y,E.statusCode)}}),[null==E?void 0:E.statusCode]),{items:null==E?void 0:E.items,hasMore:!!(null==E?void 0:E.nextCursor),nextCursor:null==E?void 0:E.nextCursor,isFetching:null==E?void 0:E.isFetching,totalItems:null==E?void 0:E.totalItems,hasFirstPageCompleted:null==E?void 0:E.hasFirstPageCompleted}}},80143:(e,t,n)=>{n.d(t,{n:()=>i});var a=n(32735),r=n(69454);function i(e,t){var n=a.useMemo((function(){return(null==e?void 0:e.length)&&t&&r.T.shouldShowAudiences(t)?r.T.getSortedPresentationAudiences(e,t):null}),[e]);return a.useMemo((function(){return(null==n?void 0:n.length)?r.T.getMergedPresentationAudienceString(n):null}),[n])}},69454:(e,t,n)=>{n.d(t,{T:()=>m});var a=n(75896),r=n(1048),i=n(55171);function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,l=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(l.push(a.value),l.length!==t);s=!0);}catch(e){c=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(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 s=/\d/,c={yearsAndGradesBuilder:function(e){var t=e.map((function(e){return e.name})).join(" "),n=t.split(" ").filter((function(e){return!isNaN(+e)})).map((function(e){return+e}))||[],a=t.split(" ").filter((function(e){return isNaN(+e)}))||[],r=e.find((function(e){return!s.test(e.name)})),i=a.find((function(e){return e!==(null==r?void 0:r.name)}));if(e.length>1&&(i+="s"),r&&n.length)return"".concat(i," ").concat(r.name.charAt(0)," - ").concat(n.pop());var o=function(e){var t,n,a,r,i=!1,o=[];for(e=e.sort((function(e,t){return e-t})),a=0;a<e.length;a++)r=a+1,i||(t=e[a]),n=e[r],e[a]+1===n?i=!0:i?(o.push("".concat(t," - ").concat(e[a])),i=!1):(o.push("".concat(e[a])),i=!1);return o}(n);return"".concat(i," ").concat(o.join(", "))},internationalSecondaryBuilder:function(e){return c.englandSecondaryBuilder(e)},scotlandPrimaryBuilder:function(e){var t=a.m.first(e),n=a.m.last(e),r=o(t.name.split(" "),1)[0],i=o(n.name.split(" "),1)[0];return"First"===r&&(r="1st"),"First"===i&&(i="1st"),"Second"===r&&(r="2nd"),"Second"===i&&(i="2nd"),r===i?"".concat(r," Level"):"".concat(r," - ").concat(i," Level")},internationalPrimaryBuilder:function(e){var t=a.m.first(e),n=a.m.last(e);if(t.name===n.name)return t.name;var r=o(t.name.split(" "),1)[0],i=o(n.name.split(" "),1)[0];return"Lower"===r&&(r="Low"),"Lower"===i&&(i="Low"),"Middle"===r&&(r="Mid"),"Middle"===i&&(i="Mid"),"".concat(r," - ").concat(i," Pri")},englandSecondaryBuilder:function(e){var t=a.m.first(e),n=a.m.last(e);return t.name===n.name?t.name:"Advanced"===n.name?"lower"===o(t.name.split(" "),1)[0].toLowerCase()?"Lower Sec - Adv":"Upper Sec - Adv":"Lower - Upper Sec"},scotlandSecondaryBuilder:function(e){var t=a.m.first(e),n=a.m.last(e);return t.name===n.name?t.name:"Senior Phase"===n.name?"".concat(t.name," - Senior"):"Third - Fourth Level"},englandPrimaryBuilder:function(e){var t=a.m.first(e),n=a.m.last(e),r=a.m.first(t.name.split(" ")),i=a.m.first(n.name.split(" ")),o=t.name.split(" ").find((function(e){return!isNaN(+e)})),l=n.name.split(" ").find((function(e){return!isNaN(+e)}));if(t===n)return"Key"===r||"Reception"===r?t.name:"".concat(r," KS").concat(o);var s="",c="";return s="Reception"===r?"R":"KS".concat(o),c="KS".concat(l),"Lower"===r&&"Upper"===i?"L ".concat(s," - U ").concat(c):("Lower"===r&&(s="Lower ".concat(s)),"Upper"===i&&(c="Upper ".concat(c)),"Key"===i&&(c=n.name),"".concat(s," - ").concat(c))}},u=/([0-9]+)/gi,d=/\s|\+/gi,m={getSortedPresentationAudiences:function(e,t){var n=e.filter((function(e){return!!e})).map((function(e){return e.id.toString()}));return t.filter((function(e){return n.includes(e.masterId.toString())}))},getMergedPresentationAudienceString:function(e){var t="";switch(+a.m.first(e).presentationId){case i.e.PresentationIds.DEFAULT:case i.e.PresentationIds.AU_SECONDARY:case i.e.PresentationIds.US_ELEMENTARY:case i.e.PresentationIds.AU_PRIMARY:case i.e.PresentationIds.STREAMABLE_LEARNING:if(1===e.length)return e[0];t=c.yearsAndGradesBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_SECONDARY:if(1===e.length)return e[0];t=c.internationalSecondaryBuilder(e);break;case i.e.PresentationIds.INTERNATIONAL_PRIMARY:t=c.internationalPrimaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_PRIMARY:t=c.scotlandPrimaryBuilder(e);break;case i.e.PresentationIds.ENGLISH_SECONDARY:t=c.englandSecondaryBuilder(e);break;case i.e.PresentationIds.SCOTLAND_SECONDARY:t=c.scotlandSecondaryBuilder(e);break;case i.e.PresentationIds.ENGLAND_PRIMARY:t=c.englandPrimaryBuilder(e);case i.e.PresentationIds.US_MIDDLE:case i.e.PresentationIds.US_HIGH:}return t?{name:t}:null},sortMembersWithDuplicateNamesByAudience:function(e){var t=function(e){return e.length?(e.forEach((function(e){var r=+a.m.first(e.name.match(u));if(!t)return t=e,void(n=r);r<n&&(t=e)})),t):null;var t,n},n={},r=[];return e.forEach((function(e){if(!n[e.name])return n[e.name]=1,void r.push(e);r.push(e),n[e.name]++;var a=r.splice(r.length-n[e.name]).sort((function(e,n){var a=t(e.subjectPresentationAudiences.data),r=t(n.subjectPresentationAudiences.data);if(!a&&r)return 1;if(!r)return-1;var i=a.name.localeCompare(r.name);return 0===i?i:i>0?-1:1}));r=r.concat(a)})),r},getActiveAudiencesFromParams:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r.t.isObject(t)&&!r.t.isEmpty(t)&&e&&e.length&&m.shouldShowAudiences(e)){var n=t.a;if(n){"string"==typeof n&&(n=[n]);var a=function(e){return e.replace(d,"").toLowerCase()},i=n.reduce((function(e,t){return e[a(t)]=t,e}),{});return e.filter((function(e){return i[a(e.name)]}))}}},getAudienceParams:function(e){return(null==e?void 0:e.length)?{a:e.map((function(e){return e.name}))}:null},shouldShowAudiences:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return!!e&&e.length>1}}},5940:(e,t,n)=>{n.r(t),n.d(t,{PlaylistsView:()=>J});var a=n(32735),r=n(70680),i=n(23481),o=n(20354),l=n(65858),s=n(91200),c=n(31273),u=n(91967),d=n(76611),m=n(36848);function p(e){return p="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},p(e)}function f(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,"string");if("object"!=p(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==p(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var v="playlists.playlistSortSelect",g=u.q.memoize((function(){return f(f(f(f(f({},d.o.RecentlyUpdated,{name:i.T.getPhrase(v,"recentlyUpdated")}),d.o.AtoZ,{name:i.T.getPhrase(v,"atoz")}),d.o.ZtoA,{name:i.T.getPhrase(v,"ztoa")}),d.o.Newest,{name:i.T.getPhrase(v,"newest")}),d.o.Oldest,{name:i.T.getPhrase(v,"oldest")})}));function y(e){var t=e.type,n=e.getSortAppLink,r=e.variant,i=g();return a.createElement("div",{className:"dropdown"},a.createElement("a",{className:"btn btn-".concat(r," ms-2 dropdown-toggle"),type:"button",id:"sort-select","data-bs-toggle":"dropdown","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},i[t].name),a.createElement("div",{className:"dropdown-menu dropdown-menu-end dropdown-menu-right","aria-labelledby":"sort-select"},Object.values(d.o).map((function(e){var r="dropdown-item";return e===t&&(r+=" active"),a.createElement(m.F,{key:e,className:r,appLink:n(e),analyticsData:{sort:i[e].name},analyticsOptions:{location:l.LZ.PlaylistListHeader,entity:l.py.Playlists,actionType:l.Vw.Sort,workflowPhase:l.eu.Complete}},i[e].name)}))))}y.defaultProps={variant:"light"};var h=n(23257),b=n(70006),E=n(71521),N=n(83657),w=n(71020),S=n(83345),C=n(7733),P=n(16714),A=n(94644),I=n(39151),L=n(5112),k=n(31949),T=n(69883),F=n(60115),O=n(22902),x=n(79612),U=n(35223),M=n(14070),D=n(97291),j=n(44110),R=n(26323),_=n(99742);const B={playlistMetadata:"vv8fW"};var Y="playlists.favouritesPlaylistItem",Z=i.T.encloseNamespace(Y);function V(e){var t={entity:l.py.Playlist,actionType:l.Vw.Click,location:l.LZ.PlaylistListItem},n=_.W.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER,r={application:D.O.MY_FAVOURITES,action:M.e.MyFavourites.MY_FAVOURITES};return a.createElement(m.F,{appLink:r,analyticsData:{name:"Favourites",extraItem:"user-favourites"},analyticsOptions:t,title:Z("favouritesTitle")},a.createElement("div",{className:"position-relative"},a.createElement("div",{className:"text-white ".concat(B.playlistMetadata)},!e.isLoadingCount&&a.createElement("span",null,a.createElement(S.x,{namespace:Y,phrase:"count",options:{smartCount:e.count}})),a.createElement("h5",{className:"mb-0"},a.createElement("span",{className:"clamp-2"},Z("favouritesTitle")))),a.createElement("img",{src:n,className:"w-100 h-100 rounded-3"})))}var q=n(23232),H="playlists.playlistsEmptyState",$=i.T.encloseNamespace(H);function z(e){return a.createElement(S.D.Provider,{value:H},a.createElement(q.u,null,a.createElement(q.u.Image,{src:_.W.EmptyStates.Playlists.PLAYLISTS,altText:$("info")}),a.createElement(q.u.Heading,null,a.createElement(S.x,{phrase:"heading"})),a.createElement(q.u.Info,null,a.createElement(S.x,{phrase:e.isStudent?"studentInfo":"info"})),a.createElement(q.u.Cta,{text:i.T.getPhrase(H,"cta"),icon:U.vn.Plus,appLink:{application:D.O.PLAYLISTS,action:M.e.Playlists.NEW_PLAYLIST}})))}function G(){return a.createElement(S.D.Provider,{value:H},a.createElement(q.u,null,a.createElement(q.u.Image,{src:_.W.EmptyStates.Playlists.PLAYLISTS_PUBLIC,altText:$("info")}),a.createElement(q.u.Heading,null,a.createElement(S.x,{phrase:"heading"})),a.createElement(q.u.Info,null,a.createElement(S.x,{phrase:"info"})),a.createElement(q.u.Cta,{text:i.T.getPhrase(H,"publicCta"),appLink:{application:D.O.SIGN_UP,action:M.e.SignUp.SIGN_UP},analyticsData:{},analyticsOptions:{actionType:l.Vw.Click,location:l.LZ.PlaylistsLanding,entity:l.py.AppLink,workflowPhase:l.eu.Start,descriptor:l.Yu.SignUp}})))}var W="playlists.playlists",K=i.T.encloseNamespace(W);function Q(e){return{application:D.O.PLAYLISTS,action:M.e.Playlists.HOME,params:{sort:e}}}function J(e){var t,n=(0,r.I0)(),i=(0,T.Z)(),u=(0,O.T)(),d=u.hasLocalPermissions,m=u.hasPermissions,p=u.isLoaded,f=m(P.C.StudentExperience),v=o.a.useBasicFetch(I.L.config()),g=o.a.useBasicFetch(k.N.currentUser()),_=(0,j.i)(),B=!!g.data&&E.A.getOrSetSortType(g.data.id,e.sort),Y=(0,R.B)(null===(t=g.data)||void 0===t?void 0:t.id),Z=Y.count,q=Y.favourites,H={count:Z,isLoadingCount:Y.isLoading,data:q},$=!!B&&function(e){return L.C.getUserPlaylists(new b.l(B,e,h.e.All))},J=!!$&&function(e){o.a.getFetch(n)($(e))};(0,x.M)({title:K("pageTitle"),description:K("pageDescription")});var X=!d(P.E.ViewPlaylistsLanding)&&B,ee=(0,F.K)(!!X&&$,J,(function(e,t){if(1===e)return(0,A.r)(t);i.error(K("error"))})),te=ee.items,ne=ee.hasMore,ae=ee.isFetching,re=[{label:K("createPlaylist"),appLink:{application:D.O.PLAYLISTS,action:M.e.Playlists.NEW_PLAYLIST},svgName:U.vn.Plus,className:"btn btn-outline-dark",button:!0,analyticsData:{},analyticsOptions:{location:l.LZ.Banner,entity:l.py.Playlist,workflowPhase:l.eu.Start,actionType:l.Vw.Create}}],ie=!!te&&!!g.data&&!!v.data&&(!!_.data||_.hasError)&&!!p;return d(P.E.ViewPlaylistsLanding)?a.createElement(G,null):!ie||H.count||(null==te?void 0:te.length)?a.createElement("div",{className:"bg-white px-3"},a.createElement("div",{className:"d-flex justify-content-between align-items-end pb-3"},a.createElement("h1",{className:"h2 mb-0"},a.createElement(S.x,{namespace:W,phrase:"headerTitle"})),!!B&&a.createElement(N.e,{actions:re,sortComponent:a.createElement(y,{variant:"outline-dark",type:B,getSortAppLink:Q})})),ie?a.createElement(c.P,{playlists:te,getPlaylistAppLink:e.getPlaylistAppLink,imageCdnUrl:v.data.imageCdnUrl,currentUser:g.data,presentationAudiences:_.data||[],bgColourClassNames:C.o,itemContainerClassName:"columns-of-five",itemStyle:"round",showCount:!0,showOwner:!0,extraPlaylistItem:H.count?a.createElement(V,Object.assign({},H)):null}):a.createElement(s.Y,{itemClassName:"columns-of-five"}),ie&&(ne||ae)&&a.createElement(w._,{isFetching:ae,fetchNext:J})):a.createElement(z,{isStudent:f})}},44110:(e,t,n)=>{n.d(t,{i:()=>o});var a=n(20354),r=n(89454),i=n(86698),o=function(){var e=(0,i.y)({redirectOnError:!0}),t=e.activePresentation,n=e.getFallbackPresentation,o=t||n();return a.a.useBasicFetch(!!o&&r.O.presentationAudiences(o.id))}},26323:(e,t,n)=>{n.d(t,{B:()=>l});var a=n(20354),r=n(63419);function i(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e)||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 o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function l(e){var t,n,o,l,s,c,u,d,m,p=a.a.useBasicFetch(e&&r.P.getFavouritesVideosCount(e)),f=a.a.useBasicFetch(e&&r.P.getFavouritesClipsCount(e)),v=a.a.useBasicFetch(e&&r.P.getFavouritesInteractivesCount(e));return{count:(null===(t=p.data)||void 0===t?void 0:t.count)+(null===(n=v.data)||void 0===n?void 0:n.count)+(null===(o=f.data)||void 0===o?void 0:o.count),favourites:[].concat(i((null===(l=p.data)||void 0===l?void 0:l.data)||[]),i((null===(s=f.data)||void 0===s?void 0:s.data)||[]),i((null===(c=v.data)||void 0===c?void 0:c.data)||[])),isLoading:!(null===(u=p.data)||void 0===u?void 0:u.data)||!(null===(d=f.data)||void 0===d?void 0:d.data)||!(null===(m=v.data)||void 0===m?void 0:m.data)}}},84231:(e,t,n)=>{n.d(t,{Z:()=>a});const a={playlistItem:"CaRJx",playlistItemGradient:"BI7p2",playlistMetadata:"eDk1l",partialHeading:"w4lWh",ownerAvatarContainer:"JImqE"}},68050:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(95685),r=n.n(a),i=n(32735),o=n(46304),l=n(74512);const s=i.forwardRef((({bsPrefix:e,className:t,as:n="div",...a},i)=>{const s=(0,o.vE)(e,"row"),c=(0,o.pi)(),u=(0,o.zG)(),d=`${s}-cols`,m=[];return c.forEach((e=>{const t=a[e];let n;delete a[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const r=e!==u?`-${e}`:"";null!=n&&m.push(`${d}${r}-${n}`)})),(0,l.jsx)(n,{ref:i,...a,className:r()(t,s,...m)})}));s.displayName="Row";const c=s},82602:(e,t,n)=>{n.d(t,{WU:()=>c});var a=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],i={},o=function(e,t){i[e]=t},l=[60,60,24,7,365/7/12,12];function s(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var c=function(e,t,n){var a=function(e,t){return(+(t?s(t):new Date)-+s(e))/1e3}(e,n&&n.relativeDate);return function(e,t){for(var n=e<0?1:0,a=e=Math.abs(e),r=0;e>=l[r]&&r<l.length;r++)e/=l[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,a)[n].replace("%s",e.toString())}(a,function(e){return i[e]||i.en_US}(t))};o("en_US",(function(e,t){if(0===t)return["just now","right now"];var n=a[Math.floor(t/2)];return e>1&&(n+="s"),[e+" "+n+" ago","in "+e+" "+n]})),o("zh_CN",(function(e,t){if(0===t)return["刚刚","片刻后"];var n=r[~~(t/2)];return[e+" "+n+"前",e+" "+n+"后"]}))}}]);
2
+ //# sourceMappingURL=5940-5731abccf3-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/5940-5731abccf3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PartialPlaylistList.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-count/playlist-count.scss","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-count/PlaylistCount.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistOwnerAvatar.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistItem.tsx","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/PlaylistList.tsx","file:///app/packages/libs/shared/src/components/actions/Actions.tsx","file:///app/packages/libs/shared/src/components/actions/actions.scss","file:///app/packages/libs/shared/src/components/actions/ActionsDropdown.tsx","file:///app/packages/libs/shared/src/components/audience-label/AudienceLabel.tsx","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/infinite-scroll-footer.scss","file:///app/packages/libs/shared/src/components/infinite-scroll-footer/InfiniteScrollFooter.tsx","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/hooks/UseMergeAudiences.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceStringBuilders.ts","file:///app/packages/libs/shared/src/utils/audience-helper/AudienceHelper.ts","file:///app/packages/libs/shared/src/apps/playlists/components/sort-select/PlaylistSortSelect.tsx","file:///app/packages/projects/lite/src/apps/playlists/components/favourites-playlist-item/favourites-playlist-item.scss","file:///app/packages/projects/lite/src/apps/playlists/components/favourites-playlist-item/FavouritesPlaylistItem.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlists/empty-state/PlaylistsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/playlists/views/playlists/PlaylistsView.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/favourites/hooks/useFavouritesCount.ts","file:///app/packages/libs/shared/src/apps/playlists/components/playlist-list/playlist.scss","file:///app/node_modules/react-bootstrap/esm/Row.js","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport styles from './playlist.scss';\n\ninterface PartialPlaylistListProps {\n numItems?: number;\n itemClassName?: string;\n showHeading?: boolean;\n}\n\nPartialPlaylistList.defaultProps = {\n numItems: 8\n};\n\nexport function PartialPlaylistList(props: PartialPlaylistListProps): JSX.Element {\n const PARTIAL_PLAYLISTS = [...Array(props.numItems)];\n\n const className = props.itemClassName || '';\n\n return (\n <>\n {props.showHeading && <div className={`${styles.partialHeading} mb-1 partial-loading-background`} />}\n <Row className='mx-n1 mb-n2'>\n {PARTIAL_PLAYLISTS.map((p, idx) => (\n <Col key={idx} xs={6} sm={4} lg={3} className={`${className} px-1 pb-2`}>\n <div className={`${styles.playlistItem} partial-loading-background rounded-3`} />\n </Col>\n ))}\n </Row>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"fontSmall\":\"OYBRp\"};","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Playlist } from 'libs/shared/interfaces';\n\nimport styles from './playlist-count.scss';\n\nconst namespace = 'playlists.playlistCount';\n\nfunction getCount(playlist: Playlist): number | false {\n if (!playlist)\n return false;\n\n const videos = playlist.videos?.count ?? 0;\n const interactives = playlist.interactives?.count ?? 0;\n const clips = playlist.clips?.count ?? 0;\n\n return videos + interactives + clips;\n}\n\ninterface PlaylistCountProps {\n playlist: Playlist;\n}\n\nexport function PlaylistCount(props: PlaylistCountProps): JSX.Element {\n const count = getCount(props.playlist);\n\n if (count === false || Number.isNaN(count))\n return <></>;\n\n return (\n <span className={styles.fontSmall}>\n <Text namespace={namespace} phrase='count' options={{ smartCount: count }} />\n </span>\n );\n}","import * as React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\ninterface PlaylistOwnerAvatarProps {\n playlist: Playlist;\n imageCdnUrl: string;\n currentUser?: CurrentUser;\n}\n\nexport function PlaylistOwnerAvatar(props: PlaylistOwnerAvatarProps): JSX.Element {\n const { _liteOwner } = props.playlist;\n\n if (props.playlist._isClickViewCurated?.value)\n return (\n <ClickViewAvatar />\n );\n\n if (!_liteOwner?.id || !props.currentUser?.id)\n return <></>;\n\n const currentUserIsOwner = _liteOwner.id.toString() === props.currentUser.id.toString();\n\n if (currentUserIsOwner)\n return <></>;\n\n const url = typeof _liteOwner.avatar === 'string' ? _liteOwner.avatar : _liteOwner.avatar?.url;\n\n return (\n <Avatar\n imageUrl={url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(_liteOwner.name, _liteOwner.surname)}\n />\n );\n}","import * as React from 'react';\nimport { format } from 'timeago.js';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { AnalyticsOptions, EntityType, HashObject } from 'libs/analytics/interfaces';\n\nimport { PlaylistCount } from 'libs/shared/apps/playlists/components/playlist-count/PlaylistCount';\nimport { PlaylistOwnerAvatar } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistOwnerAvatar';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { AudienceLabel } from 'libs/shared/components/audience-label/AudienceLabel';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ResizeType } from 'libs/shared/enums/Images';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './playlist.scss';\n\nconst namespace = 'playlists.playlistList';\n\nexport type PlaylistItemStyle = 'square' | 'round' | 'round-left';\n\nexport interface PlaylistItemProps {\n data: Playlist;\n appLink: Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n bgColourClassNames?: string[];\n titleClassName?: string;\n imageCdnUrl?: string;\n itemStyle?: PlaylistItemStyle;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n audienceLabelClass?: string;\n}\n\nPlaylistItem.defaultProps = {\n itemStyle: 'square'\n};\n\nexport function PlaylistItem(props: PlaylistItemProps): JSX.Element {\n const imageUrl = ImageHelper.createUrl(props.data.cover && props.data.cover.url, {\n size: ImageSize.Medium,\n resizeType: ResizeType.Cover\n });\n\n const audiences = props.data.subjectPresentationAudiences &&\n props.data.subjectPresentationAudiences.data;\n\n const mergedAudience = useMergeAudiences(audiences, props.presentationAudiences);\n\n let className = styles.playlistItem;\n\n const showImage = !!imageUrl || !!props.showFallbackImage;\n\n if (showImage)\n className += ` ${styles.playlistItemGradient}`;\n\n if (!showImage && props.bgColourClassNames)\n className += ` ${styles.playlistItem} ${getBgColorClass(props.data.name, props.bgColourClassNames)}`;\n\n if (props.itemStyle === 'round')\n className += ` rounded-3 overflow-hidden`;\n\n if (props.itemStyle === 'round-left')\n className += ` rounded-start-lg overflow-hidden`;\n\n const analyticsData = { ...props.analyticsData,\n id: props.data?.id,\n name: props.data?.name\n };\n\n const analyticsOptions = {\n ...props.analyticsOptions,\n entity: EntityType.Playlist\n };\n\n const getTitle = () => {\n if (!props.data.contentModifiedDate || props.data._isClickViewCurated?.value)\n return '';\n\n return LanguageService.getPhrase(namespace, 'lastUpdated', {\n timeago: format(DateHelper.convertUTCToLocal(props.data.contentModifiedDate))\n });\n };\n\n return (\n <AppLink\n appLink={props.appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getTitle()}\n >\n <BaseImage data={imageUrl} alt={props.data.name} className={className}>\n {!!props.showFallbackImage && <ImageFallback type={ImageFallbackType.Playlist} />}\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!!props.showCount && (\n <PlaylistCount playlist={props.data} />\n )}\n <h5 className={`mb-0 ${props.titleClassName || ''}`}><span className='clamp-2'>{props.data.name}</span></h5>\n {!!audiences && !!audiences.length && !!mergedAudience &&\n <AudienceLabel\n className={`${props.audienceLabelClass ? props.audienceLabelClass : ''} mt-1`}\n audience={mergedAudience}\n border='white'\n />\n }\n </div>\n {!!props.showOwner && !!props.imageCdnUrl &&\n <div className={styles.ownerAvatarContainer}>\n <PlaylistOwnerAvatar\n playlist={props.data}\n currentUser={props.currentUser}\n imageCdnUrl={props.imageCdnUrl}\n />\n </div>\n }\n </BaseImage>\n </AppLink>\n );\n}","import * as React from 'react';\nimport { Col, Row } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CurrentUser, Playlist, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { PlaylistItem, PlaylistItemStyle } from './PlaylistItem';\n\ninterface PlaylistListProps {\n playlists: Playlist[];\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n currentUser?: CurrentUser;\n presentationAudiences?: PresentationAudience[];\n itemContainerClassName?: string;\n itemTitleClassName?: string;\n bgColourClassNames?: string[];\n itemStyle?: PlaylistItemStyle;\n imageCdnUrl?: string;\n showCount?: boolean;\n showOwner?: boolean;\n showFallbackImage?: boolean;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n extraPlaylistItem?: JSX.Element;\n}\n\nconst analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.Playlist,\n location: LocationContext.PlaylistListItem,\n descriptor: ClickDescriptor.Cover\n};\n\nexport function PlaylistList(props: PlaylistListProps): JSX.Element {\n return (\n <Row className='mx-n1'>\n {props.extraPlaylistItem && (\n <Col key='extra-playlist-item' xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n {props.extraPlaylistItem}\n </Col>\n )}\n\n {props.playlists.map(p => (\n <Col key={p.id} xs={6} sm={4} lg={3} className={`mb-2 px-1 ${props.itemContainerClassName ? props.itemContainerClassName : ''}`}>\n <PlaylistItem\n data={p}\n appLink={props.getPlaylistAppLink(p)}\n imageCdnUrl={props.imageCdnUrl}\n currentUser={props.currentUser}\n presentationAudiences={props.presentationAudiences}\n bgColourClassNames={props.bgColourClassNames}\n showCount={props.showCount}\n showOwner={props.showOwner}\n showFallbackImage={props.showFallbackImage}\n titleClassName={props.itemTitleClassName}\n itemStyle={props.itemStyle}\n analyticsData={props.analyticsData}\n analyticsOptions={{ ...props.analyticsOptions, ...analyticsOptions }}\n />\n </Col>\n ))}\n </Row>\n );\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { ActionButton } from './ActionButton';\nimport { ActionsDropdown } from './ActionsDropdown';\n\nexport interface ActionOptions {\n order?: number;\n label?: string | (() => JSX.Element);\n appLink?: Core.AppLink;\n href?: string;\n onClick?: () => void;\n svgName?: string;\n className?: string;\n button?: boolean; // If true, a button will be rendered. Otherwise the action will be rendered in the dropdown.\n tooltip?: string;\n showSpinner?: boolean;\n showBorder?: boolean; // only works for button without text label\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n disabled?: boolean;\n openInNewTab?: boolean; // Only used if appLink or href is provided\n group?: string;\n lazyPlaceholder?: boolean;\n}\n\nexport type ActionGenerator = (obj: BaseObject) => ActionOptions[];\n\ninterface ActionsProps {\n actions: ActionOptions[];\n className?: string;\n actionsDropdownClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n sortComponent?: JSX.Element;\n fetchMore?: () => void;\n}\n\nexport function Actions(props: ActionsProps): JSX.Element {\n const orderedActions = React.useMemo(() => props.actions.sort((a, b) => a.order - b.order), [props.actions]);\n\n const buttonActions: ActionOptions[] = [];\n const moreActions: ActionOptions[] = [];\n\n orderedActions.forEach(a => {\n if (a.button)\n buttonActions.push(a);\n else\n moreActions.push(a);\n });\n\n let className = 'd-flex';\n\n if (props.className)\n className += ` ${props.className}`;\n\n if (!buttonActions.length && !moreActions.length)\n return <></>;\n\n return (\n <div className={className}>\n <>\n <span className='d-flex align-items-center'>\n {buttonActions.length ? buttonActions.map((a, idx) => (\n <React.Fragment key={idx}>\n {(() => {\n if (a.label) {\n const label = FunctionHelper.isFunction(a.label)\n ? a.label\n : () => <>{a.label}</>;\n\n return (\n <ActionButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n tooltip={a.tooltip}\n showSpinner={a.showSpinner}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n >\n {label()}\n </ActionButton>\n );\n }\n\n const iconButton = (\n <IconButton\n appLink={a.appLink}\n href={a.href}\n onClick={a.onClick}\n svgName={a.svgName}\n className={a.className}\n analyticsData={a.analyticsData}\n analyticsOptions={a.analyticsOptions}\n openInNewTab={a.openInNewTab}\n disabled={a.disabled}\n showBorder={a.showBorder}\n />\n );\n\n return a.tooltip\n ? <Tooltip title={a.tooltip} spanHack>{iconButton}</Tooltip>\n : iconButton;\n })()}\n </React.Fragment>\n )) : <></>}\n {props.sortComponent && props.sortComponent}\n {moreActions.length ? (\n <ActionsDropdown\n actions={moreActions}\n dropdownToggleClassName={props.actionsDropdownClassName}\n dropdownToggleSvgSize={props.dropdownToggleSvgSize}\n fetchMore={props.fetchMore}\n />\n ) : <></>}\n </span>\n </>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"dropdownToggle\":\"UCAnJ\"};","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { RandomHelper } from 'libs/common/react/utils/RandomHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ActionOptions } from './Actions';\n\nimport styles from './actions.scss';\n\nfunction LazyDropdownItems(): JSX.Element {\n return (\n <>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '8rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '12rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '11rem' }}></div>\n </div>\n <div style={{ padding: '0.53125rem 1rem' }}>\n <div className='partial-loading-background' style={{ height: '1.0625rem', width: '9rem' }}></div>\n </div>\n </>\n );\n}\n\nfunction getDropdownItemClassName(actionClassName?: string): string {\n let className = 'dropdown-item';\n\n if (actionClassName)\n className += ` ${actionClassName}`;\n\n return className;\n}\n\nexport type DropdownActionOptions = Omit<ActionOptions, 'button'>;\n\ninterface ActionsDropdownItemProps {\n action: DropdownActionOptions;\n}\n\nfunction ActionsDropdownItem(props: ActionsDropdownItemProps): React.ReactElement {\n const label = FunctionHelper.isFunction(props.action.label)\n ? props.action.label\n : () => <>{props.action.label}</>;\n\n if (props.action.appLink)\n return (\n <AppLink\n appLink={props.action.appLink}\n onClick={props.action.onClick}\n className={getDropdownItemClassName(props.action.className)}\n analyticsData={props.action.analyticsData}\n analyticsOptions={props.action.analyticsOptions}\n openInNewTab={props.action.openInNewTab}\n disabled={props.action.disabled}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </AppLink>\n );\n\n function onClick(e: React.MouseEvent | React.KeyboardEvent): void {\n e.preventDefault();\n\n if (props.action.analyticsData && props.action.analyticsOptions)\n AnalyticsHelper.logUserAction(props.action.analyticsData, props.action.analyticsOptions);\n\n if (FunctionHelper.isFunction(props.action.onClick))\n props.action.onClick();\n\n if (props.action.href)\n Core.LocationUtils.PageLoad(props.action.href, props.action.openInNewTab);\n }\n\n if (props.action.href) {\n return (\n <a\n className={getDropdownItemClassName(props.action.className)}\n onClick={onClick}\n href={props.action.href}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2 align-middle' />}\n <span className='align-middle'>{label()}</span>\n </a>\n );\n }\n\n return (\n <span\n className={`cursor-pointer ${getDropdownItemClassName(props.action.className)}`}\n onClick={onClick}\n role='button'\n tabIndex={0}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClick(e)}\n >\n {props.action.svgName && <SvgContainer svgName={props.action.svgName} className='d-inline-block svg-container me-2' />}\n {label()}\n </span>\n );\n}\n\ninterface ActionsDropdownProps {\n actions: DropdownActionOptions[];\n className?: string;\n dropdownToggleClassName?: string;\n dropdownToggleSvgSize?: SvgContainerSize;\n fetchMore?: () => void;\n}\n\nActionsDropdown.defaultProps = {\n dropdownToggleClassName: 'btn btn-light',\n dropdownToggleSvgSize: SvgContainerSize.Small\n};\n\nexport function ActionsDropdown(props: ActionsDropdownProps): React.ReactElement {\n if (!props.actions || !props.actions.length)\n return <></>;\n\n const isLazy = props.actions.some(a => a.lazyPlaceholder);\n\n let className = 'dropdown';\n\n if (props.className)\n className += ` ${props.className}`;\n\n // Generate unique id to avoid collisions.\n const dropdownToggleId = `actions-dropdown-${RandomHelper.getRandomInt()}`;\n\n let dropdownToggleClassName = `dropdown-toggle px-0 ${styles.dropdownToggle}`;\n\n if (props.dropdownToggleClassName)\n dropdownToggleClassName += ` ${props.dropdownToggleClassName}`;\n\n let currentGroup: string;\n\n return (\n <div className={className}>\n <button\n className={dropdownToggleClassName}\n type='button'\n id={dropdownToggleId}\n data-bs-toggle='dropdown'\n data-toggle='dropdown'\n aria-haspopup='true'\n aria-expanded='false'\n onClick={isLazy ? props.fetchMore : null}\n >\n <SvgContainer svgName={cvSvgLibrary.More} size={props.dropdownToggleSvgSize} />\n </button>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby={dropdownToggleId}>\n {isLazy ?\n <LazyDropdownItems /> :\n props.actions.map((a, idx) => {\n const showDivider = currentGroup !== undefined && currentGroup !== a.group;\n currentGroup = a.group;\n \n if (a.tooltip) {\n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <Tooltip title={a.tooltip} spanHack>\n <ActionsDropdownItem action={a} />\n </Tooltip>\n \n </React.Fragment>\n );\n }\n \n return (\n <React.Fragment key={idx}>\n {showDivider && <hr className='dropdown-divider' role='separator'></hr>}\n <ActionsDropdownItem action={a} />\n </React.Fragment>\n );\n })\n }\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Audience } from 'libs/shared/interfaces';\n\nimport styles from './audience-label.scss';\n\ntype AudienceBorderColour = 'dark' | 'white';\n\ninterface AudienceLabelProps {\n audience: Audience;\n border: AudienceBorderColour;\n className?: string;\n}\n\nexport function AudienceLabel(props: AudienceLabelProps): JSX.Element {\n if (!props.audience)\n return <></>;\n\n // Note: the audience-label class is applied so that parent components can override styling, and Online can style this component\n return (\n <div\n className={`audience-label border rounded-pill d-inline-block px-2 text-nowrap \n ${'border-' + props.border} ${props.className ? props.className : ''}`}\n >\n {props.audience.name}\n </div>\n );\n}\n\ninterface AudienceLabelListProps {\n audiences: Audience[];\n border: AudienceBorderColour;\n}\n\nexport function AudienceLabelList(props: AudienceLabelListProps): JSX.Element {\n if (!props.audiences || !props.audiences.length)\n return <></>;\n\n return (\n <>\n {props.audiences.map((a, idx) => (\n <span key={idx} className={styles.audienceLabelListItem}>\n <AudienceLabel audience={a} border={props.border} />\n </span>\n ))}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"VwD1b\",\"spinner\":\"eJ85e\"};","import * as React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useInView } from 'react-intersection-observer';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './infinite-scroll-footer.scss';\n\ninterface InfiniteScrollFooterProps {\n isFetching: boolean;\n fetchNext?: (nextCursor: string) => void;\n nextCursor?: string;\n fetchOnScroll?: boolean;\n}\n\nInfiniteScrollFooter.defaultProps = {\n fetchOnScroll: false\n};\n\nexport function InfiniteScrollFooter(props: InfiniteScrollFooterProps): React.ReactElement {\n const [ ref, inView ] = useInView();\n\n React.useEffect(() => {\n if (!props.fetchOnScroll)\n return;\n\n if (!inView || props.isFetching)\n return;\n\n props.fetchNext?.(props.nextCursor);\n }, [ inView, props.isFetching ]);\n\n return (\n <div className={`p-3 text-center ${styles.container}`} ref={ref}>\n {props.isFetching\n ? <Spinner as='span' animation='border' role='status' className={styles.spinner} />\n : (\n <SvgContainer\n svgName={cvSvgLibrary.ChevronDown}\n className='svg-container cursor-pointer'\n size={SvgContainerSize.Large}\n onClick={() => props.fetchNext?.(props.nextCursor)}\n />\n )\n }\n </div>\n );\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\n\nimport { Audience, PresentationAudience } from '../interfaces';\nimport { AudienceHelper } from '../utils/audience-helper/AudienceHelper';\n\nexport function useMergeAudiences(\n audiences: Audience[],\n presentationAudiences: PresentationAudience[]\n): PresentationAudience {\n // Memoize the audience functions as they are somewhat expensive and the result shouldn't change\n const sortedAudiences = React.useMemo(() => {\n if (!audiences?.length || !presentationAudiences || !AudienceHelper.shouldShowAudiences(presentationAudiences))\n return null;\n\n return AudienceHelper.getSortedPresentationAudiences(audiences, presentationAudiences);\n }, [audiences]);\n\n const mergedAudience = React.useMemo(() => {\n if (!sortedAudiences?.length)\n return null;\n\n return AudienceHelper.getMergedPresentationAudienceString(sortedAudiences);\n }, [sortedAudiences]);\n\n return mergedAudience;\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nconst HAS_NUMBER_REGEX = /\\d/;\nconst COUNT_OFFSET = 1;\n\nexport const AudienceStringBuilders = {\n /**\n * Handles audience sets like:\n * - Year 7, Year 8, etc\n * - Kindergarten, Grade 1, Grade 2, etc\n */\n yearsAndGradesBuilder(audiences: PresentationAudience[]): string {\n /**\n * Create a string with all of the audiences\n */\n const combinedNames = audiences.map(a => a.name).join(' ');\n\n /**\n * Extract all the numbers and matches from the string\n */\n const numberList = combinedNames.split(' ').filter(name => !isNaN(+name)).map(num => +num) || [];\n const wordList = combinedNames.split(' ').filter(name => isNaN(+name)) || [];\n\n // Find an audience that doesn't have a number, like \"Kindergarten\" or \"Foundation\".\n const audienceWithoutNum = audiences.find(p => {\n return !HAS_NUMBER_REGEX.test(p.name);\n });\n\n // Get audience label prefix\n let prefix = wordList.find(name => name !== audienceWithoutNum?.name);\n\n // Pluralise the prefix is there are multiple audiences\n if (audiences.length > 1)\n prefix += 's';\n\n if (audienceWithoutNum && numberList.length)\n return `${prefix} ${audienceWithoutNum.name.charAt(0)} - ${numberList.pop()}`;\n\n /**\n * Build set of logical audience ranges\n */\n const audienceRange = processAudienceRanges(numberList);\n\n return `${prefix} ${audienceRange.join(', ')}`;\n },\n\n internationalSecondaryBuilder(audiences: PresentationAudience[]): string {\n return AudienceStringBuilders.englandSecondaryBuilder(audiences);\n },\n\n scotlandPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'First')\n firstAudienceLevel = '1st';\n\n if (lastAudienceLevel === 'First')\n lastAudienceLevel = '1st';\n\n if (firstAudienceLevel === 'Second')\n firstAudienceLevel = '2nd';\n\n if (lastAudienceLevel === 'Second')\n lastAudienceLevel = '2nd';\n\n if (firstAudienceLevel === lastAudienceLevel)\n return `${firstAudienceLevel} Level`;\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Level`;\n },\n\n internationalPrimaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n let [firstAudienceLevel] = firstAudience.name.split(' ');\n let [lastAudienceLevel] = lastAudience.name.split(' ');\n\n if (firstAudienceLevel === 'Lower')\n firstAudienceLevel = 'Low';\n\n if (lastAudienceLevel === 'Lower')\n lastAudienceLevel = 'Low';\n\n if (firstAudienceLevel === 'Middle')\n firstAudienceLevel = 'Mid';\n\n if (lastAudienceLevel === 'Middle')\n lastAudienceLevel = 'Mid';\n\n return `${firstAudienceLevel} - ${lastAudienceLevel} Pri`;\n },\n\n /**\n * Handles the english secondary audiences, which can be: Lower Secondary, Upper Secondary, and Advanced\n */\n englandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Advanced') {\n const [level] = firstAudience.name.split(' ');\n\n if (level.toLowerCase() === 'lower')\n return 'Lower Sec - Adv';\n\n return 'Upper Sec - Adv';\n }\n\n return 'Lower - Upper Sec';\n },\n\n scotlandSecondaryBuilder(audiences: PresentationAudience[]): string {\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n if (firstAudience.name === lastAudience.name)\n return firstAudience.name;\n\n if (lastAudience.name === 'Senior Phase')\n return `${firstAudience.name} - Senior`;\n\n return 'Third - Fourth Level';\n },\n\n /**\n * Handles the audience set: Reception, Key Stage 1, Lower Key Stage 2, and Upper Key Stage 2\n */\n englandPrimaryBuilder(audiences: PresentationAudience[]): string {\n // The first and last audience will build out the range\n const firstAudience = ArrayHelper.first(audiences);\n const lastAudience = ArrayHelper.last(audiences);\n\n // The first word in the strings will either be \"Upper\", \"Lower\", \"Key\", or \"Reception\"\n const firstAudienceFirstWord = ArrayHelper.first(firstAudience.name.split(' '));\n const lastAudienceFirstWord = ArrayHelper.first(lastAudience.name.split(' '));\n\n // Each audience in this set except for \"Reception\" has a number. Get the numbers for the first and last audiences\n const firstAudienceNumber = firstAudience.name.split(' ').find(word => !isNaN(+word));\n const lastAudienceNumber = lastAudience.name.split(' ').find(word => !isNaN(+word));\n\n // If there's only one audience on the video:\n if (firstAudience === lastAudience) {\n // For these 2 audiences, return the full name as it's short enough already\n if (firstAudienceFirstWord === 'Key' || firstAudienceFirstWord === 'Reception')\n return firstAudience.name;\n\n // For the Upper/Lower key stage audiences, abbreviate the \"key stage\" part to KS1/KS2\n return `${firstAudienceFirstWord} KS${firstAudienceNumber}`;\n }\n\n /**\n * Handle when the object has >1 audience\n */\n\n let firstAudienceString = '';\n let lastAudienceString = '';\n\n // Reception is always shortened to \"R\" when in a range\n if (firstAudienceFirstWord === 'Reception') {\n firstAudienceString = 'R';\n } else {\n // All other audiences will be abbreviated to \"KS1/KS2\"\n firstAudienceString = `KS${firstAudienceNumber}`;\n }\n\n // The last audience will always be a key stage, so abbreviate this too\n lastAudienceString = `KS${lastAudienceNumber}`;\n\n // If the audience range contains both the \"Lower\" and \"Upper\" audiences, abbreviate those and return\n if (firstAudienceFirstWord === 'Lower' && lastAudienceFirstWord === 'Upper') {\n return `L ${firstAudienceString} - U ${lastAudienceString}`;\n }\n\n // Add \"Lower\" and \"Upper\" to the strings if it's needed\n if (firstAudienceFirstWord === 'Lower') {\n firstAudienceString = `Lower ${firstAudienceString}`;\n }\n\n if (lastAudienceFirstWord === 'Upper') {\n lastAudienceString = `Upper ${lastAudienceString}`;\n }\n\n // This handles a case where the range is Reception - Key Stage 1. In which case we don't abbreviate the key stage part to KS1.\n if (lastAudienceFirstWord === 'Key') {\n lastAudienceString = lastAudience.name;\n }\n\n return `${firstAudienceString} - ${lastAudienceString}`;\n }\n};\n\nfunction processAudienceRanges(audienceValues: number[]): string[] {\n /**\n * Lookahead by increments of offset\n */\n const offset = COUNT_OFFSET;\n\n let initialVal; let nextVal;\n let isContinguous: boolean = false;\n\n const ranges: string[] = [];\n\n // Audience values need to be in ascending order\n audienceValues = audienceValues.sort((a, b) => a - b);\n\n let i; let j;\n\n for (i = 0; i < audienceValues.length; i++) {\n j = i + 1;\n\n // Set our lower boundary to compare against\n if (!isContinguous)\n initialVal = audienceValues[i];\n\n nextVal = audienceValues[j];\n\n /**\n * Where the next number is also the next incremental value\n * we're going to continue iterating until the next value\n * is no longer contiguos.\n */\n if (audienceValues[i] + offset === nextVal) {\n isContinguous = true;\n } else if (isContinguous) {\n /**\n * Where we were tracking a contiguous set, format appropriately \n * and store the vals\n */\n\n ranges.push(`${initialVal} - ${audienceValues[i]}`);\n isContinguous = false;\n } else {\n /**\n * Where the values arent contiguous, just store the current value\n */\n\n ranges.push(`${audienceValues[i]}`);\n isContinguous = false;\n }\n }\n\n return ranges;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { Audience, BaseObject, PresentationAudience } from 'libs/shared/interfaces';\n\nimport { AudienceStringBuilders } from './AudienceStringBuilders';\n\nconst DIGIT_REGEX = /([0-9]+)/ig;\nconst SPACE_REGEX = /\\s|\\+/ig;\n\n/**\n * Where there is 1 or less audiences on a presentation, it provides little value to\n * the user's experience, so we'll hide audiences altogether.\n */\nconst MIN_AUDIENCE_THRESHOLD = 1;\n\nexport const AudienceHelper = {\n /**\n * This is needed to sort an object's audiences, as they are not sorted by the backend.\n * To do this, we take the presentation audiences (sorted) and filter them by the object's\n * audiences, leaving behind a sorted array of object audiences.\n */\n getSortedPresentationAudiences(\n objectAudiences: Audience[],\n presentationAudiences: PresentationAudience[]\n ): PresentationAudience[] {\n /**\n * Atm there is a bug in flight's optimize, around multiple parts of the page \n * fetching the same object with a different response. We are filtering out\n * falsey values in our object audience ids until that's fixed. - Sha\n */\n const objectAudienceIds = objectAudiences\n .filter(v => !!v)\n .map(audience => audience.id.toString());\n\n /**\n * Remove audiences that aren't relevant for the user's current presentation\n */\n const filteredAudiences = presentationAudiences.filter(presAudience => {\n return objectAudienceIds.includes(presAudience.masterId.toString());\n });\n\n return filteredAudiences;\n },\n\n /**\n * This function accepts a set of presentation audiences, and returns a single\n * audience where the name is a merged string of the names of all of the audiences passed in.\n *\n * As we add more presentations that have different audience sets, we'll need to extend the `switch`\n * statement below to either include new string builder functions, or to include new presentation IDs\n * for existing string builder functions.\n */\n getMergedPresentationAudienceString(presentationAudiences: PresentationAudience[]): PresentationAudience {\n const { presentationId } = ArrayHelper.first(presentationAudiences);\n\n let mergedAudienceString = '';\n\n switch (+presentationId) {\n // Generic `Name Number`. Sometimes has just name. Examples: Year 12, Grade 4, Kindergarten\n case HardCoded.PresentationIds.DEFAULT:\n case HardCoded.PresentationIds.AU_SECONDARY:\n case HardCoded.PresentationIds.US_ELEMENTARY:\n case HardCoded.PresentationIds.AU_PRIMARY:\n case HardCoded.PresentationIds.STREAMABLE_LEARNING:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n mergedAudienceString = AudienceStringBuilders.yearsAndGradesBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_SECONDARY:\n if (presentationAudiences.length === 1)\n return presentationAudiences[0];\n\n // TODO: Implement this properly\n mergedAudienceString = AudienceStringBuilders.internationalSecondaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.INTERNATIONAL_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.internationalPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.SCOTLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.scotlandPrimaryBuilder(presentationAudiences);\n break;\n\n case HardCoded.PresentationIds.ENGLISH_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.englandSecondaryBuilder(presentationAudiences);\n break;\n\n \n case HardCoded.PresentationIds.SCOTLAND_SECONDARY:\n mergedAudienceString = AudienceStringBuilders.scotlandSecondaryBuilder(presentationAudiences);\n break;\n\n // Key Stage 1, Lower Key Stage 2, etc.\n case HardCoded.PresentationIds.ENGLAND_PRIMARY:\n mergedAudienceString = AudienceStringBuilders.englandPrimaryBuilder(presentationAudiences);\n break;\n\n // These presentations only have 1 audience mapped. These are never shown as badges in the product.\n case HardCoded.PresentationIds.US_MIDDLE:\n case HardCoded.PresentationIds.US_HIGH:\n default:\n break;\n }\n\n if (!mergedAudienceString)\n return null;\n\n return { name: mergedAudienceString } as PresentationAudience;\n },\n\n /**\n * This function assumes the members array passed in is ordered by `name`.\n */\n sortMembersWithDuplicateNamesByAudience(members: BaseObject[]): BaseObject[] {\n // Returns the lowest level audience out of an array of audience objects by looking at the name\n const getLowestAudience = (audiences: Audience[]) => {\n if (!audiences.length)\n return null;\n\n let lowestAudience: Audience;\n let lowestAudienceDigit: number;\n\n audiences.forEach(audience => {\n const digit = +ArrayHelper.first(audience.name.match(DIGIT_REGEX));\n\n if (!lowestAudience) {\n lowestAudience = audience;\n lowestAudienceDigit = digit;\n return;\n }\n\n if (digit < lowestAudienceDigit)\n lowestAudience = audience;\n });\n\n return lowestAudience;\n };\n\n // This is used to track how many times a member's name appears in the collection\n const nameCountMap: HashObject<number> = {};\n\n let sorted: BaseObject[] = [];\n\n members.forEach(member => {\n if (!nameCountMap[member.name]) {\n nameCountMap[member.name] = 1;\n sorted.push(member);\n return;\n }\n\n sorted.push(member);\n nameCountMap[member.name]++;\n\n // Take the slice of duplicates that we want to sort by audience\n const slice = sorted.splice(sorted.length - nameCountMap[member.name]);\n\n // Sort the slice by lowest audience\n const sortedSlice = slice.sort((a: any, b: any) => {\n const firstObjLowestAudience = getLowestAudience(a.subjectPresentationAudiences.data);\n const secondObjLowestAudience = getLowestAudience(b.subjectPresentationAudiences.data);\n\n if (!firstObjLowestAudience && secondObjLowestAudience)\n return 1;\n\n if (!secondObjLowestAudience)\n return -1;\n\n const comparison = firstObjLowestAudience.name.localeCompare(secondObjLowestAudience.name);\n\n if (comparison === 0) return comparison;\n\n return comparison > 0 ? -1 : 1;\n });\n\n sorted = sorted.concat(sortedSlice);\n });\n\n return sorted;\n },\n\n getActiveAudiencesFromParams(audiences: PresentationAudience[], params: HashObject = {}): PresentationAudience[] {\n if (!ObjectHelper.isObject(params) || ObjectHelper.isEmpty(params))\n return;\n\n if (!audiences || !audiences.length)\n return;\n\n if (!AudienceHelper.shouldShowAudiences(audiences))\n return;\n\n // 'a' is shorthand for audience\n let { a } = params;\n\n if (!a)\n return;\n\n // Only a single query param was passed, we'll wrap it in an array\n if (typeof a === 'string')\n a = [a];\n\n const normalizeAudienceName = (audienceName: string) => {\n return audienceName.replace(SPACE_REGEX, '').toLowerCase();\n };\n\n // Build an audience lookup\n const audienceLookup = a.reduce((state: HashObject, audienceStr: string) => {\n state[normalizeAudienceName(audienceStr)] = audienceStr;\n return state;\n }, {});\n\n // Filter out our active audience based on whether their name matches the lookup object\n return audiences.filter((audience: PresentationAudience) => {\n return audienceLookup[normalizeAudienceName(audience.name)];\n });\n },\n\n getAudienceParams(audiences: PresentationAudience[]): HashObject {\n if (!audiences?.length)\n return null;\n\n return { a: audiences.map(a => a.name) };\n },\n\n shouldShowAudiences(audiences: PresentationAudience[] = []): boolean {\n if (!audiences)\n return false;\n\n return audiences.length > MIN_AUDIENCE_THRESHOLD;\n }\n};\n","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PlaylistSortType } from 'libs/shared/apps/playlists/enums/PlaylistSortType';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'playlists.playlistSortSelect';\n\nconst getSortTypes = FunctionHelper.memoize(() => {\n return {\n [PlaylistSortType.RecentlyUpdated]: {\n name: LanguageService.getPhrase(namespace, 'recentlyUpdated')\n },\n [PlaylistSortType.AtoZ]: {\n name: LanguageService.getPhrase(namespace, 'atoz')\n },\n [PlaylistSortType.ZtoA]: {\n name: LanguageService.getPhrase(namespace, 'ztoa')\n },\n [PlaylistSortType.Newest]: {\n name: LanguageService.getPhrase(namespace, 'newest')\n },\n [PlaylistSortType.Oldest]: {\n name: LanguageService.getPhrase(namespace, 'oldest')\n }\n };\n});\n\ninterface PlaylistSortSelectProps {\n type: PlaylistSortType;\n getSortAppLink: (sort: PlaylistSortType) => Core.AppLink;\n variant?: ButtonProps['variant'];\n}\n\nPlaylistSortSelect.defaultProps = {\n variant: 'light'\n};\n\nexport function PlaylistSortSelect(props: PlaylistSortSelectProps): JSX.Element {\n const { type, getSortAppLink, variant } = props;\n const sortTypes = getSortTypes();\n\n return (\n <div className='dropdown'>\n <a className={`btn btn-${variant} ms-2 dropdown-toggle`} type='button' id='sort-select' data-bs-toggle='dropdown' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>\n {sortTypes[type].name}\n </a>\n <div className='dropdown-menu dropdown-menu-end dropdown-menu-right' aria-labelledby='sort-select'>\n {Object.values(PlaylistSortType).map(k => {\n let className = 'dropdown-item';\n\n if (k === type)\n className += ' active';\n\n return (\n <AppLink\n key={k}\n className={className}\n appLink={getSortAppLink(k)}\n analyticsData={{\n sort: sortTypes[k].name\n }}\n analyticsOptions={{\n location: LocationContext.PlaylistListHeader,\n entity: EntityType.Playlists,\n actionType: UserAction.Sort,\n workflowPhase: WorkflowPhase.Complete\n }}\n >\n {sortTypes[k].name}\n </AppLink>\n );\n })}\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"playlistMetadata\":\"vv8fW\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './favourites-playlist-item.scss';\n\nconst namespace = 'playlists.favouritesPlaylistItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FavouritesPlaylistItemProps {\n data: VideoTypes[];\n count: number;\n isLoadingCount: boolean;\n}\n\nexport function FavouritesPlaylistItem(props: FavouritesPlaylistItemProps): JSX.Element {\n const analyticsData = {\n name: 'Favourites',\n extraItem: 'user-favourites'\n };\n\n const analyticsOptions = {\n entity: EntityType.Playlist,\n actionType: UserAction.Click,\n location: LocationContext.PlaylistListItem\n };\n\n const coverUrl = ImageUrls.FAVOURITES_PLAYLIST.FAV_PLAYLIST_COVER ;\n const appLink = {\n application: AppChannels.MY_FAVOURITES,\n action: Actions.MyFavourites.MY_FAVOURITES\n };\n\n return (\n <AppLink\n appLink={appLink}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n title={getPhrase('favouritesTitle')}\n >\n <div className='position-relative'>\n <div className={`text-white ${styles.playlistMetadata}`}>\n {!props.isLoadingCount && (\n <span>\n <Text namespace={namespace} phrase='count' options={{ smartCount: props.count }} />\n </span>\n )}\n <h5 className={`mb-0`}><span className='clamp-2'>{getPhrase('favouritesTitle')}</span></h5>\n </div>\n \n <img src={coverUrl} className='w-100 h-100 rounded-3'/>\n </div>\n </AppLink>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, SignUpDescriptors, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\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\nconst namespace = 'playlists.playlistsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface PlaylistEmptyStateProps {\n isStudent: boolean;\n}\n\nexport function PlaylistsEmptyState(props: PlaylistEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLISTS} altText={getPhrase('info')} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase={props.isStudent ? 'studentInfo' : 'info'} /></EmptyState.Info>\n\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'cta')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.NEW_PLAYLIST\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function PlaylistsPublicEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Playlists.PLAYLISTS_PUBLIC} altText={getPhrase('info')} />\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'publicCta')}\n appLink={{\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n }}\n analyticsData={{}}\n analyticsOptions={{\n actionType: UserAction.Click,\n location: LocationContext.PlaylistsLanding,\n entity: EntityType.AppLink,\n workflowPhase: WorkflowPhase.Start,\n descriptor: SignUpDescriptors.SignUp\n }}\n />\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { PartialPlaylistList } from 'libs/shared/apps/playlists/components/playlist-list/PartialPlaylistList';\nimport { PlaylistList } from 'libs/shared/apps/playlists/components/playlist-list/PlaylistList';\nimport { PlaylistSortSelect } from 'libs/shared/apps/playlists/components/sort-select/PlaylistSortSelect';\nimport { PlaylistSortType } from 'libs/shared/apps/playlists/enums/PlaylistSortType';\nimport { PlaylistType } from 'libs/shared/apps/playlists/enums/PlaylistType';\nimport { PlaylistCollectionIdentifier } from 'libs/shared/apps/playlists/interfaces/identifiers/PlaylistCollectionIdentifier';\nimport { PlaylistSortHelper } from 'libs/shared/apps/playlists/utils/PlaylistSortHelper';\nimport { Actions as ActionsComponent } from 'libs/shared/components/actions/Actions';\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { LocalPermissionName, PermissionName } from 'libs/shared/enums/PermissionName';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Playlist } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useFavouritesCount } from 'shared/views/favourites/hooks/useFavouritesCount';\n\nimport { FavouritesPlaylistItem } from 'apps/playlists/components/favourites-playlist-item/FavouritesPlaylistItem';\n\nimport { PlaylistsEmptyState, PlaylistsPublicEmptyState } from './empty-state/PlaylistsEmptyState';\n\nconst namespace = 'playlists.playlists';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getSortAppLink(sort: PlaylistSortType): Core.AppLink {\n return {\n application: AppChannels.PLAYLISTS,\n action: Actions.Playlists.HOME,\n params: {\n sort: sort\n }\n };\n}\n\ninterface PlaylistsViewProps {\n getPlaylistAppLink: (playlist: Playlist) => Core.AppLink;\n sort?: PlaylistSortType;\n}\n\nexport function PlaylistsView(props: PlaylistsViewProps): React.ReactElement {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const { hasLocalPermissions, hasPermissions, isLoaded } = usePermissions();\n\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n \n const audiences = usePresentationAudiences();\n\n const sort = !!user.data && PlaylistSortHelper.getOrSetSortType(user.data.id, props.sort);\n\n const { count, favourites, isLoading } = useFavouritesCount(user.data?.id);\n\n const favouritesPlaylist = {\n count,\n isLoadingCount: isLoading,\n data: favourites\n };\n\n const getPlaylistRequest = !!sort && ((cursor?: string) =>\n PlaylistRequests.getUserPlaylists(new PlaylistCollectionIdentifier(sort, cursor, PlaylistType.All)));\n\n const fetchNext = !!getPlaylistRequest && ((cursor?: string) => {\n Flight.getFetch(dispatch)(getPlaylistRequest(cursor));\n });\n\n useSetPageMetadata({\n title: getPhrase('pageTitle'),\n description: getPhrase('pageDescription')\n });\n\n const shouldFetch = !hasLocalPermissions(LocalPermissionName.ViewPlaylistsLanding) && sort;\n\n const {\n items: playlists,\n hasMore,\n isFetching\n } = useInfiniteList<Playlist>(shouldFetch ? getPlaylistRequest : false, fetchNext, onError);\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n\n const actions = [\n {\n label: getPhrase('createPlaylist'),\n appLink: { application: AppChannels.PLAYLISTS, action: Actions.Playlists.NEW_PLAYLIST },\n svgName: cvSvgLibrary.Plus,\n className: 'btn btn-outline-dark',\n button: true,\n analyticsData: {},\n analyticsOptions: {\n location: LocationContext.Banner,\n entity: EntityType.Playlist,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Create\n }\n }\n ];\n\n const dataLoaded = (\n !!playlists &&\n !!user.data &&\n !!config.data &&\n (!!audiences.data || audiences.hasError) &&\n !!isLoaded\n );\n\n if (hasLocalPermissions(LocalPermissionName.ViewPlaylistsLanding))\n return <PlaylistsPublicEmptyState />;\n\n if (dataLoaded && !favouritesPlaylist.count && !playlists?.length)\n return <PlaylistsEmptyState isStudent={isStudent} />;\n\n return (\n <div className='bg-white px-3'>\n <div className='d-flex justify-content-between align-items-end pb-3'>\n <h1 className='h2 mb-0'><Text namespace={namespace} phrase='headerTitle' /></h1>\n {!!sort &&\n <ActionsComponent\n actions={actions}\n sortComponent={(\n <PlaylistSortSelect\n variant='outline-dark'\n type={sort}\n getSortAppLink={getSortAppLink}\n />\n )}\n />\n }\n </div>\n {dataLoaded\n ? (\n <PlaylistList\n playlists={playlists}\n getPlaylistAppLink={props.getPlaylistAppLink}\n imageCdnUrl={config.data.imageCdnUrl}\n currentUser={user.data}\n presentationAudiences={audiences.data || []}\n bgColourClassNames={BG_COLOUR_CLASS_NAMES}\n itemContainerClassName='columns-of-five'\n itemStyle='round'\n showCount\n showOwner\n extraPlaylistItem={\n favouritesPlaylist.count\n ? <FavouritesPlaylistItem {...favouritesPlaylist}/>\n : null\n }\n />\n ) : <PartialPlaylistList itemClassName='columns-of-five' />\n }\n {(dataLoaded && (hasMore || isFetching)) &&\n <InfiniteScrollFooter isFetching={isFetching} fetchNext={fetchNext} />\n }\n </div>\n );\n}\n","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","\nimport { Flight } from 'libs/common/flight';\n\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { FavouritesCountResponse } from 'libs/shared/interfaces';\n\nexport function useFavouritesCount(userId?: string) {\n// todo there is a beckend bug that we cannot group fetch these three number\n const favouriteVideosCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesVideosCount(userId));\n const favouriteClipsCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesClipsCount(userId));\n const favouriteInteractivesCount = Flight.useBasicFetch<FavouritesCountResponse>(userId &&\n FavouriteRequests.getFavouritesInteractivesCount(userId));\n \n const totalCount = favouriteVideosCount.data?.count\n + favouriteInteractivesCount.data?.count\n + favouriteClipsCount.data?.count;\n\n const favourites = [\n ...(favouriteVideosCount.data?.data || []),\n ...(favouriteClipsCount.data?.data || []),\n ...(favouriteInteractivesCount.data?.data || [])\n ];\n\n return {\n count: totalCount,\n favourites,\n isLoading: !favouriteVideosCount.data?.data\n || !favouriteClipsCount.data?.data\n || !favouriteInteractivesCount.data?.data\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"playlistItem\":\"CaRJx\",\"playlistItemGradient\":\"BI7p2\",\"playlistMetadata\":\"eDk1l\",\"partialHeading\":\"w4lWh\",\"ownerAvatarContainer\":\"JImqE\"};","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["PartialPlaylistList","props","PARTIAL_PLAYLISTS","Array","numItems","className","itemClassName","showHeading","map","p","idx","key","xs","sm","lg","defaultProps","namespace","PlaylistCount","count","playlist","videos","interactives","clips","getCount","Number","isNaN","Text","phrase","options","smartCount","PlaylistOwnerAvatar","_liteOwner","_isClickViewCurated","value","ClickViewAvatar","id","currentUser","toString","url","avatar","Avatar","imageUrl","imageCdnUrl","initials","UserHelper","name","surname","PlaylistItem","ImageHelper","data","cover","size","resizeType","audiences","subjectPresentationAudiences","mergedAudience","presentationAudiences","showImage","showFallbackImage","bgColourClassNames","getBgColorClass","itemStyle","analyticsData","analyticsOptions","entity","AppLink","appLink","title","contentModifiedDate","LanguageService","timeago","DateHelper","getTitle","BaseImage","alt","ImageFallback","type","showCount","titleClassName","length","AudienceLabel","audienceLabelClass","audience","border","showOwner","actionType","location","descriptor","PlaylistList","extraPlaylistItem","itemContainerClassName","playlists","getPlaylistAppLink","itemTitleClassName","Actions","orderedActions","actions","sort","a","b","order","buttonActions","moreActions","forEach","button","push","label","href","onClick","svgName","tooltip","showSpinner","openInNewTab","disabled","iconButton","showBorder","spanHack","sortComponent","dropdownToggleClassName","actionsDropdownClassName","dropdownToggleSvgSize","fetchMore","LazyDropdownItems","style","padding","height","width","getDropdownItemClassName","actionClassName","ActionsDropdownItem","FunctionHelper","action","SvgContainer","e","preventDefault","AnalyticsHelper","role","tabIndex","onKeyDown","ActionsDropdown","isLazy","some","lazyPlaceholder","currentGroup","dropdownToggleId","RandomHelper","showDivider","undefined","group","Tooltip","S","InfiniteScrollFooter","ref","inView","fetchOnScroll","isFetching","fetchNext","nextCursor","Spinner","as","animation","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","SCROLL_TOLERANCE","useInfiniteList","getRequest","onError","getItems","getCursor","scrollContainer","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","hasMore","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","addEventListener","removeEventListener","shouldInitialFetch","httpStatusClass","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useMergeAudiences","sortedAudiences","HAS_NUMBER_REGEX","AudienceStringBuilders","yearsAndGradesBuilder","combinedNames","join","numberList","split","filter","num","wordList","audienceWithoutNum","find","test","prefix","charAt","pop","audienceRange","audienceValues","initialVal","nextVal","i","j","isContinguous","ranges","processAudienceRanges","internationalSecondaryBuilder","englandSecondaryBuilder","scotlandPrimaryBuilder","firstAudience","ArrayHelper","lastAudience","firstAudienceLevel","lastAudienceLevel","internationalPrimaryBuilder","toLowerCase","scotlandSecondaryBuilder","englandPrimaryBuilder","firstAudienceFirstWord","lastAudienceFirstWord","firstAudienceNumber","word","lastAudienceNumber","firstAudienceString","lastAudienceString","DIGIT_REGEX","SPACE_REGEX","AudienceHelper","getSortedPresentationAudiences","objectAudiences","objectAudienceIds","v","presAudience","includes","masterId","getMergedPresentationAudienceString","mergedAudienceString","presentationId","HardCoded","sortMembersWithDuplicateNamesByAudience","members","getLowestAudience","digit","match","lowestAudience","lowestAudienceDigit","nameCountMap","sorted","member","sortedSlice","splice","firstObjLowestAudience","secondObjLowestAudience","comparison","localeCompare","concat","getActiveAudiencesFromParams","params","ObjectHelper","shouldShowAudiences","normalizeAudienceName","audienceName","replace","audienceLookup","reduce","state","audienceStr","getAudienceParams","getSortTypes","PlaylistSortType","PlaylistSortSelect","getSortAppLink","variant","sortTypes","Object","values","k","workflowPhase","getPhrase","FavouritesPlaylistItem","coverUrl","ImageUrls","application","extraItem","isLoadingCount","src","PlaylistsEmptyState","EmptyState","altText","isStudent","text","icon","PlaylistsPublicEmptyState","SignUp","PlaylistsView","dispatch","alerts","usePermissions","hasLocalPermissions","hasPermissions","isLoaded","PermissionName","config","ConfigRequests","user","UserRequests","usePresentationAudiences","PlaylistSortHelper","useFavouritesCount","favourites","favouritesPlaylist","isLoading","getPlaylistRequest","PlaylistRequests","PlaylistCollectionIdentifier","PlaylistType","useSetPageMetadata","description","shouldFetch","pageNumber","httpStatus","error","dataLoaded","hasError","P","redirectOnError","activePresentation","getFallbackPresentation","presentation","userId","favouriteVideosCount","favouriteClipsCount","favouriteInteractivesCount","Row","bsPrefix","Component","decoratedBsPrefix","breakpoints","minBreakpoint","sizePrefix","classes","brkPoint","propValue","cols","infix","displayName","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","parseInt","trim","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","unit"],"sourceRoot":""}