@clickview/lite 0.73.1 → 0.74.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
  3. package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
  4. package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
  7. package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
  9. package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
  11. package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
  12. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
  13. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
  15. package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
  17. package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
  19. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
  20. package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
  21. package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
  22. package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
  23. package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
  24. package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
  25. package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
  27. package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
  29. package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
  31. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
  33. package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
  34. package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
  35. package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
  36. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
  37. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
  38. package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
  39. package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
  40. package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
  41. package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
  42. package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
  43. package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
  45. package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
  47. package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
  49. package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
  51. package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
  53. package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
  55. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
  57. package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
  59. package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
  60. package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
  61. package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
  62. package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
  63. package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
  64. package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
  65. package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
  67. package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
  68. package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
  69. package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
  71. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
  73. package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
  74. package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
  75. package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
  76. package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
  77. package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
  78. package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
  79. package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
  80. package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
  81. package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
  82. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
  83. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
  84. package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
  85. package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
  86. package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
  87. package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
  88. package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
  89. package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
  90. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
  91. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
  92. package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
  93. package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
  94. package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
  95. package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
  96. package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
  97. package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
  98. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
  99. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
  100. package/dist/scripts/bundle-5b65703152.min.js +3 -0
  101. package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
  102. package/package.json +1 -1
  103. package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
  104. package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
  105. package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
  106. package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
  107. package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
  108. package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
  109. package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
  110. package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
  111. package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
  112. package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
  113. package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
  114. package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
  115. package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
  116. package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
  117. package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
  118. package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
  119. package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
  120. package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
  121. package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
  122. package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
  123. package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
  124. package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
  125. package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
  126. package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
  127. package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
  128. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
  129. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
  130. package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
  131. package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
  132. package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
  133. package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
  134. package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
  135. package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
  136. package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
  137. package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
  138. package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
  139. package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
  140. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
  141. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
  142. package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
  143. package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
  144. package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
  145. package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
  146. package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
  147. package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
  148. package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
  149. package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
  150. package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
  151. package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
  152. package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
  153. package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
  154. package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
  155. package/dist/scripts/bundle-0075afb6af.min.js +0 -3
  156. /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
  157. /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
  158. /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
  159. /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
  160. /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
  161. /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
  162. /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
  163. /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
  164. /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4499],{75097:(e,t,n)=>{n.d(t,{U:()=>c});var a=n(32735),r=n(13170);function c(e){var t=e.count,n=void 0===t?6:t;return a.createElement("div",{className:"d-flex"},a.createElement("div",{className:"d-flex ps-1"},Array(n).fill(null).map((function(e,t){return a.createElement("div",{key:t,className:"".concat(r.Z.partialButton," partial-loading-background mx-1")})}))))}},38502:(e,t,n)=>{n.d(t,{r:()=>m});var a=n(32735),r=n(49985),c=n(15611),l=n(18559),o=n(11607),s=n(83914),i=n(22771);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(s.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(l.C,{type:l.g.Count,data:e.tab.count})))}function m(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(i.Z.pillTabSelector,"\n ").concat(e.borderRadius?i.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(i.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?i.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(c.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(i.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(o.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(i.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},31647:(e,t,n)=>{n.d(t,{E:()=>o});var a=n(32735),r=n(23481),c=n(38502),l="rostering.settingHeader";function o(e){var t,n,o=[{name:r.T.getPhrase(l,"syncJobs"),appLink:null===(t=e.appLinks)||void 0===t?void 0:t.syncJobs,active:"syncJobs"===e.active},{name:r.T.getPhrase(l,"settings"),appLink:null===(n=e.appLinks)||void 0===n?void 0:n.settings,active:"settings"===e.active}];return a.createElement("div",null,a.createElement(c.r,{tabs:o}))}},18549:(e,t,n)=>{n.d(t,{G:()=>s});var a=n(32735),r=n(23481),c=n(36532);const l={rightButton:"GcqRT"};var o=r.T.encloseNamespace("rostering.syncActionButtonGroup");function s(e){return a.createElement("div",{className:"btn-group px-2",role:"group"},a.createElement(c.u,{title:o("syncNowTooltip"),spanHack:!0,placement:"left",spanHackClassName:l.buttonBorder},a.createElement("button",{type:"button",className:"btn btn-outline-dark ".concat(l.leftButton),onClick:null==e?void 0:e.onSyncNow},o("syncNow"))))}},62394:(e,t,n)=>{n.d(t,{y:()=>l});var a=n(75896),r=n(110),c=new Date,l={parseUTCToLocal:function(e){var t=e.utcHour,n=e.utcWeekdays,c=e.utcMinute,l=void 0===c?0:c,o=n.map((function(e){return r.O.buildLocalDateFromUTC(e,t,l)})),s=o.map((function(e){return e.getDay()}));return{hour:+r.O.format(a.m.first(o),"HH"),daysOfWeek:s,minute:l}},getScheduledJobBySetting:function(e){var t;if(!e||!e.fullSyncSchedule||!e.fullSyncSchedule.enabled)return null;var n=l.parseUTCToLocal({utcHour:e.fullSyncSchedule.hour,utcWeekdays:e.fullSyncSchedule.daysOfWeek,utcMinute:e.fullSyncSchedule.minute}),a=new Date,r=c.getDay(),o=n.daysOfWeek.sort((function(e,t){return e-t})),s=n.daysOfWeek.includes(r),i=n.hour,u=null!==(t=null==n?void 0:n.minute)&&void 0!==t?t:0;if(s&&(a.setHours(i,u,0,0),c<a))return a;var m=new Date,d=o.find((function(e){return e>r}));d||(d=o[0]);var p=Math.abs(d-r);return m.setDate(c.getDate()+p),m.setHours(i,0,0,0),m}}},63112:(e,t,n)=>{n.d(t,{o:()=>c});var a=n(32735),r=n(14346),c=a.memo((function(e){var t=e.tagClass,n="partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ".concat(void 0===t?"":t," ").concat(r.Z.partialTag);return a.createElement("div",{className:"mt-1"},a.createElement("span",{className:n}," "))}))},30699:(e,t,n)=>{n.d(t,{a:()=>c});var a=n(32735),r=n(16035);function c(e){var t=e.selectedItems.find((function(t){return t.id===e.data.id}))?"bg-gray-900 text-white":"bg-light";return a.createElement(r.z,{tag:e.data,appLink:e.appLink,tagClass:"no-decoration ".concat(t," lh-1"),onClick:function(){return e.onClick(e.data)}})}},14177:(e,t,n)=>{n.d(t,{$:()=>x});var a=n(32735),r=n(70680),c=n(81886),l=n(20354),o=n(79447),s=n(83914),i=n(83345),u=n(4594),m=n(76881),d=n(35223),p="userManager.wizardInProgress";function f(e){var t=Math.floor(e.totalItemsComplete/e.totalItems*100)||0;return a.createElement("div",null,a.createElement("div",{className:"d-flex align-items-center mb-2"},a.createElement("h2",{className:"h5 mb-0"},a.createElement(i.x,{namespace:p,phrase:"heading",options:{percentage:t,actionName:e.actionName}})),a.createElement(s.x,{svgName:d.vn.CheckCircle})),a.createElement("p",null,a.createElement(i.x,{namespace:p,phrase:"info".concat(e.actionVerb)})),a.createElement("p",{className:"mb-1"},a.createElement("span",{className:"text-info"},e.progressVerbPhrase?a.createElement("span",null,e.progressVerbPhrase):a.createElement(i.x,{namespace:p,phrase:"progressVerb".concat(e.actionVerb)}))," ",e.objectType===u.E.User&&e.userType?a.createElement(i.x,{namespace:p,phrase:e.userType===m.Y.Learner?"progressStudents":"progressStaff",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):e.objectType===u.E.Video?a.createElement(i.x,{namespace:p,phrase:"progressVideos",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}}):a.createElement(i.x,{namespace:p,phrase:"progressItems",options:{totalComplete:e.totalItemsComplete,total:e.totalItems,smartCount:e.totalItems}})),a.createElement(o.Z,{variant:"info",now:t}))}var g="userManager.wizardSubmitted";function b(e){return a.createElement("div",null,a.createElement("div",{className:"d-flex align-items-center mb-2"},a.createElement("h2",{className:"h5 mb-0"},e.actionName?a.createElement(i.x,{namespace:g,phrase:"heading",options:{actionName:e.actionName}}):a.createElement(i.x,{namespace:g,phrase:"headingGeneric"})),a.createElement(s.x,{svgName:d.vn.CheckCircle})),a.createElement("p",null,a.createElement(i.x,{namespace:g,phrase:"info".concat(e.actionVerb)})),a.createElement("p",{className:"mb-1 text-info"},a.createElement(i.x,{namespace:g,phrase:"preparing"})),a.createElement(o.Z,{variant:"info",now:0}))}var v=n(58739),y=n(94644),E=n(89476);function h(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,l,o=[],s=!0,i=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=c.call(n)).done)&&(o.push(a.value),o.length!==t);s=!0);}catch(e){i=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(i)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return N(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?N(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 N(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var S=2e3,C=3;function x(e){var t=h(a.useState(null),2),n=t[0],o=t[1],s=h(a.useState(0),2),i=s[0],u=s[1],m=a.useRef(null),d=(0,E.f)(),p=(0,r.I0)();function g(){e.pollJob(N,x)}function N(t){o(t),t.status===v.K.Completed||t.status===v.K.CompletedWithError||t.status===v.K.Failed?window.setTimeout((function(){!function(){var t;e.navLockId&&d.unlock(e.navLockId);var n={jobId:e.jobId};e.userType&&(n.userType=e.userType,p({type:l.a.Actions.INVALIDATE,keys:["school:users","user:count","search:aggregation","search:users"],request:null})),e.statusCompleteAppLink?c.Q.C$.trigger(Object.assign(Object.assign({},e.statusCompleteAppLink),{params:n})):null===(t=e.onStatusCompleted)||void 0===t||t.call(e)}()}),2e3):m.current=window.setTimeout(g,S)}function x(t){i===C&&(window.clearTimeout(m.current),e.navLockId&&d.unlock(e.navLockId),(0,y.r)(t)),u((function(e){return e+1})),m.current=window.setTimeout(g,S)}return a.useEffect((function(){return g(),function(){m.current&&window.clearTimeout(m.current)}}),[]),n&&n.status!==v.K.Submitted&&n.status!==v.K.Queued&&n.status!==v.K.Pending&&0!==n.totalItems?a.createElement(f,{totalItems:n.totalItems,totalItemsComplete:n.processedItems,userType:e.userType,objectType:e.objectType,actionName:e.actionName,actionVerb:e.actionVerb,progressVerbPhrase:e.progressVerbPhrase}):a.createElement(b,{actionName:e.actionName,actionVerb:e.actionVerb})}},44538:(e,t,n)=>{n.d(t,{K:()=>o});var a=n(99940),r=n(97395),c=n(58739),l=n(38389),o={getRostering:function(){return{url:"{gateway}/v1/users/me/rostering",key:"rostering"}},getSyncList:function(e){var t={};if(e.cursor&&(t.cursor=e.cursor),e.sort&&("oldest"===e.sort?t.order="ASC":t.order="DESC"),e.jobStatus){var n=[];e.jobStatus.includes("completed")&&n.push.apply(n,[c.K.Completed,c.K.CompletedWithError]),e.jobStatus.includes("failed")&&n.push(c.K.Failed),e.jobStatus.includes("inProgress")&&n.push.apply(n,[c.K.Submitted,c.K.Queued,c.K.Pending,c.K.InProgress]),t.status=n}return t.type=l.m.Rostering,{url:r._.urlBuilder("{gateway}/v1/batch/jobs",t),key:"rostering:sync:".concat(e.cursor,":").concat(e.sort,":").concat(e.jobStatus)}},createJob:function(e,t,n){return{url:"{gateway}/v1/batch/jobs",key:"rostering:sync",type:a.k.POST,invalidationKeys:["rostering:sync"],data:e,success:t,error:n}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}},getSyncScheduleSettings:function(e){return{url:"{gateway}/v1/rostering/".concat(e,"/schedule"),key:"sync-settings:".concat(e)}},updateScheduleSetting:function(e,t,n,r,c){return{type:a.k.PUT,url:"{gateway}/v1/rostering/".concat(t,"/schedule"),key:"update:sync-settings:".concat(e.customerId,":").concat(t),invalidationKeys:["sync-settings:".concat(t)],data:e,success:n,error:r,always:c}}}},299:(e,t,n)=>{n.d(t,{X:()=>l});var a=n(32735),r=n(69217),c=n(94631),l=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.idField,l=void 0===n?"id":n,o=t.persistNamespace,s=t.initialState?t.initialState:new Map,i=a.useRef(s),u=(0,r.N)(),m=(0,c.D)(e),d=(0,c.D)(o);function p(){i.current.clear(),u()}function f(e){return"number"==typeof e?e=e.toString():"string"!=typeof e&&(e=e[l].toString()),i.current.get(e)}function g(){return!!(null==e?void 0:e.length)&&e.every(f)}function b(e){e.forEach((function(e){i.current.set(e,!0)})),u()}return a.useEffect((function(){t.initialState||o&&d===o||(null==m?void 0:m.map((function(e){return e[l]})).join())!==(null==e?void 0:e.map((function(e){return e[l]})).join())&&p()}),[m,d,e,t.initialState]),a.useEffect((function(){var e;(null===(e=t.preselectedIds)||void 0===e?void 0:e.length)&&b(t.preselectedIds)}),[]),{onToggleBulk:function(){var t=!g();e.forEach((function(e){t?i.current.set(e[l].toString(),!0):i.current.delete(e[l].toString())})),u()},onToggleItem:function(e){var t=!i.current.get(e.toString());t?i.current.set(e.toString(),t):i.current.delete(e.toString()),u()},getSelected:function(){return Array.from(i.current.keys())},isChecked:f,bulkChecked:g(),deselectAll:function(){(null==e?void 0:e.length)&&(e.forEach((function(e){i.current.delete(e[l].toString())})),u())},hasSomeSelections:function(){return!!(null==e?void 0:e.length)&&!!e.find((function(e){return f(e)}))},setSelected:b,getSelectedCount:function(){return i.current.size},reset:p,getMap:function(){return i.current}}}},93322:(e,t,n)=>{n.d(t,{F:()=>c});var a=n(32735),r=n(13126);function c(){a.useEffect((function(){return r.e.lockContentWidth(),function(){return r.e.unlockContentWidth()}}),[])}},81803:(e,t,n)=>{n.d(t,{d:()=>f});var a=n(32735),r=n(81886),c=n(23481),l=n(49935),o=n(22902),s=n(14070),i=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var d="settings.settingsLayout",p=function(e){var t=(0,o.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var a=r.Q.C$.getCurrentAppLink();return a.application!==i.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===a.action}))}))};function f(e){var t,n=p(e.requiredPermissions);if(a.useEffect((function(){n||r.Q.C$.trigger({application:i.O.SETTINGS,action:s.e.Settings.HOME},{replace:!0})}),[n]),!n)return a.createElement(a.Fragment,null);var o,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:i.O.SETTINGS,action:s.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"d-flex align-items-center justify-content-between"},a.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),a.createElement("div",{className:"pb-3"},a.createElement(l.Oo,{breadcrumbs:[{name:c.T.getPhrase(d,"settingsBreadcrumb"),appLink:{application:i.O.SETTINGS,action:s.e.Settings.HOME}}].concat((o=u,function(e){if(Array.isArray(e))return m(e)}(o)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(o)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(o)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&a.createElement(a.Fragment,null,a.createElement("p",null,e.description),a.createElement("hr",null)),e.children)}},60251:(e,t,n)=>{n.r(t),n.d(t,{RosteringSyncListView:()=>Fe});var a=n(32735),r=n(70680),c=n(23481),l=n(20354),o=n(75097),s=n(49935);const i={partialHeading:"MwUCZ",partialJobCount:"MUELm",partialCheckbox:"dShe9",partialExportButton:"VL4Tq",row:"z_hGc",checkboxColumn:"IacDe",actionColumn:"_JoZe",usersColumn:"BtHPO",dateColumn:"jpr0N",performedByColumn:"XP4Lf",seeMoreColumn:"A8_Nf",heading:"uThGf",action:"PFOGb",users:"pXZx8",date:"VWS_a",performedBy:"vZeC9"};function u(){return a.createElement("div",{className:"d-flex striped-row rounded py-3 ".concat(i.row)},a.createElement("div",{className:"".concat(i.checkboxColumn," d-flex justify-content-center")},a.createElement("div",{className:"partial-loading-background ".concat(i.partialCheckbox," ms-0")})),a.createElement("div",{className:"".concat(i.actionColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.action)})),a.createElement("div",{className:"".concat(i.usersColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.users)})),a.createElement("div",{className:"".concat(i.dateColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.date)})),a.createElement("div",{className:"".concat(i.performedByColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.performedBy)})),a.createElement("div",{className:"".concat(i.seeMoreColumn)}," "))}function m(){return a.createElement("div",{className:"d-flex py-2 mb-1"},a.createElement("div",{className:"".concat(i.checkboxColumn)}," "),a.createElement("div",{className:"".concat(i.actionColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.heading)})),a.createElement("div",{className:"".concat(i.usersColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.heading)})),a.createElement("div",{className:"".concat(i.dateColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.heading)})),a.createElement("div",{className:"".concat(i.performedByColumn)},a.createElement("div",{className:"partial-loading-background ".concat(i.heading)})),a.createElement("div",{className:"".concat(i.seeMoreColumn)}," "))}function d(){return a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-3 mt-n1"},a.createElement(m,null),a.createElement("div",{className:"striped-list no-full-width"},a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null),a.createElement(u,null))))}function p(){return a.createElement(a.Fragment,null,a.createElement("div",{className:"partial-loading-background mb-2 ".concat(i.partialHeading)}),a.createElement("div",{className:"pb-3"},a.createElement("div",{className:"d-flex justify-content-between"},a.createElement(s.b2,null),a.createElement("div",{className:"partial-loading-background ".concat(i.partialJobCount)}))),a.createElement("div",{className:"d-flex align-items-center pb-2"},a.createElement("div",{className:"partial-loading-background ".concat(i.partialCheckbox)}),a.createElement("div",{className:"ms-4 ps-3"},a.createElement(o.U,{count:3})),a.createElement("div",{className:"ms-auto partial-loading-background ".concat(i.partialExportButton)})),a.createElement(d,null))}var f=n(31647),g=n(110),b=n(58739);const v={complete:"nAOdH",failed:"xkFpC",inProgress:"BjR3y",scheduled:"Ux2b9"};var y=c.T.encloseNamespace("rostering.syncJobsStatusBadge");function E(e){return a.createElement("div",{className:function(){var t="rounded-pill px-2 d-inline-flex align-items-center fw-semibold";switch(e.status){case b.K.Completed:case b.K.CompletedWithError:return"".concat(t," ").concat(v.complete);case b.K.Failed:return"".concat(t," ").concat(v.failed);case b.K.InProgress:case b.K.Pending:case b.K.Queued:case b.K.Submitted:return"".concat(t," ").concat(v.inProgress);case"scheduled":return"".concat(t," ").concat(v.scheduled)}}()},function(){switch(e.status){case b.K.Completed:case b.K.CompletedWithError:return y("complete");case b.K.Failed:return y("failed");case b.K.InProgress:case b.K.Pending:case b.K.Queued:case b.K.Submitted:return y("inProgress");case"scheduled":return y("scheduled")}}())}var h=n(83914),N=n(35223);const S={colored:"MLlUi",avatar:"Z1jn_",logoWrapper:"OAeff",cog:"I7V_R",checkboxPlaceholder:"LTmrp",source:"zYMOT",date:"mnJQP",status:"Pm1Aa",performedBy:"oy6Vm",placeholder:"o0RDO"};var C=c.T.encloseNamespace("rostering.scheduledSyncJobItem");function x(e){return a.createElement("div",{className:S.colored},a.createElement("div",{className:"px-4 py-3 d-flex align-items-center"},a.createElement("div",{className:S.checkboxPlaceholder}),a.createElement("div",{className:"".concat(S.source," px-2")}),a.createElement("div",{className:"".concat(S.date," px-2")},g.O.format(e.scheduledDate,"DD/MM/YYYY, hh:mmA")),a.createElement("div",{className:"".concat(S.status," px-2")},a.createElement(E,{status:"scheduled"})),a.createElement("div",{className:"".concat(S.performedBy," px-2 d-flex align-items-center")},a.createElement("div",{className:"".concat(S.cog," me-2 rounded-circle text-white bg-dark d-flex align-items-center justify-content-center")},a.createElement(h.x,{svgName:N.vn.Cog,className:"svg-container"})),C("performedBy")),a.createElement("div",{className:"cursor-pointer d-flex justify-content-end ".concat(S.placeholder)})))}var k=n(18549),w=n(56050),I=n(70848),T=n(97408),j={getCellStyle:function(e){return{width:e,flex:"".concat(e," 0 auto")}}},P=n(89965);const A={colored:"aU1VO",seeMore:"Nfc8Q"};function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var L=c.T.encloseNamespace("shared.bulkJobsAccordionItem");function K(e){var t,n,r=(t=a.useState(!!e.forceExpand&&e.forceExpand(e.job)),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,l,o=[],s=!0,i=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=c.call(n)).done)&&(o.push(a.value),o.length!==t);s=!0);}catch(e){i=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(i)throw r}}return o}}(t,n)||function(e,t){if(e){if("string"==typeof e)return O(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?O(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=r[0],l=r[1],o=!!e.disableExpand&&e.disableExpand(e.job);return a.createElement("div",{className:"".concat(A.colored," ").concat(o?"":"cursor-pointer"),onClick:function(){o||l((function(e){return!e}))}},a.createElement("div",{className:"p-4 d-flex align-items-center"},a.createElement("div",{style:j.getCellStyle(60),onClick:function(e){return e.stopPropagation()}},a.createElement(P.X,{id:e.job.id,checked:e.isChecked(e.job.id),onChange:function(){return e.onToggleCheckbox(e.job.id)}})),e.columns.map((function(t){var n=t.render,r=t.renderClassName,c=t.width,l=t.id;return a.createElement("div",{className:"".concat(null!=r?r:""),key:l,style:j.getCellStyle(c)},n(e.job))})),a.createElement("div",{className:"d-flex justify-content-end ".concat(o?"":"cursor-pointer"),style:j.getCellStyle(200)},!o&&a.createElement("div",{className:"".concat(A.seeMore," text-info")},L(c?"seeLess":"seeMore")))),c&&a.createElement("div",{className:"bg-white border-bottom cursor-default",onClick:function(e){return e.stopPropagation()}},e.jobDetailsComponent(e.job)))}var J=n(10638);function B(e){return a.createElement(J.J,{queryParams:e.queryParams,mainFilters:e.filters,appLink:e.appLink,analyticsOptions:e.analyticsOptions,hideHeading:!0,hideDivider:!0,constantIndices:[]})}var R=n(37395),F=n(2102),M=n(83345),H=n(69883),U=n(299),D=n(75795);const V={bulkCheckbox:"XeoQi"};function W(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var G="shared.bulkJobsAccordions",Z=c.T.encloseNamespace(G);function q(e){var t,n,r,c=(n=a.useState(!1),r=2,function(e){if(Array.isArray(e))return e}(n)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,l,o=[],s=!0,i=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=c.call(n)).done)&&(o.push(a.value),o.length!==t);s=!0);}catch(e){i=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(i)throw r}}return o}}(n,r)||function(e,t){if(e){if("string"==typeof e)return W(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?W(e,t):void 0}}(n,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.")}()),l=c[0],o=c[1],s=(0,U.X)(e.jobs.data),i=(0,H.Z)();return a.createElement("div",{className:"".concat(V.container," pe-3")},a.createElement("div",{className:"d-flex align-items-center pb-2 mt-3"},a.createElement(P.X,{className:V.bulkCheckbox,id:"bulk-audit-log-checkbox",checked:s.bulkChecked,onChange:s.onToggleBulk,indeterminate:s.hasSomeSelections()}),a.createElement("div",{className:"ms-4"},a.createElement(B,{queryParams:e.queryParams,appLink:e.appLink,filters:e.filters})),a.createElement(F.m,{variant:"dark",className:"ms-auto",onClick:function(){if(!l){o(!0);var t=s.getSelected();e.onClickExport(t).then((function(){return i.success(Z("exportSuccess"))})).catch((function(){return i.error(Z("exportError"))})).finally((function(){return o(!1)}))}},disabled:!s.hasSomeSelections()||l,showSpinner:l},a.createElement(M.x,{namespace:G,phrase:"export"}))),a.createElement("div",{className:"d-flex no-wrap mb-2 fw-semibold px-4 py-2"},a.createElement("div",{style:j.getCellStyle(60)}),e.columns.map((function(e){var t=e.id,n=e.header,r=e.headerClassName,c=e.width;return a.createElement("div",{key:t,className:r,style:j.getCellStyle(c)},n)})),a.createElement("div",{style:j.getCellStyle(200)})),!!e.pinnedComponent&&e.pinnedComponent(),!!e.jobs.data.length&&e.jobs.data.map((function(t){return a.createElement(K,{key:t.id,job:t,onToggleCheckbox:s.onToggleItem,isChecked:s.isChecked,jobDetailsComponent:e.jobDetailsComponent,onClickExport:e.onClickExport,imageCdnUrl:e.imageCdnUrl,onPollJob:e.onPollJob,columns:e.columns,forceExpand:e.forceExpand,disableExpand:e.disableExpand})})),!!(null===(t=e.jobs.pagination)||void 0===t?void 0:t.cursors)&&a.createElement(R.t,{className:"p-0 text-end pb-3 mt-3",cursors:e.jobs.pagination.cursors,appLink:D.O.getCurrentRoute().appLink,buttonVariant:"outline-dark"}))}var _=n(97392),$=n(91693),Q=n(80247),Y=n(14177);function z(e){return e.jobId?a.createElement("div",null,a.createElement("div",{className:"mb-4"},a.createElement(Y.$,{jobId:e.jobId,pollJob:e.onPollJob(e.jobId),onStatusCompleted:e.onCompleted,actionName:"Sync",actionVerb:"Update",progressVerbPhrase:c.T.getPhrase("rostering.syncJobPolling","progressVerb")}))):a.createElement("div",{className:"text-center"},a.createElement(Q.Z,{as:"div",animation:"border",role:"status"}))}const X={failed:"BSIaY",tag:"NOJhh"};function ee(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,l,o=[],s=!0,i=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=c.call(n)).done)&&(o.push(a.value),o.length!==t);s=!0);}catch(e){i=!0,r=e}finally{try{if(!s&&null!=n.return&&(l=n.return(),Object(l)!==l))return}finally{if(i)throw r}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?te(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var ne="rostering.syncJobSummary";function ae(e){var t=ee(a.useState(null),2),n=t[0],r=t[1],c=ee(a.useState(!1),2),l=c[0],o=c[1];function s(e){var t="",r="";switch(e){case"staff":t="bg-navy",r=N.vn.Staff;break;case"learners":t="bg-blue",r=N.vn.GraduationCap;break;case"classrooms":t="bg-teal",r=N.vn.Classrooms}var c=Object.keys(n[e]).filter((function(e){return"totalProcessed"!==e&&"totalSucceeded"!==e}));return a.createElement("div",{className:"col"},a.createElement("div",{className:"py-3 ps-2 pe-3 rounded border"},a.createElement("div",{className:"d-flex align-items-center px-2 mb-2"},a.createElement("div",{className:"".concat(t," ").concat(X.badge," d-flex align-items-center rounded-circle text-white ps-0 me-2")},a.createElement(h.x,{className:"svg-container ".concat(X.svg),size:h.S.Standard,svgName:r})),a.createElement(M.x,{namespace:ne,phrase:e})),a.createElement("ul",{className:"mb-0"},null==c?void 0:c.map((function(t){return a.createElement("li",{className:"mb-2",key:t},a.createElement("div",{className:"d-flex"},a.createElement("div",{className:"rounded-pill me-2 px-2 d-inline-flex align-items-center fw-semibold ".concat("errored"===t?X.failed:X.tag)},n[e][t]),a.createElement(M.x,{namespace:ne,phrase:t})))})))))}return a.useEffect((function(){n||(o(!0),e.getJobSummary(e.job.id).then((function(e){r(e)})).finally((function(){o(!1)})))}),[e.job.id]),a.createElement(a.Fragment,null,l&&!n&&a.createElement("div",{className:"text-center py-3"},a.createElement(Q.Z,{as:"div",animation:"border",role:"status"})),!!n&&a.createElement("div",{className:"row gx-3 mt-2"},s("staff"),s("learners"),s("classrooms")))}var re=c.T.encloseNamespace("rostering.syncJobDetails");function ce(e){var t=e.job.status===b.K.Completed||e.job.status===b.K.CompletedWithError,n=(0,H.Z)();return a.createElement("div",{className:"py-3 px-4"},a.createElement("div",{className:"d-flex justify-content-between"},e.job.status!==b.K.InProgress&&a.createElement("h1",{className:"h4"},re("heading")),t&&a.createElement($.h,{className:"btn btn-outline-dark fw-semibold",svgName:N.vn.Download,onClick:function(){e.onClickExport([e.job.id]).then((function(){n.success(re("exportSuccess"))})).catch((function(){n.error(re("exportError"))}))}},re("export"))),function(){switch(e.job.status){case b.K.InProgress:case b.K.Pending:case b.K.Queued:case b.K.Submitted:return a.createElement(z,{jobId:e.job.id,onCompleted:e.onCompleted,onPollJob:e.onPollJob});case b.K.Failed:return a.createElement(a.Fragment,null);case b.K.Completed:case b.K.CompletedWithError:return a.createElement(ae,{job:e.job,getJobSummary:e.getJobSummary});default:return a.createElement(a.Fragment,null)}}())}var le=n(86794),oe=n(36532),se=n(55171),ie=n(64818);const ue={avatar:"B8miR",logoWrapper:"higtD",cog:"bNPxa"};var me="rostering.syncJobsAccordion",de=c.T.encloseNamespace(me),pe=[b.K.InProgress,b.K.Pending,b.K.Queued,b.K.Submitted];function fe(e){var t=[I.x$.SortBy([{id:"newest",name:c.T.getPhrase(me,"newest"),default:!0},{id:"oldest",name:c.T.getPhrase(me,"oldest")}]),I.x$.JobStatus()],n=[{id:"id",header:de("syncFrom"),headerClassName:"px-2 py-1",renderClassName:"px-2",render:function(e){var t,n=null===(t=e.metadata)||void 0===t?void 0:t.source;if(!n)return a.createElement(a.Fragment,null);var r=se.e.Rostering.sources[n];if(!r)throw new w.H("Unsupported rostering sync source, please add it to HardCoded rostering source");return a.createElement("div",{className:"bg-white rounded-circle border ".concat(ue.logoWrapper," d-flex align-items-center justify-content-center")},a.createElement(oe.u,{spanHack:!0,title:r.name},a.createElement("img",{src:r.iconUrl,alt:r.name})))},width:120},{id:"dateCreated",header:de("date"),headerClassName:"px-2 py-1",renderClassName:"px-2",render:function(e){return g.O.format(e.dateCreated,"DD/MM/YYYY, hh:mmA")},width:220},{id:"status",header:de("status"),headerClassName:"px-2 py-1",renderClassName:"px-2",render:function(e){return a.createElement(E,{status:e.status})},width:200},{id:"submitterName",header:de("performedBy"),headerClassName:"px-2",renderClassName:"px-2",render:function(t){return function(e,t){return e.submittedByClickView?a.createElement("div",{className:"d-flex align-items-center"},a.createElement(le.b,{className:"me-2 rounded-circle border",size:h.S.Large},a.createElement(_.F,null)),e.submitterName):e.submitterName?a.createElement("div",{className:"d-flex align-items-center"},a.createElement("div",{className:"me-2 ".concat(ue.avatar)},a.createElement(T.q,{imageCdnUrl:t.imageCdnUrl,initials:ie.l.getInitials(e.submitterName.split(" ")[0],e.submitterName.split(" ")[1])})),e.submitterName):a.createElement("div",{className:"me-2 d-flex align-items-center"},a.createElement("div",{className:"".concat(ue.cog," me-2 rounded-circle text-white bg-dark d-flex align-items-center justify-content-center")},a.createElement(h.x,{svgName:N.vn.Cog,className:"svg-container"})),de("scheduledSubmitter"))}(t,e)},width:200}];return a.createElement(q,Object.assign({},e,{filters:t,jobDetailsComponent:function(t){return a.createElement(ce,{job:t,getJobSummary:e.getJobSummary,onPollJob:e.onPollJob,onClickExport:e.onClickExport,onCompleted:e.onCompleted})},columns:n,forceExpand:function(e){return pe.includes(e.status)},disableExpand:function(e){return e.status===b.K.Failed}}))}var ge=n(62394),be=n(16714),ve=n(39151),ye=n(44538),Ee=n(31949),he=n(93322),Ne=n(79612),Se=n(14070),Ce=n(97291),xe=n(29613),ke=n(81803),we=n(97958),Ie=n(99742),Te="rostering.districtRosterEmptyState";function je(){return a.createElement(we.u,null,a.createElement(we.u.Image,{src:Ie.W.EmptyStates.Rostering.DISTRICT_ROSTERING}),a.createElement(we.u.Heading,null,a.createElement(M.x,{namespace:Te,phrase:"emptyHeading"})),a.createElement(we.u.Info,{className:"w-50 mb-2"},a.createElement(M.x,{namespace:Te,phrase:"emptyInfo"})),a.createElement(we.u.Info,{className:"w-50 mb-1 fw-semibold"},a.createElement(M.x,{namespace:Te,phrase:"strongInfo"})))}var Pe="rostering.noResults";function Ae(){return a.createElement(we.u,null,a.createElement(we.u.Image,{src:Ie.W.EmptyStates.Rostering.EMPTY_RESULTS}),a.createElement(we.u.Heading,null,a.createElement(M.x,{namespace:Pe,phrase:"emptyHeading"})),a.createElement(we.u.Info,{className:"w-50 mb-1"},a.createElement(M.x,{namespace:Pe,phrase:"emptyInfo"})))}var Oe="rostering.noSyncJobs",Le=c.T.encloseNamespace(Oe);function Ke(e){return a.createElement(we.u,null,a.createElement(we.u.Image,{src:Ie.W.EmptyStates.Rostering.NO_SYNC_JOBS}),a.createElement(we.u.Heading,null,a.createElement(M.x,{namespace:Oe,phrase:"emptyHeading"})),a.createElement(we.u.Info,{className:"w-50 mb-3"},a.createElement(M.x,{namespace:Oe,phrase:"emptyInfo"})),a.createElement(we.u.Cta,{className:"btn btn-dark",onClick:e.onStartFullSync,text:Le("emptyCta")}))}var Je=n(52834),Be=n(56736),Re=c.T.encloseNamespace("rostering.syncList");function Fe(e){var t,n=l.a.useBasicFetch(ye.K.getSyncList(e.queryParams)),c=l.a.useBasicFetch(ve.L.config()),o=l.a.useBasicFetch(Ee.N.currentUser()),s=l.a.useBasicFetch(ye.K.getRostering()),i=l.a.useBasicFetch(o.data&&s.data&&ye.K.getSyncScheduleSettings(s.data.id)),u=n.hasCompleted&&c.hasCompleted&&i.hasCompleted&&s.hasCompleted;(0,he.F)();var m=l.a.useGetFetchAsync(),d=(0,r.I0)();function g(e){return m(ye.K.getJobSummary(e))}function b(e){return function(t,n){return m(xe.q.getJobProgress(e,t,n))}}function v(){d({type:l.a.Actions.INVALIDATE,keys:["rostering:sync"],request:null})}function y(e){return m(xe.q.sendJobReports(e))}(0,Ne.M)({title:Re("pageTitle")});var E=u&&"Active"===(null===(t=s.data)||void 0===t?void 0:t.status),h=(0,Be.B)(o.data),N=h.syncNow,S=h.fullSync;return a.createElement(ke.d,{heading:Re("heading"),breadcrumbs:[Re("breadcrumb")],headingButton:function(){return E?a.createElement(k.G,{onSyncNow:N,onFullSync:S}):a.createElement(a.Fragment,null)},requiredPermissions:be.C.Rostering},E&&a.createElement(f.E,{active:"syncJobs",appLinks:{syncJobs:{application:Ce.O.SETTINGS,action:Se.e.Settings.ROSTERING},settings:{application:Ce.O.SETTINGS,action:Se.e.Settings.ROSTERING_SETTINGS}}}),function(){var t,r;if("Managed"===(null===(t=s.data)||void 0===t?void 0:t.status))return a.createElement(je,null);if("None"===(null===(r=s.data)||void 0===r?void 0:r.status))return a.createElement(Je.y,null);if(!u)return a.createElement(p,null);if(!n.data.data.length&&!e.queryParams)return a.createElement(Ke,{onStartFullSync:N});var l=ge.y.getScheduledJobBySetting(i.data);return a.createElement(a.Fragment,null,a.createElement(fe,{jobs:n.data,queryParams:e.queryParams,appLink:{application:Ce.O.SETTINGS,action:Se.e.Settings.ROSTERING},onClickExport:y,getJobSummary:g,imageCdnUrl:c.data.imageCdnUrl,onPollJob:b,onCompleted:v,pinnedComponent:l?function(){return a.createElement(x,{scheduledDate:l})}:null}),!n.data.data.length&&e.queryParams&&a.createElement(Ae,null))}())}},52834:(e,t,n)=>{n.d(t,{y:()=>u});var a=n(32735),r=n(97958),c=n(98461),l=n(83345),o=n(12778),s=n(99742),i="rostering.requiresSetUp";function u(){return a.createElement(r.u,null,a.createElement(r.u.Image,{src:s.W.EmptyStates.Rostering.REQUIRES_SET_UP}),a.createElement(r.u.Heading,null,a.createElement(l.x,{namespace:i,phrase:"emptyHeading"})),a.createElement(r.u.Info,{className:"w-50 mb-3"},a.createElement(l.x,{namespace:i,phrase:"emptyInfo"})),a.createElement(c.d,{className:"btn btn-dark",href:o.o.getSupportRequestUrl(),newTab:!0},a.createElement(l.x,{namespace:i,phrase:"button"})))}},56736:(e,t,n)=>{n.d(t,{B:()=>p});var a=n(60139),r=n(23481),c=n(20354),l=n(67651),o=n(72081),s=n(38389),i=n(4594),u=n(44538),m=n(69883),d=r.T.encloseNamespace("rostering.syncUtils"),p=function(e){var t=c.a.useGetFetchAsync(),n=(0,m.Z)();return e?{fullSync:function(){},syncNow:function(){var r={type:a.NK.Success,heading:d("startSyncAlertHeading"),message:d("startSyncAlertBody"),appLinkText:d("startSyncAlertAppLinkText"),appLinkClassName:"info-link"},c={name:o.g.Rostering,type:s.m.Rostering,metadata:{targetMasterId:e.customerId,targetMasterType:i.E.Customer},customerId:e.customerId,dataType:l.B.Learner};t(u.K.createJob(c,(function(){n.success(r)}),(function(){n.error(d("error"))})))}}:{syncNow:function(){},fullSync:function(){}}}},22771:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}},79447:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(95685),r=n.n(a),c=n(32735),l=n(46304),o=n(58661),s=n(74512);function i(e,t,n){const a=(e-t)/(n-t)*100;return Math.round(1e3*a)/1e3}function u({min:e,now:t,max:n,label:a,visuallyHidden:c,striped:l,animated:o,className:u,style:m,variant:d,bsPrefix:p,...f},g){return(0,s.jsx)("div",{ref:g,...f,role:"progressbar",className:r()(u,`${p}-bar`,{[`bg-${d}`]:d,[`${p}-bar-animated`]:o,[`${p}-bar-striped`]:o||l}),style:{width:`${i(t,e,n)}%`,...m},"aria-valuenow":t,"aria-valuemin":e,"aria-valuemax":n,children:c?(0,s.jsx)("span",{className:"visually-hidden",children:a}):a})}const m=c.forwardRef((({isChild:e=!1,...t},n)=>{const a={min:0,max:100,animated:!1,visuallyHidden:!1,striped:!1,...t};if(a.bsPrefix=(0,l.vE)(a.bsPrefix,"progress"),e)return u(a,n);const{min:i,now:m,max:d,label:p,visuallyHidden:f,striped:g,animated:b,bsPrefix:v,variant:y,className:E,children:h,...N}=a;return(0,s.jsx)("div",{ref:n,...N,className:r()(E,v),children:h?(0,o.UI)(h,(e=>(0,c.cloneElement)(e,{isChild:!0}))):u({min:i,now:m,max:d,label:p,visuallyHidden:f,striped:g,animated:b,bsPrefix:v,variant:y},n)})}));m.displayName="ProgressBar";const d=m}}]);
2
- //# sourceMappingURL=4499-1365934bf2-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4499-1365934bf2-lite.chunk.js","mappings":"8JAQM,SAAUA,EAAqB,GAAwC,QAAtCC,MAAAA,OAAK,IAAG,IAAC,EAC9C,OACE,uBAAKC,UAAU,UACb,uBAAKA,UAAU,eACZC,MAAMF,GAAOG,KAAK,MAAMC,KAAI,SAACC,EAAMC,GAAK,OACvC,uBAAKC,IAAKD,EAAOL,UAAS,UAAK,kBAAoB,qCAAsC,KAKnG,C,oHCEA,SAASO,EAAYC,GACnB,OACE,kCACKA,EAAMC,IAAIC,SACX,uBAAKV,UAAWQ,EAAMC,IAAIE,KAAO,OAAS,IACxC,gBAAC,IAAY,CAACD,QAASF,EAAMC,IAAIC,WAIpCF,EAAMC,IAAIE,KAEmB,iBAArBH,EAAMC,IAAIV,OACjB,uBAAKC,UAAU,QACb,gBAAC,IAAK,CAACY,KAAM,UAAiBC,KAAML,EAAMC,IAAIV,SAKxD,CA8BM,SAAUe,EAAgBN,G,MAW9B,OACE,uBAAKR,UAA0B,QAAf,EAAAQ,EAAMR,iBAAS,QAAI,GAAIe,IAAKP,EAAMQ,cAChD,sBAAIhB,UAAS,qDACwB,oBAAsB,qBACvDQ,EAAMS,aAAe,gBAAqB,GAAE,qBAC5CT,EAAMU,cAAa,aAEpBV,EAAMW,KAAKhB,KAAI,SAACM,EAAKJ,GACpB,OACE,sBACEL,UAAS,gCACD,QAAU,YAAIS,EAAIW,OAAS,eAAiB,uBAAsB,6BACtEX,EAAIE,KAAO,aAAkB,GAAE,YAAIF,EAAIT,UAAS,oBAEpDM,IAAKD,GAEJI,EAAIY,QACH,gBAAC,IAAO,CACNA,QAASZ,EAAIY,QACbC,cAAeb,EAAIa,cACnBC,iBAAkBd,EAAIc,iBACtBvB,UAAS,sKAE4C,YAAc,yBAGnE,gBAACO,EAAW,CAACE,IAAKA,KAGpB,gBAAC,IAAS,CACRT,UAAS,sKAE4C,YAAc,wBAEnEwB,QAAS,WAAF,OA5CvB,SAAqBf,IACfA,EAAIW,QAAWX,EAAIgB,WAGvBhB,EAAIgB,WAEAhB,EAAIa,eAAiBb,EAAIc,kBAC3B,kBAA8Bd,EAAIa,cAAeb,EAAIc,kBACzD,CAoC+BG,CAAYjB,EAAI,GAE/B,gBAACF,EAAW,CAACE,IAAKA,KAK5B,KAIR,CA5DAK,EAAgBa,aAAe,CAC7BV,aAAc,K,wEC1DVW,EAAY,0BAYZ,SAAUC,EAAuBrB,G,QAC/BW,EAAO,CAAC,CACZR,KAAM,cAA0BiB,EAAW,YAC3CP,QAAuB,QAAd,EAAAb,EAAMsB,gBAAQ,eAAEC,SACzBX,OAAyB,aAAjBZ,EAAMY,QAEb,CACDT,KAAM,cAA0BiB,EAAW,YAC3CP,QAAuB,QAAd,EAAAb,EAAMsB,gBAAQ,eAAEE,SACzBZ,OAAyB,aAAjBZ,EAAMY,SAIhB,OACE,2BACE,gBAAC,IAAe,CAACD,KAAMA,IAG7B,C,wECpCA,SAAgB,YAAc,SCO9B,IACMc,EAAYC,EAAA,mBADA,mCAQZ,SAAUC,EAAsB3B,GACpC,OACE,uBAAKR,UAAU,iBAAiBoC,KAAK,SACnC,gBAACC,EAAA,EAAO,CAACC,MAAOL,EAAU,kBAAmBM,UAAQ,EAACC,UAAU,OAAOC,kBAAmB,gBACxF,0BAAQ7B,KAAK,SAASZ,UAAS,+BAA0B,cAAqBwB,QAAShB,aAAK,EAALA,EAAOkC,WAAYT,EAAU,aAY5H,C,2DC3BMU,EAAM,IAAIC,KAEHC,EAAkB,CAC7BC,gBAAe,SAAC,GASf,IAPGC,EAAO,EAAPA,QACAC,EAAW,EAAXA,YAAW,IACXC,UAAAA,OAAS,IAAG,IAAC,EAOTC,EAAQF,EAAY7C,KAAI,SAAAgD,GAAO,OAAI,0BAAiCA,EAASJ,EAASE,EAAU,IAEhGG,EAAgBF,EAAM/C,KAAI,SAAAkD,GAAC,OAAIA,EAAEC,QAAQ,IAE/C,MAAO,CAAEC,MADS,WAAkB,UAAkBL,GAAQ,MACnCM,WAAYJ,EAAeK,OAAQR,EAChE,EAGAS,yBAAwB,SAAEC,G,MACxB,IAAKA,IAAYA,EAAQC,mBAAqBD,EAAQC,iBAAiBC,QACrE,OAAO,KAET,IAAMC,EAAWjB,EAAgBC,gBAAgB,CAC/CC,QAASY,EAAQC,iBAAiBL,KAClCP,YAAaW,EAAQC,iBAAiBJ,WACtCP,UAAWU,EAAQC,iBAAiBH,SAEhCM,EAAgB,IAAInB,KACpBoB,EAAiBrB,EAAIW,SAErBW,EAAmBH,EAASN,WAAWU,MAAK,SAACC,EAAGC,GAAC,OAAKD,EAAIC,CAAC,IAC3DC,EAAiBP,EAASN,WAAWc,SAASN,GAC9CT,EAAOO,EAASP,KAChBE,EAAyB,QAAhB,EAAAK,aAAQ,EAARA,EAAUL,cAAM,QAAI,EAEnC,GAAIY,IACFN,EAAcQ,SAAShB,EAAME,EAAQ,EAAG,GACpCd,EAAMoB,GACR,OAAOA,EAIX,IAAMS,EAAoB,IAAI5B,KAC1B6B,EAAuBR,EAAiBS,MAAK,SAAAC,GAAC,OAAIA,EAAIX,CAAc,IACnES,IAEHA,EAAuBR,EAAiB,IAG1C,IAAMW,EAAMC,KAAKC,IAAIL,EAAuBT,GAG5C,OAFAQ,EAAkBO,QAAQpC,EAAIqC,UAAYJ,GAC1CJ,EAAkBD,SAAShB,EAAM,EAAG,EAAG,GAChCiB,CACT,E,6DCtDWS,EAAiB,QAAW,YAA+C,QAApCC,SAC5CC,EAAa,0FAAH,YAD0C,IAAG,KAAE,EACsD,YAAI,gBAEzH,OACE,uBAAKnF,UAAU,QACb,wBAAMA,UAAWmF,GAAU,KAGjC,G,6DCDM,SAAUC,EAAc5E,GAC5B,IAEM6E,EAFa7E,EAAM8E,cAAcZ,MAAK,SAAAa,GAAS,OAAIA,EAAUC,KAAOhF,EAAMK,KAAK2E,EAAE,IAEvD,yBAA2B,WAE3D,OACE,gBAAC,IAAO,CACNC,IAAKjF,EAAMK,KACXQ,QAASb,EAAMa,QACf6D,SAAQ,wBAAmBG,EAAU,SACrC7D,QAAS,WAAF,OAAQhB,EAAMgB,QAAQhB,EAAMK,KAAK,GAG9C,C,oJClBMe,EAAY,+BAYZ,SAAU8D,EAAiBlF,GAC/B,IAAMmF,EAAad,KAAKe,MAAMpF,EAAMqF,mBAAqBrF,EAAMsF,WAAa,MAAQ,EAgCpF,OACE,2BACE,uBAAK9F,UAAU,kCACb,sBAAIA,UAAU,WACZ,gBAAC+F,EAAA,EAAI,CAACnE,UAAWA,EAAWoE,OAAO,UAAUC,QAAS,CAAEN,WAAAA,EAAYO,WAAY1F,EAAM0F,eAExF,gBAACC,EAAA,EAAY,CAACzF,QAAS,oBAGzB,yBACE,gBAACqF,EAAA,EAAI,CAACnE,UAAWA,EAAWoE,OAAM,cAASxF,EAAM4F,eAGnD,qBAAGpG,UAAU,QACX,wBAAMA,UAAU,aACbQ,EAAM6F,mBACL,4BAAO7F,EAAM6F,oBAEb,gBAACN,EAAA,EAAI,CAACnE,UAAWA,EAAWoE,OAAM,sBAAiBxF,EAAM4F,eAEtD,IAjDP5F,EAAM8F,aAAeC,EAAA,QAAmB/F,EAAMgG,SAE9C,gBAACT,EAAA,EAAI,CACHnE,UAAWA,EACXoE,OAAQxF,EAAMgG,WAAaC,EAAA,UAAoB,mBAAqB,gBACpER,QAAS,CAAES,cAAelG,EAAMqF,mBAAoBc,MAAOnG,EAAMsF,WAAYc,WAAYpG,EAAMsF,cAKjGtF,EAAM8F,aAAeC,EAAA,QAErB,gBAACR,EAAA,EAAI,CACHnE,UAAWA,EACXoE,OAAO,iBACPC,QAAS,CAAES,cAAelG,EAAMqF,mBAAoBc,MAAOnG,EAAMsF,WAAYc,WAAYpG,EAAMsF,cAMnG,gBAACC,EAAA,EAAI,CACHnE,UAAWA,EACXoE,OAAO,gBACPC,QAAS,CAAES,cAAelG,EAAMqF,mBAAoBc,MAAOnG,EAAMsF,WAAYc,WAAYpG,EAAMsF,eA6BjG,gBAACe,EAAA,EAAW,CAACC,QAAQ,OAAOnE,IAAKgD,IAGvC,CC1EA,IAAM,EAAY,8BAOZ,SAAUoB,EAAgBvG,GAC9B,OACE,2BACE,uBAAKR,UAAU,kCACb,sBAAIA,UAAU,WACXQ,EAAM0F,WACH,gBAACH,EAAA,EAAI,CAACnE,UAAW,EAAWoE,OAAO,UAAUC,QAAS,CAAEC,WAAY1F,EAAM0F,cAC1E,gBAACH,EAAA,EAAI,CAACnE,UAAW,EAAWoE,OAAO,oBAGzC,gBAACG,EAAA,EAAY,CAACzF,QAAS,oBAGzB,yBACE,gBAACqF,EAAA,EAAI,CAACnE,UAAW,EAAWoE,OAAM,cAASxF,EAAM4F,eAGnD,qBAAGpG,UAAU,kBACX,gBAAC+F,EAAA,EAAI,CAACnE,UAAW,EAAWoE,OAAO,eAErC,gBAACa,EAAA,EAAW,CAACC,QAAQ,OAAOnE,IAAK,IAGvC,C,qiCCrBA,IAAMqE,EAAmB,IACnBC,EAA8B,EAiB9B,SAAUC,EAAc1G,GAC5B,IAAwE,IAAtC,WAAiC,MAAK,GAAhE2G,EAAQ,KAAEC,EAAW,KACgD,IAAjB,WAAe,GAAE,GAArEC,EAAqB,KAAEC,EAAwB,KAEjDC,EAAe,SAAqB,MAEpCC,GAAU,EAAAC,EAAA,KACVC,GAAW,UAcjB,SAASC,IACPnH,EAAMmH,QAAQC,EAAeC,EAC/B,CAEA,SAASD,EAAcE,GACrBV,EAAYU,GAIVA,EAAgBC,SAAWC,EAAA,aAC3BF,EAAgBC,SAAWC,EAAA,sBAC3BF,EAAgBC,SAAWC,EAAA,SAa7BC,OAAOC,YAAW,YAiBpB,W,MACM1H,EAAM2H,WACRX,EAAQY,OAAO5H,EAAM2H,WAEvB,IAAME,EAAqB,CAAEC,MAAO9H,EAAM8H,OAEtC9H,EAAMgG,WACR6B,EAAO7B,SAAWhG,EAAMgG,SAGxBkB,EAAS,CACP9G,KAAM,uBACN2H,KAAM,CAAE,eAAgB,aAAc,qBAAsB,gBAC5DC,QAAS,QAGThI,EAAMiI,sBACR,eAA2B,OAAD,wBACrBjI,EAAMiI,uBAAqB,CAC9BJ,OAAQA,KAKW,QAAvB,EAAA7H,EAAMkI,yBAAiB,gBACzB,CAzCIC,EACF,GAAG,KAXDpB,EAAaqB,QAAUX,OAAOC,WAAWP,EAASX,EAYtD,CAEA,SAASa,EAAYgB,GACfxB,IAA0BJ,IAC5BgB,OAAOa,aAAavB,EAAaqB,SAC7BpI,EAAM2H,WACRX,EAAQY,OAAO5H,EAAM2H,YACvB,OAAgBU,IAGlBvB,GAAyB,SAAAyB,GAAU,OAAIA,EAAa,CAAC,IACrDxB,EAAaqB,QAAUX,OAAOC,WAAWP,EAASX,EACpD,CAoCA,OAtFA,aAAgB,WAGd,OAFAW,IAEO,WACAJ,EAAaqB,SAGlBX,OAAOa,aAAavB,EAAaqB,QACnC,CACF,GAAG,IAuEAzB,GACDA,EAASY,SAAWC,EAAA,aACpBb,EAASY,SAAWC,EAAA,UACpBb,EAASY,SAAWC,EAAA,WAGuB,IAAxBb,EAASrB,WAI5B,gBAACJ,EAAgB,CACfI,WAAYqB,EAASrB,WACrBD,mBAAoBsB,EAAS6B,eAC7BxC,SAAUhG,EAAMgG,SAChBF,WAAY9F,EAAM8F,WAClBJ,WAAY1F,EAAM0F,WAClBE,WAAY5F,EAAM4F,WAClBC,mBAAoB7F,EAAM6F,qBAVrB,gBAACU,EAAe,CAACb,WAAY1F,EAAM0F,WAAYE,WAAY5F,EAAM4F,YAa5E,C,mFCtIa6C,EAAoB,CAC/BC,aAAY,WACV,MAAO,CACLC,IAAK,kCACL7I,IAAK,YAET,EAEA8I,YAAW,SAACC,GACV,IAAMhB,EAAqB,CAAC,EAW5B,GAVIgB,EAAYC,SACdjB,EAAOiB,OAASD,EAAYC,QAE1BD,EAAYnF,OACW,WAArBmF,EAAYnF,KACdmE,EAAOkB,MAAQ,MAEflB,EAAOkB,MAAQ,QAGfF,EAAYG,UAAW,CACzB,IAAMC,EAAW,GACbJ,EAAYG,UAAUlF,SAAS,cACjCmF,EAASC,KAAI,MAAbD,EAAiB,CAAE,cAA0B,yBAE3CJ,EAAYG,UAAUlF,SAAS,WACjCmF,EAASC,KAAK,YAEZL,EAAYG,UAAUlF,SAAS,eACjCmF,EAASC,KAAI,MAAbD,EAAiB,CACf,cACA,WACA,YACA,iBAEJpB,EAAON,OAAS0B,CACjB,CAID,OAFApB,EAAOzH,KAAO,cAEP,CACLuI,IAAK,eAAqB,0BAA2Bd,GACrD/H,IAAK,kBAAF,OAAoB+I,EAAYC,OAAM,YAAID,EAAYnF,KAAI,YAAImF,EAAYG,WAEjF,EAEAG,UAAS,SACP9I,EACA+I,EACAC,GAEA,MAAO,CACLV,IAAK,0BACL7I,IAAK,iBACLM,KAAM,SACNkJ,iBAAkB,CAAC,kBACnBjJ,KAAAA,EACA+I,QAAAA,EACAC,MAAAA,EAEJ,EAEAE,cAAa,SAACvE,GACZ,MAAO,CACL2D,IAAK,2BAAF,OAA6B3D,EAAE,YAClClF,IAAK,eAAF,OAAiBkF,GAExB,EAEAwE,wBAAuB,SAACC,GACtB,MAAO,CACLd,IAAK,0BAAF,OAA4Bc,EAAa,aAC5C3J,IAAK,iBAAF,OAAmB2J,GAE1B,EAEAC,sBAAqB,SACnBrJ,EACAoJ,EACAL,EACAC,EACAM,GAEA,MAAO,CACLvJ,KAAM,QACNuI,IAAK,0BAAF,OAA4Bc,EAAa,aAC5C3J,IAAK,wBAAF,OAA0BO,EAAKuJ,WAAU,YAAIH,GAChDH,iBAAkB,CAAC,iBAAD,OAAkBG,IACpCpJ,KAAAA,EACA+I,QAAAA,EACAC,MAAAA,EACAM,OAAAA,EAEJ,E,sECtEWE,EAAyB,SAACC,GAAsE,IAA5CrE,EAAA,uDAAsC,CAAC,EACtG,EAA6CA,EAArCsE,QAAAA,OAAO,IAAG,OAAI,EAAEC,EAAqBvE,EAArBuE,iBAElBC,EAAUxE,EAAQyE,aAAezE,EAAQyE,aAAe,IAAIC,IAE5DC,EAAQ,SAAiCH,GAEzCI,GAAc,SAEdC,GAAiB,OAAYR,GAC7BS,GAAgB,OAAYP,GAwClC,SAASQ,IACPJ,EAAMhC,QAAQqC,QACdJ,GACF,CA6BA,SAASK,EAAU9K,GAMjB,MALoB,iBAATA,EACTA,EAAOA,EAAK+K,WACW,iBAAT/K,IACdA,EAAOA,EAAKmK,GAASY,YAEhBP,EAAMhC,QAAQwC,IAAIhL,EAC3B,CAuBA,SAASiL,IACP,SAAKf,aAAU,EAAVA,EAAYgB,SAGVhB,EAAWiB,MAAML,EAC1B,CAEA,SAASM,EAAYC,GACnBA,EAAIC,SAAQ,SAAAlG,GACVoF,EAAMhC,QAAQ+C,IAAInG,GAAI,EACxB,IACAqF,GACF,CAUA,OAtHA,aAAgB,WAIV5E,EAAQyE,cAORF,GAAoBO,IAAkBP,IAO1BM,aAAc,EAAdA,EAAgB3K,KAAI,SAAAyL,GAAC,OAAIA,EAAErB,EAAQ,IAAEsB,WACzCvB,aAAU,EAAVA,EAAYnK,KAAI,SAAAyL,GAAC,OAAIA,EAAErB,EAAQ,IAAEsB,SAK7Cb,GACF,GAAG,CAAEF,EAAgBC,EAAeT,EAAYrE,EAAQyE,eAExD,aAAgB,W,OACa,QAAtB,EAAAzE,EAAQ6F,sBAAc,eAAER,SAG7BE,EAAYvF,EAAQ6F,eACtB,GAAG,IAsFI,CACLC,aA/EF,WACE,IAAMC,GAAYX,IAElBf,EAAWoB,SAAQ,SAAAtL,GACb4L,EACFpB,EAAMhC,QAAQ+C,IAAIvL,EAAKmK,GAASY,YAAY,GAE5CP,EAAMhC,QAAO,OAAQxI,EAAKmK,GAASY,WACvC,IAEAN,GACF,EAqEEoB,aAlEF,SAAsBzG,GACpB,IAAM0G,GAAiBtB,EAAMhC,QAAQwC,IAAI5F,EAAG2F,YAExCe,EACFtB,EAAMhC,QAAQ+C,IAAInG,EAAG2F,WAAYe,GAEjCtB,EAAMhC,QAAO,OAAQpD,EAAG2F,YAE1BN,GACF,EA0DEsB,YA9CF,WACE,OAAOlM,MAAMmM,KAAKxB,EAAMhC,QAAQL,OAClC,EA6CE2C,UAAAA,EACAmB,YAAahB,IACbiB,YA7CF,YACOhC,aAAU,EAAVA,EAAYgB,UAEjBhB,EAAWoB,SAAQ,SAAAtL,GACjBwK,EAAMhC,QAAO,OAAQxI,EAAKmK,GAASY,WACrC,IACAN,IACF,EAuCE0B,kBApCF,WACE,SAAKjC,aAAU,EAAVA,EAAYgB,WAGRhB,EAAW5F,MAAK,SAAAtE,GAAI,OAAI8K,EAAU9K,EAAK,GAClD,EAgCEoL,YAAAA,EACAgB,iBAjBF,WACE,OAAO5B,EAAMhC,QAAQ6D,IACvB,EAgBEzB,MAAAA,EACA0B,OAfF,WACE,OAAO9B,EAAMhC,OACf,EAeF,C,6DCjLM,SAAU+D,IACd,aAAgB,WAEd,OADA,uBACO,kBAAM,wBAAiC,CAChD,GAAG,GACL,C,qOCKA,IAAM/K,EAAY,0BAKLgL,EAAuB,SAACC,GACnC,IAAQC,GAAmB,SAAnBA,eACFC,GAAiB,SAOvB,GAAIF,EACF,OAAOC,EAAeD,GAExB,IAAMG,EAAe,2BAOrB,OAAIA,EAAaC,cAAgB,cAG1BF,EAAeG,MAAK,SAAAC,GACzB,OAAOA,EAAMC,QAAQF,MAAK,SAAAG,GACxB,MAAI,YAAaA,GACRA,EAAehM,QAAQiM,SAAWN,EAAaM,MAI1D,GACF,GACF,EAUM,SAAUC,EAAe/M,G,MACvBgN,EAAYZ,EAAqBpM,EAAMqM,qBAW7C,GATA,aAAgB,WACTW,GACH,eAA2B,CACzBP,YAAa,aACbK,OAAQ,mBACP,CAAEG,SAAS,GAElB,GAAG,CAACD,KAECA,EACH,OAAO,iCAET,I,EAAME,EAAclN,EAAMkN,YAAYvN,KAAI,SAACQ,EAAMiL,GAAC,MAAM,CACtDjL,KAAAA,EACAU,QAAS,CACP4L,YAAa,aACbK,OAAQ,mBAEVlM,OAAQwK,IAAMpL,EAAMkN,YAAYpC,OAAS,EAC1C,IAED,OACE,uBAAKtL,UAAU,QACb,uBAAKA,UAAU,qDACb,sBAAIA,UAAU,MAAMQ,EAAMmN,SACN,QAAnB,EAAAnN,EAAMoN,qBAAa,wBAEtB,uBAAK5N,UAAU,QACb,gBAAC,KAAW,CACV0N,YAAW,CACT,CACE/M,KAAM,cAA0BiB,EAAW,sBAC3CP,QAAS,CACP4L,YAAa,aACbK,OAAQ,qBAEX,Q,EACEI,E,wmBAIRlN,EAAMqN,aACL,gCACE,yBAAIrN,EAAMqN,aACV,4BAIHrN,EAAMsN,SAGb,C,qICjHA,SAAgB,eAAiB,QAAQ,gBAAkB,QAAQ,gBAAkB,QAAQ,oBAAsB,QAAQ,IAAM,QAAQ,eAAiB,QAAQ,aAAe,QAAQ,YAAc,QAAQ,WAAa,QAAQ,kBAAoB,QAAQ,cAAgB,QAAQ,QAAU,QAAQ,OAAS,QAAQ,MAAQ,QAAQ,KAAO,QAAQ,YAAc,SCGxW,SAASC,IACP,OACE,uBAAK/N,UAAS,0CAAqC,QACjD,uBAAKA,UAAS,UAAK,iBAAqB,mCACtC,uBAAKA,UAAS,qCAAgC,kBAAsB,YAEtE,uBAAKA,UAAS,UAAK,iBACjB,uBAAKA,UAAS,qCAAgC,aAEhD,uBAAKA,UAAS,UAAK,gBACjB,uBAAKA,UAAS,qCAAgC,YAEhD,uBAAKA,UAAS,UAAK,eACjB,uBAAKA,UAAS,qCAAgC,WAEhD,uBAAKA,UAAS,UAAK,sBACjB,uBAAKA,UAAS,qCAAgC,kBAEhD,uBAAKA,UAAS,UAAK,kBAAsB,KAK/C,CAEA,SAASgO,IACP,OACE,uBAAKhO,UAAU,oBACb,uBAAKA,UAAS,UAAK,mBAAuB,KAG1C,uBAAKA,UAAS,UAAK,iBACjB,uBAAKA,UAAS,qCAAgC,cAEhD,uBAAKA,UAAS,UAAK,gBACjB,uBAAKA,UAAS,qCAAgC,cAEhD,uBAAKA,UAAS,UAAK,eACjB,uBAAKA,UAAS,qCAAgC,cAEhD,uBAAKA,UAAS,UAAK,sBACjB,uBAAKA,UAAS,qCAAgC,cAEhD,uBAAKA,UAAS,UAAK,kBAAsB,KAK/C,CAEM,SAAUiO,IACd,OACE,gCACE,uBAAKjO,UAAU,cACb,gBAACgO,EAAa,MAEd,uBAAKhO,UAAU,8BACb,gBAAC+N,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,MACX,gBAACA,EAAU,QAKrB,CCpEM,SAAUG,IACd,OACE,gCACE,uBAAKlO,UAAS,0CAAqC,oBAEnD,uBAAKA,UAAU,QACb,uBAAKA,UAAU,kCACb,gBAAC,KAAkB,MAEnB,uBAAKA,UAAS,qCAAgC,uBAIlD,uBAAKA,UAAU,kCACb,uBAAKA,UAAS,qCAAgC,qBAE9C,uBAAKA,UAAU,aACb,gBAACF,EAAA,EAAoB,CAACC,MAAO,KAG/B,uBAAKC,UAAS,6CAAwC,0BAGxD,gBAACiO,EAAoB,MAG3B,C,mCClCA,SAAgB,SAAW,QAAQ,OAAS,QAAQ,WAAa,QAAQ,UAAY,SCOrF,IACMhM,EAAYC,EAAA,mBADA,iCAOZ,SAAUiM,EAAgB3N,GAqC9B,OACE,uBAAKR,UArCP,WACE,IAAMoO,EAAY,iEAElB,OAAQ5N,EAAMuH,QACZ,KAAKC,EAAA,YACL,KAAKA,EAAA,qBACH,MAAO,GAAP,OAAUoG,EAAS,YAAI,YACzB,KAAKpG,EAAA,SACH,MAAO,GAAP,OAAUoG,EAAS,YAAI,UACzB,KAAKpG,EAAA,aACL,KAAKA,EAAA,UACL,KAAKA,EAAA,SACL,KAAKA,EAAA,YACH,MAAO,GAAP,OAAUoG,EAAS,YAAI,cACzB,IAAK,YACH,MAAO,GAAP,OAAUA,EAAS,YAAI,aAE7B,CAoBkBC,IAlBlB,WACE,OAAQ7N,EAAMuH,QACZ,KAAKC,EAAA,YACL,KAAKA,EAAA,qBACH,OAAO/F,EAAU,YACnB,KAAK+F,EAAA,SACH,OAAO/F,EAAU,UACnB,KAAK+F,EAAA,aACL,KAAKA,EAAA,UACL,KAAKA,EAAA,SACL,KAAKA,EAAA,YACH,OAAO/F,EAAU,cACnB,IAAK,YACH,OAAOA,EAAU,aAEvB,CAIKqM,GAGP,C,0BCxDA,SAAgB,QAAU,QAAQ,OAAS,QAAQ,YAAc,QAAQ,IAAM,QAAQ,oBAAsB,QAAQ,OAAS,QAAQ,KAAO,QAAQ,OAAS,QAAQ,YAAc,QAAQ,YAAc,SCW1M,IACM,EAAYpM,EAAA,mBADA,kCAOZ,SAAUqM,EAAqB/N,GACnC,OACE,uBAAKR,UAAW,WACd,uBAAKA,UAAU,uCAEb,uBAAKA,UAAW,wBAEhB,uBAAKA,UAAS,UAAK,SAAa,WAIhC,uBAAKA,UAAS,UAAK,OAAW,UAAUwO,EAAA,SAAkBhO,EAAMuD,cAAe,uBAE/E,uBAAK/D,UAAS,UAAK,SAAa,UAAS,gBAACmO,EAAe,CAACpG,OAAO,eAEjE,uBAAK/H,UAAS,UAAK,cAAkB,oCACnC,uBAAKA,UAAS,UAAK,MAAU,6FAC3B,gBAACmG,EAAA,EAAY,CACXzF,QAAS,SACTV,UAAU,mBAGb,EAAU,gBAGb,uBAAKA,UAAS,oDAA+C,kBAKrE,C,gDCjDayO,EAAyB,CACpCC,aAAY,SAACC,GACX,MAAO,CAAEA,MAAAA,EAAOC,KAAM,GAAF,OAAKD,EAAK,WAChC,G,WCFF,SAAgB,QAAU,QAAQ,QAAU,S,sGCW5C,IACM,EAAYzM,EAAA,mBADA,gCAgBZ,SAAU2M,EAAsBrO,GACpC,I,IAA8G,G,EAAxE,aAAeA,EAAMsO,aAActO,EAAMsO,YAAYtO,EAAMuO,M,EAAa,E,o4BAAtGC,EAAU,KAAEC,EAAa,KAC3BC,IAAa1O,EAAM2O,eAAgB3O,EAAM2O,cAAc3O,EAAMuO,KAQnE,OACE,uBAAK/O,UAAS,UAAK,UAAc,YAAIkP,EAAa,GAAK,kBAAoB1N,QAP7E,WACM0N,GAEJD,GAAc,SAAAG,GAAC,OAAKA,CAAC,GACvB,GAII,uBAAKpP,UAAU,iCACb,uBAAKqP,MAAOZ,EAAuBC,aAAa,IAAKlN,QAAS,SAAA8N,GAAC,OAAIA,EAAEC,iBAAiB,GACpF,gBAACC,EAAA,EAAQ,CACPhK,GAAIhF,EAAMuO,IAAIvJ,GACdiK,QAASjP,EAAM0K,UAAU1K,EAAMuO,IAAIvJ,IACnCkK,SAAU,WAAF,OAAQlP,EAAMmP,iBAAiBnP,EAAMuO,IAAIvJ,GAAG,KAIvDhF,EAAMoP,QAAQzP,KAAI,gBAAG0P,EAAM,EAANA,OAAQC,EAAe,EAAfA,gBAAiBnB,EAAK,EAALA,MAAOnJ,EAAE,EAAFA,GAAE,OACtD,uBAAKxF,UAAS,UAAK8P,QAAAA,EAAmB,IAAMxP,IAAKkF,EAAI6J,MAAOZ,EAAuBC,aAAaC,IAASkB,EAAOrP,EAAMuO,KAAW,IAGnI,uBAAK/O,UAAS,qCAAgCkP,EAAa,GAAK,kBAAoBG,MAAOZ,EAAuBC,aAAa,OAC3HQ,GAAe,uBAAKlP,UAAS,UAAK,UAAc,eAClC,EAAbgP,EAAuB,UAAuB,cAKpDA,GACC,uBAAKhP,UAAU,wCAAwCwB,QAAS,SAAA8N,GAAC,OAAIA,EAAEC,iBAAiB,GACrF/O,EAAMuP,oBAAoBvP,EAAMuO,MAK3C,C,eCzCM,SAAUiB,EAAgBxP,GAC9B,OACE,gBAACyP,EAAA,EAAa,CACZ5G,YAAa7I,EAAM6I,YACnB6G,YAAa1P,EAAM2P,QACnB9O,QAASb,EAAMa,QACfE,iBAAkBf,EAAMe,iBACxB6O,aAAW,EACXC,aAAW,EACXC,gBAAiB,IAGvB,C,mECrCA,SAAgB,aAAe,S,sGCoB/B,IAAM,EAAY,4BACZ,EAAYpO,EAAA,mBAAiC,GA0B7C,SAAUqO,EAAkB/P,G,UACyC,G,EAArB,YAAe,G,EAAM,E,o4BAAjEgQ,EAAiB,KAAEC,EAAoB,KAEzCC,GAAiB,EAAArG,EAAA,GAAuB7J,EAAMmQ,KAAK9P,MACnD+P,GAAS,SAgBf,OACE,uBAAK5Q,UAAS,UAAK,YAAgB,UACjC,uBAAKA,UAAU,uCAEb,gBAACwP,EAAA,EAAQ,CACPxP,UAAW,eACXwF,GAAG,0BACHiK,QAASiB,EAAerE,YACxBqD,SAAUgB,EAAe3E,aACzB8E,cAAeH,EAAenE,sBAGhC,uBAAKvM,UAAU,QACb,gBAACgQ,EAAe,CACd3G,YAAa7I,EAAM6I,YACnBhI,QAASb,EAAMa,QACf8O,QAAS3P,EAAM2P,WAInB,gBAACW,EAAA,EAAa,CACZhK,QAAQ,OACR9G,UAAU,UACVwB,QArCR,WACE,IAAIgP,EAAJ,CAGAC,GAAqB,GAErB,IAAMM,EAAcL,EAAevE,cAEnC3L,EAAMwQ,cAAcD,GACjBE,MAAK,kBAAML,EAAOhH,QAAQ,EAAU,iBAAiB,IAAC,OAChD,kBAAMgH,EAAO/G,MAAM,EAAU,eAAe,IAAC,SAC3C,kBAAM4G,GAAqB,EAAM,GATpC,CAUV,EA0BQS,UAAWR,EAAenE,qBAAuBiE,EACjDW,YAAaX,GAEb,gBAACzK,EAAA,EAAI,CAACnE,UAAW,EAAWoE,OAAO,aAKvC,uBAAKhG,UAAU,6CACb,uBAAKqP,MAAOZ,EAAuBC,aAAa,MAC/ClO,EAAMoP,QAAQzP,KAAI,gBAAGqF,EAAE,EAAFA,GAAI4L,EAAM,EAANA,OAAQC,EAAe,EAAfA,gBAAiB1C,EAAK,EAALA,MAAK,OACtD,uBAAKrO,IAAKkF,EAAIxF,UAAWqR,EAAiBhC,MAAOZ,EAAuBC,aAAaC,IAASyC,EAAa,IAE7G,uBAAK/B,MAAOZ,EAAuBC,aAAa,UAK/ClO,EAAM8Q,iBAAmB9Q,EAAM8Q,oBAG/B9Q,EAAMmQ,KAAK9P,KAAKyK,QAAU9K,EAAMmQ,KAAK9P,KAAKV,KAAI,SAAA4O,GAC/C,OACE,gBAACF,EAAqB,CACpBvO,IAAKyO,EAAIvJ,GACTuJ,IAAKA,EACLY,iBAAkBe,EAAezE,aACjCf,UAAWwF,EAAexF,UAC1B6E,oBAAqBvP,EAAMuP,oBAC3BiB,cAAexQ,EAAMwQ,cACrBO,YAAa/Q,EAAM+Q,YACnBC,UAAWhR,EAAMgR,UACjB5B,QAASpP,EAAMoP,QACfd,YAAatO,EAAMsO,YACnBK,cAAe3O,EAAM2O,eAG3B,OAGwB,QAArB,EAAA3O,EAAMmQ,KAAKc,kBAAU,eAAEC,UACxB,gBAACC,EAAA,EAAU,CACT3R,UAAU,yBACV0R,QAASlR,EAAMmQ,KAAKc,WAAWC,QAC/BrQ,QAASuQ,EAAA,oBAAiCvQ,QAC1CwQ,cAAc,iBAKxB,C,gDCjIM,SAAUC,EAAetR,GAC7B,OAAKA,EAAM8H,MAQT,2BACE,uBAAKtI,UAAU,QACb,gBAACkH,EAAA,EAAa,CACZoB,MAAO9H,EAAM8H,MACbX,QAASnH,EAAMgR,UAAUhR,EAAM8H,OAC/BI,kBAAmBlI,EAAMuR,YACzB7L,WAAW,OACXE,WAAW,SACXC,mBAAoBnE,EAAA,YAA0B,2BAA4B,oBAd9E,uBAAKlC,UAAU,eACb,gBAACgS,EAAA,EAAO,CAACC,GAAG,MAAMC,UAAU,SAAS9P,KAAK,WAkBlD,CClCA,SAAgB,OAAS,QAAQ,IAAM,S,ogCCWvC,IAAM,GAAY,2BAOZ,SAAU+P,GAAe3R,GAC7B,IAAkF,KAAlD,WAA6C,MAAK,GAA1E4R,EAAO,KAAEC,EAAU,KAC8C,KAArB,YAAe,GAAM,GAAjEC,EAAiB,KAAEC,EAAoB,KAkB/C,SAASC,EAAgB7R,GACvB,IAAI8R,EAAU,GACVC,EAAO,GACX,OAAQ/R,GACN,IAAK,QACH8R,EAAU,UACVC,EAAO,WACP,MACF,IAAK,WACHD,EAAU,UACVC,EAAO,mBACP,MACF,IAAK,aACHD,EAAU,UACVC,EAAO,gBAOX,IAAMC,EAAuBC,OAAOrK,KAAK6J,EAAQzR,IAAOkS,QAAO,SAAAC,GAC7D,MAAa,mBAANA,GAAgC,mBAANA,CACnC,IAEA,OACE,uBAAK9S,UAAU,OACb,uBAAKA,UAAU,iCACb,uBAAKA,UAAU,uCACb,uBAAKA,UAAS,UAAKyS,EAAO,YAAI,QAAY,mEACxC,gBAACtM,EAAA,EAAY,CACXnG,UAAS,wBAAmB,OAC5ByM,KAAMtG,EAAA4M,EAAA,SACNrS,QAASgS,KAGb,gBAAC3M,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAQrF,KAEtC,sBAAIX,UAAU,QACX2S,aAAoB,EAApBA,EAAsBxS,KAAI,SAAC2S,GAC1B,OACE,sBAAI9S,UAAU,OAAOM,IAAKwS,GACxB,uBAAK9S,UAAU,UACb,uBAAKA,UAAS,8EAA+E,YAAN8S,EAAkB,SAAgB,QAAgBV,EAAQzR,GAAqBmS,IACtK,gBAAC/M,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAQ8M,KAI5C,MAKV,CACA,OA5DA,aAAgB,WACTV,IAXLG,GAAqB,GAErB/R,EAAMuJ,cAAcvJ,EAAMuO,IAAIvJ,IAC3ByL,MAAK,SAAA+B,GACJX,EAAWW,EACb,IAAE,SAAS,WACTT,GAAqB,EACvB,IAOJ,GAAG,CAAC/R,EAAMuO,IAAIvJ,KAyDZ,gCACI8M,IAAsBF,GACtB,uBAAKpS,UAAU,oBACb,gBAACgS,EAAA,EAAO,CAACC,GAAG,MAAMC,UAAU,SAAS9P,KAAK,cAG3CgQ,GACD,uBAAKpS,UAAU,iBACZwS,EAAgB,SAChBA,EAAgB,YAChBA,EAAgB,eAK3B,CChGA,IACM,GAAYtQ,EAAA,mBADA,4BAYZ,SAAU+Q,GAAezS,GAC7B,IAAM0S,EAAY1S,EAAMuO,IAAIhH,SAAWC,EAAA,aACnCxH,EAAMuO,IAAIhH,SAAWC,EAAA,qBAEnB4I,GAAS,SAuCf,OACE,uBAAK5Q,UAAU,aACb,uBAAKA,UAAU,kCACZQ,EAAMuO,IAAIhH,SAAWC,EAAA,cAA6B,sBAAIhI,UAAU,MAAM,GAAU,YAEhFkT,GACC,gBAACC,EAAA,EAAU,CACTnT,UAAU,mCACVU,QAAS,cACTc,QAnBV,WACEhB,EAAMwQ,cAAc,CAACxQ,EAAMuO,IAAIvJ,KAC5ByL,MAAK,WACJL,EAAOhH,QAAQ,GAAU,iBAC3B,IAAE,OACK,WACLgH,EAAO/G,MAAM,GAAU,eACzB,GACJ,GAaW,GAAU,YAhDrB,WACE,OAAQrJ,EAAMuO,IAAIhH,QAChB,KAAKC,EAAA,aACL,KAAKA,EAAA,UACL,KAAKA,EAAA,SACL,KAAKA,EAAA,YACH,OACE,gBAAC8J,EAAc,CACbxJ,MAAO9H,EAAMuO,IAAIvJ,GACjBuM,YAAavR,EAAMuR,YACnBP,UAAWhR,EAAMgR,YAIvB,KAAKxJ,EAAA,SAEH,OAAO,iCAET,KAAKA,EAAA,YACL,KAAKA,EAAA,qBACH,OAAO,gBAACmK,GAAc,CAACpD,IAAKvO,EAAMuO,IAAKhF,cAAevJ,EAAMuJ,gBAE9D,QACE,OAAO,iCAEb,CA4BKqJ,GAGP,C,oDCtFA,UAAgB,OAAS,QAAQ,YAAc,QAAQ,IAAM,SC0B7D,IAAM,GAAY,8BACZ,GAAYlR,EAAA,mBAAiC,IA0B7CmR,GAAoB,CACxBrL,EAAA,aACAA,EAAA,UACAA,EAAA,SACAA,EAAA,aA0CI,SAAUsL,GAAkB9S,GAChC,IAAM2P,EAAU,CACd,YA3DK,CAAC,CACN3K,GAAI,SACJ7E,KAAMuB,EAAA,YAA0B,GAAW,UAC3CqR,SAAS,GAEX,CACE/N,GAAI,SACJ7E,KAAMuB,EAAA,YAA0B,GAAW,aAqD3C,kBAGI0N,EAAqC,CAAC,CAC1CpK,GAAI,KACJ4L,OAAQ,GAAU,YAClBC,gBAAiB,YACjBvB,gBAAiB,OACjBD,OAAQ,SAAAd,G,MACAyE,EAAsD,QAAtC,EAAAzE,EAAI0E,gBAAkC,eAAEC,OAE9D,IAAKF,EACH,OAAO,iCAET,IAAME,EAASC,GAAA,oBAA4BH,GAC3C,IAAKE,EACH,MAAM,IAAIE,EAAA,EAAS,kFAGrB,OACE,uBAAK5T,UAAS,yCAAoC,eAAkB,sDAClE,gBAACqC,GAAA,EAAO,CAACE,UAAQ,EAACD,MAAOoR,EAAO/S,MAC9B,uBAAKkT,IAAKH,EAAOI,QAASC,IAAKL,EAAO/S,QAI9C,EACAgO,MAAO,KACN,CACDnJ,GAAI,cACJ4L,OAAQ,GAAU,QAClBC,gBAAiB,YACjBvB,gBAAiB,OACjBD,OAAQ,SAAAd,GAAG,OAAIP,EAAA,SAAkBO,EAAIiF,YAAa,qBAAqB,EACvErF,MAAO,KACN,CACDnJ,GAAI,SACJ4L,OAAQ,GAAU,UAClBC,gBAAiB,YACjBvB,gBAAiB,OACjBD,OAAQ,SAAAd,GAAG,OACT,gBAACZ,EAAe,CAACpG,OAAQgH,EAAIhH,QAAS,EAExC4G,MAAO,KACN,CACDnJ,GAAI,gBACJ4L,OAAQ,GAAU,eAClBC,gBAAiB,OACjBvB,gBAAiB,OACjBD,OAAQ,SAAAd,GAAG,OA3Ff,SAAwBA,EAAevO,GACrC,OAAIuO,EAAIkF,qBAEJ,uBAAKjU,UAAU,6BACb,gBAACkU,GAAA,EAAa,CAAClU,UAAU,6BAA6ByM,KAAMtG,EAAA4M,EAAA,OAC1D,gBAACoB,EAAA,EAAe,OAEjBpF,EAAIqF,eAKPrF,EAAIqF,cAEJ,uBAAKpU,UAAU,6BACb,uBAAKA,UAAS,eAAU,YACtB,gBAACqU,EAAA,EAAM,CACL9C,YAAa/Q,EAAM+Q,YACnB+C,SAAUC,GAAA,cAAuBxF,EAAIqF,cAAcI,MAAM,KAAK,GAAIzF,EAAIqF,cAAcI,MAAM,KAAK,OAGlGzF,EAAIqF,eAMT,uBAAKpU,UAAU,kCACb,uBAAKA,UAAS,UAAK,OAAU,6FAC3B,gBAACmG,EAAA,EAAY,CACXzF,QAAS,SACTV,UAAU,mBAGb,GAAU,sBAGjB,CAsDmByU,CAAe1F,EAAKvO,EAAM,EACzCmO,MAAO,MAWT,OACE,gBAAC4B,EAAiB,iBACZ/P,EAAK,CACT2P,QAASA,EACTJ,oBAAqB,SAAAhB,GAAG,OACtB,gBAACkE,GAAc,CACblE,IAAKA,EACLhF,cAAevJ,EAAMuJ,cACrByH,UAAWhR,EAAMgR,UACjBR,cAAexQ,EAAMwQ,cACrBe,YAAavR,EAAMuR,aACnB,EAEJnC,QAASA,EACTd,YAtBJ,SAAqBC,GACnB,OAAOsE,GAAkB/O,SAASyK,EAAIhH,OACxC,EAqBIoH,cAnBJ,SAAuBJ,GACrB,OAAOA,EAAIhH,SAAWC,EAAA,QACxB,IAoBF,C,gKC/KM,GAAY,qCAEZ,SAAU0M,KACd,OACE,gBAACC,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACd,IAAKe,GAAA,6CACvB,gBAACD,GAAA,UAAkB,KAAC,gBAAC5O,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,kBACvD,gBAAC2O,GAAA,OAAe,CAAC3U,UAAU,aAAY,gBAAC+F,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,eAC1E,gBAAC2O,GAAA,OAAe,CAAC3U,UAAU,yBAAwB,gBAAC+F,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,gBAS5F,CChBA,IAAM,GAAY,sBAEZ,SAAU6O,KACd,OACE,gBAACF,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACd,IAAKe,GAAA,wCACvB,gBAACD,GAAA,UAAkB,KAAC,gBAAC5O,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,kBACvD,gBAAC2O,GAAA,OAAe,CAAC3U,UAAU,aAAY,gBAAC+F,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,eAGhF,CCTA,IAAM,GAAY,uBACZ,GAAY9D,EAAA,mBAAiC,IAK7C,SAAU4S,GAAqBtU,GACnC,OACE,gBAACmU,GAAA,EAAU,KACT,gBAACA,GAAA,QAAgB,CAACd,IAAKe,GAAA,uCACvB,gBAACD,GAAA,UAAkB,KAAC,gBAAC5O,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,kBACvD,gBAAC2O,GAAA,OAAe,CAAC3U,UAAU,aAAY,gBAAC+F,EAAA,EAAI,CAACnE,UAAW,GAAWoE,OAAO,eAO1E,gBAAC2O,GAAA,MAAc,CACb3U,UAAU,eACVwB,QAAShB,EAAMuU,gBACfC,KAAM,GAAU,cAIxB,C,4BCAM,GAAY9S,EAAA,mBADA,sBAOZ,SAAU+S,GAAsBzU,G,MAC9BuB,EAAW,kBAAyCkH,GAAA,cAA8BzI,EAAM6I,cACxF6L,EAAS,kBAA6BC,GAAA,YACtCC,EAAc,kBAAkCC,GAAA,iBAChDC,EAAY,kBAAwCrM,GAAA,kBACpDjH,EAAW,kBAA8CoT,EAAYvU,MAAQyU,EAAUzU,MAC3FoI,GAAA,0BAA0CqM,EAAUzU,KAAK2E,KAErD+P,EAAaxT,EAASyT,cAAgBN,EAAOM,cAAgBxT,EAASwT,cAAgBF,EAAUE,cAEtG,EAAA7I,GAAA,KAEA,IAAM8I,EAAa,uBAEb/N,GAAW,UAIjB,SAASqC,EAAcvE,GACrB,OAAOiQ,EAAWxM,GAAA,gBAAgCzD,GACpD,CAEA,SAASgM,EAAUhM,GACjB,OAAO,SAASkQ,EAAiDC,GAC/D,OAAOF,EAAWG,GAAA,iBAA2BpQ,EAAIkQ,EAAWC,GAC9D,CACF,CAEA,SAAS5D,IACPrK,EAAS,CACP9G,KAAM,uBACN2H,KAAM,CAAC,kBACPC,QAAS,MAEb,CAEA,SAASwI,EAAc6E,GACrB,OAAOJ,EAAiBG,GAAA,iBAA2BC,GACrD,EAtBA,EAAAC,GAAA,GAAmB,CAAExT,MAAO,GAAU,eAkEtC,IAAMyT,EAAmBR,GAAyC,YAAb,QAAd,EAAAD,EAAUzU,YAAI,eAAEkH,QAEvD,GAA8B,EAAAiO,GAAA,GAAiBZ,EAAYvU,MAAnDoV,EAAO,EAAPA,QAASC,EAAQ,EAARA,SAQjB,OACE,gBAAC3I,GAAA,EAAc,CACbI,QAAS,GAAU,WACnBD,YAAa,CAAC,GAAU,eACxBE,cAVJ,WACE,OAAKmI,EAEE,gBAAC5T,EAAA,EAAqB,CAACO,UAAWuT,EAASE,WAAYD,IADrD,gCAEX,EAOIrJ,oBAAqBuJ,GAAA,aAEpBL,GACC,gBAAClU,EAAA,EAAsB,CACrBT,OAAO,WACPU,SAAU,CACRC,SAAU,CAAEkL,YAAa,cAAsBK,OAAQ,yBACvDtL,SAAU,CAAEiL,YAAa,cAAsBK,OAAQ,qCAhEjE,W,QAEE,GAA+B,aAAb,QAAd,EAAAgI,EAAUzU,YAAI,eAAEkH,QAClB,OAAO,gBAAC2M,GAA2B,MAGrC,GAA+B,UAAb,QAAd,EAAAY,EAAUzU,YAAI,eAAEkH,QAClB,OAAO,gBAACsO,GAAA,EAAuB,MAEjC,IAAKd,EACH,OAAO,gBAACrH,EAAmB,MAE7B,IAAKnM,EAASlB,KAAKA,KAAKyK,SAAW9K,EAAM6I,YACvC,OAAO,gBAACyL,GAAoB,CAACC,gBAAiBkB,IAEhD,IAAMK,EAAgBzT,GAAA,2BAAyCb,EAASnB,MAExE,OACE,gCACE,gBAACyS,GAAiB,CAChB3C,KAAM5O,EAASlB,KACfwI,YAAa7I,EAAM6I,YACnBhI,QAAS,CACP4L,YAAa,cACbK,OAAQ,yBAEV0D,cAAeA,EACfjH,cAAeA,EACfwH,YAAa2D,EAAOrU,KAAK0Q,YACzBC,UAAWA,EACXO,YAAaA,EACbT,gBACEgF,EACI,kBAAM,gBAAC/H,EAAoB,CAACxK,cAAeuS,GAAiB,EAC5D,QAGNvU,EAASlB,KAAKA,KAAKyK,QAAU9K,EAAM6I,aAAe,gBAACwL,GAAmB,MAG9E,CA4BKzB,GAGP,C,yGC9IMxR,EAAY,0BAEZ,SAAUyU,IACd,OACE,gBAAC,IAAU,KACT,gBAAC,UAAgB,CAACxC,IAAK,4CACvB,gBAAC,YAAkB,KAAC,gBAAC,IAAI,CAACjS,UAAWA,EAAWoE,OAAO,kBACvD,gBAAC,SAAe,CAAChG,UAAU,aAAY,gBAAC,IAAI,CAAC4B,UAAWA,EAAWoE,OAAO,eAS1E,gBAAC,IAAY,CACXhG,UAAU,eACVuW,KAAM,2BACNC,QAAM,GAEN,gBAAC,IAAI,CAAC5U,UAAWA,EAAWoE,OAAO,YAK3C,C,yICtBM/D,EAAY,qBADA,uBAGL+T,EAAmB,SAACZ,GAC/B,IAAMK,EAAa,uBAEb7E,GAAS,SAEf,OAAKwE,EAqCE,CAAEc,SAHT,WACE,EAEiBD,QAjCnB,WACE,IAAMQ,EAAmB,CACvB7V,KAAM,aACN+M,QAAS1L,EAAU,yBACnByU,QAASzU,EAAU,sBACnB0U,YAAa1U,EAAU,6BACvB2U,iBAAkB,aAGd/V,EAAO,CACXF,KAAM,cACNC,KAAM,cACN6S,SAAU,CACRoD,eAAgBzB,EAAYhL,WAC5B0M,iBAAkB,cAEpB1M,WAAYgL,EAAYhL,WACxB2M,SAAU,EAAAC,EAAA,SAEZvB,EAAW,cACT5U,GACA,WACE+P,EAAOhH,QAAQ6M,EACjB,IACA,WACE7F,EAAO/G,MAAM5H,EAAU,SACzB,IAEJ,GA/BS,CAAEgU,QAAS,WAAO,EAAGC,SAAU,WAAO,EAqCjD,C,mCCzDA,SAAgB,gBAAkB,QAAQ,IAAM,QAAQ,SAAW,QAAQ,YAAc,QAAQ,QAAU,Q,uGCsC3G,SAASe,EAActU,EAAKuU,EAAKC,GAC/B,MAAMxR,GAAchD,EAAMuU,IAAQC,EAAMD,GAAO,IAC/C,OAAOrS,KAAKuS,MAjCU,IAiCJzR,GAjCI,GAkCxB,CACA,SAAS0R,GAAkB,IACzBH,EAAG,IACHvU,EAAG,IACHwU,EAAG,MACHG,EAAK,eACLC,EAAc,QACdC,EAAO,SACPC,EAAQ,UACRzX,EAAS,MACTqP,EAAK,QACLvI,EAAO,SACP4Q,KACGlX,GACFO,GACD,OAAoB,SAAK,MAAO,CAC9BA,IAAKA,KACFP,EACH4B,KAAM,cACNpC,UAAW,IAAWA,EAAW,GAAG0X,QAAgB,CAClD,CAAC,MAAM5Q,KAAYA,EACnB,CAAC,GAAG4Q,kBAA0BD,EAC9B,CAAC,GAAGC,iBAAyBD,GAAYD,IAE3CnI,MAAO,CACLV,MAAO,GAAGsI,EAActU,EAAKuU,EAAKC,SAC/B9H,GAEL,gBAAiB1M,EACjB,gBAAiBuU,EACjB,gBAAiBC,EACjBrJ,SAAUyJ,GAA8B,SAAK,OAAQ,CACnDvX,UAAW,kBACX8N,SAAUwJ,IACPA,GAET,CACA,MAAMzQ,EAA2B,cAAiB,EAChD8Q,WAAU,KACPC,GACF7W,KACD,MAAMP,EAAQ,CACZ0W,IAAK,EACLC,IAAK,IACLM,UAAU,EACVF,gBAAgB,EAChBC,SAAS,KACNI,GAGL,GADApX,EAAMkX,UAAW,QAAmBlX,EAAMkX,SAAU,YAChDC,EACF,OAAON,EAAkB7W,EAAOO,GAElC,MAAM,IACJmW,EAAG,IACHvU,EAAG,IACHwU,EAAG,MACHG,EAAK,eACLC,EAAc,QACdC,EAAO,SACPC,EAAQ,SACRC,EAAQ,QACR5Q,EAAO,UACP9G,EAAS,SACT8N,KACG+J,GACDrX,EACJ,OAAoB,SAAK,MAAO,CAC9BO,IAAKA,KACF8W,EACH7X,UAAW,IAAWA,EAAW0X,GACjC5J,SAAUA,GAAW,QAAIA,GAAUgK,IAAsB,IAAAC,cAAaD,EAAO,CAC3EH,SAAS,MACLN,EAAkB,CACtBH,MACAvU,MACAwU,MACAG,QACAC,iBACAC,UACAC,WACAC,WACA5Q,WACC/F,IACH,IAEJ8F,EAAYmR,YAAc,cAC1B,S","sources":["file:///app/packages/libs/shared/src/apps/search/components/search-filters/PartialSearchFilters.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-header/RosteringSettingHeader.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/sync-action-button-group.scss","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/SyncActionButtonGroup.tsx","file:///app/packages/libs/shared/src/components/rostering/utils/RosteringHelper.ts","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.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/flight-requests/RosteringRequests.ts","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/hooks/useLockContentWidth.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/libs/shared/src/components/rostering/partial-loading/partial-sync-jobs-list.scss","file:///app/packages/libs/shared/src/components/rostering/partial-loading/PartialSyncJobsTable.tsx","file:///app/packages/libs/shared/src/components/rostering/partial-loading/PartialSyncJobsList.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-status-badge/sync-status-badge.scss","file:///app/packages/libs/shared/src/components/rostering/sync-status-badge/SyncStatusBadge.tsx","file:///app/packages/libs/shared/src/components/rostering/scheduled-sync-job-item/scheduled-sync-job-item.scss","file:///app/packages/libs/shared/src/components/rostering/scheduled-sync-job-item/ScheduledSyncJobItem.tsx","file:///app/packages/libs/shared/src/components/bulk-job-accordion/BulkJobsAccordionHelper.ts","file:///app/packages/libs/shared/src/components/bulk-job-accordion/bulk-jobs-accordion-item/bulk-jobs-accordion-item.scss","file:///app/packages/libs/shared/src/components/bulk-job-accordion/bulk-jobs-accordion-item/BulkJobsAccordionItem.tsx","file:///app/packages/libs/shared/src/components/bulk-jobs-filters/BulkJobsFilters.tsx","file:///app/packages/libs/shared/src/components/bulk-job-accordion/bulk-jobs-accordion.scss","file:///app/packages/libs/shared/src/components/bulk-job-accordion/BulkJobsAccordion.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-job-polling/SyncJobPolling.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-job-summary/sync-job-summary.scss","file:///app/packages/libs/shared/src/components/rostering/sync-job-summary/SyncJobSummary.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-job-details/SyncJobDetails.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-jobs-accordion/sync-jobs-accordion.scss","file:///app/packages/libs/shared/src/components/rostering/sync-jobs-accordion/SyncJobsAccordion.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/district-rostering-empty-state/DistrictRosteringEmptyState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/no-results-empty-state/NoResultsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/no-sync-jobs-empty-state/NoSyncJobsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/RosteringSyncListView.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/utils/useSyncRostering.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss","file:///app/node_modules/react-bootstrap/esm/ProgressBar.js"],"sourcesContent":["import * as React from 'react';\n\nimport styles from './search-filters.scss';\n\ninterface PartialSearchFiltersProps {\n count?: number;\n}\n\nexport function PartialSearchFilters({ count = 6 }: PartialSearchFiltersProps): JSX.Element {\n return (\n <div className='d-flex'>\n <div className='d-flex ps-1'>\n {Array(count).fill(null).map((item, index) => (\n <div key={index} className={`${styles.partialButton} partial-loading-background mx-1`} />\n ))}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nconst namespace = 'rostering.settingHeader';\n\nexport interface RosteringSettingHeaderAppLinks {\n syncJobs: Core.AppLink;\n settings: Core.AppLink;\n}\n\ninterface RosteringSettingHeaderProps {\n appLinks?: RosteringSettingHeaderAppLinks;\n active: keyof RosteringSettingHeaderAppLinks;\n}\n\nexport function RosteringSettingHeader(props: RosteringSettingHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'syncJobs'),\n appLink: props.appLinks?.syncJobs,\n active: props.active === 'syncJobs'\n \n }, {\n name: LanguageService.getPhrase(namespace, 'settings'),\n appLink: props.appLinks?.settings,\n active: props.active === 'settings'\n \n }];\n\n return (\n <div>\n <PillTabSelector tabs={tabs} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"rightButton\":\"GcqRT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport styles from './sync-action-button-group.scss';\n\nconst namespace = 'rostering.syncActionButtonGroup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncActionButtonGroupProps {\n onSyncNow?: () => void;\n onFullSync?: () => void;\n}\n\nexport function SyncActionButtonGroup(props: SyncActionButtonGroupProps): JSX.Element {\n return (\n <div className='btn-group px-2' role='group'>\n <Tooltip title={getPhrase('syncNowTooltip')} spanHack placement='left' spanHackClassName={styles.buttonBorder}>\n <button type='button' className={`btn btn-outline-dark ${styles.leftButton}`} onClick={props?.onSyncNow}>{getPhrase('syncNow')}</button>\n </Tooltip>\n {/* todo hide the dropdown for v1 */}\n {/* <button type='button' className={`btn dropdown-toggle btn-outline-dark ${styles.rightButton}`} data-bs-toggle='dropdown'>\n </button>\n <div className='dropdown-menu'>\n <Tooltip title={getPhrase('fullSyncTooltip')} spanHack placement='left' >\n <div className='dropdown-item cursor-pointer' onClick={props?.onFullSync}>{getPhrase('fullSync')}</div>\n </Tooltip>\n </div> */}\n </div>\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst now = new Date();\n\nexport const RosteringHelper = {\n parseUTCToLocal(\n {\n utcHour,\n utcWeekdays,\n utcMinute = 0\n }: {\n utcHour: number,\n utcWeekdays: number[],\n utcMinute: number\n }\n ) {\n const local = utcWeekdays.map(weekday => DateHelper.buildLocalDateFromUTC(weekday, utcHour, utcMinute));\n\n const localWeekdays = local.map(w => w.getDay());\n const localHour = DateHelper.format(ArrayHelper.first(local), 'HH');\n return { hour: +localHour, daysOfWeek: localWeekdays, minute: utcMinute };\n },\n\n // calculating next scheduled job by schedule setting\n getScheduledJobBySetting (setting: ScheduleSettingResponse): Date | null {\n if (!setting || !setting.fullSyncSchedule || !setting.fullSyncSchedule.enabled)\n return null;\n\n const schedule = RosteringHelper.parseUTCToLocal({\n utcHour: setting.fullSyncSchedule.hour,\n utcWeekdays: setting.fullSyncSchedule.daysOfWeek,\n utcMinute: setting.fullSyncSchedule.minute\n });\n const scheduledDate = new Date();\n const weekdayOfToday = now.getDay();\n\n const scheduledWeekday = schedule.daysOfWeek.sort((a, b) => a - b);\n const scheduledToday = schedule.daysOfWeek.includes(weekdayOfToday);\n const hour = schedule.hour;\n const minute = schedule?.minute ?? 0;\n\n if (scheduledToday) {\n scheduledDate.setHours(hour, minute, 0, 0);\n if (now < scheduledDate) {\n return scheduledDate;\n }\n }\n\n const nextScheduledDate = new Date();\n let nextScheduledWeekday = scheduledWeekday.find(d => d > weekdayOfToday);\n if (!nextScheduledWeekday) {\n // cannot find next scheduled date in the current week, must be next week\n nextScheduledWeekday = scheduledWeekday[0];\n }\n // use absolute value of gap to make sure next scheduled date is in the futrue\n const gap = Math.abs(nextScheduledWeekday - weekdayOfToday);\n nextScheduledDate.setDate(now.getDate() + gap);\n nextScheduledDate.setHours(hour, 0, 0, 0);\n return nextScheduledDate;\n }\n};","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\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 { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { BatchJob, ScheduleSettingRequest } from 'libs/shared/interfaces';\nimport { CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const RosteringRequests = {\n getRostering(): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/rostering`,\n key: `rostering`\n };\n },\n\n getSyncList(queryParams: BulkJobsQueryParams): Flight.Request {\n const params: HashObject = {};\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.jobStatus) {\n const statuses = [];\n if (queryParams.jobStatus.includes('completed')) {\n statuses.push(...[ BatchJobStatus.Completed, BatchJobStatus.CompletedWithError ]);\n }\n if (queryParams.jobStatus.includes('failed')) {\n statuses.push(BatchJobStatus.Failed);\n }\n if (queryParams.jobStatus.includes('inProgress')) {\n statuses.push(...[\n BatchJobStatus.Submitted,\n BatchJobStatus.Queued,\n BatchJobStatus.Pending,\n BatchJobStatus.InProgress ]);\n }\n params.status = statuses;\n }\n\n params.type = BatchJobType.Rostering;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `rostering:sync:${queryParams.cursor}:${queryParams.sort}:${queryParams.jobStatus}`\n };\n },\n\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: 'rostering:sync',\n type: HttpVerbs.POST,\n invalidationKeys: ['rostering:sync'],\n data,\n success,\n error\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\n getSyncScheduleSettings(integrationId: string): Flight.SimulatedRequest {\n return {\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `sync-settings:${integrationId}`\n };\n },\n\n updateScheduleSetting(\n data: ScheduleSettingRequest,\n integrationId: string,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n type: HttpVerbs.PUT,\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `update:sync-settings:${data.customerId}:${integrationId}`,\n invalidationKeys: [`sync-settings:${integrationId}`],\n data,\n success,\n error,\n always\n };\n }\n};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import React from 'react';\n\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\n\nexport function useLockContentWidth(): void {\n React.useEffect(() => {\n LayoutHelper.lockContentWidth();\n return () => LayoutHelper.unlockContentWidth();\n }, []);\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialHeading\":\"MwUCZ\",\"partialJobCount\":\"MUELm\",\"partialCheckbox\":\"dShe9\",\"partialExportButton\":\"VL4Tq\",\"row\":\"z_hGc\",\"checkboxColumn\":\"IacDe\",\"actionColumn\":\"_JoZe\",\"usersColumn\":\"BtHPO\",\"dateColumn\":\"jpr0N\",\"performedByColumn\":\"XP4Lf\",\"seeMoreColumn\":\"A8_Nf\",\"heading\":\"uThGf\",\"action\":\"PFOGb\",\"users\":\"pXZx8\",\"date\":\"VWS_a\",\"performedBy\":\"vZeC9\"};","import React from 'react';\n\nimport styles from './partial-sync-jobs-list.scss';\n\nfunction PartialRow(): JSX.Element {\n return (\n <div className={`d-flex striped-row rounded py-3 ${styles.row}`}>\n <div className={`${styles.checkboxColumn} d-flex justify-content-center`}>\n <div className={`partial-loading-background ${styles.partialCheckbox} ms-0`} />\n </div>\n <div className={`${styles.actionColumn}`}>\n <div className={`partial-loading-background ${styles.action}`} />\n </div>\n <div className={`${styles.usersColumn}`}>\n <div className={`partial-loading-background ${styles.users}`} />\n </div>\n <div className={`${styles.dateColumn}`}>\n <div className={`partial-loading-background ${styles.date}`} />\n </div>\n <div className={`${styles.performedByColumn}`}>\n <div className={`partial-loading-background ${styles.performedBy}`} />\n </div>\n <div className={`${styles.seeMoreColumn}`}>\n &nbsp;\n </div>\n </div>\n );\n}\n\nfunction PartialHeader(): JSX.Element {\n return (\n <div className='d-flex py-2 mb-1'>\n <div className={`${styles.checkboxColumn}`}>\n &nbsp;\n </div>\n <div className={`${styles.actionColumn}`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.usersColumn}`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.dateColumn}`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.performedByColumn}`}>\n <div className={`partial-loading-background ${styles.heading}`} />\n </div>\n <div className={`${styles.seeMoreColumn}`}>\n &nbsp;\n </div>\n </div>\n );\n}\n\nexport function PartialSyncJobsTable(): JSX.Element {\n return (\n <>\n <div className='mb-3 mt-n1'>\n <PartialHeader />\n\n <div className='striped-list no-full-width'>\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n <PartialRow />\n </div>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { PartialSearchFilters } from 'libs/shared/apps/search/components/search-filters/PartialSearchFilters';\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\n\nimport { PartialSyncJobsTable } from './PartialSyncJobsTable';\n\nimport styles from './partial-sync-jobs-list.scss';\n\nexport function PartialSyncJobsList(): JSX.Element {\n return (\n <>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n\n <div className='pb-3'>\n <div className='d-flex justify-content-between'>\n <PartialBreadcrumbs />\n\n <div className={`partial-loading-background ${styles.partialJobCount}`} />\n </div>\n </div>\n\n <div className='d-flex align-items-center pb-2'>\n <div className={`partial-loading-background ${styles.partialCheckbox}`} />\n\n <div className='ms-4 ps-3'>\n <PartialSearchFilters count={3} />\n </div>\n\n <div className={`ms-auto partial-loading-background ${styles.partialExportButton}`} />\n </div>\n\n <PartialSyncJobsTable />\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"complete\":\"nAOdH\",\"failed\":\"xkFpC\",\"inProgress\":\"BjR3y\",\"scheduled\":\"Ux2b9\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport styles from './sync-status-badge.scss';\n\nconst namespace = 'rostering.syncJobsStatusBadge';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncStatusBadgeProps {\n status: BatchJobStatus | 'scheduled';\n}\n\nexport function SyncStatusBadge(props: SyncStatusBadgeProps): JSX.Element {\n function getClassName(): string {\n const baseClass = 'rounded-pill px-2 d-inline-flex align-items-center fw-semibold';\n\n switch (props.status) {\n case BatchJobStatus.Completed:\n case BatchJobStatus.CompletedWithError:\n return `${baseClass} ${styles.complete}`;\n case BatchJobStatus.Failed:\n return `${baseClass} ${styles.failed}`;\n case BatchJobStatus.InProgress:\n case BatchJobStatus.Pending:\n case BatchJobStatus.Queued:\n case BatchJobStatus.Submitted:\n return `${baseClass} ${styles.inProgress}`;\n case 'scheduled':\n return `${baseClass} ${styles.scheduled}`;\n }\n }\n\n function getName(): string {\n switch (props.status) {\n case BatchJobStatus.Completed:\n case BatchJobStatus.CompletedWithError:\n return getPhrase('complete');\n case BatchJobStatus.Failed:\n return getPhrase('failed');\n case BatchJobStatus.InProgress:\n case BatchJobStatus.Pending:\n case BatchJobStatus.Queued:\n case BatchJobStatus.Submitted:\n return getPhrase('inProgress');\n case 'scheduled':\n return getPhrase('scheduled');\n }\n }\n\n return (\n <div className={getClassName()}>\n {getName()}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"colored\":\"MLlUi\",\"avatar\":\"Z1jn_\",\"logoWrapper\":\"OAeff\",\"cog\":\"I7V_R\",\"checkboxPlaceholder\":\"LTmrp\",\"source\":\"zYMOT\",\"date\":\"mnJQP\",\"status\":\"Pm1Aa\",\"performedBy\":\"oy6Vm\",\"placeholder\":\"o0RDO\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { SyncStatusBadge } from 'libs/shared/components/rostering/sync-status-badge/SyncStatusBadge';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './scheduled-sync-job-item.scss';\n\n\nconst namespace = 'rostering.scheduledSyncJobItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncJobsAccordionItemProps {\n scheduledDate: Date;\n}\n\nexport function ScheduledSyncJobItem(props: SyncJobsAccordionItemProps): JSX.Element {\n return (\n <div className={styles.colored}>\n <div className='px-4 py-3 d-flex align-items-center'>\n {/* no checkbox for scheduled job but need a placeholder for styling */}\n <div className={styles.checkboxPlaceholder}></div>\n\n <div className={`${styles.source} px-2`}>\n {/* scheduled job don't have source logo, we keep it as placeholder*/}\n </div>\n\n <div className={`${styles.date} px-2`}>{DateHelper.format(props.scheduledDate, 'DD/MM/YYYY, hh:mmA')}</div>\n\n <div className={`${styles.status} px-2`}><SyncStatusBadge status='scheduled' /></div>\n\n <div className={`${styles.performedBy} px-2 d-flex align-items-center`}>\n <div className={`${styles.cog} me-2 rounded-circle text-white bg-dark d-flex align-items-center justify-content-center`}>\n <SvgContainer\n svgName={cvSvgLibrary.Cog}\n className='svg-container'\n />\n </div>\n {getPhrase('performedBy')}\n </div>\n\n <div className={`cursor-pointer d-flex justify-content-end ${styles.placeholder}`}></div>\n\n </div>\n </div>\n );\n}","export const BulkJobAccordionHelper = {\n getCellStyle(width: number) {\n return { width, flex: `${width} 0 auto` };\n }\n};","// extracted by mini-css-extract-plugin\nexport default {\"colored\":\"aU1VO\",\"seeMore\":\"Nfc8Q\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { BulkJobsAccordionColumn } from 'libs/shared/components/bulk-job-accordion/BulkJobsAccordion';\nimport { BulkJobAccordionHelper } from 'libs/shared/components/bulk-job-accordion/BulkJobsAccordionHelper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { WizardPollJobFn } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { BatchJob } from 'libs/shared/interfaces';\n\nimport styles from './bulk-jobs-accordion-item.scss';\n\nconst namespace = 'shared.bulkJobsAccordionItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncJobsAccordionItemProps {\n job: BatchJob;\n onToggleCheckbox: (id: string) => void;\n isChecked: (id: string) => boolean;\n jobDetailsComponent: (job: BatchJob) => JSX.Element;\n onClickExport: (ids: string[]) => Promise<void>;\n imageCdnUrl: string;\n onPollJob?: (id: string) => WizardPollJobFn;\n columns: BulkJobsAccordionColumn[];\n forceExpand?: (job: BatchJob) => boolean;\n disableExpand?: (job: BatchJob) => boolean;\n}\n\nexport function BulkJobsAccordionItem(props: SyncJobsAccordionItemProps): JSX.Element {\n const [ isExpanded, setIsExpanded ] = React.useState(props.forceExpand ? props.forceExpand(props.job) : false);\n const isDisabled = props.disableExpand ? props.disableExpand(props.job) : false;\n\n function onClick() {\n if (isDisabled)\n return;\n setIsExpanded(s => !s);\n }\n\n return (\n <div className={`${styles.colored} ${isDisabled ? '' : 'cursor-pointer'}`} onClick={onClick}>\n <div className='p-4 d-flex align-items-center'>\n <div style={BulkJobAccordionHelper.getCellStyle(60)} onClick={e => e.stopPropagation()}>\n <Checkbox\n id={props.job.id}\n checked={props.isChecked(props.job.id)}\n onChange={() => props.onToggleCheckbox(props.job.id)}\n />\n </div>\n \n {props.columns.map(({ render, renderClassName, width, id }) => (\n <div className={`${renderClassName ?? ''}`} key={id} style={BulkJobAccordionHelper.getCellStyle(width)}>{render(props.job)}</div>\n ))}\n \n <div className={`d-flex justify-content-end ${isDisabled ? '' : 'cursor-pointer'}`} style={BulkJobAccordionHelper.getCellStyle(200)}>\n {!isDisabled && (<div className={`${styles.seeMore} text-info`}>\n {isExpanded ? getPhrase('seeLess') : getPhrase('seeMore')}\n </div>)}\n </div>\n </div>\n \n {isExpanded && (\n <div className='bg-white border-bottom cursor-default' onClick={e => e.stopPropagation()}>\n {props.jobDetailsComponent(props.job)}\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nexport interface BulkJobsQueryParams {\n cursor: string;\n userType?: UserGroup | UserGroup[];\n bulkActionType?: BatchJobType | BatchJobType[];\n sort: 'newest' | 'oldest';\n jobStatus?: string[];\n}\n\ninterface BulkJobsFiltersProps {\n queryParams: BulkJobsQueryParams;\n appLink: Core.AppLink;\n filters: SearchFilter[];\n analyticsOptions?: AnalyticsOptions;\n}\n\nexport function BulkJobsFilters(props: BulkJobsFiltersProps): JSX.Element {\n return (\n <SearchFilters\n queryParams={props.queryParams}\n mainFilters={props.filters}\n appLink={props.appLink}\n analyticsOptions={props.analyticsOptions}\n hideHeading\n hideDivider\n constantIndices={[]}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"bulkCheckbox\":\"XeoQi\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { BulkJobsAccordionItem } from 'libs/shared/components/bulk-job-accordion/bulk-jobs-accordion-item/BulkJobsAccordionItem';\nimport { BulkJobAccordionHelper } from 'libs/shared/components/bulk-job-accordion/BulkJobsAccordionHelper';\nimport { BulkJobsFilters, BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardPollJobFn } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { BatchJob, BatchJobCollection } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport styles from './bulk-jobs-accordion.scss';\n\nconst namespace = 'shared.bulkJobsAccordions';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface BulkJobsAccordionColumn {\n id: keyof BatchJob | 'checkboxes';\n header: string;\n headerClassName?: string;\n render: (val: BatchJob) => JSX.Element | string;\n renderClassName?: string;\n width: number;\n}\n\ninterface BulkJobsAccordionProps {\n jobs: BatchJobCollection;\n queryParams: BulkJobsQueryParams;\n appLink: Core.AppLink;\n onClickExport: (ids: string[]) => Promise<void>;\n jobDetailsComponent: (job: BatchJob) => JSX.Element;\n pinnedComponent?: () => JSX.Element;\n imageCdnUrl: string;\n onPollJob?: (id: string) => WizardPollJobFn;\n columns: BulkJobsAccordionColumn[];\n filters: SearchFilter[];\n forceExpand?: (job: BatchJob) => boolean;\n disableExpand?: (job: BatchJob) => boolean;\n}\n\nexport function BulkJobsAccordion(props: BulkJobsAccordionProps): JSX.Element {\n const [ showExportSpinner, setShowExportSpinner ] = React.useState(false);\n \n const CheckboxHelper = useBulkCheckboxManager(props.jobs.data);\n const alerts = useAlerts();\n\n function onClickExport(): void {\n if (showExportSpinner)\n return;\n\n setShowExportSpinner(true);\n\n const selectedIds = CheckboxHelper.getSelected();\n\n props.onClickExport(selectedIds)\n .then(() => alerts.success(getPhrase('exportSuccess')))\n .catch(() => alerts.error(getPhrase('exportError')))\n .finally(() => setShowExportSpinner(false));\n }\n\n return (\n <div className={`${styles.container} pe-3`}>\n <div className='d-flex align-items-center pb-2 mt-3'>\n {/* bulk checkbox */}\n <Checkbox\n className={styles.bulkCheckbox}\n id='bulk-audit-log-checkbox'\n checked={CheckboxHelper.bulkChecked}\n onChange={CheckboxHelper.onToggleBulk}\n indeterminate={CheckboxHelper.hasSomeSelections()}\n />\n\n <div className='ms-4'>\n <BulkJobsFilters\n queryParams={props.queryParams}\n appLink={props.appLink}\n filters={props.filters}\n />\n </div>\n\n <SpinnerButton\n variant='dark'\n className='ms-auto'\n onClick={onClickExport}\n disabled={!CheckboxHelper.hasSomeSelections() || showExportSpinner}\n showSpinner={showExportSpinner}\n >\n <Text namespace={namespace} phrase='export' />\n </SpinnerButton>\n </div>\n \n {/* table columns header */}\n <div className='d-flex no-wrap mb-2 fw-semibold px-4 py-2'>\n <div style={BulkJobAccordionHelper.getCellStyle(60)}></div>\n {props.columns.map(({ id, header, headerClassName, width }) => (\n <div key={id} className={headerClassName} style={BulkJobAccordionHelper.getCellStyle(width)}>{header}</div>\n ))}\n <div style={BulkJobAccordionHelper.getCellStyle(200)}></div>\n </div>\n\n {/* table content*/}\n {/* pinned content at the top if has*/}\n {!!props.pinnedComponent && props.pinnedComponent()}\n\n {/* main content */}\n {!!props.jobs.data.length && props.jobs.data.map(job => {\n return (\n <BulkJobsAccordionItem\n key={job.id}\n job={job}\n onToggleCheckbox={CheckboxHelper.onToggleItem}\n isChecked={CheckboxHelper.isChecked}\n jobDetailsComponent={props.jobDetailsComponent}\n onClickExport={props.onClickExport}\n imageCdnUrl={props.imageCdnUrl}\n onPollJob={props.onPollJob}\n columns={props.columns}\n forceExpand={props.forceExpand}\n disableExpand={props.disableExpand}\n />\n );\n })}\n\n {/* pagination */}\n {!!props.jobs.pagination?.cursors && (\n <Pagination\n className='p-0 text-end pb-3 mt-3'\n cursors={props.jobs.pagination.cursors}\n appLink={ContextService.getCurrentRoute().appLink}\n buttonVariant='outline-dark'\n />\n )}\n </div>\n );\n}","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { WizardPolling, WizardPollJobFn } from 'libs/shared/components/wizard/status/polling/WizardPolling';\n\ninterface SyncJobPollingProps {\n jobId: string;\n onCompleted: () => void;\n onPollJob: (id: string) => WizardPollJobFn;\n}\n\nexport function SyncJobPolling(props: SyncJobPollingProps): JSX.Element {\n if (!props.jobId)\n return (\n <div className='text-center'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n );\n\n return (\n <div>\n <div className='mb-4'>\n <WizardPolling\n jobId={props.jobId}\n pollJob={props.onPollJob(props.jobId)}\n onStatusCompleted={props.onCompleted}\n actionName='Sync'\n actionVerb='Update'\n progressVerbPhrase={LanguageService.getPhrase('rostering.syncJobPolling', 'progressVerb')}\n />\n </div>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"failed\":\"BSIaY\",\"tag\":\"NOJhh\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BatchJob, RosteringSyncBatchJobSummary } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './sync-job-summary.scss';\n\nconst namespace = 'rostering.syncJobSummary';\n\ninterface SyncJobSummaryProps {\n job: BatchJob;\n getJobSummary: (id: string) => Promise<RosteringSyncBatchJobSummary>;\n}\n\nexport function SyncJobSummary(props: SyncJobSummaryProps): JSX.Element {\n const [ summary, setSummary ] = React.useState<RosteringSyncBatchJobSummary>(null);\n const [ isFetchingSummary, setIsFetchingSummary ] = React.useState(false);\n function onFetchSummary() {\n setIsFetchingSummary(true);\n\n props.getJobSummary(props.job.id)\n .then(result => {\n setSummary(result);\n }).finally(() => {\n setIsFetchingSummary(false);\n });\n }\n\n React.useEffect(() => {\n if (!summary) {\n onFetchSummary();\n }\n }, [props.job.id]);\n\n function getCategoryList(name: keyof RosteringSyncBatchJobSummary) {\n let bgColor = '';\n let icon = '';\n switch (name) {\n case 'staff':\n bgColor = 'bg-navy';\n icon = cvSvgLibrary.Staff;\n break;\n case 'learners':\n bgColor = 'bg-blue';\n icon = cvSvgLibrary.GraduationCap;\n break;\n case 'classrooms':\n bgColor = 'bg-teal';\n icon = cvSvgLibrary.Classrooms;\n break;\n\n default:\n break;\n }\n\n const displayedSummaryKeys = Object.keys(summary[name]).filter(k => {\n return k !== 'totalProcessed' && k !== 'totalSucceeded';\n });\n\n return (\n <div className='col'>\n <div className='py-3 ps-2 pe-3 rounded border'>\n <div className='d-flex align-items-center px-2 mb-2'>\n <div className={`${bgColor} ${styles.badge} d-flex align-items-center rounded-circle text-white ps-0 me-2`}>\n <SvgContainer\n className={`svg-container ${styles.svg}`}\n size={SvgContainerSize.Standard}\n svgName={icon}\n />\n </div>\n <Text namespace={namespace} phrase={name}/>\n </div>\n <ul className='mb-0'>\n {displayedSummaryKeys?.map((k: string) => {\n return (\n <li className='mb-2' key={k}>\n <div className='d-flex'>\n <div className={`rounded-pill me-2 px-2 d-inline-flex align-items-center fw-semibold ${k === 'errored' ? styles.failed : styles.tag}`}>{(summary[name] as HashObject)[k]}</div>\n <Text namespace={namespace} phrase={k}/>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n );\n }\n return (\n <>\n {(isFetchingSummary && !summary) && (\n <div className='text-center py-3'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n {!!summary && (\n <div className='row gx-3 mt-2'>\n {getCategoryList('staff')}\n {getCategoryList('learners')}\n {getCategoryList('classrooms')}\n </div>\n )}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SyncJobPolling } from 'libs/shared/components/rostering/sync-job-polling/SyncJobPolling';\nimport { SyncJobSummary } from 'libs/shared/components/rostering/sync-job-summary/SyncJobSummary';\nimport { WizardPollJobFn } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { BatchJob, RosteringSyncBatchJobSummary } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'rostering.syncJobDetails';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncJobDetailsProps {\n job: BatchJob;\n summary?: RosteringSyncBatchJobSummary;\n getJobSummary: (id: string) => Promise<RosteringSyncBatchJobSummary>;\n onClickExport: (ids: string[]) => Promise<void>;\n onPollJob?: (id: string) => WizardPollJobFn;\n onCompleted?: () => void;\n}\n\nexport function SyncJobDetails(props: SyncJobDetailsProps): JSX.Element {\n const canExport = props.job.status === BatchJobStatus.Completed\n || props.job.status === BatchJobStatus.CompletedWithError;\n\n const alerts = useAlerts();\n\n function getContent() {\n switch (props.job.status) {\n case BatchJobStatus.InProgress:\n case BatchJobStatus.Pending:\n case BatchJobStatus.Queued:\n case BatchJobStatus.Submitted:\n return (\n <SyncJobPolling\n jobId={props.job.id}\n onCompleted={props.onCompleted}\n onPollJob={props.onPollJob}\n />\n );\n\n case BatchJobStatus.Failed:\n // failed job cannot be expanded, since we don't have helpful error message for now\n return <></>;\n\n case BatchJobStatus.Completed:\n case BatchJobStatus.CompletedWithError:\n return <SyncJobSummary job={props.job} getJobSummary={props.getJobSummary} />;\n\n default:\n return <></>;\n }\n }\n\n function onClickExport() {\n props.onClickExport([props.job.id])\n .then(() => {\n alerts.success(getPhrase('exportSuccess'));\n })\n .catch(() => {\n alerts.error(getPhrase('exportError'));\n });\n }\n\n return (\n <div className='py-3 px-4' >\n <div className='d-flex justify-content-between'>\n {props.job.status !== BatchJobStatus.InProgress && <h1 className='h4'>{getPhrase('heading')}</h1>}\n \n {canExport && (\n <IconButton\n className='btn btn-outline-dark fw-semibold'\n svgName={cvSvgLibrary.Download}\n onClick={onClickExport}\n >\n {getPhrase('export')}\n </IconButton>\n )}\n </div>\n \n {getContent()}\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"B8miR\",\"logoWrapper\":\"higtD\",\"cog\":\"bNPxa\"};","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { BulkJobsAccordion, BulkJobsAccordionColumn } from 'libs/shared/components/bulk-job-accordion/BulkJobsAccordion';\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { ClickViewAvatar } from 'libs/shared/components/clickview-avatar/ClickViewAvatar';\nimport { SyncJobDetails } from 'libs/shared/components/rostering/sync-job-details/SyncJobDetails';\nimport { SyncStatusBadge } from 'libs/shared/components/rostering/sync-status-badge/SyncStatusBadge';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { WizardPollJobFn } from 'libs/shared/components/wizard/status/polling/WizardPolling';\nimport { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJob, BatchJobCollection, RosteringSyncBatchJobSummary, RosteringSyncMetadata } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './sync-jobs-accordion.scss';\n\nconst namespace = 'rostering.syncJobsAccordion';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncJobsAccordionsProps {\n jobs: BatchJobCollection;\n queryParams: BulkJobsQueryParams;\n appLink: Core.AppLink;\n onClickExport: (ids: string[]) => Promise<void>;\n getJobSummary: (id: string) => Promise<RosteringSyncBatchJobSummary>;\n imageCdnUrl: string;\n onPollJob?: (id: string) => WizardPollJobFn;\n onCompleted?: () => void;\n pinnedComponent?: () => JSX.Element;\n}\n\nfunction getSortOptions(): FilterOption[] {\n return [{\n id: 'newest',\n name: LanguageService.getPhrase(namespace, 'newest'),\n default: true\n },\n {\n id: 'oldest',\n name: LanguageService.getPhrase(namespace, 'oldest')\n }];\n}\n\nconst IN_PROGRESS_GROUP = [\n BatchJobStatus.InProgress,\n BatchJobStatus.Pending,\n BatchJobStatus.Queued,\n BatchJobStatus.Submitted\n];\n\nfunction renderSubmiter(job: BatchJob, props: SyncJobsAccordionsProps): JSX.Element {\n if (job.submittedByClickView) {\n return (\n <div className='d-flex align-items-center'>\n <SvgContainer2 className='me-2 rounded-circle border' size={SvgContainerSize.Large}>\n <ClickViewAvatar />\n </SvgContainer2>\n {job.submitterName}\n </div>\n );\n }\n\n if (job.submitterName) {\n return (\n <div className='d-flex align-items-center'>\n <div className={`me-2 ${styles.avatar}`}>\n <Avatar\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(job.submitterName.split(' ')[0], job.submitterName.split(' ')[1])}\n />\n </div>\n {job.submitterName}\n </div>\n );\n }\n // if job.submitterName is null it's triggered by scheduled sync\n return (\n <div className='me-2 d-flex align-items-center'>\n <div className={`${styles.cog} me-2 rounded-circle text-white bg-dark d-flex align-items-center justify-content-center`}>\n <SvgContainer\n svgName={cvSvgLibrary.Cog}\n className='svg-container'\n />\n </div>\n {getPhrase('scheduledSubmitter')}\n </div>\n );\n}\n\nexport function SyncJobsAccordion(props: SyncJobsAccordionsProps): JSX.Element {\n const filters = [\n Filters.SortBy(getSortOptions()),\n Filters.JobStatus()\n ];\n\n const columns: BulkJobsAccordionColumn[] = [{\n id: 'id',\n header: getPhrase('syncFrom'),\n headerClassName: 'px-2 py-1',\n renderClassName: 'px-2',\n render: job => {\n const rosterSource = (job.metadata as RosteringSyncMetadata)?.source;\n // unknown roster source\n if (!rosterSource)\n return <></>;\n\n const source = HardCoded.Rostering.sources[rosterSource];\n if (!source) {\n throw new DevError('Unsupported rostering sync source, please add it to HardCoded rostering source');\n }\n\n return (\n <div className={`bg-white rounded-circle border ${styles.logoWrapper} d-flex align-items-center justify-content-center`}>\n <Tooltip spanHack title={source.name}>\n <img src={source.iconUrl} alt={source.name}/>\n </Tooltip>\n </div>\n );\n },\n width: 120\n }, {\n id: 'dateCreated',\n header: getPhrase('date'),\n headerClassName: 'px-2 py-1',\n renderClassName: 'px-2',\n render: job => DateHelper.format(job.dateCreated, 'DD/MM/YYYY, hh:mmA'),\n width: 220\n }, {\n id: 'status',\n header: getPhrase('status'),\n headerClassName: 'px-2 py-1',\n renderClassName: 'px-2',\n render: job => (\n <SyncStatusBadge status={job.status}/>\n ),\n width: 200\n }, {\n id: 'submitterName',\n header: getPhrase('performedBy'),\n headerClassName: 'px-2',\n renderClassName: 'px-2',\n render: job => renderSubmiter(job, props),\n width: 200\n }];\n\n function forceExpand(job: BatchJob) {\n return IN_PROGRESS_GROUP.includes(job.status);\n }\n\n function disableExpand(job: BatchJob) {\n return job.status === BatchJobStatus.Failed;\n }\n\n return (\n <BulkJobsAccordion\n {...props}\n filters={filters}\n jobDetailsComponent={job => (\n <SyncJobDetails\n job={job}\n getJobSummary={props.getJobSummary}\n onPollJob={props.onPollJob}\n onClickExport={props.onClickExport}\n onCompleted={props.onCompleted}\n />\n )}\n columns={columns}\n forceExpand={forceExpand}\n disableExpand={disableExpand}\n />\n );\n}\n","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.districtRosterEmptyState';\n\nexport function DistrictRosteringEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.DISTRICT_ROSTERING} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-2'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n <EmptyState.Info className='w-50 mb-1 fw-semibold'><Text namespace={namespace} phrase='strongInfo' /></EmptyState.Info>\n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n </EmptyState>\n );\n}","\nimport React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.noResults';\n\nexport function NoResultsEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.EMPTY_RESULTS} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-1'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.noSyncJobs';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\ninterface NoSyncJobsEmptyStateProps {\n onStartFullSync: () => void;\n}\n\nexport function NoSyncJobsEmptyState(props: NoSyncJobsEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.NO_SYNC_JOBS} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-3'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('learnMore')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n <EmptyState.Cta\n className='btn btn-dark'\n onClick={props.onStartFullSync}\n text={getPhrase('emptyCta')}\n />\n </EmptyState>\n );\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/react/index';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { PartialSyncJobsList } from 'libs/shared/components/rostering/partial-loading/PartialSyncJobsList';\nimport { RosteringSettingHeader } from 'libs/shared/components/rostering/rostering-header/RosteringSettingHeader';\nimport { ScheduledSyncJobItem } from 'libs/shared/components/rostering/scheduled-sync-job-item/ScheduledSyncJobItem';\nimport { SyncActionButtonGroup } from 'libs/shared/components/rostering/sync-action-button-group/SyncActionButtonGroup';\nimport { SyncJobsAccordion } from 'libs/shared/components/rostering/sync-jobs-accordion/SyncJobsAccordion';\nimport { RosteringHelper } from 'libs/shared/components/rostering/utils/RosteringHelper';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useLockContentWidth } from 'libs/shared/hooks/useLockContentWidth';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BatchJobCollection, BatchJobProgress, Config, CurrentUser, RosteringResponse, RosteringSyncBatchJobSummary, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { JobRequests } from 'shared/flight-requests/JobRequests';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { DistrictRosteringEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/district-rostering-empty-state/DistrictRosteringEmptyState';\nimport { NoResultsEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/no-results-empty-state/NoResultsEmptyState';\nimport { NoSyncJobsEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/no-sync-jobs-empty-state/NoSyncJobsEmptyState';\nimport { RequiresSetUpEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState';\nimport { useSyncRostering } from 'apps/settings/views/rostering/utils/useSyncRostering';\n\nconst namespace = 'rostering.syncList';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringSyncListViewProps {\n queryParams: BulkJobsQueryParams;\n}\n\nexport function RosteringSyncListView(props: RosteringSyncListViewProps): JSX.Element {\n const syncJobs = Flight.useBasicFetch<BatchJobCollection>(RosteringRequests.getSyncList(props.queryParams));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const settings = Flight.useBasicFetch<ScheduleSettingResponse>(currentUser.data && rostering.data &&\n RosteringRequests.getSyncScheduleSettings(rostering.data.id));\n\n const dataLoaded = syncJobs.hasCompleted && config.hasCompleted && settings.hasCompleted && rostering.hasCompleted;\n\n useLockContentWidth();\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const dispatch = useDispatch();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n function getJobSummary(id: string): Promise<RosteringSyncBatchJobSummary> {\n return fetchAsync(RosteringRequests.getJobSummary(id));\n }\n\n function onPollJob(id: string) {\n return function(onSuccess: (progress: BatchJobProgress) => void, onError: (xhr: Xhr) => void) {\n return fetchAsync(JobRequests.getJobProgress(id, onSuccess, onError));\n };\n }\n\n function onCompleted() {\n dispatch({\n type: Flight.Actions.INVALIDATE,\n keys: ['rostering:sync'],\n request: null\n });\n }\n\n function onClickExport(jobIds: string[]): Promise<void> {\n return fetchAsync<void>(JobRequests.sendJobReports(jobIds));\n }\n\n function getContent() {\n // controlled by district\n if (rostering.data?.status === 'Managed')\n return <DistrictRosteringEmptyState/>;\n\n // has not set up rostering\n if (rostering.data?.status === 'None')\n return <RequiresSetUpEmptyState/>;\n\n if (!dataLoaded)\n return <PartialSyncJobsList />;\n\n if (!syncJobs.data.data.length && !props.queryParams)\n return <NoSyncJobsEmptyState onStartFullSync={syncNow}/>;\n\n const nextScheduled = RosteringHelper.getScheduledJobBySetting(settings.data);\n\n return (\n <>\n <SyncJobsAccordion\n jobs={syncJobs.data}\n queryParams={props.queryParams}\n appLink={{\n application: AppChannels.SETTINGS,\n action: Actions.Settings.ROSTERING\n }}\n onClickExport={onClickExport}\n getJobSummary={getJobSummary}\n imageCdnUrl={config.data.imageCdnUrl}\n onPollJob={onPollJob}\n onCompleted={onCompleted}\n pinnedComponent={\n nextScheduled\n ? () => <ScheduledSyncJobItem scheduledDate={nextScheduled} />\n : null\n }\n />\n {!syncJobs.data.data.length && props.queryParams && <NoResultsEmptyState />}\n </>\n );\n }\n\n const showTabAndButton = dataLoaded && rostering.data?.status === 'Active';\n\n const { syncNow, fullSync } = useSyncRostering(currentUser.data);\n\n function renderButton() {\n if (!showTabAndButton)\n return <></>;\n return <SyncActionButtonGroup onSyncNow={syncNow} onFullSync={fullSync}/>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n headingButton={renderButton}\n requiredPermissions={PermissionName.Rostering}\n >\n {showTabAndButton && (\n <RosteringSettingHeader\n active='syncJobs'\n appLinks={{\n syncJobs: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING },\n settings: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING_SETTINGS }\n }}\n />\n )}\n {getContent()}\n </SettingsLayout>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.requiresSetUp';\n\nexport function RequiresSetUpEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.REQUIRES_SET_UP} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-3'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n \n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n \n <ExternalLink\n className='btn btn-dark'\n href={ArticleHelper.getSupportRequestUrl()}\n newTab\n >\n <Text namespace={namespace} phrase='button'/>\n </ExternalLink>\n \n </EmptyState>\n );\n}","import { AlertType, BaseAlert } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.syncUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useSyncRostering = (currentUser: CurrentUser) => {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n if (!currentUser) {\n return { syncNow: () => {}, fullSync: () => {} };\n }\n\n function syncNow() {\n const alert: BaseAlert = {\n type: AlertType.Success,\n heading: getPhrase('startSyncAlertHeading'),\n message: getPhrase('startSyncAlertBody'),\n appLinkText: getPhrase('startSyncAlertAppLinkText'),\n appLinkClassName: 'info-link'\n };\n\n const data = {\n name: BatchJobName.Rostering,\n type: BatchJobType.Rostering,\n metadata: {\n targetMasterId: currentUser.customerId,\n targetMasterType: MasterType.Customer\n },\n customerId: currentUser.customerId,\n dataType: BatchDataType.Learner\n };\n fetchAsync(RosteringRequests.createJob(\n data,\n () => {\n alerts.success(alert);\n },\n () => {\n alerts.error(getPhrase('error'));\n }\n ));\n }\n\n function fullSync() {\n // todo\n }\n return { fullSync, syncNow };\n};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};","\"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":["PartialSearchFilters","count","className","Array","fill","map","item","index","key","TabContents","props","tab","svgName","name","type","data","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","active","appLink","analyticsData","analyticsOptions","onClick","onSelect","onSelectTab","defaultProps","namespace","RosteringSettingHeader","appLinks","syncJobs","settings","getPhrase","LanguageService","SyncActionButtonGroup","role","Tooltip","title","spanHack","placement","spanHackClassName","onSyncNow","now","Date","RosteringHelper","parseUTCToLocal","utcHour","utcWeekdays","utcMinute","local","weekday","localWeekdays","w","getDay","hour","daysOfWeek","minute","getScheduledJobBySetting","setting","fullSyncSchedule","enabled","schedule","scheduledDate","weekdayOfToday","scheduledWeekday","sort","a","b","scheduledToday","includes","setHours","nextScheduledDate","nextScheduledWeekday","find","d","gap","Math","abs","setDate","getDate","PartialTagItem","tagClass","classNames","TagWidgetItem","colorClass","selectedItems","selection","id","tag","WizardInProgress","percentage","floor","totalItemsComplete","totalItems","Text","phrase","options","actionName","SvgContainer","actionVerb","progressVerbPhrase","objectType","MasterType","userType","UserGroup","totalComplete","total","smartCount","ProgressBar","variant","WizardSubmitted","POLLING_INTERVAL","MAX_CONSECUTIVE_ERROR_COUNT","WizardPolling","progress","setProgress","consecutiveErrorCount","setConsecutiveErrorCount","timeoutIdRef","navLock","useNavLock","dispatch","pollJob","onPollSuccess","onPollError","currentProgress","status","BatchJobStatus","window","setTimeout","navLockId","unlock","params","jobId","keys","request","statusCompleteAppLink","onStatusCompleted","onCompleteJob","current","xhr","clearTimeout","currentVal","processedItems","RosteringRequests","getRostering","url","getSyncList","queryParams","cursor","order","jobStatus","statuses","push","createJob","success","error","invalidationKeys","getJobSummary","getSyncScheduleSettings","integrationId","updateScheduleSetting","always","customerId","useBulkCheckboxManager","collection","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","clear","isChecked","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","set","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","from","bulkChecked","deselectAll","hasSomeSelections","getSelectedCount","size","getMap","useLockContentWidth","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","breadcrumbs","heading","headingButton","description","children","PartialRow","PartialHeader","PartialSyncJobsTable","PartialSyncJobsList","SyncStatusBadge","baseClass","getClassName","getName","ScheduledSyncJobItem","DateHelper","BulkJobAccordionHelper","getCellStyle","width","flex","BulkJobsAccordionItem","forceExpand","job","isExpanded","setIsExpanded","isDisabled","disableExpand","s","style","e","stopPropagation","Checkbox","checked","onChange","onToggleCheckbox","columns","render","renderClassName","jobDetailsComponent","BulkJobsFilters","SearchFilters","mainFilters","filters","hideHeading","hideDivider","constantIndices","BulkJobsAccordion","showExportSpinner","setShowExportSpinner","CheckboxHelper","jobs","alerts","indeterminate","SpinnerButton","selectedIds","onClickExport","then","disabled","showSpinner","header","headerClassName","pinnedComponent","imageCdnUrl","onPollJob","pagination","cursors","Pagination","ContextService","buttonVariant","SyncJobPolling","onCompleted","Spinner","as","animation","SyncJobSummary","summary","setSummary","isFetchingSummary","setIsFetchingSummary","getCategoryList","bgColor","icon","displayedSummaryKeys","Object","filter","k","S","result","SyncJobDetails","canExport","IconButton","getContent","IN_PROGRESS_GROUP","SyncJobsAccordion","default","rosterSource","metadata","source","HardCoded","DevError","src","iconUrl","alt","dateCreated","submittedByClickView","SvgContainer2","ClickViewAvatar","submitterName","Avatar","initials","UserHelper","split","renderSubmiter","DistrictRosteringEmptyState","EmptyState","ImageUrls","NoResultsEmptyState","NoSyncJobsEmptyState","onStartFullSync","text","RosteringSyncListView","config","ConfigRequests","currentUser","UserRequests","rostering","dataLoaded","hasCompleted","fetchAsync","onSuccess","onError","JobRequests","jobIds","useSetPageMetadata","showTabAndButton","useSyncRostering","syncNow","fullSync","onFullSync","PermissionName","RequiresSetUpEmptyState","nextScheduled","href","newTab","alert","message","appLinkText","appLinkClassName","targetMasterId","targetMasterType","dataType","B","getPercentage","min","max","round","renderProgressBar","label","visuallyHidden","striped","animated","bsPrefix","isChild","rest","wrapperProps","child","cloneElement","displayName"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>u});var r=n(32735),a=n(23481),i=n(40782),c=n(36532),o=a.T.encloseNamespace("interactives.pendingIndicator");function l(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function u(e){var t=function(){return r.createElement("div",{className:l(e)},!!e.showLabel&&r.createElement("em",null,o("pending")),r.createElement(i.O,null))};return e.title?r.createElement(c.u,{title:e.title,spanHack:!0,spanHackClassName:e.tooltipClassName||"h-100 w-100 d-flex align-items-center"},r.createElement(t,null)):r.createElement(t,null)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>R,bB:()=>B,l8:()=>H,R7:()=>j,lE:()=>_,Fx:()=>L});var r=n(32735),a=n(23481),i=n(75896),c=n(34079),o=n(26136),l=n(39157),u=n(97364),s=n(40782),d=n(80845),m=n(26378),f=n(71151),v=n(93264),g=n(84120);function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map((function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,i,c=(a=t,i=e.selectedInteraction,a.interactions.find((function(e){return e.id===i.id}))||a.interactions[0]),o=c.id===e.selectedInteraction.id,l=o?g.w.getTypeInfo(c.typeId).bgClassName:"bg-gray-500",u=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(u,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(l)}),!!o&&r.createElement("div",null,v.T.ToDisplayDuration(t.visibleAt)))}))):r.createElement(r.Fragment,null)}var p=n(86572);var h=a.T.encloseNamespace("shared.interactionResultsSummary");function y(e){var t,n=r.useMemo((function(){return(0,l.nq)(e.interaction,e.results)}),[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(p.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,h("correctlyAnswered")),r.createElement(s.O,{percentage:n.percentCorrect,layout:s.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,h("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,h("unanswered")),r.createElement("span",null,n.unanswered)))))}var E=r.forwardRef((function(e,t){var n=e.interaction,a=e.interactive,i=e.interactiveMetadata,c=e.results,o=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(f.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},o),r.createElement(f.Z.Body,null,r.createElement(y,{interaction:n,interactive:a,interactiveMetadata:i,results:c}))))})),b=n(19912);function C(e){var t;return r.createElement(m.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(E,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(b.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var N=n(83914),I=n(28972),M=n(83140),k=n(35223);function A(e){var t="".concat(b.Z.resultsCellInner," h-100 position-relative");return e===I.w.Correct&&(t+=" ".concat(b.Z.correct)),e===I.w.Incorrect&&(t+=" ".concat(b.Z.incorrect," text-danger")),e===I.w.AwaitingMarking&&(t+=" ".concat(b.Z.awaitingMarking)),e===I.w.UnAnswered&&(t+=" ".concat(b.Z.unanswered," text-warning")),t}function S(e){var t=M.A.isInteractionCorrect(e.interaction,(0,d.j_)(e.studentResults)),n=function(e){return e===I.w.Correct?k.vn.Check:e===I.w.Incorrect?k.vn.Close:e===I.w.UnAnswered?k.vn.Minus:void 0}(t);return r.createElement("div",{className:A(t)},!!n&&r.createElement(N.x,{svgName:n}),t===I.w.AwaitingMarking&&r.createElement(c.O,null))}var O=a.T.encloseNamespace("shared.studentResultsTable"),R=60;function x(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function Z(e){return r.createElement(x,{className:e.column.isSorted&&"fw-bold"},O(e.phraseKey))}function j(e,t){var n,a=!!(null===(n=e.students)||void 0===n?void 0:n.length);return r.useMemo((function(){return[{id:"name",Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"name"})},accessor:function(e){return e},Cell:function(e){var n=e.value;return r.createElement(x,null,r.createElement("span",{className:"text-truncate"},(0,o.B)(n.user||n.publicUser,t)))},disableSortBy:!a},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!a,Cell:function(e){var t=e.value;return r.createElement(x,null,t)}},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:125,sortDescFirst:!0,disableSortBy:!a},{Header:function(e){var t=e.column;return r.createElement(Z,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(x,null,r.createElement(c.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(x,null,r.createElement(s.O,{percentage:t.percentCorrect,layout:s.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!a}]}),[t,a])}function _(e,t,n,a,i){return r.useMemo((function(){return(0,d.Q)(e).map((function(i,c){return{Header:function(){return r.createElement(C,{interaction:i,results:n,interactive:e,interactiveMetadata:t,interactionNumber:c+1,onMouseEnter:function(){return a(c)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:i.id,disableSortBy:!0,width:R,Cell:function(e){var t=e.row.original;return r.createElement(S,{interaction:i,studentResults:t})}}}))}),[i])}function L(e,t,n,a,c,s){return r.useMemo((function(){var n=[];if(t.students.forEach((function(t){var r=(0,l.Rt)(e,t);s&&(0,u.C)(s,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))})),"user"===(null==c?void 0:c.id)){var r=i.m.sortBy(n,(function(e){return(0,o.B)(e.user,a)}));return c.desc?r.reverse():r}if("summary.unanswered"===(null==c?void 0:c.id)){var d=i.m.sortBy(n,(function(e){return e.summary.unanswered}));return c.desc?d.reverse():d}if("score"===(null==c?void 0:c.id)||"percentage"===(null==c?void 0:c.id)){var m=i.m.sortBy(n,(function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect}));return c.desc?m.reverse():m}return n}),[n,c,a,s])}function B(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e){e.childNodes.forEach((function(e,n){e.classList.remove(b.Z.highlightColumn),n===t&&e.classList.add(b.Z.highlightColumn)}))}))}}function H(e,t){if(e){var n=e.querySelectorAll(".".concat(b.Z.resultsRow));null==n||n.forEach((function(e,n){e.classList.remove(b.Z.highlightResultsRow),n===t&&e.classList.add(b.Z.highlightResultsRow)}))}}},39157:(e,t,n)=>{n.d(t,{HI:()=>m,R6:()=>u,Rt:()=>v,UU:()=>d,Zs:()=>s,nq:()=>f});var r=n(75896),a=n(94892),i=n(28972),c=n(8246),o=n(83140),l=n(80845);function u(e,t,n){var i={markingRequired:[],lowScore:[],highScore:[],completed:[],notCompleted:[]},c=(0,l.Q)(e).length;t.students.forEach((function(t){var o=Object.assign(Object.assign({},t),{summary:v(e,t)});o.summary.awaitingMarking?i.markingRequired.push(o):r.m.last(t.results).attempts.length===c?(i.completed.push(o),o.summary.percentCorrect>=((null==n?void 0:n.HIGH)||a.i.HIGH)&&i.highScore.push(o),o.summary.percentCorrect<((null==n?void 0:n.MODERATE)||a.i.MODERATE)&&i.lowScore.push(o)):i.notCompleted.push(o)}));var o=r.m.sortBy(i.lowScore,(function(e){return e.summary.percentCorrect})),u=r.m.sortBy(i.highScore,(function(e){return-e.summary.percentCorrect}));return Object.assign(Object.assign({},i),{lowScore:o,highScore:u})}function s(e,t){return(0,l.Wn)(e).find((function(e){return e.id.toString()===t.toString()}))}function d(e){return"".concat(e.questionId,":").concat(e.resultId)}function m(e,t,n){var r=(0,l.j_)(t),a=(0,l.f6)(e,r);return(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Correct})))?c.N.Correct:(null==a?void 0:a.answers.every((function(e){var t;return(null===(t=n[d(e)])||void 0===t?void 0:t.status)===c.N.Incorrect})))?c.N.Incorrect:void 0}function f(e,t){var n=t.students.length,r=0,a=0,c=0,u=0,s=0;return t.students.forEach((function(t){var n=(0,l.j_)(t);if(n){s+=t.results.length;var d=o.A.isInteractionCorrect(e,n);d===i.w.Correct&&r++,d===i.w.UnAnswered&&c++,d===i.w.AwaitingMarking&&u++,d!==i.w.UnAnswered&&a++}})),{percentCorrect:n>0?r/n:0,correct:r,answered:a,unanswered:c,awaitingMarking:u,attempts:s}}function v(e,t){var n=(0,l.j_)(t),r=(0,l.Q)(e),a=r.length,c=0,u=0;r.forEach((function(e){var t=o.A.isInteractionCorrect(e,n);t===i.w.Correct&&c++,t===i.w.AwaitingMarking&&u++}));var s=a>0?c/a:0,d=new Set(r.map((function(e){return e.id}))),m=n.attempts.filter((function(e){var t;return!!d.has(null===(t=null==e?void 0:e.answers[0])||void 0===t?void 0:t.questionId)})).length;return{answered:m,attempts:t.results.length,unanswered:a-m,percentCorrect:s,correct:c,awaitingMarking:u}}},97364:(e,t,n)=>{n.d(t,{C:()=>i,P:()=>a});var r=n(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function i(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},28972:(e,t,n)=>{var r;n.d(t,{w:()=>r}),function(e){e[e.Correct=0]="Correct",e[e.Incorrect=1]="Incorrect",e[e.AwaitingMarking=2]="AwaitingMarking",e[e.Answered=3]="Answered",e[e.UnAnswered=4]="UnAnswered",e[e.NotApplicable=5]="NotApplicable"}(r||(r={}))},8246:(e,t,n)=>{var r;n.d(t,{N:()=>r}),function(e){e[e.Incorrect=0]="Incorrect",e[e.Correct=1]="Correct",e[e.PendingReview=2]="PendingReview"}(r||(r={}))},83140:(e,t,n)=>{n.d(t,{A:()=>g});var r=n(28972),a=n(8246),i=n(38129);function c(e){return c="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},c(e)}function o(e,t,n){return(t=function(e){var t=function(e){if("object"!=c(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=c(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==c(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(){return r.w.NotApplicable}function u(e,t){var n=e.actionableItems.filter((function(e){return e.isCorrect}));return n.every((function(e){return!t(e.id)}))?r.w.UnAnswered:n.every((function(e){var n;return e.name.trim().toLowerCase()===(null===(n=t(e.id))||void 0===n?void 0:n.trim().toLowerCase())}))?r.w.Correct:r.w.Incorrect}function s(e,t){return e.actionableItems.every((function(e){return!t(e.id)}))?r.w.UnAnswered:e.actionableItems.filter((function(e){return e.isCorrect})).every((function(e){var n,r=t(e.id);return(null==r?void 0:r.toString())===(null===(n=e.id)||void 0===n?void 0:n.toString())||r===e.name}))?r.w.Correct:r.w.Incorrect}function d(e,t){return function(n){var r=t.attempts.find((function(t){return t.id===e.id}));return null==r?void 0:r.answers.find((function(e){return e.id===n}))}}function m(e,t){var n=d(e,t);return s(e,(function(e){var t=n(e);return null==t?void 0:t.text}))}function f(e,t){return function(e,t){var n;return e.actionableItems.forEach((function(e){var i=t(e.id);n=i?i.status!==a.N.Correct?i.status!==a.N.Incorrect?r.w.AwaitingMarking:r.w.Incorrect:r.w.Correct:r.w.UnAnswered})),n}(e,d(e,t))}var v=o(o(o(o(o(o(o({},i.Z9.Annotation,l),i.Z9.Image,l),i.Z9.MissingWord,(function(e,t){var n=d(e,t);return u(e,(function(e){var t=n(e);return null==t?void 0:t.text}))})),i.Z9.MultipleChoice,m),i.Z9.ShortAnswer,f),i.Z9.TrueOrFalse,m),i.Z9.Illustration,f),g={notApplicable:l,awaitingMarking:function(){return r.w.AwaitingMarking},isMissingWordCorrect:u,isMultipleChoiceCorrect:s,isInteractionCorrect:function(e,t){return(0,v[e.typeId])(e,t)}}},80845:(e,t,n)=>{n.d(t,{Q:()=>u,Wn:()=>c,f6:()=>l,j_:()=>o});var r=n(75896),a=n(38129);function i(e){return e.typeId!==a.Z9.Annotation&&e.typeId!==a.Z9.Image}function c(e){return r.m.flatten(e.timepoints.map((function(e){return e.interactions})))}function o(e){return r.m.last(e.results)}function l(e,t){return r.m.findWhere(null==t?void 0:t.attempts,{id:e})}function u(e){return c(e).filter(i)}},19912:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}}}]);
2
- //# sourceMappingURL=4806-384760d9c9-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/4806-384760d9c9-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/analytics/components/pending-indicator/PendingIndicator.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/InteractionsBar.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interactions-bar/interactions-bar.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/interaction-results-summary/interaction-results-summary.scss","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/InteractionHeaderCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultCell.tsx","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/StudentResultsTableUtils.tsx","file:///app/packages/libs/shared/src/apps/analytics/utils/InteractiveUtils.ts","file:///app/packages/libs/shared/src/apps/analytics/utils/StudentTableUtils.ts","file:///app/packages/libs/shared/src/enums/InteractionCorrectness.ts","file:///app/packages/libs/shared/src/enums/InteractiveAnswerStatus.ts","file:///app/packages/libs/shared/src/utils/InteractiveCorrectnessHelper.ts","file:///app/packages/libs/shared/src/utils/InteractiveHelper.ts","file:///app/packages/libs/shared/src/apps/analytics/components/student-results/student-results-table/student-results-table.scss"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PercentageIndicator } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'interactives.pendingIndicator';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getClassName(props: PendingIndicatorProps): string {\n let className = 'd-flex align-items-center h-100';\n\n className += props.showLabel ? ' justify-content-between' : ' justify-content-center';\n\n if (props.className)\n className += ` ${props.className}`;\n\n return className;\n}\n\ninterface PendingIndicatorProps {\n title?: string;\n className?: string;\n showLabel?: boolean;\n tooltipClassName?: string;\n}\n\nexport function PendingIndicator(props: PendingIndicatorProps): JSX.Element {\n const Indicator = () => (\n <div className={getClassName(props)}>\n {!!props.showLabel &&\n <em>{getPhrase('pending')}</em>\n }\n <PercentageIndicator />\n </div>\n );\n\n if (!props.title)\n return <Indicator />;\n\n return (\n <Tooltip title={props.title} spanHack spanHackClassName={props.tooltipClassName || 'h-100 w-100 d-flex align-items-center'}>\n <Indicator />\n </Tooltip>\n );\n}","import React from 'react';\n\nimport { Interaction, Interactive, Timepoint } from 'libs/shared/interfaces';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\nimport { InteractionTypeHelper } from 'libs/shared/utils/interaction-type-helper/InteractionTypeHelper';\n\nimport styles from './interactions-bar.scss';\n\nfunction getInteraction(timepoint: Timepoint, selectedInteraction: Interaction): Interaction {\n return timepoint.interactions.find(i => i.id === selectedInteraction.id) || timepoint.interactions[0];\n}\n\ninterface InteractionBarProps {\n interactive: Interactive;\n duration: number;\n selectedInteraction: Interaction;\n}\n\nexport function InteractionsBar(props: InteractionBarProps): React.ReactElement {\n if (!props.duration)\n return <></>;\n\n return (\n <>\n {props.interactive.timepoints.map((t, i) => {\n if (!t.interactions.length)\n return <></>;\n\n const interaction = getInteraction(t, props.selectedInteraction);\n const isSelected = interaction.id === props.selectedInteraction.id;\n\n const bgClassName = isSelected ? (InteractionTypeHelper.getTypeInfo(interaction.typeId)).bgClassName : 'bg-gray-500';\n\n const left = ((t.visibleAt / 1000) / props.duration) * 100;\n\n return (\n <div\n key={i}\n className={`${styles.container} text-center`}\n style={{ left: `${left}%` }}\n >\n <div className={`${styles.interaction} ${bgClassName}`} />\n {!!isSelected &&\n <div>\n {DurationHelper.ToDisplayDuration(t.visibleAt)}\n </div>\n }\n </div>\n );\n })}\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"Wf1bl\",\"interaction\":\"Fpm49\"};","import React from 'react';\nimport { Popover } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { InteractionsBar } from 'libs/shared/apps/analytics/components/student-results/interactions-bar/InteractionsBar';\nimport { getInteractionResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { InteractionLabel } from 'libs/shared/components/interactive-questions/InteractionLabel';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './interaction-results-summary.scss';\n\nconst namespace = 'shared.interactionResultsSummary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getDuration(interactiveMetadata: InteractiveMetadata): number {\n if (interactiveMetadata._parentClip)\n return interactiveMetadata._parentClip.endTime - interactiveMetadata._parentClip.startTime;\n\n if (!interactiveMetadata._parentVideo.duration)\n return 0;\n\n return interactiveMetadata._parentVideo.duration / 1000;\n}\n\ninterface InteractionResultsSummaryProps {\n interaction: Interaction;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n results: InteractiveResultSet;\n}\n\nfunction InteractionResultsSummary(props: InteractionResultsSummaryProps): JSX.Element {\n const summary = React.useMemo(\n () => getInteractionResultsSummary(props.interaction, props.results),\n [ props.interaction, props.results ]\n );\n\n return (\n <div className='px-1 pt-1'>\n <div className='d-flex'>\n <InteractionLabel\n interaction={props.interaction}\n iconClassName='flex-shrink-0'\n />\n </div>\n <div className={`my-4 ${styles.bar}`}>\n <InteractionsBar\n interactive={props.interactive}\n duration={getDuration(props.interactiveMetadata)}\n selectedInteraction={props.interaction}\n />\n </div>\n <div className='row pt-1 pb-2'>\n <div className='col-6 pe-1'>\n <div className='bg-light rounded p-2 h-100'>\n {!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('correctlyAnswered')}</strong>\n <PercentageIndicator\n percentage={summary.percentCorrect}\n layout={PercentageIndicatorLayout.LabelOnly}\n />\n </div>\n }\n {!!summary.awaitingMarking &&\n <div className='d-flex align-items-center justify-content-center'>\n <strong>\n <em>{getPhrase('pending')}</em>\n </strong>\n </div>\n }\n </div>\n </div>\n <div className='col-6 ps-1'>\n <div className='bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between'>\n <strong>{getPhrase('unanswered')}</strong>\n <span>{summary.unanswered}</span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst InteractionResultsSummaryPopover = React.forwardRef((\n { interaction, interactive, interactiveMetadata, results, ...popoverProps }: InteractionResultsSummaryProps,\n ref: React.MutableRefObject<HTMLElement>\n) => {\n return (\n <div className='popover-lg'>\n <Popover\n id={`interaction-results-summary-${interaction.id}`}\n ref={ref as any}\n {...popoverProps}\n >\n <Popover.Body>\n <InteractionResultsSummary\n interaction={interaction}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n results={results}\n />\n </Popover.Body>\n </Popover>\n </div>\n );\n});\n\nexport { InteractionResultsSummaryPopover as InteractionResultsSummary };","// extracted by mini-css-extract-plugin\nexport default {\"bar\":\"FCXQd\"};","import React from 'react';\nimport { OverlayTrigger } from 'react-bootstrap';\n\nimport { InteractionResultsSummary } from 'libs/shared/apps/analytics/components/student-results/interaction-results-summary/InteractionResultsSummary';\nimport { Interaction, Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\n\nimport styles from './student-results-table.scss';\n\ninterface InteractionHeaderCellProps {\n interaction: Interaction;\n results: InteractiveResultSet;\n interactionNumber: number;\n interactive: Interactive;\n interactiveMetadata: InteractiveMetadata;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nexport function InteractionHeaderCell(props: InteractionHeaderCellProps): JSX.Element {\n return (\n <OverlayTrigger\n trigger={props.results.students?.length ? 'click' : null}\n placement='bottom'\n overlay={\n <InteractionResultsSummary\n interaction={props.interaction}\n interactive={props.interactive}\n interactiveMetadata={props.interactiveMetadata}\n results={props.results}\n />\n }\n rootClose\n >\n <div\n className={\n `text-center h-100\n d-flex align-items-center justify-content-center\n ${styles.interactionHeaderCellInner}`\n }\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n >\n <div className='p-1 position-relative'>\n {props.interactionNumber}\n </div>\n </div>\n </OverlayTrigger>\n );\n}","import React from 'react';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { Interaction, StudentResults } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { getStudentResult } from 'libs/shared/utils/InteractiveHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './student-results-table.scss';\n\nfunction getSvgName(correctness: InteractionCorrectness): string {\n if (correctness === InteractionCorrectness.Correct)\n return cvSvgLibrary.Check;\n\n if (correctness === InteractionCorrectness.Incorrect)\n return cvSvgLibrary.Close;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n return cvSvgLibrary.Minus;\n\n return;\n}\n\nfunction getClassName(correctness: InteractionCorrectness): string {\n let className = `${styles.resultsCellInner} h-100 position-relative`;\n\n if (correctness === InteractionCorrectness.Correct)\n className += ` ${styles.correct}`;\n\n if (correctness === InteractionCorrectness.Incorrect)\n className += ` ${styles.incorrect} text-danger`;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n className += ` ${styles.awaitingMarking}`;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n className += ` ${styles.unanswered} text-warning`;\n\n return className;\n}\n\ninterface StudentResultCellProps {\n interaction: Interaction;\n studentResults: StudentResults;\n}\n\nexport function StudentResultCell(props: StudentResultCellProps): JSX.Element {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(\n props.interaction,\n getStudentResult(props.studentResults)\n );\n\n const svgName = getSvgName(correctness);\n\n return (\n <div className={getClassName(correctness)}>\n {!!svgName && <SvgContainer svgName={svgName} />}\n {correctness === InteractionCorrectness.AwaitingMarking &&\n <PendingIndicator />\n }\n </div>\n );\n}","import React from 'react';\nimport { CellProps, Column, ColumnInstance, SortingRule } from 'react-table';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { PendingIndicator } from 'libs/shared/apps/analytics/components/pending-indicator/PendingIndicator';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { anonymiseUserName } from 'libs/shared/apps/analytics/utils/AnonymiseUserUtils';\nimport { getStudentResultsSummary } from 'libs/shared/apps/analytics/utils/InteractiveUtils';\nimport { FilterStudentsBy, shouldFilterStudent } from 'libs/shared/apps/analytics/utils/StudentTableUtils';\nimport { PercentageIndicator, PercentageIndicatorLayout } from 'libs/shared/components/percentage-indicator/PercentageIndicator';\nimport { Interactive, InteractiveMetadata, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { getInteractions } from 'libs/shared/utils/InteractiveHelper';\n\nimport { InteractionHeaderCell } from './InteractionHeaderCell';\nimport { StudentResultCell } from './StudentResultCell';\n\nimport styles from './student-results-table.scss';\n\nconst namespace = 'shared.studentResultsTable';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const RESULTS_COL_WIDTH = 60;\n\ninterface CellWrapperProps {\n className?: string;\n}\n\nfunction CellWrapper(props: React.PropsWithChildren<CellWrapperProps>): JSX.Element {\n return (\n <div className={`d-flex align-items-center p-2 h-100 ${props.className ?? ''}`}>\n {props.children}\n </div>\n );\n}\n\ninterface HeaderCellProps {\n column: ColumnInstance<StudentResultsWithSummary>;\n phraseKey: string;\n}\n\nfunction HeaderCell(props: HeaderCellProps): JSX.Element {\n return (\n <CellWrapper className={props.column.isSorted && 'fw-bold'}>\n {getPhrase(props.phraseKey)}\n </CellWrapper>\n );\n}\n\nexport function useGetFixedColumns(\n results: InteractiveResultSet,\n anonymiseUsers: boolean\n): Column<StudentResultsWithSummary>[] {\n const hasResults = !!results.students?.length;\n\n return React.useMemo(() => {\n const cols: Column<StudentResultsWithSummary>[] = [\n {\n id: 'name',\n Header: ({ column }) => <HeaderCell column={column} phraseKey='name' />,\n accessor: (u: StudentResultsWithSummary) => u,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, StudentResultsWithSummary>) => (\n <CellWrapper>\n <span className='text-truncate'>{anonymiseUserName(value.user || value.publicUser, anonymiseUsers)}</span>\n </CellWrapper>\n ),\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='unanswered' />,\n accessor: 'summary.unanswered' as keyof StudentResultsWithSummary,\n sortType: 'basic', // Default is 'alphanumeric' which would treat the numbers as strings\n sortDescFirst: true,\n disableSortBy: !hasResults,\n Cell: ({ value }: CellProps<StudentResultsWithSummary, any>) => <CellWrapper>{value}</CellWrapper>\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='score' />,\n accessor: 'summary',\n id: 'score',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n {`${value.correct}/${value.answered + value.unanswered}`}\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n },\n {\n Header: ({ column }) => <HeaderCell column={column} phraseKey='percentage' />,\n accessor: 'summary',\n id: 'percentage',\n Cell: ({ value }) => {\n if (value.awaitingMarking) {\n return (\n <CellWrapper>\n <PendingIndicator\n title={getPhrase('markingRequired')}\n className='flex-grow-1'\n showLabel\n />\n </CellWrapper>\n );\n }\n\n return (\n <CellWrapper>\n <PercentageIndicator\n percentage={value.percentCorrect}\n layout={PercentageIndicatorLayout.LabelBefore}\n className='flex-grow-1'\n />\n </CellWrapper>\n );\n },\n width: 125,\n sortDescFirst: true,\n disableSortBy: !hasResults\n }\n ];\n\n return cols;\n }, [ anonymiseUsers, hasResults ]);\n}\n\n/**\n * Returns memoized table columns. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultColumns(\n interactive: Interactive,\n interactiveMetadata: InteractiveMetadata,\n results: InteractiveResultSet,\n onColumnHover: (index?: number) => void,\n refreshData: boolean\n): Column<StudentResultsWithSummary>[] {\n return React.useMemo(() => {\n const interactions = getInteractions(interactive);\n\n return interactions.map((interaction, index) => {\n const col: Column<StudentResultsWithSummary> = {\n Header: () => {\n return (\n <InteractionHeaderCell\n interaction={interaction}\n results={results}\n interactive={interactive}\n interactiveMetadata={interactiveMetadata}\n interactionNumber={index + 1}\n onMouseEnter={() => onColumnHover(index)}\n onMouseLeave={() => onColumnHover(null)}\n />\n );\n },\n accessor: 'results',\n /**\n * `onSelectStudentResponse` in `StudentResultsTable` expects the column id to the interaction id\n */\n id: interaction.id,\n disableSortBy: true,\n width: RESULTS_COL_WIDTH,\n Cell: ({ row: { original: studentResults } }) => (\n <StudentResultCell interaction={interaction} studentResults={studentResults} />\n )\n };\n return col;\n });\n }, [refreshData]);\n}\n\n/**\n * Returns memoized table data. To trigger a recalculation, toggle the value of `refreshData`.\n */\nexport function useGetResultsTableData(\n interactive: Interactive,\n results: InteractiveResultSet,\n refreshData: boolean,\n anonymiseUsers: boolean,\n sortBy?: SortingRule<StudentResultsWithSummary>,\n filterBy?: FilterStudentsBy\n): StudentResultsWithSummary[] {\n return React.useMemo(() => {\n const students: StudentResultsWithSummary[] = [];\n\n results.students.forEach(s => {\n const summary = getStudentResultsSummary(interactive, s);\n\n if (filterBy && shouldFilterStudent(filterBy, summary)) return;\n\n students.push({ ...s, summary });\n });\n\n if (sortBy?.id === 'user') {\n const sorted = ArrayHelper.sortBy(students, student => anonymiseUserName(student.user, anonymiseUsers));\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'summary.unanswered') {\n const sorted = ArrayHelper.sortBy(students, student => student.summary.unanswered);\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n if (sortBy?.id === 'score' || sortBy?.id === 'percentage') {\n const sorted = ArrayHelper.sortBy(students, student => {\n if (student.summary.awaitingMarking)\n return -1;\n\n return student.summary.percentCorrect;\n });\n\n return sortBy.desc ? sorted.reverse() : sorted;\n }\n\n return students;\n }, [ refreshData, sortBy, anonymiseUsers, filterBy ]);\n}\n\nexport function highlightColumns(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach(row => {\n row.childNodes.forEach((col: HTMLElement, colIdx: number) => {\n col.classList.remove(styles.highlightColumn);\n\n if (colIdx === highlightIndex)\n col.classList.add(styles.highlightColumn);\n });\n });\n}\n\nexport function highlightRows(tableEl: HTMLElement, highlightIndex?: number): void {\n if (!tableEl)\n return;\n\n const rows = tableEl.querySelectorAll(`.${styles.resultsRow}`);\n\n rows?.forEach((row, rowIdx) => {\n row.classList.remove(styles.highlightResultsRow);\n\n if (rowIdx === highlightIndex)\n row.classList.add(styles.highlightResultsRow);\n });\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { MarkedAnswerHash } from 'libs/shared/apps/analytics/hooks/UseMarkAnswers';\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { StudentResultsWithSummary } from 'libs/shared/apps/analytics/interfaces/StudentResultsWithSummary';\nimport { ScoreThresholdDefaults, ScoreThresholds } from 'libs/shared/constants/ScoreThresholds';\nimport { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, StudentAnswer, StudentResults } from 'libs/shared/interfaces';\nimport { Interactive, InteractiveResultSet } from 'libs/shared/interfaces';\nimport { InteractiveCorrectnessHelper } from 'libs/shared/utils/InteractiveCorrectnessHelper';\nimport { flattenInteractions, getInteractions, getStudentAttempt, getStudentResult } from 'libs/shared/utils/InteractiveHelper';\n\ninterface StudentGroups {\n markingRequired: StudentResultsWithSummary[];\n lowScore: StudentResultsWithSummary[];\n highScore: StudentResultsWithSummary[];\n completed: StudentResultsWithSummary[];\n notCompleted: StudentResultsWithSummary[];\n}\n\nexport function groupStudents(\n interactive: Interactive,\n results: InteractiveResultSet,\n scoreThreshold?: ScoreThresholds\n): StudentGroups {\n const groups: StudentGroups = {\n markingRequired: [],\n lowScore: [],\n highScore: [],\n completed: [],\n notCompleted: []\n };\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n \n results.students.forEach(s => {\n const withSummary = {\n ...s,\n summary: getStudentResultsSummary(interactive, s)\n };\n \n if (withSummary.summary.awaitingMarking) {\n groups.markingRequired.push(withSummary);\n return;\n }\n\n if (ArrayHelper.last(s.results).attempts.length === numInteractions) {\n groups.completed.push(withSummary);\n } else {\n groups.notCompleted.push(withSummary);\n return;\n }\n \n if (withSummary.summary.percentCorrect >= (scoreThreshold?.HIGH || ScoreThresholdDefaults.HIGH))\n groups.highScore.push(withSummary);\n \n if (withSummary.summary.percentCorrect < (scoreThreshold?.MODERATE || ScoreThresholdDefaults.MODERATE))\n groups.lowScore.push(withSummary);\n });\n \n const sortedLowScore = ArrayHelper.sortBy(groups.lowScore, s => s.summary.percentCorrect);\n const sortedHighScore = ArrayHelper.sortBy(groups.highScore, s => -s.summary.percentCorrect);\n \n return {\n ...groups,\n lowScore: sortedLowScore,\n highScore: sortedHighScore\n };\n}\n\nexport function getInteractionById(interactive: Interactive, interactionId: string): Interaction {\n const flattenedInteractions = flattenInteractions(interactive);\n return flattenedInteractions.find(i => i.id.toString() === interactionId.toString());\n}\n\n/**\n * We need to use the question and result ids as a list of one student's responses\n * to multiple questions will all have the same result id and a list of multiple\n * students responses to one question will all have the same questionId.\n */\nexport function getMarkedAnswerId(answer: StudentAnswer): string {\n return `${answer.questionId}:${answer.resultId}`;\n}\n\nexport function getMarkedStatus(\n interactionId: string,\n studentResults: StudentResults,\n markedAnswers: MarkedAnswerHash\n): InteractiveAnswerStatus {\n const result = getStudentResult(studentResults);\n const studentResponse = getStudentAttempt(interactionId, result);\n\n const isMarkedCorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Correct;\n });\n\n if (isMarkedCorrect)\n return InteractiveAnswerStatus.Correct;\n\n const isMarkedIncorrect = studentResponse?.answers.every(a => {\n return markedAnswers[getMarkedAnswerId(a)]?.status === InteractiveAnswerStatus.Incorrect;\n });\n\n if (isMarkedIncorrect)\n return InteractiveAnswerStatus.Incorrect;\n}\n\nexport function getInteractionResultsSummary(\n interaction: Interaction,\n results: InteractiveResultSet\n): ResultsSummary {\n const numStudents = results.students.length;\n let numCorrect = 0;\n let answered = 0;\n let unanswered = 0;\n let awaitingMarking = 0;\n let attempts = 0;\n\n results.students.forEach(s => {\n const result = getStudentResult(s);\n\n if (!result)\n return;\n\n attempts = attempts + s.results.length;\n\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(interaction, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.UnAnswered)\n unanswered++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n\n if (correctness !== InteractionCorrectness.UnAnswered)\n answered++;\n });\n\n\n const percentCorrect = numStudents > 0\n ? numCorrect / numStudents\n : 0;\n\n return {\n percentCorrect,\n correct: numCorrect,\n answered,\n unanswered,\n awaitingMarking,\n attempts\n };\n}\n\nexport function getStudentResultsSummary(interactive: Interactive, studentResults: StudentResults): ResultsSummary {\n const result = getStudentResult(studentResults);\n\n const interactions = getInteractions(interactive);\n\n const numInteractions = interactions.length;\n\n let numCorrect = 0;\n let awaitingMarking = 0;\n\n interactions.forEach(i => {\n const correctness = InteractiveCorrectnessHelper.isInteractionCorrect(i, result);\n\n if (correctness === InteractionCorrectness.Correct)\n numCorrect++;\n\n if (correctness === InteractionCorrectness.AwaitingMarking)\n awaitingMarking++;\n });\n\n const percentCorrect = numInteractions > 0 ? numCorrect / numInteractions : 0;\n\n /**\n * Our interactions list has images and annotations filtered out.\n * We built a map of valid questions, so that we can calculate the unswered accurately.\n * We're doing this because of a bug that caused annotations and images to record answers in the player.\n * - Sha\n */\n const interactionIds = new Set(interactions.map(i => i.id));\n const answeredInteractions = result.attempts.filter(a => !!interactionIds.has(a?.answers[0]?.questionId)).length;\n\n return {\n answered: answeredInteractions,\n attempts: studentResults.results.length,\n unanswered: numInteractions - answeredInteractions,\n percentCorrect,\n correct: numCorrect,\n awaitingMarking\n };\n}","import { SortingRule } from 'react-table';\n\nimport { ResultsSummary } from 'libs/shared/apps/analytics/interfaces/ResultsSummary';\nimport { ScoreThresholdInsights } from 'libs/shared/constants/ScoreThresholds';\n\nexport type SortStudentsBy = 'score_desc' | 'score_asc';\n\nexport function getSortStudents(sortBy: SortStudentsBy, id: string): SortingRule<any>[] {\n switch (sortBy) {\n case 'score_desc': return [{ id, desc: true }];\n case 'score_asc': return [{ id, desc: false }];\n default: return [];\n }\n}\n\nexport type FilterStudentsBy = 'not_completed' | 'marking_required' | 'helping_hand';\n\nexport function shouldFilterStudent(filter: FilterStudentsBy, summary: ResultsSummary): boolean {\n if (filter === 'marking_required' && !summary.awaitingMarking)\n return true;\n\n if (filter === 'helping_hand' && summary.percentCorrect >= ScoreThresholdInsights.HIGH)\n return true;\n\n if (filter === 'not_completed' && !summary.unanswered)\n return true;\n \n return false;\n}\n\n","export enum InteractionCorrectness {\n Correct,\n Incorrect,\n AwaitingMarking,\n \n Answered,\n UnAnswered,\n NotApplicable\n}","export enum InteractiveAnswerStatus {\n Incorrect = 0,\n Correct = 1,\n PendingReview = 2\n}","import { InteractionCorrectness } from 'libs/shared/enums/InteractionCorrectness';\nimport { InteractiveAnswerStatus } from 'libs/shared/enums/InteractiveAnswerStatus';\nimport { Interaction, InteractionTypeId, InteractiveResult, StudentAnswer } from 'libs/shared/interfaces';\n\ntype GetStudentAnswerByActionableItemId = (id: string) => string;\n\nfunction notApplicable(): InteractionCorrectness {\n return InteractionCorrectness.NotApplicable;\n}\n\nfunction awaitingMarking(): InteractionCorrectness {\n return InteractionCorrectness.AwaitingMarking;\n}\n\nfunction isMissingWordCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n const items = interaction.actionableItems.filter(a => a\n .isCorrect);\n\n if (items.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n\n const correct = items.every(a => a.name.trim().toLowerCase() === getStudentAnswer(a.id)?.trim().toLowerCase());\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMultipleChoiceCorrect(\n interaction: Interaction,\n getStudentAnswer: GetStudentAnswerByActionableItemId\n): InteractionCorrectness {\n if (interaction.actionableItems.every(a => !getStudentAnswer(a.id)))\n return InteractionCorrectness.UnAnswered;\n \n const correctItems = interaction.actionableItems.filter(a => a.isCorrect);\n\n const correct = correctItems.every(a => {\n const studentAnswer = getStudentAnswer(a.id);\n\n /**\n * In the past we've only ever checked the answer name. But since we introduced the ability to have image interactions\n * with no question text, we've need to swap to saving the id. But past submissions still have the name\n * - Sha\n */\n return studentAnswer?.toString() === a.id?.toString() || studentAnswer === a.name;\n });\n return correct ? InteractionCorrectness.Correct : InteractionCorrectness.Incorrect;\n}\n\nfunction isMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n getStudentAnswer: (id: string) => StudentAnswer\n): InteractionCorrectness {\n let correctness: InteractionCorrectness;\n\n // There should only be one actionableItem\n interaction.actionableItems.forEach(item => {\n const studentAnswer = getStudentAnswer(item.id);\n\n if (!studentAnswer) {\n correctness = InteractionCorrectness.UnAnswered;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Correct) {\n correctness = InteractionCorrectness.Correct;\n return;\n }\n\n if (studentAnswer.status === InteractiveAnswerStatus.Incorrect) {\n correctness = InteractionCorrectness.Incorrect;\n return;\n }\n\n correctness = InteractionCorrectness.AwaitingMarking;\n });\n\n return correctness;\n}\n\ntype IsCorrectFunction = (interaction: Interaction, result: InteractiveResult) => InteractionCorrectness;\n\nfunction getGetStudentAnswer(interaction: Interaction, result: InteractiveResult): (id: string) => StudentAnswer {\n return (id: string) => {\n const attempt = result.attempts.find(a => a.id === interaction.id);\n return attempt?.answers.find(s => s.id === id);\n };\n}\n\nfunction wrapIsMissingWordCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMissingWordCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMultipleChoiceCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n\n return isMultipleChoiceCorrect(interaction, (id: string) => {\n const answer = getStudentAnswer(id);\n return answer?.text;\n });\n}\n\nfunction wrapIsMarkableAnswerMarkedCorrect(\n interaction: Interaction,\n result: InteractiveResult\n): InteractionCorrectness {\n const getStudentAnswer = getGetStudentAnswer(interaction, result);\n return isMarkableAnswerMarkedCorrect(interaction, getStudentAnswer);\n}\n\nconst IsCorrectLookup: {[typeId: number]: IsCorrectFunction} = {\n [InteractionTypeId.Annotation]: notApplicable,\n [InteractionTypeId.Image]: notApplicable,\n [InteractionTypeId.MissingWord]: wrapIsMissingWordCorrect,\n [InteractionTypeId.MultipleChoice]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.ShortAnswer]: wrapIsMarkableAnswerMarkedCorrect,\n [InteractionTypeId.TrueOrFalse]: wrapIsMultipleChoiceCorrect,\n [InteractionTypeId.Illustration]: wrapIsMarkableAnswerMarkedCorrect\n};\n\nfunction isInteractionCorrect(interaction: Interaction, result: InteractiveResult): InteractionCorrectness {\n const isCorrectFn = IsCorrectLookup[interaction.typeId];\n\n return isCorrectFn(interaction, result);\n}\n\nexport const InteractiveCorrectnessHelper = {\n notApplicable,\n awaitingMarking,\n isMissingWordCorrect,\n isMultipleChoiceCorrect,\n isInteractionCorrect\n};\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport {\n Interaction,\n InteractionTypeId,\n Interactive,\n InteractiveResult,\n StudentAttempt,\n StudentResults\n} from 'libs/shared/interfaces';\n\nfunction interactionRequiresAnswer(interaction: Interaction): boolean {\n return interaction.typeId !== InteractionTypeId.Annotation && interaction.typeId !== InteractionTypeId.Image;\n}\n\nexport function flattenInteractions(interactive: Interactive): Interaction[] {\n return ArrayHelper.flatten(interactive.timepoints.map(i => i.interactions));\n}\n\n/**\n * Centralised logic for using the most recent student result.\n */\nexport function getStudentResult(studentResults: StudentResults): InteractiveResult {\n return ArrayHelper.last(studentResults.results);\n}\n\nexport function getStudentAttempt(interactionId: string, result: InteractiveResult): StudentAttempt {\n return ArrayHelper.findWhere(result?.attempts, { id: interactionId });\n}\n\n/**\n * Returns a flat list of interactions on an interactive and filters out\n * those that don't require an answer (annotations and images).\n */\nexport function getInteractions(interactive: Interactive): Interaction [] {\n return flattenInteractions(interactive).filter(interactionRequiresAnswer);\n}","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"hnMke\",\"row\":\"ILLa_\",\"fixedTable\":\"_fdpt\",\"interactionHeaderCellOuter\":\"kjXYB\",\"hasResults\":\"M4qgr\",\"interactionHeaderCellInner\":\"cnFvB\",\"resultsCellOuter\":\"bdzRb\",\"correct\":\"xANR6\",\"incorrect\":\"_44sb\",\"awaitingMarking\":\"eQ9sh\",\"unanswered\":\"xRUK8\",\"highlightColumn\":\"f9Zqr\",\"resultsCellInner\":\"LAFwi\",\"highlightResultsRow\":\"TwwLO\",\"resultsRow\":\"xZ5iP\"};"],"names":["getPhrase","getClassName","props","className","showLabel","PendingIndicator","Indicator","title","spanHack","spanHackClassName","tooltipClassName","InteractionsBar","duration","interactive","timepoints","map","t","i","interactions","length","timepoint","selectedInteraction","interaction","find","id","isSelected","bgClassName","InteractionTypeHelper","typeId","left","visibleAt","key","style","DurationHelper","LanguageService","InteractionResultsSummary","interactiveMetadata","summary","results","InteractionLabel","iconClassName","_parentClip","endTime","startTime","_parentVideo","awaitingMarking","PercentageIndicator","percentage","percentCorrect","layout","unanswered","InteractionResultsSummaryPopover","ref","popoverProps","Popover","InteractionHeaderCell","OverlayTrigger","trigger","students","placement","overlay","rootClose","onMouseEnter","onMouseLeave","interactionNumber","correctness","InteractionCorrectness","StudentResultCell","InteractiveCorrectnessHelper","studentResults","svgName","getSvgName","SvgContainer","RESULTS_COL_WIDTH","CellWrapper","children","HeaderCell","column","isSorted","phraseKey","useGetFixedColumns","anonymiseUsers","hasResults","Header","accessor","u","Cell","value","user","publicUser","disableSortBy","sortType","sortDescFirst","correct","answered","width","useGetResultColumns","onColumnHover","refreshData","index","row","original","useGetResultsTableData","sortBy","filterBy","forEach","s","push","sorted","ArrayHelper","student","desc","reverse","highlightColumns","tableEl","highlightIndex","rows","querySelectorAll","childNodes","col","colIdx","classList","remove","add","highlightRows","rowIdx","groupStudents","scoreThreshold","groups","markingRequired","lowScore","highScore","completed","notCompleted","numInteractions","withSummary","getStudentResultsSummary","attempts","HIGH","MODERATE","sortedLowScore","sortedHighScore","getInteractionById","interactionId","toString","getMarkedAnswerId","answer","questionId","resultId","getMarkedStatus","markedAnswers","result","studentResponse","answers","every","a","status","getInteractionResultsSummary","numStudents","numCorrect","interactionIds","Set","answeredInteractions","filter","has","getSortStudents","shouldFilterStudent","InteractiveAnswerStatus","notApplicable","isMissingWordCorrect","getStudentAnswer","items","actionableItems","isCorrect","name","trim","toLowerCase","isMultipleChoiceCorrect","studentAnswer","getGetStudentAnswer","attempt","wrapIsMultipleChoiceCorrect","text","wrapIsMarkableAnswerMarkedCorrect","item","isMarkableAnswerMarkedCorrect","IsCorrectLookup","isInteractionCorrect","isCorrectFn","interactionRequiresAnswer","flattenInteractions","getStudentResult","getStudentAttempt","getInteractions"],"sourceRoot":""}