@clickview/lite 0.75.0-rc.9 → 0.75.1

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 (99) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{7103-lite-fef3024f61.chunk.css → 2878-lite-d8e0bf912a.chunk.css} +1 -1
  3. package/dist/css/{1243-lite-13eda8f6a0.chunk.css → 3615-lite-240342ff8e.chunk.css} +1 -1
  4. package/dist/css/{1867-lite-8baa8af02b.chunk.css → 4630-lite-0157b1c437.chunk.css} +1 -1
  5. package/dist/css/{4203-lite-9ffab89741.chunk.css → 8362-lite-10810fdef2.chunk.css} +1 -1
  6. package/dist/languages/en.json +1 -1
  7. package/dist/scripts/{104-7ee25cbbb8-lite.chunk.js → 104-da7394bcfa-lite.chunk.js} +2 -2
  8. package/dist/scripts/104-da7394bcfa-lite.chunk.js.map +1 -0
  9. package/dist/scripts/1192-bb27568f21-lite.chunk.js +2 -0
  10. package/dist/scripts/1192-bb27568f21-lite.chunk.js.map +1 -0
  11. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js +2 -0
  12. package/dist/scripts/1199-cf2cb206b5-lite.chunk.js.map +1 -0
  13. package/dist/scripts/1502-9836df10cd-lite.chunk.js +2 -0
  14. package/dist/scripts/1502-9836df10cd-lite.chunk.js.map +1 -0
  15. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js → 1610-0edaa98d40-lite.chunk.js} +2 -2
  16. package/dist/scripts/{1610-9ccecc428a-lite.chunk.js.map → 1610-0edaa98d40-lite.chunk.js.map} +1 -1
  17. package/dist/scripts/{7103-3b181ec69b-lite.chunk.js → 2878-487c4a8e1a-lite.chunk.js} +2 -2
  18. package/dist/scripts/2878-487c4a8e1a-lite.chunk.js.map +1 -0
  19. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js → 3057-a5bc753736-lite.chunk.js} +1 -1
  20. package/dist/scripts/{3057-1ae8087b3a-lite.chunk.js.map → 3057-a5bc753736-lite.chunk.js.map} +1 -1
  21. package/dist/scripts/3268-7be966dc82-lite.chunk.js +3 -0
  22. package/dist/scripts/3268-7be966dc82-lite.chunk.js.map +1 -0
  23. package/dist/scripts/{1243-72f3d31787-lite.chunk.js → 3615-a0da361aa5-lite.chunk.js} +2 -2
  24. package/dist/scripts/3615-a0da361aa5-lite.chunk.js.map +1 -0
  25. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js → 3872-cf9a6bdae8-lite.chunk.js} +1 -1
  26. package/dist/scripts/{3872-6fe7371d39-lite.chunk.js.map → 3872-cf9a6bdae8-lite.chunk.js.map} +1 -1
  27. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js +2 -0
  28. package/dist/scripts/4125-6d34b8b8f2-lite.chunk.js.map +1 -0
  29. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js +2 -0
  30. package/dist/scripts/4598-e25e9e03d6-lite.chunk.js.map +1 -0
  31. package/dist/scripts/{1867-0823a787c3-lite.chunk.js → 4630-4a35ecbf2b-lite.chunk.js} +2 -2
  32. package/dist/scripts/4630-4a35ecbf2b-lite.chunk.js.map +1 -0
  33. package/dist/scripts/{4806-e1b17af1de-lite.chunk.js → 4806-e65d319357-lite.chunk.js} +2 -2
  34. package/dist/scripts/4806-e65d319357-lite.chunk.js.map +1 -0
  35. package/dist/scripts/6475-f019242ec2-lite.chunk.js +2 -0
  36. package/dist/scripts/6475-f019242ec2-lite.chunk.js.map +1 -0
  37. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js → 6695-4ae0acad94-lite.chunk.js} +1 -1
  38. package/dist/scripts/{6695-4e01b4a18c-lite.chunk.js.map → 6695-4ae0acad94-lite.chunk.js.map} +1 -1
  39. package/dist/scripts/6756-3c7f911759-lite.chunk.js +3 -0
  40. package/dist/scripts/6756-3c7f911759-lite.chunk.js.map +1 -0
  41. package/dist/scripts/6790-1695fcf576-lite.chunk.js +2 -0
  42. package/dist/scripts/6790-1695fcf576-lite.chunk.js.map +1 -0
  43. package/dist/scripts/{7252-941e7573cf-lite.chunk.js → 7252-3540b11acb-lite.chunk.js} +3 -3
  44. package/dist/scripts/{7252-941e7573cf-lite.chunk.js.map → 7252-3540b11acb-lite.chunk.js.map} +1 -1
  45. package/dist/scripts/7438-35b887a48e-lite.chunk.js +2 -0
  46. package/dist/scripts/7438-35b887a48e-lite.chunk.js.map +1 -0
  47. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js → 8323-5694456903-lite.chunk.js} +2 -2
  48. package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.map → 8323-5694456903-lite.chunk.js.map} +1 -1
  49. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js → 8362-ed5df8f4fc-lite.chunk.js} +3 -3
  50. package/dist/scripts/8362-ed5df8f4fc-lite.chunk.js.LICENSE.txt +1 -0
  51. package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.map → 8362-ed5df8f4fc-lite.chunk.js.map} +1 -1
  52. package/dist/scripts/{8732-3e8332e620-lite.chunk.js → 8732-dc5182fb69-lite.chunk.js} +1 -1
  53. package/dist/scripts/{8732-3e8332e620-lite.chunk.js.map → 8732-dc5182fb69-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/8856-08061bbec5-lite.chunk.js +2 -0
  55. package/dist/scripts/8856-08061bbec5-lite.chunk.js.map +1 -0
  56. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js → 8957-b3f0dbb85d-lite.chunk.js} +1 -1
  57. package/dist/scripts/{8957-bc83ea1180-lite.chunk.js.map → 8957-b3f0dbb85d-lite.chunk.js.map} +1 -1
  58. package/dist/scripts/{9042-544d97a05d-lite.chunk.js → 9042-7c30ffd4f0-lite.chunk.js} +2 -2
  59. package/dist/scripts/9042-7c30ffd4f0-lite.chunk.js.map +1 -0
  60. package/dist/scripts/9134-b0ae877597-lite.chunk.js +2 -0
  61. package/dist/scripts/9134-b0ae877597-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{bundle-cf4c360278.min.js → bundle-e578e457e2.min.js} +3 -3
  63. package/dist/scripts/{bundle-cf4c360278.min.js.map → bundle-e578e457e2.min.js.map} +1 -1
  64. package/package.json +1 -1
  65. package/dist/scripts/104-7ee25cbbb8-lite.chunk.js.map +0 -1
  66. package/dist/scripts/1074-6dadbd8187-lite.chunk.js +0 -2
  67. package/dist/scripts/1074-6dadbd8187-lite.chunk.js.map +0 -1
  68. package/dist/scripts/1192-6ac54d734b-lite.chunk.js +0 -2
  69. package/dist/scripts/1192-6ac54d734b-lite.chunk.js.map +0 -1
  70. package/dist/scripts/1199-dc45a88be8-lite.chunk.js +0 -2
  71. package/dist/scripts/1199-dc45a88be8-lite.chunk.js.map +0 -1
  72. package/dist/scripts/1243-72f3d31787-lite.chunk.js.map +0 -1
  73. package/dist/scripts/1867-0823a787c3-lite.chunk.js.map +0 -1
  74. package/dist/scripts/3268-aa893d0068-lite.chunk.js +0 -2
  75. package/dist/scripts/3268-aa893d0068-lite.chunk.js.map +0 -1
  76. package/dist/scripts/4598-f5120153c2-lite.chunk.js +0 -2
  77. package/dist/scripts/4598-f5120153c2-lite.chunk.js.map +0 -1
  78. package/dist/scripts/4806-e1b17af1de-lite.chunk.js.map +0 -1
  79. package/dist/scripts/6475-502e390010-lite.chunk.js +0 -2
  80. package/dist/scripts/6475-502e390010-lite.chunk.js.map +0 -1
  81. package/dist/scripts/6756-20c0ab9591-lite.chunk.js +0 -3
  82. package/dist/scripts/6756-20c0ab9591-lite.chunk.js.map +0 -1
  83. package/dist/scripts/6790-df00506bec-lite.chunk.js +0 -2
  84. package/dist/scripts/6790-df00506bec-lite.chunk.js.map +0 -1
  85. package/dist/scripts/7103-3b181ec69b-lite.chunk.js.map +0 -1
  86. package/dist/scripts/7438-1162aba8b6-lite.chunk.js +0 -2
  87. package/dist/scripts/7438-1162aba8b6-lite.chunk.js.map +0 -1
  88. package/dist/scripts/8856-361fe76b7a-lite.chunk.js +0 -2
  89. package/dist/scripts/8856-361fe76b7a-lite.chunk.js.map +0 -1
  90. package/dist/scripts/9003-36ab592cc5-lite.chunk.js +0 -2
  91. package/dist/scripts/9003-36ab592cc5-lite.chunk.js.map +0 -1
  92. package/dist/scripts/9042-544d97a05d-lite.chunk.js.map +0 -1
  93. package/dist/scripts/9134-7037c2c47a-lite.chunk.js +0 -2
  94. package/dist/scripts/9134-7037c2c47a-lite.chunk.js.map +0 -1
  95. /package/dist/scripts/{4203-83f90f92f3-lite.chunk.js.LICENSE.txt → 3268-7be966dc82-lite.chunk.js.LICENSE.txt} +0 -0
  96. /package/dist/scripts/{6756-20c0ab9591-lite.chunk.js.LICENSE.txt → 6756-3c7f911759-lite.chunk.js.LICENSE.txt} +0 -0
  97. /package/dist/scripts/{7252-941e7573cf-lite.chunk.js.LICENSE.txt → 7252-3540b11acb-lite.chunk.js.LICENSE.txt} +0 -0
  98. /package/dist/scripts/{8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt → 8323-5694456903-lite.chunk.js.LICENSE.txt} +0 -0
  99. /package/dist/scripts/{bundle-cf4c360278.min.js.LICENSE.txt → bundle-e578e457e2.min.js.LICENSE.txt} +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7438],{29923:(e,t,r)=>{r.d(t,{F:()=>l});var n=r(32735),a=r(23481),o=r(89965),i=r(13876);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var s=a.T.encloseNamespace("sharev2.deleteShareContent");function l(e){var t,r,a,l=(r=n.useState(!1),a=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(r,a)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(e,t):void 0}}(r,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=l[0],d=l[1];return n.createElement("div",{className:"d-flex flex-column gap-3"},n.createElement("p",{className:"m-0"},e.phrases.leadingSentence),n.createElement("ul",{className:"m-0"},e.phrases.bulletPoints.map(function(e,t){return n.createElement("li",{key:t},e)})),n.createElement(o.X,{id:"ack",checked:u,onChange:function(e){return d(e.target.checked)},label:e.phrases.acknowledgement}),n.createElement(i.u,null,e.onBack&&n.createElement(i.u.Cancel,{onClick:e.onBack,text:null!==(t=e.phrases.backButton)&&void 0!==t?t:s("backButton"),variant:"link"}),n.createElement(i.u.Submit,{onClick:function(){u&&!e.loading&&e.onDelete()},text:e.phrases.deleteButton,variant:"danger",disabled:!u||e.loading,showSpinner:e.loading})))}},33518:(e,t,r)=>{var n;r.d(t,{e:()=>n}),function(e){e.Public="Public",e.PinCode="PinCode",e.PasswordProtected="PasswordProtected",e.ProtectedOverrideRestriction="ProtectedOverrideRestriction",e.JustMySchoolOverrideRestriction="JustMySchoolOverrideRestriction",e.Protected="Protected",e.JustMySchool="JustMySchool",e.Direct="Direct"}(n||(n={}))},18488:(e,t,r)=>{r.d(t,{o:()=>i});var n=r(99940),a=r(97395),o={namespace:"share-v2"},i={createShare:function(e){return{url:"{gateway}/v2/shares",key:"create:share-v2",type:n.k.POST,data:e,normalizeOptions:o,invalidationKeys:["sent:share-v2","get:share-v2:shares:object"]}},updateShare:function(e,t){return{url:"{gateway}/v2/shares/".concat(e),key:"update:share-v2",type:n.k.PUT,data:t,normalizeOptions:o,invalidationKeys:["share-v2:permanent-link:object","share-v2:".concat(e),"get:share-v2:shares:object"]}},deleteShare:function(e){return{type:n.k.DELETE,url:"{gateway}/v2/shares/".concat(e),key:"delete:share-v2",normalizeOptions:o,invalidationKeys:["share-v2:permanent-link:object","sent:share-v2","share-v2:".concat(e),"get:share-v2:shares:object"]}},getShare:function(e){return{url:"{gateway}/v2/shares/".concat(e),key:"share-v2:".concat(e),bootstrapName:"share-v2:".concat(e),type:n.k.GET,normalizeOptions:o}},getSentShares:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=Object.values(e).sort().join(":");return{url:a._.urlBuilder("{gateway}/v2/shares/sent",e),key:"sent:share-v2:".concat(t),type:n.k.GET,normalize:!1}},getShareLink:function(e){return{url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",{objectId:e}),key:"share-v2:permanent-link:object:".concat(e),normalizeOptions:o}},createShareLink:function(e){return{type:n.k.POST,url:a._.urlBuilder("{gateway}/v2/shares/permanent-link",Object.assign({},e)),key:"create:share-v2:permanent-link:object:".concat(e.objectId),invalidationKeys:["share-v2:permanent-link:object:".concat(e.objectId),"sent:share-v2","get:share-v2:shares:object:".concat(e.objectId)],normalizeOptions:o}},getPrivacy:function(e){return{url:"{gateway}/v1/objects/".concat(e,"/access"),key:"privacy:".concat(e),normalize:!1}},getSharesByObjectId:function(e){return{url:"{gateway}/v2/shares/objects/".concat(e),key:"get:share-v2:shares:object:".concat(e),type:n.k.GET,normalizeOptions:o}},createSharePincode:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"create:share-v2:".concat(e,":pincode"),type:n.k.POST}},getPincodeByShareId:function(e){return{url:"{gateway}/v2/shares/".concat(e,"/pincode"),key:"get:share-v2:".concat(e,":pincode")}},getPincodeByCode:function(e){return{url:"{gateway}/v2/shares/pincode?code=".concat(e),key:"get:share-v2:pincode:".concat(e)}}}},93563:(e,t,r)=>{r.d(t,{_:()=>s});var n=r(20354),a=r(57881),o=r(33518),i=r(18488),c=r(8233);function s(e){var t=n.a.useGetFetchAsync(),r=n.a.useBasicFetch(i.o.getPrivacy(e.entityId));return{loaded:!!r.data,updateShareLink:function(e,r){if(r.privacy===o.e.PasswordProtected)throw a.Y.logError("Cannot update to legacy share privacy(".concat(r.privacy,") for share with id ").concat(e)),new Error("invalid-share-privacy");return t(i.o.updateShare(e,r))},createShareLink:function(n){var a=null!=n?n:"protected"===c.R.getShareLinkAccessType(r.data)?o.e.Protected:o.e.JustMySchool;return t(i.o.createShareLink({objectId:e.entityId,privacy:a}))},deleteShareLink:function(e){return t(i.o.deleteShare(e))}}}},8233:(e,t,r)=>{r.d(t,{R:()=>y});var n=r(23481),a=r(110),o=r(33518),i=r(4594),c=r(49080),s=r(26361),l=r(35223),u=r(31908);function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var v=n.T.encloseNamespace("sharev2.utils"),y={getPrivateIconAndText:function(e){var t=e.entityTypeId,r=e.privacy,n=e.hasStudentExp,a=e.entity,c=e.yearGroups;if(t===i.E.Topic||t===i.E.Series)return{icon:l.vn.VisibleOn,text:v(n?"justMySchoolTeachers":"justMySchoolDescription")};if(!Array.isArray(r))switch(r){case o.e.Public:return{icon:l.vn.VisibleOn,text:v("publicDescription")};case o.e.ProtectedOverrideRestriction:return{icon:l.vn.VisibleOn,text:v("clickViewOnly")};case o.e.Protected:return{icon:l.vn.Lock,text:y.getRespectRatingText(a,c,n)};case o.e.JustMySchoolOverrideRestriction:return{icon:l.vn.Lock,text:v(n?"justMySchoolTeachers":"justMySchoolDescription")};case o.e.JustMySchool:return{icon:l.vn.Lock,text:y.getRespectRatingText(a,c,n)};case o.e.PinCode:return{icon:l.vn.Lock,text:v("pinDescription")};case o.e.PasswordProtected:return{icon:l.vn.Lock,text:v("password")};default:return{}}},getIconAndText:function(e){var t=e.linkExpireDate,r=e.isPasswordProtected,n=e.status;if(!t&&!r)return y.getPrivateIconAndText(e);if(!t)return{icon:l.vn.Lock,text:v("password")};var o=a.O.isToday(t),i=a.O.diffBetween(t,new Date,"day");if(!r){var s=o?v("expiryToday"):v("expiry",{days:i});return n===c.F.Expired&&(s=v("expired")),{icon:l.vn.Timer,text:s}}var u=o?v("passwordExpiryToday"):v("passwordExpiry",{days:i});return n===c.F.Expired&&(u=v("passwordExpired")),{icon:l.vn.Lock,text:u}},getRespectRatingText:function(e,t,r){var n;if(!e||!t)return null;if(r)return v("justMySchoolTeachers");if(!u.M.isVideoType(e))return v("collectionRating");var a=s.l.getWeightedRestriction(null===(n=e._restrictions)||void 0===n?void 0:n.value);if(a&&!a.yearGroup)return v("onlyAdmins");var o,i,c,l=u.M.getRating(e),y=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return d(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?d(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){c=!0,o=e},f:function(){try{i||null==r.return||r.return()}finally{if(c)throw o}}}}(t);try{for(y.s();!(c=y.n()).done;){var h=c.value;(!o||h.value>o.value)&&(o=h),a&&h.value<=a.yearGroup||l&&h.rating.value<l.value||(!i||h.value<i.value)&&(i=h)}}catch(e){y.e(e)}finally{y.f()}return i?1===t.length?v("clickViewOnly"):i.value===o.value?v("maxYearGroup",{yearGroup:o.name}):v("yearGroupRange",{yearGroup:i.name}):v("onlyStaff")},getShareLinkAccessType:function(e){return e.isTvContent||e.isClickViewContent?"protected":e.canManageAccess?"owner":"private"}}},17438:(e,t,r)=>{r.r(t),r.d(t,{DeleteOpenClassroomConfirmationView:()=>h});var n=r(32735),a=r(6044),o=r(23481),i=r(20354),c=r(29923),s=r(18488),l=r(93563),u=r(9111),d=r(69883);function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var y=o.T.encloseNamespace("sharev2.deleteOpenClassroomConfirmation");function h(e){var t,r,o,h=(0,d.Z)(),p=i.a.useBasicFetch(s.o.getShare(e.shareId)),f=(r=n.useState(!1),o=2,function(e){if(Array.isArray(e))return e}(r)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o,i,c=[],s=!0,l=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;s=!1}else for(;!(s=(n=o.call(r)).done)&&(c.push(n.value),c.length!==t);s=!0);}catch(e){l=!0,a=e}finally{try{if(!s&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw a}}return c}}(r,o)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,t):void 0}}(r,o)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),g=f[0],m=f[1],k=(0,l._)({entityId:null===(t=p.data)||void 0===t?void 0:t.objectId.toString()}).deleteShareLink,b=p.hasCompleted;return n.createElement(u.G,{title:y("title"),closePopup:e.closePopup,showLoadingSpinner:!b},n.createElement(c.F,{loading:g,phrases:{leadingSentence:y("intro"),bulletPoints:[y("loseAccessInfo"),y("loseAccessUsage")],acknowledgement:y("acknowledgement"),deleteButton:y("delete")},onDelete:function(){var t;m(!0),k(null===(t=p.data)||void 0===t?void 0:t.shareId).then(function(){m(!1),h.success(y("deleteSuccess")),e.closePopup(),e.previousAppLink&&a.C$.trigger(e.previousAppLink)}).catch(function(){h.error(y("deleteFailed"))}).finally(function(){m(!1)})}}))}}}]);
2
+ //# sourceMappingURL=7438-35b887a48e-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/7438-35b887a48e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/delete-share-content/DeleteShareContent.tsx","file:///app/packages/libs/shared/src/apps/share-v2/enums/SharePrivacy.ts","file:///app/packages/libs/shared/src/apps/share-v2/flight-requests/ShareRequests.ts","file:///app/packages/libs/shared/src/apps/share-v2/hooks/useShareLinkActions.ts","file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareLinkHelper.ts","file:///app/packages/libs/shared/src/apps/share-v2/views/delete-open-classroom-confirmation-view/DeleteOpenClassroomConfirmationView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\n\nconst namespace = 'sharev2.deleteShareContent';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface DeleteShareContentProps {\n loading: boolean;\n phrases: {\n leadingSentence: string;\n bulletPoints: string[];\n acknowledgement: string;\n deleteButton: string;\n backButton?: string;\n };\n onDelete: () => void;\n onBack?: () => void;\n}\n\nexport function DeleteShareContent(props: DeleteShareContentProps) {\n const [ ack, setAck ] = React.useState(false);\n\n function onDelete() {\n if (!ack || props.loading)\n return;\n\n props.onDelete();\n }\n\n return (\n <div className='d-flex flex-column gap-3'>\n <p className='m-0'>{props.phrases.leadingSentence}</p>\n <ul className='m-0'>\n {props.phrases.bulletPoints.map((phrase, index) => (\n <li key={index}>\n {phrase}\n </li>\n ))}\n </ul>\n <Checkbox\n id='ack'\n checked={ack}\n onChange={e => setAck(e.target.checked)}\n label={props.phrases.acknowledgement}\n />\n <PopupButtons>\n {props.onBack && (\n <PopupButtons.Cancel\n onClick={props.onBack}\n text={props.phrases.backButton ?? getPhrase('backButton')}\n variant='link'\n />\n )}\n <PopupButtons.Submit\n onClick={onDelete}\n text={props.phrases.deleteButton}\n variant='danger'\n disabled={!ack || props.loading}\n showSpinner={props.loading}\n />\n </PopupButtons>\n </div>\n );\n}","export enum SharePrivacy {\n Public = 'Public',\n PinCode = 'PinCode',\n PasswordProtected = 'PasswordProtected',\n ProtectedOverrideRestriction = 'ProtectedOverrideRestriction',\n JustMySchoolOverrideRestriction = 'JustMySchoolOverrideRestriction',\n Protected = 'Protected',\n JustMySchool = 'JustMySchool',\n Direct = 'Direct'\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { CreateShareLinkRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareLinkRequest';\nimport { CreateShareRequest } from 'libs/shared/apps/share-v2/interfaces/CreateShareRequest';\nimport { UpdateShareRequest } from 'libs/shared/apps/share-v2/interfaces/UpdateShareRequest';\n\nconst normalizeOptions: Flight.NormalizeOptions = {\n namespace: 'share-v2'\n};\n\nexport interface GetSentSharesParams {\n cursor?: string;\n scopeId?: string;\n objectTypeId?: number;\n type?: ShareType[];\n}\n\nexport const ShareRequests = {\n createShare(\n data: CreateShareRequest\n ): Flight.Request {\n return {\n url: '{gateway}/v2/shares',\n key: 'create:share-v2',\n type: HttpVerbs.POST,\n data,\n normalizeOptions,\n invalidationKeys: [ 'sent:share-v2', 'get:share-v2:shares:object' ]\n };\n },\n\n updateShare(\n shareId: string,\n data: UpdateShareRequest\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `update:share-v2`,\n type: HttpVerbs.PUT,\n data,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n \n deleteShare(\n shareId: string\n ): Flight.Request {\n return {\n type: HttpVerbs.DELETE,\n url: `{gateway}/v2/shares/${shareId}`,\n key: `delete:share-v2`,\n normalizeOptions,\n invalidationKeys: [ 'share-v2:permanent-link:object', 'sent:share-v2', `share-v2:${shareId}`, 'get:share-v2:shares:object' ]\n };\n },\n\n getShare(\n shareId: string\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}`,\n key: `share-v2:${shareId}`,\n bootstrapName: `share-v2:${shareId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n getSentShares(\n params: GetSentSharesParams = {}\n ): Flight.Request {\n const key = Object.values(params).sort().join(':');\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/sent', params),\n key: `sent:share-v2:${key}`,\n type: HttpVerbs.GET,\n normalize: false\n };\n },\n\n getShareLink(\n id: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { objectId: id }),\n key: `share-v2:permanent-link:object:${id}`,\n normalizeOptions\n };\n },\n\n createShareLink(\n data: CreateShareLinkRequest\n ): Flight.Request {\n return {\n type: HttpVerbs.POST,\n url: UrlHelper.urlBuilder('{gateway}/v2/shares/permanent-link', { ...data }),\n key: `create:share-v2:permanent-link:object:${data.objectId}`,\n invalidationKeys: [ `share-v2:permanent-link:object:${data.objectId}`, 'sent:share-v2', `get:share-v2:shares:object:${data.objectId}` ],\n normalizeOptions\n };\n },\n\n getPrivacy(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/objects/${id}/access`,\n key: `privacy:${id}`,\n normalize: false\n };\n },\n \n getSharesByObjectId(\n objectId: string | number\n ): Flight.Request {\n return {\n url: `{gateway}/v2/shares/objects/${objectId}`,\n key: `get:share-v2:shares:object:${objectId}`,\n type: HttpVerbs.GET,\n normalizeOptions\n };\n },\n\n createSharePincode(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `create:share-v2:${shareId}:pincode`,\n type: HttpVerbs.POST\n };\n },\n\n getPincodeByShareId(shareId: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/${shareId}/pincode`,\n key: `get:share-v2:${shareId}:pincode`\n };\n },\n\n getPincodeByCode(code: string): Flight.Request {\n return {\n url: `{gateway}/v2/shares/pincode?code=${code}`,\n key: `get:share-v2:pincode:${code}`\n };\n }\n};\n","import { Flight } from 'libs/common/react/index';\n\nimport { Logger } from 'libs/shared/utils/Logger';\n\nimport { SharePrivacy } from '../enums/SharePrivacy';\nimport { ShareRequests } from '../flight-requests/ShareRequests';\nimport { Share } from '../interfaces/Share';\nimport { SharePrivacyResponse } from '../interfaces/SharePrivacyResponse';\nimport { UpdateShareRequest } from '../interfaces/UpdateShareRequest';\nimport { ShareLinkHelper } from '../utils/ShareLinkHelper';\n\ninterface UseShareLinkActionsOptions {\n entityId: string;\n}\n\nexport function useShareLinkActions(options: UseShareLinkActionsOptions) {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const entityPrivacy = Flight.useBasicFetch<SharePrivacyResponse>(ShareRequests.getPrivacy(options.entityId));\n\n function getCreateSharePrivacy() {\n const accessType = ShareLinkHelper.getShareLinkAccessType(entityPrivacy.data);\n\n return accessType === 'protected'\n ? SharePrivacy.Protected\n : SharePrivacy.JustMySchool;\n }\n\n function updateShareLink(shareId: string, data: UpdateShareRequest): Promise<Share> {\n // Legacy share privacy - if we try to update to this we should log & throw an error\n if (data.privacy === SharePrivacy.PasswordProtected) {\n Logger.logError(`Cannot update to legacy share privacy(${data.privacy}) for share with id ${shareId}`);\n\n throw new Error('invalid-share-privacy');\n }\n \n return fetchAsync<Share>(ShareRequests.updateShare(shareId, data));\n }\n\n function createShareLink(privacy?: SharePrivacy): Promise<Share> {\n const requestPrivacy = privacy ?? getCreateSharePrivacy();\n return fetchAsync<Share>(ShareRequests.createShareLink({ objectId: options.entityId, privacy: requestPrivacy }));\n }\n\n function deleteShareLink(shareId: string): Promise<void> {\n return fetchAsync(ShareRequests.deleteShare(shareId));\n }\n\n return {\n loaded: !!entityPrivacy.data,\n updateShareLink,\n createShareLink,\n deleteShareLink\n };\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SharePrivacy } from 'libs/shared/apps/share-v2/enums/SharePrivacy';\nimport type { SharePrivacyResponse } from 'libs/shared/apps/share-v2/interfaces/SharePrivacyResponse';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ShareLinkStatus } from 'libs/shared/enums/ShareLinkStatus';\nimport type { BaseObject, YearGroup } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nconst namespace = 'sharev2.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface GetIconAndTextOptions {\n linkExpireDate: string;\n isPasswordProtected: boolean;\n privacy: SharePrivacy;\n status: ShareLinkStatus;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\ninterface GetPrivateIconAndTextOptions {\n privacy: SharePrivacy;\n entityTypeId: MasterType;\n hasStudentExp: boolean;\n entity: BaseObject;\n yearGroups: YearGroup[];\n}\n\nexport const ShareLinkHelper = {\n getPrivateIconAndText: (options: GetPrivateIconAndTextOptions) => {\n const { entityTypeId, privacy, hasStudentExp, entity, yearGroups } = options;\n \n if (entityTypeId === MasterType.Topic || entityTypeId === MasterType.Series)\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n \n /**\n * This is mainly for typescript, privacy will be an array for playlists\n * but that is handled above\n */\n if (Array.isArray(privacy))\n return;\n \n switch (privacy) {\n case SharePrivacy.Public:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('publicDescription') };\n case SharePrivacy.ProtectedOverrideRestriction:\n return { icon: cvSvgLibrary.VisibleOn, text: getPhrase('clickViewOnly') };\n case SharePrivacy.Protected:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.JustMySchoolOverrideRestriction:\n return { icon: cvSvgLibrary.Lock, text: getPhrase(hasStudentExp ? 'justMySchoolTeachers' : 'justMySchoolDescription') };\n case SharePrivacy.JustMySchool:\n return {\n icon: cvSvgLibrary.Lock,\n text: ShareLinkHelper.getRespectRatingText(entity, yearGroups, hasStudentExp)\n };\n case SharePrivacy.PinCode:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('pinDescription') };\n case SharePrivacy.PasswordProtected:\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n default:\n return {};\n }\n },\n\n getIconAndText: (options: GetIconAndTextOptions) => {\n const { linkExpireDate, isPasswordProtected, status } = options;\n if (!linkExpireDate && !isPasswordProtected)\n return ShareLinkHelper.getPrivateIconAndText(options);\n \n if (!linkExpireDate)\n return { icon: cvSvgLibrary.Lock, text: getPhrase('password') };\n \n const isToday = DateHelper.isToday(linkExpireDate);\n const dayDifference = DateHelper.diffBetween(linkExpireDate, new Date(), 'day');\n \n if (!isPasswordProtected) {\n let text = isToday\n ? getPhrase('expiryToday')\n : getPhrase('expiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('expired');\n \n return { icon: cvSvgLibrary.Timer, text };\n }\n \n let text = isToday\n ? getPhrase('passwordExpiryToday')\n : getPhrase('passwordExpiry', { days: dayDifference });\n \n if (status === ShareLinkStatus.Expired)\n text = getPhrase('passwordExpired');\n \n return { icon: cvSvgLibrary.Lock, text };\n },\n\n getRespectRatingText(video: BaseObject, yearGroups: YearGroup[], hasStudentExp: boolean) {\n if (!video || !yearGroups)\n return null;\n \n if (hasStudentExp)\n return getPhrase('justMySchoolTeachers');\n \n if (!VideoHelper.isVideoType(video))\n return getPhrase('collectionRating');\n \n const restriction = RestrictionHelper.getWeightedRestriction(video._restrictions?.value);\n \n /**\n * Restrictions without a year level are teacher restricitons, which means only admins can see it.\n */\n if (restriction && !restriction.yearGroup)\n return getPhrase('onlyAdmins');\n \n const rating = VideoHelper.getRating(video);\n \n let maxYearGroup: YearGroup;\n let minAllowedYearGroup: YearGroup;\n \n for (const yearGroup of yearGroups) {\n /**\n * If our year level is our new highest so far, save it\n */\n if (!maxYearGroup || yearGroup.value > maxYearGroup.value)\n maxYearGroup = yearGroup;\n \n /**\n * If the restriction is higher than this year level, skip it.\n */\n if (restriction && yearGroup.value <= restriction.yearGroup)\n continue;\n \n /**\n * If therating is higher than this year level's rating value, skip it.\n */\n if (rating && yearGroup.rating.value < rating.value)\n continue;\n \n /**\n * If our year level is the new lowest so far, save it\n */\n if (!minAllowedYearGroup || yearGroup.value < minAllowedYearGroup.value)\n minAllowedYearGroup = yearGroup;\n }\n \n /**\n * If no year levels are allowed, then it's staff only.\n */\n if (!minAllowedYearGroup)\n return getPhrase('onlyStaff');\n \n \n /**\n * If there's only one year level, and it's allowed, then we can just\n * say that everyone in your school can access it.\n */\n if (yearGroups.length === 1)\n return getPhrase('clickViewOnly');\n \n /**\n * We differentiate the copy if it's the highest year level or not. \n * Basically if we need to say \"X and above\" or not.\n */\n if (minAllowedYearGroup.value === maxYearGroup.value)\n return getPhrase('maxYearGroup', { yearGroup: maxYearGroup.name });\n \n return getPhrase('yearGroupRange', { yearGroup: minAllowedYearGroup.name });\n },\n\n getShareLinkAccessType(privacy: SharePrivacyResponse): 'private' | 'owner' | 'protected' {\n /**\n * If an entity is not a ClickView content and they cannot manage access\n * settings of the entity (which they can if its their private entity)\n * it means that its a TV content\n */\n if (privacy.isTvContent || privacy.isClickViewContent)\n return 'protected';\n\n if (privacy.canManageAccess)\n return 'owner';\n\n return 'private';\n }\n};","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { DeleteShareContent } from 'libs/shared/apps/share-v2/components/delete-share-content/DeleteShareContent';\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { useShareLinkActions } from 'libs/shared/apps/share-v2/hooks/useShareLinkActions';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'sharev2.deleteOpenClassroomConfirmation';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface DeleteOpenClassroomConfirmationViewProps extends PopupViewProps {\n shareId: string;\n previousAppLink?: Core.AppLink;\n}\n\nexport function DeleteOpenClassroomConfirmationView(props: DeleteOpenClassroomConfirmationViewProps) {\n const alerts = useAlerts();\n const share = Flight.useBasicFetch<Share>(ShareRequests.getShare(props.shareId));\n\n const [ loading, setLoading ] = React.useState(false);\n\n const { deleteShareLink: deleteShare } = useShareLinkActions({\n entityId: share.data?.objectId.toString()\n });\n \n function onClickDelete() {\n setLoading(true);\n\n deleteShare(share.data?.shareId).then(() => {\n setLoading(false);\n alerts.success(getPhrase('deleteSuccess'));\n props.closePopup();\n\n if (props.previousAppLink) {\n AppLinkHelper.trigger(props.previousAppLink);\n }\n }).catch(() => {\n alerts.error(getPhrase('deleteFailed'));\n }).finally(() => {\n setLoading(false);\n });\n }\n\n const loaded = share.hasCompleted;\n\n return (\n <Popup\n title={getPhrase('title')}\n closePopup={props.closePopup}\n showLoadingSpinner={!loaded}\n >\n <DeleteShareContent\n loading={loading}\n phrases={{\n leadingSentence: getPhrase('intro'),\n bulletPoints: [\n getPhrase('loseAccessInfo'),\n getPhrase('loseAccessUsage')\n ],\n acknowledgement: getPhrase('acknowledgement'),\n deleteButton: getPhrase('delete')\n }}\n onDelete={onClickDelete}\n />\n </Popup>\n );\n}"],"names":["getPhrase","DeleteShareContent","props","ack","setAck","className","phrases","leadingSentence","bulletPoints","map","phrase","index","key","id","checked","onChange","e","target","label","acknowledgement","onBack","onClick","text","backButton","variant","loading","onDelete","deleteButton","disabled","showSpinner","SharePrivacy","normalizeOptions","namespace","ShareRequests","createShare","data","url","type","invalidationKeys","updateShare","shareId","deleteShare","getShare","bootstrapName","getSentShares","params","Object","values","sort","join","normalize","getShareLink","objectId","createShareLink","getPrivacy","getSharesByObjectId","createSharePincode","getPincodeByShareId","getPincodeByCode","code","useShareLinkActions","options","fetchAsync","entityPrivacy","entityId","loaded","updateShareLink","privacy","Error","requestPrivacy","deleteShareLink","ShareLinkHelper","getPrivateIconAndText","entityTypeId","hasStudentExp","entity","yearGroups","icon","Array","isArray","getRespectRatingText","getIconAndText","linkExpireDate","isPasswordProtected","status","isToday","dayDifference","Date","days","video","restriction","_restrictions","value","yearGroup","maxYearGroup","minAllowedYearGroup","rating","length","name","getShareLinkAccessType","isTvContent","isClickViewContent","canManageAccess","DeleteOpenClassroomConfirmationView","alerts","share","setLoading","toString","hasCompleted","title","closePopup","showLoadingSpinner","then","success","previousAppLink","error"],"sourceRoot":""}
@@ -1,3 +1,3 @@
1
- /*! For license information please see 8323-d6d1d07ce5-lite.chunk.js.LICENSE.txt */
1
+ /*! For license information please see 8323-5694456903-lite.chunk.js.LICENSE.txt */
2
2
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8323],{90417:(e,t,n)=>{n.d(t,{N:()=>F,d:()=>M});var r=n(32735),a=n(23481),i=n(81886),o=n(2948),l=n(49985),c=n(65858),u=n(15611),s=n(83345),d=n(38143);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var f="userManager.userWizardBackButtons";function m(e){var t,n,a=(t=(0,o.D)(d.g.BULK_USER_ACTIONS),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],c=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return"status"===e.currentStep?r.createElement(r.Fragment,null):r.createElement(u.F,{className:"btn btn-link me-2",appLink:function(){switch(e.currentStep){case"review-accounts":return e.appLinks.userManager;case"select-action":return e.appLinks.bulkActionsReviewAccounts;case"action-details":return e.appLinks.bulkActionsSelectAction;case"confirmation":return function(){if(!(null==a?void 0:a.action))return null;switch(a.action){case"delete":return e.appLinks.bulkActionsActionDetails.delete;case"activation":return e.appLinks.bulkActionsActionDetails.activation;case"yearGroupRollover":return e.appLinks.bulkActionsActionDetails.yearGroupRollover;case"changeYearGroup":return e.appLinks.bulkActionsActionDetails.changeYearGroup;case"addToClassroom":return e.appLinks.bulkActionsActionDetails.addToClassroom;case"resetPassword":return e.appLinks.bulkActionsActionDetails.resetPassword;case"resetEmail":case"activationEmail":return e.appLinks.bulkActionsSelectAction;case"removeFromSchool":return e.appLinks.bulkActionsActionDetails.removeFromSchool}}()}}()},r.createElement(s.x,{namespace:f,phrase:"review-accounts"===e.currentStep?"cancel":"back"}))}var v=n(12458),h=n(149),b=n(17291),y=n(79352),g=n(96728),k=n(76881),A=n(89476),S=n(98269),E=n(56050),C=n(24453);function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var L="userManager.userWizardHeader";function I(e){var t,n,a=(t=(0,o.D)(d.g.BULK_USER_ACTIONS),n=1,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],c=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return w(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?w(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0],l=r.useContext(g.e),c=l.disableNext,p=l.onClickConfirm,f=l.showButtons;return C.O.getCurrentContext().appLink.action===e.appLinks.bulkActionsStatus.complete.action&&f?r.createElement(u.F,{className:"btn btn-dark ".concat(c?"disabled":""),appLink:e.appLinks.userManager,disabled:c,onClick:e.onFinish},r.createElement(s.x,{namespace:L,phrase:"finish"})):"confirmation"===e.currentStep?r.createElement(S.Z,{className:c?"disabled":"",variant:"dark",onClick:function(){v.I.onClickNext(a,e.currentStep),p()},disabled:c},r.createElement(s.x,{namespace:L,phrase:"confirm"})):"status"===e.currentStep?r.createElement(r.Fragment,null):r.createElement(u.F,{className:"btn btn-dark ".concat(c?"disabled":""),appLink:function(){switch(e.currentStep){case"review-accounts":return e.appLinks.bulkActionsSelectAction;case"select-action":return function(){if(!(null==a?void 0:a.action))return null;switch(a.action){case"delete":return e.appLinks.bulkActionsActionDetails.delete;case"activation":return e.appLinks.bulkActionsActionDetails.activation;case"yearGroupRollover":return e.appLinks.bulkActionsActionDetails.yearGroupRollover;case"changeYearGroup":return e.appLinks.bulkActionsActionDetails.changeYearGroup;case"addToClassroom":return e.appLinks.bulkActionsActionDetails.addToClassroom;case"resetPassword":return e.appLinks.bulkActionsActionDetails.resetPassword;case"resetEmail":return e.appLinks.bulkActionsConfirmation.resetEmail;case"activationEmail":return e.appLinks.bulkActionsConfirmation.activationEmail;case"removeFromSchool":return e.appLinks.bulkActionsActionDetails.removeFromSchool}i.Q.Ry.throw(new E.H("Missing switch statement case for ".concat(a.action," in BulkUserActionsContinueButton.tsx")))}();case"action-details":return e.appLinks.bulkActionsConfirmation[null==a?void 0:a.subAction];default:return null}}(),onClick:function(){return v.I.onClickNext(a,e.currentStep)},disabled:c},r.createElement(s.x,{namespace:L,phrase:"next"}))}function x(){return r.createElement(r.Fragment,null,r.createElement("div",{className:"partial-loading-background mb-2",style:{height:"1.75rem",width:"15rem"}}),r.createElement("div",{className:"partial-loading-background mb-3",style:{height:"1.5rem",width:"12rem"}}),r.createElement("div",{className:"partial-loading-background mb-2",style:{height:"8em",width:"40rem"}}))}const N={wizardContent:"UBwkq"};function T(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var U="userManager.bulkUserActionsWizardLayout",F="bulk-user-actions-wizard";function M(e){var t,n,u,s=(n=(0,o.D)(d.g.BULK_USER_ACTIONS),u=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],c=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return l}}(n,u)||function(e,t){if(e){if("string"==typeof e)return T(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?T(e,t):void 0}}(n,u)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=s[0],f=s[1],S=(0,A.f)();function E(){var t,n;if(p){var r={step:e.currentStep,userCount:null!==(n=null===(t=null==p?void 0:p.userIdMap)||void 0===t?void 0:t.size)&&void 0!==n?n:0},a=v.I.getAnalyticsActionName(p);a&&(r.action=a),l.k.logUserAction(r,{workflowPhase:c.eu.Discard,actionType:c.Vw.BulkAction,location:c.LZ.BulkUserActionsWizard,entity:c.py.User})}}r.useEffect(function(){var t;return(null===(t=null==p?void 0:p.userIdMap)||void 0===t?void 0:t.size)||e.preventRedirect?e.preventNavLock?void 0:(S.lock({id:F,title:a.T.getPhrase(U,"navLockTitle"),text:a.T.getPhrase(U,"navLockBody"),appLinkWhitelist:h.b.getWizardAppLinks(e.appLinks),onConfirmUnlock:function(){E(),f({})}}),function(){S.unlock(F)}):(i.Q.C$.trigger(e.appLinks.userManager,{replace:!0}),void E())},[]);var C=e.loaded&&!!(null===(t=e.users)||void 0===t?void 0:t.length);return r.createElement(g.D,null,r.createElement("div",{className:"px-3"},r.createElement(b.C,{title:a.T.getPhrase(U,"bulkActions"),currentStep:e.currentStep,hideHeader:e.hideHeader,loaded:e.loaded,continueButton:r.createElement(I,{currentStep:e.currentStep,appLinks:e.appLinks,onFinish:function(){f({})}}),backButton:r.createElement(m,{currentStep:e.currentStep,appLinks:e.appLinks}),breadcrumbs:[{name:a.T.getPhrase(U,"settingsBreadcrumb"),appLink:e.appLinks.settings},{name:a.T.getPhrase(U,e.userType===k.Y.Learner?"studentManager":"staffManager"),appLink:e.appLinks.userManager},{name:a.T.getPhrase(U,"bulkActions"),active:!0}]}),r.createElement("div",{className:"row g-0"},r.createElement("div",{className:"col-3"},r.createElement(y.a,{steps:h.b.getSteps(e.userType,e.userCount,e.appLinks,null==p?void 0:p.action),currentStep:e.currentStep,disableAppLinks:!C||e.disableAppLinks})),r.createElement("div",{className:"col-9 ".concat(N.wizardContent)},C?e.children:r.createElement(x,null)))))}},12458:(e,t,n)=>{n.d(t,{I:()=>c});var r=n(1048),a=n(49985),i=n(65858),o=n(58739),l=["userIdMap","params","action","subAction","allUsersSelected","allUsersCount","scrollContainer"],c={getAnalyticsActionName:function(e){if(!(null==e?void 0:e.action))return null;switch(e.action){case"activation":return(null==e?void 0:e.subAction)?"deactivate"===e.subAction?"Deactivate":"Reactivate":"Deactivate / reactivate";case"addToClassroom":return"Add to classroom";case"changeYearGroup":return"Change year level";case"delete":return"Delete user";case"resetEmail":return"Send password reset email";case"activationEmail":return"Send account activation email";case"resetPassword":return"Reset password";case"yearGroupRollover":return"Annual year level rollover";case"removeFromSchool":return"Remove user";default:return null}},onClickNext:function(e,t){if(e){var n={userCount:e.userIdMap.size,step:t},o=c.getAnalyticsActionName(e);o&&(n.action=o);var u=r.t.omit(e,l);Object.keys(u).length&&(n.actionData=u),a.k.logUserAction(n,{location:i.LZ.BulkUserActionsWizard,workflowPhase:i.eu.Next,actionType:i.Vw.BulkAction,entity:i.py.User})}},logYearGroupRolloverEntry:function(e){a.k.logUserAction({action:c.getAnalyticsActionName({action:"yearGroupRollover"})},{entity:i.py.User,actionType:i.Vw.BulkAction,workflowPhase:i.eu.Start,location:e})},getJobStatus:function(e){switch(e){case o.K.Completed:return"Success";case o.K.CompletedWithError:return"Completed with some errors";case o.K.Failed:return"Failed";default:return null}}}},17291:(e,t,n)=>{n.d(t,{C:()=>o});var r=n(32735),a=n(49935),i=n(96728);function o(e){var t=r.useContext(i.e).showButtons;return r.createElement("div",{className:"d-flex justify-content-between"},e.hideHeader?r.createElement("div",null):r.createElement("div",null,r.createElement("h1",{className:"h2"},e.title),e.breadcrumbs&&r.createElement("div",{className:"pb-3"},r.createElement(a.Oo,{breadcrumbs:e.breadcrumbs}))),e.loaded&&t&&r.createElement("div",{className:"d-flex align-items-center"},e.backButton,e.continueButton))}},79352:(e,t,n)=>{n.d(t,{a:()=>c});var r=n(32735),a=n(23481),i=n(15611),o=a.T.encloseNamespace("shared.wizardStepList");function l(e){var t,n,a,o,l,c=r.createElement(r.Fragment,null,r.createElement("div",{className:"d-flex"},!e.hideStepNumber&&r.createElement("div",{className:"flex-shrink-0 flex-grow-0"},"".concat(e.index+1,".")," "),r.createElement("div",null,e.text)),e.subText&&r.createElement("div",{className:"ms-2 ps-1 pt-1"},e.subText)),u="px-2 py-1 mb-1 rounded d-inline-block";return e.isSelected&&(u+=" ".concat((null===(t=e.theme)||void 0===t?void 0:t.isSelectedOverride)||"bg-light-blue fw-semibold")),!e.isSelected&&e.isCompleted&&(u+=" ".concat((null===(n=e.theme)||void 0===n?void 0:n.isCompletedOverride)||"text-info")),r.createElement("li",{className:null===(a=e.theme)||void 0===a?void 0:a.item},e.isCompleted&&e.appLink?r.createElement(i.F,{appLink:e.appLink,className:"".concat(u," ").concat((null===(o=e.theme)||void 0===o?void 0:o.itemContent)||"")},c):r.createElement("div",{className:"".concat(u," ").concat((null===(l=e.theme)||void 0===l?void 0:l.itemContent)||"")},c))}function c(e){var t,n=e.steps.reduce(function(t,n,r){return n.id===e.currentStep&&(t=r+1),t},1);return r.createElement(r.Fragment,null,r.createElement("h2",{className:"h4"},o("stepNumber",{currentStep:n,totalSteps:e.steps.length})),r.createElement("ol",{className:"list-unstyled ".concat((null===(t=e.theme)||void 0===t?void 0:t.itemsContainer)||"")},e.steps.map(function(t,a){var i=t.id===e.currentStep,o=n>a+1;return r.createElement(l,{index:a,key:t.id,text:t.text,subText:t.subText,isSelected:i,isCompleted:o,appLink:!e.disableAppLinks&&t.appLink,disabled:t.disabled,theme:e.theme})})))}},58739:(e,t,n)=>{var r;n.d(t,{K:()=>r}),function(e){e[e.Submitted=0]="Submitted",e[e.Queued=1]="Queued",e[e.Pending=2]="Pending",e[e.InProgress=3]="InProgress",e[e.Completed=4]="Completed",e[e.CompletedWithError=5]="CompletedWithError",e[e.Failed=6]="Failed"}(r||(r={}))},60115:(e,t,n)=>{n.d(t,{K:()=>u});var r=n(32735),a=n(50242),i=n(91967),o=400,l=n(45719);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function u(e,t,n,u,s,d){var p,f,m,v,h=(p=(0,r.useState)(0),f=2,function(e){if(Array.isArray(e))return e}(p)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],c=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return l}}(p,f)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(p,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),b=h[0],y=h[1],g=t,k=(0,l.P)(function(t){if(!e)return null;var n=e(t);return n?n.key:null},u,s);return m={fetchNextPage:function(){if(t&&e&&k)return y(function(e){return e+1}),g(k.nextCursor)},hasMore:!!(null==k?void 0:k.nextCursor),isFetching:null==k?void 0:k.isFetching,scrollContainer:d},v=function(){if(!m.isFetching){if(m.scrollContainer){var e=m.scrollContainer;if(e.getBoundingClientRect().height+e.scrollTop<e.scrollHeight-o)return}else if(window.innerHeight+document.documentElement.scrollTop<document.documentElement.scrollHeight-o)return;m.fetchNextPage()}},(0,r.useEffect)(function(){var e=i.q.throttle(v,200),t=m.scrollContainer||window;return m.hasMore&&t.addEventListener("scroll",e),function(){return t.removeEventListener("scroll",e)}},[m.hasMore,m.fetchNextPage,m.scrollContainer]),(0,r.useEffect)(function(){k&&k.shouldInitialFetch&&t&&(g(),y(function(e){return e+1}))},[null==k?void 0:k.shouldInitialFetch,t]),(0,r.useEffect)(function(){var e,t;if((null==k?void 0:k.statusCode)&&i.q.isFunction(n)){var r=+(null===(t=null===(e=k.statusCode)||void 0===e?void 0:e.toString())||void 0===t?void 0:t.substr(0,1));r!==a.k.ClientError&&r!==a.k.ServerError||n(b,k.statusCode)}},[null==k?void 0:k.statusCode]),{items:null==k?void 0:k.items,hasMore:!!(null==k?void 0:k.nextCursor),nextCursor:null==k?void 0:k.nextCursor,isFetching:null==k?void 0:k.isFetching,totalItems:null==k?void 0:k.totalItems,hasFirstPageCompleted:null==k?void 0:k.hasFirstPageCompleted}}},88323:(e,t,n)=>{n.d(t,{h:()=>E});var r=n(20354),a=n(32735),i=n(70680),o=n(81886),l=n(2948),c=n(49985),u=n(65858),s=n(90417),d=n(89422),p=n(38143),f=n(69217),m=n(60115),v=n(89476);function h(){var e,t,n="function"==typeof Symbol?Symbol:{},r=n.iterator||"@@iterator",a=n.toStringTag||"@@toStringTag";function i(n,r,a,i){var c=r&&r.prototype instanceof l?r:l,u=Object.create(c.prototype);return b(u,"_invoke",function(n,r,a){var i,l,c,u=0,s=a||[],d=!1,p={p:0,n:0,v:e,a:f,f:f.bind(e,4),d:function(t,n){return i=t,l=0,c=e,p.n=n,o}};function f(n,r){for(l=n,c=r,t=0;!d&&u&&!a&&t<s.length;t++){var a,i=s[t],f=p.p,m=i[2];n>3?(a=m===r)&&(c=i[(l=i[4])?5:(l=3,3)],i[4]=i[5]=e):i[0]<=f&&((a=n<2&&f<i[1])?(l=0,p.v=r,p.n=i[1]):f<m&&(a=n<3||i[0]>r||r>m)&&(i[4]=n,i[5]=r,p.n=m,l=0))}if(a||n>1)return o;throw d=!0,r}return function(a,s,m){if(u>1)throw TypeError("Generator is already running");for(d&&1===s&&f(s,m),l=s,c=m;(t=l<2?e:c)||!d;){i||(l?l<3?(l>1&&(p.n=-1),f(l,c)):p.n=c:p.v=c);try{if(u=2,i){if(l||(a="next"),t=i[a]){if(!(t=t.call(i,c)))throw TypeError("iterator result is not an object");if(!t.done)return t;c=t.value,l<2&&(l=0)}else 1===l&&(t=i.return)&&t.call(i),l<2&&(c=TypeError("The iterator does not provide a '"+a+"' method"),l=1);i=e}else if((t=(d=p.n<0)?c:n.call(r,p))!==o)break}catch(t){i=e,l=1,c=t}finally{u=1}}return{value:t,done:d}}}(n,a,i),!0),u}var o={};function l(){}function c(){}function u(){}t=Object.getPrototypeOf;var s=[][r]?t(t([][r]())):(b(t={},r,function(){return this}),t),d=u.prototype=l.prototype=Object.create(s);function p(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(e.__proto__=u,b(e,a,"GeneratorFunction")),e.prototype=Object.create(d),e}return c.prototype=u,b(d,"constructor",u),b(u,"constructor",c),c.displayName="GeneratorFunction",b(u,a,"GeneratorFunction"),b(d),b(d,a,"Generator"),b(d,r,function(){return this}),b(d,"toString",function(){return"[object Generator]"}),(h=function(){return{w:i,m:p}})()}function b(e,t,n,r){var a=Object.defineProperty;try{a({},"",{})}catch(e){a=0}b=function(e,t,n,r){if(t)a?a(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n;else{var i=function(t,n){b(e,t,function(e){return this._invoke(t,n,e)})};i("next",0),i("throw",1),i("return",2)}},b(e,t,n,r)}function y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,l=[],c=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=i.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){u=!0,a=e}finally{try{if(!c&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return l}}(e,t)||g(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function g(e,t){if(e){if("string"==typeof e)return k(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?k(e,t):void 0}}function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var A=n(31949),S=n(18087),E=function(e){var t,n=(0,S.Y)(e);return function(e){var t,n,b,A=h().m(M),S=e.appLinks,E=e.getUsersRequest,C=y((0,l.D)(p.g.BULK_USER_ACTIONS),2),w=C[0],L=C[1],I=(0,i.I0)(),x=(0,v.f)(),N=y(a.useState(!0),2),T=N[0],U=N[1],F=a.useRef({keys:null===(t=null==w?void 0:w.userIdMap)||void 0===t?void 0:t.keys(),pages:{}});function M(e,t){var n;return h().w(function(r){for(;;)switch(r.n){case 0:if(!(t-- >0)){r.n=3;break}if(n=e.next().value){r.n=1;break}return r.a(2);case 1:return r.n=2,n;case 2:r.n=0;break;case 3:return r.a(2)}},A)}function O(e){var t;if(!(null===(t=null==w?void 0:w.userIdMap)||void 0===t?void 0:t.size)||!F.current.keys)return null;if(F.current.pages[e]){var n=F.current.pages[e];return n.length?E(n):null}var r,a=function(e){if(Array.isArray(e))return k(e)}(r=M(F.current.keys,d.K.USER_PAGE_LIMIT))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(r)||g(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}();return F.current.pages[e]=a,a.length?E(a):(U(!1),null)}function j(e){var t=O(e);if(t)return r.a.getFetch(I)(t)}var P=(0,m.K)(O,j,null,function(e){return e},function(e){var t;return null===(t=e[e.length-1])||void 0===t?void 0:t.id},null==w?void 0:w.scrollContainer),B=P.items,D=P.isFetching,R=P.nextCursor,_=(0,f.N)();function z(){var e;return null===(e=null==w?void 0:w.userIdMap)||void 0===e?void 0:e.size}var G=null!==(n=null==B?void 0:B.filter(function(e){return w.userIdMap.has(e.id.toString())}))&&void 0!==n?n:[];return a.useEffect(function(){(null==w?void 0:w.userIdMap)&&!w.userIdMap.size&&setTimeout(function(){x.unlock(s.N),o.Q.C$.trigger(S.userManager,{replace:!0})},0)},[null===(b=null==w?void 0:w.userIdMap)||void 0===b?void 0:b.size,D]),{users:G,isFetching:D,removeUser:function(e){w.userIdMap.delete(e.id.toString()),L("allUsersSelected",!1),_(),c.k.logUserAction({id:e.id.toString(),userCount:z()},{location:u.LZ.BulkUserActionsWizard,entity:u.py.User,actionType:u.Vw.Remove})},hasMore:T,fetchNext:function(){return j(R)},count:z(),setAllUserIds:function(e){var t=new Map;e.forEach(function(e){t.set(e,!0)}),L({userIdMap:t,allUsersSelected:!0,allUsersCount:t.size}),F.current.keys=t.keys(),_()}}}({customerId:null===(t=r.a.useBasicFetch(A.N.currentUser()).data)||void 0===t?void 0:t.customerId,userType:e,appLinks:n,getUsersRequest:A.N.usersById})}}}]);
3
- //# sourceMappingURL=8323-d6d1d07ce5-lite.chunk.js.map
3
+ //# sourceMappingURL=8323-5694456903-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/8323-d6d1d07ce5-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserActionsBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserActionsContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayoutPartialLoading.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/bulk-user-actions-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/enums/BatchJobStatus.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkActionsUsers.ts","file:///app/packages/projects/lite/src/apps/user-manager/hooks/useBulkActionsUsersWrapper.ts"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { BulkUserActionStepId } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserActionsBackButtonProps {\n currentStep: BulkUserActionStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserActionsBackButton(props: BulkUserActionsBackButtonProps): JSX.Element {\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n function getActionDetailsAppLink(): Core.AppLink {\n if (!viewModel?.action)\n return null;\n \n switch (viewModel.action) {\n case 'delete':\n return props.appLinks.bulkActionsActionDetails.delete;\n case 'activation':\n return props.appLinks.bulkActionsActionDetails.activation;\n case 'yearGroupRollover':\n return props.appLinks.bulkActionsActionDetails.yearGroupRollover;\n case 'changeYearGroup':\n return props.appLinks.bulkActionsActionDetails.changeYearGroup;\n case 'addToClassroom':\n return props.appLinks.bulkActionsActionDetails.addToClassroom;\n case 'resetPassword':\n return props.appLinks.bulkActionsActionDetails.resetPassword;\n case 'resetEmail':\n return props.appLinks.bulkActionsSelectAction;\n case 'activationEmail':\n return props.appLinks.bulkActionsSelectAction;\n case 'removeFromSchool':\n return props.appLinks.bulkActionsActionDetails.removeFromSchool;\n }\n }\n\n function getAppLink(): Core.AppLink {\n switch (props.currentStep) {\n case 'review-accounts':\n return props.appLinks.userManager;\n \n case 'select-action':\n return props.appLinks.bulkActionsReviewAccounts;\n\n case 'action-details':\n return props.appLinks.bulkActionsSelectAction;\n\n case 'confirmation':\n return getActionDetailsAppLink();\n }\n }\n\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={getAppLink()}\n >\n <Text namespace={namespace} phrase={props.currentStep === 'review-accounts' ? 'cancel' : 'back'} />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserActionStepId } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserActionsContinueButtonProps {\n currentStep: BulkUserActionStepId;\n appLinks: UserManagerAppLinks;\n onFinish: () => void;\n}\n\nexport function BulkUserActionsContinueButton(props: BulkUserActionsContinueButtonProps): JSX.Element {\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n const { disableNext, onClickConfirm, showButtons } = React.useContext(WizardLayoutContext);\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n function getContinueAppLink(): Core.AppLink {\n switch (props.currentStep) {\n case 'review-accounts':\n return props.appLinks.bulkActionsSelectAction;\n case 'select-action':\n return getSelectActionAppLink();\n case 'action-details':\n return props.appLinks.bulkActionsConfirmation[viewModel?.subAction];\n default:\n return null;\n }\n }\n\n function getSelectActionAppLink(): Core.AppLink {\n if (!viewModel?.action)\n return null;\n \n switch (viewModel.action) {\n case 'delete':\n return props.appLinks.bulkActionsActionDetails.delete;\n case 'activation':\n return props.appLinks.bulkActionsActionDetails.activation;\n case 'yearGroupRollover':\n return props.appLinks.bulkActionsActionDetails.yearGroupRollover;\n case 'changeYearGroup':\n return props.appLinks.bulkActionsActionDetails.changeYearGroup;\n case 'addToClassroom':\n return props.appLinks.bulkActionsActionDetails.addToClassroom;\n case 'resetPassword':\n return props.appLinks.bulkActionsActionDetails.resetPassword;\n case 'resetEmail':\n return props.appLinks.bulkActionsConfirmation.resetEmail;\n case 'activationEmail':\n return props.appLinks.bulkActionsConfirmation.activationEmail;\n case 'removeFromSchool':\n return props.appLinks.bulkActionsActionDetails.removeFromSchool;\n }\n \n Core.ErrorHelper.throw(new DevError(`Missing switch statement case for ${viewModel.action} in BulkUserActionsContinueButton.tsx`));\n }\n\n if (currentAppLink.action === props.appLinks.bulkActionsStatus.complete.action && showButtons) {\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={props.appLinks.userManager}\n disabled={disableNext}\n onClick={props.onFinish}\n >\n <Text\n namespace={namespace}\n phrase={'finish'}\n />\n </AppLink>\n );\n }\n\n if (props.currentStep === 'confirmation') {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={() => {\n BulkUserActionsAnalyticsHelper.onClickNext(viewModel, props.currentStep);\n onClickConfirm();\n }}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='confirm'\n />\n </Button>\n );\n }\n\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getContinueAppLink()}\n onClick={() => BulkUserActionsAnalyticsHelper.onClickNext(viewModel, props.currentStep)}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","import React from 'react';\n\nexport function BulkUserActionsWizardLayoutPartialLoading(): React.ReactElement {\n return (\n <>\n <div className={`partial-loading-background mb-2`} style={{ height: '1.75rem', width: '15rem' }} />\n <div className={`partial-loading-background mb-3`} style={{ height: '1.5rem', width: '12rem' }} />\n <div className={`partial-loading-background mb-2`} style={{ height: '8em', width: '40rem' }} />\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"UBwkq\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BulkUserActionsBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserActionsBackButton';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { User } from 'libs/shared/interfaces';\n\nimport { BulkUserActionsContinueButton } from '../header/continue-buttons/BulkUserActionsContinueButton';\n\nimport { BulkUserActionsWizardLayoutPartialLoading } from './BulkUserActionsWizardLayoutPartialLoading';\n\nimport styles from './bulk-user-actions-wizard-layout.scss';\n\nconst namespace = 'userManager.bulkUserActionsWizardLayout';\n\nexport type BulkUserActionStepId = 'review-accounts' | 'select-action' | 'action-details' | 'confirmation' | 'status';\nexport type BulkUserActionOptions = 'delete' | 'activation' | 'changeYearGroup' | 'yearGroupRollover' | 'addToClassroom' | 'resetPassword' | 'resetEmail' | 'activationEmail' | 'removeFromSchool';\nexport type BulkUserSubAction = 'delete' | 'deactivate' | 'reactivate' | 'changeYearGroup' | 'yearGroupRollover' | 'addToClassroom' | 'resetPassword' | 'resetEmail' | 'activationEmail' | 'removeFromSchool';\n\nexport const BULK_USER_ACTIONS_NAV_LOCK_ID = 'bulk-user-actions-wizard';\n\ntype BulkUserActionsWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserActionStepId;\n users: User[];\n userCount: number;\n \n preventNavLock?: boolean;\n disableAppLinks?: boolean;\n hideHeader?: boolean;\n loaded: boolean;\n\n /**\n * Used by year level rollover to allow loading straight into the details view\n */\n preventRedirect?: boolean;\n}>;\n\nexport function BulkUserActionsWizardLayout(props: BulkUserActionsWizardLayoutProps): JSX.Element {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!viewModel?.userIdMap?.size && !props.preventRedirect) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n logWizardExitEvent();\n return;\n }\n\n if (props.preventNavLock)\n return;\n\n navLock.lock({\n id: BULK_USER_ACTIONS_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserActionsHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n logWizardExitEvent();\n setViewModel({});\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_ACTIONS_NAV_LOCK_ID);\n };\n }, []);\n\n function onFinish(): void {\n setViewModel({});\n }\n function logWizardExitEvent(): void {\n /**\n * If there is no viewmodel present when this is called, it means the viewmodel was never\n * initialized with data. This can happen for example if the user page loads onto the wizard.\n * In this case, we don't log an exit event.\n */\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n step: props.currentStep,\n userCount: viewModel?.userIdMap?.size ?? 0\n };\n\n const actionName: string | null = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n workflowPhase: WorkflowPhase.Discard,\n actionType: UserAction.BulkAction,\n location: LocationContext.BulkUserActionsWizard,\n entity: EntityType.User\n });\n }\n\n const loaded = props.loaded && !!props.users?.length;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader\n title={LanguageService.getPhrase(namespace, 'bulkActions')}\n currentStep={props.currentStep}\n hideHeader={props.hideHeader}\n loaded={props.loaded}\n continueButton={\n <BulkUserActionsContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n onFinish={onFinish}\n />\n }\n backButton={\n <BulkUserActionsBackButton currentStep={props.currentStep} appLinks={props.appLinks} />\n }\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkActions'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-3'>\n <WizardStepList<BulkUserActionStepId>\n steps={BulkUserActionsHelper.getSteps(\n props.userType,\n props.userCount,\n props.appLinks,\n viewModel?.action\n )}\n currentStep={props.currentStep}\n disableAppLinks={!loaded || props.disableAppLinks}\n />\n </div>\n\n <div className={`col-9 ${styles.wizardContent}`}>\n {loaded ?\n props.children :\n <BulkUserActionsWizardLayoutPartialLoading />\n }\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}\n","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`}&nbsp;</div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","export enum BatchJobStatus {\n Submitted = 0,\n Queued = 1,\n Pending = 2,\n InProgress = 3,\n Completed = 4,\n CompletedWithError = 5,\n Failed = 6\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { BULK_USER_ACTIONS_NAV_LOCK_ID } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { User } from 'libs/shared/interfaces';\n\ninterface Options {\n customerId: string;\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n\n getUsersRequest: (\n userIds: string[],\n success?: (users: User[]) => void,\n error?: () => void\n ) => Flight.Request;\n}\n\nexport const useBulkActionsUsers = (options: Options) => {\n const { appLinks, getUsersRequest } = options;\n\n const [ viewModel, setViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const dispatch = useDispatch();\n const navLock = useNavLock();\n\n function getCursor(items: User[]): string {\n return items[items.length - 1]?.id;\n }\n\n /**\n * We can't rely on the non-existance of a next cursor to determine if we have more items to fetch\n * so instead we assume we have more, and then set it to false when we don't in getRequest\n * - Sha\n */\n const [ hasMore, setHasMore ] = React.useState(true);\n const pagination = React.useRef<{ pages: HashObject<string[]>, keys: IterableIterator<string>}>({\n keys: viewModel?.userIdMap?.keys(),\n pages: {}\n });\n\n function* nextIds(iterable: IterableIterator<string>, take: number): Generator<string> {\n while (take-- > 0) {\n const next = iterable.next().value;\n if (!next) return;\n yield next;\n }\n }\n\n function getRequest(lastId?: string): Flight.Request {\n if (!viewModel?.userIdMap?.size || !pagination.current.keys)\n return null;\n\n if (pagination.current.pages[lastId]) {\n const ids = pagination.current.pages[lastId];\n\n if (!ids.length) return null;\n return getUsersRequest(ids);\n }\n\n const ids = [...nextIds(pagination.current.keys, UserManagerConstants.USER_PAGE_LIMIT)];\n pagination.current.pages[lastId] = ids;\n\n if (!ids.length) {\n setHasMore(false);\n return null;\n }\n return getUsersRequest(ids);\n }\n\n function fetchNext(cursor?: string) {\n const request = getRequest(cursor);\n\n if (!request)\n return;\n\n return Flight.getFetch(dispatch)(request);\n }\n\n const {\n items,\n isFetching,\n nextCursor\n } = useInfiniteList<User, User[]>(getRequest, fetchNext, null, d => d, getCursor, viewModel?.scrollContainer);\n\n const forceUpdate = useForceUpdate();\n function removeUser(user: User): void {\n viewModel.userIdMap.delete(user.id.toString());\n setViewModel('allUsersSelected', false);\n forceUpdate();\n\n AnalyticsHelper.logUserAction({\n id: user.id.toString(),\n userCount: getCount()\n }, {\n location: LocationContext.BulkUserActionsWizard,\n entity: EntityType.User,\n actionType: UserAction.Remove\n });\n }\n\n function getCount(): number {\n return viewModel?.userIdMap?.size;\n }\n\n /**\n * Should only be used by the year level rollover details page\n */\n function setAllUserIds(userIds: string[]): void {\n const map = new Map<string, boolean>();\n userIds.forEach(id => {\n map.set(id, true);\n });\n setViewModel({\n userIdMap: map,\n allUsersSelected: true,\n allUsersCount: map.size\n });\n pagination.current.keys = map.keys();\n forceUpdate();\n }\n\n const users = items?.filter(u => viewModel.userIdMap.has(u.id.toString())) ?? [];\n\n // This hook detects if the user has removed all users\n React.useEffect(() => {\n if (!viewModel?.userIdMap || viewModel.userIdMap.size)\n return;\n\n // If this is reached, it means the admin has removed all users from the selected list.\n // The setTimeout here allows react to run it's final UI updates with the new state before we dispose of the view.\n setTimeout(() => {\n navLock.unlock(BULK_USER_ACTIONS_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(appLinks.userManager, { replace: true });\n }, 0);\n }, [ viewModel?.userIdMap?.size, isFetching ]);\n\n return {\n users,\n isFetching,\n removeUser,\n hasMore,\n fetchNext: () => fetchNext(nextCursor),\n count: getCount(),\n setAllUserIds\n };\n};","import { Flight } from 'libs/common/flight';\n\nimport { useBulkActionsUsers } from 'libs/shared/apps/user-manager/hooks/useBulkActionsUsers';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nexport const useBulkActionsUsersWrapper = (userType: UserGroup) => {\n const appLinks = getUserManagerAppLinks(userType);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n return useBulkActionsUsers({\n customerId: currentUser.data?.customerId,\n userType,\n appLinks,\n getUsersRequest: UserRequests.usersById\n });\n};"],"names":["namespace","BulkUserActionsBackButton","props","viewModel","SharedViewModelKeys","currentStep","AppLink","className","appLink","appLinks","userManager","bulkActionsReviewAccounts","bulkActionsSelectAction","action","bulkActionsActionDetails","activation","yearGroupRollover","changeYearGroup","addToClassroom","resetPassword","removeFromSchool","getActionDetailsAppLink","getAppLink","Text","phrase","BulkUserActionsContinueButton","WizardLayoutContext","disableNext","onClickConfirm","showButtons","ContextService","bulkActionsStatus","complete","disabled","onClick","onFinish","Button","variant","BulkUserActionsAnalyticsHelper","bulkActionsConfirmation","resetEmail","activationEmail","DevError","getSelectActionAppLink","subAction","getContinueAppLink","BulkUserActionsWizardLayoutPartialLoading","style","height","width","BULK_USER_ACTIONS_NAV_LOCK_ID","BulkUserActionsWizardLayout","setViewModel","navLock","useNavLock","logWizardExitEvent","analyticsData","step","userCount","userIdMap","size","actionName","AnalyticsHelper","workflowPhase","actionType","location","entity","preventRedirect","preventNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserActionsHelper","onConfirmUnlock","unlock","replace","loaded","users","length","WizardHeader","hideHeader","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","disableAppLinks","children","BaseBulkUserActionsViewModelKeys","getAnalyticsActionName","onClickNext","actionData","ObjectHelper","Object","keys","logYearGroupRolloverEntry","getJobStatus","status","BatchJobStatus","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","reduce","acc","i","totalSteps","itemsContainer","map","key","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useBulkActionsUsersWrapper","nextIds","getUsersRequest","dispatch","setHasMore","pagination","pages","iterable","take","next","value","lastId","current","ids","UserManagerConstants","d","forceUpdate","useForceUpdate","getCount","filter","u","has","setTimeout","removeUser","user","count","setAllUserIds","userIds","Map","forEach","set","allUsersSelected","allUsersCount","useBulkActionsUsers","customerId","UserRequests","data"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/8323-5694456903-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserActionsBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserActionsContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayoutPartialLoading.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/bulk-user-actions-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/step-list/WizardStepList.tsx","file:///app/packages/libs/shared/src/enums/BatchJobStatus.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkActionsUsers.ts","file:///app/packages/projects/lite/src/apps/user-manager/hooks/useBulkActionsUsersWrapper.ts"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { BulkUserActionStepId } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserActionsBackButtonProps {\n currentStep: BulkUserActionStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserActionsBackButton(props: BulkUserActionsBackButtonProps): JSX.Element {\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n function getActionDetailsAppLink(): Core.AppLink {\n if (!viewModel?.action)\n return null;\n \n switch (viewModel.action) {\n case 'delete':\n return props.appLinks.bulkActionsActionDetails.delete;\n case 'activation':\n return props.appLinks.bulkActionsActionDetails.activation;\n case 'yearGroupRollover':\n return props.appLinks.bulkActionsActionDetails.yearGroupRollover;\n case 'changeYearGroup':\n return props.appLinks.bulkActionsActionDetails.changeYearGroup;\n case 'addToClassroom':\n return props.appLinks.bulkActionsActionDetails.addToClassroom;\n case 'resetPassword':\n return props.appLinks.bulkActionsActionDetails.resetPassword;\n case 'resetEmail':\n return props.appLinks.bulkActionsSelectAction;\n case 'activationEmail':\n return props.appLinks.bulkActionsSelectAction;\n case 'removeFromSchool':\n return props.appLinks.bulkActionsActionDetails.removeFromSchool;\n }\n }\n\n function getAppLink(): Core.AppLink {\n switch (props.currentStep) {\n case 'review-accounts':\n return props.appLinks.userManager;\n \n case 'select-action':\n return props.appLinks.bulkActionsReviewAccounts;\n\n case 'action-details':\n return props.appLinks.bulkActionsSelectAction;\n\n case 'confirmation':\n return getActionDetailsAppLink();\n }\n }\n\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={getAppLink()}\n >\n <Text namespace={namespace} phrase={props.currentStep === 'review-accounts' ? 'cancel' : 'back'} />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserActionStepId } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserActionsContinueButtonProps {\n currentStep: BulkUserActionStepId;\n appLinks: UserManagerAppLinks;\n onFinish: () => void;\n}\n\nexport function BulkUserActionsContinueButton(props: BulkUserActionsContinueButtonProps): JSX.Element {\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n const { disableNext, onClickConfirm, showButtons } = React.useContext(WizardLayoutContext);\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n function getContinueAppLink(): Core.AppLink {\n switch (props.currentStep) {\n case 'review-accounts':\n return props.appLinks.bulkActionsSelectAction;\n case 'select-action':\n return getSelectActionAppLink();\n case 'action-details':\n return props.appLinks.bulkActionsConfirmation[viewModel?.subAction];\n default:\n return null;\n }\n }\n\n function getSelectActionAppLink(): Core.AppLink {\n if (!viewModel?.action)\n return null;\n \n switch (viewModel.action) {\n case 'delete':\n return props.appLinks.bulkActionsActionDetails.delete;\n case 'activation':\n return props.appLinks.bulkActionsActionDetails.activation;\n case 'yearGroupRollover':\n return props.appLinks.bulkActionsActionDetails.yearGroupRollover;\n case 'changeYearGroup':\n return props.appLinks.bulkActionsActionDetails.changeYearGroup;\n case 'addToClassroom':\n return props.appLinks.bulkActionsActionDetails.addToClassroom;\n case 'resetPassword':\n return props.appLinks.bulkActionsActionDetails.resetPassword;\n case 'resetEmail':\n return props.appLinks.bulkActionsConfirmation.resetEmail;\n case 'activationEmail':\n return props.appLinks.bulkActionsConfirmation.activationEmail;\n case 'removeFromSchool':\n return props.appLinks.bulkActionsActionDetails.removeFromSchool;\n }\n \n Core.ErrorHelper.throw(new DevError(`Missing switch statement case for ${viewModel.action} in BulkUserActionsContinueButton.tsx`));\n }\n\n if (currentAppLink.action === props.appLinks.bulkActionsStatus.complete.action && showButtons) {\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={props.appLinks.userManager}\n disabled={disableNext}\n onClick={props.onFinish}\n >\n <Text\n namespace={namespace}\n phrase={'finish'}\n />\n </AppLink>\n );\n }\n\n if (props.currentStep === 'confirmation') {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={() => {\n BulkUserActionsAnalyticsHelper.onClickNext(viewModel, props.currentStep);\n onClickConfirm();\n }}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='confirm'\n />\n </Button>\n );\n }\n\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getContinueAppLink()}\n onClick={() => BulkUserActionsAnalyticsHelper.onClickNext(viewModel, props.currentStep)}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","import React from 'react';\n\nexport function BulkUserActionsWizardLayoutPartialLoading(): React.ReactElement {\n return (\n <>\n <div className={`partial-loading-background mb-2`} style={{ height: '1.75rem', width: '15rem' }} />\n <div className={`partial-loading-background mb-3`} style={{ height: '1.5rem', width: '12rem' }} />\n <div className={`partial-loading-background mb-2`} style={{ height: '8em', width: '40rem' }} />\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"UBwkq\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BulkUserActionsBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserActionsBackButton';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { BulkUserActionsAnalyticsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsAnalyticsHelper';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { User } from 'libs/shared/interfaces';\n\nimport { BulkUserActionsContinueButton } from '../header/continue-buttons/BulkUserActionsContinueButton';\n\nimport { BulkUserActionsWizardLayoutPartialLoading } from './BulkUserActionsWizardLayoutPartialLoading';\n\nimport styles from './bulk-user-actions-wizard-layout.scss';\n\nconst namespace = 'userManager.bulkUserActionsWizardLayout';\n\nexport type BulkUserActionStepId = 'review-accounts' | 'select-action' | 'action-details' | 'confirmation' | 'status';\nexport type BulkUserActionOptions = 'delete' | 'activation' | 'changeYearGroup' | 'yearGroupRollover' | 'addToClassroom' | 'resetPassword' | 'resetEmail' | 'activationEmail' | 'removeFromSchool';\nexport type BulkUserSubAction = 'delete' | 'deactivate' | 'reactivate' | 'changeYearGroup' | 'yearGroupRollover' | 'addToClassroom' | 'resetPassword' | 'resetEmail' | 'activationEmail' | 'removeFromSchool';\n\nexport const BULK_USER_ACTIONS_NAV_LOCK_ID = 'bulk-user-actions-wizard';\n\ntype BulkUserActionsWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserActionStepId;\n users: User[];\n userCount: number;\n \n preventNavLock?: boolean;\n disableAppLinks?: boolean;\n hideHeader?: boolean;\n loaded: boolean;\n\n /**\n * Used by year level rollover to allow loading straight into the details view\n */\n preventRedirect?: boolean;\n}>;\n\nexport function BulkUserActionsWizardLayout(props: BulkUserActionsWizardLayoutProps): JSX.Element {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!viewModel?.userIdMap?.size && !props.preventRedirect) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n logWizardExitEvent();\n return;\n }\n\n if (props.preventNavLock)\n return;\n\n navLock.lock({\n id: BULK_USER_ACTIONS_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserActionsHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n logWizardExitEvent();\n setViewModel({});\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_ACTIONS_NAV_LOCK_ID);\n };\n }, []);\n\n function onFinish(): void {\n setViewModel({});\n }\n function logWizardExitEvent(): void {\n /**\n * If there is no viewmodel present when this is called, it means the viewmodel was never\n * initialized with data. This can happen for example if the user page loads onto the wizard.\n * In this case, we don't log an exit event.\n */\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n step: props.currentStep,\n userCount: viewModel?.userIdMap?.size ?? 0\n };\n\n const actionName: string | null = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n workflowPhase: WorkflowPhase.Discard,\n actionType: UserAction.BulkAction,\n location: LocationContext.BulkUserActionsWizard,\n entity: EntityType.User\n });\n }\n\n const loaded = props.loaded && !!props.users?.length;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader\n title={LanguageService.getPhrase(namespace, 'bulkActions')}\n currentStep={props.currentStep}\n hideHeader={props.hideHeader}\n loaded={props.loaded}\n continueButton={\n <BulkUserActionsContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n onFinish={onFinish}\n />\n }\n backButton={\n <BulkUserActionsBackButton currentStep={props.currentStep} appLinks={props.appLinks} />\n }\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: props.appLinks.settings\n },\n {\n name: LanguageService.getPhrase(namespace, props.userType === UserGroup.Learner ? 'studentManager' : 'staffManager'),\n appLink: props.appLinks.userManager\n },\n {\n name: LanguageService.getPhrase(namespace, 'bulkActions'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-3'>\n <WizardStepList<BulkUserActionStepId>\n steps={BulkUserActionsHelper.getSteps(\n props.userType,\n props.userCount,\n props.appLinks,\n viewModel?.action\n )}\n currentStep={props.currentStep}\n disableAppLinks={!loaded || props.disableAppLinks}\n />\n </div>\n\n <div className={`col-9 ${styles.wizardContent}`}>\n {loaded ?\n props.children :\n <BulkUserActionsWizardLayoutPartialLoading />\n }\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}\n","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\ninterface WizardHeaderProps<TStepId> {\n currentStep: TStepId;\n title: string;\n continueButton: JSX.Element;\n backButton: JSX.Element;\n breadcrumbs?: Breadcrumb[];\n hideHeader?: boolean;\n loaded: boolean;\n}\n\nexport function WizardHeader<TStepId>(props: WizardHeaderProps<TStepId>): JSX.Element {\n const { showButtons } = React.useContext(WizardLayoutContext);\n\n return (\n <div className='d-flex justify-content-between'>\n {!props.hideHeader ? (\n <div>\n <h1 className='h2'>{props.title}</h1>\n\n {props.breadcrumbs &&\n <div className='pb-3'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n </div>\n ) : <div/>}\n\n {props.loaded && showButtons && (\n <div className='d-flex align-items-center'>\n {props.backButton}\n {props.continueButton}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nconst namespace = 'shared.wizardStepList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface WizardStep<StepId extends string> {\n id: StepId;\n text: string;\n appLink?: Core.AppLink;\n subText?: string;\n disabled?: boolean;\n openInNewTab?: boolean;\n}\n\ninterface WizardStepListTheme {\n item?: string;\n itemsContainer?: string;\n itemContent?: string;\n isSelectedOverride?: string;\n isCompletedOverride?: string;\n}\n\ninterface WizardStepListItemProps {\n appLink: Core.AppLink;\n isSelected: boolean;\n isCompleted: boolean;\n text: string;\n subText?: string;\n disabled: boolean;\n index: number;\n hideStepNumber?: boolean;\n theme?: WizardStepListTheme;\n}\n\nfunction WizardStepListItem(props: WizardStepListItemProps): JSX.Element {\n const content = (\n <>\n <div className='d-flex'>\n {!props.hideStepNumber && <div className='flex-shrink-0 flex-grow-0'>{`${props.index + 1}.`}&nbsp;</div>}\n <div>{props.text}</div>\n </div>\n\n {props.subText && (\n <div className='ms-2 ps-1 pt-1'>\n {props.subText}\n </div>\n )}\n </>\n );\n\n \n let className = 'px-2 py-1 mb-1 rounded d-inline-block';\n\n if (props.isSelected) {\n className += ` ${props.theme?.isSelectedOverride || 'bg-light-blue fw-semibold'}`;\n }\n\n if ((!props.isSelected && props.isCompleted))\n className += ` ${props.theme?.isCompletedOverride || 'text-info'}`;\n\n return (\n <li className={props.theme?.item}>\n {(props.isCompleted && props.appLink)\n ? (\n <AppLink appLink={props.appLink} className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </AppLink>\n ) : (\n <div className={`${className} ${props.theme?.itemContent || ''}`}>\n {content}\n </div>\n )\n }\n </li>\n );\n}\n\ninterface WizardStepListProps<StepId extends string> {\n currentStep: StepId;\n steps: WizardStep<StepId>[];\n disableAppLinks?: boolean;\n theme?: WizardStepListTheme;\n}\n\nexport function WizardStepList<StepId extends string>(props: WizardStepListProps<StepId>): JSX.Element {\n const currentStepNumber = props.steps.reduce((acc, step, i) => {\n if (step.id === props.currentStep)\n acc = i + 1;\n\n return acc;\n }, 1);\n\n return (\n <>\n <h2 className='h4'>\n {getPhrase('stepNumber', { currentStep: currentStepNumber, totalSteps: props.steps.length })}\n </h2>\n\n <ol className={`list-unstyled ${props.theme?.itemsContainer || ''}`}>\n {props.steps.map((step, i) => {\n const isSelected = step.id === props.currentStep;\n const isCompleted = currentStepNumber > i + 1;\n\n return (\n <WizardStepListItem\n index={i}\n key={step.id}\n text={step.text}\n subText={step.subText}\n isSelected={isSelected}\n isCompleted={isCompleted}\n appLink={!props.disableAppLinks && step.appLink}\n disabled={step.disabled}\n theme={props.theme}\n />\n );\n })}\n </ol>\n </>\n );\n}","export enum BatchJobStatus {\n Submitted = 0,\n Queued = 1,\n Pending = 2,\n InProgress = 3,\n Completed = 4,\n CompletedWithError = 5,\n Failed = 6\n}","import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { BULK_USER_ACTIONS_NAV_LOCK_ID } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { User } from 'libs/shared/interfaces';\n\ninterface Options {\n customerId: string;\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n\n getUsersRequest: (\n userIds: string[],\n success?: (users: User[]) => void,\n error?: () => void\n ) => Flight.Request;\n}\n\nexport const useBulkActionsUsers = (options: Options) => {\n const { appLinks, getUsersRequest } = options;\n\n const [ viewModel, setViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const dispatch = useDispatch();\n const navLock = useNavLock();\n\n function getCursor(items: User[]): string {\n return items[items.length - 1]?.id;\n }\n\n /**\n * We can't rely on the non-existance of a next cursor to determine if we have more items to fetch\n * so instead we assume we have more, and then set it to false when we don't in getRequest\n * - Sha\n */\n const [ hasMore, setHasMore ] = React.useState(true);\n const pagination = React.useRef<{ pages: HashObject<string[]>, keys: IterableIterator<string>}>({\n keys: viewModel?.userIdMap?.keys(),\n pages: {}\n });\n\n function* nextIds(iterable: IterableIterator<string>, take: number): Generator<string> {\n while (take-- > 0) {\n const next = iterable.next().value;\n if (!next) return;\n yield next;\n }\n }\n\n function getRequest(lastId?: string): Flight.Request {\n if (!viewModel?.userIdMap?.size || !pagination.current.keys)\n return null;\n\n if (pagination.current.pages[lastId]) {\n const ids = pagination.current.pages[lastId];\n\n if (!ids.length) return null;\n return getUsersRequest(ids);\n }\n\n const ids = [...nextIds(pagination.current.keys, UserManagerConstants.USER_PAGE_LIMIT)];\n pagination.current.pages[lastId] = ids;\n\n if (!ids.length) {\n setHasMore(false);\n return null;\n }\n return getUsersRequest(ids);\n }\n\n function fetchNext(cursor?: string) {\n const request = getRequest(cursor);\n\n if (!request)\n return;\n\n return Flight.getFetch(dispatch)(request);\n }\n\n const {\n items,\n isFetching,\n nextCursor\n } = useInfiniteList<User, User[]>(getRequest, fetchNext, null, d => d, getCursor, viewModel?.scrollContainer);\n\n const forceUpdate = useForceUpdate();\n function removeUser(user: User): void {\n viewModel.userIdMap.delete(user.id.toString());\n setViewModel('allUsersSelected', false);\n forceUpdate();\n\n AnalyticsHelper.logUserAction({\n id: user.id.toString(),\n userCount: getCount()\n }, {\n location: LocationContext.BulkUserActionsWizard,\n entity: EntityType.User,\n actionType: UserAction.Remove\n });\n }\n\n function getCount(): number {\n return viewModel?.userIdMap?.size;\n }\n\n /**\n * Should only be used by the year level rollover details page\n */\n function setAllUserIds(userIds: string[]): void {\n const map = new Map<string, boolean>();\n userIds.forEach(id => {\n map.set(id, true);\n });\n setViewModel({\n userIdMap: map,\n allUsersSelected: true,\n allUsersCount: map.size\n });\n pagination.current.keys = map.keys();\n forceUpdate();\n }\n\n const users = items?.filter(u => viewModel.userIdMap.has(u.id.toString())) ?? [];\n\n // This hook detects if the user has removed all users\n React.useEffect(() => {\n if (!viewModel?.userIdMap || viewModel.userIdMap.size)\n return;\n\n // If this is reached, it means the admin has removed all users from the selected list.\n // The setTimeout here allows react to run it's final UI updates with the new state before we dispose of the view.\n setTimeout(() => {\n navLock.unlock(BULK_USER_ACTIONS_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(appLinks.userManager, { replace: true });\n }, 0);\n }, [ viewModel?.userIdMap?.size, isFetching ]);\n\n return {\n users,\n isFetching,\n removeUser,\n hasMore,\n fetchNext: () => fetchNext(nextCursor),\n count: getCount(),\n setAllUserIds\n };\n};","import { Flight } from 'libs/common/flight';\n\nimport { useBulkActionsUsers } from 'libs/shared/apps/user-manager/hooks/useBulkActionsUsers';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nexport const useBulkActionsUsersWrapper = (userType: UserGroup) => {\n const appLinks = getUserManagerAppLinks(userType);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n return useBulkActionsUsers({\n customerId: currentUser.data?.customerId,\n userType,\n appLinks,\n getUsersRequest: UserRequests.usersById\n });\n};"],"names":["namespace","BulkUserActionsBackButton","props","viewModel","SharedViewModelKeys","currentStep","AppLink","className","appLink","appLinks","userManager","bulkActionsReviewAccounts","bulkActionsSelectAction","action","bulkActionsActionDetails","activation","yearGroupRollover","changeYearGroup","addToClassroom","resetPassword","removeFromSchool","getActionDetailsAppLink","getAppLink","Text","phrase","BulkUserActionsContinueButton","WizardLayoutContext","disableNext","onClickConfirm","showButtons","ContextService","bulkActionsStatus","complete","disabled","onClick","onFinish","Button","variant","BulkUserActionsAnalyticsHelper","bulkActionsConfirmation","resetEmail","activationEmail","DevError","getSelectActionAppLink","subAction","getContinueAppLink","BulkUserActionsWizardLayoutPartialLoading","style","height","width","BULK_USER_ACTIONS_NAV_LOCK_ID","BulkUserActionsWizardLayout","setViewModel","navLock","useNavLock","logWizardExitEvent","analyticsData","step","userCount","userIdMap","size","actionName","AnalyticsHelper","workflowPhase","actionType","location","entity","preventRedirect","preventNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserActionsHelper","onConfirmUnlock","unlock","replace","loaded","users","length","WizardHeader","hideHeader","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","disableAppLinks","children","BaseBulkUserActionsViewModelKeys","getAnalyticsActionName","onClickNext","actionData","ObjectHelper","Object","keys","logYearGroupRolloverEntry","getJobStatus","status","BatchJobStatus","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","reduce","acc","i","totalSteps","itemsContainer","map","key","SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","useBulkActionsUsersWrapper","nextIds","getUsersRequest","dispatch","setHasMore","pagination","pages","iterable","take","next","value","lastId","current","ids","UserManagerConstants","d","forceUpdate","useForceUpdate","getCount","filter","u","has","setTimeout","removeUser","user","count","setAllUserIds","userIds","Map","forEach","set","allUsersSelected","allUsersCount","useBulkActionsUsers","customerId","UserRequests","data"],"sourceRoot":""}