@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([[6475],{1619:(e,t,a)=>{a.d(t,{e:()=>g});var n=a(32735),r=a(23481),s=a(31453),l=a(12528),i=a(83914),o=a(35223),c=a(33518),m=a(2510);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function p(e,t,a){return(t=function(e){var t=function(e){if("object"!=u(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var a=t.call(e,"string");if("object"!=u(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==u(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}var d=r.T.encloseNamespace("sharev2.shareAvatar"),h=p(p(p(p(p({},m.y.Open,o.vn.Classrooms),m.y.Link,o.vn.Link),m.y.Classroom,o.vn.Classrooms),m.y.Live,o.vn.Play),m.y.LegacyDirect,o.vn.Share),v=p(p(p(p(p({},m.y.Open,"blue"),m.y.Link,"black"),m.y.Classroom,"teal"),m.y.Live,"purple"),m.y.LegacyDirect,"indigo"),y=p(p(p(p(p({},m.y.Open,"openShareType"),m.y.Link,"linkShareType"),m.y.Classroom,"classroomShareType"),m.y.Live,"liveShareType"),m.y.LegacyDirect,"legacyDirectShareType");function g(e){var t,a;return n.createElement("div",{className:(0,s.A)("d-flex align-items-center gap-2",e.className)},n.createElement("div",null,n.createElement(l.f,{svgName:h[e.type],variant:v[e.type],textVariant:"white",svgWrapperClassName:"p-1",svgSize:null!==(t=e.svgSize)&&void 0!==t?t:i.S.Standard})),n.createElement("div",{className:"d-flex flex-column"},n.createElement("p",{className:"m-0"},function(e){var t=e.type,a=e.classroomName,n=e.additionalTitleText;if(t===m.y.Classroom&&a)return a;var r=d(y[t]);return n&&(r+=" "+n),r}(e)),!e.hideSubtitle&&n.createElement("span",{className:"text-secondary"},null!==(a=e.subtitleText)&&void 0!==a?a:function(e){var t=e.type,a=e.privacy,n=e.studentCount,r=void 0===n?0:n,s=e.classroomGroupCount,l=void 0===s?0:s;switch(t){case m.y.Classroom:return function(e,t){return e&&t?"".concat(d("classroomGroupCount",{smartCount:e}),", ").concat(d("studentSubTitle",{smartCount:t})):e?d("groupSubTitle",{smartCount:e}):t?d("studentSubTitle",{smartCount:t}):d("allStudentsSubTitle")}(l,r);case m.y.Open:return d("openShareTypeSubTitle");case m.y.Link:return function(e){return[c.e.JustMySchool,c.e.Protected].includes(e)?d("respectRatingsSubTitle"):e===c.e.JustMySchoolOverrideRestriction?d("anyoneInSchoolSubTitle"):e===c.e.ProtectedOverrideRestriction?d("anyoneSignedInSubTitle"):e===c.e.Public?d("anyoneWithLinkSubTitle"):e===c.e.PinCode?d("anyoneWithPinSubTitle"):void 0}(a);case m.y.Live:return d("liveShareTypeSubTitle");case m.y.LegacyDirect:return d("legacyDirectTypeSubTitle");default:return d("publicShareTypeSubTitle")}}(e))))}},41661:(e,t,a)=>{var n;a.d(t,{D:()=>n}),function(e){e.GoogleClassroom="google-classroom",e.MicrosoftTeams="microsoft-teams",e.Vivi="vivi",e.AppleTv="apply-tv"}(n||(n={}))},40841:(e,t,a)=>{a.d(t,{_:()=>i});var n=a(23481),r=a(41661),s=a(65728),l=n.T.encloseNamespace("shared.shared-utils"),i={getShareIntegrations:function(e,t){return[{id:r.D.GoogleClassroom,name:l("googleClassroom"),enabled:e,settingName:s.E.ShareToGoogleClassroom},{id:r.D.MicrosoftTeams,name:l("msftTeams"),enabled:t,settingName:s.E.ShareToMicrosoftTeams}]}}},35690:(e,t,a)=>{a.d(t,{QD:()=>w,Qv:()=>k,__:()=>C});var n=a(32735),r=a(68050),s=a(69111),l=a(42648),i=a(82602),o=a(31453),c=a(1619),m=a(83345),u=a(4594),p="sharev2.shareViewCount";function d(e){return[u.E.Playlist,u.E.Series].includes(e.share.objectTypeId)?n.createElement("span",null,"-"):n.createElement(m.x,{namespace:p,phrase:"viewCount",options:{smartCount:e.share.viewCount||0}})}var h=a(2510),v=a(83914),y=a(35223);function g(e){return[u.E.Playlist,u.E.Series].includes(e.share.objectTypeId)?n.createElement("span",null,"-"):n.createElement("span",{className:"d-inline-flex flex-row gap-2 align-items-center"},n.createElement(v.x,{svgName:y.vn.User}),n.createElement("span",null,function(){var t=e.share.accessCount||0;if(e.share.type===h.y.Open)return"".concat(t);if(e.share.type===h.y.Classroom){var a=e.share.recipients.length;return"".concat(t,"/").concat(a)}return"".concat(t)}()))}var f=a(21789),E=a(15611),S=a(91693);const b={shareListItem:"vLROV",visibleOnHover:"o2KJH"};var x="assign.previousAssignments";function T(e){return n.createElement("div",{className:(0,o.A)("d-flex align-items-center justify-content-between",e.show&&"mb-3")},n.createElement("h3",{className:"h6 m-0 p-0"},n.createElement(m.x,{namespace:x,phrase:"heading",options:{count:e.count}})),n.createElement(S.h,{svgName:e.show?y.vn.ChevronUp:y.vn.ChevronDown,onClick:e.onToggle}))}function C(){var e="d-flex align-items-end justify-content-start fw-medium";return n.createElement(m.D.Provider,{value:x},n.createElement(r.Z,{className:"gx-2 px-3 mb-2"},n.createElement(s.Z,{xs:4,className:e},n.createElement(m.x,{phrase:"assignedTo"})),n.createElement(s.Z,{xs:2,className:e},n.createElement(m.x,{phrase:"views"})),n.createElement(s.Z,{xs:2,className:e},n.createElement(m.x,{phrase:"viewedBy"})),n.createElement(s.Z,{xs:4,className:e},n.createElement(m.x,{phrase:"dateCreated"}))))}function N(e){var t,a=f.x.getClassroomForShare(e.share,e.classrooms),l=null===(t=e.getItemAnalytics)||void 0===t?void 0:t.call(e,e.share);return n.createElement(E.F,{key:e.share.shareId,appLink:e.getItemAppLink(e.share),analyticsData:null==l?void 0:l.data,analyticsOptions:null==l?void 0:l.options,className:(0,o.A)("d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline",b.shareListItem,e.className)},n.createElement(r.Z,{className:"gx-2"},n.createElement(s.Z,{xs:4,className:"d-flex align-items-center"},n.createElement(c.e,{type:e.share.type,privacy:e.share.privacy,classroomName:null==a?void 0:a.name,svgSize:v.S.Small,hideSubtitle:!0})),n.createElement(s.Z,{xs:2,className:"d-flex align-items-center justify-content-start"},n.createElement(d,{share:e.share})),n.createElement(s.Z,{xs:2,className:"d-flex align-items-center justify-content-start"},n.createElement(g,{share:e.share})),n.createElement(s.Z,{xs:4,lg:3,className:"d-flex align-items-center justify-content-start"},n.createElement("span",null,(0,i.WU)(e.share.dateCreated))),n.createElement(s.Z,{lg:1,className:"align-items-center justify-content-end d-none d-lg-flex"},n.createElement("span",{className:(0,o.A)("cursor-pointer text-info hover-text-underline",b.visibleOnHover)},n.createElement(m.x,{namespace:x,phrase:"view"})))))}function k(e){var t;return n.createElement("div",{className:(0,o.A)("d-flex flex-column border-top rounded-top overflow-hidden")},n.createElement(l.ZP,{autoHeight:!0,autoHeightMin:0,autoHeightMax:null!==(t=e.scrollHeightMax)&&void 0!==t?t:215,autoHide:!0},e.assignments.map(function(t,a){return n.createElement(N,{share:t,classrooms:e.classrooms,getItemAppLink:e.getItemAppLink,getItemAnalytics:function(t){var n;return null===(n=e.getItemAnalytics)||void 0===n?void 0:n.call(e,t,a)},className:(0,o.A)(a%2==0&&"bg-gray-100"),key:t.shareId})})))}function w(e){if(!e.assignments.length)return n.createElement(n.Fragment,null);var t=e.show&&e.assignments.length>3;return n.createElement("div",{className:(0,o.A)("bg-white rounded-3 p-3",t&&"pb-0")},n.createElement(T,{count:e.assignments.length,onToggle:e.onToggle,show:e.show}),e.show&&n.createElement(n.Fragment,null,n.createElement(C,null),n.createElement(k,Object.assign({},e))))}},24578:(e,t,a)=>{a.r(t),a.d(t,{ShowAssignmentsView:()=>U});var n=a(32735),r=a(23481),s=a(20354),l=a(75896),i=a(110),o=a(18488),c=a(21789),m=a(9111),u=a(83914),p=a(83345),d=a(16714),h=a(22902),v=a(37802),y=a(70227),g=a(35223),f=a(14070),E=a(97291),S=a(86099),b=a(83351),x=a(35690),T=a(95890),C=a(40254),N=a(88630),k=a(23923),w=a(97958),L=a(99742),A="assign.sharesAndAssignmentsEmptyState",I=r.T.encloseNamespace(A);function j(e){return n.createElement(w.u,{className:"py-4"},n.createElement(w.u.Image,{size:"small",src:L.W.EmptyStates.Share.MY_SHARES}),n.createElement(w.u.Heading,null,n.createElement(p.x,{phrase:"title",namespace:A})),n.createElement(w.u.Info,null,n.createElement(p.x,{phrase:"description",namespace:A})),n.createElement(w.u.Cta,{icon:g.vn.Share,text:I("ctaAssign"),appLink:e.assignAppLink}),n.createElement(w.u.Cta,{className:"text-dark hover-text-underline mt-3 fw-medium",text:I("ctaShareLink"),appLink:e.shareLinkAppLink}))}var P="assign.sharesEmptyState",D=r.T.encloseNamespace(P);function O(e){return n.createElement(w.u,{className:"py-4"},n.createElement(w.u.Image,{size:"small",src:L.W.EmptyStates.Share.MY_SHARES}),n.createElement(w.u.Heading,null,n.createElement(p.x,{phrase:"title",namespace:P})),n.createElement(w.u.Info,null,n.createElement(p.x,{phrase:"description",namespace:P})),n.createElement(w.u.Cta,{icon:g.vn.Link,text:D("cta"),appLink:e.appLink}))}var _="assign.showAssignmentsView",H=r.T.encloseNamespace(_),M=400;function Z(e,t){if(e&&t)return i.O.isSame(e.dateCreated,t.dateCreated)?0:i.O.isAfter(e.dateCreated,t.dateCreated)?1:-1}function B(e){return n.createElement("a",{href:e.href,target:"_blank",className:"btn btn-link text-info"},n.createElement("span",{className:"pe-1"},n.createElement(p.x,{phrase:"viewInAnalytics",namespace:_})),n.createElement(u.x,{svgName:g.vn.NewWindow,size:u.S.Small}))}function F(e){return"assign-and-shares"===e.type?n.createElement(j,{assignAppLink:e.assignAppLink,shareLinkAppLink:e.shareAppLink}):n.createElement(O,{appLink:e.shareAppLink})}function U(e){var t,a,r,i=(0,T._)({objectId:e.objectId,entityType:e.entityType}),u=(0,h.T)().hasPermissions,p=(0,v.r)(null).hasShareFlowV2,g=(0,k.B)(),w=s.a.useBasicFetch(o.o.getSharesByObjectId(e.objectId)),L=(null===(t=w.data)||void 0===t?void 0:t.sort(Z))||[],A=l.m.uniq(L.map(c.x.getClassroomIdFromShare).filter(function(e){return!!e})),I=s.a.useBasicFetch(w.hasCompleted&&N.F.getClassroomsByIds(A,null===(a=i.currentUser.data)||void 0===a?void 0:a.customerId)),j=y.c.getObjectUrl(null===(r=i.config.data)||void 0===r?void 0:r.analyticsWebUrl,i.entity.data,p),P=u(d.C.ViewAnalyticsProduct)&&u(d.C.ViewCustomerAnalytics),D=p&&g?"shares":"assign-and-shares",O=i.loaded&&!!w.data&&!!I.data;return n.createElement(m.G,{size:"lg",title:H("title"),showLoadingSpinner:!O,closePopup:e.closePopup},!L.length&&n.createElement(F,{assignAppLink:C.W.flowSelector({entityType:e.entityType,objectId:e.objectId}),shareAppLink:{application:E.O.SHARE,action:f.e.Share.SHARE,args:[e.objectId],params:{entityType:e.entityType}},type:D}),!!L.length&&n.createElement(n.Fragment,null,n.createElement(x.__,null),n.createElement(x.Qv,{assignments:L.reverse(),classrooms:I.data,getItemAppLink:function(e){var t=(0,S.pY)(e);if(t)return t},scrollHeightMax:M})),n.createElement(b.P,{hideNextButton:!0,hideCreateClassroomButton:!0,onClickBack:e.closePopup,backButtonText:H("close"),leftComponent:!!j&&P&&n.createElement(B,{href:j})}))}},82602:(e,t,a)=>{a.d(t,{WU:()=>c});var n=["second","minute","hour","day","week","month","year"],r=["秒","分钟","小时","天","周","个月","年"],s={},l=function(e,t){s[e]=t},i=[60,60,24,7,365/7/12,12];function o(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var c=function(e,t,a){var n=function(e,t){return(+(t?o(t):new Date)-+o(e))/1e3}(e,a&&a.relativeDate);return function(e,t){for(var a=e<0?1:0,n=e=Math.abs(e),r=0;e>=i[r]&&r<i.length;r++)e/=i[r];return(e=Math.floor(e))>(0==(r*=2)?9:1)&&(r+=1),t(e,r,n)[a].replace("%s",e.toString())}(n,function(e){return s[e]||s.en_US}(t))};l("en_US",function(e,t){if(0===t)return["just now","right now"];var a=n[Math.floor(t/2)];return e>1&&(a+="s"),[e+" "+a+" ago","in "+e+" "+a]}),l("zh_CN",function(e,t){if(0===t)return["刚刚","片刻后"];var a=r[~~(t/2)];return[e+" "+a+"前",e+" "+a+"后"]})}}]);
2
+ //# sourceMappingURL=6475-f019242ec2-lite.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts/6475-f019242ec2-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/share-avatar/ShareAvatar.tsx","file:///app/packages/libs/shared/src/enums/IntegrationId.ts","file:///app/packages/libs/shared/src/utils/IntegrationHelper.ts","file:///app/packages/libs/shared/src/apps/share-v2/components/share-view-count/ShareViewCount.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount.tsx","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/previous-assignments.scss","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/PreviousAssignments.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-empty-state/SharesEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/ShowAssignmentsView.tsx","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacy } from '../../enums/SharePrivacy';\nimport { ShareType } from '../../enums/ShareType';\n\nconst namespace = 'sharev2.shareAvatar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst icons = {\n [ShareType.Open]: cvSvgLibrary.Classrooms,\n [ShareType.Link]: cvSvgLibrary.Link,\n [ShareType.Classroom]: cvSvgLibrary.Classrooms,\n [ShareType.Live]: cvSvgLibrary.Play,\n [ShareType.LegacyDirect]: cvSvgLibrary.Share\n};\n\nconst iconColours = {\n [ShareType.Open]: 'blue',\n [ShareType.Link]: 'black',\n [ShareType.Classroom]: 'teal',\n [ShareType.Live]: 'purple',\n [ShareType.LegacyDirect]: 'indigo'\n};\n\nconst shareTypeTitlePhraseMap = {\n [ShareType.Open]: 'openShareType',\n [ShareType.Link]: 'linkShareType',\n [ShareType.Classroom]: 'classroomShareType',\n [ShareType.Live]: 'liveShareType',\n [ShareType.LegacyDirect]: 'legacyDirectShareType'\n};\n\nfunction getTitle({ type, classroomName, additionalTitleText }: ShareAvatarProps) {\n if (type === ShareType.Classroom && classroomName)\n return classroomName;\n\n let title = getPhrase(shareTypeTitlePhraseMap[type]);\n\n if (additionalTitleText)\n title += ' ' + additionalTitleText;\n\n return title;\n}\n\nfunction getClassroomSubtitle(classroomGroupCount: number, studentCount: number): string {\n if (classroomGroupCount && studentCount)\n return `${getPhrase('classroomGroupCount', { smartCount: classroomGroupCount })}, ${getPhrase('studentSubTitle', { smartCount: studentCount })}`;\n\n if (classroomGroupCount)\n return getPhrase('groupSubTitle', { smartCount: classroomGroupCount });\n\n if (studentCount)\n return getPhrase('studentSubTitle', { smartCount: studentCount });\n\n return getPhrase('allStudentsSubTitle');\n}\n\nfunction getLinkSubtitle(privacy: SharePrivacy) {\n if ([ SharePrivacy.JustMySchool, SharePrivacy.Protected ].includes(privacy))\n return getPhrase('respectRatingsSubTitle');\n\n if (privacy === SharePrivacy.JustMySchoolOverrideRestriction)\n return getPhrase('anyoneInSchoolSubTitle');\n\n if (privacy === SharePrivacy.ProtectedOverrideRestriction)\n return getPhrase('anyoneSignedInSubTitle');\n\n if (privacy === SharePrivacy.Public)\n return getPhrase('anyoneWithLinkSubTitle');\n\n if (privacy === SharePrivacy.PinCode)\n return getPhrase('anyoneWithPinSubTitle');\n}\n\nfunction getSubtitle({ type, privacy, studentCount = 0, classroomGroupCount = 0 }: ShareAvatarProps) {\n switch (type) {\n case ShareType.Classroom:\n return getClassroomSubtitle(classroomGroupCount, studentCount);\n\n case ShareType.Open:\n return getPhrase('openShareTypeSubTitle');\n\n case ShareType.Link:\n return getLinkSubtitle(privacy);\n \n case ShareType.Live:\n return getPhrase('liveShareTypeSubTitle');\n\n case ShareType.LegacyDirect:\n return getPhrase('legacyDirectTypeSubTitle');\n\n default:\n return getPhrase('publicShareTypeSubTitle');\n }\n}\n\ninterface ShareAvatarProps {\n type: ShareType;\n privacy: SharePrivacy;\n studentCount?: number;\n classroomGroupCount?: number;\n classroomName?: string;\n hideSubtitle?: boolean;\n subtitleText?: string;\n svgSize?: SvgContainerSize;\n additionalTitleText?: string;\n className?: string;\n}\n\nexport function ShareAvatar(props: ShareAvatarProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center gap-2', props.className)}>\n <div>\n <IconCircle\n svgName={icons[props.type]}\n variant={iconColours[props.type]}\n textVariant='white'\n svgWrapperClassName='p-1'\n svgSize={props.svgSize ?? SvgContainerSize.Standard}\n />\n </div>\n <div className='d-flex flex-column'>\n <p className='m-0'>{getTitle(props)}</p>\n {!props.hideSubtitle && <span className='text-secondary'>{props.subtitleText ?? getSubtitle(props)}</span>}\n </div>\n </div>\n );\n}","export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { Integration } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const IntegrationHelper = {\n getShareIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): Integration[] {\n return [\n {\n id: IntegrationId.GoogleClassroom,\n name: getPhrase('googleClassroom'),\n enabled: googleClassroomSetting,\n settingName: SettingName.ShareToGoogleClassroom\n },\n {\n id: IntegrationId.MicrosoftTeams,\n name: getPhrase('msftTeams'),\n enabled: msftTeamsSetting,\n settingName: SettingName.ShareToMicrosoftTeams\n }\n ];\n }\n};\n","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'sharev2.shareViewCount';\n\ninterface ShareViewCountProps {\n share: Share;\n}\n\nexport function ShareViewCount(props: ShareViewCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n \n if (isCollection)\n return <span>-</span>;\n\n return <Text namespace={namespace} phrase='viewCount' options={{ smartCount: props.share.viewCount || 0 }} />;\n}","import React from 'react';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface ShareViewedByCountProps {\n share: Share;\n}\n\nexport function ShareViewedByCount(props: ShareViewedByCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n\n if (isCollection)\n return <span>-</span>;\n \n function getViewCount(): string {\n const shareAccessCount = props.share.accessCount || 0;\n if (props.share.type === ShareType.Open)\n return `${shareAccessCount}`;\n\n if (props.share.type === ShareType.Classroom) {\n const totalRecipients = props.share.recipients.length;\n return `${shareAccessCount}/${totalRecipients}`;\n }\n\n return `${shareAccessCount}`;\n }\n \n return (\n <span className='d-inline-flex flex-row gap-2 align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{getViewCount()}</span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"shareListItem\":\"vLROV\",\"visibleOnHover\":\"o2KJH\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport Scrollbars from 'react-custom-scrollbars-2';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { ShareViewCount } from 'libs/shared/apps/share-v2/components/share-view-count/ShareViewCount';\nimport { ShareViewedByCount } from 'libs/shared/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './previous-assignments.scss';\n\nconst namespace = 'assign.previousAssignments';\n\ninterface PreviousAssignmentsHeaderProps {\n count: number;\n show: boolean;\n onToggle: () => void;\n}\n\nfunction PreviousAssignmentsHeader(props: PreviousAssignmentsHeaderProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-between', props.show && 'mb-3')}>\n <h3 className='h6 m-0 p-0'><Text namespace={namespace} phrase='heading' options={{ count: props.count }} /></h3>\n <IconButton\n svgName={props.show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={props.onToggle}\n />\n </div>\n );\n}\n\nexport function PreviousAssignmentsListHeader(): JSX.Element {\n const columnClassNames = 'd-flex align-items-end justify-content-start fw-medium';\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='gx-2 px-3 mb-2'>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='assignedTo' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='views' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='viewedBy' />\n </Col>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='dateCreated' />\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}\n\ntype ItemAnalytics = {\n data: HashObject;\n options: AnalyticsOptions;\n}\ninterface PreviousAssignmentListItemProps {\n share: Share;\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n\n getItemAnalytics?: (share: Share) => ItemAnalytics;\n className?: string;\n}\n\nfunction PreviousAssignmentListItem(props: PreviousAssignmentListItemProps): JSX.Element {\n const shareClassroom = ShareHelper.getClassroomForShare(props.share, props.classrooms);\n\n const analytics = props.getItemAnalytics?.(props.share);\n\n return (\n <AppLink\n key={props.share.shareId}\n appLink={props.getItemAppLink(props.share)}\n analyticsData={analytics?.data}\n analyticsOptions={analytics?.options}\n className={classNames('d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline', styles.shareListItem, props.className)}\n >\n <Row className='gx-2'>\n <Col xs={4} className='d-flex align-items-center'>\n <ShareAvatar\n type={props.share.type}\n privacy={props.share.privacy}\n classroomName={shareClassroom?.name}\n svgSize={SvgContainerSize.Small}\n hideSubtitle\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewCount share={props.share} />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewedByCount share={props.share} />\n </Col>\n <Col xs={4} lg={3} className='d-flex align-items-center justify-content-start'>\n <span>{formatDate(props.share.dateCreated)}</span>\n </Col>\n <Col lg={1} className='align-items-center justify-content-end d-none d-lg-flex'>\n <span className={classNames('cursor-pointer text-info hover-text-underline', styles.visibleOnHover)}>\n <Text namespace={namespace} phrase='view' />\n </span>\n </Col>\n </Row>\n </AppLink>\n );\n}\n\ninterface PreviousAssignmentsListProps {\n assignments: Share[];\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n scrollHeightMax?: number;\n}\n\nexport function PreviousAssignmentsList(props: PreviousAssignmentsListProps): JSX.Element {\n return (\n <div className={classNames(\n 'd-flex flex-column border-top rounded-top overflow-hidden'\n )}>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={props.scrollHeightMax ?? 215}\n autoHide\n >\n {props.assignments.map((share, idx) => (\n <PreviousAssignmentListItem\n share={share}\n classrooms={props.classrooms}\n getItemAppLink={props.getItemAppLink}\n getItemAnalytics={share => props.getItemAnalytics?.(share, idx)}\n className={classNames(idx % 2 === 0 && 'bg-gray-100')}\n key={share.shareId}\n />\n ))}\n </Scrollbars>\n </div>\n );\n}\n\ninterface PreviousAssignmentsProps {\n show: boolean;\n assignments: Share[];\n classrooms: Classroom[];\n onToggle: () => void;\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n}\n\nexport function PreviousAssignments(props: PreviousAssignmentsProps): JSX.Element {\n if (!props.assignments.length)\n return <></>;\n \n const noBottomPadding = props.show && props.assignments.length > 3;\n \n return (\n <div className={classNames('bg-white rounded-3 p-3', noBottomPadding && 'pb-0')}>\n <PreviousAssignmentsHeader count={props.assignments.length} onToggle={props.onToggle} show={props.show} />\n {props.show && (\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList {...props} />\n </>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesAndAssignmentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesAndAssignmentsEmptyStateProps {\n assignAppLink: Core.AppLink;\n shareLinkAppLink: Core.AppLink;\n}\n\nexport function SharesAndAssignmentsEmptyState(props: SharesAndAssignmentsEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n <EmptyState.Cta\n icon={cvSvgLibrary.Share}\n text={getPhrase('ctaAssign')}\n appLink={props.assignAppLink}\n />\n <EmptyState.Cta\n className='text-dark hover-text-underline mt-3 fw-medium'\n text={getPhrase('ctaShareLink')}\n appLink={props.shareLinkAppLink}\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesEmptyStateProps {\n appLink: Core.AppLink;\n}\n\nexport function SharesEmptyState(props: SharesEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n <EmptyState.Cta\n icon={cvSvgLibrary.Link}\n text={getPhrase('cta')}\n appLink={props.appLink}\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, PopupViewProps } from 'libs/shared/interfaces';\nimport { AnalyticsRouteHelper } from 'libs/shared/utils/AnalyticsRouteHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { PreviousAssignmentsList, PreviousAssignmentsListHeader } from 'apps/assign/components/previous-assignments/PreviousAssignments';\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { AssignAppLinkHelper } from 'apps/assign/utils/AssignAppLinkHelper';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\n\nimport { SharesAndAssignmentsEmptyState } from './empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState';\nimport { SharesEmptyState } from './empty-states/shares-empty-state/SharesEmptyState';\n\nconst namespace = 'assign.showAssignmentsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst MAX_SCROLL_HEIGHT = 400;\n\nfunction sortByDateCreated(a: Share, b: Share) {\n if (!a || !b)\n return;\n\n if (DateHelper.isSame(a.dateCreated, b.dateCreated))\n return 0;\n\n if (DateHelper.isAfter(a.dateCreated, b.dateCreated))\n return 1;\n\n return -1;\n}\n\ninterface ViewInSchoolAnalyticsButtonProps {\n href: string;\n}\n\nfunction ViewInSchoolAnalyticsButton(props: ViewInSchoolAnalyticsButtonProps): JSX.Element {\n return (\n <a href={props.href} target='_blank' className='btn btn-link text-info'>\n <span className='pe-1'><Text phrase='viewInAnalytics' namespace={namespace} /></span>\n <SvgContainer svgName={cvSvgLibrary.NewWindow} size={SvgContainerSize.Small} />\n </a>\n );\n}\n\ninterface ShowAssignmentsEmptyStateProps {\n type: 'assign-and-shares' | 'shares';\n assignAppLink: Core.AppLink;\n shareAppLink: Core.AppLink;\n}\n\nfunction ShowAssignmentsEmptyState(props: ShowAssignmentsEmptyStateProps): JSX.Element {\n if (props.type === 'assign-and-shares') {\n return (\n <SharesAndAssignmentsEmptyState\n assignAppLink={props.assignAppLink}\n shareLinkAppLink={props.shareAppLink}\n />\n );\n }\n \n return <SharesEmptyState appLink={props.shareAppLink} />;\n}\n\ninterface ShowAssignmentsViewProps extends PopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function ShowAssignmentsView(props: ShowAssignmentsViewProps): JSX.Element {\n const sharedData = useAssignSharedData({\n objectId: props.objectId,\n entityType: props.entityType\n });\n\n const { hasPermissions } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n const isTertiary = useIsTertiary();\n\n const previousShares = Flight.useBasicFetch<Share[]>(ShareRequests.getSharesByObjectId(props.objectId));\n const assignments = previousShares.data?.sort(sortByDateCreated) || [];\n const previousAssignmentClassroomIds = ArrayHelper.uniq(\n assignments.map(ShareHelper.getClassroomIdFromShare).filter(x => !!x)\n );\n const classrooms = Flight.useBasicFetch<Classroom[]>(\n previousShares.hasCompleted &&\n ClassroomRequests.getClassroomsByIds(previousAssignmentClassroomIds, sharedData.currentUser.data?.customerId)\n );\n\n function getItemAppLink(share: Share) {\n const appLink = getInsightsOverviewAppLink(share);\n if (!appLink)\n return;\n\n return appLink;\n }\n\n const analyticsUrl = AnalyticsRouteHelper.getObjectUrl(\n sharedData.config.data?.analyticsWebUrl,\n sharedData.entity.data,\n hasShareFlowV2\n );\n \n const canViewSchoolAnalytics =\n hasPermissions(PermissionName.ViewAnalyticsProduct) &&\n hasPermissions(PermissionName.ViewCustomerAnalytics);\n\n const emptyStateType = (hasShareFlowV2 && isTertiary) ? 'shares' : 'assign-and-shares';\n\n const loaded = sharedData.loaded && !!previousShares.data && !!classrooms.data;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded}\n closePopup={props.closePopup}\n >\n {!assignments.length &&\n <ShowAssignmentsEmptyState\n assignAppLink={AssignAppLinkHelper.flowSelector({ entityType: props.entityType, objectId: props.objectId })}\n shareAppLink={{\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [props.objectId],\n params: {\n entityType: props.entityType\n }\n }}\n type={emptyStateType}\n />\n }\n \n {!!assignments.length &&\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList\n assignments={assignments.reverse()}\n classrooms={classrooms.data}\n getItemAppLink={getItemAppLink}\n scrollHeightMax={MAX_SCROLL_HEIGHT}\n />\n </>\n }\n <FlowControls\n hideNextButton\n hideCreateClassroomButton\n onClickBack={props.closePopup}\n backButtonText={getPhrase('close')}\n leftComponent={!!analyticsUrl && canViewSchoolAnalytics && <ViewInSchoolAnalyticsButton href={analyticsUrl} />}\n />\n </Popup>\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["getPhrase","icons","iconColours","shareTypeTitlePhraseMap","ShareAvatar","props","className","svgName","type","variant","textVariant","svgWrapperClassName","svgSize","S","classroomName","additionalTitleText","title","getTitle","hideSubtitle","subtitleText","privacy","studentCount","classroomGroupCount","smartCount","getClassroomSubtitle","includes","getLinkSubtitle","getSubtitle","IntegrationId","IntegrationHelper","getShareIntegrations","googleClassroomSetting","msftTeamsSetting","id","name","enabled","settingName","namespace","ShareViewCount","MasterType","share","objectTypeId","Text","phrase","options","viewCount","ShareViewedByCount","SvgContainer","shareAccessCount","accessCount","ShareType","totalRecipients","recipients","length","getViewCount","PreviousAssignmentsHeader","show","count","IconButton","onClick","onToggle","PreviousAssignmentsListHeader","columnClassNames","value","Row","Col","xs","PreviousAssignmentListItem","shareClassroom","ShareHelper","classrooms","analytics","getItemAnalytics","AppLink","key","shareId","appLink","getItemAppLink","analyticsData","data","analyticsOptions","lg","dateCreated","PreviousAssignmentsList","autoHeight","autoHeightMin","autoHeightMax","scrollHeightMax","autoHide","assignments","map","idx","PreviousAssignments","noBottomPadding","LanguageService","SharesAndAssignmentsEmptyState","EmptyState","size","src","ImageUrls","icon","text","assignAppLink","shareLinkAppLink","SharesEmptyState","MAX_SCROLL_HEIGHT","sortByDateCreated","a","b","DateHelper","ViewInSchoolAnalyticsButton","href","target","ShowAssignmentsEmptyState","shareAppLink","ShowAssignmentsView","sharedData","useAssignSharedData","objectId","entityType","hasPermissions","usePermissions","hasShareFlowV2","useSettings","isTertiary","useIsTertiary","previousShares","ShareRequests","sort","previousAssignmentClassroomIds","ArrayHelper","filter","x","hasCompleted","ClassroomRequests","currentUser","customerId","analyticsUrl","AnalyticsRouteHelper","config","analyticsWebUrl","entity","canViewSchoolAnalytics","PermissionName","emptyStateType","loaded","Popup","showLoadingSpinner","closePopup","AssignAppLinkHelper","application","action","args","params","reverse","FlowControls","hideNextButton","hideCreateClassroomButton","onClickBack","backButtonText","leftComponent","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","isNaN","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[6695],{27150:(e,t,r)=>{r.d(t,{A:()=>U,$:()=>w});var n=r(32735),a=r(23481),s=r(81886),i=r(15611),o=r(83345),l="userManager.userWizardBackButtons";function c(e){return"status"===e.currentStep?n.createElement(n.Fragment,null):n.createElement(i.F,{className:"btn btn-link me-2",appLink:e.appLinks.userManager},n.createElement(o.x,{namespace:l,phrase:"cancel"}))}var u=r(98269),d=r(24453),p=r(45541),m=r(96728),v="userManager.userWizardHeader";function b(e){var t=(0,p.V)(),r=t.duplicateSets,a=t.hasExistingUsers,s=n.useContext(m.e),l=s.disableNext,c=s.onClickConfirm,b=!!(null==r?void 0:r.length),f=d.O.getCurrentContext().appLink;return f.action===e.appLinks.userUploadStatus.polling.action||f.action===e.appLinks.userUploadStatus.complete.action?n.createElement(n.Fragment,null):function(){switch(f.action){case e.appLinks.userUploadPopup.action:case e.appLinks.userUploadReviewAccounts.action:return!b&&!a;case e.appLinks.userUploadFixDuplicates.action:case e.appLinks.userUploadReviewExistingAccounts.action:return!a;default:return!0}}()?n.createElement(u.Z,{className:l?"disabled":"",variant:"dark",onClick:c,disabled:l},n.createElement(o.x,{namespace:v,phrase:"create"})):n.createElement(i.F,{className:"btn btn-dark ".concat(l?"disabled":""),appLink:function(){switch(f.action){case e.appLinks.userUploadReviewAccounts.action:if(b)return e.appLinks.userUploadFixDuplicates;if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadFixDuplicates.action:if(a&&e.canAddExistingUsers)return e.appLinks.userUploadReviewExistingAccounts;case e.appLinks.userUploadReviewExistingAccounts.action:if(e.canAddExistingUsers)return e.appLinks.userUploadConfirmation;default:return null}}(),disabled:l},n.createElement(o.x,{namespace:v,phrase:"next"}))}var f=r(19717),g=r(17291),y=r(79352),h=r(76881),k=r(89476);const E={wizardContent:"hHr3C"};var x="userManager.bulkUserUploadWizardLayout",U="bulk:user:upload:nav:lock";function w(e){var t=(0,p.V)(),r=t.users,i=t.setUsers,o=(0,k.f)();return n.useEffect(function(){if(r)return o.lock({id:U,title:a.T.getPhrase(x,"navLockTitle"),text:a.T.getPhrase(x,"navLockBody"),appLinkWhitelist:f.b.getWizardAppLinks(e.appLinks),onConfirmUnlock:function(){i(null)}}),function(){o.unlock(U)};s.Q.C$.trigger(e.appLinks.userManager,{replace:!0})},[]),n.useEffect(function(){(null==r?void 0:r.length)||(o.unlock(U),s.Q.C$.trigger(e.appLinks.userManager,{replace:!0}))},[null==r?void 0:r.length]),r?n.createElement(m.D,null,n.createElement("div",{className:"px-3"},n.createElement(g.C,{title:a.T.getPhrase(x,"bulkUpload"),currentStep:e.currentStep,loaded:!0,continueButton:n.createElement(b,{currentStep:e.currentStep,appLinks:e.appLinks,canAddExistingUsers:e.canAddExistingUsers}),backButton:n.createElement(c,{currentStep:e.currentStep,appLinks:e.appLinks}),breadcrumbs:[{name:a.T.getPhrase(x,"settingsBreadcrumb"),appLink:e.appLinks.settings},{name:a.T.getPhrase(x,e.userType===h.Y.Learner?"studentManager":"staffManager"),appLink:e.appLinks.userManager},{name:a.T.getPhrase(x,"bulkUpload"),active:!0}]}),n.createElement("div",{className:"row g-0"},n.createElement("div",{className:"col-2"},n.createElement(y.a,{steps:f.b.getSteps(e.userType,e.canAddExistingUsers),currentStep:e.currentStep})),n.createElement("div",{className:"col-10 ".concat(E.wizardContent)},e.children)))):n.createElement(n.Fragment,null)}},26055:(e,t,r)=>{r.d(t,{A:()=>n});var n=r(32735).createContext(null)},45541:(e,t,r)=>{r.d(t,{V:()=>u});var n=r(2948),a=r(38143),s=r(39739);function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function o(e,t,r){return(t=function(e){var t=function(e){if("object"!=i(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=i(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==i(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(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}function c(e,t){return Object.keys(e||{}).reduce(function(r,n){return t[n]||(r[n]=e[n]),r},{})}var u=function(){var e,t,r,i=(t=(0,n.D)(a.g.BULK_USER_UPLOAD),r=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],l=!0,c=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);l=!0);}catch(e){c=!0,a=e}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(t,r)||function(e,t){if(e){if("string"==typeof e)return l(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)?l(e,t):void 0}}(t,r)||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=i[0],d=i[1];function p(e){var t=s.P.getNewDuplicates(e);d("duplicateSets",t)}return{users:null==u?void 0:u.users,invalidUsers:null==u?void 0:u.invalidUsers,hasValidatedUsers:!!(null==u?void 0:u.invalidUsers),existingUsersHash:(null==u?void 0:u.existingUsersHash)||{},hasExistingUsers:!!Object.keys((null==u?void 0:u.existingUsersHash)||{}).length,existingUserToAdd:null==u?void 0:u.existingUserToAdd,duplicateSets:null==u?void 0:u.duplicateSets,newUsers:(null===(e=null==u?void 0:u.users)||void 0===e?void 0:e.filter(function(e){var t;return!(null===(t=null==u?void 0:u.existingUsersHash)||void 0===t?void 0:t[e.lookupId])}))||[],setUsers:function(e){d({users:e,invalidUsers:null,existingUsersHash:null}),p(e)},setInvalidUsers:function(e){return d("invalidUsers",e)},setExistingUsers:function(e){return d("existingUsersHash",e)},updateUser:function(e){var t=u.users.map(function(t){return t.lookupId!==e.lookupId?t:e});d({users:t,invalidUsers:c(null==u?void 0:u.invalidUsers,o({},e.lookupId,!0)),existingUsersHash:null==u?void 0:u.existingUsersHash}),p(t)},deleteUsers:function(e){var t,r=e.reduce(function(e,t){return e[t]=!0,e},{}),n=u.users.filter(function(e){return!r[e.lookupId]});d({users:n,invalidUsers:c(null==u?void 0:u.invalidUsers,r),existingUsersHash:c(null==u?void 0:u.existingUsersHash,r),existingUserToAdd:null===(t=null==u?void 0:u.existingUserToAdd)||void 0===t?void 0:t.filter(function(e){return!!(null==u?void 0:u.existingUsersHash[e.lookupId])})}),p(n)}}}},17291:(e,t,r)=>{r.d(t,{C:()=>i});var n=r(32735),a=r(49935),s=r(96728);function i(e){var t=n.useContext(s.e).showButtons;return n.createElement("div",{className:"d-flex justify-content-between"},e.hideHeader?n.createElement("div",null):n.createElement("div",null,n.createElement("h1",{className:"h2"},e.title),e.breadcrumbs&&n.createElement("div",{className:"pb-3"},n.createElement(a.Oo,{breadcrumbs:e.breadcrumbs}))),e.loaded&&t&&n.createElement("div",{className:"d-flex align-items-center"},e.backButton,e.continueButton))}},14177:(e,t,r)=>{r.d(t,{$:()=>w});var n=r(32735),a=r(70680),s=r(81886),i=r(20354),o=r(79447),l=r(83914),c=r(83345),u=r(4594),d=r(76881),p=r(35223),m="userManager.wizardInProgress";function v(e){var t=Math.floor(e.totalItemsComplete/e.totalItems*100)||0;return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-2"},n.createElement("h2",{className:"h5 mb-0"},n.createElement(c.x,{namespace:m,phrase:"heading",options:{percentage:t,actionName:e.actionName}})),n.createElement(l.x,{svgName:p.vn.CheckCircle})),n.createElement("p",null,n.createElement(c.x,{namespace:m,phrase:"info".concat(e.actionVerb)})),n.createElement("p",{className:"mb-1"},n.createElement("span",{className:"text-info"},e.progressVerbPhrase?n.createElement("span",null,e.progressVerbPhrase):n.createElement(c.x,{namespace:m,phrase:"progressVerb".concat(e.actionVerb)}))," ",e.objectType===u.E.User&&e.userType?n.createElement(c.x,{namespace:m,phrase:e.userType===d.Y.Learner?"progressStudents":"progressStaff",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):e.objectType===u.E.Video?n.createElement(c.x,{namespace:m,phrase:"progressVideos",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):n.createElement(c.x,{namespace:m,phrase:"progressItems",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}})),n.createElement(o.Z,{variant:"info",now:t}))}var b="userManager.wizardSubmitted";function f(e){return n.createElement("div",null,n.createElement("div",{className:"d-flex align-items-center mb-2"},n.createElement("h2",{className:"h5 mb-0"},e.actionName?n.createElement(c.x,{namespace:b,phrase:"heading",options:{actionName:e.actionName}}):n.createElement(c.x,{namespace:b,phrase:"headingGeneric"})),n.createElement(l.x,{svgName:p.vn.CheckCircle})),n.createElement("p",null,n.createElement(c.x,{namespace:b,phrase:"info".concat(e.actionVerb)})),n.createElement("p",{className:"mb-1 text-info"},n.createElement(c.x,{namespace:b,phrase:"preparing"})),n.createElement(o.Z,{variant:"info",now:0}))}var g=r(58739),y=r(94644),h=r(89476);function k(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,s,i,o=[],l=!0,c=!1;try{if(s=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=s.call(r)).done)&&(o.push(n.value),o.length!==t);l=!0);}catch(e){c=!0,a=e}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(c)throw a}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return E(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)?E(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function E(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 x=2e3,U=3;function w(e){var t=k(n.useState(null),2),r=t[0],o=t[1],l=k(n.useState(0),2),c=l[0],u=l[1],d=n.useRef(null),p=(0,h.f)(),m=(0,a.I0)();function b(){e.pollJob(E,w)}function E(t){o(t),t.status===g.K.Completed||t.status===g.K.CompletedWithError||t.status===g.K.Failed?window.setTimeout(function(){!function(){var t;e.navLockId&&p.unlock(e.navLockId);var r={jobId:e.jobId};e.userType&&(r.userType=e.userType,m({type:i.a.Actions.INVALIDATE,keys:["school:users","user:count","search:aggregation","search:users"],request:null})),e.statusCompleteAppLink?s.Q.C$.trigger(Object.assign(Object.assign({},e.statusCompleteAppLink),{params:r})):null===(t=e.onStatusCompleted)||void 0===t||t.call(e)}()},2e3):d.current=window.setTimeout(b,x)}function w(t){c===U&&(window.clearTimeout(d.current),e.navLockId&&p.unlock(e.navLockId),(0,y.r)(t)),u(function(e){return e+1}),d.current=window.setTimeout(b,x)}return n.useEffect(function(){return b(),function(){d.current&&window.clearTimeout(d.current)}},[]),r&&r.status!==g.K.Submitted&&r.status!==g.K.Queued&&r.status!==g.K.Pending&&0!==r.totalItems?n.createElement(v,{totalItems:r.totalItems,totalItemsComplete:r.processedItems,userType:e.userType,objectType:e.objectType,actionName:e.actionName,actionVerb:e.actionVerb,progressVerbPhrase:e.progressVerbPhrase}):n.createElement(f,{actionName:e.actionName,actionVerb:e.actionVerb})}},79352:(e,t,r)=>{r.d(t,{a:()=>l});var n=r(32735),a=r(23481),s=r(15611),i=a.T.encloseNamespace("shared.wizardStepList");function o(e){var t,r,a,i,o,l=n.createElement(n.Fragment,null,n.createElement("div",{className:"d-flex"},!e.hideStepNumber&&n.createElement("div",{className:"flex-shrink-0 flex-grow-0"},"".concat(e.index+1,".")," "),n.createElement("div",null,e.text)),e.subText&&n.createElement("div",{className:"ms-2 ps-1 pt-1"},e.subText)),c="px-2 py-1 mb-1 rounded d-inline-block";return e.isSelected&&(c+=" ".concat((null===(t=e.theme)||void 0===t?void 0:t.isSelectedOverride)||"bg-light-blue fw-semibold")),!e.isSelected&&e.isCompleted&&(c+=" ".concat((null===(r=e.theme)||void 0===r?void 0:r.isCompletedOverride)||"text-info")),n.createElement("li",{className:null===(a=e.theme)||void 0===a?void 0:a.item},e.isCompleted&&e.appLink?n.createElement(s.F,{appLink:e.appLink,className:"".concat(c," ").concat((null===(i=e.theme)||void 0===i?void 0:i.itemContent)||"")},l):n.createElement("div",{className:"".concat(c," ").concat((null===(o=e.theme)||void 0===o?void 0:o.itemContent)||"")},l))}function l(e){var t,r=e.steps.reduce(function(t,r,n){return r.id===e.currentStep&&(t=n+1),t},1);return n.createElement(n.Fragment,null,n.createElement("h2",{className:"h4"},i("stepNumber",{currentStep:r,totalSteps:e.steps.length})),n.createElement("ol",{className:"list-unstyled ".concat((null===(t=e.theme)||void 0===t?void 0:t.itemsContainer)||"")},e.steps.map(function(t,a){var s=t.id===e.currentStep,i=r>a+1;return n.createElement(o,{index:a,key:t.id,text:t.text,subText:t.subText,isSelected:s,isCompleted:i,appLink:!e.disableAppLinks&&t.appLink,disabled:t.disabled,theme:e.theme})})))}},58739:(e,t,r)=>{var n;r.d(t,{K:()=>n}),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"}(n||(n={}))},94644:(e,t,r)=>{r.d(t,{r:()=>u});var n=r(50242),a=r(81886),s=r(67058),i=r(14553),o=r(49267),l=r(49075),c={notFound:s.d,forbidden:{rating:i.q,yearLevel:i.q,region:o.a,privacy:i.q},badRequest:l._,internalServerError:l._};function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var s;s="number"==typeof e?e:e.status;var i=Object.assign(Object.assign({},c),t);s&&a.Q.Ry.isStatusCodeError(s)&&(s!==n.o.InternalServer?s!==n.o.NotFound?s!==n.o.Forbidden?r.badRequest||a.Q.Ry.throw(new i.badRequest):r.forbidden||a.Q.Ry.throw(new i.forbidden.privacy):r.notFound||a.Q.Ry.throw(new i.notFound):r.internalServerError||a.Q.Ry.throw(new l._))}}},16695:(e,t,r)=>{r.r(t),r.d(t,{BulkUserUploadStatusPollingView:()=>f});var n=r(32735),a=r(70680),s=r(23481),i=r(20354),o=r(27150),l=r(26055),c=r(43820),u=r(14177),d=r(4594),p=r(79612),m=r(29613),v=r(18087),b="userManager.bulkUserUploadStatusPolling";function f(e){var t=(0,a.I0)(),r=(0,v.Y)(e.userType);return(0,p.M)({title:s.T.getPhrase(b,"pageTitle")}),n.createElement(l.A.Provider,{value:c.a.Primary},n.createElement(o.$,{appLinks:r,userType:e.userType,currentStep:"status",canAddExistingUsers:!0},n.createElement(u.$,{jobId:e.jobId,pollJob:function(r,n){i.a.fetch(t,m.q.getJobProgress(e.jobId,r,n))},objectType:d.E.User,userType:e.userType,statusCompleteAppLink:r.userUploadStatus.complete,actionName:s.T.getPhrase(b,"bulkUpload"),navLockId:o.A,actionVerb:"Create"})))}},29613:(e,t,r)=>{r.d(t,{q:()=>i});var n=r(99940),a=r(97395),s=r(149),i={createJob:function(e,t,r){return{url:"{gateway}/v1/batch/jobs",key:"create:job",type:n.k.POST,data:e,success:t,error:r}},getJobs:function(e){var t={},r=[],n=[];return e.cursor&&(t.cursor=e.cursor),e.sort&&("oldest"===e.sort?t.order="ASC":t.order="DESC"),e.bulkActionType?(r=Array.isArray(e.bulkActionType)?e.bulkActionType:[e.bulkActionType],t.type=r):t.type=s.O,e.userType&&(n=Array.isArray(e.userType)?e.userType:[e.userType],t.dataType=n),{url:a._.urlBuilder("{gateway}/v1/batch/jobs",t),key:"batch:jobs:".concat(e.cursor,":").concat(e.sort,":").concat(r.sort().join(":"),":").concat(n.sort().join(":"))}},getJob:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e),key:"job:".concat(e)}},getJobProgress:function(e,t,r){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/progress"),key:"job:".concat(e,":progress"),invalidationKeys:"job:".concat(e,":progress"),success:t,error:r}},getJobResults:function(e,t,r,n,s){var i={status:t};return r&&(i.cursor=r),{url:a._.urlBuilder("{gateway}/v1/batch/jobs/".concat(e,"/results"),i),key:"job:".concat(e,":results:").concat(t,":").concat(r),success:n,error:s}},getYearGroupRolloverStatus:function(e){return{url:"{gateway}/v1/batch/validations/customers/".concat(e,"/year-group-roll-over"),key:"year:group:rollover:status"}},sendJobReports:function(e){return{url:"{gateway}/v1/batch/results/export",key:"send:job:reports:".concat(e.sort().join(":")),type:n.k.POST,data:{jobIds:e}}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}}}},79447:(e,t,r)=>{r.d(t,{Z:()=>p});var n=r(95685),a=r.n(n),s=r(32735),i=r(46304),o=r(58661),l=r(74512);function c(e,t,r){const n=(e-t)/(r-t)*100;return Math.round(1e3*n)/1e3}function u({min:e,now:t,max:r,label:n,visuallyHidden:s,striped:i,animated:o,className:u,style:d,variant:p,bsPrefix:m,...v},b){return(0,l.jsx)("div",{ref:b,...v,role:"progressbar",className:a()(u,`${m}-bar`,{[`bg-${p}`]:p,[`${m}-bar-animated`]:o,[`${m}-bar-striped`]:o||i}),style:{width:`${c(t,e,r)}%`,...d},"aria-valuenow":t,"aria-valuemin":e,"aria-valuemax":r,children:s?(0,l.jsx)("span",{className:"visually-hidden",children:n}):n})}const d=s.forwardRef(({isChild:e=!1,...t},r)=>{const n={min:0,max:100,animated:!1,visuallyHidden:!1,striped:!1,...t};if(n.bsPrefix=(0,i.vE)(n.bsPrefix,"progress"),e)return u(n,r);const{min:c,now:d,max:p,label:m,visuallyHidden:v,striped:b,animated:f,bsPrefix:g,variant:y,className:h,children:k,...E}=n;return(0,l.jsx)("div",{ref:r,...E,className:a()(h,g),children:k?(0,o.UI)(k,e=>(0,s.cloneElement)(e,{isChild:!0})):u({min:c,now:d,max:p,label:m,visuallyHidden:v,striped:b,animated:f,bsPrefix:g,variant:y},r)})});d.displayName="ProgressBar";const p=d}}]);
2
- //# sourceMappingURL=6695-4e01b4a18c-lite.chunk.js.map
2
+ //# sourceMappingURL=6695-4ae0acad94-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/6695-4e01b4a18c-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/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/in-progress/WizardInProgress.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/submitted/WizardSubmitted.tsx","file:///app/packages/libs/shared/src/components/wizard/status/polling/WizardPolling.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/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/status/polling/BulkUserUploadStatusPollingView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts","file:///app/node_modules/react-bootstrap/esm/ProgressBar.js"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\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, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\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';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.wizardInProgress';\n\ninterface WizardInProgressProps {\n userType?: UserGroup;\n totalItems: number;\n totalItemsComplete: number;\n actionName: string;\n actionVerb: WizardActionVerb;\n objectType?: MasterType;\n progressVerbPhrase?: string;\n}\n\nexport function WizardInProgress(props: WizardInProgressProps): JSX.Element {\n const percentage = Math.floor(props.totalItemsComplete / props.totalItems * 100) || 0;\n\n function renderProgressText() {\n if (props.objectType === MasterType.User && props.userType) {\n return (\n <Text\n namespace={namespace}\n phrase={props.userType === UserGroup.Learner ? 'progressStudents' : 'progressStaff'}\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n if (props.objectType === MasterType.Video) {\n return (\n <Text\n namespace={namespace}\n phrase='progressVideos'\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n return (\n <Text\n namespace={namespace}\n phrase='progressItems'\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n return (\n <div>\n <div className='d-flex align-items-center mb-2'>\n <h2 className='h5 mb-0'>\n <Text namespace={namespace} phrase='heading' options={{ percentage, actionName: props.actionName }} />\n </h2>\n <SvgContainer svgName={cvSvgLibrary.CheckCircle} />\n </div>\n\n <p>\n <Text namespace={namespace} phrase={`info${props.actionVerb}`} />\n </p>\n\n <p className='mb-1'>\n <span className='text-info'>\n {props.progressVerbPhrase ? (\n <span>{props.progressVerbPhrase}</span>\n ) : (\n <Text namespace={namespace} phrase={`progressVerb${props.actionVerb}`} />\n )}\n </span>\n &nbsp;\n {renderProgressText()}\n </p>\n <ProgressBar variant='info' now={percentage} />\n </div>\n );\n}","import React from 'react';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.wizardSubmitted';\n\ninterface WizardSubmittedProps {\n actionName?: string;\n actionVerb: WizardActionVerb;\n}\n\nexport function WizardSubmitted(props: WizardSubmittedProps): JSX.Element {\n return (\n <div>\n <div className='d-flex align-items-center mb-2'>\n <h2 className='h5 mb-0'>\n {props.actionName\n ? <Text namespace={namespace} phrase='heading' options={{ actionName: props.actionName }} />\n : <Text namespace={namespace} phrase='headingGeneric' />\n }\n </h2>\n <SvgContainer svgName={cvSvgLibrary.CheckCircle} />\n </div>\n\n <p>\n <Text namespace={namespace} phrase={`info${props.actionVerb}`} />\n </p>\n\n <p className='mb-1 text-info'>\n <Text namespace={namespace} phrase='preparing' />\n </p>\n <ProgressBar variant='info' now={0} />\n </div>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { WizardInProgress } from 'libs/shared/components/wizard/status/statuses/in-progress/WizardInProgress';\nimport { WizardSubmitted } from 'libs/shared/components/wizard/status/statuses/submitted/WizardSubmitted';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { BatchJobProgress, WizardActionVerb } from 'libs/shared/interfaces';\n\nconst POLLING_INTERVAL = 2000;\nconst MAX_CONSECUTIVE_ERROR_COUNT = 3; // If the polling endpoint errors 3 times in a row, we will cancel\n\nexport type WizardPollJobFn = (onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void) => void;\n\ninterface WizardPollingProps {\n jobId: string;\n userType?: UserGroup;\n statusCompleteAppLink?: Core.AppLink;\n onStatusCompleted?: () => void;\n pollJob: WizardPollJobFn;\n actionName: string;\n navLockId?: string;\n actionVerb: WizardActionVerb;\n objectType?: MasterType;\n progressVerbPhrase?: string;\n}\n\nexport function WizardPolling(props: WizardPollingProps): JSX.Element {\n const [ progress, setProgress ] = React.useState<BatchJobProgress>(null);\n const [ consecutiveErrorCount, setConsecutiveErrorCount ] = React.useState(0);\n\n const timeoutIdRef = React.useRef<number>(null);\n\n const navLock = useNavLock();\n const dispatch = useDispatch();\n\n // Kick off polling for the running batch job. Polling will be stopped if user navigates away.\n React.useEffect(() => {\n pollJob();\n\n return () => {\n if (!timeoutIdRef.current)\n return;\n\n window.clearTimeout(timeoutIdRef.current);\n };\n }, []);\n\n function pollJob(): void {\n props.pollJob(onPollSuccess, onPollError);\n }\n\n function onPollSuccess(currentProgress: BatchJobProgress): void {\n setProgress(currentProgress);\n\n // Job is considered completed if status matches any of the following values\n const jobHasCompleted = (\n currentProgress.status === BatchJobStatus.Completed ||\n currentProgress.status === BatchJobStatus.CompletedWithError ||\n currentProgress.status === BatchJobStatus.Failed\n );\n\n if (!jobHasCompleted) {\n timeoutIdRef.current = window.setTimeout(pollJob, POLLING_INTERVAL);\n return;\n }\n\n /**\n * When the job progress is 100%, we want to provide 2 seconds for the\n * progress bar animation to complete before navigating to the \"complete\"\n * view. Otherwise it's a little bit jarring.\n */\n window.setTimeout(() => {\n onCompleteJob();\n }, 2000);\n }\n\n function onPollError(xhr: Xhr): void {\n if (consecutiveErrorCount === MAX_CONSECUTIVE_ERROR_COUNT) {\n window.clearTimeout(timeoutIdRef.current);\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n handleHttpError(xhr);\n }\n\n setConsecutiveErrorCount(currentVal => currentVal + 1);\n timeoutIdRef.current = window.setTimeout(pollJob, POLLING_INTERVAL);\n }\n\n function onCompleteJob(): void {\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n\n const params: HashObject = { jobId: props.jobId };\n\n if (props.userType) {\n params.userType = props.userType;\n\n // Clear all user's in flight cache. This way any users updated in bulk actions will have up to date data.\n dispatch({\n type: Flight.Actions.INVALIDATE,\n keys: [ 'school:users', 'user:count', 'search:aggregation', 'search:users' ],\n request: null\n });\n }\n if (props.statusCompleteAppLink) {\n Core.AppLinkHelper.trigger({\n ...props.statusCompleteAppLink,\n params: params\n });\n return;\n }\n\n props.onStatusCompleted?.();\n }\n\n const hasNotStarted = !!(\n !progress ||\n progress.status === BatchJobStatus.Submitted ||\n progress.status === BatchJobStatus.Queued ||\n progress.status === BatchJobStatus.Pending\n );\n\n if (hasNotStarted || progress.totalItems === 0)\n return <WizardSubmitted actionName={props.actionName} actionVerb={props.actionVerb} />;\n\n return (\n <WizardInProgress\n totalItems={progress.totalItems}\n totalItemsComplete={progress.processedItems}\n userType={props.userType}\n objectType={props.objectType}\n actionName={props.actionName}\n actionVerb={props.actionVerb}\n progressVerbPhrase={props.progressVerbPhrase}\n />\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 { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { BULK_USER_UPLOAD_NAV_LOCK_ID, BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserWizardStatusParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { WizardPolling } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJobProgress } from 'libs/shared/interfaces';\n\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUserUploadStatusPolling';\n\nexport function BulkUserUploadStatusPollingView(props: UserWizardStatusParams): JSX.Element {\n const dispatch = useDispatch();\n const appLinks = getUserManagerAppLinks(props.userType);\n\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n function pollJob(onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void): void {\n Flight.fetch(dispatch, JobRequests.getJobProgress(props.jobId, onSuccess, onError));\n }\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='status'\n canAddExistingUsers\n >\n <WizardPolling\n jobId={props.jobId}\n pollJob={pollJob}\n objectType={MasterType.User}\n userType={props.userType}\n statusCompleteAppLink={appLinks.userUploadStatus.complete}\n actionName={LanguageService.getPhrase(namespace, 'bulkUpload')}\n navLockId={BULK_USER_UPLOAD_NAV_LOCK_ID}\n actionVerb='Create'\n />\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { cloneElement } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { map } from './ElementChildren';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst ROUND_PRECISION = 1000;\n\n/**\n * Validate that children, if any, are instances of `ProgressBar`.\n */\nfunction onlyProgressBar(props, propName, componentName) {\n const children = props[propName];\n if (!children) {\n return null;\n }\n let error = null;\n React.Children.forEach(children, child => {\n if (error) {\n return;\n }\n\n /**\n * Compare types in a way that works with libraries that patch and proxy\n * components like react-hot-loader.\n *\n * see https://github.com/gaearon/react-hot-loader#checking-element-types\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const element = /*#__PURE__*/_jsx(ProgressBar, {});\n if (child.type === element.type) return;\n const childType = child.type;\n const childIdentifier = /*#__PURE__*/React.isValidElement(child) ? childType.displayName || childType.name || childType : child;\n error = new Error(`Children of ${componentName} can contain only ProgressBar ` + `components. Found ${childIdentifier}.`);\n });\n return error;\n}\nfunction getPercentage(now, min, max) {\n const percentage = (now - min) / (max - min) * 100;\n return Math.round(percentage * ROUND_PRECISION) / ROUND_PRECISION;\n}\nfunction renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n className,\n style,\n variant,\n bsPrefix,\n ...props\n}, ref) {\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...props,\n role: \"progressbar\",\n className: classNames(className, `${bsPrefix}-bar`, {\n [`bg-${variant}`]: variant,\n [`${bsPrefix}-bar-animated`]: animated,\n [`${bsPrefix}-bar-striped`]: animated || striped\n }),\n style: {\n width: `${getPercentage(now, min, max)}%`,\n ...style\n },\n \"aria-valuenow\": now,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n children: visuallyHidden ? /*#__PURE__*/_jsx(\"span\", {\n className: \"visually-hidden\",\n children: label\n }) : label\n });\n}\nconst ProgressBar = /*#__PURE__*/React.forwardRef(({\n isChild = false,\n ...rest\n}, ref) => {\n const props = {\n min: 0,\n max: 100,\n animated: false,\n visuallyHidden: false,\n striped: false,\n ...rest\n };\n props.bsPrefix = useBootstrapPrefix(props.bsPrefix, 'progress');\n if (isChild) {\n return renderProgressBar(props, ref);\n }\n const {\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant,\n className,\n children,\n ...wrapperProps\n } = props;\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...wrapperProps,\n className: classNames(className, bsPrefix),\n children: children ? map(children, child => /*#__PURE__*/cloneElement(child, {\n isChild: true\n })) : renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant\n }, ref)\n });\n});\nProgressBar.displayName = 'ProgressBar';\nexport default ProgressBar;"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","viewModel","setViewModel","updateDuplicates","invalidUsers","hasValidatedUsers","existingUsersHash","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","showButtons","hideHeader","WizardInProgress","percentage","Math","floor","totalItemsComplete","totalItems","options","actionName","SvgContainer","svgName","actionVerb","progressVerbPhrase","objectType","MasterType","totalComplete","total","smartCount","ProgressBar","now","WizardSubmitted","POLLING_INTERVAL","MAX_CONSECUTIVE_ERROR_COUNT","WizardPolling","progress","setProgress","consecutiveErrorCount","setConsecutiveErrorCount","timeoutIdRef","dispatch","pollJob","onPollSuccess","onPollError","currentProgress","status","BatchJobStatus","window","setTimeout","navLockId","params","jobId","type","request","statusCompleteAppLink","onStatusCompleted","onCompleteJob","current","xhr","clearTimeout","currentVal","processedItems","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","key","disableAppLinks","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","BulkUserUploadStatusPollingView","value","onSuccess","onError","JobRequests","createJob","data","success","error","url","getJobs","queryParams","bulkActionTypes","userTypes","cursor","sort","order","bulkActionType","Array","isArray","dataType","join","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","customerId","sendJobReports","ids","jobIds","getJobSummary","getPercentage","min","max","round","renderProgressBar","label","visuallyHidden","striped","animated","style","bsPrefix","ref","role","width","isChild","rest","wrapperProps","child","cloneElement","displayName"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/6695-4ae0acad94-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/BulkUserUploadBackButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/bulk-user-upload-wizard-layout.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout.tsx","file:///app/packages/libs/shared/src/apps/user-manager/context/UserManagerClientContext.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useBulkUploadUsers.ts","file:///app/packages/libs/shared/src/components/wizard/header/WizardHeader.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/in-progress/WizardInProgress.tsx","file:///app/packages/libs/shared/src/components/wizard/status/statuses/submitted/WizardSubmitted.tsx","file:///app/packages/libs/shared/src/components/wizard/status/polling/WizardPolling.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/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/bulk-user-upload/status/polling/BulkUserUploadStatusPollingView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/JobRequests.ts","file:///app/node_modules/react-bootstrap/esm/ProgressBar.js"],"sourcesContent":["import React from 'react';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userWizardBackButtons';\n\ninterface BulkUserUploadBackButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n}\n\nexport function BulkUserUploadBackButton(props: BulkUserUploadBackButtonProps): JSX.Element {\n if (props.currentStep === 'status')\n return <></>;\n\n return (\n <AppLink\n className='btn btn-link me-2'\n appLink={props.appLinks.userManager}\n >\n <Text namespace={namespace} phrase='cancel' />\n </AppLink>\n );\n}","import React from 'react';\nimport { Button } from 'react-bootstrap';\n\nimport { ContextService } from 'libs/analytics/services/ContextService';\n\nimport { BulkUserUploadStepId } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\n\nconst namespace = 'userManager.userWizardHeader';\n\ninterface BulkUserUploadContinueButtonProps {\n currentStep: BulkUserUploadStepId;\n appLinks: UserManagerAppLinks;\n canAddExistingUsers: boolean;\n}\n\nexport function BulkUserUploadContinueButton(props: BulkUserUploadContinueButtonProps): JSX.Element {\n const { duplicateSets, hasExistingUsers } = useBulkUploadUsers();\n const { disableNext, onClickConfirm } = React.useContext(WizardLayoutContext);\n\n const spreadsheetHasDuplicates = !!duplicateSets?.length;\n\n const currentAppLink = ContextService.getCurrentContext().appLink;\n\n if (currentAppLink.action === props.appLinks.userUploadStatus.polling.action)\n return <></>;\n\n // we hide the button cuz we have one in the success component\n if (currentAppLink.action === props.appLinks.userUploadStatus.complete.action)\n return <></>;\n\n function willUploadOnNext(): boolean {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadPopup.action:\n case props.appLinks.userUploadReviewAccounts.action:\n return !spreadsheetHasDuplicates && !hasExistingUsers;\n\n case props.appLinks.userUploadFixDuplicates.action:\n return !hasExistingUsers;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n return !hasExistingUsers;\n\n default:\n return true;\n }\n }\n\n if (willUploadOnNext()) {\n return (\n <Button\n className={disableNext ? 'disabled' : ''}\n variant='dark'\n onClick={onClickConfirm}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='create'\n />\n </Button>\n );\n }\n\n function getNextAppLink() {\n switch (currentAppLink.action) {\n case props.appLinks.userUploadReviewAccounts.action:\n if (spreadsheetHasDuplicates)\n return props.appLinks.userUploadFixDuplicates;\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadFixDuplicates.action:\n if (hasExistingUsers && props.canAddExistingUsers)\n return props.appLinks.userUploadReviewExistingAccounts;\n\n case props.appLinks.userUploadReviewExistingAccounts.action:\n if (props.canAddExistingUsers)\n return props.appLinks.userUploadConfirmation;\n\n default:\n return null;\n }\n }\n\n return (\n <AppLink\n className={`btn btn-dark ${disableNext ? 'disabled' : ''}`}\n appLink={getNextAppLink()}\n disabled={disableNext}\n >\n <Text\n namespace={namespace}\n phrase='next'\n />\n </AppLink>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"wizardContent\":\"hHr3C\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { BulkUserUploadBackButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/back-buttons/BulkUserUploadBackButton';\nimport { BulkUserUploadContinueButton } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/header/continue-buttons/BulkUserUploadContinueButton';\nimport { useBulkUploadUsers } from 'libs/shared/apps/user-manager/hooks/useBulkUploadUsers';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { WizardHeader } from 'libs/shared/components/wizard/header/WizardHeader';\nimport { WizardStepList } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { WizardLayoutContextProvider } from 'libs/shared/context/WizardLayoutContext';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\n\nimport styles from './bulk-user-upload-wizard-layout.scss';\n\nexport type BulkUserUploadStepId = 'review-accounts' | 'fix-duplicates' | 'review-existing-accounts' | 'confirmation' |'status';\n\nconst namespace = 'userManager.bulkUserUploadWizardLayout';\nexport const BULK_USER_UPLOAD_NAV_LOCK_ID = 'bulk:user:upload:nav:lock';\n\ntype BulkUserUploadWizardLayoutProps = React.PropsWithChildren<{\n appLinks: UserManagerAppLinks;\n userType: UserGroup;\n currentStep: BulkUserUploadStepId;\n canAddExistingUsers?: boolean;\n}>;\n\nexport function BulkUserUploadWizardLayout(props: BulkUserUploadWizardLayoutProps): JSX.Element {\n const { users, setUsers } = useBulkUploadUsers();\n\n const navLock = useNavLock();\n\n React.useEffect(() => {\n // If there is no view model, redirect away\n if (!users) {\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n return;\n }\n\n navLock.lock({\n id: BULK_USER_UPLOAD_NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody'),\n appLinkWhitelist: BulkUserUploadHelper.getWizardAppLinks(props.appLinks),\n onConfirmUnlock: () => {\n setUsers(null);\n }\n });\n\n return () => {\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n };\n }, []);\n\n React.useEffect(() => {\n if (users?.length)\n return;\n\n navLock.unlock(BULK_USER_UPLOAD_NAV_LOCK_ID);\n Core.AppLinkHelper.trigger(props.appLinks.userManager, { replace: true });\n }, [users?.length]);\n\n if (!users)\n return <></>;\n\n return (\n <WizardLayoutContextProvider>\n <div className='px-3'>\n <WizardHeader<BulkUserUploadStepId>\n title={LanguageService.getPhrase(namespace, 'bulkUpload')}\n currentStep={props.currentStep}\n loaded\n continueButton={\n <BulkUserUploadContinueButton\n currentStep={props.currentStep}\n appLinks={props.appLinks}\n canAddExistingUsers={props.canAddExistingUsers}\n />\n }\n backButton={<BulkUserUploadBackButton currentStep={props.currentStep} appLinks={props.appLinks} />}\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, 'bulkUpload'),\n active: true\n }\n ]}\n />\n\n <div className='row g-0'>\n <div className='col-2'>\n <WizardStepList<BulkUserUploadStepId>\n steps={BulkUserUploadHelper.getSteps(props.userType, props.canAddExistingUsers)}\n currentStep={props.currentStep}\n />\n </div>\n\n <div className={`col-10 ${styles.wizardContent}`}>\n {props.children}\n </div>\n </div>\n </div>\n </WizardLayoutContextProvider>\n );\n}","import React from 'react';\n\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\n\nexport const UserManagerClientContext = React.createContext<UserManagerClient>(null);","import { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\n\nimport { EditUserRequest } from '../interfaces';\nimport { BulkUserUploadViewModel, UserHash } from '../interfaces/viewmodels/BulkUserUploadViewModel';\nimport { UserManagerHelper } from '../utils/UserManagerHelper';\n\nfunction updateUserHash(userHash: UserHash, updatedUserIdsHash: HashObject<boolean>): UserHash {\n const updatedUsers = Object.keys(userHash || {}).reduce((updatedObj: UserHash, lookupId) => {\n if (!updatedUserIdsHash[lookupId])\n updatedObj[lookupId] = userHash[lookupId];\n return updatedObj;\n }, {});\n\n return updatedUsers;\n}\n\nexport const useBulkUploadUsers = () => {\n const [ viewModel, setViewModel ] = useViewModel<BulkUserUploadViewModel>(SharedViewModelKeys.BULK_USER_UPLOAD);\n\n function initializeUsers(users?: EditUserRequest[]): void {\n setViewModel({\n users,\n invalidUsers: null,\n existingUsersHash: null\n });\n\n updateDuplicates(users);\n }\n\n function updateUser(updatedUser: EditUserRequest): void {\n const updatedUsers = viewModel.users.map(user => {\n if (user.lookupId !== updatedUser.lookupId)\n return user;\n\n return updatedUser;\n });\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, { [updatedUser.lookupId]: true }),\n existingUsersHash: viewModel?.existingUsersHash\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function deleteUsers(deletedUsers: string[]): void {\n const userIdHash = deletedUsers.reduce((prev: HashObject, curr) => {\n prev[curr] = true;\n return prev;\n }, {});\n\n const updatedUsers = viewModel.users.filter(user => !userIdHash[user.lookupId]);\n\n setViewModel({\n users: updatedUsers,\n invalidUsers: updateUserHash(viewModel?.invalidUsers, userIdHash),\n existingUsersHash: updateUserHash(viewModel?.existingUsersHash, userIdHash),\n existingUserToAdd: viewModel?.existingUserToAdd?.filter(u => !!viewModel?.existingUsersHash[u.lookupId])\n });\n\n updateDuplicates(updatedUsers);\n }\n\n function updateDuplicates(users?: EditUserRequest[]): void {\n const duplicateSets = UserManagerHelper.getNewDuplicates(users);\n setViewModel('duplicateSets', duplicateSets);\n }\n\n return {\n users: viewModel?.users,\n invalidUsers: viewModel?.invalidUsers,\n hasValidatedUsers: !!viewModel?.invalidUsers,\n existingUsersHash: viewModel?.existingUsersHash || {},\n hasExistingUsers: !!Object.keys(viewModel?.existingUsersHash || {}).length,\n existingUserToAdd: viewModel?.existingUserToAdd,\n duplicateSets: viewModel?.duplicateSets,\n newUsers: viewModel?.users?.filter(u => !viewModel?.existingUsersHash?.[u.lookupId]) || [],\n\n setUsers: initializeUsers,\n setInvalidUsers: (invalidUsers: UserHash) => setViewModel('invalidUsers', invalidUsers),\n setExistingUsers: (existingUsers: UserHash) => setViewModel('existingUsersHash', existingUsers),\n updateUser,\n deleteUsers\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';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.wizardInProgress';\n\ninterface WizardInProgressProps {\n userType?: UserGroup;\n totalItems: number;\n totalItemsComplete: number;\n actionName: string;\n actionVerb: WizardActionVerb;\n objectType?: MasterType;\n progressVerbPhrase?: string;\n}\n\nexport function WizardInProgress(props: WizardInProgressProps): JSX.Element {\n const percentage = Math.floor(props.totalItemsComplete / props.totalItems * 100) || 0;\n\n function renderProgressText() {\n if (props.objectType === MasterType.User && props.userType) {\n return (\n <Text\n namespace={namespace}\n phrase={props.userType === UserGroup.Learner ? 'progressStudents' : 'progressStaff'}\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n if (props.objectType === MasterType.Video) {\n return (\n <Text\n namespace={namespace}\n phrase='progressVideos'\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n return (\n <Text\n namespace={namespace}\n phrase='progressItems'\n options={{ totalComplete: props.totalItemsComplete, total: props.totalItems, smartCount: props.totalItems }}\n />\n );\n }\n\n return (\n <div>\n <div className='d-flex align-items-center mb-2'>\n <h2 className='h5 mb-0'>\n <Text namespace={namespace} phrase='heading' options={{ percentage, actionName: props.actionName }} />\n </h2>\n <SvgContainer svgName={cvSvgLibrary.CheckCircle} />\n </div>\n\n <p>\n <Text namespace={namespace} phrase={`info${props.actionVerb}`} />\n </p>\n\n <p className='mb-1'>\n <span className='text-info'>\n {props.progressVerbPhrase ? (\n <span>{props.progressVerbPhrase}</span>\n ) : (\n <Text namespace={namespace} phrase={`progressVerb${props.actionVerb}`} />\n )}\n </span>\n &nbsp;\n {renderProgressText()}\n </p>\n <ProgressBar variant='info' now={percentage} />\n </div>\n );\n}","import React from 'react';\nimport { ProgressBar } from 'react-bootstrap';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionVerb } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.wizardSubmitted';\n\ninterface WizardSubmittedProps {\n actionName?: string;\n actionVerb: WizardActionVerb;\n}\n\nexport function WizardSubmitted(props: WizardSubmittedProps): JSX.Element {\n return (\n <div>\n <div className='d-flex align-items-center mb-2'>\n <h2 className='h5 mb-0'>\n {props.actionName\n ? <Text namespace={namespace} phrase='heading' options={{ actionName: props.actionName }} />\n : <Text namespace={namespace} phrase='headingGeneric' />\n }\n </h2>\n <SvgContainer svgName={cvSvgLibrary.CheckCircle} />\n </div>\n\n <p>\n <Text namespace={namespace} phrase={`info${props.actionVerb}`} />\n </p>\n\n <p className='mb-1 text-info'>\n <Text namespace={namespace} phrase='preparing' />\n </p>\n <ProgressBar variant='info' now={0} />\n </div>\n );\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { WizardInProgress } from 'libs/shared/components/wizard/status/statuses/in-progress/WizardInProgress';\nimport { WizardSubmitted } from 'libs/shared/components/wizard/status/statuses/submitted/WizardSubmitted';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { BatchJobProgress, WizardActionVerb } from 'libs/shared/interfaces';\n\nconst POLLING_INTERVAL = 2000;\nconst MAX_CONSECUTIVE_ERROR_COUNT = 3; // If the polling endpoint errors 3 times in a row, we will cancel\n\nexport type WizardPollJobFn = (onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void) => void;\n\ninterface WizardPollingProps {\n jobId: string;\n userType?: UserGroup;\n statusCompleteAppLink?: Core.AppLink;\n onStatusCompleted?: () => void;\n pollJob: WizardPollJobFn;\n actionName: string;\n navLockId?: string;\n actionVerb: WizardActionVerb;\n objectType?: MasterType;\n progressVerbPhrase?: string;\n}\n\nexport function WizardPolling(props: WizardPollingProps): JSX.Element {\n const [ progress, setProgress ] = React.useState<BatchJobProgress>(null);\n const [ consecutiveErrorCount, setConsecutiveErrorCount ] = React.useState(0);\n\n const timeoutIdRef = React.useRef<number>(null);\n\n const navLock = useNavLock();\n const dispatch = useDispatch();\n\n // Kick off polling for the running batch job. Polling will be stopped if user navigates away.\n React.useEffect(() => {\n pollJob();\n\n return () => {\n if (!timeoutIdRef.current)\n return;\n\n window.clearTimeout(timeoutIdRef.current);\n };\n }, []);\n\n function pollJob(): void {\n props.pollJob(onPollSuccess, onPollError);\n }\n\n function onPollSuccess(currentProgress: BatchJobProgress): void {\n setProgress(currentProgress);\n\n // Job is considered completed if status matches any of the following values\n const jobHasCompleted = (\n currentProgress.status === BatchJobStatus.Completed ||\n currentProgress.status === BatchJobStatus.CompletedWithError ||\n currentProgress.status === BatchJobStatus.Failed\n );\n\n if (!jobHasCompleted) {\n timeoutIdRef.current = window.setTimeout(pollJob, POLLING_INTERVAL);\n return;\n }\n\n /**\n * When the job progress is 100%, we want to provide 2 seconds for the\n * progress bar animation to complete before navigating to the \"complete\"\n * view. Otherwise it's a little bit jarring.\n */\n window.setTimeout(() => {\n onCompleteJob();\n }, 2000);\n }\n\n function onPollError(xhr: Xhr): void {\n if (consecutiveErrorCount === MAX_CONSECUTIVE_ERROR_COUNT) {\n window.clearTimeout(timeoutIdRef.current);\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n handleHttpError(xhr);\n }\n\n setConsecutiveErrorCount(currentVal => currentVal + 1);\n timeoutIdRef.current = window.setTimeout(pollJob, POLLING_INTERVAL);\n }\n\n function onCompleteJob(): void {\n if (props.navLockId)\n navLock.unlock(props.navLockId);\n\n const params: HashObject = { jobId: props.jobId };\n\n if (props.userType) {\n params.userType = props.userType;\n\n // Clear all user's in flight cache. This way any users updated in bulk actions will have up to date data.\n dispatch({\n type: Flight.Actions.INVALIDATE,\n keys: [ 'school:users', 'user:count', 'search:aggregation', 'search:users' ],\n request: null\n });\n }\n if (props.statusCompleteAppLink) {\n Core.AppLinkHelper.trigger({\n ...props.statusCompleteAppLink,\n params: params\n });\n return;\n }\n\n props.onStatusCompleted?.();\n }\n\n const hasNotStarted = !!(\n !progress ||\n progress.status === BatchJobStatus.Submitted ||\n progress.status === BatchJobStatus.Queued ||\n progress.status === BatchJobStatus.Pending\n );\n\n if (hasNotStarted || progress.totalItems === 0)\n return <WizardSubmitted actionName={props.actionName} actionVerb={props.actionVerb} />;\n\n return (\n <WizardInProgress\n totalItems={progress.totalItems}\n totalItemsComplete={progress.processedItems}\n userType={props.userType}\n objectType={props.objectType}\n actionName={props.actionName}\n actionVerb={props.actionVerb}\n progressVerbPhrase={props.progressVerbPhrase}\n />\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 { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { BULK_USER_UPLOAD_NAV_LOCK_ID, BulkUserUploadWizardLayout } from 'libs/shared/apps/user-manager/components/bulk-upload/layout/BulkUserUploadWizardLayout';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserWizardStatusParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserWizardParams';\nimport { WizardPolling } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJobProgress } from 'libs/shared/interfaces';\n\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { getUserManagerAppLinks } from 'apps/user-manager/utils/LiteUserManagerAppLinks';\n\nconst namespace = 'userManager.bulkUserUploadStatusPolling';\n\nexport function BulkUserUploadStatusPollingView(props: UserWizardStatusParams): JSX.Element {\n const dispatch = useDispatch();\n const appLinks = getUserManagerAppLinks(props.userType);\n\n useSetPageMetadata({ title: LanguageService.getPhrase(namespace, 'pageTitle') });\n\n function pollJob(onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void): void {\n Flight.fetch(dispatch, JobRequests.getJobProgress(props.jobId, onSuccess, onError));\n }\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Primary}>\n <BulkUserUploadWizardLayout\n appLinks={appLinks}\n userType={props.userType}\n currentStep='status'\n canAddExistingUsers\n >\n <WizardPolling\n jobId={props.jobId}\n pollJob={pollJob}\n objectType={MasterType.User}\n userType={props.userType}\n statusCompleteAppLink={appLinks.userUploadStatus.complete}\n actionName={LanguageService.getPhrase(namespace, 'bulkUpload')}\n navLockId={BULK_USER_UPLOAD_NAV_LOCK_ID}\n actionVerb='Create'\n />\n </BulkUserUploadWizardLayout>\n </UserManagerClientContext.Provider>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { UserAuditLogQueryParams } from 'libs/shared/apps/user-manager/components/audit-log/components/audit-log-filters/UserAuditLogFilters';\nimport { SUPPORTED_BATCH_JOB_TYPES } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { BatchJobResultStatus } from 'libs/shared/enums/BatchJobResultStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, BatchJob, BatchJobProgress, BatchJobResultsResponse, CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const JobRequests = {\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'create:job',\n type: HttpVerbs.POST,\n data,\n success,\n error\n };\n },\n\n getJobs(queryParams: UserAuditLogQueryParams): Flight.Request {\n const params: HashObject = {};\n\n let bulkActionTypes: BatchJobType[] = [];\n let userTypes: UserGroup[] = [];\n\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.bulkActionType) {\n bulkActionTypes = Array.isArray(queryParams.bulkActionType)\n ? queryParams.bulkActionType\n : [queryParams.bulkActionType];\n\n params.type = bulkActionTypes;\n } else {\n // only show supported type in the table by default\n params.type = SUPPORTED_BATCH_JOB_TYPES;\n }\n\n if (queryParams.userType) {\n userTypes = Array.isArray(queryParams.userType)\n ? queryParams.userType\n : [queryParams.userType];\n\n params.dataType = userTypes;\n }\n \n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `batch:jobs:${queryParams.cursor}:${queryParams.sort}:${bulkActionTypes.sort().join(':')}:${userTypes.sort().join(':')}`\n };\n },\n\n getJob(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}`,\n key: `job:${id}`\n };\n },\n\n getJobProgress(\n id: string,\n success?: (progress: BatchJobProgress) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/progress`,\n key: `job:${id}:progress`,\n invalidationKeys: `job:${id}:progress`,\n success,\n error\n };\n },\n\n getJobResults<TObject extends BaseObject>(\n id: string,\n status: BatchJobResultStatus,\n cursor?: string,\n success?: (results: BatchJobResultsResponse<TObject>) => void,\n error?: (xhr?: Xhr) => void\n ): Flight.Request {\n const params: HashObject = {\n status\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v1/batch/jobs/${id}/results`, params),\n key: `job:${id}:results:${status}:${cursor}`,\n success,\n error\n };\n },\n\n getYearGroupRolloverStatus(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/validations/customers/${customerId}/year-group-roll-over`,\n key: 'year:group:rollover:status'\n };\n },\n\n sendJobReports(ids: string[]): Flight.Request {\n return {\n url: '{gateway}/v1/batch/results/export',\n key: `send:job:reports:${ids.sort().join(':')}`,\n type: HttpVerbs.POST,\n data: {\n jobIds: ids\n }\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n }\n};","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { cloneElement } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { map } from './ElementChildren';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst ROUND_PRECISION = 1000;\n\n/**\n * Validate that children, if any, are instances of `ProgressBar`.\n */\nfunction onlyProgressBar(props, propName, componentName) {\n const children = props[propName];\n if (!children) {\n return null;\n }\n let error = null;\n React.Children.forEach(children, child => {\n if (error) {\n return;\n }\n\n /**\n * Compare types in a way that works with libraries that patch and proxy\n * components like react-hot-loader.\n *\n * see https://github.com/gaearon/react-hot-loader#checking-element-types\n */\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n const element = /*#__PURE__*/_jsx(ProgressBar, {});\n if (child.type === element.type) return;\n const childType = child.type;\n const childIdentifier = /*#__PURE__*/React.isValidElement(child) ? childType.displayName || childType.name || childType : child;\n error = new Error(`Children of ${componentName} can contain only ProgressBar ` + `components. Found ${childIdentifier}.`);\n });\n return error;\n}\nfunction getPercentage(now, min, max) {\n const percentage = (now - min) / (max - min) * 100;\n return Math.round(percentage * ROUND_PRECISION) / ROUND_PRECISION;\n}\nfunction renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n className,\n style,\n variant,\n bsPrefix,\n ...props\n}, ref) {\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...props,\n role: \"progressbar\",\n className: classNames(className, `${bsPrefix}-bar`, {\n [`bg-${variant}`]: variant,\n [`${bsPrefix}-bar-animated`]: animated,\n [`${bsPrefix}-bar-striped`]: animated || striped\n }),\n style: {\n width: `${getPercentage(now, min, max)}%`,\n ...style\n },\n \"aria-valuenow\": now,\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n children: visuallyHidden ? /*#__PURE__*/_jsx(\"span\", {\n className: \"visually-hidden\",\n children: label\n }) : label\n });\n}\nconst ProgressBar = /*#__PURE__*/React.forwardRef(({\n isChild = false,\n ...rest\n}, ref) => {\n const props = {\n min: 0,\n max: 100,\n animated: false,\n visuallyHidden: false,\n striped: false,\n ...rest\n };\n props.bsPrefix = useBootstrapPrefix(props.bsPrefix, 'progress');\n if (isChild) {\n return renderProgressBar(props, ref);\n }\n const {\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant,\n className,\n children,\n ...wrapperProps\n } = props;\n return /*#__PURE__*/_jsx(\"div\", {\n ref: ref,\n ...wrapperProps,\n className: classNames(className, bsPrefix),\n children: children ? map(children, child => /*#__PURE__*/cloneElement(child, {\n isChild: true\n })) : renderProgressBar({\n min,\n now,\n max,\n label,\n visuallyHidden,\n striped,\n animated,\n bsPrefix,\n variant\n }, ref)\n });\n});\nProgressBar.displayName = 'ProgressBar';\nexport default ProgressBar;"],"names":["namespace","BulkUserUploadBackButton","props","currentStep","AppLink","className","appLink","appLinks","userManager","Text","phrase","BulkUserUploadContinueButton","useBulkUploadUsers","duplicateSets","hasExistingUsers","WizardLayoutContext","disableNext","onClickConfirm","spreadsheetHasDuplicates","length","currentAppLink","ContextService","action","userUploadStatus","polling","complete","userUploadPopup","userUploadReviewAccounts","userUploadFixDuplicates","userUploadReviewExistingAccounts","willUploadOnNext","Button","variant","onClick","disabled","canAddExistingUsers","userUploadConfirmation","getNextAppLink","BULK_USER_UPLOAD_NAV_LOCK_ID","BulkUserUploadWizardLayout","users","setUsers","navLock","useNavLock","lock","id","title","LanguageService","text","appLinkWhitelist","BulkUserUploadHelper","onConfirmUnlock","unlock","replace","WizardHeader","loaded","continueButton","backButton","breadcrumbs","name","settings","userType","UserGroup","active","WizardStepList","steps","children","UserManagerClientContext","updateUserHash","userHash","updatedUserIdsHash","Object","keys","reduce","updatedObj","lookupId","viewModel","setViewModel","updateDuplicates","invalidUsers","hasValidatedUsers","existingUsersHash","existingUserToAdd","newUsers","filter","u","setInvalidUsers","setExistingUsers","existingUsers","updateUser","updatedUser","updatedUsers","map","user","deleteUsers","deletedUsers","userIdHash","prev","curr","showButtons","hideHeader","WizardInProgress","percentage","Math","floor","totalItemsComplete","totalItems","options","actionName","SvgContainer","svgName","actionVerb","progressVerbPhrase","objectType","MasterType","totalComplete","total","smartCount","ProgressBar","now","WizardSubmitted","POLLING_INTERVAL","MAX_CONSECUTIVE_ERROR_COUNT","WizardPolling","progress","setProgress","consecutiveErrorCount","setConsecutiveErrorCount","timeoutIdRef","dispatch","pollJob","onPollSuccess","onPollError","currentProgress","status","BatchJobStatus","window","setTimeout","navLockId","params","jobId","type","request","statusCompleteAppLink","onStatusCompleted","onCompleteJob","current","xhr","clearTimeout","currentVal","processedItems","getPhrase","WizardStepListItem","content","hideStepNumber","index","subText","isSelected","theme","isSelectedOverride","isCompleted","isCompletedOverride","item","itemContent","currentStepNumber","acc","step","i","totalSteps","itemsContainer","key","disableAppLinks","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","errorMap","BulkUserUploadStatusPollingView","value","onSuccess","onError","JobRequests","createJob","data","success","error","url","getJobs","queryParams","bulkActionTypes","userTypes","cursor","sort","order","bulkActionType","Array","isArray","dataType","join","getJob","getJobProgress","invalidationKeys","getJobResults","getYearGroupRolloverStatus","customerId","sendJobReports","ids","jobIds","getJobSummary","getPercentage","min","max","round","renderProgressBar","label","visuallyHidden","striped","animated","style","bsPrefix","ref","role","width","isChild","rest","wrapperProps","child","cloneElement","displayName"],"sourceRoot":""}