@clickview/streamable-learning 0.48.0-rc.1 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/.vite/manifest.json +605 -605
  2. package/dist/bundles.json +1 -1
  3. package/dist/en.json +1 -1
  4. package/dist/scripts/{CN8PeBwg.chunk.js → BIisq8ZO.chunk.js} +2 -2
  5. package/dist/scripts/{CN8PeBwg.chunk.js.map → BIisq8ZO.chunk.js.map} +1 -1
  6. package/dist/scripts/{BaMNOAYj2.chunk.js → BWU6_pPN2.chunk.js} +2 -2
  7. package/dist/scripts/{BaMNOAYj2.chunk.js.map → BWU6_pPN2.chunk.js.map} +1 -1
  8. package/dist/scripts/{BvJXPFoz2.chunk.js → BcZFo9Vw2.chunk.js} +2 -2
  9. package/dist/scripts/{BvJXPFoz2.chunk.js.map → BcZFo9Vw2.chunk.js.map} +1 -1
  10. package/dist/scripts/Bd2bbHru.chunk.js +1 -0
  11. package/dist/scripts/{CkYqp83j.chunk.js → BfNy0Hvk.chunk.js} +2 -2
  12. package/dist/scripts/{CkYqp83j.chunk.js.map → BfNy0Hvk.chunk.js.map} +1 -1
  13. package/dist/scripts/{D0SYGnyF.chunk.js → BivP7X20.chunk.js} +2 -2
  14. package/dist/scripts/{D0SYGnyF.chunk.js.map → BivP7X20.chunk.js.map} +1 -1
  15. package/dist/scripts/{BihZ4r0z2.chunk.js → BjbY4Fbp2.chunk.js} +3 -3
  16. package/dist/scripts/{BihZ4r0z2.chunk.js.map → BjbY4Fbp2.chunk.js.map} +1 -1
  17. package/dist/scripts/{DO8_mR5i2.chunk.js → BmxcE73n2.chunk.js} +2 -2
  18. package/dist/scripts/{DO8_mR5i2.chunk.js.map → BmxcE73n2.chunk.js.map} +1 -1
  19. package/dist/scripts/{bycmewy72.chunk.js → BnEMhkEE2.chunk.js} +2 -2
  20. package/dist/scripts/{bycmewy72.chunk.js.map → BnEMhkEE2.chunk.js.map} +1 -1
  21. package/dist/scripts/{jWpq99N3.chunk.js → Buc8GegC.chunk.js} +2 -2
  22. package/dist/scripts/{jWpq99N3.chunk.js.map → Buc8GegC.chunk.js.map} +1 -1
  23. package/dist/scripts/{CrCAJmt6.chunk.js → Byczy1lS.chunk.js} +2 -2
  24. package/dist/scripts/{CrCAJmt6.chunk.js.map → Byczy1lS.chunk.js.map} +1 -1
  25. package/dist/scripts/{BZOcEcTA2.chunk.js → C2itEpvc2.chunk.js} +2 -2
  26. package/dist/scripts/{BZOcEcTA2.chunk.js.map → C2itEpvc2.chunk.js.map} +1 -1
  27. package/dist/scripts/{smdLElLq.chunk.js → CEFKXxac.chunk.js} +2 -2
  28. package/dist/scripts/{smdLElLq.chunk.js.map → CEFKXxac.chunk.js.map} +1 -1
  29. package/dist/scripts/{B-qOny0I2.chunk.js → CEYjJAp52.chunk.js} +2 -2
  30. package/dist/scripts/{B-qOny0I2.chunk.js.map → CEYjJAp52.chunk.js.map} +1 -1
  31. package/dist/scripts/{CNJrD44-2.chunk.js → CJSc4YDq2.chunk.js} +2 -2
  32. package/dist/scripts/{CNJrD44-2.chunk.js.map → CJSc4YDq2.chunk.js.map} +1 -1
  33. package/dist/scripts/{Br0Uc4GG.chunk.js → CKUA5J3R.chunk.js} +2 -2
  34. package/dist/scripts/{Br0Uc4GG.chunk.js.map → CKUA5J3R.chunk.js.map} +1 -1
  35. package/dist/scripts/{CWFInhB82.chunk.js → CYrzupmS2.chunk.js} +2 -2
  36. package/dist/scripts/{CWFInhB82.chunk.js.map → CYrzupmS2.chunk.js.map} +1 -1
  37. package/dist/scripts/{Llxar-VU.chunk.js → CcGYZb9f.chunk.js} +2 -2
  38. package/dist/scripts/{Llxar-VU.chunk.js.map → CcGYZb9f.chunk.js.map} +1 -1
  39. package/dist/scripts/{BTYwcYPL2.chunk.js → CeQGaFi-2.chunk.js} +2 -2
  40. package/dist/scripts/{BTYwcYPL2.chunk.js.map → CeQGaFi-2.chunk.js.map} +1 -1
  41. package/dist/scripts/{D7tastET2.chunk.js → Cr3Blj6H2.chunk.js} +2 -2
  42. package/dist/scripts/{D7tastET2.chunk.js.map → Cr3Blj6H2.chunk.js.map} +1 -1
  43. package/dist/scripts/{Dr1flAez.chunk.js → CxCkwLio.chunk.js} +2 -2
  44. package/dist/scripts/{Dr1flAez.chunk.js.map → CxCkwLio.chunk.js.map} +1 -1
  45. package/dist/scripts/{DyT1OGvP2.chunk.js → Cxj75Dqe2.chunk.js} +2 -2
  46. package/dist/scripts/{DyT1OGvP2.chunk.js.map → Cxj75Dqe2.chunk.js.map} +1 -1
  47. package/dist/scripts/{CsC3VVvE2.chunk.js → D-VNmhoM2.chunk.js} +2 -2
  48. package/dist/scripts/{CsC3VVvE2.chunk.js.map → D-VNmhoM2.chunk.js.map} +1 -1
  49. package/dist/scripts/{CKdklY2o2.chunk.js → D2FqnK9m2.chunk.js} +2 -2
  50. package/dist/scripts/{CKdklY2o2.chunk.js.map → D2FqnK9m2.chunk.js.map} +1 -1
  51. package/dist/scripts/{qcrBN1zR2.chunk.js → D3sdyN2Q2.chunk.js} +2 -2
  52. package/dist/scripts/{qcrBN1zR2.chunk.js.map → D3sdyN2Q2.chunk.js.map} +1 -1
  53. package/dist/scripts/{Ce1TZZdV2.chunk.js → D6IzS-bj2.chunk.js} +2 -2
  54. package/dist/scripts/{Ce1TZZdV2.chunk.js.map → D6IzS-bj2.chunk.js.map} +1 -1
  55. package/dist/scripts/{B703cBe72.chunk.js → D8g6nOG92.chunk.js} +2 -2
  56. package/dist/scripts/{B703cBe72.chunk.js.map → D8g6nOG92.chunk.js.map} +1 -1
  57. package/dist/scripts/{CCoZQmgX.chunk.js → DCKKwz9L.chunk.js} +2 -2
  58. package/dist/scripts/{CCoZQmgX.chunk.js.map → DCKKwz9L.chunk.js.map} +1 -1
  59. package/dist/scripts/{DIavEegC.chunk.js → DL4UFxRK.chunk.js} +2 -2
  60. package/dist/scripts/{DIavEegC.chunk.js.map → DL4UFxRK.chunk.js.map} +1 -1
  61. package/dist/scripts/{C5i1HsPp2.chunk.js → DLofRa642.chunk.js} +2 -2
  62. package/dist/scripts/{C5i1HsPp2.chunk.js.map → DLofRa642.chunk.js.map} +1 -1
  63. package/dist/scripts/{B5jBIPaP.chunk.js → DMZ--ok1.chunk.js} +2 -2
  64. package/dist/scripts/{B5jBIPaP.chunk.js.map → DMZ--ok1.chunk.js.map} +1 -1
  65. package/dist/scripts/{CUUUI6pl.chunk.js → DQFcbMMk.chunk.js} +2 -2
  66. package/dist/scripts/{CUUUI6pl.chunk.js.map → DQFcbMMk.chunk.js.map} +1 -1
  67. package/dist/scripts/{Dj4AeYQQ2.chunk.js → DVeqPzBe2.chunk.js} +2 -2
  68. package/dist/scripts/{Dj4AeYQQ2.chunk.js.map → DVeqPzBe2.chunk.js.map} +1 -1
  69. package/dist/scripts/{CGxa1Jzq.chunk.js → DWerltCT.chunk.js} +2 -2
  70. package/dist/scripts/{CGxa1Jzq.chunk.js.map → DWerltCT.chunk.js.map} +1 -1
  71. package/dist/scripts/{CbLL7dIz2.chunk.js → DatscYpA2.chunk.js} +2 -2
  72. package/dist/scripts/{CbLL7dIz2.chunk.js.map → DatscYpA2.chunk.js.map} +1 -1
  73. package/dist/scripts/{DwzBzBlI2.chunk.js → DkaGC5IU2.chunk.js} +2 -2
  74. package/dist/scripts/{DwzBzBlI2.chunk.js.map → DkaGC5IU2.chunk.js.map} +1 -1
  75. package/dist/scripts/{BLrjbrp8.chunk.js → DqZWSPDJ.chunk.js} +2 -2
  76. package/dist/scripts/{BLrjbrp8.chunk.js.map → DqZWSPDJ.chunk.js.map} +1 -1
  77. package/dist/scripts/{BKnxYKDu2.chunk.js → Dql-1E6g2.chunk.js} +2 -2
  78. package/dist/scripts/{BKnxYKDu2.chunk.js.map → Dql-1E6g2.chunk.js.map} +1 -1
  79. package/dist/scripts/{B7iwtSij.chunk.js → DuBHin02.chunk.js} +2 -2
  80. package/dist/scripts/{B7iwtSij.chunk.js.map → DuBHin02.chunk.js.map} +1 -1
  81. package/dist/scripts/{BpgHKWR52.chunk.js → QMuFwiiF2.chunk.js} +2 -2
  82. package/dist/scripts/{BpgHKWR52.chunk.js.map → QMuFwiiF2.chunk.js.map} +1 -1
  83. package/dist/scripts/{Ces-KTwe.chunk.js → U_sIlzAD.chunk.js} +2 -2
  84. package/dist/scripts/{Ces-KTwe.chunk.js.map → U_sIlzAD.chunk.js.map} +1 -1
  85. package/dist/scripts/{ACTQklJQ.chunk.js → WLyOm9Lj.chunk.js} +2 -2
  86. package/dist/scripts/{ACTQklJQ.chunk.js.map → WLyOm9Lj.chunk.js.map} +1 -1
  87. package/dist/scripts/{DR80oZtZ.chunk.js → Ymq7JLkU.chunk.js} +2 -2
  88. package/dist/scripts/{DR80oZtZ.chunk.js.map → Ymq7JLkU.chunk.js.map} +1 -1
  89. package/dist/scripts/{app-BIigh9wv.js → app-gjHxcZG3.js} +4 -4
  90. package/dist/scripts/app-gjHxcZG3.js.map +1 -0
  91. package/dist/scripts/{CNmmq34f.chunk.js → djRnI462.chunk.js} +2 -2
  92. package/dist/scripts/{CNmmq34f.chunk.js.map → djRnI462.chunk.js.map} +1 -1
  93. package/dist/scripts/{oTYyWWB-.chunk.js → e2K2YU7z.chunk.js} +2 -2
  94. package/dist/scripts/{oTYyWWB-.chunk.js.map → e2K2YU7z.chunk.js.map} +1 -1
  95. package/dist/scripts/{BxypZGPK.chunk.js → fnfhCa1P.chunk.js} +2 -2
  96. package/dist/scripts/{BxypZGPK.chunk.js.map → fnfhCa1P.chunk.js.map} +1 -1
  97. package/dist/scripts/{BsAo7Lri2.chunk.js → iyIL3kim2.chunk.js} +2 -2
  98. package/dist/scripts/{BsAo7Lri2.chunk.js.map → iyIL3kim2.chunk.js.map} +1 -1
  99. package/dist/scripts/{DK3xia1t.chunk.js → kfFYr9dc.chunk.js} +2 -2
  100. package/dist/scripts/{DK3xia1t.chunk.js.map → kfFYr9dc.chunk.js.map} +1 -1
  101. package/dist/scripts/{BXJetawx2.chunk.js → kts5xiiM2.chunk.js} +2 -2
  102. package/dist/scripts/{BXJetawx2.chunk.js.map → kts5xiiM2.chunk.js.map} +1 -1
  103. package/dist/scripts/{tYi-sUb22.chunk.js → lLAYbgAy2.chunk.js} +2 -2
  104. package/dist/scripts/{tYi-sUb22.chunk.js.map → lLAYbgAy2.chunk.js.map} +1 -1
  105. package/dist/scripts/{BCBfXCYM2.chunk.js → p9ukva5a2.chunk.js} +2 -2
  106. package/dist/scripts/{BCBfXCYM2.chunk.js.map → p9ukva5a2.chunk.js.map} +1 -1
  107. package/dist/scripts/{DKnZ8BaN.chunk.js → wOeN2ls0.chunk.js} +2 -2
  108. package/dist/scripts/{DKnZ8BaN.chunk.js.map → wOeN2ls0.chunk.js.map} +1 -1
  109. package/dist/scripts/{DU1SE31v2.chunk.js → zp2BHOp82.chunk.js} +2 -2
  110. package/dist/scripts/{DU1SE31v2.chunk.js.map → zp2BHOp82.chunk.js.map} +1 -1
  111. package/dist/scripts/{DnSy_Myx.chunk.js → zyVwH8JF.chunk.js} +2 -2
  112. package/dist/scripts/{DnSy_Myx.chunk.js.map → zyVwH8JF.chunk.js.map} +1 -1
  113. package/package.json +1 -1
  114. package/dist/scripts/C4MLxDS-.chunk.js +0 -1
  115. package/dist/scripts/app-BIigh9wv.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{C as r,E as i,M as a,l as o,lt as s,m as c,n as l,ut as u}from"./Dun43GrB.chunk.js";import{l as d,m as f,r as p,y as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{t as ee}from"./ibuOpDkQ.chunk.js";import{t as te}from"./H6wjCesG.chunk.js";import{c as g,n as _,t as v}from"./8W5MLvcf.chunk.js";import{c as y,i as b}from"./ClfNVaoj2.chunk.js";import{n as x,t as S}from"./D7d5XFW82.chunk.js";import{t as C}from"./DjIdG9LL2.chunk.js";import{t as w}from"./B13dpWxS2.chunk.js";import{n as T}from"./B4z8dIrI2.chunk.js";import{n as E,t as D}from"./B9ir5kiH2.chunk.js";import{w as O}from"./app-BIigh9wv.js";import{i as k,r as ne,t as A}from"./DKnZ8BaN.chunk.js";import{t as j}from"./-l0at5Ll.chunk.js";import{t as M}from"./BTWCXqXm.chunk.js";import{n as N,t as P}from"./tYi-sUb22.chunk.js";var F=t(u(),1),I=function(e){return e.Ok=`Ok`,e.UsernameRequired=`UsernameRequired`,e.EmailRequired=`EmailRequired`,e.FirstnameRequired=`FirstnameRequired`,e.SurnameRequired=`SurnameRequired`,e.YearGroupRequired=`YearGroupRequired`,e.EmailAlreadyExisted=`EmailAlreadyExisted`,e.UsernameAlreadyExisted=`UsernameAlreadyExisted`,e.UserTypeRequired=`UserTypeRequired`,e.MasterYearGroupRequired=`MasterYearGroupRequired`,e.EmptyUserEntity=`EmptyUserEntity`,e.CustomerIdRequired=`CustomerIdRequired`,e.CustomerNotFoundInOnline=`CustomerNotFoundInOnline`,e.EmailTooLong=`EmailTooLong`,e.UsernameTooLong=`UsernameTooLong`,e.FirstnameTooLong=`FirstnameTooLong`,e.SurnameTooLong=`SurnameTooLong`,e.EmailInvalid=`EmailInvalid`,e.EmailInUse=`EmailInUse`,e.UsernameInvalid=`UsernameInvalid`,e.PasswordTooShort=`PasswordTooShort`,e.EmailDuplicated=`EmailDuplicated`,e.UsernameDuplicated=`UsernameDuplicated`,e.DisplayNameTooLong=`DisplayNameTooLong`,e.DisplayNameTooShort=`DisplayNameTooShort`,e.UsernameTooShort=`UsernameTooShort`,e.FirstnameInvalid=`FirstnameInvalid`,e.SurnameInvalid=`SurnameInvalid`,e.UserTypeMismatch=`UserTypeMismatch`,e.UserCanBeAddedInCustomer=`UserCanBeAddedInCustomer`,e.UserCanBeCreated=`UserCanBeCreated`,e.CustomerFoundInOnline=`CustomerFoundInOnline`,e.UserInCustomerWithOnline=`UserInCustomerWithOnline`,e.InvalidUserStatus=`InvalidUserStatus`,e.UserAlreadyExistsInCustomer=`UserAlreadyExistsInCustomer`,e.Rostered=`UserRostered`,e.InvalidYearGroup=`InvalidYearGroup`,e}({}),L=8,R=`userManager.utils`,z={active:T.Active.toLowerCase(),deactivated:T.Disabled.toLowerCase(),pending:T.Inactive.toLowerCase()},B={filterIdenticalEntries(e){let t=e=>[e.firstName?.trim()??``,e.surname?.trim()??``,e.masterYearGroup?.id??``,e.username?.toLowerCase()?.trim()??``,e.email?.toLowerCase()?.trim()??``].join(`:`);return e.filter((e,n,r)=>n===r.findIndex(n=>t(n)===t(e)))},getNewDuplicates(e){if(!e)return null;let t=[],n=[],r={};e.forEach(e=>{if(!e.username){n.push(e);return}if(!r[e.username]){r[e.username]=[e];return}r[e.username].push(e)}),Object.keys(r).map(e=>{if(r[e].length===1){n.push(r[e][0]);return}t.push({errorCodes:[I.UsernameAlreadyExisted],users:r[e]})});let i={};return e.forEach(e=>{if(e.email){if(!i[e.email]){i[e.email]=[e];return}i[e.email].push(e)}}),Object.keys(i).map(e=>{if(i[e].length===1)return;let{username:n}=h.first(i[e]);!n||r[n].length===1?t.push({errorCodes:[I.EmailAlreadyExisted],users:i[e]}):t[t.findIndex(e=>h.first(e.users).username===n)].errorCodes.push(I.EmailAlreadyExisted)}),t},formatCreateOrValidateUserRequest(e,t,n){return{users:e.map(e=>{let r={firstName:e.firstName,email:e.email,surname:e.surname,username:e.username,userType:t,customerId:n,masterRole:e.masterRole||D.User,requirePasswordChange:!1,generatePassword:!!e.generatePassword,password:e.password,displayName:e.displayName||null};return t===E.Learner&&(r.yearGroupId=e.masterYearGroup?.id),r.username||delete r.username,r.password||delete r.password,r.password&&r.generatePassword&&(r.generatePassword=!1),e.userId&&(r.userId=e.userId),r})}},formatEditUserRequest(e){return e.displayName||=null,e},formatDeleteRequest(t,n,r){let i={customerId:t};if(!n.length){let t=e.DeserializeQueryParams(e.GetCurrentQueryString().substring(1));t.query&&(i.searchQuery=t.query);let n=t.status&&(Array.isArray(t.status)?t.status:[t.status]);n?.length&&(i.userStatuses=[],n.forEach(e=>{e===`active`&&i.userStatuses.push(T.Active),e===`deactivated`&&i.userStatuses.push(T.Disabled),e===`pending`&&i.userStatuses.push(T.Inactive)})),t.yearGroup&&(i.yearGroupValues=Array.isArray(t.yearGroup)?t.yearGroup:[t.yearGroup])}return Object.keys(i).length===1?i.userIds=n.map(e=>e.id):i.userType=r,i},formatToggleStatusRequest(e,t,n){return{customerId:t,users:[{userId:e.id,status:n}]}},getErrorMessages(e,t,r,i){let a={},o=n.encloseNamespace(`userManager.utils`),s={[I.Ok]:``,[I.UsernameRequired]:``,[I.EmailRequired]:o(`emailRequired`),[I.FirstnameRequired]:o(`nameRequired`),[I.SurnameRequired]:o(`surnameRequired`),[I.YearGroupRequired]:o(`yearGroupRequired`),[I.EmailAlreadyExisted]:o(r?`emailExistsShort`:`emailExistsLong`),[I.UsernameAlreadyExisted]:o(r?`usernameExistsShort`:`usernameExistsLong`),[I.UserTypeRequired]:``,[I.MasterYearGroupRequired]:o(`yearGroupRequired`),[I.EmptyUserEntity]:``,[I.CustomerIdRequired]:``,[I.CustomerNotFoundInOnline]:``,[I.EmailTooLong]:o(`emailExceeds`),[I.UsernameTooLong]:o(`usernameExceeds`),[I.FirstnameTooLong]:o(`nameExceeds`),[I.SurnameTooLong]:o(`surnameExceeds`),[I.EmailInvalid]:o(r?`emailInvalidShort`:`emailInvalidLong`),[I.EmailInUse]:o(r?`emailExistsShort`:`emailExistsLong`),[I.UsernameInvalid]:o(r?`usernameInvalidShort`:`usernameInvalidLong`),[I.PasswordTooShort]:o(r?`passwordTooShortShort`:`passwordTooShortLong`,{minLength:t}),[I.EmailDuplicated]:``,[I.UsernameDuplicated]:``,[I.DisplayNameTooLong]:o(`displayNameExceeds`),[I.DisplayNameTooShort]:o(`displayNameTooShort`),[I.UsernameTooShort]:o(`usernameTooShort`),[I.FirstnameInvalid]:o(`firstNameInvalid`),[I.SurnameInvalid]:o(`surnameInvalid`),[I.CustomerFoundInOnline]:o(`support`),[I.UserInCustomerWithOnline]:o(`support`),[I.InvalidUserStatus]:o(`support`),[I.UserTypeMismatch]:``,[I.UserCanBeAddedInCustomer]:``,[I.UserCanBeCreated]:``,[I.UserAlreadyExistsInCustomer]:``,[I.Rostered]:``,[I.InvalidYearGroup]:o(`invalidYearGroupError`)},c={[I.Ok]:``,[I.UsernameRequired]:``,[I.EmailRequired]:`email`,[I.FirstnameRequired]:`firstName`,[I.SurnameRequired]:`surname`,[I.YearGroupRequired]:`masterYearGroup`,[I.EmailAlreadyExisted]:`email`,[I.UsernameAlreadyExisted]:`username`,[I.UserTypeRequired]:``,[I.MasterYearGroupRequired]:`masterYearGroup`,[I.EmptyUserEntity]:``,[I.CustomerIdRequired]:``,[I.CustomerNotFoundInOnline]:``,[I.EmailTooLong]:`email`,[I.UsernameTooLong]:`username`,[I.FirstnameTooLong]:`firstName`,[I.SurnameTooLong]:`surname`,[I.EmailInvalid]:`email`,[I.EmailInUse]:`email`,[I.UsernameInvalid]:`username`,[I.PasswordTooShort]:`password`,[I.EmailDuplicated]:``,[I.UsernameDuplicated]:``,[I.DisplayNameTooLong]:`displayName`,[I.DisplayNameTooShort]:`displayName`,[I.UsernameTooShort]:`username`,[I.FirstnameInvalid]:`firstName`,[I.SurnameInvalid]:`surname`,[I.UserTypeMismatch]:`email`,[I.UserCanBeAddedInCustomer]:`email`,[I.UserCanBeCreated]:`email`,[I.CustomerFoundInOnline]:`email`,[I.UserInCustomerWithOnline]:`email`,[I.InvalidUserStatus]:`email`,[I.UserAlreadyExistsInCustomer]:`email`,[I.Rostered]:`email`,[I.InvalidYearGroup]:`masterYearGroup`};return e.forEach(e=>{let t=i?.[e]??s[e]??``;if(!t)return;let n=c[e];n&&(a[n]=i?.[e]?.[n]??t)}),a},showEmptyState(e,t){if(!e.data)return!1;let n=Object.keys(t).length;return`results`in e.data||n?!1:!e.data.data?.length},getFilters(e,t,n,r){let i=[_.SortBy(v.getNameSortOptions())];return t===E.Learner&&n?.length>1&&i.push(_.YearGroup(v.getYearGroupOptions(n))),i.push(_.Status()),t===E.Staff&&i.push(_.IsAdmin(e,r)),i},getMinimumPasswordLength(e,t,n){if(!e)return L;let r=e.securitySettings?.find(e=>e.userRole===n&&e.userType===t);return r?r.minPasswordLength:n===D.Admin||n===D.SuperAdmin?e.defaultAdminMinPasswordLength:e.defaultMinPasswordLength},mapStatusParamsToValue(e){if(!e)return;let t=e=>{switch(e){case`active`:return T.Active;case`deactivated`:return T.Disabled;case`pending`:return T.Inactive}};return Array.isArray(e)?e.map(t):[t(e)]},buildSearchData({customerId:e,userId:t,userType:n,queryParams:r={}}){let i=B.buildSearchFiltersData(e,n,r),a=B.buildSearchSortData(e,r);return{query:r.query,indices:[`user`],searchType:`user`,customerIdOverride:e,userId:t,customerId:e,filters:i,sorts:a}},buildSearchDataAndKey({customerId:e,userId:t,userType:n,queryParams:r,cursor:i}){let o=B.buildSearchData({customerId:e,userId:t||``,userType:n,queryParams:r||{}});i&&(o.cursor=i);let s=`search:users:${i||``}`;return s+=a.flattenObjectToString(o),{key:s,data:o}},buildSearchParams(e,t,n={}){let r=B.buildSearchFiltersObject(e,t,n);return r=Object.keys(r).reduce((e,t)=>(e[`${g.FILTER_PARAM_PREFIX}${t}`]=r[t],e),{}),{query:n.query,index:`user`,customerIdOverride:e,...r}},buildSearchSortData(e,t={}){let n={};if(t.sort)switch(t.sort){case`first-name-atoz`:n.firstName=`asc`;break;case`first-name-ztoa`:n.firstName=`desc`;break;case`surname-atoz`:n.surname=`asc`;break;case`surname-ztoa`:n.surname=`desc`;break;case`newest`:n.userProfile={customerId:e,fieldOrders:{dateCreated:`desc`}};break;case`oldest`:n.userProfile={customerId:e,fieldOrders:{dateCreated:`asc`}};break;default:break}else n.userProfile={customerId:e,fieldOrders:{dateCreated:`desc`}};return n},buildSearchFiltersData(e,t,n={}){let r={userType:t.toLowerCase()};return r.userProfile={customerId:e},n.isAdmin===`true`&&(r.userProfile.role=[D.Admin.toLowerCase(),D.SuperAdmin.toLowerCase()]),n.yearGroup&&(r.yearGroup={customerId:e},Array.isArray(n.yearGroup)?r.yearGroup.value=n.yearGroup:r.yearGroup.value=[n.yearGroup]),n.status&&(Array.isArray(n.status)?r.userProfile.status=n.status.map(e=>z[e]):r.userProfile.status=[z[n.status]]),r},buildSearchFiltersObject(e,t,n={}){let r={userType:t.toLowerCase(),customerId:e.toString()};return n.isAdmin===`true`&&(r.userRole=D.Admin.toLowerCase()),n.yearGroup&&(Array.isArray(n.yearGroup)?r.yearGroup=`${n.yearGroup.join(`,`)}`:r.yearGroup=n.yearGroup),n.status&&(Array.isArray(n.status)?r.userProfileStatus=n.status.map(e=>z[e]).join(`,`):r.userProfileStatus=z[n.status]),r},buildGetUsersQuery(e,t={}){let{yearGroup:n=``,status:r=``,isAdmin:i=``,sort:a=`newest`}=t,o=[`usertype:${e}`];if(n&&(Array.isArray(n)?o.push(`yeargroups.value:[${n.join(`,`)}]`):o.push(`yeargroups.value:${n}`)),i===`true`&&o.push(`userprofiles.role:${D.Admin}`),r&&(Array.isArray(r)?o.push(`status:[${r.map(e=>z[e]).join(`,`)}]`):o.push(`status:${z[r]}`)),a)switch(a){case`first-name-atoz`:o.push(`orderby:name`);break;case`first-name-ztoa`:o.push(`orderbydesc:name`);break;case`surname-atoz`:o.push(`orderby:surname`);break;case`surname-ztoa`:o.push(`orderbydesc:surname`);break;case`newest`:o.push(`orderbydesc:timestamp`);break;case`oldest`:o.push(`orderby:timestamp`);break;default:break}return`{${o.join(`,`)}}avatar`},shouldDisplayAuthenticationMethods(e){return!e?.length||!h.first(e).authenticationMethods?.length?!1:!!e.find(e=>!!e.authenticationMethods?.find(e=>!e.local))},handleAsyncErrors(e,t,r,i){let a=e?.[0]?.errorCodes;if(!a?.length)return!0;let o={};return(a.includes(I.EmailAlreadyExisted)||a.includes(I.EmailInUse))&&(!r||r.email!==t.email)&&(o.email=n.getPhrase(R,`emailExistsLong`)),a.includes(I.UsernameAlreadyExisted)&&(!r||r.username!==t.username)&&(o.username=n.getPhrase(R,`usernameExistsLong`)),Object.keys(o).length?(i({errors:o}),!1):!0},getInitialErrorsForInvalidYearGroups(e){return!e||e.value===0?{masterYearGroup:n.getPhrase(R,`yearGroupRequired`)}:{}}},V=t(ne(),1),H=`settings.emailSettings`,U=(0,V.object)().shape({email:(0,V.string)().required(()=>n.getPhrase(H,`emailRequired`)).email(()=>n.getPhrase(H,`emailInvalid`)).trim().default(``)}),W=s();function re(){return(0,W.jsx)(j,{children:(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,children:(0,W.jsx)(`path`,{d:`M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z`})})})}var G=`settings.emailSettings`,K=n.encloseNamespace(G);function ie(e){let t=w(O.MDDown),[n,r]=F.useState(!t),i=e.currentUser.emailVerified;return F.useEffect(()=>{!t&&!n&&r(!0)},[t,n]),(0,W.jsxs)(S.Provider,{value:G,children:[(0,W.jsxs)(`h2`,{className:`h4 d-flex align-items-center`,children:[(0,W.jsx)(x,{phrase:`heading`}),i&&(0,W.jsxs)(`span`,{className:`font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2`,children:[(0,W.jsx)(x,{phrase:`verified`}),(0,W.jsx)(re,{})]})]}),i&&(0,W.jsx)(`p`,{children:(0,W.jsx)(x,{phrase:`info`,options:{email:e.currentUser.email}})}),n?(0,W.jsx)(k,{initialValues:{email:e.currentUser.email||``},onSubmit:e.onChangeEmail,validationSchema:U,children:(0,W.jsxs)(b,{children:[(0,W.jsx)(A,{className:`w-75`,name:`email`,placeholder:K(`emailPlaceholder`),autoComplete:`email`}),(0,W.jsxs)(`div`,{className:`d-flex justify-content-end w-75 ${t?`ms-n2`:``}`,children:[t&&(0,W.jsx)(`button`,{type:`button`,className:`btn btn-link me-2`,onClick:()=>r(!1),children:(0,W.jsx)(x,{phrase:`cancel`})}),(0,W.jsx)(M,{isNew:!1,submitText:K(i?`updateEmail`:`verifyEmail`),variant:i?`outline-dark`:`dark`})]})]})}):(0,W.jsx)(W.Fragment,{children:(0,W.jsx)(`div`,{className:`d-flex`,children:(0,W.jsx)(`button`,{className:`btn btn-outline-dark me-2`,onClick:()=>r(!0),children:(0,W.jsx)(x,{phrase:`change`})})})})]})}var q={partialLabel:`_partialLabel_1h6pk_1`,partialInfo:`_partialInfo_1h6pk_5`,partialInput:`_partialInput_1h6pk_10`,partialSubmit:`_partialSubmit_1h6pk_14`,partialNote:`_partialNote_1h6pk_18`};function ae(){return(0,W.jsxs)(`div`,{className:`w-50`,children:[(0,W.jsx)(`div`,{className:`partial-loading-background mb-2 ${q.partialLabel}`}),(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialInfo}`}),(0,W.jsx)(`div`,{className:`form-group`,children:(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialInput}`})}),(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialSubmit}`}),(0,W.jsx)(`div`,{className:`partial-loading-background mt-2 ${q.partialNote}`})]})}var J=`shared.changePasswordForm`,Y=n.encloseNamespace(J);X.defaultProps={submitVariant:`outline-dark`,buttonContainerClass:`btn-container d-flex justify-content-end align-items-center`,inputWidthClass:`w-100`};function X(e){let t=y();return(0,W.jsxs)(b,{children:[!e.hideCurrentPassword&&(0,W.jsx)(A,{className:e.inputWidthClass,name:`currentPassword`,label:Y(`currentPassword`),placeholder:Y(`currentPasswordPlaceholder`),type:`password`,autoComplete:`current-password`,showRequiredStar:!0}),(0,W.jsx)(A,{className:e.inputWidthClass,name:`newPassword`,label:Y(`newPassword`),placeholder:Y(`newPasswordPlaceholder`),type:`password`,autoComplete:`new-password`,showRequiredStar:!0}),(0,W.jsx)(A,{className:e.inputWidthClass,name:`confirmPassword`,label:Y(`confirmPassword`),placeholder:Y(`confirmPasswordPlaceholder`),type:`password`,autoComplete:`off`,showRequiredStar:!0}),e.showChangeOnNextLogin&&(0,W.jsx)(A,{id:`changeOnNextLogin`,name:`changeOnNextLogin`,label:Y(`changeOnNextLogin`),type:`checkbox`,checked:t.values.changeOnNextLogin,checkboxLabelFontWeight:`normal`}),!e.hideButtons&&(0,W.jsxs)(`div`,{className:e.buttonContainerClass,children:[!e.hideCancelButton&&!!e.onClickCancel&&(0,W.jsx)(`button`,{type:`button`,className:`btn btn-link me-2 ${e.buttonSize===`lg`?`btn-lg`:``}`,onClick:e.onClickCancel,children:(0,W.jsx)(x,{namespace:J,phrase:`cancel`})}),(0,W.jsx)(M,{isNew:!1,submitText:e.submitText||Y(`save`),variant:e.submitVariant,size:e.buttonSize})]})]})}var Z=n.encloseNamespace(`settings.passwordSettings`),oe=e=>(0,V.object)().shape({currentPassword:(0,V.string)().required(()=>Z(`currentPasswordRequired`)).trim().default(``),newPassword:(0,V.string)().required(()=>Z(`newPasswordRequired`)).min(e,()=>Z(`newPasswordMinLength`,{minLen:e})).trim().default(``),confirmPassword:(0,V.string)().required(()=>Z(`confirmPasswordRequired`)).oneOf([(0,V.ref)(`newPassword`),null],()=>Z(`passwordsDontMatch`)).trim().default(``)}),Q=`settings.passwordSettings`,se={currentPassword:``,newPassword:``,confirmPassword:``};function ce(e){let t=w(O.MDDown),[r,i]=F.useState(!t);F.useEffect(()=>{!t&&!r&&i(!0)},[t,r]);function a(t,n){e.onChangePassword(t,n,()=>n({reset:!0}))}return(0,W.jsxs)(S.Provider,{value:Q,children:[(0,W.jsx)(`h2`,{className:`h4`,children:(0,W.jsx)(x,{phrase:`heading`})}),r?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`p`,{children:(0,W.jsx)(x,{phrase:`info`})}),(0,W.jsx)(k,{initialValues:se,onSubmit:a,validationSchema:oe(e.minPasswordLength),children:(0,W.jsx)(X,{onClickCancel:()=>i(!1),hideCancelButton:!t,submitText:n.getPhrase(Q,`savePassword`),buttonContainerClass:t?`d-flex justify-content-end ms-n2 w-75`:`d-flex justify-content-end w-75`,inputWidthClass:`w-75`})})]}):(0,W.jsx)(`button`,{className:`btn btn-outline-dark `,onClick:()=>i(!0),children:(0,W.jsx)(x,{phrase:`change`})})]})}var le={getCustomerSecuritySettings(e,t,n){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:`customers:security:settings`,normalize:!1,success:t,error:n}},setCustomerSecuritySettings(e,t,n,r){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:`update:security:settings`,invalidationKeys:`customers:security:settings`,type:m.PUT,normalize:!1,data:t,success:n,error:r}}},$=n.encloseNamespace(`settings.accountSettings`);function ue(){let e=f(),t=te(),n=w(O.MDDown),a=d(ee.currentUser()),s=d(a.data&&P.getUser(a.data.id)),u=d(a.data&&le.getCustomerSecuritySettings(a.data.customerId));C({title:$(`heading`)});function m(n,s){p(e,P.changeEmail(n.email,()=>{l.logUserAction({id:a.data.id,oldEmail:a.data.email,newEmail:n.email},{actionType:r.VerifyEmail,entity:o.User,location:c.Settings,workflowPhase:i.Start}),t.success($(`changeEmailRequestSuccess`,{email:n.email,escapeText:!0}))},()=>{t.error($(`changeEmailRequestError`))},s))}function h(n,s,u){p(e,P.changePassword(n,()=>{l.logUserAction({id:a.data.id,oldPassword:n.currentPassword,newPassword:n.newPassword},{actionType:r.ChangePassword,entity:o.User,location:c.Settings,workflowPhase:i.Complete}),t.success($(`changePasswordSuccess`)),u()},({responseJSON:e})=>{e.errorCode===`user.password-too-short`?t.error($(`changePasswordRequirementsError`)):e.errorCode===`user.invalid-password`?t.error($(`changePasswordInvalid`)):e.errorCode===`user.same-password`?t.error($(`changePasswordSame`)):e.errorCode===`user.locked-out`?t.error($(`changePasswordLockedOut`)):t.error($(`changePasswordError`))},s))}let g=B.getMinimumPasswordLength(u.data,s.data?.userType,a.data.role);return(0,W.jsxs)(N,{heading:$(`heading`),breadcrumbs:[$(`breadcrumb`)],children:[(0,W.jsx)(`div`,{className:n?`w-100`:`w-50`,children:a.data?(0,W.jsx)(ie,{currentUser:a.data,onChangeEmail:m}):(0,W.jsx)(ae,{})}),(0,W.jsx)(`hr`,{}),(0,W.jsx)(`div`,{className:n?`w-100`:`w-50`,children:u.data&&(0,W.jsx)(ce,{onChangePassword:h,minPasswordLength:g})})]})}export{ue as AccountSettingsView};
2
- //# sourceMappingURL=CNJrD44-2.chunk.js.map
1
+ import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{C as r,E as i,M as a,l as o,lt as s,m as c,n as l,ut as u}from"./Dun43GrB.chunk.js";import{l as d,m as f,r as p,y as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{t as ee}from"./ibuOpDkQ.chunk.js";import{t as te}from"./H6wjCesG.chunk.js";import{c as g,n as _,t as v}from"./8W5MLvcf.chunk.js";import{c as y,i as b}from"./ClfNVaoj2.chunk.js";import{n as x,t as S}from"./D7d5XFW82.chunk.js";import{t as C}from"./DjIdG9LL2.chunk.js";import{t as w}from"./B13dpWxS2.chunk.js";import{n as T}from"./B4z8dIrI2.chunk.js";import{n as E,t as D}from"./B9ir5kiH2.chunk.js";import{w as O}from"./app-gjHxcZG3.js";import{i as k,r as ne,t as A}from"./wOeN2ls0.chunk.js";import{t as j}from"./-l0at5Ll.chunk.js";import{t as M}from"./BTWCXqXm.chunk.js";import{n as N,t as P}from"./lLAYbgAy2.chunk.js";var F=t(u(),1),I=function(e){return e.Ok=`Ok`,e.UsernameRequired=`UsernameRequired`,e.EmailRequired=`EmailRequired`,e.FirstnameRequired=`FirstnameRequired`,e.SurnameRequired=`SurnameRequired`,e.YearGroupRequired=`YearGroupRequired`,e.EmailAlreadyExisted=`EmailAlreadyExisted`,e.UsernameAlreadyExisted=`UsernameAlreadyExisted`,e.UserTypeRequired=`UserTypeRequired`,e.MasterYearGroupRequired=`MasterYearGroupRequired`,e.EmptyUserEntity=`EmptyUserEntity`,e.CustomerIdRequired=`CustomerIdRequired`,e.CustomerNotFoundInOnline=`CustomerNotFoundInOnline`,e.EmailTooLong=`EmailTooLong`,e.UsernameTooLong=`UsernameTooLong`,e.FirstnameTooLong=`FirstnameTooLong`,e.SurnameTooLong=`SurnameTooLong`,e.EmailInvalid=`EmailInvalid`,e.EmailInUse=`EmailInUse`,e.UsernameInvalid=`UsernameInvalid`,e.PasswordTooShort=`PasswordTooShort`,e.EmailDuplicated=`EmailDuplicated`,e.UsernameDuplicated=`UsernameDuplicated`,e.DisplayNameTooLong=`DisplayNameTooLong`,e.DisplayNameTooShort=`DisplayNameTooShort`,e.UsernameTooShort=`UsernameTooShort`,e.FirstnameInvalid=`FirstnameInvalid`,e.SurnameInvalid=`SurnameInvalid`,e.UserTypeMismatch=`UserTypeMismatch`,e.UserCanBeAddedInCustomer=`UserCanBeAddedInCustomer`,e.UserCanBeCreated=`UserCanBeCreated`,e.CustomerFoundInOnline=`CustomerFoundInOnline`,e.UserInCustomerWithOnline=`UserInCustomerWithOnline`,e.InvalidUserStatus=`InvalidUserStatus`,e.UserAlreadyExistsInCustomer=`UserAlreadyExistsInCustomer`,e.Rostered=`UserRostered`,e.InvalidYearGroup=`InvalidYearGroup`,e}({}),L=8,R=`userManager.utils`,z={active:T.Active.toLowerCase(),deactivated:T.Disabled.toLowerCase(),pending:T.Inactive.toLowerCase()},B={filterIdenticalEntries(e){let t=e=>[e.firstName?.trim()??``,e.surname?.trim()??``,e.masterYearGroup?.id??``,e.username?.toLowerCase()?.trim()??``,e.email?.toLowerCase()?.trim()??``].join(`:`);return e.filter((e,n,r)=>n===r.findIndex(n=>t(n)===t(e)))},getNewDuplicates(e){if(!e)return null;let t=[],n=[],r={};e.forEach(e=>{if(!e.username){n.push(e);return}if(!r[e.username]){r[e.username]=[e];return}r[e.username].push(e)}),Object.keys(r).map(e=>{if(r[e].length===1){n.push(r[e][0]);return}t.push({errorCodes:[I.UsernameAlreadyExisted],users:r[e]})});let i={};return e.forEach(e=>{if(e.email){if(!i[e.email]){i[e.email]=[e];return}i[e.email].push(e)}}),Object.keys(i).map(e=>{if(i[e].length===1)return;let{username:n}=h.first(i[e]);!n||r[n].length===1?t.push({errorCodes:[I.EmailAlreadyExisted],users:i[e]}):t[t.findIndex(e=>h.first(e.users).username===n)].errorCodes.push(I.EmailAlreadyExisted)}),t},formatCreateOrValidateUserRequest(e,t,n){return{users:e.map(e=>{let r={firstName:e.firstName,email:e.email,surname:e.surname,username:e.username,userType:t,customerId:n,masterRole:e.masterRole||D.User,requirePasswordChange:!1,generatePassword:!!e.generatePassword,password:e.password,displayName:e.displayName||null};return t===E.Learner&&(r.yearGroupId=e.masterYearGroup?.id),r.username||delete r.username,r.password||delete r.password,r.password&&r.generatePassword&&(r.generatePassword=!1),e.userId&&(r.userId=e.userId),r})}},formatEditUserRequest(e){return e.displayName||=null,e},formatDeleteRequest(t,n,r){let i={customerId:t};if(!n.length){let t=e.DeserializeQueryParams(e.GetCurrentQueryString().substring(1));t.query&&(i.searchQuery=t.query);let n=t.status&&(Array.isArray(t.status)?t.status:[t.status]);n?.length&&(i.userStatuses=[],n.forEach(e=>{e===`active`&&i.userStatuses.push(T.Active),e===`deactivated`&&i.userStatuses.push(T.Disabled),e===`pending`&&i.userStatuses.push(T.Inactive)})),t.yearGroup&&(i.yearGroupValues=Array.isArray(t.yearGroup)?t.yearGroup:[t.yearGroup])}return Object.keys(i).length===1?i.userIds=n.map(e=>e.id):i.userType=r,i},formatToggleStatusRequest(e,t,n){return{customerId:t,users:[{userId:e.id,status:n}]}},getErrorMessages(e,t,r,i){let a={},o=n.encloseNamespace(`userManager.utils`),s={[I.Ok]:``,[I.UsernameRequired]:``,[I.EmailRequired]:o(`emailRequired`),[I.FirstnameRequired]:o(`nameRequired`),[I.SurnameRequired]:o(`surnameRequired`),[I.YearGroupRequired]:o(`yearGroupRequired`),[I.EmailAlreadyExisted]:o(r?`emailExistsShort`:`emailExistsLong`),[I.UsernameAlreadyExisted]:o(r?`usernameExistsShort`:`usernameExistsLong`),[I.UserTypeRequired]:``,[I.MasterYearGroupRequired]:o(`yearGroupRequired`),[I.EmptyUserEntity]:``,[I.CustomerIdRequired]:``,[I.CustomerNotFoundInOnline]:``,[I.EmailTooLong]:o(`emailExceeds`),[I.UsernameTooLong]:o(`usernameExceeds`),[I.FirstnameTooLong]:o(`nameExceeds`),[I.SurnameTooLong]:o(`surnameExceeds`),[I.EmailInvalid]:o(r?`emailInvalidShort`:`emailInvalidLong`),[I.EmailInUse]:o(r?`emailExistsShort`:`emailExistsLong`),[I.UsernameInvalid]:o(r?`usernameInvalidShort`:`usernameInvalidLong`),[I.PasswordTooShort]:o(r?`passwordTooShortShort`:`passwordTooShortLong`,{minLength:t}),[I.EmailDuplicated]:``,[I.UsernameDuplicated]:``,[I.DisplayNameTooLong]:o(`displayNameExceeds`),[I.DisplayNameTooShort]:o(`displayNameTooShort`),[I.UsernameTooShort]:o(`usernameTooShort`),[I.FirstnameInvalid]:o(`firstNameInvalid`),[I.SurnameInvalid]:o(`surnameInvalid`),[I.CustomerFoundInOnline]:o(`support`),[I.UserInCustomerWithOnline]:o(`support`),[I.InvalidUserStatus]:o(`support`),[I.UserTypeMismatch]:``,[I.UserCanBeAddedInCustomer]:``,[I.UserCanBeCreated]:``,[I.UserAlreadyExistsInCustomer]:``,[I.Rostered]:``,[I.InvalidYearGroup]:o(`invalidYearGroupError`)},c={[I.Ok]:``,[I.UsernameRequired]:``,[I.EmailRequired]:`email`,[I.FirstnameRequired]:`firstName`,[I.SurnameRequired]:`surname`,[I.YearGroupRequired]:`masterYearGroup`,[I.EmailAlreadyExisted]:`email`,[I.UsernameAlreadyExisted]:`username`,[I.UserTypeRequired]:``,[I.MasterYearGroupRequired]:`masterYearGroup`,[I.EmptyUserEntity]:``,[I.CustomerIdRequired]:``,[I.CustomerNotFoundInOnline]:``,[I.EmailTooLong]:`email`,[I.UsernameTooLong]:`username`,[I.FirstnameTooLong]:`firstName`,[I.SurnameTooLong]:`surname`,[I.EmailInvalid]:`email`,[I.EmailInUse]:`email`,[I.UsernameInvalid]:`username`,[I.PasswordTooShort]:`password`,[I.EmailDuplicated]:``,[I.UsernameDuplicated]:``,[I.DisplayNameTooLong]:`displayName`,[I.DisplayNameTooShort]:`displayName`,[I.UsernameTooShort]:`username`,[I.FirstnameInvalid]:`firstName`,[I.SurnameInvalid]:`surname`,[I.UserTypeMismatch]:`email`,[I.UserCanBeAddedInCustomer]:`email`,[I.UserCanBeCreated]:`email`,[I.CustomerFoundInOnline]:`email`,[I.UserInCustomerWithOnline]:`email`,[I.InvalidUserStatus]:`email`,[I.UserAlreadyExistsInCustomer]:`email`,[I.Rostered]:`email`,[I.InvalidYearGroup]:`masterYearGroup`};return e.forEach(e=>{let t=i?.[e]??s[e]??``;if(!t)return;let n=c[e];n&&(a[n]=i?.[e]?.[n]??t)}),a},showEmptyState(e,t){if(!e.data)return!1;let n=Object.keys(t).length;return`results`in e.data||n?!1:!e.data.data?.length},getFilters(e,t,n,r){let i=[_.SortBy(v.getNameSortOptions())];return t===E.Learner&&n?.length>1&&i.push(_.YearGroup(v.getYearGroupOptions(n))),i.push(_.Status()),t===E.Staff&&i.push(_.IsAdmin(e,r)),i},getMinimumPasswordLength(e,t,n){if(!e)return L;let r=e.securitySettings?.find(e=>e.userRole===n&&e.userType===t);return r?r.minPasswordLength:n===D.Admin||n===D.SuperAdmin?e.defaultAdminMinPasswordLength:e.defaultMinPasswordLength},mapStatusParamsToValue(e){if(!e)return;let t=e=>{switch(e){case`active`:return T.Active;case`deactivated`:return T.Disabled;case`pending`:return T.Inactive}};return Array.isArray(e)?e.map(t):[t(e)]},buildSearchData({customerId:e,userId:t,userType:n,queryParams:r={}}){let i=B.buildSearchFiltersData(e,n,r),a=B.buildSearchSortData(e,r);return{query:r.query,indices:[`user`],searchType:`user`,customerIdOverride:e,userId:t,customerId:e,filters:i,sorts:a}},buildSearchDataAndKey({customerId:e,userId:t,userType:n,queryParams:r,cursor:i}){let o=B.buildSearchData({customerId:e,userId:t||``,userType:n,queryParams:r||{}});i&&(o.cursor=i);let s=`search:users:${i||``}`;return s+=a.flattenObjectToString(o),{key:s,data:o}},buildSearchParams(e,t,n={}){let r=B.buildSearchFiltersObject(e,t,n);return r=Object.keys(r).reduce((e,t)=>(e[`${g.FILTER_PARAM_PREFIX}${t}`]=r[t],e),{}),{query:n.query,index:`user`,customerIdOverride:e,...r}},buildSearchSortData(e,t={}){let n={};if(t.sort)switch(t.sort){case`first-name-atoz`:n.firstName=`asc`;break;case`first-name-ztoa`:n.firstName=`desc`;break;case`surname-atoz`:n.surname=`asc`;break;case`surname-ztoa`:n.surname=`desc`;break;case`newest`:n.userProfile={customerId:e,fieldOrders:{dateCreated:`desc`}};break;case`oldest`:n.userProfile={customerId:e,fieldOrders:{dateCreated:`asc`}};break;default:break}else n.userProfile={customerId:e,fieldOrders:{dateCreated:`desc`}};return n},buildSearchFiltersData(e,t,n={}){let r={userType:t.toLowerCase()};return r.userProfile={customerId:e},n.isAdmin===`true`&&(r.userProfile.role=[D.Admin.toLowerCase(),D.SuperAdmin.toLowerCase()]),n.yearGroup&&(r.yearGroup={customerId:e},Array.isArray(n.yearGroup)?r.yearGroup.value=n.yearGroup:r.yearGroup.value=[n.yearGroup]),n.status&&(Array.isArray(n.status)?r.userProfile.status=n.status.map(e=>z[e]):r.userProfile.status=[z[n.status]]),r},buildSearchFiltersObject(e,t,n={}){let r={userType:t.toLowerCase(),customerId:e.toString()};return n.isAdmin===`true`&&(r.userRole=D.Admin.toLowerCase()),n.yearGroup&&(Array.isArray(n.yearGroup)?r.yearGroup=`${n.yearGroup.join(`,`)}`:r.yearGroup=n.yearGroup),n.status&&(Array.isArray(n.status)?r.userProfileStatus=n.status.map(e=>z[e]).join(`,`):r.userProfileStatus=z[n.status]),r},buildGetUsersQuery(e,t={}){let{yearGroup:n=``,status:r=``,isAdmin:i=``,sort:a=`newest`}=t,o=[`usertype:${e}`];if(n&&(Array.isArray(n)?o.push(`yeargroups.value:[${n.join(`,`)}]`):o.push(`yeargroups.value:${n}`)),i===`true`&&o.push(`userprofiles.role:${D.Admin}`),r&&(Array.isArray(r)?o.push(`status:[${r.map(e=>z[e]).join(`,`)}]`):o.push(`status:${z[r]}`)),a)switch(a){case`first-name-atoz`:o.push(`orderby:name`);break;case`first-name-ztoa`:o.push(`orderbydesc:name`);break;case`surname-atoz`:o.push(`orderby:surname`);break;case`surname-ztoa`:o.push(`orderbydesc:surname`);break;case`newest`:o.push(`orderbydesc:timestamp`);break;case`oldest`:o.push(`orderby:timestamp`);break;default:break}return`{${o.join(`,`)}}avatar`},shouldDisplayAuthenticationMethods(e){return!e?.length||!h.first(e).authenticationMethods?.length?!1:!!e.find(e=>!!e.authenticationMethods?.find(e=>!e.local))},handleAsyncErrors(e,t,r,i){let a=e?.[0]?.errorCodes;if(!a?.length)return!0;let o={};return(a.includes(I.EmailAlreadyExisted)||a.includes(I.EmailInUse))&&(!r||r.email!==t.email)&&(o.email=n.getPhrase(R,`emailExistsLong`)),a.includes(I.UsernameAlreadyExisted)&&(!r||r.username!==t.username)&&(o.username=n.getPhrase(R,`usernameExistsLong`)),Object.keys(o).length?(i({errors:o}),!1):!0},getInitialErrorsForInvalidYearGroups(e){return!e||e.value===0?{masterYearGroup:n.getPhrase(R,`yearGroupRequired`)}:{}}},V=t(ne(),1),H=`settings.emailSettings`,U=(0,V.object)().shape({email:(0,V.string)().required(()=>n.getPhrase(H,`emailRequired`)).email(()=>n.getPhrase(H,`emailInvalid`)).trim().default(``)}),W=s();function re(){return(0,W.jsx)(j,{children:(0,W.jsx)(`svg`,{viewBox:`0 0 24 24`,children:(0,W.jsx)(`path`,{d:`M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z`})})})}var G=`settings.emailSettings`,K=n.encloseNamespace(G);function ie(e){let t=w(O.MDDown),[n,r]=F.useState(!t),i=e.currentUser.emailVerified;return F.useEffect(()=>{!t&&!n&&r(!0)},[t,n]),(0,W.jsxs)(S.Provider,{value:G,children:[(0,W.jsxs)(`h2`,{className:`h4 d-flex align-items-center`,children:[(0,W.jsx)(x,{phrase:`heading`}),i&&(0,W.jsxs)(`span`,{className:`font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2`,children:[(0,W.jsx)(x,{phrase:`verified`}),(0,W.jsx)(re,{})]})]}),i&&(0,W.jsx)(`p`,{children:(0,W.jsx)(x,{phrase:`info`,options:{email:e.currentUser.email}})}),n?(0,W.jsx)(k,{initialValues:{email:e.currentUser.email||``},onSubmit:e.onChangeEmail,validationSchema:U,children:(0,W.jsxs)(b,{children:[(0,W.jsx)(A,{className:`w-75`,name:`email`,placeholder:K(`emailPlaceholder`),autoComplete:`email`}),(0,W.jsxs)(`div`,{className:`d-flex justify-content-end w-75 ${t?`ms-n2`:``}`,children:[t&&(0,W.jsx)(`button`,{type:`button`,className:`btn btn-link me-2`,onClick:()=>r(!1),children:(0,W.jsx)(x,{phrase:`cancel`})}),(0,W.jsx)(M,{isNew:!1,submitText:K(i?`updateEmail`:`verifyEmail`),variant:i?`outline-dark`:`dark`})]})]})}):(0,W.jsx)(W.Fragment,{children:(0,W.jsx)(`div`,{className:`d-flex`,children:(0,W.jsx)(`button`,{className:`btn btn-outline-dark me-2`,onClick:()=>r(!0),children:(0,W.jsx)(x,{phrase:`change`})})})})]})}var q={partialLabel:`_partialLabel_1h6pk_1`,partialInfo:`_partialInfo_1h6pk_5`,partialInput:`_partialInput_1h6pk_10`,partialSubmit:`_partialSubmit_1h6pk_14`,partialNote:`_partialNote_1h6pk_18`};function ae(){return(0,W.jsxs)(`div`,{className:`w-50`,children:[(0,W.jsx)(`div`,{className:`partial-loading-background mb-2 ${q.partialLabel}`}),(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialInfo}`}),(0,W.jsx)(`div`,{className:`form-group`,children:(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialInput}`})}),(0,W.jsx)(`div`,{className:`partial-loading-background ${q.partialSubmit}`}),(0,W.jsx)(`div`,{className:`partial-loading-background mt-2 ${q.partialNote}`})]})}var J=`shared.changePasswordForm`,Y=n.encloseNamespace(J);X.defaultProps={submitVariant:`outline-dark`,buttonContainerClass:`btn-container d-flex justify-content-end align-items-center`,inputWidthClass:`w-100`};function X(e){let t=y();return(0,W.jsxs)(b,{children:[!e.hideCurrentPassword&&(0,W.jsx)(A,{className:e.inputWidthClass,name:`currentPassword`,label:Y(`currentPassword`),placeholder:Y(`currentPasswordPlaceholder`),type:`password`,autoComplete:`current-password`,showRequiredStar:!0}),(0,W.jsx)(A,{className:e.inputWidthClass,name:`newPassword`,label:Y(`newPassword`),placeholder:Y(`newPasswordPlaceholder`),type:`password`,autoComplete:`new-password`,showRequiredStar:!0}),(0,W.jsx)(A,{className:e.inputWidthClass,name:`confirmPassword`,label:Y(`confirmPassword`),placeholder:Y(`confirmPasswordPlaceholder`),type:`password`,autoComplete:`off`,showRequiredStar:!0}),e.showChangeOnNextLogin&&(0,W.jsx)(A,{id:`changeOnNextLogin`,name:`changeOnNextLogin`,label:Y(`changeOnNextLogin`),type:`checkbox`,checked:t.values.changeOnNextLogin,checkboxLabelFontWeight:`normal`}),!e.hideButtons&&(0,W.jsxs)(`div`,{className:e.buttonContainerClass,children:[!e.hideCancelButton&&!!e.onClickCancel&&(0,W.jsx)(`button`,{type:`button`,className:`btn btn-link me-2 ${e.buttonSize===`lg`?`btn-lg`:``}`,onClick:e.onClickCancel,children:(0,W.jsx)(x,{namespace:J,phrase:`cancel`})}),(0,W.jsx)(M,{isNew:!1,submitText:e.submitText||Y(`save`),variant:e.submitVariant,size:e.buttonSize})]})]})}var Z=n.encloseNamespace(`settings.passwordSettings`),oe=e=>(0,V.object)().shape({currentPassword:(0,V.string)().required(()=>Z(`currentPasswordRequired`)).trim().default(``),newPassword:(0,V.string)().required(()=>Z(`newPasswordRequired`)).min(e,()=>Z(`newPasswordMinLength`,{minLen:e})).trim().default(``),confirmPassword:(0,V.string)().required(()=>Z(`confirmPasswordRequired`)).oneOf([(0,V.ref)(`newPassword`),null],()=>Z(`passwordsDontMatch`)).trim().default(``)}),Q=`settings.passwordSettings`,se={currentPassword:``,newPassword:``,confirmPassword:``};function ce(e){let t=w(O.MDDown),[r,i]=F.useState(!t);F.useEffect(()=>{!t&&!r&&i(!0)},[t,r]);function a(t,n){e.onChangePassword(t,n,()=>n({reset:!0}))}return(0,W.jsxs)(S.Provider,{value:Q,children:[(0,W.jsx)(`h2`,{className:`h4`,children:(0,W.jsx)(x,{phrase:`heading`})}),r?(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`p`,{children:(0,W.jsx)(x,{phrase:`info`})}),(0,W.jsx)(k,{initialValues:se,onSubmit:a,validationSchema:oe(e.minPasswordLength),children:(0,W.jsx)(X,{onClickCancel:()=>i(!1),hideCancelButton:!t,submitText:n.getPhrase(Q,`savePassword`),buttonContainerClass:t?`d-flex justify-content-end ms-n2 w-75`:`d-flex justify-content-end w-75`,inputWidthClass:`w-75`})})]}):(0,W.jsx)(`button`,{className:`btn btn-outline-dark `,onClick:()=>i(!0),children:(0,W.jsx)(x,{phrase:`change`})})]})}var le={getCustomerSecuritySettings(e,t,n){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:`customers:security:settings`,normalize:!1,success:t,error:n}},setCustomerSecuritySettings(e,t,n,r){return{url:`{gateway}/v1/customers/${e}/settings/security`,key:`update:security:settings`,invalidationKeys:`customers:security:settings`,type:m.PUT,normalize:!1,data:t,success:n,error:r}}},$=n.encloseNamespace(`settings.accountSettings`);function ue(){let e=f(),t=te(),n=w(O.MDDown),a=d(ee.currentUser()),s=d(a.data&&P.getUser(a.data.id)),u=d(a.data&&le.getCustomerSecuritySettings(a.data.customerId));C({title:$(`heading`)});function m(n,s){p(e,P.changeEmail(n.email,()=>{l.logUserAction({id:a.data.id,oldEmail:a.data.email,newEmail:n.email},{actionType:r.VerifyEmail,entity:o.User,location:c.Settings,workflowPhase:i.Start}),t.success($(`changeEmailRequestSuccess`,{email:n.email,escapeText:!0}))},()=>{t.error($(`changeEmailRequestError`))},s))}function h(n,s,u){p(e,P.changePassword(n,()=>{l.logUserAction({id:a.data.id,oldPassword:n.currentPassword,newPassword:n.newPassword},{actionType:r.ChangePassword,entity:o.User,location:c.Settings,workflowPhase:i.Complete}),t.success($(`changePasswordSuccess`)),u()},({responseJSON:e})=>{e.errorCode===`user.password-too-short`?t.error($(`changePasswordRequirementsError`)):e.errorCode===`user.invalid-password`?t.error($(`changePasswordInvalid`)):e.errorCode===`user.same-password`?t.error($(`changePasswordSame`)):e.errorCode===`user.locked-out`?t.error($(`changePasswordLockedOut`)):t.error($(`changePasswordError`))},s))}let g=B.getMinimumPasswordLength(u.data,s.data?.userType,a.data.role);return(0,W.jsxs)(N,{heading:$(`heading`),breadcrumbs:[$(`breadcrumb`)],children:[(0,W.jsx)(`div`,{className:n?`w-100`:`w-50`,children:a.data?(0,W.jsx)(ie,{currentUser:a.data,onChangeEmail:m}):(0,W.jsx)(ae,{})}),(0,W.jsx)(`hr`,{}),(0,W.jsx)(`div`,{className:n?`w-100`:`w-50`,children:u.data&&(0,W.jsx)(ce,{onChangePassword:h,minPasswordLength:g})})]})}export{ue as AccountSettingsView};
2
+ //# sourceMappingURL=CJSc4YDq2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CNJrD44-2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/user-manager/enums/UserValidationCode.ts","../../../../libs/shared/src/apps/user-manager/utils/UserManagerHelper.ts","../../src/apps/settings/components/email-settings/EmailSettingsValidationSchema.ts","../../src/apps/settings/components/email-settings/VerifiedEmailIcon.tsx","../../src/apps/settings/components/email-settings/EmailSettings.tsx","../../src/apps/settings/components/email-settings/partial-loading/partial-email-settings.module.scss","../../src/apps/settings/components/email-settings/partial-loading/PartialEmailSettings.tsx","../../../../libs/shared/src/apps/user-manager/components/change-password-form/ChangePasswordForm.tsx","../../src/apps/settings/components/password-settings/PasswordSettingsValidationSchema.ts","../../src/apps/settings/components/password-settings/PasswordSettings.tsx","../../src/apps/settings/flight-requests/SecuritySettingsRequests.ts","../../src/apps/settings/views/account-settings/AccountSettingsView.tsx"],"sourcesContent":["// Copied directly from User API\nexport enum UserValidationCode {\n Ok = 'Ok',\n UsernameRequired = 'UsernameRequired',\n EmailRequired = 'EmailRequired',\n FirstnameRequired = 'FirstnameRequired',\n SurnameRequired = 'SurnameRequired',\n YearGroupRequired = 'YearGroupRequired',\n EmailAlreadyExisted = 'EmailAlreadyExisted', // This means another user has this email address, and it's verified\n UsernameAlreadyExisted = 'UsernameAlreadyExisted',\n UserTypeRequired = 'UserTypeRequired',\n MasterYearGroupRequired = 'MasterYearGroupRequired',\n EmptyUserEntity = 'EmptyUserEntity',\n CustomerIdRequired = 'CustomerIdRequired',\n CustomerNotFoundInOnline = 'CustomerNotFoundInOnline',\n EmailTooLong = 'EmailTooLong',\n UsernameTooLong = 'UsernameTooLong',\n FirstnameTooLong = 'FirstnameTooLong',\n SurnameTooLong = 'SurnameTooLong',\n EmailInvalid = 'EmailInvalid',\n EmailInUse = 'EmailInUse', // This means another user has this email address, but it's unverified\n UsernameInvalid = 'UsernameInvalid',\n PasswordTooShort = 'PasswordTooShort',\n EmailDuplicated = 'EmailDuplicated', // Same email has been used in the same request\n UsernameDuplicated = 'UsernameDuplicated', // Same username has been used in the same request\n DisplayNameTooLong = 'DisplayNameTooLong',\n DisplayNameTooShort = 'DisplayNameTooShort',\n UsernameTooShort = 'UsernameTooShort',\n FirstnameInvalid = 'FirstnameInvalid',\n SurnameInvalid = 'SurnameInvalid',\n\n // user man 3.0\n UserTypeMismatch = 'UserTypeMismatch',\n UserCanBeAddedInCustomer = 'UserCanBeAddedInCustomer',\n UserCanBeCreated = 'UserCanBeCreated',\n CustomerFoundInOnline = 'CustomerFoundInOnline',\n UserInCustomerWithOnline = 'UserInCustomerWithOnline',\n InvalidUserStatus = 'InvalidUserStatus',\n UserAlreadyExistsInCustomer = 'UserAlreadyExistsInCustomer',\n\n // a user created by rostered\n Rostered = 'UserRostered',\n\n // Unknown year group\n InvalidYearGroup = 'InvalidYearGroup'\n}\n","import { FormikErrors } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SearchFilter, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkCreateOrValidateUserRequest, BulkDeleteUsersRequest, BulkUpdateUserStatusRequest, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { Customer, User, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nimport { FilterConstants } from '../../search/constants/FilterConstants';\nimport { DuplicateUserSet } from '../interfaces/viewmodels/BulkUserUploadViewModel';\n\nconst FALLBACK_MIN_PASSWORD_LENGTH = 8;\nconst namespace = 'userManager.utils';\n\nconst StatusMap: HashObject = {\n active: ObjectStatus.Active.toLowerCase(),\n deactivated: ObjectStatus.Disabled.toLowerCase(),\n pending: ObjectStatus.Inactive.toLowerCase()\n};\n\nexport const UserManagerHelper = {\n filterIdenticalEntries(spreadsheetEntries: EditUserRequest[]): EditUserRequest[] {\n const identify = (u: EditUserRequest) => {\n return [\n u.firstName?.trim() ?? '',\n u.surname?.trim() ?? '',\n u.masterYearGroup?.id ?? '',\n u.username?.toLowerCase()?.trim() ?? '',\n u.email?.toLowerCase()?.trim() ?? ''\n ].join(':');\n };\n\n return spreadsheetEntries.filter((entry, index, self) =>\n index === self.findIndex(u => identify(u) === identify(entry)));\n },\n\n getNewDuplicates(users?: EditUserRequest[]): DuplicateUserSet[] {\n if (!users)\n return null;\n\n const duplicateSets: DuplicateUserSet[] = [];\n const validUsers: EditUserRequest[] = [];\n\n /**\n * Find all users in uploaded spreadsheet with duplicate usernames.\n */\n const usernameDuplicateLookup: {[ username: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.username) {\n validUsers.push(user);\n return;\n }\n\n if (!usernameDuplicateLookup[user.username]) {\n usernameDuplicateLookup[user.username] = [user];\n return;\n }\n\n usernameDuplicateLookup[user.username].push(user);\n });\n\n Object.keys(usernameDuplicateLookup).map(username => {\n if (usernameDuplicateLookup[username].length === 1) {\n validUsers.push(usernameDuplicateLookup[username][0]);\n return;\n }\n\n duplicateSets.push({\n errorCodes: [UserValidationCode.UsernameAlreadyExisted],\n users: usernameDuplicateLookup[username]\n });\n });\n\n /**\n * Find all remaining users in spreadsheet with duplicate emails\n */\n const emailDuplicateLookup: {[ email: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.email)\n return;\n\n if (!emailDuplicateLookup[user.email]) {\n emailDuplicateLookup[user.email] = [user];\n return;\n }\n\n emailDuplicateLookup[user.email].push(user);\n });\n\n Object.keys(emailDuplicateLookup).map(email => {\n if (emailDuplicateLookup[email].length === 1)\n return;\n\n const { username } = ArrayHelper.first(emailDuplicateLookup[email]);\n\n if (!username || usernameDuplicateLookup[username].length === 1) {\n duplicateSets.push({\n errorCodes: [UserValidationCode.EmailAlreadyExisted],\n users: emailDuplicateLookup[email]\n });\n } else {\n const dupeSetIndex = duplicateSets.findIndex(set => ArrayHelper.first(set.users).username === username);\n\n duplicateSets[dupeSetIndex].errorCodes.push(UserValidationCode.EmailAlreadyExisted);\n }\n });\n\n return duplicateSets;\n },\n\n formatCreateOrValidateUserRequest(\n users: EditUserRequest[],\n userType: UserGroup,\n customerId: string\n ): BulkCreateOrValidateUserRequest {\n return {\n users: users.map((u: EditUserRequest) => {\n const obj: EditUserRequest = {\n firstName: u.firstName,\n email: u.email,\n surname: u.surname,\n username: u.username,\n userType,\n customerId,\n masterRole: u.masterRole || UserRole.User,\n requirePasswordChange: false,\n generatePassword: !!u.generatePassword,\n password: u.password,\n displayName: u.displayName || null\n };\n\n if (userType === UserGroup.Learner)\n obj.yearGroupId = u.masterYearGroup?.id;\n\n if (!obj.username)\n delete obj.username;\n\n if (!obj.password)\n delete obj.password;\n\n if (obj.password && obj.generatePassword)\n obj.generatePassword = false;\n\n if (u.userId)\n obj.userId = u.userId;\n\n return obj;\n })\n };\n },\n\n formatEditUserRequest(user: EditUserRequest): EditUserRequest {\n if (!user.displayName)\n user.displayName = null;\n\n return user;\n },\n\n formatDeleteRequest(customerId: string, users?: User[], userType?: UserGroup): BulkDeleteUsersRequest {\n const body: BulkDeleteUsersRequest = {\n customerId\n };\n\n if (!users.length) {\n const queryParams = Core.LocationUtils.DeserializeQueryParams(\n Core.LocationUtils.GetCurrentQueryString().substring(1)\n );\n\n if (queryParams.query)\n body.searchQuery = queryParams.query;\n\n const statuses = queryParams.status &&\n (Array.isArray(queryParams.status) ? queryParams.status : [queryParams.status]);\n\n if (statuses?.length) {\n body.userStatuses = [];\n\n statuses.forEach(status => {\n if (status === 'active') body.userStatuses.push(ObjectStatus.Active);\n if (status === 'deactivated') body.userStatuses.push(ObjectStatus.Disabled);\n if (status === 'pending') body.userStatuses.push(ObjectStatus.Inactive);\n });\n }\n \n if (queryParams.yearGroup) {\n body.yearGroupValues = Array.isArray(queryParams.yearGroup) ? queryParams.yearGroup : [queryParams.yearGroup];\n }\n }\n\n if (Object.keys(body).length === 1) {\n body.userIds = users.map(u => u.id);\n } else {\n body.userType = userType;\n }\n\n return body;\n },\n\n formatToggleStatusRequest(user: User, customerId: string, newStatus: ObjectStatus): BulkUpdateUserStatusRequest {\n return {\n customerId,\n users: [{\n userId: user.id,\n status: newStatus\n }]\n };\n },\n\n getErrorMessages(\n errorCodes: UserValidationCode[],\n minPasswordLength: number,\n shortMessages?: boolean,\n localMessage?: HashObject\n ) {\n const messages: HashObject = {};\n\n const getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\n const CodeToMessageMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: getPhrase('emailRequired'),\n [UserValidationCode.FirstnameRequired]: getPhrase('nameRequired'),\n [UserValidationCode.SurnameRequired]: getPhrase('surnameRequired'),\n [UserValidationCode.YearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmailAlreadyExisted]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameAlreadyExisted]: getPhrase(shortMessages ? 'usernameExistsShort' : 'usernameExistsLong'),\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: getPhrase('emailExceeds'),\n [UserValidationCode.UsernameTooLong]: getPhrase('usernameExceeds'),\n [UserValidationCode.FirstnameTooLong]: getPhrase('nameExceeds'),\n [UserValidationCode.SurnameTooLong]: getPhrase('surnameExceeds'),\n [UserValidationCode.EmailInvalid]: getPhrase(shortMessages ? 'emailInvalidShort' : 'emailInvalidLong'),\n [UserValidationCode.EmailInUse]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameInvalid]: getPhrase(shortMessages ? 'usernameInvalidShort' : 'usernameInvalidLong'),\n [UserValidationCode.PasswordTooShort]: getPhrase(shortMessages ? 'passwordTooShortShort' : 'passwordTooShortLong', { minLength: minPasswordLength }),\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: getPhrase('displayNameExceeds'),\n [UserValidationCode.DisplayNameTooShort]: getPhrase('displayNameTooShort'),\n [UserValidationCode.UsernameTooShort]: getPhrase('usernameTooShort'),\n [UserValidationCode.FirstnameInvalid]: getPhrase('firstNameInvalid'),\n [UserValidationCode.SurnameInvalid]: getPhrase('surnameInvalid'),\n [UserValidationCode.CustomerFoundInOnline]: getPhrase('support'),\n [UserValidationCode.UserInCustomerWithOnline]: getPhrase('support'),\n [UserValidationCode.InvalidUserStatus]: getPhrase('support'),\n [UserValidationCode.UserTypeMismatch]: '',\n [UserValidationCode.UserCanBeAddedInCustomer]: '',\n [UserValidationCode.UserCanBeCreated]: '',\n [UserValidationCode.UserAlreadyExistsInCustomer]: '',\n [UserValidationCode.Rostered]: '',\n [UserValidationCode.InvalidYearGroup]: getPhrase('invalidYearGroupError')\n };\n\n const CodeToFieldMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: 'email',\n [UserValidationCode.FirstnameRequired]: 'firstName',\n [UserValidationCode.SurnameRequired]: 'surname',\n [UserValidationCode.YearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmailAlreadyExisted]: 'email',\n [UserValidationCode.UsernameAlreadyExisted]: 'username',\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: 'email',\n [UserValidationCode.UsernameTooLong]: 'username',\n [UserValidationCode.FirstnameTooLong]: 'firstName',\n [UserValidationCode.SurnameTooLong]: 'surname',\n [UserValidationCode.EmailInvalid]: 'email',\n [UserValidationCode.EmailInUse]: 'email',\n [UserValidationCode.UsernameInvalid]: 'username',\n [UserValidationCode.PasswordTooShort]: 'password',\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: 'displayName',\n [UserValidationCode.DisplayNameTooShort]: 'displayName',\n [UserValidationCode.UsernameTooShort]: 'username',\n [UserValidationCode.FirstnameInvalid]: 'firstName',\n [UserValidationCode.SurnameInvalid]: 'surname',\n [UserValidationCode.UserTypeMismatch]: 'email',\n [UserValidationCode.UserCanBeAddedInCustomer]: 'email',\n [UserValidationCode.UserCanBeCreated]: 'email',\n [UserValidationCode.CustomerFoundInOnline]: 'email',\n [UserValidationCode.UserInCustomerWithOnline]: 'email',\n [UserValidationCode.InvalidUserStatus]: 'email',\n [UserValidationCode.UserAlreadyExistsInCustomer]: 'email',\n [UserValidationCode.Rostered]: 'email',\n [UserValidationCode.InvalidYearGroup]: 'masterYearGroup'\n };\n\n errorCodes.forEach(code => {\n const message = localMessage?.[code] ?? CodeToMessageMap[code] ?? '';\n\n if (!message)\n return;\n\n const field = CodeToFieldMap[code];\n\n if (!field)\n return;\n\n messages[field] = localMessage?.[code]?.[field] ?? message;\n });\n\n return messages;\n },\n\n showEmptyState(userRequest: Flight.Response<UserCollection | SearchResults<User>>, queryParams: HashObject): boolean {\n if (!userRequest.data)\n return false;\n\n const hasQueryParams = Object.keys(queryParams).length;\n\n if (('results' in userRequest.data) || hasQueryParams)\n return false;\n\n return !userRequest.data.data?.length;\n },\n\n getFilters(customer: Customer, userType: UserGroup, yearGroups?: YearGroup[], countryCode?: string): SearchFilter[] {\n const filters = [Filters.SortBy(FilterHelper.getNameSortOptions())];\n\n if (userType === UserGroup.Learner && yearGroups?.length > 1)\n filters.push(Filters.YearGroup(FilterHelper.getYearGroupOptions(yearGroups)));\n\n filters.push(Filters.Status());\n \n if (userType === UserGroup.Staff)\n filters.push(Filters.IsAdmin(customer, countryCode));\n\n return filters;\n },\n\n getMinimumPasswordLength(\n securitySettings: SecuritySettingsResponse,\n userType: UserGroup,\n userRole: UserRole\n ): number {\n if (!securitySettings)\n return FALLBACK_MIN_PASSWORD_LENGTH;\n\n const customSetting = securitySettings.securitySettings?.find(s => {\n return s.userRole === userRole && s.userType === userType;\n });\n\n if (customSetting)\n return customSetting.minPasswordLength;\n\n if (userRole === UserRole.Admin || userRole === UserRole.SuperAdmin)\n return securitySettings.defaultAdminMinPasswordLength;\n\n return securitySettings.defaultMinPasswordLength;\n },\n\n mapStatusParamsToValue(statusParam: string | string[]): ObjectStatus[] {\n if (!statusParam)\n return;\n\n const convertToValue = (status: string): ObjectStatus => {\n switch (status) {\n case 'active':\n return ObjectStatus.Active;\n case 'deactivated':\n return ObjectStatus.Disabled;\n case 'pending':\n return ObjectStatus.Inactive;\n }\n };\n\n if (!Array.isArray(statusParam))\n return [convertToValue(statusParam)];\n\n return statusParam.map(convertToValue);\n },\n\n buildSearchData({\n customerId,\n userId,\n userType,\n queryParams = {}\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams\n }): HashObject {\n const filters = UserManagerHelper.buildSearchFiltersData(customerId, userType, queryParams);\n const sorts = UserManagerHelper.buildSearchSortData(customerId, queryParams);\n\n return {\n query: queryParams.query,\n indices: ['user'],\n searchType: 'user',\n customerIdOverride: customerId,\n userId,\n customerId,\n filters,\n sorts\n };\n },\n\n buildSearchDataAndKey({\n customerId,\n userId,\n userType,\n queryParams,\n cursor\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams?: UserManagerQueryParams,\n cursor?: string\n }): { key: string, data: HashObject } {\n const data = UserManagerHelper.buildSearchData({\n customerId,\n userId: userId || '',\n userType,\n queryParams: queryParams || {}\n });\n\n if (cursor)\n data.cursor = cursor;\n\n let key = `search:users:${cursor || ''}`;\n key += ObjectHelper.flattenObjectToString(data);\n\n return { key, data };\n },\n\n buildSearchParams(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n let filters = UserManagerHelper.buildSearchFiltersObject(customerId, userType, queryParams);\n\n filters = Object.keys(filters).reduce((prev: HashObject, current) => {\n prev[`${FilterConstants.FILTER_PARAM_PREFIX}${current}`] = filters[current];\n return prev;\n }, {});\n\n return {\n query: queryParams.query,\n index: 'user',\n customerIdOverride: customerId,\n ...filters\n };\n },\n\n buildSearchSortData(customerId: string, queryParams: UserManagerQueryParams = {}): HashObject {\n const sorts: HashObject = {};\n\n if (queryParams.sort) {\n switch (queryParams.sort) {\n case 'first-name-atoz':\n sorts.firstName = 'asc';\n break;\n\n case 'first-name-ztoa':\n sorts.firstName = 'desc';\n break;\n\n case 'surname-atoz':\n sorts.surname = 'asc';\n break;\n\n case 'surname-ztoa':\n sorts.surname = 'desc';\n break;\n\n case 'newest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n break;\n case 'oldest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'asc'\n }\n };\n break;\n\n default:\n break;\n }\n } else {\n // default to newest sort\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n }\n\n return sorts;\n },\n\n buildSearchFiltersData(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase()\n };\n\n filters.userProfile = {\n customerId\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userProfile.role = [ UserRole.Admin.toLowerCase(), UserRole.SuperAdmin.toLowerCase() ];\n\n if (queryParams.yearGroup) {\n filters.yearGroup = { customerId };\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup.value = queryParams.yearGroup;\n } else {\n filters.yearGroup.value = [queryParams.yearGroup];\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfile.status = [StatusMap[queryParams.status]];\n } else {\n filters.userProfile.status = queryParams.status.map(val => StatusMap[val]);\n }\n }\n\n return filters;\n },\n\n buildSearchFiltersObject(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase(),\n customerId: customerId.toString()\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userRole = UserRole.Admin.toLowerCase();\n\n if (queryParams.yearGroup) {\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup = `${queryParams.yearGroup.join(',')}`;\n } else {\n filters.yearGroup = queryParams.yearGroup;\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfileStatus = StatusMap[queryParams.status];\n } else {\n filters.userProfileStatus = queryParams.status.map(val => StatusMap[val]).join(',');\n }\n }\n\n return filters;\n },\n\n buildGetUsersQuery(\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): string {\n const { yearGroup = '', status = '', isAdmin = '', sort = 'newest' } = queryParams;\n\n const filters = [`usertype:${userType}`];\n\n if (yearGroup) {\n if (Array.isArray(yearGroup)) {\n filters.push(`yeargroups.value:[${yearGroup.join(',')}]`);\n } else {\n filters.push(`yeargroups.value:${yearGroup}`);\n }\n }\n\n if (isAdmin === 'true')\n filters.push(`userprofiles.role:${UserRole.Admin}`);\n\n if (status) {\n if (!Array.isArray(status)) {\n filters.push(`status:${StatusMap[status]}`);\n } else {\n filters.push(`status:[${status.map(val => StatusMap[val]).join(',')}]`);\n }\n }\n\n if (sort) {\n switch (sort) {\n case 'first-name-atoz':\n filters.push('orderby:name');\n break;\n \n case 'first-name-ztoa':\n filters.push('orderbydesc:name');\n break;\n \n case 'surname-atoz':\n filters.push('orderby:surname');\n break;\n \n case 'surname-ztoa':\n filters.push('orderbydesc:surname');\n break;\n\n case 'newest':\n filters.push('orderbydesc:timestamp');\n break;\n\n case 'oldest':\n filters.push('orderby:timestamp');\n break;\n \n default:\n break;\n }\n }\n\n return `{${filters.join(',')}}avatar`;\n },\n\n shouldDisplayAuthenticationMethods(users: User[]): boolean {\n if (!users?.length)\n return false;\n\n const hasFetchedAuthenticationMethods = !!ArrayHelper.first(users).authenticationMethods?.length;\n\n if (!hasFetchedAuthenticationMethods)\n return false;\n\n const userWithSSO = users.find(u => {\n const ssoLoginMethod = u.authenticationMethods?.find(am => !am.local);\n\n return !!ssoLoginMethod;\n });\n\n /**\n * If any user in the list has an authentication method that isn't local (meaning it's SSO)\n * then we display authentication methods.\n * \n * Otherwise we don't show them, as every user list item would just say \"ClickView\"\n */\n if (userWithSSO)\n return true;\n\n return false;\n },\n\n handleAsyncErrors(\n errors: ErroredUsers,\n updatedUser: EditUserRequest,\n oldUser: User | null,\n onDone: (options: FormSubmissionOptions) => void\n ): boolean {\n const errorCodes = errors?.[0]?.errorCodes;\n\n if (!errorCodes?.length)\n return true;\n\n const errorMessages: FormikErrors<EditUserRequest> = {};\n\n if (\n errorCodes.includes(UserValidationCode.EmailAlreadyExisted) ||\n errorCodes.includes(UserValidationCode.EmailInUse)\n ) {\n if (!oldUser || oldUser.email !== updatedUser.email)\n errorMessages.email = LanguageService.getPhrase(namespace, 'emailExistsLong');\n }\n\n if (errorCodes.includes(UserValidationCode.UsernameAlreadyExisted)) {\n if (!oldUser || oldUser.username !== updatedUser.username)\n errorMessages.username = LanguageService.getPhrase(namespace, 'usernameExistsLong');\n }\n\n if (!Object.keys(errorMessages).length)\n return true;\n\n onDone({\n errors: errorMessages\n });\n\n return false;\n },\n\n getInitialErrorsForInvalidYearGroups(yearGroup: YearGroup): FormikErrors<EditUserRequest> {\n if (!yearGroup || yearGroup.value === 0)\n return {\n masterYearGroup: LanguageService.getPhrase(namespace, 'yearGroupRequired') as FormikErrors<YearGroup>\n };\n\n return {};\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.emailSettings';\n\nexport const EmailSettingsValidationSchema = object().shape({\n email: string()\n .required(() => LanguageService.getPhrase(namespace, 'emailRequired'))\n .email(() => LanguageService.getPhrase(namespace, 'emailInvalid'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\n\nexport function VerifiedEmailIcon(): JSX.Element {\n return (\n <SvgContainer2>\n <svg viewBox='0 0 24 24'>\n <path d='M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z'/>\n </svg>\n </SvgContainer2>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { EmailSettingsValidationSchema } from './EmailSettingsValidationSchema';\nimport { VerifiedEmailIcon } from './VerifiedEmailIcon';\n\nconst namespace = 'settings.emailSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmailSettingsModel {\n email: string;\n}\n\ninterface EmailSettingsProps {\n currentUser: CurrentUser;\n onChangeEmail: (emailModel: EmailSettingsModel) => void;\n}\n\nexport function EmailSettings(props: EmailSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n const isVerified = props.currentUser.emailVerified;\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4 d-flex align-items-center'>\n <Text phrase='heading' />\n {isVerified && (\n <span className='font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2'>\n <Text phrase='verified' />\n <VerifiedEmailIcon />\n </span>\n )}\n </h2>\n\n {isVerified && (\n <p><Text phrase='info' options={{ email: props.currentUser.email }} /></p>\n )}\n\n {!showForm ?\n (\n <>\n <div className='d-flex'>\n <button className='btn btn-outline-dark me-2' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n </div>\n </>\n ) : (\n <FormWrapper<EmailSettingsModel>\n initialValues={{ email: props.currentUser.email || '' }}\n onSubmit={props.onChangeEmail}\n validationSchema={EmailSettingsValidationSchema}\n >\n <Form>\n <FormField\n className='w-75'\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n autoComplete='email'\n />\n <div className={`d-flex justify-content-end w-75 ${isSmallScreen ? 'ms-n2' : ''}`}>\n {isSmallScreen && (\n <button type='button' className='btn btn-link me-2' onClick={() => setShowForm(false)}>\n <Text phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={isVerified ? getPhrase('updateEmail') : getPhrase('verifyEmail')}\n variant={isVerified ? 'outline-dark' : 'dark'}\n />\n </div>\n </Form>\n </FormWrapper>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .partialLabel {\n width: 3.0625rem;\n height: 1.5rem;\n }\n\n .partialInfo {\n margin-bottom: 1rem;\n width: 28.125rem;\n height: 1.1875rem;\n }\n\n .partialInput {\n width: 25.75rem;\n height: 2.1875rem;\n }\n\n .partialSubmit {\n width: 6.75rem;\n height: 2.1875rem;\n }\n\n .partialNote {\n width: 30.625rem;\n height: 1.1875rem; \n }\n}","import React from 'react';\n\nimport styles from './partial-email-settings.module.scss';\n\nexport function PartialEmailSettings(): JSX.Element {\n return (\n <div className='w-50'>\n <div className={`partial-loading-background mb-2 ${styles.partialLabel}`} />\n <div className={`partial-loading-background ${styles.partialInfo}`} />\n\n <div className='form-group'>\n <div className={`partial-loading-background ${styles.partialInput}`} />\n </div>\n <div className={`partial-loading-background ${styles.partialSubmit}`} />\n <div className={`partial-loading-background mt-2 ${styles.partialNote}`} />\n </div>\n );\n}\n","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.changePasswordForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ChangePasswordFormProps {\n onClickCancel?: () => void;\n \n hideButtons?: boolean;\n buttonContainerClass?: string;\n buttonSize?: FormSize;\n hideCancelButton?: boolean;\n hideCurrentPassword?: boolean;\n inputWidthClass?: string;\n showChangeOnNextLogin?: boolean;\n\n submitText?: string;\n submitVariant?: ButtonProps['variant'];\n}\n\nChangePasswordForm.defaultProps = {\n submitVariant: 'outline-dark',\n buttonContainerClass: 'btn-container d-flex justify-content-end align-items-center',\n inputWidthClass: 'w-100'\n};\n\nexport function ChangePasswordForm(props: ChangePasswordFormProps): JSX.Element {\n const formikProps = useFormikContext<ChangePasswordRequest>();\n\n return (\n <Form>\n {!props.hideCurrentPassword && (\n <FormField\n className={props.inputWidthClass}\n name='currentPassword'\n label={getPhrase('currentPassword')}\n placeholder={getPhrase('currentPasswordPlaceholder')}\n type='password'\n autoComplete='current-password'\n showRequiredStar\n />\n )}\n\n <FormField\n className={props.inputWidthClass}\n name='newPassword'\n label={getPhrase('newPassword')}\n placeholder={getPhrase('newPasswordPlaceholder')}\n type='password'\n autoComplete='new-password'\n showRequiredStar\n />\n\n <FormField\n className={props.inputWidthClass}\n name='confirmPassword'\n label={getPhrase('confirmPassword')}\n placeholder={getPhrase('confirmPasswordPlaceholder')}\n type='password'\n autoComplete='off'\n showRequiredStar\n />\n\n {props.showChangeOnNextLogin &&\n <FormField\n id='changeOnNextLogin'\n name='changeOnNextLogin'\n label={getPhrase('changeOnNextLogin')}\n type='checkbox'\n checked={formikProps.values.changeOnNextLogin}\n checkboxLabelFontWeight='normal'\n />\n }\n \n {!props.hideButtons && (\n <div className={props.buttonContainerClass}>\n {(!props.hideCancelButton && !!props.onClickCancel) && (\n <button\n type='button'\n className={`btn btn-link me-2 ${props.buttonSize === 'lg' ? 'btn-lg' : ''}`}\n onClick={props.onClickCancel}\n >\n <Text namespace={namespace} phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={props.submitText || getPhrase('save')}\n variant={props.submitVariant}\n size={props.buttonSize}\n />\n </div>\n )}\n </Form>\n );\n}\n","import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.passwordSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getPasswordSettingsValidationSchema = (minPasswordLength: number) => object().shape({\n currentPassword: string()\n .required(() => getPhrase('currentPasswordRequired'))\n .trim()\n .default(''),\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minPasswordLength, () => getPhrase('newPasswordMinLength', { minLen: minPasswordLength }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\n\nimport { getPasswordSettingsValidationSchema } from './PasswordSettingsValidationSchema';\n\nconst namespace = 'settings.passwordSettings';\n\nconst initialValues: ChangePasswordRequest = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n};\n\ninterface PasswordSettingsProps {\n onChangePassword: (\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ) => void;\n minPasswordLength: number;\n}\n\nexport function PasswordSettings(props: PasswordSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n function onSubmitPassword(data: ChangePasswordRequest, onDone: (options?: FormSubmissionOptions) => void) {\n props.onChangePassword(data, onDone, () => onDone({ reset: true }));\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4'><Text phrase='heading' /></h2>\n\n {!showForm ?\n (\n <button className='btn btn-outline-dark ' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n ) : (\n <>\n <p><Text phrase='info' /></p>\n\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={onSubmitPassword}\n validationSchema={getPasswordSettingsValidationSchema(props.minPasswordLength)}\n >\n <ChangePasswordForm\n onClickCancel={() => setShowForm(false)}\n hideCancelButton={!isSmallScreen}\n submitText={LanguageService.getPhrase(namespace, 'savePassword')}\n buttonContainerClass={isSmallScreen ?\n 'd-flex justify-content-end ms-n2 w-75' :\n 'd-flex justify-content-end w-75'\n }\n inputWidthClass='w-75'\n />\n </FormWrapper>\n </>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces/ChangePasswordRequest';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { EmailSettings, EmailSettingsModel } from 'apps/settings/components/email-settings/EmailSettings';\nimport { PartialEmailSettings } from 'apps/settings/components/email-settings/partial-loading/PartialEmailSettings';\nimport { PasswordSettings } from 'apps/settings/components/password-settings/PasswordSettings';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/settings/flight-requests/UserManagerRequests';\n\nconst namespace = 'settings.accountSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AccountSettingsView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const masterCurrentUser = Flight.useBasicFetch<User>(currentUser.data &&\n UserManagerRequests.getUser(currentUser.data.id));\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n useSetPageMetadata({ title: getPhrase('heading') });\n\n function onChangeEmail(emailModel: EmailSettingsModel, onDone?: () => void): void {\n Flight.fetch(dispatch, UserManagerRequests.changeEmail(emailModel.email, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldEmail: currentUser.data.email,\n newEmail: emailModel.email\n }, {\n actionType: UserAction.VerifyEmail,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Start\n });\n\n alerts.success(getPhrase('changeEmailRequestSuccess', { email: emailModel.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('changeEmailRequestError'));\n }, onDone));\n }\n\n function onChangePassword(\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ): void {\n Flight.fetch(dispatch, UserManagerRequests.changePassword(passwordModel, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldPassword: passwordModel.currentPassword,\n newPassword: passwordModel.newPassword\n }, {\n actionType: UserAction.ChangePassword,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('changePasswordSuccess'));\n onSuccess();\n }, ({ responseJSON }: JQuery.jqXHR) => {\n if (responseJSON.errorCode === 'user.password-too-short')\n alerts.error(getPhrase('changePasswordRequirementsError'));\n else if (responseJSON.errorCode === 'user.invalid-password')\n alerts.error(getPhrase('changePasswordInvalid'));\n else if (responseJSON.errorCode === 'user.same-password')\n alerts.error(getPhrase('changePasswordSame'));\n else if (responseJSON.errorCode === 'user.locked-out')\n alerts.error(getPhrase('changePasswordLockedOut'));\n else\n alerts.error(getPhrase('changePasswordError'));\n }, onDone));\n }\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n passwordPolicy.data,\n masterCurrentUser.data?.userType,\n currentUser.data.role\n );\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {(currentUser.data) ?\n (\n <EmailSettings\n currentUser={currentUser.data}\n onChangeEmail={onChangeEmail}\n />\n ) : <PartialEmailSettings />\n }\n </div>\n\n <hr />\n\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {passwordPolicy.data && (\n <PasswordSettings onChangePassword={onChangePassword} minPasswordLength={minPasswordLength} />\n )}\n </div>\n </SettingsLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CJSc4YDq2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/user-manager/enums/UserValidationCode.ts","../../../../libs/shared/src/apps/user-manager/utils/UserManagerHelper.ts","../../src/apps/settings/components/email-settings/EmailSettingsValidationSchema.ts","../../src/apps/settings/components/email-settings/VerifiedEmailIcon.tsx","../../src/apps/settings/components/email-settings/EmailSettings.tsx","../../src/apps/settings/components/email-settings/partial-loading/partial-email-settings.module.scss","../../src/apps/settings/components/email-settings/partial-loading/PartialEmailSettings.tsx","../../../../libs/shared/src/apps/user-manager/components/change-password-form/ChangePasswordForm.tsx","../../src/apps/settings/components/password-settings/PasswordSettingsValidationSchema.ts","../../src/apps/settings/components/password-settings/PasswordSettings.tsx","../../src/apps/settings/flight-requests/SecuritySettingsRequests.ts","../../src/apps/settings/views/account-settings/AccountSettingsView.tsx"],"sourcesContent":["// Copied directly from User API\nexport enum UserValidationCode {\n Ok = 'Ok',\n UsernameRequired = 'UsernameRequired',\n EmailRequired = 'EmailRequired',\n FirstnameRequired = 'FirstnameRequired',\n SurnameRequired = 'SurnameRequired',\n YearGroupRequired = 'YearGroupRequired',\n EmailAlreadyExisted = 'EmailAlreadyExisted', // This means another user has this email address, and it's verified\n UsernameAlreadyExisted = 'UsernameAlreadyExisted',\n UserTypeRequired = 'UserTypeRequired',\n MasterYearGroupRequired = 'MasterYearGroupRequired',\n EmptyUserEntity = 'EmptyUserEntity',\n CustomerIdRequired = 'CustomerIdRequired',\n CustomerNotFoundInOnline = 'CustomerNotFoundInOnline',\n EmailTooLong = 'EmailTooLong',\n UsernameTooLong = 'UsernameTooLong',\n FirstnameTooLong = 'FirstnameTooLong',\n SurnameTooLong = 'SurnameTooLong',\n EmailInvalid = 'EmailInvalid',\n EmailInUse = 'EmailInUse', // This means another user has this email address, but it's unverified\n UsernameInvalid = 'UsernameInvalid',\n PasswordTooShort = 'PasswordTooShort',\n EmailDuplicated = 'EmailDuplicated', // Same email has been used in the same request\n UsernameDuplicated = 'UsernameDuplicated', // Same username has been used in the same request\n DisplayNameTooLong = 'DisplayNameTooLong',\n DisplayNameTooShort = 'DisplayNameTooShort',\n UsernameTooShort = 'UsernameTooShort',\n FirstnameInvalid = 'FirstnameInvalid',\n SurnameInvalid = 'SurnameInvalid',\n\n // user man 3.0\n UserTypeMismatch = 'UserTypeMismatch',\n UserCanBeAddedInCustomer = 'UserCanBeAddedInCustomer',\n UserCanBeCreated = 'UserCanBeCreated',\n CustomerFoundInOnline = 'CustomerFoundInOnline',\n UserInCustomerWithOnline = 'UserInCustomerWithOnline',\n InvalidUserStatus = 'InvalidUserStatus',\n UserAlreadyExistsInCustomer = 'UserAlreadyExistsInCustomer',\n\n // a user created by rostered\n Rostered = 'UserRostered',\n\n // Unknown year group\n InvalidYearGroup = 'InvalidYearGroup'\n}\n","import { FormikErrors } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SearchFilter, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkCreateOrValidateUserRequest, BulkDeleteUsersRequest, BulkUpdateUserStatusRequest, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { Customer, User, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nimport { FilterConstants } from '../../search/constants/FilterConstants';\nimport { DuplicateUserSet } from '../interfaces/viewmodels/BulkUserUploadViewModel';\n\nconst FALLBACK_MIN_PASSWORD_LENGTH = 8;\nconst namespace = 'userManager.utils';\n\nconst StatusMap: HashObject = {\n active: ObjectStatus.Active.toLowerCase(),\n deactivated: ObjectStatus.Disabled.toLowerCase(),\n pending: ObjectStatus.Inactive.toLowerCase()\n};\n\nexport const UserManagerHelper = {\n filterIdenticalEntries(spreadsheetEntries: EditUserRequest[]): EditUserRequest[] {\n const identify = (u: EditUserRequest) => {\n return [\n u.firstName?.trim() ?? '',\n u.surname?.trim() ?? '',\n u.masterYearGroup?.id ?? '',\n u.username?.toLowerCase()?.trim() ?? '',\n u.email?.toLowerCase()?.trim() ?? ''\n ].join(':');\n };\n\n return spreadsheetEntries.filter((entry, index, self) =>\n index === self.findIndex(u => identify(u) === identify(entry)));\n },\n\n getNewDuplicates(users?: EditUserRequest[]): DuplicateUserSet[] {\n if (!users)\n return null;\n\n const duplicateSets: DuplicateUserSet[] = [];\n const validUsers: EditUserRequest[] = [];\n\n /**\n * Find all users in uploaded spreadsheet with duplicate usernames.\n */\n const usernameDuplicateLookup: {[ username: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.username) {\n validUsers.push(user);\n return;\n }\n\n if (!usernameDuplicateLookup[user.username]) {\n usernameDuplicateLookup[user.username] = [user];\n return;\n }\n\n usernameDuplicateLookup[user.username].push(user);\n });\n\n Object.keys(usernameDuplicateLookup).map(username => {\n if (usernameDuplicateLookup[username].length === 1) {\n validUsers.push(usernameDuplicateLookup[username][0]);\n return;\n }\n\n duplicateSets.push({\n errorCodes: [UserValidationCode.UsernameAlreadyExisted],\n users: usernameDuplicateLookup[username]\n });\n });\n\n /**\n * Find all remaining users in spreadsheet with duplicate emails\n */\n const emailDuplicateLookup: {[ email: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.email)\n return;\n\n if (!emailDuplicateLookup[user.email]) {\n emailDuplicateLookup[user.email] = [user];\n return;\n }\n\n emailDuplicateLookup[user.email].push(user);\n });\n\n Object.keys(emailDuplicateLookup).map(email => {\n if (emailDuplicateLookup[email].length === 1)\n return;\n\n const { username } = ArrayHelper.first(emailDuplicateLookup[email]);\n\n if (!username || usernameDuplicateLookup[username].length === 1) {\n duplicateSets.push({\n errorCodes: [UserValidationCode.EmailAlreadyExisted],\n users: emailDuplicateLookup[email]\n });\n } else {\n const dupeSetIndex = duplicateSets.findIndex(set => ArrayHelper.first(set.users).username === username);\n\n duplicateSets[dupeSetIndex].errorCodes.push(UserValidationCode.EmailAlreadyExisted);\n }\n });\n\n return duplicateSets;\n },\n\n formatCreateOrValidateUserRequest(\n users: EditUserRequest[],\n userType: UserGroup,\n customerId: string\n ): BulkCreateOrValidateUserRequest {\n return {\n users: users.map((u: EditUserRequest) => {\n const obj: EditUserRequest = {\n firstName: u.firstName,\n email: u.email,\n surname: u.surname,\n username: u.username,\n userType,\n customerId,\n masterRole: u.masterRole || UserRole.User,\n requirePasswordChange: false,\n generatePassword: !!u.generatePassword,\n password: u.password,\n displayName: u.displayName || null\n };\n\n if (userType === UserGroup.Learner)\n obj.yearGroupId = u.masterYearGroup?.id;\n\n if (!obj.username)\n delete obj.username;\n\n if (!obj.password)\n delete obj.password;\n\n if (obj.password && obj.generatePassword)\n obj.generatePassword = false;\n\n if (u.userId)\n obj.userId = u.userId;\n\n return obj;\n })\n };\n },\n\n formatEditUserRequest(user: EditUserRequest): EditUserRequest {\n if (!user.displayName)\n user.displayName = null;\n\n return user;\n },\n\n formatDeleteRequest(customerId: string, users?: User[], userType?: UserGroup): BulkDeleteUsersRequest {\n const body: BulkDeleteUsersRequest = {\n customerId\n };\n\n if (!users.length) {\n const queryParams = Core.LocationUtils.DeserializeQueryParams(\n Core.LocationUtils.GetCurrentQueryString().substring(1)\n );\n\n if (queryParams.query)\n body.searchQuery = queryParams.query;\n\n const statuses = queryParams.status &&\n (Array.isArray(queryParams.status) ? queryParams.status : [queryParams.status]);\n\n if (statuses?.length) {\n body.userStatuses = [];\n\n statuses.forEach(status => {\n if (status === 'active') body.userStatuses.push(ObjectStatus.Active);\n if (status === 'deactivated') body.userStatuses.push(ObjectStatus.Disabled);\n if (status === 'pending') body.userStatuses.push(ObjectStatus.Inactive);\n });\n }\n \n if (queryParams.yearGroup) {\n body.yearGroupValues = Array.isArray(queryParams.yearGroup) ? queryParams.yearGroup : [queryParams.yearGroup];\n }\n }\n\n if (Object.keys(body).length === 1) {\n body.userIds = users.map(u => u.id);\n } else {\n body.userType = userType;\n }\n\n return body;\n },\n\n formatToggleStatusRequest(user: User, customerId: string, newStatus: ObjectStatus): BulkUpdateUserStatusRequest {\n return {\n customerId,\n users: [{\n userId: user.id,\n status: newStatus\n }]\n };\n },\n\n getErrorMessages(\n errorCodes: UserValidationCode[],\n minPasswordLength: number,\n shortMessages?: boolean,\n localMessage?: HashObject\n ) {\n const messages: HashObject = {};\n\n const getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\n const CodeToMessageMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: getPhrase('emailRequired'),\n [UserValidationCode.FirstnameRequired]: getPhrase('nameRequired'),\n [UserValidationCode.SurnameRequired]: getPhrase('surnameRequired'),\n [UserValidationCode.YearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmailAlreadyExisted]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameAlreadyExisted]: getPhrase(shortMessages ? 'usernameExistsShort' : 'usernameExistsLong'),\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: getPhrase('emailExceeds'),\n [UserValidationCode.UsernameTooLong]: getPhrase('usernameExceeds'),\n [UserValidationCode.FirstnameTooLong]: getPhrase('nameExceeds'),\n [UserValidationCode.SurnameTooLong]: getPhrase('surnameExceeds'),\n [UserValidationCode.EmailInvalid]: getPhrase(shortMessages ? 'emailInvalidShort' : 'emailInvalidLong'),\n [UserValidationCode.EmailInUse]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameInvalid]: getPhrase(shortMessages ? 'usernameInvalidShort' : 'usernameInvalidLong'),\n [UserValidationCode.PasswordTooShort]: getPhrase(shortMessages ? 'passwordTooShortShort' : 'passwordTooShortLong', { minLength: minPasswordLength }),\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: getPhrase('displayNameExceeds'),\n [UserValidationCode.DisplayNameTooShort]: getPhrase('displayNameTooShort'),\n [UserValidationCode.UsernameTooShort]: getPhrase('usernameTooShort'),\n [UserValidationCode.FirstnameInvalid]: getPhrase('firstNameInvalid'),\n [UserValidationCode.SurnameInvalid]: getPhrase('surnameInvalid'),\n [UserValidationCode.CustomerFoundInOnline]: getPhrase('support'),\n [UserValidationCode.UserInCustomerWithOnline]: getPhrase('support'),\n [UserValidationCode.InvalidUserStatus]: getPhrase('support'),\n [UserValidationCode.UserTypeMismatch]: '',\n [UserValidationCode.UserCanBeAddedInCustomer]: '',\n [UserValidationCode.UserCanBeCreated]: '',\n [UserValidationCode.UserAlreadyExistsInCustomer]: '',\n [UserValidationCode.Rostered]: '',\n [UserValidationCode.InvalidYearGroup]: getPhrase('invalidYearGroupError')\n };\n\n const CodeToFieldMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: 'email',\n [UserValidationCode.FirstnameRequired]: 'firstName',\n [UserValidationCode.SurnameRequired]: 'surname',\n [UserValidationCode.YearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmailAlreadyExisted]: 'email',\n [UserValidationCode.UsernameAlreadyExisted]: 'username',\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: 'email',\n [UserValidationCode.UsernameTooLong]: 'username',\n [UserValidationCode.FirstnameTooLong]: 'firstName',\n [UserValidationCode.SurnameTooLong]: 'surname',\n [UserValidationCode.EmailInvalid]: 'email',\n [UserValidationCode.EmailInUse]: 'email',\n [UserValidationCode.UsernameInvalid]: 'username',\n [UserValidationCode.PasswordTooShort]: 'password',\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: 'displayName',\n [UserValidationCode.DisplayNameTooShort]: 'displayName',\n [UserValidationCode.UsernameTooShort]: 'username',\n [UserValidationCode.FirstnameInvalid]: 'firstName',\n [UserValidationCode.SurnameInvalid]: 'surname',\n [UserValidationCode.UserTypeMismatch]: 'email',\n [UserValidationCode.UserCanBeAddedInCustomer]: 'email',\n [UserValidationCode.UserCanBeCreated]: 'email',\n [UserValidationCode.CustomerFoundInOnline]: 'email',\n [UserValidationCode.UserInCustomerWithOnline]: 'email',\n [UserValidationCode.InvalidUserStatus]: 'email',\n [UserValidationCode.UserAlreadyExistsInCustomer]: 'email',\n [UserValidationCode.Rostered]: 'email',\n [UserValidationCode.InvalidYearGroup]: 'masterYearGroup'\n };\n\n errorCodes.forEach(code => {\n const message = localMessage?.[code] ?? CodeToMessageMap[code] ?? '';\n\n if (!message)\n return;\n\n const field = CodeToFieldMap[code];\n\n if (!field)\n return;\n\n messages[field] = localMessage?.[code]?.[field] ?? message;\n });\n\n return messages;\n },\n\n showEmptyState(userRequest: Flight.Response<UserCollection | SearchResults<User>>, queryParams: HashObject): boolean {\n if (!userRequest.data)\n return false;\n\n const hasQueryParams = Object.keys(queryParams).length;\n\n if (('results' in userRequest.data) || hasQueryParams)\n return false;\n\n return !userRequest.data.data?.length;\n },\n\n getFilters(customer: Customer, userType: UserGroup, yearGroups?: YearGroup[], countryCode?: string): SearchFilter[] {\n const filters = [Filters.SortBy(FilterHelper.getNameSortOptions())];\n\n if (userType === UserGroup.Learner && yearGroups?.length > 1)\n filters.push(Filters.YearGroup(FilterHelper.getYearGroupOptions(yearGroups)));\n\n filters.push(Filters.Status());\n \n if (userType === UserGroup.Staff)\n filters.push(Filters.IsAdmin(customer, countryCode));\n\n return filters;\n },\n\n getMinimumPasswordLength(\n securitySettings: SecuritySettingsResponse,\n userType: UserGroup,\n userRole: UserRole\n ): number {\n if (!securitySettings)\n return FALLBACK_MIN_PASSWORD_LENGTH;\n\n const customSetting = securitySettings.securitySettings?.find(s => {\n return s.userRole === userRole && s.userType === userType;\n });\n\n if (customSetting)\n return customSetting.minPasswordLength;\n\n if (userRole === UserRole.Admin || userRole === UserRole.SuperAdmin)\n return securitySettings.defaultAdminMinPasswordLength;\n\n return securitySettings.defaultMinPasswordLength;\n },\n\n mapStatusParamsToValue(statusParam: string | string[]): ObjectStatus[] {\n if (!statusParam)\n return;\n\n const convertToValue = (status: string): ObjectStatus => {\n switch (status) {\n case 'active':\n return ObjectStatus.Active;\n case 'deactivated':\n return ObjectStatus.Disabled;\n case 'pending':\n return ObjectStatus.Inactive;\n }\n };\n\n if (!Array.isArray(statusParam))\n return [convertToValue(statusParam)];\n\n return statusParam.map(convertToValue);\n },\n\n buildSearchData({\n customerId,\n userId,\n userType,\n queryParams = {}\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams\n }): HashObject {\n const filters = UserManagerHelper.buildSearchFiltersData(customerId, userType, queryParams);\n const sorts = UserManagerHelper.buildSearchSortData(customerId, queryParams);\n\n return {\n query: queryParams.query,\n indices: ['user'],\n searchType: 'user',\n customerIdOverride: customerId,\n userId,\n customerId,\n filters,\n sorts\n };\n },\n\n buildSearchDataAndKey({\n customerId,\n userId,\n userType,\n queryParams,\n cursor\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams?: UserManagerQueryParams,\n cursor?: string\n }): { key: string, data: HashObject } {\n const data = UserManagerHelper.buildSearchData({\n customerId,\n userId: userId || '',\n userType,\n queryParams: queryParams || {}\n });\n\n if (cursor)\n data.cursor = cursor;\n\n let key = `search:users:${cursor || ''}`;\n key += ObjectHelper.flattenObjectToString(data);\n\n return { key, data };\n },\n\n buildSearchParams(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n let filters = UserManagerHelper.buildSearchFiltersObject(customerId, userType, queryParams);\n\n filters = Object.keys(filters).reduce((prev: HashObject, current) => {\n prev[`${FilterConstants.FILTER_PARAM_PREFIX}${current}`] = filters[current];\n return prev;\n }, {});\n\n return {\n query: queryParams.query,\n index: 'user',\n customerIdOverride: customerId,\n ...filters\n };\n },\n\n buildSearchSortData(customerId: string, queryParams: UserManagerQueryParams = {}): HashObject {\n const sorts: HashObject = {};\n\n if (queryParams.sort) {\n switch (queryParams.sort) {\n case 'first-name-atoz':\n sorts.firstName = 'asc';\n break;\n\n case 'first-name-ztoa':\n sorts.firstName = 'desc';\n break;\n\n case 'surname-atoz':\n sorts.surname = 'asc';\n break;\n\n case 'surname-ztoa':\n sorts.surname = 'desc';\n break;\n\n case 'newest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n break;\n case 'oldest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'asc'\n }\n };\n break;\n\n default:\n break;\n }\n } else {\n // default to newest sort\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n }\n\n return sorts;\n },\n\n buildSearchFiltersData(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase()\n };\n\n filters.userProfile = {\n customerId\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userProfile.role = [ UserRole.Admin.toLowerCase(), UserRole.SuperAdmin.toLowerCase() ];\n\n if (queryParams.yearGroup) {\n filters.yearGroup = { customerId };\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup.value = queryParams.yearGroup;\n } else {\n filters.yearGroup.value = [queryParams.yearGroup];\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfile.status = [StatusMap[queryParams.status]];\n } else {\n filters.userProfile.status = queryParams.status.map(val => StatusMap[val]);\n }\n }\n\n return filters;\n },\n\n buildSearchFiltersObject(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase(),\n customerId: customerId.toString()\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userRole = UserRole.Admin.toLowerCase();\n\n if (queryParams.yearGroup) {\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup = `${queryParams.yearGroup.join(',')}`;\n } else {\n filters.yearGroup = queryParams.yearGroup;\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfileStatus = StatusMap[queryParams.status];\n } else {\n filters.userProfileStatus = queryParams.status.map(val => StatusMap[val]).join(',');\n }\n }\n\n return filters;\n },\n\n buildGetUsersQuery(\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): string {\n const { yearGroup = '', status = '', isAdmin = '', sort = 'newest' } = queryParams;\n\n const filters = [`usertype:${userType}`];\n\n if (yearGroup) {\n if (Array.isArray(yearGroup)) {\n filters.push(`yeargroups.value:[${yearGroup.join(',')}]`);\n } else {\n filters.push(`yeargroups.value:${yearGroup}`);\n }\n }\n\n if (isAdmin === 'true')\n filters.push(`userprofiles.role:${UserRole.Admin}`);\n\n if (status) {\n if (!Array.isArray(status)) {\n filters.push(`status:${StatusMap[status]}`);\n } else {\n filters.push(`status:[${status.map(val => StatusMap[val]).join(',')}]`);\n }\n }\n\n if (sort) {\n switch (sort) {\n case 'first-name-atoz':\n filters.push('orderby:name');\n break;\n \n case 'first-name-ztoa':\n filters.push('orderbydesc:name');\n break;\n \n case 'surname-atoz':\n filters.push('orderby:surname');\n break;\n \n case 'surname-ztoa':\n filters.push('orderbydesc:surname');\n break;\n\n case 'newest':\n filters.push('orderbydesc:timestamp');\n break;\n\n case 'oldest':\n filters.push('orderby:timestamp');\n break;\n \n default:\n break;\n }\n }\n\n return `{${filters.join(',')}}avatar`;\n },\n\n shouldDisplayAuthenticationMethods(users: User[]): boolean {\n if (!users?.length)\n return false;\n\n const hasFetchedAuthenticationMethods = !!ArrayHelper.first(users).authenticationMethods?.length;\n\n if (!hasFetchedAuthenticationMethods)\n return false;\n\n const userWithSSO = users.find(u => {\n const ssoLoginMethod = u.authenticationMethods?.find(am => !am.local);\n\n return !!ssoLoginMethod;\n });\n\n /**\n * If any user in the list has an authentication method that isn't local (meaning it's SSO)\n * then we display authentication methods.\n * \n * Otherwise we don't show them, as every user list item would just say \"ClickView\"\n */\n if (userWithSSO)\n return true;\n\n return false;\n },\n\n handleAsyncErrors(\n errors: ErroredUsers,\n updatedUser: EditUserRequest,\n oldUser: User | null,\n onDone: (options: FormSubmissionOptions) => void\n ): boolean {\n const errorCodes = errors?.[0]?.errorCodes;\n\n if (!errorCodes?.length)\n return true;\n\n const errorMessages: FormikErrors<EditUserRequest> = {};\n\n if (\n errorCodes.includes(UserValidationCode.EmailAlreadyExisted) ||\n errorCodes.includes(UserValidationCode.EmailInUse)\n ) {\n if (!oldUser || oldUser.email !== updatedUser.email)\n errorMessages.email = LanguageService.getPhrase(namespace, 'emailExistsLong');\n }\n\n if (errorCodes.includes(UserValidationCode.UsernameAlreadyExisted)) {\n if (!oldUser || oldUser.username !== updatedUser.username)\n errorMessages.username = LanguageService.getPhrase(namespace, 'usernameExistsLong');\n }\n\n if (!Object.keys(errorMessages).length)\n return true;\n\n onDone({\n errors: errorMessages\n });\n\n return false;\n },\n\n getInitialErrorsForInvalidYearGroups(yearGroup: YearGroup): FormikErrors<EditUserRequest> {\n if (!yearGroup || yearGroup.value === 0)\n return {\n masterYearGroup: LanguageService.getPhrase(namespace, 'yearGroupRequired') as FormikErrors<YearGroup>\n };\n\n return {};\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.emailSettings';\n\nexport const EmailSettingsValidationSchema = object().shape({\n email: string()\n .required(() => LanguageService.getPhrase(namespace, 'emailRequired'))\n .email(() => LanguageService.getPhrase(namespace, 'emailInvalid'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\n\nexport function VerifiedEmailIcon(): JSX.Element {\n return (\n <SvgContainer2>\n <svg viewBox='0 0 24 24'>\n <path d='M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z'/>\n </svg>\n </SvgContainer2>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { EmailSettingsValidationSchema } from './EmailSettingsValidationSchema';\nimport { VerifiedEmailIcon } from './VerifiedEmailIcon';\n\nconst namespace = 'settings.emailSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmailSettingsModel {\n email: string;\n}\n\ninterface EmailSettingsProps {\n currentUser: CurrentUser;\n onChangeEmail: (emailModel: EmailSettingsModel) => void;\n}\n\nexport function EmailSettings(props: EmailSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n const isVerified = props.currentUser.emailVerified;\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4 d-flex align-items-center'>\n <Text phrase='heading' />\n {isVerified && (\n <span className='font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2'>\n <Text phrase='verified' />\n <VerifiedEmailIcon />\n </span>\n )}\n </h2>\n\n {isVerified && (\n <p><Text phrase='info' options={{ email: props.currentUser.email }} /></p>\n )}\n\n {!showForm ?\n (\n <>\n <div className='d-flex'>\n <button className='btn btn-outline-dark me-2' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n </div>\n </>\n ) : (\n <FormWrapper<EmailSettingsModel>\n initialValues={{ email: props.currentUser.email || '' }}\n onSubmit={props.onChangeEmail}\n validationSchema={EmailSettingsValidationSchema}\n >\n <Form>\n <FormField\n className='w-75'\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n autoComplete='email'\n />\n <div className={`d-flex justify-content-end w-75 ${isSmallScreen ? 'ms-n2' : ''}`}>\n {isSmallScreen && (\n <button type='button' className='btn btn-link me-2' onClick={() => setShowForm(false)}>\n <Text phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={isVerified ? getPhrase('updateEmail') : getPhrase('verifyEmail')}\n variant={isVerified ? 'outline-dark' : 'dark'}\n />\n </div>\n </Form>\n </FormWrapper>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .partialLabel {\n width: 3.0625rem;\n height: 1.5rem;\n }\n\n .partialInfo {\n margin-bottom: 1rem;\n width: 28.125rem;\n height: 1.1875rem;\n }\n\n .partialInput {\n width: 25.75rem;\n height: 2.1875rem;\n }\n\n .partialSubmit {\n width: 6.75rem;\n height: 2.1875rem;\n }\n\n .partialNote {\n width: 30.625rem;\n height: 1.1875rem; \n }\n}","import React from 'react';\n\nimport styles from './partial-email-settings.module.scss';\n\nexport function PartialEmailSettings(): JSX.Element {\n return (\n <div className='w-50'>\n <div className={`partial-loading-background mb-2 ${styles.partialLabel}`} />\n <div className={`partial-loading-background ${styles.partialInfo}`} />\n\n <div className='form-group'>\n <div className={`partial-loading-background ${styles.partialInput}`} />\n </div>\n <div className={`partial-loading-background ${styles.partialSubmit}`} />\n <div className={`partial-loading-background mt-2 ${styles.partialNote}`} />\n </div>\n );\n}\n","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.changePasswordForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ChangePasswordFormProps {\n onClickCancel?: () => void;\n \n hideButtons?: boolean;\n buttonContainerClass?: string;\n buttonSize?: FormSize;\n hideCancelButton?: boolean;\n hideCurrentPassword?: boolean;\n inputWidthClass?: string;\n showChangeOnNextLogin?: boolean;\n\n submitText?: string;\n submitVariant?: ButtonProps['variant'];\n}\n\nChangePasswordForm.defaultProps = {\n submitVariant: 'outline-dark',\n buttonContainerClass: 'btn-container d-flex justify-content-end align-items-center',\n inputWidthClass: 'w-100'\n};\n\nexport function ChangePasswordForm(props: ChangePasswordFormProps): JSX.Element {\n const formikProps = useFormikContext<ChangePasswordRequest>();\n\n return (\n <Form>\n {!props.hideCurrentPassword && (\n <FormField\n className={props.inputWidthClass}\n name='currentPassword'\n label={getPhrase('currentPassword')}\n placeholder={getPhrase('currentPasswordPlaceholder')}\n type='password'\n autoComplete='current-password'\n showRequiredStar\n />\n )}\n\n <FormField\n className={props.inputWidthClass}\n name='newPassword'\n label={getPhrase('newPassword')}\n placeholder={getPhrase('newPasswordPlaceholder')}\n type='password'\n autoComplete='new-password'\n showRequiredStar\n />\n\n <FormField\n className={props.inputWidthClass}\n name='confirmPassword'\n label={getPhrase('confirmPassword')}\n placeholder={getPhrase('confirmPasswordPlaceholder')}\n type='password'\n autoComplete='off'\n showRequiredStar\n />\n\n {props.showChangeOnNextLogin &&\n <FormField\n id='changeOnNextLogin'\n name='changeOnNextLogin'\n label={getPhrase('changeOnNextLogin')}\n type='checkbox'\n checked={formikProps.values.changeOnNextLogin}\n checkboxLabelFontWeight='normal'\n />\n }\n \n {!props.hideButtons && (\n <div className={props.buttonContainerClass}>\n {(!props.hideCancelButton && !!props.onClickCancel) && (\n <button\n type='button'\n className={`btn btn-link me-2 ${props.buttonSize === 'lg' ? 'btn-lg' : ''}`}\n onClick={props.onClickCancel}\n >\n <Text namespace={namespace} phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={props.submitText || getPhrase('save')}\n variant={props.submitVariant}\n size={props.buttonSize}\n />\n </div>\n )}\n </Form>\n );\n}\n","import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.passwordSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getPasswordSettingsValidationSchema = (minPasswordLength: number) => object().shape({\n currentPassword: string()\n .required(() => getPhrase('currentPasswordRequired'))\n .trim()\n .default(''),\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minPasswordLength, () => getPhrase('newPasswordMinLength', { minLen: minPasswordLength }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\n\nimport { getPasswordSettingsValidationSchema } from './PasswordSettingsValidationSchema';\n\nconst namespace = 'settings.passwordSettings';\n\nconst initialValues: ChangePasswordRequest = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n};\n\ninterface PasswordSettingsProps {\n onChangePassword: (\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ) => void;\n minPasswordLength: number;\n}\n\nexport function PasswordSettings(props: PasswordSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n function onSubmitPassword(data: ChangePasswordRequest, onDone: (options?: FormSubmissionOptions) => void) {\n props.onChangePassword(data, onDone, () => onDone({ reset: true }));\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4'><Text phrase='heading' /></h2>\n\n {!showForm ?\n (\n <button className='btn btn-outline-dark ' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n ) : (\n <>\n <p><Text phrase='info' /></p>\n\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={onSubmitPassword}\n validationSchema={getPasswordSettingsValidationSchema(props.minPasswordLength)}\n >\n <ChangePasswordForm\n onClickCancel={() => setShowForm(false)}\n hideCancelButton={!isSmallScreen}\n submitText={LanguageService.getPhrase(namespace, 'savePassword')}\n buttonContainerClass={isSmallScreen ?\n 'd-flex justify-content-end ms-n2 w-75' :\n 'd-flex justify-content-end w-75'\n }\n inputWidthClass='w-75'\n />\n </FormWrapper>\n </>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces/ChangePasswordRequest';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { EmailSettings, EmailSettingsModel } from 'apps/settings/components/email-settings/EmailSettings';\nimport { PartialEmailSettings } from 'apps/settings/components/email-settings/partial-loading/PartialEmailSettings';\nimport { PasswordSettings } from 'apps/settings/components/password-settings/PasswordSettings';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/settings/flight-requests/UserManagerRequests';\n\nconst namespace = 'settings.accountSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AccountSettingsView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const masterCurrentUser = Flight.useBasicFetch<User>(currentUser.data &&\n UserManagerRequests.getUser(currentUser.data.id));\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n useSetPageMetadata({ title: getPhrase('heading') });\n\n function onChangeEmail(emailModel: EmailSettingsModel, onDone?: () => void): void {\n Flight.fetch(dispatch, UserManagerRequests.changeEmail(emailModel.email, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldEmail: currentUser.data.email,\n newEmail: emailModel.email\n }, {\n actionType: UserAction.VerifyEmail,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Start\n });\n\n alerts.success(getPhrase('changeEmailRequestSuccess', { email: emailModel.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('changeEmailRequestError'));\n }, onDone));\n }\n\n function onChangePassword(\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ): void {\n Flight.fetch(dispatch, UserManagerRequests.changePassword(passwordModel, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldPassword: passwordModel.currentPassword,\n newPassword: passwordModel.newPassword\n }, {\n actionType: UserAction.ChangePassword,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('changePasswordSuccess'));\n onSuccess();\n }, ({ responseJSON }: JQuery.jqXHR) => {\n if (responseJSON.errorCode === 'user.password-too-short')\n alerts.error(getPhrase('changePasswordRequirementsError'));\n else if (responseJSON.errorCode === 'user.invalid-password')\n alerts.error(getPhrase('changePasswordInvalid'));\n else if (responseJSON.errorCode === 'user.same-password')\n alerts.error(getPhrase('changePasswordSame'));\n else if (responseJSON.errorCode === 'user.locked-out')\n alerts.error(getPhrase('changePasswordLockedOut'));\n else\n alerts.error(getPhrase('changePasswordError'));\n }, onDone));\n }\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n passwordPolicy.data,\n masterCurrentUser.data?.userType,\n currentUser.data.role\n );\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {(currentUser.data) ?\n (\n <EmailSettings\n currentUser={currentUser.data}\n onChangeEmail={onChangeEmail}\n />\n ) : <PartialEmailSettings />\n }\n </div>\n\n <hr />\n\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {passwordPolicy.data && (\n <PasswordSettings onChangePassword={onChangePassword} minPasswordLength={minPasswordLength} />\n )}\n </div>\n </SettingsLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{n,t as r}from"./BJvPfCvt.chunk.js";import{t as i}from"./ImQRQGZr.chunk.js";import{C as a,M as o,dt as s,l as c,lt as l,m as u,s as d,ut as f}from"./Dun43GrB.chunk.js";import{t as p}from"./CFXUbsBS.chunk.js";import{l as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{n as ee}from"./C9ET3pjZ.chunk.js";import{t as g}from"./BVWg3YHX.chunk.js";import{i as te}from"./CEsevkum.chunk.js";import{t as _}from"./B20k2DA32.chunk.js";import{t as v}from"./Ca1QPe-q2.chunk.js";import{t as y}from"./Cz6swPXe2.chunk.js";import{n as b,t as x}from"./D7d5XFW82.chunk.js";import{n as ne,t as re}from"./DjIdG9LL2.chunk.js";import{n as S}from"./CL1ST5J62.chunk.js";import{r as C,t as w}from"./D2om474U2.chunk.js";import{t as T}from"./iTHYgnO8.chunk.js";import{$ as ie,F as E,I as ae,M as oe,N as D,q as se}from"./app-BIigh9wv.js";import{t as ce}from"./BRiYVLuz.chunk.js";import{t as O}from"./DlFudnBx.chunk.js";import{t as k}from"./DXfGdqxs.chunk.js";import{r as A}from"./B-6uVsUw2.chunk.js";import{t as j}from"./DO8_mR5i2.chunk.js";import{a as le,i as M,n as ue,o as de,r as fe,s as pe,t as N}from"./BsAo7Lri2.chunk.js";import{t as P}from"./C5i1HsPp2.chunk.js";import{a as me,i as he,n as F,r as I,t as L}from"./CKdklY2o2.chunk.js";import{t as R}from"./BEYV13jP2.chunk.js";import{t as ge}from"./BTqtjOL02.chunk.js";import{t as _e}from"./BaMNOAYj2.chunk.js";import{n as z,r as ve}from"./Ces-KTwe.chunk.js";import{t as ye}from"./BlBCp_pE.chunk.js";var B=e(f()),V={wrapper:`_wrapper_gw22e_1`,weekend:`_weekend_gw22e_4`},H=l();function be(e){return p.getWeekday(e)===0||p.getWeekday(e)===6}function xe(e){let{date:t,notCurrentMonth:n}=e,[r,i]=B.useState(0),a=`position-relative border ${e.theme.border} ${V.wrapper}`;be(t)&&(a+=` ${V.weekend}`),n&&(a+=`opacity-50`);let o=N.getEventsForDay(t,e.events||[],e.crossMonthEvents||[],e.viewingMonth),s={...e,eventsOnDay:o,sliderStep:r,setSliderStep:i};return(0,H.jsx)(`td`,{className:a,children:o?.length>0?(0,H.jsx)(E,{hoverableComponent:j,componentProps:s,hoverScale:1.35}):(0,H.jsx)(j,{...s,isHovering:!1})})}var U=`specialEvent.eventsEmptyState`,W=i.encloseNamespace(U);function Se(e){return(0,H.jsx)(x.Provider,{value:U,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl,altText:W(`info`)}),(0,H.jsx)(T.Heading,{children:e.heading||(0,H.jsx)(b,{phrase:`heading`})}),e.appLink&&(0,H.jsx)(T.Info,{children:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(b,{namespace:U,phrase:`info`}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:W(`link`)})})]})})]})})}var G={date:`_date_ez4o2_1`,first:`_first_ez4o2_4`};function Ce(e){let t={};e.events.forEach(e=>{let n=e.startDate;t[n]?t[n].push(e):t[n]=[e]});let n=Object.keys(t);return n.sort((e,t)=>p.isBefore(e,t)?-1:0),(0,H.jsx)(`div`,{className:`py-1`,children:n.map((n,r)=>{let i=``,a=``;return(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`h4 mt-4 ${G.date} ${r===0?G.first:``}`,children:N.getOrdinalDate(n)}),t[n].map(t=>(i=a,a=e.getStartTime?.(t.content),(0,H.jsx)(me,{getAppLink:(t,n)=>e.appLink(t,s.slugify(n)),event:t,presentationId:e.presentationId,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:()=>e.getActionLabel(t.content),getStartTime:e.getStartTime&&i!==a?e.getStartTime:null,isPastEvent:e.isPastEvent},t.content.id)))]},n)})})}var K={header:`_header_dbicu_1`,thead:`_thead_dbicu_4`};q.defaultProps={theme:{border:`border-light-blue`,background:`bg-light-blue`}};function q(e){let{appLinks:t,imageUrls:n}=e,r=D(),i=N.getEventsInMonth(e.events||[],e.viewingMonth),a=B.useMemo(()=>{let t=new Set(e.weekDays.reduce((e,t)=>e.concat(t),[]).map(e=>p.format(e,`YYYY-MM-DD`)));return(e.events||[]).filter(n=>{if(!n.startDate)return!1;let r=N.isEventFromPreviousMonth(n,e.viewingMonth),i=t.has(p.format(n.startDate,`YYYY-MM-DD`));return r&&!i})},[e.weekDays,e.events]),[o,s]=B.useState(!1),[c,l]=B.useState(null);return e.eventsLoaded&&!i?.length?(0,H.jsx)(Se,{imageUrl:n.emptyState,appLink:t.emptyStateRedirect?.(),heading:e.emptyStateHeading}):e.viewMode===`list`||r.xs||r.sm||r.md?e.eventsLoaded?(0,H.jsx)(Ce,{events:i,presentationId:e.presentationId,appLink:e.appLinks.event,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:e.getActionLabel,getStartTime:e.getStartTime,isPastEvent:e.isPastEvent}):(0,H.jsx)(`div`,{className:`d-flex justify-content-center align-items-center mb-4`,children:(0,H.jsx)(_,{as:`div`,animation:`border`,role:`status`})}):(0,H.jsxs)(`table`,{className:`user-select-none w-100 mt-3 overflow-hidden rounded-top-lg`,children:[(0,H.jsx)(`thead`,{className:`border ${e.theme.border} ${K.thead}`,children:(0,H.jsx)(`tr`,{className:`fw-semibold ${e.theme.background} ${K.header}`,children:e.weekDaysHeader.map(e=>(0,H.jsx)(`th`,{className:`px-2 h4`,scope:`col`,children:e},e))})}),(0,H.jsx)(`tbody`,{children:e.weekDays.map(t=>(0,H.jsx)(`tr`,{children:t.map(t=>(0,H.jsx)(xe,{date:t,notCurrentMonth:!!t.notCurrentMonth,events:e.events,crossMonthEvents:a,viewingMonth:e.viewingMonth,monthQuery:e.monthQuery,hasInitialized:o,setHasInitialized:s,presentationId:e.presentationId,hoveredEvent:c,theme:e.theme,setHoveredEvent:l,getEventsListAppLink:()=>e.appLinks.eventList(e.monthQuery,t,e.presentationId),getTopicAppLink:(t,n)=>e.appLinks.event(t,n),getIconUrl:e.getIconUrl,getBackgroundColor:e.getBackgroundColor,getCoverUrl:e.getCoverUrl,getHardCodedEvent:e.getHardCodedEvent,fadePastEvents:e.fadePastEvents,timezone:e.timezone},t.toString()))},t[0].toString()))})]})}var J={chevron:`_chevron_d411m_1`,left:`_left_d411m_4`,right:`_right_d411m_10`,viewModeContainer:`_viewModeContainer_d411m_16`},we=`specialEventCalendar.calendarNav`;function Te(e){return(0,H.jsxs)(`div`,{className:`${J.viewModeContainer} d-none d-lg-block`,children:[(0,H.jsx)(y,{svg:R,className:`${e.viewMode===`calendar`?`bg-dark text-white`:``} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`,onClick:()=>e.setViewMode(`calendar`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.Calendar,location:u.CalendarNav}}),(0,H.jsx)(y,{svg:ge,className:`${e.viewMode===`list`?`bg-dark text-white`:``} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`,onClick:()=>e.setViewMode(`list`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.List,location:u.CalendarNav}})]})}function Y(e){let i=e.action===`previous`?k:A,a=e.action===`previous`?J.left:J.right;function o(){t.trigger(e.appLink),e.onClick()}return(0,H.jsx)(v,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:`${J.chevron} ${a} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`,onClick:o,children:(0,H.jsx)(r,{svg:i,size:n.Medium,className:`svg-container d-inline-block ${J.svg}`})})}var X=new Date;function Ee(e){let{appLinks:t}=e,n=D();function r(n){let r=p.format(n,`MMMM`).toLocaleLowerCase(),i=t.month(r),a={};if(n){let e=new Date().getFullYear(),t=n.getFullYear();e!==t&&(a.year=t)}return e.queryParams?.classification&&(a.classification=e.queryParams.classification),e.queryParams?.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i.params=a,i}function o(){let t=p.add(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function s(){let t=p.subtract(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function l(){p.format(X,`M YY`)!==p.format(e.monthDate,`M YY`)&&e.setViewingMonthDate()}let{showPrev:d,showNext:f}=fe(e.monthDate),m={actionType:a.Click,entity:c.SpecialEvent,location:u.CalendarNav};function h(e){return p.format(e,`YYYY-MM-DD`)}return(0,H.jsxs)(`div`,{className:`d-flex flex-wrap gap-3 justify-content-end align-items-center`,children:[(0,H.jsx)(`h1`,{className:`mb-0 h2 me-auto`,children:p.format(e.monthDate,n.xs?`MMM YYYY`:`MMMM YYYY`)}),e.children,e.setViewMode&&(0,H.jsx)(Te,{viewMode:e.viewMode,setViewMode:e.setViewMode}),(0,H.jsxs)(`div`,{className:`d-flex gap-3`,children:[d&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.subtract(e.monthDate,1,`month`),`month`)),action:`previous`,onClick:s,analyticsOptions:m,analyticsData:{action:`previous`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))}}),(0,H.jsx)(v,{appLink:r(),className:`${J.todayWrapper} btn btn-outline-dark fw-semibold`,onClick:l,analyticsOptions:m,analyticsData:{action:`today`,date:h(p.startOf(X,`month`))},children:i.getPhrase(we,`today`)}),f&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.add(e.monthDate,1,`month`),`month`)),analyticsOptions:m,analyticsData:{action:`next`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))},action:`next`,onClick:o})]})]})}var Z=`specialEvent.eventsErrorState`,De=i.encloseNamespace(Z);function Oe(e){return(0,H.jsx)(x.Provider,{value:Z,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl}),(0,H.jsx)(T.Heading,{children:(0,H.jsx)(b,{phrase:`heading`})}),(0,H.jsxs)(T.Info,{children:[(0,H.jsx)(b,{namespace:Z,phrase:`info`}),(0,H.jsx)(`br`,{}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:De(`link`)})})]})]})})}var ke=new Date;function Ae(e=ke,n,r=!0){let i=de(r),a=B.useRef({}),o=p.format(e,`YYYY-MM`),s=B.useMemo(()=>{let t=a.current[o];if(!t){let{weeksTable:t,datePositionMap:n}=ue(e,r);return a.current[o]={weeksTable:t,datePositionMap:n},t}return t.weeksTable},[o,r]);function c(r){if(!r){t.trigger(n.calendar());return}if(o!==p.format(r,`YYYY-MM`)){let i=p.format(r,`MMMM`).toLocaleLowerCase(),a=new Date().getFullYear(),o=e.getFullYear(),s=n.month(i);a!==o&&(s.params={year:o}),t.trigger(s)}}return{weekDaysHeader:i,weekDays:s,monthDate:e,setMonthDate:c,startDate:h.first(h.first(s)),endDate:h.last(h.last(s))}}function je(e,t){let[n,r]=M(e),[i,a]=M(p.add(e,1,`month`)),[o,s]=M(p.subtract(e,1,`month`)),c={};t.yearGroup&&(c.audienceId=t.yearGroup),t.classification&&(c.topicId=t.classification,c.includeChildrenTopics=!0);let l=m(n&&r&&P.calendarLivestreams({from:p.format(n,`YYYY-MM-DD`),to:p.format(r,`YYYY-MM-DD`),...c})),u=m(i&&a&&P.calendarLivestreams({from:p.format(i,`YYYY-MM-DD`),to:p.format(a,`YYYY-MM-DD`),...c})),d=m(o&&s&&P.calendarLivestreams({from:p.format(o,`YYYY-MM-DD`),to:p.format(s,`YYYY-MM-DD`),...c}));return{events:h.uniq([...d.data||[],...l.data||[],...u.data||[]],e=>e.id),loaded:l.hasCompleted}}var Q=i.encloseNamespace(`livestreamCalendar.calendarView`);function Me(e){return e?o.pick(e,[`year`,`classification`,`yearGroup`]):{}}$.defaultProps={queryParams:{}};function $(e){let[{viewMode:t},n]=S(`calendar:mode`,{viewMode:`calendar`},{storage:te.LocalStorage}),{hasPermissions:r}=oe(),i=r(ee.StudentExperience),a=m(se.streamablePresentation()),s=m(a.data&&ce.presentationAudiences(g.StreamableLearning,a.data.id)),c=m(a.data&&O.topicsFromAllAvailablePresentations([a.data.id])),l=le(e.month),u=pe(e.month),{monthDate:d,setMonthDate:f,weekDays:h,weekDaysHeader:_,startDate:v,endDate:y}=Ae(u,L()),{events:b,loaded:x}=je(u,e.queryParams),T=p.format(d,`MMMM YYYY`);if(re(ne.getDefaultMetadata({title:T,phraseContext:{phraseHandler:Q,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:ye.getCanonicalLink({allowedParams:[`year`]}),allowIndexing:!0,product:ae.PRODUCT_NAME})),e.month!==null&&!l)return(0,H.jsx)(Oe,{imageUrl:F().errorState,appLink:z().calendar});let E=[{id:`classification`,name:Q(`subjectFilter`),options:c.data?.topics.map(e=>({name:e.name,id:e.topicIds.join(`:`)})),type:`checkbox`,compatibleIndices:[]},{id:`yearGroup`,name:Q(`gradeFilter`),type:`checkbox`,options:s.data?.map(e=>({name:e.name,id:e.masterId})),compatibleIndices:[]}];function D(){let t=p.format(d,`MMMM`).toLocaleLowerCase(),n=new Date().getFullYear(),r=d.getFullYear(),i=L().month(t),a={};return n!==r&&(a.year=r),e.queryParams.classification&&(a.classification=e.queryParams.classification),e.queryParams.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i}function k(e){return i||p.isBefore(e.endDateTime,new Date)?`pastActionLabel`:`actionLabel`}function A(){if(!N.getEventsInMonth(b||[],u).length&&(e.queryParams.yearGroup||e.queryParams.classification))return Q(`emptyStateText`)}function j(e){return w.createUrl(e.company.logo?.url,{size:C.Small})}function M(e){return w.createUrl(e.company.banner?.url,{size:C.Large})}return(0,H.jsxs)(`div`,{className:`bg-white px-4`,children:[(0,H.jsx)(ve,{appLinks:z(),active:`calendar`}),(0,H.jsx)(Ee,{monthDate:d,setViewingMonthDate:f,appLinks:L(),queryParams:e.queryParams,viewMode:t,setViewMode:e=>n({viewMode:e}),children:(0,H.jsx)(`div`,{className:`mx-n1 order-1 order-sm-0`,children:(0,H.jsx)(_e,{queryParams:o.omit(e.queryParams,[`year`]),mainFilters:E,appLink:D(),isFetchingOptions:!c.data||!a.data||!s.data,alignResetButtonLeft:!0,hideDivider:!0,hideHeading:!0,hideCaret:!1})})}),(0,H.jsxs)(`div`,{className:`position-relative mt-3 ${t===`list`?``:`mt-lg-0`}`,children:[(0,H.jsx)(`div`,{className:`d-block ${t===`list`?``:`d-lg-none`} position-absolute top-0 end-0 mt-2`,children:(0,H.jsx)(he,{})}),(0,H.jsx)(q,{weekDays:h,weekDaysHeader:_,events:b,monthQuery:{from:v?.toString(),to:y?.toString()},viewingMonth:u,eventsLoaded:x,presentationId:a.data?.id,appLinks:L(),imageUrls:F(),viewMode:t,getActionLabel:e=>Q(k(e)),getBackgroundColor:e=>e.company.metadata?.colour,getBannerUrl:M,getIconUrl:j,getStartTime:I.getStartTime,theme:{background:`bg-light-green`,border:`border-light-green`},emptyStateHeading:A(),fadePastEvents:!0,timezone:ie.ET,isPastEvent:I.isPastEvent})]})]})}export{$ as CalendarView,Me as sanitizeCalendarViewParams};
2
- //# sourceMappingURL=Br0Uc4GG.chunk.js.map
1
+ import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{n,t as r}from"./BJvPfCvt.chunk.js";import{t as i}from"./ImQRQGZr.chunk.js";import{C as a,M as o,dt as s,l as c,lt as l,m as u,s as d,ut as f}from"./Dun43GrB.chunk.js";import{t as p}from"./CFXUbsBS.chunk.js";import{l as m}from"./BQ5XMoHG.chunk.js";import{t as h}from"./B7tm2CBz.chunk.js";import{n as ee}from"./C9ET3pjZ.chunk.js";import{t as g}from"./BVWg3YHX.chunk.js";import{i as te}from"./CEsevkum.chunk.js";import{t as _}from"./B20k2DA32.chunk.js";import{t as v}from"./Ca1QPe-q2.chunk.js";import{t as y}from"./Cz6swPXe2.chunk.js";import{n as b,t as x}from"./D7d5XFW82.chunk.js";import{n as ne,t as re}from"./DjIdG9LL2.chunk.js";import{n as S}from"./CL1ST5J62.chunk.js";import{r as C,t as w}from"./D2om474U2.chunk.js";import{t as T}from"./iTHYgnO8.chunk.js";import{$ as ie,F as E,I as ae,M as oe,N as D,q as se}from"./app-gjHxcZG3.js";import{t as ce}from"./BRiYVLuz.chunk.js";import{t as O}from"./DlFudnBx.chunk.js";import{t as k}from"./DXfGdqxs.chunk.js";import{r as A}from"./B-6uVsUw2.chunk.js";import{t as j}from"./BmxcE73n2.chunk.js";import{a as le,i as M,n as ue,o as de,r as fe,s as pe,t as N}from"./iyIL3kim2.chunk.js";import{t as P}from"./DLofRa642.chunk.js";import{a as me,i as he,n as F,r as I,t as L}from"./D2FqnK9m2.chunk.js";import{t as R}from"./BEYV13jP2.chunk.js";import{t as ge}from"./BTqtjOL02.chunk.js";import{t as _e}from"./BWU6_pPN2.chunk.js";import{n as z,r as ve}from"./U_sIlzAD.chunk.js";import{t as ye}from"./BlBCp_pE.chunk.js";var B=e(f()),V={wrapper:`_wrapper_gw22e_1`,weekend:`_weekend_gw22e_4`},H=l();function be(e){return p.getWeekday(e)===0||p.getWeekday(e)===6}function xe(e){let{date:t,notCurrentMonth:n}=e,[r,i]=B.useState(0),a=`position-relative border ${e.theme.border} ${V.wrapper}`;be(t)&&(a+=` ${V.weekend}`),n&&(a+=`opacity-50`);let o=N.getEventsForDay(t,e.events||[],e.crossMonthEvents||[],e.viewingMonth),s={...e,eventsOnDay:o,sliderStep:r,setSliderStep:i};return(0,H.jsx)(`td`,{className:a,children:o?.length>0?(0,H.jsx)(E,{hoverableComponent:j,componentProps:s,hoverScale:1.35}):(0,H.jsx)(j,{...s,isHovering:!1})})}var U=`specialEvent.eventsEmptyState`,W=i.encloseNamespace(U);function Se(e){return(0,H.jsx)(x.Provider,{value:U,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl,altText:W(`info`)}),(0,H.jsx)(T.Heading,{children:e.heading||(0,H.jsx)(b,{phrase:`heading`})}),e.appLink&&(0,H.jsx)(T.Info,{children:(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(b,{namespace:U,phrase:`info`}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:W(`link`)})})]})})]})})}var G={date:`_date_ez4o2_1`,first:`_first_ez4o2_4`};function Ce(e){let t={};e.events.forEach(e=>{let n=e.startDate;t[n]?t[n].push(e):t[n]=[e]});let n=Object.keys(t);return n.sort((e,t)=>p.isBefore(e,t)?-1:0),(0,H.jsx)(`div`,{className:`py-1`,children:n.map((n,r)=>{let i=``,a=``;return(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`h4 mt-4 ${G.date} ${r===0?G.first:``}`,children:N.getOrdinalDate(n)}),t[n].map(t=>(i=a,a=e.getStartTime?.(t.content),(0,H.jsx)(me,{getAppLink:(t,n)=>e.appLink(t,s.slugify(n)),event:t,presentationId:e.presentationId,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:()=>e.getActionLabel(t.content),getStartTime:e.getStartTime&&i!==a?e.getStartTime:null,isPastEvent:e.isPastEvent},t.content.id)))]},n)})})}var K={header:`_header_dbicu_1`,thead:`_thead_dbicu_4`};q.defaultProps={theme:{border:`border-light-blue`,background:`bg-light-blue`}};function q(e){let{appLinks:t,imageUrls:n}=e,r=D(),i=N.getEventsInMonth(e.events||[],e.viewingMonth),a=B.useMemo(()=>{let t=new Set(e.weekDays.reduce((e,t)=>e.concat(t),[]).map(e=>p.format(e,`YYYY-MM-DD`)));return(e.events||[]).filter(n=>{if(!n.startDate)return!1;let r=N.isEventFromPreviousMonth(n,e.viewingMonth),i=t.has(p.format(n.startDate,`YYYY-MM-DD`));return r&&!i})},[e.weekDays,e.events]),[o,s]=B.useState(!1),[c,l]=B.useState(null);return e.eventsLoaded&&!i?.length?(0,H.jsx)(Se,{imageUrl:n.emptyState,appLink:t.emptyStateRedirect?.(),heading:e.emptyStateHeading}):e.viewMode===`list`||r.xs||r.sm||r.md?e.eventsLoaded?(0,H.jsx)(Ce,{events:i,presentationId:e.presentationId,appLink:e.appLinks.event,getIconUrl:e.getIconUrl,getBannerUrl:e.getBannerUrl,getBackgroundColor:e.getBackgroundColor,getActionLabel:e.getActionLabel,getStartTime:e.getStartTime,isPastEvent:e.isPastEvent}):(0,H.jsx)(`div`,{className:`d-flex justify-content-center align-items-center mb-4`,children:(0,H.jsx)(_,{as:`div`,animation:`border`,role:`status`})}):(0,H.jsxs)(`table`,{className:`user-select-none w-100 mt-3 overflow-hidden rounded-top-lg`,children:[(0,H.jsx)(`thead`,{className:`border ${e.theme.border} ${K.thead}`,children:(0,H.jsx)(`tr`,{className:`fw-semibold ${e.theme.background} ${K.header}`,children:e.weekDaysHeader.map(e=>(0,H.jsx)(`th`,{className:`px-2 h4`,scope:`col`,children:e},e))})}),(0,H.jsx)(`tbody`,{children:e.weekDays.map(t=>(0,H.jsx)(`tr`,{children:t.map(t=>(0,H.jsx)(xe,{date:t,notCurrentMonth:!!t.notCurrentMonth,events:e.events,crossMonthEvents:a,viewingMonth:e.viewingMonth,monthQuery:e.monthQuery,hasInitialized:o,setHasInitialized:s,presentationId:e.presentationId,hoveredEvent:c,theme:e.theme,setHoveredEvent:l,getEventsListAppLink:()=>e.appLinks.eventList(e.monthQuery,t,e.presentationId),getTopicAppLink:(t,n)=>e.appLinks.event(t,n),getIconUrl:e.getIconUrl,getBackgroundColor:e.getBackgroundColor,getCoverUrl:e.getCoverUrl,getHardCodedEvent:e.getHardCodedEvent,fadePastEvents:e.fadePastEvents,timezone:e.timezone},t.toString()))},t[0].toString()))})]})}var J={chevron:`_chevron_d411m_1`,left:`_left_d411m_4`,right:`_right_d411m_10`,viewModeContainer:`_viewModeContainer_d411m_16`},we=`specialEventCalendar.calendarNav`;function Te(e){return(0,H.jsxs)(`div`,{className:`${J.viewModeContainer} d-none d-lg-block`,children:[(0,H.jsx)(y,{svg:R,className:`${e.viewMode===`calendar`?`bg-dark text-white`:``} btn btn-outline-dark rounded-start rounded-end-0 border-end-0 px-3 h-100`,onClick:()=>e.setViewMode(`calendar`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.Calendar,location:u.CalendarNav}}),(0,H.jsx)(y,{svg:ge,className:`${e.viewMode===`list`?`bg-dark text-white`:``} btn btn-outline-dark rounded-end rounded-start-0 border-start-0 px-3 h-100`,onClick:()=>e.setViewMode(`list`),analyticsData:{},analyticsOptions:{entity:c.AppLink,actionType:a.Click,descriptor:d.List,location:u.CalendarNav}})]})}function Y(e){let i=e.action===`previous`?k:A,a=e.action===`previous`?J.left:J.right;function o(){t.trigger(e.appLink),e.onClick()}return(0,H.jsx)(v,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:`${J.chevron} ${a} border border-dark rounded-circle bg-white d-flex align-items-center justify-content-center`,onClick:o,children:(0,H.jsx)(r,{svg:i,size:n.Medium,className:`svg-container d-inline-block ${J.svg}`})})}var X=new Date;function Ee(e){let{appLinks:t}=e,n=D();function r(n){let r=p.format(n,`MMMM`).toLocaleLowerCase(),i=t.month(r),a={};if(n){let e=new Date().getFullYear(),t=n.getFullYear();e!==t&&(a.year=t)}return e.queryParams?.classification&&(a.classification=e.queryParams.classification),e.queryParams?.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i.params=a,i}function o(){let t=p.add(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function s(){let t=p.subtract(e.monthDate,1,`month`);e.setViewingMonthDate(t)}function l(){p.format(X,`M YY`)!==p.format(e.monthDate,`M YY`)&&e.setViewingMonthDate()}let{showPrev:d,showNext:f}=fe(e.monthDate),m={actionType:a.Click,entity:c.SpecialEvent,location:u.CalendarNav};function h(e){return p.format(e,`YYYY-MM-DD`)}return(0,H.jsxs)(`div`,{className:`d-flex flex-wrap gap-3 justify-content-end align-items-center`,children:[(0,H.jsx)(`h1`,{className:`mb-0 h2 me-auto`,children:p.format(e.monthDate,n.xs?`MMM YYYY`:`MMMM YYYY`)}),e.children,e.setViewMode&&(0,H.jsx)(Te,{viewMode:e.viewMode,setViewMode:e.setViewMode}),(0,H.jsxs)(`div`,{className:`d-flex gap-3`,children:[d&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.subtract(e.monthDate,1,`month`),`month`)),action:`previous`,onClick:s,analyticsOptions:m,analyticsData:{action:`previous`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))}}),(0,H.jsx)(v,{appLink:r(),className:`${J.todayWrapper} btn btn-outline-dark fw-semibold`,onClick:l,analyticsOptions:m,analyticsData:{action:`today`,date:h(p.startOf(X,`month`))},children:i.getPhrase(we,`today`)}),f&&(0,H.jsx)(Y,{appLink:r(p.startOf(p.add(e.monthDate,1,`month`),`month`)),analyticsOptions:m,analyticsData:{action:`next`,date:h(p.startOf(p.add(e.monthDate,1,`month`),`month`))},action:`next`,onClick:o})]})]})}var Z=`specialEvent.eventsErrorState`,De=i.encloseNamespace(Z);function Oe(e){return(0,H.jsx)(x.Provider,{value:Z,children:(0,H.jsxs)(T,{children:[(0,H.jsx)(T.Image,{src:e.imageUrl}),(0,H.jsx)(T.Heading,{children:(0,H.jsx)(b,{phrase:`heading`})}),(0,H.jsxs)(T.Info,{children:[(0,H.jsx)(b,{namespace:Z,phrase:`info`}),(0,H.jsx)(`br`,{}),(0,H.jsx)(v,{appLink:e.appLink,children:(0,H.jsx)(`span`,{className:`text-info`,children:De(`link`)})})]})]})})}var ke=new Date;function Ae(e=ke,n,r=!0){let i=de(r),a=B.useRef({}),o=p.format(e,`YYYY-MM`),s=B.useMemo(()=>{let t=a.current[o];if(!t){let{weeksTable:t,datePositionMap:n}=ue(e,r);return a.current[o]={weeksTable:t,datePositionMap:n},t}return t.weeksTable},[o,r]);function c(r){if(!r){t.trigger(n.calendar());return}if(o!==p.format(r,`YYYY-MM`)){let i=p.format(r,`MMMM`).toLocaleLowerCase(),a=new Date().getFullYear(),o=e.getFullYear(),s=n.month(i);a!==o&&(s.params={year:o}),t.trigger(s)}}return{weekDaysHeader:i,weekDays:s,monthDate:e,setMonthDate:c,startDate:h.first(h.first(s)),endDate:h.last(h.last(s))}}function je(e,t){let[n,r]=M(e),[i,a]=M(p.add(e,1,`month`)),[o,s]=M(p.subtract(e,1,`month`)),c={};t.yearGroup&&(c.audienceId=t.yearGroup),t.classification&&(c.topicId=t.classification,c.includeChildrenTopics=!0);let l=m(n&&r&&P.calendarLivestreams({from:p.format(n,`YYYY-MM-DD`),to:p.format(r,`YYYY-MM-DD`),...c})),u=m(i&&a&&P.calendarLivestreams({from:p.format(i,`YYYY-MM-DD`),to:p.format(a,`YYYY-MM-DD`),...c})),d=m(o&&s&&P.calendarLivestreams({from:p.format(o,`YYYY-MM-DD`),to:p.format(s,`YYYY-MM-DD`),...c}));return{events:h.uniq([...d.data||[],...l.data||[],...u.data||[]],e=>e.id),loaded:l.hasCompleted}}var Q=i.encloseNamespace(`livestreamCalendar.calendarView`);function Me(e){return e?o.pick(e,[`year`,`classification`,`yearGroup`]):{}}$.defaultProps={queryParams:{}};function $(e){let[{viewMode:t},n]=S(`calendar:mode`,{viewMode:`calendar`},{storage:te.LocalStorage}),{hasPermissions:r}=oe(),i=r(ee.StudentExperience),a=m(se.streamablePresentation()),s=m(a.data&&ce.presentationAudiences(g.StreamableLearning,a.data.id)),c=m(a.data&&O.topicsFromAllAvailablePresentations([a.data.id])),l=le(e.month),u=pe(e.month),{monthDate:d,setMonthDate:f,weekDays:h,weekDaysHeader:_,startDate:v,endDate:y}=Ae(u,L()),{events:b,loaded:x}=je(u,e.queryParams),T=p.format(d,`MMMM YYYY`);if(re(ne.getDefaultMetadata({title:T,phraseContext:{phraseHandler:Q,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:ye.getCanonicalLink({allowedParams:[`year`]}),allowIndexing:!0,product:ae.PRODUCT_NAME})),e.month!==null&&!l)return(0,H.jsx)(Oe,{imageUrl:F().errorState,appLink:z().calendar});let E=[{id:`classification`,name:Q(`subjectFilter`),options:c.data?.topics.map(e=>({name:e.name,id:e.topicIds.join(`:`)})),type:`checkbox`,compatibleIndices:[]},{id:`yearGroup`,name:Q(`gradeFilter`),type:`checkbox`,options:s.data?.map(e=>({name:e.name,id:e.masterId})),compatibleIndices:[]}];function D(){let t=p.format(d,`MMMM`).toLocaleLowerCase(),n=new Date().getFullYear(),r=d.getFullYear(),i=L().month(t),a={};return n!==r&&(a.year=r),e.queryParams.classification&&(a.classification=e.queryParams.classification),e.queryParams.yearGroup&&(a.yearGroup=e.queryParams.yearGroup),i}function k(e){return i||p.isBefore(e.endDateTime,new Date)?`pastActionLabel`:`actionLabel`}function A(){if(!N.getEventsInMonth(b||[],u).length&&(e.queryParams.yearGroup||e.queryParams.classification))return Q(`emptyStateText`)}function j(e){return w.createUrl(e.company.logo?.url,{size:C.Small})}function M(e){return w.createUrl(e.company.banner?.url,{size:C.Large})}return(0,H.jsxs)(`div`,{className:`bg-white px-4`,children:[(0,H.jsx)(ve,{appLinks:z(),active:`calendar`}),(0,H.jsx)(Ee,{monthDate:d,setViewingMonthDate:f,appLinks:L(),queryParams:e.queryParams,viewMode:t,setViewMode:e=>n({viewMode:e}),children:(0,H.jsx)(`div`,{className:`mx-n1 order-1 order-sm-0`,children:(0,H.jsx)(_e,{queryParams:o.omit(e.queryParams,[`year`]),mainFilters:E,appLink:D(),isFetchingOptions:!c.data||!a.data||!s.data,alignResetButtonLeft:!0,hideDivider:!0,hideHeading:!0,hideCaret:!1})})}),(0,H.jsxs)(`div`,{className:`position-relative mt-3 ${t===`list`?``:`mt-lg-0`}`,children:[(0,H.jsx)(`div`,{className:`d-block ${t===`list`?``:`d-lg-none`} position-absolute top-0 end-0 mt-2`,children:(0,H.jsx)(he,{})}),(0,H.jsx)(q,{weekDays:h,weekDaysHeader:_,events:b,monthQuery:{from:v?.toString(),to:y?.toString()},viewingMonth:u,eventsLoaded:x,presentationId:a.data?.id,appLinks:L(),imageUrls:F(),viewMode:t,getActionLabel:e=>Q(k(e)),getBackgroundColor:e=>e.company.metadata?.colour,getBannerUrl:M,getIconUrl:j,getStartTime:I.getStartTime,theme:{background:`bg-light-green`,border:`border-light-green`},emptyStateHeading:A(),fadePastEvents:!0,timezone:ie.ET,isPastEvent:I.isPastEvent})]})]})}export{$ as CalendarView,Me as sanitizeCalendarViewParams};
2
+ //# sourceMappingURL=CKUA5J3R.chunk.js.map