@clickview/exchange 0.56.0 → 0.56.1-dev.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 (192) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/en.json +1 -1
  3. package/dist/scripts/{PswrCgft.chunk.js → 044iq0d1.chunk.js} +2 -2
  4. package/dist/scripts/{PswrCgft.chunk.js.map → 044iq0d1.chunk.js.map} +1 -1
  5. package/dist/scripts/{CoBxE0Ze.chunk.js → 6ucD94id.chunk.js} +2 -2
  6. package/dist/scripts/{CoBxE0Ze.chunk.js.map → 6ucD94id.chunk.js.map} +1 -1
  7. package/dist/scripts/{Bf33xjOw.chunk.js → B-PNdHqp.chunk.js} +2 -2
  8. package/dist/scripts/{Bf33xjOw.chunk.js.map → B-PNdHqp.chunk.js.map} +1 -1
  9. package/dist/scripts/{BsN5hGdn.chunk.js → B2zOyhnx.chunk.js} +2 -2
  10. package/dist/scripts/{BsN5hGdn.chunk.js.map → B2zOyhnx.chunk.js.map} +1 -1
  11. package/dist/scripts/{D36WobW6.chunk.js → B3cy6PVV.chunk.js} +2 -2
  12. package/dist/scripts/{D36WobW6.chunk.js.map → B3cy6PVV.chunk.js.map} +1 -1
  13. package/dist/scripts/{DaLZ0a8R.chunk.js → B3e4NkXy.chunk.js} +2 -2
  14. package/dist/scripts/{DaLZ0a8R.chunk.js.map → B3e4NkXy.chunk.js.map} +1 -1
  15. package/dist/scripts/{CucQidno.chunk.js → B4mwlW3k.chunk.js} +2 -2
  16. package/dist/scripts/{CucQidno.chunk.js.map → B4mwlW3k.chunk.js.map} +1 -1
  17. package/dist/scripts/{BrWxbCy6.chunk.js → BC8oIL4t.chunk.js} +2 -2
  18. package/dist/scripts/{BrWxbCy6.chunk.js.map → BC8oIL4t.chunk.js.map} +1 -1
  19. package/dist/scripts/{BolzEYoc.chunk.js → BDoSZnIa.chunk.js} +2 -2
  20. package/dist/scripts/{BolzEYoc.chunk.js.map → BDoSZnIa.chunk.js.map} +1 -1
  21. package/dist/scripts/{dZRQM-hv.chunk.js → BGg12SDH.chunk.js} +2 -2
  22. package/dist/scripts/{dZRQM-hv.chunk.js.map → BGg12SDH.chunk.js.map} +1 -1
  23. package/dist/scripts/{DiCC-7dB.chunk.js → BI6c50Jh.chunk.js} +2 -2
  24. package/dist/scripts/{DiCC-7dB.chunk.js.map → BI6c50Jh.chunk.js.map} +1 -1
  25. package/dist/scripts/{BDLmm9HB.chunk.js → BSIHfhEC.chunk.js} +2 -2
  26. package/dist/scripts/{BDLmm9HB.chunk.js.map → BSIHfhEC.chunk.js.map} +1 -1
  27. package/dist/scripts/BWIFX-Ik.chunk.js +2 -0
  28. package/dist/scripts/{zNwtPBUz.chunk.js.map → BWIFX-Ik.chunk.js.map} +1 -1
  29. package/dist/scripts/{DSFKTxPl.chunk.js → BWnE7KAO.chunk.js} +2 -2
  30. package/dist/scripts/{DSFKTxPl.chunk.js.map → BWnE7KAO.chunk.js.map} +1 -1
  31. package/dist/scripts/{De7o0fUe.chunk.js → Be3-ohNT.chunk.js} +3 -3
  32. package/dist/scripts/{De7o0fUe.chunk.js.map → Be3-ohNT.chunk.js.map} +1 -1
  33. package/dist/scripts/BlQxOSJi.chunk.js +2 -0
  34. package/dist/scripts/{BDys2rrG.chunk.js.map → BlQxOSJi.chunk.js.map} +1 -1
  35. package/dist/scripts/{D1uhKPP8.chunk.js → BoCG3rE6.chunk.js} +2 -2
  36. package/dist/scripts/{D1uhKPP8.chunk.js.map → BoCG3rE6.chunk.js.map} +1 -1
  37. package/dist/scripts/{BUlwG-06.chunk.js → BpW5Hw5z.chunk.js} +2 -2
  38. package/dist/scripts/{BUlwG-06.chunk.js.map → BpW5Hw5z.chunk.js.map} +1 -1
  39. package/dist/scripts/{Bj3FQ5Ya.chunk.js → BtTTlrnZ.chunk.js} +2 -2
  40. package/dist/scripts/{Bj3FQ5Ya.chunk.js.map → BtTTlrnZ.chunk.js.map} +1 -1
  41. package/dist/scripts/{B1tVxL6y.chunk.js → ButpMiJ1.chunk.js} +2 -2
  42. package/dist/scripts/{B1tVxL6y.chunk.js.map → ButpMiJ1.chunk.js.map} +1 -1
  43. package/dist/scripts/{C4ROYls7.chunk.js → By50Y4fi.chunk.js} +2 -2
  44. package/dist/scripts/{C4ROYls7.chunk.js.map → By50Y4fi.chunk.js.map} +1 -1
  45. package/dist/scripts/{Ddk3CuwQ.chunk.js → C3YXHQU-.chunk.js} +2 -2
  46. package/dist/scripts/{Ddk3CuwQ.chunk.js.map → C3YXHQU-.chunk.js.map} +1 -1
  47. package/dist/scripts/{C7toqgJ9.chunk.js → C3jPyokw.chunk.js} +2 -2
  48. package/dist/scripts/{C7toqgJ9.chunk.js.map → C3jPyokw.chunk.js.map} +1 -1
  49. package/dist/scripts/{UxXf3AJv.chunk.js → C5DBZwej.chunk.js} +2 -2
  50. package/dist/scripts/{UxXf3AJv.chunk.js.map → C5DBZwej.chunk.js.map} +1 -1
  51. package/dist/scripts/{C4F_pZyv.chunk.js → C6BGhDq3.chunk.js} +2 -2
  52. package/dist/scripts/{C4F_pZyv.chunk.js.map → C6BGhDq3.chunk.js.map} +1 -1
  53. package/dist/scripts/C6x-ZqLl.chunk.js +2 -0
  54. package/dist/scripts/{0mGPhW9k.chunk.js.map → C6x-ZqLl.chunk.js.map} +1 -1
  55. package/dist/scripts/{Bt6iO6Kj.chunk.js → CFa8QduK.chunk.js} +2 -2
  56. package/dist/scripts/{Bt6iO6Kj.chunk.js.map → CFa8QduK.chunk.js.map} +1 -1
  57. package/dist/scripts/{C3oO96po.chunk.js → CG6eaNuu.chunk.js} +2 -2
  58. package/dist/scripts/{C3oO96po.chunk.js.map → CG6eaNuu.chunk.js.map} +1 -1
  59. package/dist/scripts/{h9ujBzqa.chunk.js → CHFINytM.chunk.js} +2 -2
  60. package/dist/scripts/{h9ujBzqa.chunk.js.map → CHFINytM.chunk.js.map} +1 -1
  61. package/dist/scripts/{CWrjr29e.chunk.js → CHzv4hsQ.chunk.js} +2 -2
  62. package/dist/scripts/{CWrjr29e.chunk.js.map → CHzv4hsQ.chunk.js.map} +1 -1
  63. package/dist/scripts/{Cn9Jwmkc.chunk.js → CV6qoMzB.chunk.js} +2 -2
  64. package/dist/scripts/{Cn9Jwmkc.chunk.js.map → CV6qoMzB.chunk.js.map} +1 -1
  65. package/dist/scripts/{EAS5-0G3.chunk.js → CVca5RIC.chunk.js} +2 -2
  66. package/dist/scripts/{EAS5-0G3.chunk.js.map → CVca5RIC.chunk.js.map} +1 -1
  67. package/dist/scripts/CWRjbtTx.chunk.js +2 -0
  68. package/dist/scripts/{Cfw5zASx.chunk.js.map → CWRjbtTx.chunk.js.map} +1 -1
  69. package/dist/scripts/{B86gu8do.chunk.js → CX1XQ05a.chunk.js} +2 -2
  70. package/dist/scripts/{B86gu8do.chunk.js.map → CX1XQ05a.chunk.js.map} +1 -1
  71. package/dist/scripts/{BoyiBqIK.chunk.js → CYrSeREi.chunk.js} +2 -2
  72. package/dist/scripts/{BoyiBqIK.chunk.js.map → CYrSeREi.chunk.js.map} +1 -1
  73. package/dist/scripts/{CA2wPtyp.chunk.js → C_AYa87x.chunk.js} +2 -2
  74. package/dist/scripts/{CA2wPtyp.chunk.js.map → C_AYa87x.chunk.js.map} +1 -1
  75. package/dist/scripts/{B0OGvFw2.chunk.js → CbOOCRVJ.chunk.js} +2 -2
  76. package/dist/scripts/{B0OGvFw2.chunk.js.map → CbOOCRVJ.chunk.js.map} +1 -1
  77. package/dist/scripts/{9xHo2Cwe.chunk.js → CinRjwth.chunk.js} +2 -2
  78. package/dist/scripts/{9xHo2Cwe.chunk.js.map → CinRjwth.chunk.js.map} +1 -1
  79. package/dist/scripts/{oxlQycmi.chunk.js → CjXJ8oFf.chunk.js} +2 -2
  80. package/dist/scripts/{oxlQycmi.chunk.js.map → CjXJ8oFf.chunk.js.map} +1 -1
  81. package/dist/scripts/{C_hVa7Ra.chunk.js → CkEsSdbO.chunk.js} +2 -2
  82. package/dist/scripts/{C_hVa7Ra.chunk.js.map → CkEsSdbO.chunk.js.map} +1 -1
  83. package/dist/scripts/{BzaGFUjc.chunk.js → CmWKgt7c.chunk.js} +2 -2
  84. package/dist/scripts/{BzaGFUjc.chunk.js.map → CmWKgt7c.chunk.js.map} +1 -1
  85. package/dist/scripts/{BRCI_rEH.chunk.js → Co6EjRu3.chunk.js} +2 -2
  86. package/dist/scripts/{BRCI_rEH.chunk.js.map → Co6EjRu3.chunk.js.map} +1 -1
  87. package/dist/scripts/{D2RVG0Pu.chunk.js → Cqky1Knl.chunk.js} +2 -2
  88. package/dist/scripts/{D2RVG0Pu.chunk.js.map → Cqky1Knl.chunk.js.map} +1 -1
  89. package/dist/scripts/{C0CSgPvj.chunk.js → CsaYiq-6.chunk.js} +2 -2
  90. package/dist/scripts/{C0CSgPvj.chunk.js.map → CsaYiq-6.chunk.js.map} +1 -1
  91. package/dist/scripts/{DqAsIeVB.chunk.js → Ct-hl94f.chunk.js} +2 -2
  92. package/dist/scripts/{DqAsIeVB.chunk.js.map → Ct-hl94f.chunk.js.map} +1 -1
  93. package/dist/scripts/{kpU1ILSr.chunk.js → CwuTuPLO.chunk.js} +2 -2
  94. package/dist/scripts/{kpU1ILSr.chunk.js.map → CwuTuPLO.chunk.js.map} +1 -1
  95. package/dist/scripts/{-hO5xjbU.chunk.js → Cy191NLr.chunk.js} +2 -2
  96. package/dist/scripts/{-hO5xjbU.chunk.js.map → Cy191NLr.chunk.js.map} +1 -1
  97. package/dist/scripts/{BswE1yhG.chunk.js → CzBvFLUu.chunk.js} +2 -2
  98. package/dist/scripts/{BswE1yhG.chunk.js.map → CzBvFLUu.chunk.js.map} +1 -1
  99. package/dist/scripts/{BZnDGuzQ.chunk.js → DCGOcoWo.chunk.js} +2 -2
  100. package/dist/scripts/{BZnDGuzQ.chunk.js.map → DCGOcoWo.chunk.js.map} +1 -1
  101. package/dist/scripts/{DIFawdym.chunk.js → DEfSuFug.chunk.js} +2 -2
  102. package/dist/scripts/{DIFawdym.chunk.js.map → DEfSuFug.chunk.js.map} +1 -1
  103. package/dist/scripts/{B67qUxbj.chunk.js → DFNZXjHy.chunk.js} +2 -2
  104. package/dist/scripts/{B67qUxbj.chunk.js.map → DFNZXjHy.chunk.js.map} +1 -1
  105. package/dist/scripts/{Cliq624L.chunk.js → DGDSZYW9.chunk.js} +2 -2
  106. package/dist/scripts/{Cliq624L.chunk.js.map → DGDSZYW9.chunk.js.map} +1 -1
  107. package/dist/scripts/{W3L3GnYz.chunk.js → DLxCyfTf.chunk.js} +2 -2
  108. package/dist/scripts/{W3L3GnYz.chunk.js.map → DLxCyfTf.chunk.js.map} +1 -1
  109. package/dist/scripts/{DeC-NkSi.chunk.js → DQ7Osv3q.chunk.js} +2 -2
  110. package/dist/scripts/{DeC-NkSi.chunk.js.map → DQ7Osv3q.chunk.js.map} +1 -1
  111. package/dist/scripts/{mj8E03dO.chunk.js → DRDYq9ZL.chunk.js} +2 -2
  112. package/dist/scripts/{mj8E03dO.chunk.js.map → DRDYq9ZL.chunk.js.map} +1 -1
  113. package/dist/scripts/{oWzYOkEl.chunk.js → DSQI-Jdp.chunk.js} +2 -2
  114. package/dist/scripts/{oWzYOkEl.chunk.js.map → DSQI-Jdp.chunk.js.map} +1 -1
  115. package/dist/scripts/{CMoQks36.chunk.js → DSwVduDL.chunk.js} +2 -2
  116. package/dist/scripts/{CMoQks36.chunk.js.map → DSwVduDL.chunk.js.map} +1 -1
  117. package/dist/scripts/{Bn31qbi-.chunk.js → DUmKCSoR.chunk.js} +2 -2
  118. package/dist/scripts/{Bn31qbi-.chunk.js.map → DUmKCSoR.chunk.js.map} +1 -1
  119. package/dist/scripts/{B2pkApo6.chunk.js → DVisFoDC.chunk.js} +2 -2
  120. package/dist/scripts/{B2pkApo6.chunk.js.map → DVisFoDC.chunk.js.map} +1 -1
  121. package/dist/scripts/{aYbKmndA.chunk.js → DWtr2GDr.chunk.js} +2 -2
  122. package/dist/scripts/{aYbKmndA.chunk.js.map → DWtr2GDr.chunk.js.map} +1 -1
  123. package/dist/scripts/{CKJlxYxE.chunk.js → DXeWv8xM.chunk.js} +2 -2
  124. package/dist/scripts/{CKJlxYxE.chunk.js.map → DXeWv8xM.chunk.js.map} +1 -1
  125. package/dist/scripts/{CD7xQQSj.chunk.js → DZZlWrzc.chunk.js} +2 -2
  126. package/dist/scripts/{CD7xQQSj.chunk.js.map → DZZlWrzc.chunk.js.map} +1 -1
  127. package/dist/scripts/D_yZCyl0.chunk.js +2 -0
  128. package/dist/scripts/{nYKnuiKr.chunk.js.map → D_yZCyl0.chunk.js.map} +1 -1
  129. package/dist/scripts/{Dbdf7QGx.chunk.js → Da9-cwkH.chunk.js} +2 -2
  130. package/dist/scripts/{Dbdf7QGx.chunk.js.map → Da9-cwkH.chunk.js.map} +1 -1
  131. package/dist/scripts/{B9Zy84TP.chunk.js → DdJUaS75.chunk.js} +2 -2
  132. package/dist/scripts/{B9Zy84TP.chunk.js.map → DdJUaS75.chunk.js.map} +1 -1
  133. package/dist/scripts/{DVd5A_3v.chunk.js → DhNUjn7p.chunk.js} +2 -2
  134. package/dist/scripts/{DVd5A_3v.chunk.js.map → DhNUjn7p.chunk.js.map} +1 -1
  135. package/dist/scripts/{C6_0NPy2.chunk.js → Dhpe3VD3.chunk.js} +2 -2
  136. package/dist/scripts/{C6_0NPy2.chunk.js.map → Dhpe3VD3.chunk.js.map} +1 -1
  137. package/dist/scripts/DiJ1txP6.chunk.js +2 -0
  138. package/dist/scripts/{VBw4HYiM.chunk.js.map → DiJ1txP6.chunk.js.map} +1 -1
  139. package/dist/scripts/{C5UlFqqr.chunk.js → DjeFO5jj.chunk.js} +2 -2
  140. package/dist/scripts/{C5UlFqqr.chunk.js.map → DjeFO5jj.chunk.js.map} +1 -1
  141. package/dist/scripts/{C37FAa5c.chunk.js → Dn7S7HZe.chunk.js} +2 -2
  142. package/dist/scripts/{C37FAa5c.chunk.js.map → Dn7S7HZe.chunk.js.map} +1 -1
  143. package/dist/scripts/{BQEr0IGt.chunk.js → Duy0OOKL.chunk.js} +2 -2
  144. package/dist/scripts/{BQEr0IGt.chunk.js.map → Duy0OOKL.chunk.js.map} +1 -1
  145. package/dist/scripts/{DEvwqrCo.chunk.js → DxLg_mEO.chunk.js} +2 -2
  146. package/dist/scripts/{DEvwqrCo.chunk.js.map → DxLg_mEO.chunk.js.map} +1 -1
  147. package/dist/scripts/{D9ECiiu8.chunk.js → HYIMjXwZ.chunk.js} +2 -2
  148. package/dist/scripts/{D9ECiiu8.chunk.js.map → HYIMjXwZ.chunk.js.map} +1 -1
  149. package/dist/scripts/{9gPNCjBk.chunk.js → J651bFfk.chunk.js} +2 -2
  150. package/dist/scripts/{9gPNCjBk.chunk.js.map → J651bFfk.chunk.js.map} +1 -1
  151. package/dist/scripts/{Y40qqQUW.chunk.js → JZmjeIJo.chunk.js} +2 -2
  152. package/dist/scripts/{Y40qqQUW.chunk.js.map → JZmjeIJo.chunk.js.map} +1 -1
  153. package/dist/scripts/{BJG50MLZ.chunk.js → SI_6LGjL.chunk.js} +2 -2
  154. package/dist/scripts/{BJG50MLZ.chunk.js.map → SI_6LGjL.chunk.js.map} +1 -1
  155. package/dist/scripts/{CiXtVo-A.chunk.js → Wfuxh2YT.chunk.js} +2 -2
  156. package/dist/scripts/Wfuxh2YT.chunk.js.map +1 -0
  157. package/dist/scripts/{BvfTundg.chunk.js → Y2CHWdPG.chunk.js} +2 -2
  158. package/dist/scripts/{BvfTundg.chunk.js.map → Y2CHWdPG.chunk.js.map} +1 -1
  159. package/dist/scripts/{B57_c_CS.chunk.js → Y5a0i_3c.chunk.js} +2 -2
  160. package/dist/scripts/{B57_c_CS.chunk.js.map → Y5a0i_3c.chunk.js.map} +1 -1
  161. package/dist/scripts/{app-BwZTeN0O.js → app-cabh1nNK.js} +3 -3
  162. package/dist/scripts/{app-BwZTeN0O.js.map → app-cabh1nNK.js.map} +1 -1
  163. package/dist/scripts/{CW89a4Mj.chunk.js → b-AUm3ni.chunk.js} +2 -2
  164. package/dist/scripts/{CW89a4Mj.chunk.js.map → b-AUm3ni.chunk.js.map} +1 -1
  165. package/dist/scripts/{DToTQA1H.chunk.js → fqbX9HRm.chunk.js} +2 -2
  166. package/dist/scripts/{DToTQA1H.chunk.js.map → fqbX9HRm.chunk.js.map} +1 -1
  167. package/dist/scripts/{DLQTbn-d.chunk.js → oVMIGZTl.chunk.js} +2 -2
  168. package/dist/scripts/{DLQTbn-d.chunk.js.map → oVMIGZTl.chunk.js.map} +1 -1
  169. package/dist/scripts/{D9BoZZhI.chunk.js → tbYGeGLS.chunk.js} +2 -2
  170. package/dist/scripts/{D9BoZZhI.chunk.js.map → tbYGeGLS.chunk.js.map} +1 -1
  171. package/dist/scripts/{xWtPEEJC.chunk.js → uGV8Ulpl.chunk.js} +2 -2
  172. package/dist/scripts/{xWtPEEJC.chunk.js.map → uGV8Ulpl.chunk.js.map} +1 -1
  173. package/dist/scripts/{CNiWunhi.chunk.js → uyrSls2s.chunk.js} +2 -2
  174. package/dist/scripts/{CNiWunhi.chunk.js.map → uyrSls2s.chunk.js.map} +1 -1
  175. package/dist/scripts/{DXtSLojN.chunk.js → vJWLdqFY.chunk.js} +2 -2
  176. package/dist/scripts/{DXtSLojN.chunk.js.map → vJWLdqFY.chunk.js.map} +1 -1
  177. package/dist/scripts/{4sHzAWaU.chunk.js → wlWC_CCa.chunk.js} +2 -2
  178. package/dist/scripts/{4sHzAWaU.chunk.js.map → wlWC_CCa.chunk.js.map} +1 -1
  179. package/dist/scripts/wmclIpxx.chunk.js +2 -0
  180. package/dist/scripts/{JVT9lUoz.chunk.js.map → wmclIpxx.chunk.js.map} +1 -1
  181. package/dist/scripts/{o-4-XLY2.chunk.js → zBOmHm2e.chunk.js} +2 -2
  182. package/dist/scripts/{o-4-XLY2.chunk.js.map → zBOmHm2e.chunk.js.map} +1 -1
  183. package/package.json +1 -1
  184. package/dist/scripts/0mGPhW9k.chunk.js +0 -2
  185. package/dist/scripts/BDys2rrG.chunk.js +0 -2
  186. package/dist/scripts/Cfw5zASx.chunk.js +0 -2
  187. package/dist/scripts/CiXtVo-A.chunk.js.map +0 -1
  188. package/dist/scripts/JVT9lUoz.chunk.js +0 -2
  189. package/dist/scripts/VBw4HYiM.chunk.js +0 -2
  190. package/dist/scripts/nYKnuiKr.chunk.js +0 -2
  191. package/dist/scripts/zNwtPBUz.chunk.js +0 -2
  192. package/vite.config.ts +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"kpU1ILSr.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/CalendarEvent.ts","../../../../libs/shared/src/apps/search/interfaces/SearchTypes.ts","../../../../libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","../../../../libs/shared/src/apps/search/reducers/FilterReducer.tsx","../../../../libs/shared/src/apps/search/components/filter-dropdown-title/FilterDropdownTitle.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilterList.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/NestedFilterOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/SecondLayerOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/NestedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/switch-filter/SwitchFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/dropdown-filter/DropdownFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/radio-filter/RadioFilter.tsx","../../../../libs/shared/src/components/rating-range-selector/RatingRangeSelector.tsx","../../../../libs/shared/src/apps/search/components/filter-types/rating-filter/RatingFilter.tsx","../../../../libs/shared/src/apps/search/constants/FilterConstants.ts","../../../../libs/shared/src/apps/search/utils/SourceFilterHelper.ts","../../../../libs/shared/src/enums/CustomerStatus.ts","../../../../libs/shared/src/apps/calendar/constants/SpecialEventTypeLabelMap.ts","../../../../libs/shared/src/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo.tsx","../../../../libs/shared/src/images/svg/status/CheckCircleSvg.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserStatusBadge.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/BasicUserDetails.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/RoleOrYearGroup.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserItemAvatar.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem.tsx","../../../../libs/shared/src/apps/user-manager/enums/UserManagerClient.ts","../../../../libs/shared/src/context/WizardLayoutContext.tsx","../../../../libs/shared/src/enums/BatchDataType.ts","../../../../libs/shared/src/enums/BatchJobName.ts","../../../../libs/shared/src/enums/BatchJobResultErrorCode.ts","../../../../libs/shared/src/enums/BatchJobType.ts","../../../../libs/shared/src/images/svg/objects/KeySvg.tsx","../../../../libs/shared/src/apps/user-manager/utils/BulkUserActionsHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-types/custom/duration-filter/DurationFilter.tsx","../../../../libs/shared/src/constants/XmasConstants.ts","../../../../libs/shared/src/apps/search/components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/utils/ClassificationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/DurationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/PresentationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/ProductionYearFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/RatingFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/FilterHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","../../../../libs/shared/src/utils/StateHelper.ts","../../../../libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","../../../../libs/shared/src/components/tags/PartialTagItem.tsx","../../../../libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","../../../../libs/shared/src/enums/CssMeasurement.ts","../../../../libs/shared/src/utils/DragHelper.ts","../../../../libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","../../../../libs/shared/src/images/svg/arrows/ChevronRightSvg.tsx","../../../../libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","../../../../libs/shared/src/enums/WidgetInteraction.ts","../../../../libs/shared/src/hooks/UseResizeListener.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetEventHandlers.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetReducer.tsx","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidget.tsx","../../../../libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","../../../../libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","../../../../libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx"],"sourcesContent":["import { BaseObject, BasePaginatedCollection, Classification, Livestream } from 'libs/shared/interfaces';\n\nexport type CalendarEventType = 'Observance' | 'ReligiousEvent' | 'Holiday' | 'Livestream';\n\nexport enum SpecialEventType {\n Holiday = 'Holiday',\n SportingEvent = 'SportingEvent',\n Observance = 'Observance',\n NaturalDisaster = 'NaturalDisaster',\n HistoricalEvent = 'HistoricalEvent',\n BreakingNews = 'BreakingNews',\n Informal = 'Informal',\n ReligiousEvent = 'ReligiousEvent',\n Livestream = 'Livestream',\n Other = 'Other'\n}\n\nexport enum CalendarEventContentType {\n Classification,\n Livestream\n}\n\nexport enum CalendarEventFrequency {\n Regular = 'Regular',\n Daily = 'Daily',\n Weekly = 'Weekly',\n Monthly = 'Monthly',\n Yearly = 'Yearly'\n}\n\nexport enum CalendarEventStatus {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport type CalendarEventContent = Classification | Livestream;\n\nexport interface CalendarEvent<T extends CalendarEventContent = Classification> {\n id: string;\n type: CalendarEventType;\n name: string;\n description?: string;\n startDate: string;\n endDate?: string;\n content: T;\n specialEventId?: string;\n specialEventPolicyId?: string;\n metadata?: {\n objectType: 'Topic' | 'Livestream';\n objectId: string;\n };\n}\n\nexport interface SpecialEvent<T extends CalendarEventContent = Classification> {\n id: string;\n name: string;\n description: string;\n policies: SpecialEventPolicy<T>[];\n status: CalendarEventStatus;\n type: SpecialEventType;\n}\n\nexport type SpecialEventCollection<T extends CalendarEventContent = Classification>\n = BasePaginatedCollection<SpecialEvent<T>>;\n\nexport interface SpecialEventPolicy<T extends CalendarEventContent = Classification> extends BaseObject {\n content: T;\n specialEventId: string;\n status: CalendarEventStatus;\n presentationId: string;\n startDate: string;\n endDate: string;\n frequency: CalendarEventFrequency;\n interval: number;\n visible: boolean;\n metadata: {\n objectId: string;\n objectType: 'Topic' | 'Livestream';\n };\n}","import { ObjectHash } from 'backbone';\nimport Bloodhound from 'bloodhound';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface RemoteSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n remote: Bloodhound.RemoteOptions<T>;\n}\n\nexport interface LocalSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n local: T[] | (() => T[]);\n}\n\nexport type TypeaheadDataSource<T> = Bloodhound<T> |\n((query: string, syncResults: (result: T[]) => void, asyncResults?: (result: T[]) => void) => void);\n\nexport interface InstantSearchBloodhound<T> {\n bloodhound: TypeaheadDataSource<T>;\n name: string;\n}\n\nexport type TypeaheadConfig<T> = Twitter.Typeahead.Dataset<T>;\n\nexport interface TypeaheadConfigHandler<T> {\n (source?: InstantSearchBloodhound<T>, index?: number, options?: ObjectHash): Twitter.Typeahead.Dataset<T>;\n}\n\nexport interface BloodhoundConfigHandler<T> {\n (source: string, options?: ObjectHash): LocalSearch<T> | RemoteSearch<T>;\n}\n\nexport interface TypeaheadSourceItem<T> {\n name: string;\n typeaheadConfig: TypeaheadConfigHandler<T>;\n bloodhoundConfig?: BloodhoundConfigHandler<T>;\n options?: ObjectHash;\n}\n\nexport const AllSearchIndicesVideoStyle: SearchIndices[] = [ 'video', 'clip', 'interactive' ];\nexport const AllSearchIndicesInSearch: SearchIndices[] = [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video', 'company', 'category', 'partner_profile' ];\nexport const AllSearchIndicesInUserManager: SearchIndices[] = ['user'];","import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { FilterIds, FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport type FilterState = {\n active: boolean;\n selection?: FilterOption[];\n};\n\nexport type DraftState = {\n [key in FilterIds]?: FilterState;\n};\n\ntype FilterStateHashFilters = {\n [key in FilterIds]: FilterState;\n};\n\nexport type FilterStateHash = FilterStateHashFilters & {\n appLink: Core.AppLink;\n moreFilters?: Omit<FilterStateHash, 'moreFilters'>;\n};\n\nexport type FilterActionType = 'update';\n\nexport type FilterPayloadType = {\n filter: SearchFilter;\n state: FilterState;\n};\n\n/**\n * Context\n */\ninterface FilterContextType {\n state: FilterStateHash;\n dispatch: React.Dispatch<ReducerActions<FilterActionType>>;\n}\n\nexport const FilterContext = createContext<FilterContextType>(null);\n\n/**\n * Reducer - root level keys should match the filter object's corresponding \"id\" field\n */\nexport function FilterReducer(\n state: FilterStateHash,\n action: ReducerActions<FilterActionType, FilterStateHash>\n): FilterStateHash {\n switch (action.type) {\n case 'update': {\n return action.payload;\n }\n\n default:\n return state;\n }\n}\n","import React from 'react';\n\ninterface FilterDropdownTitleProps {\n id?: string;\n title: string;\n}\n\nexport function FilterDropdownTitle(props: FilterDropdownTitleProps): JSX.Element {\n return (\n <label htmlFor={props.id} className='mb-0'>\n <h3 className='h6 mb-2'>{props.title}</h3>\n </label>\n );\n}","import React from 'react';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport { FilterOption, MoreFilters, SearchFilter } from '../../../interfaces';\nimport { FilterState } from '../../../reducers';\n\ninterface CheckboxFilterListProps {\n displayOptionsIn2Columns: boolean;\n filter: SearchFilter | MoreFilters;\n draftState: FilterState;\n setDraftState: (state: FilterState) => void;\n options: FilterOption[];\n}\n\nexport function CheckboxFilterList(props: CheckboxFilterListProps): JSX.Element {\n const selections = props.draftState.selection;\n\n function onToggleItem(option: FilterOption, isCurrentlyChecked: boolean): void {\n /**\n * If the item is currently checked, we remove it from the array\n */\n if (isCurrentlyChecked) {\n let indexOfItem: number = -1;\n\n // Find the index of the clicked item\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n // Return a new array with the clicked item sliced out\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n\n props.setDraftState({ active: !!newItems.length, selection: newItems });\n\n return;\n }\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n const newItems = [...selections];\n newItems.push(option);\n\n props.setDraftState({\n active: !!newItems.length,\n selection: newItems\n });\n }\n\n const options = props.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isChecked = !!props.draftState.selection.find(s => s.id.toString() === option.id.toString());\n const joinedIds = Array.isArray(option.id) ? option.id.join('_') : option.id;\n \n return (\n <li key={joinedIds} className={`my-1 ${props.displayOptionsIn2Columns ? 'col-md-6 col-12' : ''}`}>\n <Checkbox\n label={option.name}\n name={joinedIds}\n id={joinedIds}\n onChange={() => onToggleItem(option, isChecked)}\n checked={!isDisabled && isChecked}\n isLabelEllipsis={props.displayOptionsIn2Columns}\n disabled={isDisabled}\n />\n </li>\n );\n });\n \n return <ul className={`list-unstyled ${props.displayOptionsIn2Columns ? 'd-flex flex-wrap' : ''}`}>{options}</ul>;\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { CheckboxFilterList } from './CheckboxFilterList';\n\nexport function CheckboxFilter(props: FilterProps): JSX.Element {\n const displayOptionsIn2Columns = FilterHelper.displayTwoColumns(props.filter);\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form className='mb-3'>\n <CheckboxFilterList\n displayOptionsIn2Columns={displayOptionsIn2Columns}\n options={props.filter.options}\n filter={props.filter}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n />\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype NestedFilterOptionsProps = FilterProps & {\n onToggleItem: (selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean) => void;\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function NestedFilterOptions(props: NestedFilterOptionsProps): JSX.Element {\n const allOptions: JSX.Element[] = [];\n\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n const isFirstLayerIndeterminate = getIsFirstLayerIndeterminate(currentSelection, secondLayerOptions);\n const isFirstLayerOptionChecked = !isFirstLayerIndeterminate && !!currentSelection;\n\n // 1st layer\n allOptions.push(\n <Checkbox\n key={firstLayerOption.id}\n label={firstLayerOption.name}\n name={firstLayerOption.id}\n id={firstLayerOption.id}\n indeterminate={isFirstLayerIndeterminate}\n onChange={() => props.onToggleItem(firstLayerOption, isFirstLayerOptionChecked || isFirstLayerIndeterminate)}\n checked={ !isFirstLayerOptionDisabled && isFirstLayerOptionChecked}\n className='my-1'\n disabled={isFirstLayerOptionDisabled}\n />\n );\n\n // 2nd layer\n const showSecondLayer = FilterHelper.hasManyFilterOptions(secondLayerOptions);\n\n showSecondLayer && allOptions.push(\n ...secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1 ms-3'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n })\n );\n }\n\n return <>{allOptions}</>;\n}\n\nfunction getIsFirstLayerIndeterminate(currentSelection: FilterOption, secondLayerOptions: FilterOption[]): boolean {\n const hasSecondLayerSelection = currentSelection?.secondLayerSelection?.length > 0;\n const allSecondLayerOptionsChecked = currentSelection?.secondLayerSelection?.length === secondLayerOptions.length;\n return hasSecondLayerSelection && !allSecondLayerOptionsChecked;\n}","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype SecondLayerOptionProps = FilterProps & {\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function SecondLayerOptions(props: SecondLayerOptionProps): JSX.Element {\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n\n const options = secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n });\n\n return <>{options}</>;\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { NestedFilterOptions } from './components/NestedFilterOptions';\nimport { SecondLayerOptions } from './components/SecondLayerOptions';\n\nexport function NestedCheckboxFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options;\n\n function onToggleItem(selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean): void {\n const { selection } = props.draftState;\n const indexOfOption = selection.findIndex(o => o.id === selectedOption.id);\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n if (!isCurrentlyCheckedOrIndeterminate) {\n const enabled2ndLayerOptions = (options\n ?.find(o => o.id === selectedOption.id).secondLayerOptions)\n ?.filter(o => !o.disabled);\n\n // Also select all enabled 2nd layer options\n const newSelectedOptionWith2ndLayerOptions =\n { ...selectedOption, secondLayerSelection: enabled2ndLayerOptions };\n\n // Add new option\n if (selection.length === 0 || indexOfOption === -1) {\n const newSelection = [ ...selection, newSelectedOptionWith2ndLayerOptions ];\n\n props.setDraftState({\n active: true,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === selectedOption.id) {\n return newSelectedOptionWith2ndLayerOptions;\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n /**\n * If the item is currently checked, we remove it from the array\n */\n const newSelection = ArrayHelper.removeItemFromIndex(\n selection,\n selection.findIndex(selectionItem => selectionItem.id === selectedOption.id)\n );\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n function onToggleChildItem(\n selectedOption: FilterOption,\n isCurrentlyChecked: boolean,\n parentOption: FilterOption\n ): void {\n const { selection } = props.draftState;\n const indexOfParentOption = selection.findIndex(o => o.id === parentOption.id);\n\n if (!isCurrentlyChecked) {\n const newChildSelection = [ ...selection[indexOfParentOption]?.secondLayerSelection ?? [], selectedOption ];\n\n // If no selection/new item is not in selection, add new option\n if (selection.length === 0 || indexOfParentOption === -1) {\n const newParentSelection = {\n ...parentOption,\n secondLayerSelection: newChildSelection\n };\n\n const newSelection = [ ...selection, newParentSelection ];\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfParentOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n return {\n ...firstLayer,\n secondLayerSelection: newChildSelection\n };\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n // Uncheck child\n let newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n const new2ndLayerSelection = ArrayHelper.removeItem(firstLayer.secondLayerSelection, selectedOption);\n return { ...parentOption, secondLayerSelection: new2ndLayerSelection };\n }\n\n return firstLayer;\n });\n\n // Uncheck parent if no child\n if (newSelection[indexOfParentOption].secondLayerSelection.length === 0) {\n newSelection = ArrayHelper.removeItem(newSelection, parentOption);\n }\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n <Form className='mb-3'>\n { FilterHelper.hasManyFilterOptions(options)\n ? <NestedFilterOptions onToggleItem={onToggleItem} onToggleChildItem={onToggleChildItem} {...props} />\n : <SecondLayerOptions onToggleChildItem={onToggleChildItem} {...props} />\n }\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nexport function SwitchFilter(props: FilterProps): JSX.Element {\n const isActive = props.draftState.active;\n\n function onToggle(): void {\n props.setDraftState({ active: !isActive });\n }\n\n return (\n <>\n <FilterDropdownTitle id={props.filter.id} title={props.filter.name} />\n\n <div className='d-flex align-items-start justify-content-between'>\n <p className='d-inline-block w-75'>{props.filter.description}</p>\n\n <ToggleSwitch id={props.filter.id} disabled={props.filter.disabled} onClick={onToggle} on={isActive} />\n </div>\n </>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nexport function DropdownFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n {props.filter.options.map(option => (\n <Dropdown.Item\n key={option.id}\n onClick={() => onSelect(option)}\n disabled={props.filter.disabled || option.disabled}\n >\n {option.name}\n </Dropdown.Item>\n ))}\n </>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport styles from './radio-filter.module.scss';\n\nexport function RadioFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form>\n <ul className={`${props.isOnMoreFilters ? 'd-flex flex-wrap' : ''} list-unstyled`}>\n {props.filter.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isSelected = ArrayHelper.first(props.draftState.selection)?.id.toString() === option.id.toString();\n return (\n <li key={option.id} className={`${props.isOnMoreFilters ? 'w-50' : ''}`}>\n <Form.Check\n type='radio'\n label={option.name}\n name={option.id}\n id={option.id}\n value={option.id}\n onChange={() => onSelect(option)}\n checked={!isDisabled && isSelected}\n className={`${styles.radioFilter}`}\n disabled={isDisabled}\n />\n </li>\n );\n })}\n </ul>\n </Form>\n </>\n );\n}","import React from 'react';\nimport { ButtonGroup } from 'react-bootstrap';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { Rating, YearGroup } from 'libs/shared/interfaces';\n\ninterface RatingButtonProps {\n rating: Rating;\n isActive: boolean;\n onClick: () => void;\n onHover: (rating: Rating) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n disabled?: boolean;\n}\n\nfunction RatingButton(props: RatingButtonProps): JSX.Element {\n const [ ref, isHovering ] = useHover<HTMLDivElement>({ delay: 1 });\n\n React.useEffect(() => {\n props.onHover(isHovering ? props.rating : null);\n }, [isHovering]);\n\n if (!props.rating.code)\n return <></>;\n\n const button = (\n <DivButton\n ref={ref}\n className={props.getButtonClasses(props.rating, props.isActive, isHovering)}\n onClick={props.onClick}\n disabled={props.disabled}\n >\n {props.rating.code}\n </DivButton>\n );\n\n if (props.disabled)\n return button;\n\n return (\n <Tooltip title={props.rating.name} spanHack>\n {button}\n </Tooltip>\n );\n}\n\ninterface RatingRangeSelectorProps {\n ratings: Rating[];\n yearGroup?: YearGroup;\n yearGroups?: YearGroup[];\n selections: Rating[];\n onSelectRange: (range: Rating[]) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n isDisabled?: (rating: Rating) => boolean;\n disabled?: boolean;\n}\n\nRatingRangeSelector.defaultProps = {\n selections: []\n};\n\nexport function RatingRangeSelector(props: RatingRangeSelectorProps): JSX.Element {\n const [ hoverRange, setHoverRange ] = React.useState<Rating[]>([]);\n\n function getRange(rating: Rating): Rating[] {\n return props.ratings.filter(r => r.code && r.value <= rating.value);\n }\n\n function onClickRating(rating: Rating): void {\n props.onSelectRange(getRange(rating));\n }\n\n function onHover(rating: Rating): void {\n if (!rating || props.isDisabled(rating)) {\n setHoverRange([]);\n return;\n }\n }\n\n function isActive(rating: Rating): boolean {\n if (hoverRange.length)\n return !!hoverRange.find(r => r.id === rating.id);\n\n return !!props.selections.find(r => r.id === rating.id);\n }\n\n return (\n <div>\n <ButtonGroup as='ul' className='list-unstyled mb-0'>\n {props.ratings.map(rating => (\n <li key={rating.id}>\n <RatingButton\n rating={rating}\n onClick={() => onClickRating(rating)}\n onHover={onHover}\n isActive={isActive(rating)}\n disabled={props.disabled || props.isDisabled?.(rating)}\n getButtonClasses={props.getButtonClasses}\n />\n </li>\n ))}\n </ButtonGroup>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { RatingRangeSelector } from 'libs/shared/components/rating-range-selector/RatingRangeSelector';\nimport { Rating } from 'libs/shared/interfaces';\n\nimport styles from './rating-filter.module.scss';\n\ntype OptionType = FilterOption & Rating;\n\nexport function RatingFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options as OptionType[];\n\n function onSelectRange(range: OptionType[]): void {\n props.setDraftState({\n active: !!range.length,\n selection: range as FilterOption[]\n });\n }\n\n const filteredRatings: Rating[] = options.filter(r => r.code);\n const [firstRating] = filteredRatings;\n const lastRating = filteredRatings[filteredRatings.length - 1];\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n <p>{props.filter.description}</p>\n\n <div className='mb-2'>\n <RatingRangeSelector\n ratings={options}\n selections={props.draftState.selection as Rating[]}\n onSelectRange={onSelectRange}\n disabled={props.filter.disabled}\n isDisabled={(rating: Rating & FilterOption) => rating.disabled}\n getButtonClasses={(rating, isActive, isHovering) => {\n let className = 'btn border text-nowrap';\n\n if (isActive || isHovering)\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n if (isHovering)\n className += ' active';\n\n if (filteredRatings.length === 1)\n className += ' rounded';\n else if (firstRating.id === rating.id)\n className += ' ' + styles.firstButton;\n else if (lastRating.id === rating.id)\n className += ' ' + styles.lastButton;\n else\n className += ' rounded-0';\n\n return className;\n }}\n />\n </div>\n </>\n );\n}","export const FilterConstants = {\n FILTER_PARAM_PREFIX: 'filters.',\n MAX_CHECKBOXES_PER_COLUMN: 10\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { FilterOption, SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { Library } from 'libs/shared/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst LIBRARY_FILTER = `${FilterConstants.FILTER_PARAM_PREFIX}library`;\n\nfunction getTypeMap(libraries: Library[]): HashObject {\n return libraries.reduce<HashObject>((prev, next) => {\n return {\n ...prev,\n [next.type]: true\n };\n }, {});\n}\n\nexport const SourceFilterHelper = {\n getOptions(opts: {\n libraries: Library[],\n isLearner: boolean,\n isGuest: boolean,\n hasCustomLibraries: boolean\n }): FilterOption<SourceFilterOptions>[] {\n const { libraries, isLearner, isGuest, hasCustomLibraries } = opts;\n\n const options: FilterOption<SourceFilterOptions>[] = [];\n\n const libraryTypes = getTypeMap(libraries);\n\n if (libraryTypes[MasterObjectTypes.Workspace] && !isGuest)\n options.push({ id: SourceFilterOptions.MyVideos, name: getPhrase('myVideos') });\n\n if (libraryTypes[MasterObjectTypes.CustomLibrary] && (!isLearner || hasCustomLibraries))\n options.push({ id: SourceFilterOptions.School, name: getPhrase('schoolVideos') });\n\n if (libraryTypes[MasterObjectTypes.Exchange])\n options.push({ id: SourceFilterOptions.ExchangeArchive, name: getPhrase('exchangeArchiveVideos') });\n\n if (libraryTypes[MasterObjectTypes.HostedLibrary])\n options.push({ id: SourceFilterOptions.ClickView, name: getPhrase('clickViewVideos') });\n\n return options;\n },\n\n getBackendParamValue(\n val: SourceFilterOptions | SourceFilterOptions[],\n libraries: Library[]\n ): HashObject {\n const values = Array.isArray(val) ? val : [val];\n\n return values.reduce((acc, value) => {\n return libraries.reduce((prev, next) => {\n const libraryIds = prev[LIBRARY_FILTER] || [];\n \n if (value === SourceFilterOptions.MyVideos && next.type === MasterObjectTypes.Workspace)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.School && next.type === MasterObjectTypes.CustomLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n\n if (value === SourceFilterOptions.ExchangeArchive && next.type === MasterObjectTypes.Exchange)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.ClickView && next.type === MasterObjectTypes.HostedLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n return prev;\n }, acc);\n }, {} as HashObject);\n }\n};","export enum CustomerStatus {\n Unclassified = 0,\n Active = 1,\n Prospect = 2,\n LostCustomer = 3,\n Disabled = 4,\n Other = 5\n}\n\nexport enum CustomerStatusString {\n Unclassified = 'Unclassified',\n Active = 'Active',\n Prospect = 'Prospect',\n LostCustomer = 'LostCustomer',\n Disabled = 'Disabled',\n Other = 'Other'\n}","import { SpecialEventType } from 'libs/shared/interfaces';\n\nexport const SpecialEventTypeLabelMap: Record<SpecialEventType, string> = {\n [SpecialEventType.BreakingNews]: 'Breaking news',\n [SpecialEventType.HistoricalEvent]: 'Historical event',\n [SpecialEventType.Holiday]: 'Holiday',\n [SpecialEventType.Informal]: 'Informal',\n [SpecialEventType.Livestream]: 'Livestream',\n [SpecialEventType.NaturalDisaster]: 'Natural disaster',\n [SpecialEventType.Observance]: 'Observance',\n [SpecialEventType.ReligiousEvent]: 'Religious event',\n [SpecialEventType.SportingEvent]: 'Sporting event',\n \n [SpecialEventType.Other]: 'Other'\n};","import React from 'react';\n\nexport function WizardActionInfoContainer(props: React.PropsWithChildren<any>): JSX.Element {\n return (\n <div className='alert text-dark bg-light-blue px-2 rounded-3'>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserActivationActionInfo';\n\ninterface BulkUserActivationActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserActivationActionInfo(props: BulkUserActivationActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='deactivate' /></h4>\n <p>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'deactivateInfoStudent' : 'deactivateInfoStaff'} />\n </p>\n\n <h4 className='h5'><Text namespace={namespace} phrase='reactivate' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'reactivateInfoStudent' : 'reactivateInfoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserActivationEmailActionInfo';\n\nexport function BulkUserActivationEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.addToClassroomActionInfo';\n\nexport function BulkAddToClassroomActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.changeYearGroupActionInfo';\n\nexport function BulkChangeYearGroupActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserDeleteActionInfo';\n\ninterface BulkUserDeleteActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserDeleteActionInfo(props: BulkUserDeleteActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='delete' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserRemoveActionInfo';\n\ninterface BulkUserRemoveActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserRemoveActionInfo(props: BulkUserRemoveActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='remove' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserResetEmailActionInfo';\n\nexport function BulkUserResetEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkResetPasswordActionInfo';\n\nexport function BulkResetPasswordActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserYearGroupRolloverActionInfo';\n\nexport function BulkUserYearGroupRolloverActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nexport function CheckCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12 3c4.972 0 9 4.028 9 9s-4.028 9-9 9-9-4.028-9-9 4.028-9 9-9m4.244 5.578a.77.77 0 0 0-1.058.068l-4.722 5.18-1.684-1.615a.77.77 0 0 0-1.06 0 .7.7 0 0 0 0 1.018l2.25 2.16a.77.77 0 0 0 1.094-.035l5.25-5.76a.7.7 0 0 0-.07-1.016'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserStatusBadgeProps {\n user?: Partial<User>;\n status?: ObjectStatus;\n currentUser?: CurrentUser;\n className?: string;\n showActiveBadge?: boolean;\n}\n\nexport function UserStatusBadge(props: UserStatusBadgeProps): JSX.Element {\n return (\n <>\n {/* \"Deactivated\" badge */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Disabled) && (\n <div className={`text-white px-1 ${styles.badge} bg-danger ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='deactivated' />\n </div>\n )}\n\n {/* \"Pending badge\" */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Inactive) && (\n <div className={`text-white px-1 ${styles.badge} ${styles.pending} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'pendingTooltip')} spanHack>\n <Text namespace={namespace} phrase='pending' />\n </Tooltip>\n </div>\n )}\n\n\n {/* \"Active badge\" */}\n {props.showActiveBadge &&\n (UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Active)\n && (\n <div className={`text-white px-1 ${styles.badge} ${styles.active} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'active')} spanHack>\n <Text namespace={namespace} phrase='active' />\n </Tooltip>\n </div>\n )}\n\n {/* \"That's me\" badge */}\n {props.user?.id.toString() === props.currentUser?.id.toString() && (\n <div className={`text-white px-1 ${styles.badge} bg-blue ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='thatsYou' />\n </div>\n )}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CheckCircleSvg } from 'libs/shared/images/svg/status/CheckCircleSvg';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { UserStatusBadge } from './UserStatusBadge';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface BasicUserDetailsProps {\n user: Partial<User>;\n currentUser?: CurrentUser;\n wrapperClassName?: string;\n}\n\nexport function BasicUserDetails(props: BasicUserDetailsProps): JSX.Element {\n const { user, currentUser } = props;\n\n return (\n <div className={`d-flex flex-column justify-content-center me-auto w-100 ${props.wrapperClassName}`}>\n <div className='pb-1 d-flex align-items-center'>\n {/* Name, username, and status */}\n <div className={`d-flex ${styles.name}`}>\n {user.name ? (\n <h2\n className='h5 m-0 me-1 d-inline-block align-middle text-truncate'\n title={`${user.name} ${user.surname || ''}`}\n >\n {user.name} {user.surname || ''}\n </h2>\n ) : (\n <span className='fst-italic text-secondary me-2'>\n <Text namespace={namespace} phrase='noName' />\n </span>\n )}\n {user.username && (\n <>\n (\n <p title={user.username} className={`m-0 d-inline-block align-middle text-truncate ${styles.username}`}>\n {user.username}\n </p>\n )\n </>\n )}\n </div>\n\n <UserStatusBadge user={user} currentUser={currentUser} className='ms-2' />\n </div>\n\n {/* Email and verification status */}\n <div className='d-flex'>\n {!!user.metadata?.isEmailVerified && (\n <SvgContainer\n className={`svg-container text-secondary ms-n1 ${styles.verifiedEmail}`}\n svg={CheckCircleSvg}\n title={LanguageService.getPhrase(namespace, 'emailVerified')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n )}\n <p className='text-truncate mb-0 overflow-visible'>\n {user.email\n ? user.email\n : (\n <span className='fst-italic'>\n <Text namespace={namespace} phrase='noEmail' />\n </span>\n )\n }\n </p>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface RoleOrYearGroupProps {\n userType: UserGroup;\n user?: Partial<User>;\n countryCode?: string;\n badgeText?: string;\n}\n\nfunction getBadgeText(props: RoleOrYearGroupProps): string {\n if (props.userType === UserGroup.Learner) {\n if (props.user?.masterYearGroup?.name)\n return props.user?.masterYearGroup.name;\n\n if (props.user?.yearGroups?.data?.length)\n return ArrayHelper.first(props.user?.yearGroups.data).name;\n\n return null;\n }\n\n if (props.userType === UserGroup.Staff) {\n if (props.user?.userProfile?.role === UserRole.Admin)\n return LanguageService.getPhrase(namespace, 'admin');\n \n if (props.user?.userProfile?.role === UserRole.SuperAdmin)\n return LanguageService.getPhrase(namespace, props.countryCode === 'US' ? 'superAdminUs' : 'superAdmin');\n\n return null;\n }\n}\n\nexport function RoleOrYearGroup(props: RoleOrYearGroupProps): JSX.Element {\n const badgeText = props.badgeText || getBadgeText(props);\n\n if (!badgeText)\n return <></>;\n\n return (\n <div className={`rounded-pill border border-dark bg-white px-2 me-3 d-inline-block flex-shrink-0`}>\n {badgeText}\n </div>\n );\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\ninterface UserItemAvatarProps {\n user: Partial<User>;\n imageCdnUrl: string;\n}\n\nexport function UserItemAvatar(props: UserItemAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} mx-2`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { BaseUserItemProps } from 'libs/shared/apps/user-manager/components/user-list/UserList';\nimport { BasicUserDetails } from 'libs/shared/apps/user-manager/components/user-list-items/components/BasicUserDetails';\nimport { RoleOrYearGroup } from 'libs/shared/apps/user-manager/components/user-list-items/components/RoleOrYearGroup';\nimport { UserItemAvatar } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemAvatar';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface BulkUserActionsErroredUserItemProps extends BaseUserItemProps {\n imageCdnUrl: string;\n errorMessage: string;\n currentUser?: CurrentUser;\n}\n\nexport function BulkUserActionsErroredUserItem(props: BulkUserActionsErroredUserItemProps): JSX.Element {\n return (\n <li className='d-flex align-items-center p-2'>\n <UserItemAvatar user={props.user} imageCdnUrl={props.imageCdnUrl} />\n\n <BasicUserDetails user={props.user} currentUser={props.currentUser} />\n\n <RoleOrYearGroup userType={props.userType} user={props.user} />\n\n <p className='mb-0 mx-2 text-danger'>\n {props.errorMessage}\n </p>\n </li>\n );\n}","export enum UserManagerClient {\n Online = 'online',\n Primary = 'primary',\n Curator = 'curator'\n}","import React from 'react';\n\ntype WizardContext = {\n disableNext?: boolean;\n setDisableNext?: (val: boolean) => void;\n\n onClickConfirm?: () => void;\n setOnClickConfirm?: (cb: () => void) => void;\n\n showButtons?: boolean;\n setShowButtons?: (val: boolean) => void;\n\n showSpinner?: boolean;\n setShowSpinner?: (val: boolean) => void;\n};\n\nexport const WizardLayoutContext = React.createContext<WizardContext>({});\n\nexport const WizardLayoutContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ disableNext, setDisableNext ] = React.useState(false);\n const [ onClickConfirm, setOnClickConfirm ] = React.useState(null);\n const [ showButtons, setShowButtons ] = React.useState(true);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n return (\n <WizardLayoutContext.Provider value={{\n disableNext,\n setDisableNext,\n onClickConfirm,\n setOnClickConfirm,\n showButtons,\n setShowButtons,\n showSpinner,\n setShowSpinner\n }}>\n {props.children}\n </WizardLayoutContext.Provider>\n );\n};","export enum BatchDataType {\n Unknown = 0,\n Staff = 1,\n Learner = 2,\n MasterVideo = 3,\n Rostering = 8,\n MarketingProfile = 16\n}","export enum BatchJobName {\n YearGroupRollover = 'year-group-rollover',\n ChangeYearGroup = 'change-year-group',\n DeleteUser = 'delete-user',\n RemoveUser = 'remove-user',\n DeactivateUser = 'deactivate-user',\n ActivateUser = 'activate-user',\n AddToClassroom = 'add-to-classroom',\n ResetPassword = 'reset-password',\n SendResetPasswordEmail = 'send-reset-password-email',\n SendAccountActivationEmail = 'send-account-activation-email',\n CreateUser = 'create-user',\n\n AddToAudience = 'add-to-audience',\n AddToBackboneClassification = 'add-to-backbone-classification',\n AddToBackboneAudience = 'add-to-backbone-audience',\n AddToClassification = 'add-to-classification',\n AddToSeries = 'add-to-series',\n AddToDirector = 'add-to-director',\n AddToDistributor = 'add-to-distributor',\n AddToProductionCompany = 'add-to-production-company',\n AddToProducer = 'add-to-producer',\n SetProductionYear = 'set-production-year',\n AddToLibrary = 'add-to-library',\n AddToCurationTag = 'add-to-curation-tag',\n AddToSkillTag = 'add-to-skill-tag',\n AddToPedagogyTag = 'add-to-pedagogy-tag',\n AddToNormalTag = 'add-to-normal-tag',\n AddToHiddenTag = 'add-to-hidden-tag',\n AddResourceAndLink = 'add-resource-and-link',\n\n Rostering = 'rostering',\n MarketingProfile = 'marketing-profile',\n UpdateProspectDomains = 'update-prospect-domains',\n AddAliases = 'add-aliases',\n AddPartnerProfiles = 'add-partner-profiles'\n}","export enum BatchJobResultErrorCode {\n NoAction = 1,\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n Succeed = 1,\n Unknown = 10,\n\n CustomerNotFound = 100,\n UserNotFound = 101,\n\n EmailNotVerified = 131,\n UserDisabled = 133,\n\n InvalidYearGroup = 200,\n MissingYearGroup = 201,\n NewYearGroupNotSet = 202,\n\n ObjectNotFoundInBackboneClassification = 300,\n ObjectNotFoundInBackboneAudience = 301\n}","export enum BatchJobType {\n RolloverYearGroup = 1,\n DeactivateUser = 2,\n ChangeYearGroup = 3,\n DeleteUser = 4,\n CreateUser = 5,\n ResetPassword = 6,\n AddUsersClassroom = 7,\n SendAccountReminderEmail = 8,\n ActivateUser = 9,\n AddToBackboneClassification = 10,\n AddToClassification = 11,\n AddToBackboneAudience = 12,\n AddToAudience = 13,\n AddVideosSeries = 14,\n AddVideosDistributor = 15,\n AddVideosProductionCompany = 16,\n AddVideosProducer = 17,\n AddVideosDirector = 18,\n AddVideosLibrary = 19,\n AddVideosResourceAndLinks = 21,\n AddVideosTag = 22,\n SendAccountActivationEmail = 23,\n RemoveUser = 24,\n Rostering = 25,\n MarketingProfile = 26,\n SetProductionYear = 28,\n UpdateProspectDomains = 29,\n AddAliases = 30,\n AddPartnerProfiles = 31\n}","import React from 'react';\n\nexport function KeySvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12.335 4C14.7258 4.00011 16.6631 5.90392 16.6631 8.26074C16.6629 9.95954 15.6586 11.3904 13.877 12.2334L15.2314 13.5742C15.4776 13.8297 15.4899 14.2192 15.2373 14.4619L13.7734 15.8994L14.7773 16.8828C15.0235 17.1318 15.0366 17.5149 14.7842 17.7705L12.7822 19.7441C12.523 19.9933 12.153 19.9618 11.8809 19.7383L10.8252 18.8252C10.6373 18.6591 10.5723 18.4158 10.5723 18.2051V12.1758C8.99791 11.4924 8.00018 9.97233 8 8.26074C8 5.89108 9.9246 4 12.335 4ZM12.335 5.02832C10.5078 5.02832 9.03711 6.47232 9.03711 8.26074C9.03732 9.79975 10.0929 11.096 11.6152 11.4346V18.0264L12.335 18.7285L13.7471 17.3174L12.8271 16.4229V15.3633L14.2012 14.0283L12.9307 12.7695V11.4795C14.5568 11.0963 15.6199 9.78709 15.6201 8.26074C15.6201 6.47238 14.1556 5.02843 12.335 5.02832ZM12.3496 5.875C13.125 5.875 13.7559 6.50584 13.7559 7.28125C13.7559 8.05666 13.125 8.6875 12.3496 8.6875C11.5744 8.68728 10.9434 8.05652 10.9434 7.28125C10.9434 6.50598 11.5744 5.87522 12.3496 5.875ZM12.3496 6.8125C12.0913 6.81272 11.8809 7.02291 11.8809 7.28125C11.8809 7.53959 12.0913 7.74978 12.3496 7.75C12.6081 7.75 12.8184 7.53972 12.8184 7.28125C12.8184 7.02278 12.6081 6.8125 12.3496 6.8125Z'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { BulkUserActionOptions, BulkUserActionStepId, BulkUserSubAction } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BulkUserActivationActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo';\nimport { BulkUserActivationEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo';\nimport { BulkAddToClassroomActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo';\nimport { BulkChangeYearGroupActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo';\nimport { BulkUserDeleteActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo';\nimport { BulkUserRemoveActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo';\nimport { BulkUserResetEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo';\nimport { BulkResetPasswordActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo';\nimport { BulkUserYearGroupRolloverActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo';\nimport { BulkUserActionsErroredUserItem } from 'libs/shared/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { AllowYearGroupRollover } from 'libs/shared/apps/user-manager/hooks/useAllowAnnualYearGroupRollover';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkUserActionsAddToClassroomViewModel, BulkUserActionsResetPasswordViewModel, BulkUserActionsViewModel, BulkUserActionsYearGroupRolloverViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { WizardOptionHash } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { WizardStep } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobResultErrorCode } from 'libs/shared/enums/BatchJobResultErrorCode';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { ClassroomsSvg } from 'libs/shared/images/svg/objects/ClassroomsSvg';\nimport { EmailSvg } from 'libs/shared/images/svg/objects/EmailSvg';\nimport { FolderSvg } from 'libs/shared/images/svg/objects/FolderSvg';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { GroupSvg } from 'libs/shared/images/svg/objects/GroupSvg';\nimport { KeySvg } from 'libs/shared/images/svg/objects/KeySvg';\nimport { AddToClassroomJobMetadata, BaseBatchJobMetadata, BatchJobMetadata, ChangeYearGroupJobMetadata, CreateBatchJobRequest, CurrentUser, ResetPasswordJobMetadata, User, WizardActionVerb, YearGroup, YearGroupRolloverJobMetadata } from 'libs/shared/interfaces';\nimport { CountsByStatus } from 'libs/shared/interfaces/models/SearchAggregation';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\nexport const SUPPORTED_BATCH_JOB_TYPES = [\n BatchJobType.ActivateUser,\n BatchJobType.AddUsersClassroom,\n BatchJobType.ChangeYearGroup,\n BatchJobType.DeactivateUser,\n BatchJobType.DeleteUser,\n BatchJobType.ResetPassword,\n BatchJobType.RolloverYearGroup,\n BatchJobType.SendAccountReminderEmail,\n BatchJobType.CreateUser,\n BatchJobType.SendAccountActivationEmail,\n BatchJobType.RemoveUser\n];\n\nexport const BulkUserActionsHelper = {\n getSteps(\n userType: UserGroup,\n userCount: number,\n appLinks?: UserManagerAppLinks,\n action?: BulkUserActionOptions\n ): WizardStep<BulkUserActionStepId>[] {\n const actions: WizardStep<BulkUserActionStepId>[] = [\n {\n id: 'select-action',\n text: getPhrase('choose'),\n appLink: appLinks?.bulkActionsSelectAction\n },\n {\n id: 'action-details',\n text: getPhrase('details'),\n appLink: appLinks?.bulkActionsActionDetails?.[action],\n disabled: !appLinks?.bulkActionsActionDetails?.[action]\n },\n {\n id: 'confirmation',\n text: getPhrase('confirmation')\n },\n {\n id: 'status',\n text: getPhrase('status')\n }\n ];\n\n const reviewAccountsAction: WizardStep<BulkUserActionStepId> = {\n id: 'review-accounts',\n text: getPhrase(userType === UserGroup.Learner ? 'reviewStudents' : 'reviewStaff'),\n subText: getPhrase(userType === UserGroup.Learner ? 'reviewSubTextStudents' : 'reviewSubTextStaff', { smartCount: userCount }),\n appLink: appLinks?.bulkActionsReviewAccounts\n };\n\n if (typeof (userCount) !== 'number')\n delete reviewAccountsAction.subText;\n\n actions.unshift(reviewAccountsAction);\n\n return actions;\n },\n\n getActionOptions({\n userType,\n allowYearGroupRollover,\n countsByStatus,\n client,\n products,\n yearGroups,\n hasClassroomsFeature\n }: {\n userType: UserGroup,\n allowYearGroupRollover: AllowYearGroupRollover,\n countsByStatus: CountsByStatus,\n client: UserManagerClient,\n products?: ProductId[],\n yearGroups?: YearGroup[],\n hasClassroomsFeature: boolean\n}): WizardOptionHash<BulkUserActionOptions>[] {\n const actions: WizardOptionHash<BulkUserActionOptions>[] = [];\n\n actions.push({\n order: 40,\n id: 'activation',\n icon: FolderSvg,\n name: getPhrase('deactivateReactivate'),\n infoComponent: () => <BulkUserActivationActionInfo userType={userType} />\n });\n\n const disableDeleteAction = !countsByStatus?.Disabled && !countsByStatus?.Inactive;\n\n const showDelete = client !== UserManagerClient.Primary || products?.includes(ProductId.Online);\n if (showDelete) {\n actions.push({\n order: 50,\n id: 'delete',\n icon: DeleteSvg,\n name: getPhrase('delete'),\n infoComponent: () => <BulkUserDeleteActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('deleteDisabledTooltip') : ''\n });\n }\n const showRemove = client !== UserManagerClient.Online && !products?.includes(ProductId.Online);\n\n if (showRemove) {\n actions.push({\n order: 50,\n id: 'removeFromSchool',\n icon: DeleteSvg,\n name: getPhrase('removeFromSchool'),\n infoComponent: () => <BulkUserRemoveActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('removeFromSchoolDisabledTooltip') : ''\n });\n }\n\n if (userType === UserGroup.Learner) {\n if (yearGroups?.length > 1) {\n actions.push({\n order: 20,\n id: 'changeYearGroup',\n icon: GroupSvg,\n name: getPhrase('changeYearGroup'),\n infoComponent: () => <BulkChangeYearGroupActionInfo />\n });\n }\n \n actions.push({\n order: 30,\n id: 'resetPassword',\n icon: KeySvg,\n name: getPhrase('resetPassword'),\n // TODO: Replace all of these info components with a shared component that accepts a heading and message prop\n infoComponent: () => <BulkResetPasswordActionInfo />\n });\n\n actions.push({\n order: 35,\n id: 'activationEmail',\n icon: EmailSvg,\n name: getPhrase('activationEmail'),\n infoComponent: () => <BulkUserActivationEmailActionInfo />\n });\n\n if (hasClassroomsFeature) {\n actions.push({\n order: 60,\n id: 'addToClassroom',\n icon: ClassroomsSvg,\n name: getPhrase('addToClassroom'),\n infoComponent: () => <BulkAddToClassroomActionInfo />\n });\n }\n \n if (yearGroups?.length > 1) {\n actions.push({\n order: 70,\n id: 'yearGroupRollover',\n icon: GraduationCapSvg,\n name: getPhrase('yearGroupRollover'),\n infoComponent: () => <BulkUserYearGroupRolloverActionInfo />,\n disabled: !allowYearGroupRollover?.canRollover,\n tooltip: getYearGroupRolloverDisabledTooltip(allowYearGroupRollover)\n });\n }\n }\n\n if (userType === UserGroup.Staff) {\n actions.push({\n order: 60,\n id: 'resetEmail',\n icon: EmailSvg,\n name: getPhrase('resetEmail'),\n infoComponent: () => <BulkUserResetEmailActionInfo />\n });\n }\n\n return actions.sort((a, b) => a.order - b.order);\n },\n\n mapSubActionToDisplayName(subAction: BulkUserSubAction): string {\n switch (subAction) {\n case 'yearGroupRollover':\n return getPhrase('yearGroupRolloverDisplayName');\n case 'changeYearGroup':\n return getPhrase('changeYearGroupDisplayName');\n case 'deactivate':\n return getPhrase('deactivateDisplayName');\n case 'reactivate':\n return getPhrase('reactivateDisplayName');\n case 'delete':\n return getPhrase('deleteDisplayName');\n case 'addToClassroom':\n return getPhrase('addToClassroomDisplayName');\n case 'resetPassword':\n return getPhrase('resetPasswordDisplayName');\n case 'resetEmail':\n return getPhrase('resetEmailDisplayName');\n case 'activationEmail':\n return getPhrase('activationEmailDisplayName');\n case 'removeFromSchool':\n return getPhrase('removeFromSchoolDisplayName');\n default:\n return '';\n }\n },\n\n getWizardAppLinks(appLinks: UserManagerAppLinks): Core.AppLink[] {\n const actionDetailsActions = Object.keys(appLinks.bulkActionsActionDetails)\n .map((key: keyof typeof appLinks.bulkActionsActionDetails) => {\n return appLinks.bulkActionsActionDetails[key];\n });\n\n const confirmationAppLinks = Object.keys(appLinks.bulkActionsConfirmation)\n .map((key: keyof typeof appLinks.bulkActionsConfirmation) => {\n return appLinks.bulkActionsConfirmation[key];\n });\n\n const statusAppLinks = Object.keys(appLinks.bulkActionsStatus)\n .map((key: keyof typeof appLinks.bulkActionsStatus) => {\n return appLinks.bulkActionsStatus[key];\n });\n\n return [\n appLinks.bulkActionsReviewAccounts,\n appLinks.bulkActionsSelectAction,\n ...actionDetailsActions,\n ...confirmationAppLinks,\n ...statusAppLinks\n ];\n },\n\n getErrorListItem(\n object: ObjectWithErrorCode<User>,\n imageCdnUrl: string,\n currentUser?: CurrentUser\n ): JSX.Element {\n const errorMessage = this.getUserErrorMessage(object.errorCode);\n return (\n <BulkUserActionsErroredUserItem\n user={object}\n userType={object.userType}\n imageCdnUrl={imageCdnUrl}\n errorMessage={errorMessage}\n currentUser={currentUser}\n />\n );\n },\n\n getUserErrorMessage(errorCode: BatchJobResultErrorCode): string {\n switch (errorCode) {\n case BatchJobResultErrorCode.NoAction:\n case BatchJobResultErrorCode.Succeed:\n return '';\n\n case BatchJobResultErrorCode.InvalidYearGroup:\n return getPhrase('invalidYearGroupError');\n case BatchJobResultErrorCode.MissingYearGroup:\n return getPhrase('missingYearGroupError');\n case BatchJobResultErrorCode.NewYearGroupNotSet:\n return getPhrase('yearGroupUpdateError');\n\n case BatchJobResultErrorCode.EmailNotVerified:\n return getPhrase('emailNotVerifiedError');\n\n case BatchJobResultErrorCode.UserDisabled:\n return getPhrase('userDeactivatedError');\n\n /**\n * I feel like by the this point, none of these errors should be getting thrown.\n * If they do get thrown, we use a generic error message and append the error code\n * in case it does happen and a screenshot is sent to support (hoping this helps).\n */\n case BatchJobResultErrorCode.Unknown:\n case BatchJobResultErrorCode.CustomerNotFound:\n case BatchJobResultErrorCode.UserNotFound:\n default:\n return getPhrase('genericUnexpectedError', { errorCode });\n }\n },\n\n getCreateJobRequestData(\n viewModel: BulkUserActionsViewModel,\n customerId: string,\n userType: UserGroup,\n currentUser?: CurrentUser\n ): CreateBatchJobRequest {\n switch (viewModel.subAction) {\n case 'yearGroupRollover': {\n return {\n name: BatchJobName.YearGroupRollover,\n type: BatchJobType.RolloverYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getYearGroupRolloverJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel,\n customerId\n )\n };\n }\n\n case 'changeYearGroup': {\n return {\n name: BatchJobName.ChangeYearGroup,\n type: BatchJobType.ChangeYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getChangeYearGroupJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel\n )\n };\n }\n\n case 'delete': {\n return {\n name: BatchJobName.DeleteUser,\n type: BatchJobType.DeleteUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'removeFromSchool': {\n return {\n name: BatchJobName.RemoveUser,\n type: BatchJobType.RemoveUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'deactivate': {\n return {\n name: BatchJobName.DeactivateUser,\n type: BatchJobType.DeactivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getDeactivateUsersJobMetadata(viewModel, currentUser)\n };\n }\n\n case 'reactivate': {\n return {\n name: BatchJobName.ActivateUser,\n type: BatchJobType.ActivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'addToClassroom': {\n return {\n name: BatchJobName.AddToClassroom,\n type: BatchJobType.AddUsersClassroom,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getAddToClassroomJobMetadata(\n viewModel as BulkUserActionsAddToClassroomViewModel\n )\n };\n }\n\n case 'resetPassword': {\n return {\n name: BatchJobName.ResetPassword,\n type: BatchJobType.ResetPassword,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getResetPasswordJobMetadata(viewModel as BulkUserActionsResetPasswordViewModel)\n };\n }\n\n case 'resetEmail': {\n return {\n name: BatchJobName.SendResetPasswordEmail,\n type: BatchJobType.SendAccountReminderEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'activationEmail': {\n return {\n name: BatchJobName.SendAccountActivationEmail,\n type: BatchJobType.SendAccountActivationEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n default:\n Core.ErrorHelper.throw(\n new DevError(`No handler for type ${viewModel.subAction} in BulkUserActionsHelper.getCreateJobRequestData`)\n );\n }\n\n return null;\n },\n\n useSetWizardConfirmationCallback(onClickConfirm: () => void): void {\n const { setOnClickConfirm } = React.useContext(WizardLayoutContext);\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n React.useEffect(() => {\n setOnClickConfirm(() => onClickConfirm);\n }, [viewModel?.subAction]);\n },\n\n useCreateJobErrorAlert(): () => void {\n const alerts = useAlerts();\n return () => {\n alerts.error(getPhrase('failedToCreateJob'));\n };\n },\n\n mapDataTypeToUserType(dataType: BatchDataType): UserGroup {\n switch (dataType) {\n case BatchDataType.Staff:\n return UserGroup.Staff;\n case BatchDataType.Learner:\n return UserGroup.Learner;\n default:\n return UserGroup.Unknown;\n }\n },\n\n mapUserTypeToDataType(userType: UserGroup): BatchDataType {\n switch (userType) {\n case UserGroup.Learner:\n return BatchDataType.Learner;\n case UserGroup.Staff:\n return BatchDataType.Staff;\n case UserGroup.Unknown:\n return BatchDataType.Unknown;\n }\n },\n\n getActionTypeFilterOptions(): FilterOption<BatchJobType>[] {\n return [{\n id: BatchJobType.ActivateUser,\n name: getPhrase('activate')\n }, {\n id: BatchJobType.DeactivateUser,\n name: getPhrase('deactivate')\n }, {\n id: BatchJobType.DeleteUser,\n name: getPhrase('deleteUser')\n }, {\n id: BatchJobType.RolloverYearGroup,\n name: getPhrase('yearGroupRollover')\n }, {\n id: BatchJobType.ChangeYearGroup,\n name: getPhrase('changeYearGroup')\n }, {\n id: BatchJobType.CreateUser,\n name: getPhrase('createUser')\n }, {\n id: BatchJobType.ResetPassword,\n name: getPhrase('resetPassword')\n }, {\n id: BatchJobType.SendAccountReminderEmail,\n name: getPhrase('resetEmail')\n }, {\n id: BatchJobType.AddUsersClassroom,\n name: getPhrase('addToClassroom')\n }, {\n id: BatchJobType.SendAccountActivationEmail,\n name: getPhrase('activationEmail')\n }, {\n id: BatchJobType.RemoveUser,\n name: getPhrase('removeFromSchool')\n }];\n },\n\n getUserTypeFilterOptions(): FilterOption<UserGroup>[] {\n return [{\n id: UserGroup.Staff,\n name: getPhrase('staff')\n }, {\n id: UserGroup.Learner,\n name: getPhrase('students')\n }];\n },\n\n mapSubActionToVerb(subAction: BulkUserSubAction): WizardActionVerb {\n if (subAction === 'delete')\n return 'Delete';\n\n if (subAction === 'removeFromSchool')\n return 'Remove';\n\n if (subAction === 'resetEmail' || subAction === 'activationEmail')\n return 'Email';\n\n if (subAction === 'addToClassroom')\n return 'Add';\n\n return 'Update';\n },\n\n mapJobTypeToName(type: BatchJobType): string {\n switch (type) {\n case BatchJobType.ActivateUser:\n return getPhrase('activate');\n case BatchJobType.AddUsersClassroom:\n return getPhrase('addToClassroom');\n case BatchJobType.ChangeYearGroup:\n return getPhrase('changeYearGroup');\n case BatchJobType.DeactivateUser:\n return getPhrase('deactivate');\n case BatchJobType.DeleteUser:\n return getPhrase('delete');\n case BatchJobType.ResetPassword:\n return getPhrase('resetPassword');\n case BatchJobType.RolloverYearGroup:\n return getPhrase('yearGroupRollover');\n case BatchJobType.SendAccountReminderEmail:\n return getPhrase('sendAccountReminderEmail');\n case BatchJobType.CreateUser:\n return getPhrase('bulkUpload');\n case BatchJobType.SendAccountActivationEmail:\n return getPhrase('sendAccountActivationEmail');\n case BatchJobType.RemoveUser:\n return getPhrase('removeUser');\n default:\n return getPhrase('unknown');\n }\n },\n\n hasFilterOrQuery(params: UserManagerQueryParams): boolean {\n return !!(params.query ||\n params.isAdmin ||\n params.status ||\n params.yearGroup);\n }\n};\n\nfunction setupBaseJobMetadata(\n viewModel: BulkUserActionsViewModel\n): BatchJobMetadata {\n return {\n batchObjectIds: [...viewModel.userIdMap.keys()],\n fullBatchObjects: undefined\n };\n}\n\nfunction getYearGroupRolloverJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel,\n customerId: string\n): YearGroupRolloverJobMetadata {\n // Year level rollover can only ever be run with all students\n return {\n fullBatchObjects: {\n source: 'UserApi',\n ownerId: customerId,\n objectType: MasterType.User,\n query: `{userType:${UserGroup.Learner}}`\n },\n finalYearGroupId: viewModel.yearGroup.id\n };\n}\n\nfunction getChangeYearGroupJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel\n): ChangeYearGroupJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ChangeYearGroupJobMetadata;\n\n metadata.newYearGroupId = viewModel.yearGroup.id;\n\n return metadata;\n}\n\nfunction getResetPasswordJobMetadata(\n viewModel: BulkUserActionsResetPasswordViewModel\n): ResetPasswordJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ResetPasswordJobMetadata;\n\n metadata.newPassword = viewModel.password;\n metadata.changeOnNextLogin = viewModel.changeOnNextLogin;\n\n return metadata;\n}\n\nfunction getYearGroupRolloverDisabledTooltip(status: AllowYearGroupRollover): string {\n if (status.canRollover)\n return '';\n\n switch (status.reason) {\n case 'select-all-students':\n return getPhrase('selectAllStudents');\n case 'cooldown':\n return getPhrase('rolloverCooldown', {\n date: DateHelper.format(status.lastRolloverDate, 'DD/MM/YYYY')\n });\n }\n}\n\nfunction getAddToClassroomJobMetadata(\n viewModel: BulkUserActionsAddToClassroomViewModel\n): AddToClassroomJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as AddToClassroomJobMetadata;\n\n metadata.classroomIds = [viewModel.classroom.id];\n\n return metadata;\n}\n\nfunction getDeactivateUsersJobMetadata(\n viewModel: BulkUserActionsViewModel,\n currentUser: CurrentUser\n): BatchJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as BaseBatchJobMetadata;\n\n if (!currentUser?.id)\n return metadata;\n\n metadata.batchObjectIds = metadata.batchObjectIds?.filter(id => {\n return id.toString() !== currentUser.id.toString();\n }) ?? [];\n\n return metadata;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { DurationFilterOptions, FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'search.durationFilter';\n\nfunction mapOptionToDurationRange(option: FilterOption<DurationFilterOptions>): string {\n let phraseKey = '';\n\n switch (option.id) {\n case 'bite-sized':\n phraseKey = 'rangeBiteSized';\n break;\n\n case 'short':\n phraseKey = 'rangeShort';\n break;\n \n case 'medium':\n phraseKey = 'rangeMedium';\n break;\n\n case 'long':\n phraseKey = 'rangeLong';\n break;\n }\n \n return LanguageService.getPhrase(namespace, phraseKey);\n}\n\ninterface DurationOptionProps {\n onClick: (option: FilterOption<DurationFilterOptions>) => void;\n option: FilterOption<DurationFilterOptions>;\n active: boolean;\n disabled?: boolean;\n}\n\nfunction DurationOption(props: DurationOptionProps): JSX.Element {\n return (\n <li className='d-flex flex-fill flex-column align-items-center mb-2 mb-md-0 mx-1'>\n <button\n onClick={() => props.onClick(props.option)}\n className={`btn w-100 text-center btn-${props.active ? 'dark' : 'outline-dark'} mb-1`}\n disabled={props.disabled}\n >\n {props.option.name}\n </button>\n\n <span>{mapOptionToDurationRange(props.option)}</span>\n </li>\n );\n}\n\nexport function DurationFilter(props: FilterProps): JSX.Element {\n const currentSelection = ArrayHelper.first(props.draftState.selection);\n\n function onClickDuration(duration: FilterOption<DurationFilterOptions>): void {\n // If the clicked option is already selected, deselect it\n if (currentSelection?.id === duration.id) {\n props.setDraftState({\n active: false,\n selection: []\n });\n \n return;\n }\n\n props.setDraftState({\n active: true,\n selection: [duration]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <ul className='d-flex list-unstyled flex-column flex-md-row mx-n1 mb-2'>\n {props.filter.options.map(option => (\n <DurationOption\n key={option.id}\n option={option as FilterOption<DurationFilterOptions>}\n onClick={onClickDuration}\n active={currentSelection?.id === option.id}\n disabled={props.filter.disabled || option.disabled}\n />\n ))}\n </ul>\n </>\n );\n}","export const XmasConstants = {\n IS_XMAS: false\n};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { XmasConstants } from 'libs/shared/constants/XmasConstants';\n\nimport styles from './movies-and-tv-filter.module.scss';\n\nconst namespace = 'search.moviesAndTvFilter';\n\ninterface MoviesAndTvFilterProps {\n filter: SearchFilter;\n iconUrl: string;\n extraIconUrl: string\n}\n\nexport function MoviesAndTvFilter(props: MoviesAndTvFilterProps): JSX.Element {\n const filter = props.filter;\n const { state } = React.useContext(FilterContext);\n\n const currentFilterState = state[filter.id];\n const isActive = currentFilterState?.active;\n\n // local state to correct attach & detach animation class\n const [ isFloating, setIsFloating ] = React.useState(false);\n const activeRef = React.useRef(isFloating);\n\n React.useEffect(() => {\n if (isActive !== activeRef.current) {\n activeRef.current = isActive;\n }\n if (isFloating !== activeRef.current)\n setIsFloating(activeRef.current);\n }, [isActive]);\n\n function applyFilter(newState: FilterState): void {\n FilterHelper.applyFilter(\n [filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n \n return (\n <DivButton\n onClick={() => {\n setIsFloating(!isActive);\n applyFilter({ active: !isActive });\n }}\n className={classNames(\n 'mx-1 btn position-relative fw-semibold d-flex align-items-center flex-shrink-0',\n isActive ? 'btn-dark' : 'btn-outline-dark',\n props.filter.disabled && 'disabled'\n )}\n disabled={props.filter.disabled}\n >\n \n <img src={props.iconUrl} className={`${styles.icon} position-absolute ${isActive ? styles.activeIcon : ''}`}/>\n \n <div className={styles.text}>\n <Text namespace={namespace} phrase={'title'}/>\n </div>\n\n <img\n src={props.extraIconUrl}\n className={classNames(\n 'position-absolute',\n styles.floatingIcon,\n isFloating ? styles.active : styles.default,\n XmasConstants.IS_XMAS && styles.xmas\n )}\n />\n </DivButton>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport { CheckboxFilterList } from '../checkbox-filter/CheckboxFilterList';\n\nexport function GroupedCheckboxFilter(props: FilterProps): JSX.Element {\n const optionGroups: Record<string, FilterOption[]> = {};\n\n for (const option of props.filter.options) {\n if (!option.group)\n continue;\n\n if (!optionGroups[option.group])\n optionGroups[option.group] = [];\n\n optionGroups[option.group].push(option);\n }\n\n return (\n <Form className='mb-3'>\n {Object.entries(optionGroups).map(([ groupName, options ]) => {\n return (\n <ul className='list-unstyled' key={groupName}>\n <FilterDropdownTitle title={groupName} />\n <CheckboxFilterList\n filter={props.filter}\n options={options}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n displayOptionsIn2Columns={false}\n />\n </ul>\n );\n })}\n </Form>\n );\n}\n","import { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport const ClassificationFilterHelper = {\n deriveInitialClassificationFilterStateFromQueryParams(filter: SearchFilter, selections: any): FilterOption[] {\n return filter?.options?.filter(option => {\n const areAllIdsInOptionFoundInSelections = option.id.split(':').every(id => {\n const isIdFoundInSelections = selections.find(\n (selectedId: number | string) => selectedId.toString() === id.toString()\n );\n\n return isIdFoundInSelections;\n });\n\n return areAllIdsInOptionFoundInSelections;\n }) ?? [];\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DurationFilterOptions, FilterOption } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const DurationFilterHelper = {\n getOptions(): FilterOption<DurationFilterOptions>[] {\n return [\n {\n id: 'bite-sized',\n name: getPhrase('durationBiteSized')\n },\n {\n id: 'short',\n name: getPhrase('durationShort')\n },\n {\n id: 'medium',\n name: getPhrase('durationMedium')\n },\n {\n id: 'long',\n name: getPhrase('durationLong')\n }\n ];\n },\n\n getBackendParamValue(value: DurationFilterOptions): string {\n switch (value) {\n case 'bite-sized':\n return '...179999'; // 3 minutes in ms\n case 'short':\n return '180000...299999'; // 3 - 5 minutes in ms\n \n case 'medium':\n return '300000...899999'; // 5 - 15 minutes in ms\n \n case 'long':\n return '900000...'; // 15 minutes in ms\n }\n }\n};","import { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\n\nimport { getSelectedOptions } from './FilterHelper';\n\nexport const PresentationFilterHelper = {\n deriveInitialPresentationFilterStateFromQueryParams:\n (filterOptions: FilterOption[], selections: any, queryParams: HashObject): FilterOption[] => {\n return getSelectedOptions(filterOptions, selections)\n .map(option => {\n const audienceSelection = queryParams['audience'];\n\n if (!audienceSelection?.length)\n return option;\n\n const secondLayerSelection = getSelectedOptions(option.secondLayerOptions, audienceSelection);\n\n return { ...option, secondLayerSelection };\n }).filter(r => {\n return !!r.secondLayerSelection?.length;\n });\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterOption, ProductionYearFilterOptions } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const ProductionYearFilterHelper = {\n getOptions(): FilterOption<ProductionYearFilterOptions>[] {\n return [\n {\n id: 'any-year',\n name: getPhrase('anyYear'),\n default: true\n },\n {\n id: 'this-year',\n name: getPhrase('thisYear')\n },\n {\n id: 'last-3-years',\n name: getPhrase('last3Years')\n },\n {\n id: 'last-5-years',\n name: getPhrase('last5Years')\n }\n ];\n },\n\n getBackendParamValue(value: ProductionYearFilterOptions): string {\n const currentYear = new Date().getFullYear();\n \n switch (value) {\n case 'any-year':\n return '';\n \n case 'this-year':\n return `${currentYear}...`;\n \n case 'last-3-years':\n return `${currentYear - 3}...`;\n \n case 'last-5-years':\n return `${currentYear - 5}...`;\n }\n }\n};","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { Rating, User, YearGroup } from 'libs/shared/interfaces';\n\nexport const RatingFilterHelper = {\n deriveInitialRatingFilterStateFromQueryParams(range: string | [], filter: SearchFilter): FilterOption[] {\n /**\n * When the rating filter is cleared, the app router temporarily sets the rating query param\n * value to an empty array instead of a string. In this case, we just return no selections\n */\n if (Array.isArray(range))\n return range;\n\n const ratingOptions = filter.options as Rating[];\n\n const ratingRange = getRatingsFromFrontendQuery(range, ratingOptions);\n\n if (!ratingRange.length)\n return [];\n\n const highestRating = ArrayHelper.last(ratingRange);\n\n return ratingOptions.filter(option => {\n return option.value > 0 && option.value <= highestRating.value;\n }) as FilterOption[];\n },\n\n getFrontendParamValue(selections: Rating[]): string {\n if (!selections?.length)\n return '';\n \n const first = ArrayHelper.first(selections);\n const last = ArrayHelper.last(selections);\n\n if (selections.length === 1)\n return first.code;\n \n return `${first.code}-to-${last.code}`;\n },\n \n getBackendParamValue(range: string, ratings: Rating[]): string {\n const selectedRatings = getRatingsFromFrontendQuery(range, ratings);\n \n if (!selectedRatings.length)\n return undefined;\n \n if (selectedRatings.length === 1) {\n const upperValue = ArrayHelper.first(selectedRatings);\n return `0...${upperValue.value}`;\n }\n \n const upperValue = ArrayHelper.last(selectedRatings);\n return `0...${upperValue.value}`;\n },\n\n getStudentMaxRating(yearGroups: YearGroup[], user: User): Rating {\n const studentYearGroup = ArrayHelper.findWhere(\n yearGroups,\n { value: user.masterYearGroup?.value }\n );\n\n return studentYearGroup?.rating;\n }\n};\n\nfunction getRatingsFromFrontendQuery(range: string, ratings: Rating[]): Rating[] {\n const codes = range.split('-to-');\n const foundRatings = codes.map(code => ratings.find(r => r.code === code));\n\n /**\n * If we can't map all our values, don't use any values.\n */\n if (!foundRatings.every(r => !!r))\n return [];\n\n return foundRatings;\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, FilterDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CheckboxFilter, DropdownFilter, NestedCheckboxFilter, RadioFilter, SwitchFilter } from 'libs/shared/apps/search/components/filter-types';\nimport { RatingFilter } from 'libs/shared/apps/search/components/filter-types/rating-filter/RatingFilter';\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { AllSearchIndicesInSearch, AllSearchIndicesInUserManager, AllSearchIndicesVideoStyle, FilterIds, FilterOption, FilterProps, FilterType, FilterWhitelist, MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { AnalyticsFilterHash } from 'libs/shared/apps/search/interfaces/AnalyticsFilterHash';\nimport { DraftState, FilterPayloadType, FilterState, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { SourceFilterHelper } from 'libs/shared/apps/search/utils/SourceFilterHelper';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { CustomerStatus, CustomerStatusString } from 'libs/shared/enums/CustomerStatus';\nimport { CustomerType, CustomerTypeString } from 'libs/shared/enums/CustomerType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, Customer, Library, MasterNestedObject, PresentationWithAudiences, Rating, SpecialEventType, YearGroup } from 'libs/shared/interfaces';\n\nimport { SpecialEventTypeLabelMap } from '../../calendar/constants/SpecialEventTypeLabelMap';\nimport { BulkUserActionsHelper } from '../../user-manager/utils/BulkUserActionsHelper';\nimport { DurationFilter } from '../components/filter-types/custom/duration-filter/DurationFilter';\nimport { MoviesAndTvFilter } from '../components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter';\nimport { GroupedCheckboxFilter } from '../components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter';\n\nimport { ClassificationFilterHelper } from './ClassificationFilterHelper';\nimport { DurationFilterHelper } from './DurationFilterHelper';\nimport { PresentationFilterHelper } from './PresentationFilterHelper';\nimport { ProductionYearFilterHelper } from './ProductionYearFilterHelper';\nimport { RatingFilterHelper } from './RatingFilterHelper';\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from './SharedSearchHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('sharedSearch.utils');\n\ntype MixinDisableFieldsFn = {\n mainFilters: SearchFilter[];\n moreFilters?: MoreFilters;\n};\n\nconst TwoColumnFilters: Record<string, boolean> = {\n classification: true,\n categoryId: true,\n channel: true\n};\n\ninterface GetValidIndicesOptions {\n hasPartnerProfiles: boolean;\n}\n\nfunction getValidIndices(options: GetValidIndicesOptions): Record<string, boolean> {\n const allIndices: Record<string, boolean> = {\n series: true,\n video: true,\n playlist: true,\n classification: true,\n clip: true,\n interactive: true,\n company: true,\n category: true,\n partner_profile: false\n };\n\n if (options.hasPartnerProfiles) {\n allIndices.partner_profile = true;\n allIndices.company = false;\n }\n \n return allIndices;\n}\n\nexport const Filters: Filters = {\n SortBy: (options: FilterOption[], labelPrefix?: string) => ({\n id: 'sort',\n name: getPhrase('newest'),\n type: 'dropdown',\n options,\n compatibleIndices: [ ...AllSearchIndicesInSearch, ...AllSearchIndicesInUserManager ],\n labelPrefix\n }),\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch: boolean) => ({\n id: 'presentation',\n secondaryId: 'audience',\n name: getPhrase('schoolLevels'),\n type: 'nested-checkbox',\n options: getMappedPresentationOptions(options),\n compatibleIndices: _hasNewSearch ?\n [ 'playlist', 'series', 'clip', 'interactive', 'video', 'company', 'category' ] :\n AllSearchIndicesInSearch\n }),\n Topics: (options: FilterOption[]) => ({\n compatibleIndices: [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video' ],\n options,\n type: 'checkbox',\n name: getPhrase('topicsFilter'),\n id: 'classification'\n }),\n Source: (options: FilterOption[]) => ({\n id: 'source',\n type: 'checkbox',\n name: getPhrase('sources'),\n options,\n compatibleIndices: [ 'video', 'clip', 'interactive', 'category' ]\n }),\n MoviesAndTv: (url: string, extraUrl: string) => ({\n id: 'moviesAndTv',\n name: getPhrase('moviesAndTv'),\n type: 'button',\n compatibleIndices: [ 'video', 'series', 'clip', 'interactive', 'classification', 'playlist', 'company' ],\n customComponent: props => (\n <MoviesAndTvFilter\n {...props}\n filter={props.filter as SearchFilter}\n iconUrl={url}\n extraIconUrl={extraUrl}\n />\n )\n }),\n YearGroup: (options: FilterOption[]) => ({\n id: 'yearGroup', // \"id\" should match the state keys in `FilterReducer`\n name: getPhrase('yearGroup'),\n type: 'checkbox',\n options,\n compatibleIndices: AllSearchIndicesInUserManager\n }),\n ObjectTypes: (inaccessibleIndices: SearchIndices[] = [], _hasNewSearch = false, _hasPartnerProfiles = false) => ({\n id: 'type',\n name: getPhrase('types'),\n type: _hasNewSearch ? 'grouped-checkbox' : 'checkbox',\n options: FilterHelper.getObjectTypeOptions(inaccessibleIndices, _hasNewSearch, _hasPartnerProfiles),\n disableOptions: FilterHelper.getIsObjectTypeOptionDisabled,\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Rating: (options: FilterOption[], maxRating: Rating) => ({\n id: 'rating',\n name: getPhrase('rating'),\n description: getPhrase('ratingDescription'),\n type: 'rating',\n options: options && maxRating ? options.filter((rating: Rating) => rating.value <= maxRating.value) : options,\n compatibleIndices: [ 'video', 'series' ]\n }),\n Interactives: () => ({\n id: 'interactives',\n name: getPhrase('interactives'),\n type: 'switch',\n description: getPhrase('interactivesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n Clips: () => ({\n id: 'clips',\n name: getPhrase('clips'),\n type: 'switch',\n description: getPhrase('clipsDescription'),\n compatibleIndices: ['video']\n }),\n HasResources: () => ({\n id: 'hasResources',\n name: getPhrase('resources'),\n type: 'switch',\n description: getPhrase('resourcesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n HasSubtitles: () => ({\n id: 'hasSubtitles',\n name: getPhrase('subtitles'),\n type: 'switch',\n description: getPhrase('subtitlesDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n ProductionYear: () => ({\n id: 'productionYear',\n name: getPhrase('productionYear'),\n type: 'radio',\n options: ProductionYearFilterHelper.getOptions(),\n compatibleIndices: [ ...AllSearchIndicesVideoStyle, 'series' ]\n }),\n IsHD: () => ({\n id: 'isHd',\n name: getPhrase('isHd'),\n type: 'switch',\n description: getPhrase('isHdDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n IsClickViewContent: () => ({\n id: 'producedByClickView',\n name: getPhrase('producedByClickView'),\n type: 'switch',\n description: getPhrase('producedByClickViewDescription'),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Duration: () => ({\n id: 'duration',\n name: getPhrase('duration'),\n type: 'radio',\n customComponent: DurationFilter,\n options: DurationFilterHelper.getOptions(),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n TagOrClassification: (options: string[]) => ({\n id: 'tagOrClassification',\n type: 'tag',\n options: options && options.map(option => ({\n id: option,\n name: option\n })),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Status: (options?: FilterOption[]) => ({\n id: 'status',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [ ...AllSearchIndicesInUserManager, 'customer' ],\n options: options || FilterHelper.getStatusOptions()\n }),\n JobStatus: () => ({\n id: 'jobStatus',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [],\n options: FilterHelper.getJobStatusOptions()\n }),\n IsAdmin: (customer: Customer, countryCode: string) => {\n const hasOrg = !!customer?.organisation;\n const isUs = countryCode === 'US';\n const description = !hasOrg ? getPhrase('isAdminDescription')\n : isUs ? getPhrase('isAdminDescriptionOrgUs') : getPhrase('isAdminDescriptionOrg');\n\n return {\n id: 'isAdmin',\n name: getPhrase('isAdmin'),\n type: 'switch',\n compatibleIndices: AllSearchIndicesInUserManager,\n description\n };\n },\n BulkActionType: () => ({\n id: 'bulkActionType',\n name: getPhrase('actionType'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getActionTypeFilterOptions(),\n compatibleIndices: []\n }),\n UserType: () => ({\n id: 'userType',\n name: getPhrase('users'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getUserTypeFilterOptions(),\n compatibleIndices: []\n }),\n TvFields: () => ({\n id: 'filter',\n name: getPhrase('tvFields'),\n type: 'radio',\n options: FilterHelper.getTvFieldsOptions(),\n compatibleIndices: []\n }),\n TvChannel: (channels: BaseObject[]) => ({\n id: 'channel',\n name: getPhrase('tvChannel'),\n type: 'checkbox',\n options: FilterHelper.getTvChannelOptions(channels),\n compatibleIndices: []\n }),\n TvDateBroadcast: () => ({\n id: 'dateBroadcast',\n name: getPhrase('tvDateBroadcast'),\n type: 'radio',\n options: FilterHelper.getTvDateBroadcastOptions(),\n compatibleIndices: []\n }),\n Categories: (categories: MasterNestedObject<Library>[]) => ({\n id: 'categoryId',\n name: getPhrase('categories'),\n type: 'checkbox',\n options: FilterHelper.getCategoriesOptions(categories),\n compatibleIndices: []\n }),\n CustomerStatus: () => ({\n id: 'customerStatus',\n name: getPhrase('customerStatus'),\n type: 'radio',\n options: FilterHelper.getCustomerStatusOptions(),\n compatibleIndices: []\n }),\n SpecialEventTypes: () => ({\n id: 'specialEventType',\n type: 'checkbox',\n name: 'Event Type',\n compatibleIndices: [],\n options: FilterHelper.getSpecialEventTypeOptions()\n }),\n CustomerType: () => ({\n id: 'customerType',\n name: getPhrase('customerType'),\n type: 'radio',\n options: FilterHelper.getCustomerTypeOptions(),\n compatibleIndices: []\n })\n};\n\ninterface Filters {\n SortBy: (options: FilterOption[], labelPrefix?: string) => SearchFilter;\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch?: boolean) => SearchFilter;\n Topics: (options: FilterOption[]) => SearchFilter;\n YearGroup: (options: FilterOption[]) => SearchFilter;\n MoviesAndTv: (iconUrl: string, extraUrl: string) => SearchFilter;\n ObjectTypes: (\n inaccessibleIndices: SearchIndices[],\n _hasNewSearch?: boolean,\n _hasPartnerProfiles?: boolean\n ) => SearchFilter;\n Rating: (options: FilterOption[], maxRating: Rating) => SearchFilter;\n Interactives: () => SearchFilter;\n Clips: () => SearchFilter;\n HasResources: () => SearchFilter;\n HasSubtitles: () => SearchFilter;\n ProductionYear: () => SearchFilter;\n IsHD: () => SearchFilter;\n IsClickViewContent: () => SearchFilter;\n Duration: () => SearchFilter;\n TagOrClassification: (options: string[]) => SearchFilter;\n Status: (options?: FilterOption[]) => SearchFilter;\n JobStatus: () => SearchFilter;\n IsAdmin: (customer?: Customer, countryCode?: string) => SearchFilter;\n BulkActionType: () => SearchFilter<BatchJobType>;\n UserType: () => SearchFilter<UserGroup>;\n TvFields: () => SearchFilter;\n TvChannel: (channels: BaseObject[]) => SearchFilter;\n TvDateBroadcast: () => SearchFilter;\n Categories: (categories: MasterNestedObject<Library>[]) => SearchFilter;\n Source: (options: FilterOption[]) => SearchFilter;\n CustomerStatus: () => SearchFilter;\n SpecialEventTypes: () => SearchFilter;\n CustomerType: () => SearchFilter;\n}\n\nfunction getMappedPresentationOptions(options: PresentationWithAudiences[]): FilterOption[] {\n if (!options)\n return [];\n\n return options.map(opt => ({\n ...opt,\n id: opt.id.toString(),\n secondLayerOptions: opt.audiences.map(a => ({ ...a, id: a.id.toString() }))\n }));\n}\n\nexport const FilterHelper = {\n displayTwoLayers(filter: SearchFilter): boolean {\n if (filter.type !== 'nested-checkbox')\n return false;\n\n // With one presso we only show second layer options\n if (!this.hasManyFilterOptions(filter.options))\n return false;\n\n // Show first layer only\n if (filter.options.every(o => !this.hasManyFilterOptions(o?.secondLayerOptions)))\n return false;\n\n return true;\n },\n\n hasManyFilterOptions(options: FilterOption[]) {\n return options.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n },\n\n displayTwoColumns(filter: SearchFilter | MoreFilters): boolean {\n return (\n (TwoColumnFilters[filter.id]) &&\n filter.options?.length >= FilterConstants.MAX_CHECKBOXES_PER_COLUMN\n );\n },\n\n showPresentationFilter(presentationFilter: SearchFilter): boolean {\n // If the school's topic presentation has no audiences, don't show\n if (!presentationFilter.options?.length)\n return false;\n\n // If the school has more than 1 topic presentation, always show\n if (presentationFilter.options.length > 1)\n return true;\n \n // If the school has only 1 topic presentation but it has >1 audience, always show\n if (ArrayHelper.first(presentationFilter.options).secondLayerOptions?.length > 1)\n return true;\n\n return false;\n },\n\n getMoreFilters(filters: SearchFilter[]): MoreFilters {\n return {\n id: 'moreFilters',\n name: getPhrase('moreFilters'),\n type: 'more-filters',\n filters\n };\n },\n\n mapTypeToComponent(type: FilterType): (props: FilterProps) => JSX.Element {\n switch (type) {\n case 'switch':\n return (props: any) => <SwitchFilter key={props.id} {...props} />;\n case 'checkbox':\n return (props: any) => <CheckboxFilter key={props.id} {...props} />;\n case 'nested-checkbox':\n return (props: any) => <NestedCheckboxFilter key={props.id} {...props} />;\n case 'grouped-checkbox':\n return (props: any) => <GroupedCheckboxFilter key={props.id} {...props} />;\n case 'radio':\n return (props: any) => <RadioFilter key={props.id} {...props} />;\n case 'rating':\n return (props: any) => <RatingFilter key={props.id} {...props} />;\n case 'dropdown':\n return (props: any) => <DropdownFilter key={props.id} {...props} />;\n default:\n return () => <></>;\n }\n },\n\n deriveInitialStateFromQuery(\n queryParams: HashObject = {},\n mainFilters: SearchFilter[] = null,\n moreFilters: MoreFilters = null,\n appLink: Core.AppLink\n ): FilterStateHash {\n const initialStates: Omit<FilterStateHash, 'appLink' | 'moreFilters'> = {\n sort: {\n active: !!queryParams.sort,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'sort')\n },\n\n classification: {\n active: !!queryParams.classification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classification')\n },\n\n presentation: {\n active: !!queryParams.presentation,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'presentation')\n },\n\n type: {\n active: !!queryParams.type,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'type')\n },\n\n specialEventType: {\n active: !!queryParams.specialEventType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'specialEventType')\n },\n\n rating: {\n active: !!queryParams.rating,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'rating')\n },\n \n interactives: {\n active: queryParams.interactives?.toString() === 'true'\n },\n\n clips: {\n active: queryParams.clips?.toString() === 'true'\n },\n\n yearGroup: {\n active: !!queryParams.yearGroup,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'yearGroup')\n },\n\n moviesAndTv: {\n active: queryParams.moviesAndTv?.toString() === 'true'\n },\n\n classroom: {\n active: !!queryParams.classroom,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classroom')\n },\n\n audience: {\n active: !!queryParams.audience,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'audience')\n },\n\n hasResources: {\n active: queryParams.hasResources?.toString() === 'true'\n },\n\n hasSubtitles: {\n active: queryParams.hasSubtitles?.toString() === 'true'\n },\n\n productionYear: {\n active: !!queryParams.productionYear,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'productionYear')\n },\n\n isHd: {\n active: queryParams.isHd?.toString() === 'true'\n },\n\n producedByClickView: {\n active: queryParams.producedByClickView?.toString() === 'true'\n },\n\n duration: {\n active: queryParams.duration,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'duration')\n },\n\n tagOrClassification: {\n active: !!queryParams.tagOrClassification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'tagOrClassification')\n },\n\n status: {\n active: !!queryParams.status,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'status')\n },\n\n jobStatus: {\n active: !!queryParams.jobStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'jobStatus')\n },\n isAdmin: {\n active: queryParams.isAdmin?.toString() === 'true'\n },\n\n bulkActionType: {\n active: !!queryParams.bulkActionType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'bulkActionType')\n },\n\n userType: {\n active: !!queryParams.userType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'userType')\n },\n\n filter: {\n active: !!queryParams.filter,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'filter')\n },\n\n channel: {\n active: !!queryParams.channel,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'channel')\n },\n\n dateBroadcast: {\n active: !!queryParams.dateBroadcast,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'dateBroadcast')\n },\n\n categoryId: {\n active: !!queryParams.categoryId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'categoryId')\n },\n \n hasInteractives: {\n active: !!queryParams.hasInteractives,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'hasInteractives')\n },\n\n source: {\n active: !!queryParams.source,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'source')\n },\n\n customerStatus: {\n active: !!queryParams.customerStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerStatus')\n },\n\n customerType: {\n active: !!queryParams.customerType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerType')\n },\n\n seriesId: {\n active: !!queryParams.seriesId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'seriesId')\n },\n\n scopeId: {\n active: !!queryParams.scopeId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'scopeId')\n }\n };\n\n const reduceFunc = (state: FilterStateHash, filter: SearchFilter<string>) => {\n const filterState = initialStates[filter.id];\n\n /**\n * If we had the query param value, but were not able to parse it into a valid selection.\n * We're actually not active.\n * \n * e.g. For `?rating=bleep-to-bloop` the value of !!queryParams.rating is true, but we are not able\n * to extract any meaningful values from it so the call to getFilterSelectionsFromQueryParams returns an empty array.\n * \n * - Sha\n */\n if (filterState.active && 'selection' in filterState && !filterState.selection?.length)\n filterState.active = false;\n\n state[filter.id] = initialStates[filter.id];\n return state;\n };\n\n const derivedState = mainFilters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n\n if (moreFilters?.filters) {\n derivedState.moreFilters = moreFilters.filters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n }\n\n derivedState.appLink = appLink;\n\n return derivedState;\n },\n\n hasActiveFilters(queryParams: HashObject): boolean {\n const paramKeys = Object.keys(queryParams);\n\n if (!paramKeys.length)\n return false;\n\n const activeFilters = paramKeys.filter(q => {\n // 'query', 'cursor', 'page', 'scopeId' and 'curriculumCode' don't count as filters\n if ([ 'query', 'cursor', 'page', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ].includes(q))\n return false;\n\n // Filters that can have multiple selections (e.g. checkbox types) do not count as active if they are empty\n if (Array.isArray(queryParams[q]) && !queryParams[q].length)\n return false;\n\n return true;\n });\n\n return !!activeFilters.length;\n },\n\n getLabel(filter: SearchFilter, filterState: FilterState): string {\n if (!filterState?.selection?.length)\n return filter.name;\n\n if (filter.type === 'dropdown')\n return ArrayHelper.first(filterState.selection).name;\n\n if (filter.type === 'radio') {\n const selection = ArrayHelper.first(filterState.selection);\n if (!selection || selection.default)\n return filter.name;\n\n return selection.name;\n }\n\n if (filter.type === 'nested-checkbox' || filter.type === 'checkbox' || filter.type === 'grouped-checkbox') {\n const isDefaultState = filter.options.find(opt => {\n return opt.default && filterState.selection.find(selection => selection.id === opt.id);\n });\n\n if (isDefaultState)\n return filter.name;\n\n if (filter.secondaryId) {\n const count = filterState.selection?.reduce((acc, firstLayerSelection) => {\n const availableOptions = filter.options;\n const index = availableOptions.findIndex(option => option.id === firstLayerSelection.id);\n if (availableOptions[index].secondLayerOptions?.length === 0) {\n return acc + 1;\n }\n\n return acc + (firstLayerSelection.secondLayerSelection?.length ?? 0);\n }, 0);\n\n return `${filter.name} - ${count}`;\n }\n\n return `${filter.name} - ${filterState.selection.length}`;\n }\n\n if (filter.type === 'rating') {\n if (!filterState.selection.length)\n return filter.name;\n\n const first = ArrayHelper.first(filterState.selection) as Rating;\n const last = ArrayHelper.last(filterState.selection) as Rating;\n\n if (filterState.selection.length === 1)\n return `${filter.name}: ${first.code}`;\n\n return `${filter.name}: ${first.code} to ${last.code}`;\n }\n },\n\n buildFrontendFilterParams(queryParams: HashObject, filterStates: Array<FilterPayloadType>): HashObject {\n const updatedParams = { ...queryParams };\n\n filterStates.forEach(filterState => {\n if (!filterState?.filter)\n return;\n\n const { id: param, type } = filterState.filter;\n const { active, selection } = filterState.state;\n\n switch (type) {\n case 'switch':\n updatedParams[param] = active ? 'true' : '';\n break;\n\n case 'radio':\n case 'dropdown':\n const isDefault =\n filterState.state.selection?.length === 1 && ArrayHelper.first(filterState.state.selection)?.default;\n\n updatedParams[param] = (filterState.state.selection.length && !isDefault) ? ArrayHelper.first(filterState.state.selection).id : '';\n break;\n\n case 'nested-checkbox':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n const { secondaryId: secondaryParam } = filterState.filter;\n\n if (secondaryParam) {\n // FlatMap\n updatedParams[secondaryParam] = [].concat(...selection.map(s => s.secondLayerSelection.map(o => o.id)));\n }\n\n break;\n\n case 'checkbox':\n case 'grouped-checkbox':\n if (!active) {\n updatedParams[param] = null;\n break;\n }\n\n const options = [];\n for (const option of selection) {\n const ids = option.id.toString().split(':');\n if (ids.length > 1) {\n // When an option has more than one id\n // e.g. An topic option can used by many presentations\n for (const id of ids) {\n options.push(id);\n }\n } else {\n options.push(option.id);\n }\n }\n\n updatedParams[param] = options;\n break;\n\n case 'tag':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n break;\n\n case 'rating':\n updatedParams[param] = active ? RatingFilterHelper.getFrontendParamValue(selection as Rating[]) : null;\n break;\n\n case 'button':\n updatedParams[param] = active ? 'true' : '';\n break;\n }\n\n if (!updatedParams[param]) // If the param is empty, delete it\n delete updatedParams[param];\n });\n\n return ObjectHelper.omit(updatedParams, ['cursor']);\n },\n\n buildBackendFilterParams(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationIds: string[],\n isLearner: boolean,\n libraries: Library[]\n ): HashObject {\n const defaultParams: HashObject = isLearner ? {\n ['filters.presentation']: presentationIds,\n isLearner\n } : {};\n\n return Object.keys(queryParams).reduce((acc: HashObject, paramName: FilterIds) => {\n const values = queryParams[paramName];\n\n if ((Array.isArray(values) && !values.length) || !values)\n return acc;\n\n if (!FilterWhitelist[paramName])\n return acc;\n\n if (paramName === 'rating') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = RatingFilterHelper.getBackendParamValue(values, ratings);\n return acc;\n }\n\n if (paramName === 'productionYear') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = ProductionYearFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'duration') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = DurationFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'moviesAndTv') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}curationTag`] = CurationTag.MOVIES_AND_TV;\n return acc;\n }\n\n if (paramName === 'source') {\n return {\n ...acc,\n ...SourceFilterHelper.getBackendParamValue(values, libraries)\n };\n }\n\n if (paramName === 'scopeId') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}partnerProfile`] = [values];\n return acc;\n }\n\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = values;\n\n return acc;\n }, defaultParams);\n },\n\n getAppliedIndices(\n queryParams: HashObject = {},\n _hasNewSearch: boolean = false,\n _hasPartnerProfiles: boolean = false\n ): SearchIndices[] {\n const { type: indices } = queryParams;\n\n const validIndices = getValidIndices({ hasPartnerProfiles: _hasPartnerProfiles });\n \n const newIndices: SearchIndices[] = ['category'];\n\n function validateIndices(indice: SearchIndices): boolean {\n if (_hasNewSearch) {\n return validIndices[indice];\n }\n\n return !newIndices.includes(indice) && validIndices[indice];\n }\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices].filter(validateIndices);\n\n if (indices.length)\n return indices.filter(validateIndices);\n }\n\n const extraIndices: SearchIndices[] = [];\n if (_hasNewSearch)\n extraIndices.push(...newIndices);\n \n if (queryParams.source)\n return [ 'video', 'clip', 'interactive', ...extraIndices ];\n\n if (_hasPartnerProfiles)\n return [ 'series', 'video', 'playlist', 'classification', 'clip', 'interactive', 'partner_profile', ...extraIndices ];\n\n return [ 'series', 'video', 'playlist', 'classification', 'clip', 'interactive', 'company', ...extraIndices ];\n },\n\n applyFilter(\n filters: Array<SearchFilter>,\n currentFilterState: FilterState | FilterStateHash,\n draftState: DraftState,\n baseAppLink: Core.AppLink\n ): void {\n if (ObjectHelper.isEqual(currentFilterState, draftState))\n return;\n\n const filterIds = Object.keys(draftState) as FilterIds[];\n\n const payload: Array<FilterPayloadType> = filterIds.map(filterId => {\n const filter = filters.find(f => f.id === filterId);\n const draftFilterState = draftState[filterId];\n\n const isDefaultValue =\n draftFilterState.selection?.length === 1 && ArrayHelper.first(draftFilterState.selection)?.default;\n\n return {\n filter,\n state: {\n active: draftFilterState.active && !isDefaultValue,\n selection: draftFilterState.selection\n }\n };\n });\n\n const currentQueryParams = Core.LocationUtils.GetQuery();\n Core.AppLinkHelper.trigger({\n ...baseAppLink,\n params: FilterHelper.buildFrontendFilterParams(currentQueryParams, payload)\n }, { replace: true });\n },\n\n mixinDisabledFields(\n state: FilterStateHash,\n indices: SearchIndices[],\n mainFilters: SearchFilter[],\n moreFilters?: MoreFilters\n ): MixinDisableFieldsFn {\n let allFilters = [ ...mainFilters, ...(moreFilters?.filters ?? []) ];\n\n // Iterate through each filter, and disable them if they should be disabled\n allFilters = disableFilters(state, allFilters, indices);\n\n // Iterate through each filter option, and disable them if they should be disabled\n allFilters = disableFilterOptions(state, allFilters);\n\n const response: MixinDisableFieldsFn = {\n mainFilters: allFilters.filter(filter => mainFilters.find(f => f.id === filter.id))\n };\n\n if (moreFilters?.filters) {\n response.moreFilters = {\n ...moreFilters,\n filters: allFilters.filter(filter => moreFilters.filters.find(f => f.id === filter.id))\n };\n }\n\n return response;\n },\n\n logFilterEvent(\n mainFilters: SearchFilter[],\n moreFilters: MoreFilters,\n state: FilterStateHash,\n query: string,\n analyticsOptions: AnalyticsOptions\n ): void {\n const analyticsFilterObjects: AnalyticsFilterHash[] = [];\n\n mainFilters?.forEach(f => {\n const filterState = state[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n moreFilters?.filters?.forEach(f => {\n const filterState = state.moreFilters[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n if (!analyticsFilterObjects.length)\n analyticsOptions.descriptor = FilterDescriptor.Reset;\n\n AnalyticsHelper.logUserAction({\n query: query ?? '',\n filters: analyticsFilterObjects\n }, AnalyticsHelper.mergeOptions(analyticsOptions, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Filter\n }));\n },\n\n /**\n * Helpers below this comment return hard coded filter options for a particular filter.\n * If you are adding a new filter with hard coded options, add a new function here.\n */\n getObjectTypeOptions(\n inaccessibleIndices: SearchIndices[] = [],\n _hasNewSearch: boolean,\n _hasPartnerProfiles: boolean\n ): FilterOption<SearchIndices>[] {\n if (_hasNewSearch) {\n const options: FilterOption<SearchIndices>[] = [\n {\n id: 'video',\n name: getPhrase('videos'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'clip',\n name: getPhrase('clips'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'classification',\n name: getPhrase('topics'),\n group: getPhrase('collections')\n },\n {\n id: 'series',\n name: getPhrase('series'),\n group: getPhrase('collections')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists'),\n group: getPhrase('collections')\n },\n {\n id: 'category',\n name: getPhrase('category'),\n group: getPhrase('collections')\n }\n ];\n \n if (_hasPartnerProfiles) {\n options.push({\n id: 'partner_profile',\n name: getPhrase('channels'),\n group: getPhrase('collections')\n });\n }\n \n return options.filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n }\n\n return [\n {\n id: 'classification',\n name: getPhrase('topics')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists')\n },\n {\n id: 'series',\n name: getPhrase('series')\n },\n {\n id: 'video',\n name: getPhrase('videos')\n },\n {\n id: 'clip',\n name: getPhrase('clips')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives')\n }\n ].filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n },\n\n /**\n * Loops through each option on the \"object type\" filter, and determines whether\n * they should be disabled based on the currently active filters\n */\n getIsObjectTypeOptionDisabled(\n options: FilterOption<SearchIndices>[],\n filters: SearchFilter[],\n state: FilterStateHash\n ): FilterOption<SearchIndices>[] {\n return options.map(option => {\n let isDisabled = false;\n\n filters.forEach(filter => {\n if (isDisabled)\n return;\n\n const filterState = state[filter.id] || state.moreFilters[filter.id];\n\n if (!filterState?.active || !filter.compatibleIndices?.length)\n return;\n\n if (!filter.compatibleIndices.find(i => option.id === i))\n isDisabled = true;\n });\n\n return {\n ...option,\n disabled: isDisabled\n };\n });\n },\n\n getNameSortOptions(): FilterOption[] {\n return [\n {\n id: 'newest',\n name: getPhrase('newest')\n },\n {\n id: 'oldest',\n name: getPhrase('oldest')\n },\n {\n id: 'first-name-atoz',\n name: getPhrase('firstNameAToZ')\n },\n {\n id: 'first-name-ztoa',\n name: getPhrase('firstNameZToA')\n },\n {\n id: 'surname-atoz',\n name: getPhrase('surnameAToZ')\n },\n {\n id: 'surname-ztoa',\n name: getPhrase('surnameZToA')\n }\n ];\n },\n\n getYearGroupOptions(yearGroups: YearGroup[]): FilterOption[] {\n if (!yearGroups?.length)\n return [];\n\n return yearGroups.map(y => ({\n id: y.value.toString(),\n name: y.name\n }));\n },\n\n getStatusOptions(): FilterOption[] {\n return [\n {\n id: 'active',\n name: getPhrase('active')\n },\n {\n id: 'deactivated',\n name: getPhrase('deactivated')\n },\n {\n id: 'pending',\n name: getPhrase('pending')\n }\n ];\n },\n\n getJobStatusOptions(): FilterOption[] {\n return [\n {\n id: 'completed',\n name: getPhrase('completed')\n },\n {\n id: 'failed',\n name: getPhrase('errored')\n },\n {\n id: 'inProgress',\n name: getPhrase('inProgress')\n }\n ];\n },\n\n getTvFieldsOptions(): FilterOption[] {\n return [\n {\n id: '0',\n name: getPhrase('allFields'),\n default: true\n },\n {\n id: '1',\n name: getPhrase('titleDescriptionField')\n },\n {\n id: '2',\n name: getPhrase('captionsField')\n }\n ];\n },\n\n getTvChannelOptions(channels: BaseObject[]): FilterOption[] {\n if (!channels?.length)\n return [];\n\n return channels.map(channel => ({\n id: channel.name,\n name: channel.name\n }));\n },\n\n getTvDateBroadcastOptions(): FilterOption[] {\n return [\n {\n id: 'any-time',\n name: getPhrase('anyTime'),\n default: true\n },\n {\n id: 'yesterday',\n name: getPhrase('yesterday')\n },\n {\n id: 'last-week',\n name: getPhrase('lastWeek')\n },\n {\n id: 'last-2-weeks',\n name: getPhrase('last2Weeks')\n }\n ];\n },\n\n getCustomerStatusOptions(): FilterOption[] {\n return [\n {\n id: CustomerStatus.Unclassified.toString(),\n name: CustomerStatusString.Unclassified\n },\n {\n id: CustomerStatus.Active.toString(),\n name: CustomerStatusString.Active\n },\n {\n id: CustomerStatus.Prospect.toString(),\n name: CustomerStatusString.Prospect\n },\n {\n id: CustomerStatus.LostCustomer.toString(),\n name: CustomerStatusString.LostCustomer\n },\n {\n id: CustomerStatus.Disabled.toString(),\n name: CustomerStatusString.Disabled\n },\n {\n id: CustomerStatus.Other.toString(),\n name: CustomerStatusString.Other\n }\n ];\n },\n\n getCustomerTypeOptions(): FilterOption[] {\n return [\n {\n id: CustomerType.Unclassified.toString(),\n name: CustomerTypeString.Unclassified\n },\n {\n id: CustomerType.Primary.toString(),\n name: CustomerTypeString.Primary\n },\n {\n id: CustomerType.Secondary.toString(),\n name: CustomerTypeString.Secondary\n },\n {\n id: CustomerType.K12.toString(),\n name: CustomerTypeString.K12\n },\n {\n id: CustomerType.Tertiary.toString(),\n name: CustomerTypeString.Tertiary\n },\n {\n id: CustomerType.NonEducational.toString(),\n name: CustomerTypeString.NonEducational\n },\n {\n id: CustomerType.Partners.toString(),\n name: CustomerTypeString.Partners\n },\n {\n id: CustomerType.Internal.toString(),\n name: CustomerTypeString.Internal\n },\n {\n id: CustomerType.Other.toString(),\n name: CustomerTypeString.Other\n },\n {\n id: CustomerType.ClickView.toString(),\n name: CustomerTypeString.ClickView\n },\n {\n id: CustomerType.System.toString(),\n name: CustomerTypeString.System\n }\n ];\n },\n \n getCategoriesOptions(categories: MasterNestedObject<Library>[]): FilterOption[] {\n if (!categories?.length)\n return [];\n\n // TODO: Custom nested checkbox\n return categories.map(category => {\n return {\n id: category.data.id,\n name: category.data.name\n // secondLayerOptions: category.children.map(\n // nestedCategory => ({ id: nestedCategory.data.id, name: nestedCategory.data.name })\n // )\n };\n });\n },\n\n getSpecialEventTypeOptions(): FilterOption[] {\n return [\n {\n id: SpecialEventType.BreakingNews,\n name: SpecialEventTypeLabelMap[SpecialEventType.BreakingNews]\n },\n {\n id: SpecialEventType.SportingEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.SportingEvent]\n },\n {\n id: SpecialEventType.Observance,\n name: SpecialEventTypeLabelMap[SpecialEventType.Observance]\n },\n {\n id: SpecialEventType.NaturalDisaster,\n name: SpecialEventTypeLabelMap[SpecialEventType.NaturalDisaster]\n },\n {\n id: SpecialEventType.HistoricalEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.HistoricalEvent]\n },\n {\n id: SpecialEventType.Holiday,\n name: SpecialEventTypeLabelMap[SpecialEventType.Holiday]\n },\n {\n id: SpecialEventType.Informal,\n name: SpecialEventTypeLabelMap[SpecialEventType.Informal]\n },\n {\n id: SpecialEventType.ReligiousEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.ReligiousEvent]\n },\n {\n id: SpecialEventType.Other,\n name: SpecialEventTypeLabelMap[SpecialEventType.Other]\n }\n ];\n }\n};\n\n// This allows us to determine which filters should be applied based on the query params set on first load\nfunction getFilterSelectionsFromQueryParams(\n queryParams: HashObject,\n filters: SearchFilter[] = [],\n filterId: FilterIds\n): FilterOption[] {\n const filter = filters.find(f => f.id === filterId);\n\n if (!filter)\n return [];\n\n if (!queryParams[filterId])\n return filter.options?.filter(option => option.default) ?? [];\n\n if (filterId === 'rating')\n return RatingFilterHelper.deriveInitialRatingFilterStateFromQueryParams(queryParams[filterId], filter);\n\n let selections = queryParams[filterId];\n\n if (!Array.isArray(selections))\n selections = [selections];\n\n if (filterId === 'classification') {\n return ClassificationFilterHelper.deriveInitialClassificationFilterStateFromQueryParams(filter, selections);\n }\n\n if (filterId === 'presentation') {\n return PresentationFilterHelper.\n deriveInitialPresentationFilterStateFromQueryParams(filter.options, selections, queryParams);\n }\n\n return getSelectedOptions(filter.options, selections);\n}\n\nexport function getSelectedOptions(options: FilterOption[] | undefined, selections: any): any[] {\n if (!Array.isArray(selections))\n selections = [selections];\n\n return options?.filter(option => {\n return selections.find((id: number | string) => id.toString() === option.id.toString());\n }) ?? [];\n}\n\n/**\n * This basically iterates through every filter, and works out if that filter should be disabled.\n * This is based on:\n * - If the filter is compatible with any of the currently applied search indices\n * - If the filter is compatible with any of the filter indices that are compatible with any of the active filters\n */\nfunction disableFilters(state: FilterStateHash, filters: SearchFilter[], indices: SearchIndices[]): SearchFilter[] {\n // Convert the currently applied search indices into a hashmap\n const appliedIndices = indices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n return filters.map(filter => {\n if (!filter.compatibleIndices?.length)\n return filter;\n\n // If none of the applied indices works with the filter, it should be disabled.\n // For example, if the user filters by \"playlists\", the \"has resources\" filter will be disabled.\n if (!filter.compatibleIndices.find(i => appliedIndices[i])) {\n return {\n ...filter,\n disabled: true\n };\n }\n \n // Get all currently active filters\n const activeFilterIds = Object.keys(state).filter((filterId: keyof typeof state) => {\n const filterState = state[filterId];\n\n if (!('active' in filterState))\n return false;\n\n return filterState.active;\n });\n\n let shouldDisableFilter = false;\n\n activeFilterIds.forEach(activeFilterId => {\n if (shouldDisableFilter)\n return;\n\n const activeFilter = filters.find(f => f.id === activeFilterId);\n\n if (!activeFilter.compatibleIndices?.length)\n return;\n\n const activeFilterIndices = activeFilter.compatibleIndices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n /**\n * Check if the active filter's indices are compatible with the current filter's indices.\n * For example, if the \"has resources\" filter is active, then all filters that are incompatible\n * with videos will be disabled.\n */\n if (!filter.compatibleIndices.find(i => activeFilterIndices[i]))\n shouldDisableFilter = true;\n });\n\n return {\n ...filter,\n disabled: shouldDisableFilter\n };\n });\n}\n\n/**\n * This will disable particular option on a filter if they are incompatible with the currently\n * active filters.\n *\n * For example, if we apply the \"rating\" filter, then the \"playlist\" and \"classification\" options\n * on the \"ObjectTypes\" filter will be disabled, as we cannot filter by those options _and_ by rating\n * at the same time.\n */\nfunction disableFilterOptions(state: FilterStateHash, filters: SearchFilter[]): SearchFilter[] {\n return filters.map(filter => {\n if (!FunctionHelper.isFunction(filter.disableOptions))\n return filter;\n\n // Only filters that have a `disableOptions` function will run here.\n const options = filter.disableOptions(filter.options, filters, state);\n\n return {\n ...filter,\n options\n };\n });\n}","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.module.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent\n ? props.filter.customComponent\n : FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svg={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.module.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active\n ? acc + 1\n : acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent\n ? filter.customComponent\n : FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport styles from './tags.module.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 { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n\n const isTouch = React.useMemo(() => UserAgentHelper.isTouchScreen(), []);\n\n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition || isTouch) return;\n\n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n\n if (!containerRef.current?.children)\n return;\n\n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n isTouch ||\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n\n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n\n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n\n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100 mb-0'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","import React from 'react';\n\nexport function ChevronRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M15.695 11.267c.407.41.407 1.056 0 1.466L9.79 18.696a1.046 1.046 0 0 1-1.474 0l-.01-.01a1.034 1.034 0 0 1 0-1.467L13.474 12l-5.17-5.22a1.034 1.034 0 0 1 0-1.465l.012-.011a1.046 1.046 0 0 1 1.474 0z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\n\nimport styles from './widget-button.module.scss';\n\nconst namespace = 'shared.widgetButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n containerClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? ChevronLeftSvg : ChevronRightSvg;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={`${styles.buttonContainer} ${props.containerClassName ? props.containerClassName : ''}`} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <button\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n tabIndex={-1}\n />\n )}\n\n <button\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n aria-label={isLeft ? getPhrase('previous') : getPhrase('next')}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </button>\n </div>\n );\n});","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import * as React from 'react';\n\n/**\n * Hook function for listening to scroll events\n * @param onResize - gets called on resize.\n * @param onResizeEnd (optional) - gets called 100ms after the last resize event. Timer restarts everytime the callback\n * runs so that endCallback only fires after a stretch of resize events.\n * @param dependencies - values from the component (e.g. state, props and functions) that are used \n * inside the effect hook.\n */\nexport function useResizeListener(onResize: () => void, onResizeEnd?: () => void, dependencies: any[] = []): void {\n let resizeTimeout: number;\n\n const onResizeModified = () => {\n onResize();\n\n window.clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(onResizeEnd, 100);\n };\n\n React.useEffect(() => {\n window.addEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n return () => window.removeEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n }, [...dependencies]);\n}","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nimport { DynamicWidgetState } from './DynamicWidgetReducer';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\n/**\n * Resize events\n */\nexport const getResizeHandler = (\n elementRefs: SlidingListRefs,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n mediaQuery: MediaQueryStrings\n) => () => {\n if (elementRefs.container.current)\n elementRefs.container.current.style.transition = '';\n\n dispatch({\n type: WidgetInteraction.Resize,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n};\n\nexport const getResizeEndHandler = (containerRef: React.MutableRefObject<HTMLUListElement>) => () => {\n if (containerRef.current)\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n};\n\nexport const getDragHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n widgetState: DynamicWidgetState,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n widgetSnapshot: WidgetSnapshot,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => (event: React.DragEvent<HTMLUListElement>): void => {\n const mouseX = event.clientX;\n\n let snapshot = widgetSnapshot;\n\n if (!snapshot) {\n snapshot = { ...widgetState, initialMouseX: mouseX };\n setWidgetSnapshot(snapshot);\n containerRef.current.style.transition = '';\n }\n\n dispatch({\n type: WidgetInteraction.Drag,\n payload: {\n widgetSnapshot: snapshot,\n currentMouseX: mouseX\n }\n });\n};\n\nexport const getDragEndHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => () => {\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n setWidgetSnapshot(null);\n};","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nexport interface DynamicWidgetState {\n /**\n * X-position argument for `translate3d()` to determine where the slider is positioned.\n */\n offset: number;\n\n /**\n * Left position of the slider container.\n * Set on `Init`, and updated on `Resize`.\n * Used for calculations on `Previous`, or for dragging to the right.\n */\n containerLeftPosition: number;\n\n /**\n * Right position of the slider container.\n * Set on Init, and updated on Resize.\n * Used for calculations on `Next`, or for dragging to the left.\n */\n containerRightPosition: number;\n\n /**\n * The position of the left edge of the very first element in the slider list.\n * Initially this will always be equal to `containerLeftPosition`.\n */\n firstElementPosition: number;\n\n /**\n * The position of the right edge of the very last element in the slider list.\n */\n lastElementPosition: number;\n\n /**\n * True when `firstElementPosition === containerLeftPosition`.\n */\n hideLeftButton: boolean;\n\n /**\n * True when `lastElementPositon === containerRightPosition`.\n */\n hideRightButton: boolean;\n\n /**\n * When clicking left or right, this number is the max distance in pixels that the slider.\n * will move.\n * Default 300.\n * Can only be set once on `Init` action.\n */\n maxSlideDistance: number;\n\n /**\n * This is calculated on `Init`, and is the lowest number the `offset` state can ever be.\n * This is needed for the `Drag` event, as the `Drag` event can only calculate whole numbers.\n * 99% of the time, the leftOffsetLimit is a very specific decimal number, so we calculate it\n * on `Init` and reference it on `Drag` events when necessary.\n */\n leftOffsetLimit: number;\n}\n\nfunction getMaxSlideDistance(mediaQuery: MediaQueryStrings): number {\n if (mediaQuery === MediaQueryStrings.XS)\n return 200;\n\n if (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.MD)\n return 350;\n\n return 500;\n}\n\n/**\n * `null` values are initialized in the `Init` action. This is dispatched\n * later, because it uses JQuery elements that aren't immediately available\n * when `useReducer` is called.\n */\nexport const initialSliderState: DynamicWidgetState = {\n offset: 0,\n containerLeftPosition: null,\n containerRightPosition: null,\n firstElementPosition: null,\n lastElementPosition: null,\n hideLeftButton: true,\n hideRightButton: true,\n maxSlideDistance: 0,\n leftOffsetLimit: null\n};\n\ninterface InitPayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onInit = (payload: InitPayload): DynamicWidgetState => {\n const { container, lastElement } = payload.elementRefs;\n\n if (!container?.current || !lastElement?.current)\n return initialSliderState;\n\n const containerRect = container.current.getBoundingClientRect();\n const containerLeftPosition = containerRect.left;\n const containerRightPosition = containerRect.right;\n\n const firstElementPosition = containerLeftPosition;\n const lastElementPosition = lastElement.current.getBoundingClientRect().right;\n const leftOffsetLimit = containerRightPosition - lastElementPosition;\n\n return {\n ...initialSliderState,\n containerLeftPosition,\n containerRightPosition,\n firstElementPosition,\n lastElementPosition,\n hideRightButton: lastElementPosition < containerRightPosition,\n leftOffsetLimit,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\ninterface ResizePayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onResize = (payload: ResizePayload): DynamicWidgetState => {\n const initialState = onInit({\n ...payload,\n ...payload.elementRefs\n });\n\n return {\n ...initialState,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\nconst onNext = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { firstElementPosition, lastElementPosition, maxSlideDistance, offset, containerRightPosition } = prevState;\n\n /**\n * The distance in pixels that the slider will move along the x-axis.\n * This will be the `maxSlideDistance` constant value, or if that value is too large we calculate\n * the remaining overflowing space and only slide by that amount.\n */\n const slideDistance = lastElementPosition - containerRightPosition >= maxSlideDistance\n ? maxSlideDistance\n : lastElementPosition - containerRightPosition;\n\n return {\n firstElementPosition: firstElementPosition - slideDistance,\n lastElementPosition: lastElementPosition - slideDistance,\n offset: offset - slideDistance,\n hideRightButton: lastElementPosition - slideDistance === containerRightPosition,\n hideLeftButton: false\n };\n};\n\nconst onPrevious = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { containerLeftPosition, firstElementPosition, lastElementPosition, maxSlideDistance, offset } = prevState;\n\n const fullSlide = firstElementPosition + maxSlideDistance <= containerLeftPosition;\n const slideDistance = fullSlide ? maxSlideDistance : Math.abs(offset);\n\n return {\n firstElementPosition: firstElementPosition + slideDistance,\n lastElementPosition: lastElementPosition + slideDistance,\n offset: offset + slideDistance,\n hideLeftButton: !fullSlide || firstElementPosition + slideDistance === containerLeftPosition,\n hideRightButton: false\n };\n};\n\nconst onDrag = (prevState: DynamicWidgetState, payload: any): Partial<DynamicWidgetState> => {\n const { widgetSnapshot, currentMouseX } = payload;\n\n // Disable dragging if the slider isn't long enough\n if (widgetSnapshot.hideLeftButton && widgetSnapshot.hideRightButton)\n return {};\n\n // The distance from the initial `MouseDown` event x-coordinate, to the present x-coordinate\n const dragDistance = widgetSnapshot.initialMouseX - currentMouseX;\n\n let offset = widgetSnapshot.offset - dragDistance;\n let firstElementPosition = widgetSnapshot.firstElementPosition - dragDistance;\n let lastElementPosition = widgetSnapshot.lastElementPosition - dragDistance;\n let hideLeftButton = false;\n let hideRightButton = false;\n\n if (firstElementPosition > prevState.containerLeftPosition) {\n offset = 0;\n firstElementPosition = prevState.containerLeftPosition;\n lastElementPosition = prevState.lastElementPosition;\n hideLeftButton = true;\n }\n\n if (lastElementPosition <= prevState.containerRightPosition) {\n offset = prevState.leftOffsetLimit;\n firstElementPosition = prevState.containerLeftPosition - Math.abs(prevState.leftOffsetLimit);\n lastElementPosition = widgetSnapshot.containerRightPosition;\n hideRightButton = true;\n }\n\n return {\n offset,\n firstElementPosition,\n lastElementPosition,\n hideLeftButton,\n hideRightButton\n };\n};\n\nexport function DynamicWidgetReducer(\n prevState: DynamicWidgetState,\n action: ReducerActions<WidgetInteraction>\n): DynamicWidgetState {\n switch (action.type) {\n case WidgetInteraction.Init:\n return {\n ...prevState,\n ...onInit(action.payload)\n };\n\n case WidgetInteraction.Resize:\n return {\n ...prevState,\n ...onResize(action.payload)\n };\n\n case WidgetInteraction.Next:\n return {\n ...prevState,\n ...onNext(prevState)\n };\n\n case WidgetInteraction.Previous:\n return {\n ...prevState,\n ...onPrevious(prevState)\n };\n\n case WidgetInteraction.Drag:\n return {\n ...prevState,\n ...onDrag(prevState, action.payload)\n };\n\n default:\n return prevState;\n }\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { useWidgetKeyboard } from 'libs/shared/components/widgets/hooks/useWidgetKeyboard';\nimport { SlidingListContainer } from 'libs/shared/components/widgets/sliding-list/SlidingListContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\nimport { PartialLoadingHelper, PartialLoadingOptions } from 'libs/shared/utils/PartialLoadingHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { getDragEndHandler, getDragHandler, getResizeEndHandler, getResizeHandler } from './DynamicWidgetEventHandlers';\nimport { DynamicWidgetReducer, DynamicWidgetState, initialSliderState } from './DynamicWidgetReducer';\n\nimport styles from './dynamic-widget.module.scss';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\ninterface StaticChild {\n position: 'start' | 'end';\n component: React.ElementType;\n}\n\ninterface DynamicWidgetProps {\n id?: string;\n childComponent: React.ElementType;\n childComponentProps?: any;\n partialLoadingComponent: React.ElementType;\n partialLoadingOptions?: PartialLoadingOptions;\n\n widgetDataDeps?: (any)[];\n getChildAppLink?: (data: any) => Core.AppLink;\n\n staticChildren?: StaticChild[];\n collection?: BaseObject[];\n fetch?: (...args: any[]) => any;\n lazyLoad?: boolean;\n\n heading?: string;\n headingAppLink?: Core.AppLink;\n description?: string;\n getSubtitle?: (data: any) => string\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n getWidgetItemAnalyticsData?: (data: any) => HashObject;\n hideButtons?: boolean;\n childClassName?: string;\n // set to true if the widget get cut off by the container\n noNegativePadding?: boolean;\n}\n\nDynamicWidget.defaultProps = {\n heading: '',\n description: '',\n childComponentProps: {}\n};\n\nexport function DynamicWidget(props: DynamicWidgetProps): JSX.Element {\n const { childComponent: WidgetItemComponent, staticChildren, getWidgetItemAnalyticsData = () => {} } = props;\n\n const [ state, dispatch ] = React.useReducer(DynamicWidgetReducer, initialSliderState);\n\n // A snapshot of the widget state is captured on the very first `Drag` event as a point of reference\n const [ widgetSnapshot, setWidgetSnapshot ] = React.useState<WidgetSnapshot>(null);\n\n const elementRefs: SlidingListRefs = {\n container: React.useRef(null),\n firstElement: React.useRef(null),\n lastElement: React.useRef(null)\n };\n\n const mediaQuery = useGetMediaQueryString();\n const isTouchScreen = UserAgentHelper.isTabletOrMobile();\n \n const { dynamicAttributes, focusNext, focusPrev, onFocusWidget, onBlurWidget } = useWidgetKeyboard({ type: 'dynamic', state, containerRef: elementRefs.container, mediaQuery });\n\n useResizeListener(\n getResizeHandler(elementRefs, dispatch, mediaQuery),\n getResizeEndHandler(elementRefs.container),\n [mediaQuery]\n );\n\n const { ref, inView } = useLazyLoad({ prevent: !props.lazyLoad });\n\n let widgetData = props.collection;\n\n if (!props.collection && FunctionHelper.isFunction(props.fetch)) {\n const request = props.fetch(inView);\n widgetData = request.data;\n }\n\n /**\n * Once the widget data has been set, we can initialize the reducer. This is because\n * the reducer depends on the refs being set, but they don't get set until the markup has been loaded.\n */\n React.useEffect(() => {\n if (!widgetData || ObjectHelper.isEmpty(widgetData))\n return;\n\n dispatch({\n type: WidgetInteraction.Init,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n }, [widgetData]);\n\n function getWidgetItems(): JSX.Element {\n if (!widgetData)\n return;\n\n const firstChildren = staticChildren?.filter(child => child.position === 'start') ?? [];\n const lastChildren = staticChildren?.filter(child => child.position === 'end') ?? [];\n\n let items = widgetData.map((widgetItem, index) => {\n let itemRef: React.MutableRefObject<HTMLLIElement>;\n\n if (widgetItem === ArrayHelper.first(widgetData) && firstChildren?.length)\n itemRef = elementRefs.firstElement;\n\n if (widgetItem === ArrayHelper.last(widgetData) && !lastChildren?.length)\n itemRef = elementRefs.lastElement;\n\n const isLast = index + 1 === widgetData.length;\n\n return (\n <li\n id={widgetItem.id}\n key={widgetItem.id}\n ref={itemRef}\n onFocus={() => onFocusWidget(index)}\n onBlur={() => onBlurWidget()}\n className={`${styles.itemSpacing} ${props.childClassName || ''} ${(isLast && isTouchScreen) ? 'pe-4' : ''}`}\n {...dynamicAttributes[widgetItem.id]}\n >\n <WidgetItemComponent\n getChildAppLink={props.getChildAppLink}\n data={widgetItem}\n getSubtitle={props.getSubtitle}\n analyticsData={{\n itemIndex: index,\n ...props.analyticsData,\n ...getWidgetItemAnalyticsData(widgetItem)\n }}\n analyticsOptions={{ ...props?.analyticsOptions, ...WidgetHelper.getSliderItemAnalyticsOptions() }}\n {...props.childComponentProps}\n />\n </li>\n );\n });\n\n if (firstChildren.length) {\n items = [\n ...firstChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`first-widget-component:${i}`}\n ref={i === 0 ? elementRefs.firstElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n }),\n ...items\n ];\n }\n\n if (lastChildren.length) {\n items = [\n ...items,\n ...lastChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`end-widget-component:${i}`}\n ref={i === lastChildren.length - 1 ? elementRefs.lastElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n })\n ];\n }\n\n return <>{items}</>;\n }\n const widgetItems = React.useMemo(getWidgetItems, [\n widgetData, dynamicAttributes, state.offset, mediaQuery, ...props.widgetDataDeps || []\n ]);\n\n if (widgetData && !widgetData.length && !staticChildren?.length)\n return <></>;\n\n if (!widgetData || ObjectHelper.isEmpty(widgetData)) {\n return (\n <div ref={ref}>\n <PartialDynamicWidget\n partialLoadingComponent={props.partialLoadingComponent}\n partialLoadingOptions={props.partialLoadingOptions}\n />\n </div>\n );\n }\n\n const getSliderAnalyticsData = (type: WidgetInteraction) => ({\n ...props.analyticsData,\n id: props.id,\n name: props.heading,\n direction: type === WidgetInteraction.Next ? 'right' : 'left'\n });\n\n const hideButtons = isTouchScreen || props.hideButtons;\n\n return (\n <div className={`${props.noNegativePadding ? '' : 'mx-n4'}`}>\n <div className={`px-4 ${styles.header}`}>\n <WidgetHeader\n name={props.heading}\n description={props.description}\n appLink={props.headingAppLink}\n showSeeMoreLink={!!props.headingAppLink}\n />\n </div>\n\n <div className='position-relative'>\n <div className={`${props.noNegativePadding ? '' : 'px-4' } py-3 my-n3 position-relative ${isTouchScreen ? styles.mobileScroll : 'overflow-hidden-x'}`}>\n <div className={`position-relative ${props.hideButtons ? 'overflow-hidden-x' : ''}`}>\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => {\n focusPrev();\n\n dispatch({ type: WidgetInteraction.Previous });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Previous),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n leftButtonClassName={`${styles.leftButton} ${props.noNegativePadding ? styles.leftButtonNoPadding : ''}`}\n leftGradientClassName={`${styles.leftGradient} ${props.noNegativePadding ? styles.leftGradientNoPadding : ''}`}\n hide={state.hideLeftButton}\n useGradientBackdrop\n />\n )}\n\n <SlidingListContainer\n position={state.offset}\n positionType={CssMeasurement.Pixels}\n onDrag={getDragHandler(elementRefs.container, state, dispatch, widgetSnapshot, setWidgetSnapshot)}\n onDragEnd={getDragEndHandler(elementRefs.container, setWidgetSnapshot)}\n ref={elementRefs.container}\n >\n {widgetItems}\n </SlidingListContainer>\n\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => {\n focusNext();\n\n dispatch({ type: WidgetInteraction.Next });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Next),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n hide={state.hideRightButton}\n rightButtonClassName={`${styles.rightButton} ${props.noNegativePadding ? styles.rightButtonNoPadding : ''}`}\n rightGradientClassName={`${styles.rightGradient} ${props.noNegativePadding ? styles.rightGradientNoPadding : ''}`}\n useGradientBackdrop\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ntype PartialDynamicWidgetProps = Pick<DynamicWidgetProps, 'partialLoadingComponent'> & {\n partialLoadingOptions?: PartialLoadingOptions;\n}\n\nexport const PartialDynamicWidget = (props: PartialDynamicWidgetProps) => {\n const { partialLoadingComponent: Component, partialLoadingOptions } = props;\n\n return (\n <div className='d-flex flex-nowrap overflow-hidden'>\n {PartialLoadingHelper.getPartialLoadingItems(partialLoadingOptions).map((item, idx) => <Component key={idx} />)}\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';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.module.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching\n ? new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n })\n : []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from '../../utils/SharedSearchHelper';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string;\n mainFilters: Array<SearchFilter>;\n moreFilters: MoreFilters;\n alignLeft?: boolean;\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n const currentParams = (ContextService.getCurrentRoute().appLink?.params ?? {}) as HashObject;\n const savedParams = ObjectHelper.pick(currentParams, [ 'query', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ]);\n\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: savedParams\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.module.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject;\n mainFilters: SearchFilter[];\n appLink: Core.AppLink;\n moreFilters?: MoreFilters;\n isFetchingOptions?: boolean;\n constantIndices?: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n\n hideHeading?: boolean;\n hideDivider?: boolean;\n hideResetButton?: boolean;\n alignResetButtonLeft?: boolean;\n hideCaret?: boolean;\n\n /**\n * Incremental changes flag for new search\n */\n _hasNewSearch?: boolean;\n /**\n * Incremental changes flag for partner profiles\n */\n _hasPartnerProfiles?: boolean;\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams, props._hasNewSearch, props._hasPartnerProfiles),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={classNames(\n 'd-flex',\n !props.hideDivider && 'border-bottom pb-3 mb-3',\n (props._hasNewSearch && props.hideDivider && 'pb-3'),\n (props._hasNewSearch && !props.hideDivider && 'border-gray-300')\n )}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={classNames(`d-flex flex-wrap ${styles.filtersContainer}`, !hideHeading && 'ms-2')}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n"],"names":["SpecialEventType","AllSearchIndicesVideoStyle","AllSearchIndicesInSearch","AllSearchIndicesInUserManager","namespace","FilterActions","props","jsx","DivButton","Text","FilterContext","createContext","FilterReducer","state","action","FilterDropdownTitle","CheckboxFilterList","selections","onToggleItem","option","isCurrentlyChecked","indexOfItem","selection","i","newItems","options","isDisabled","isChecked","s","joinedIds","Checkbox","CheckboxFilter","displayOptionsIn2Columns","FilterHelper","jsxs","Fragment","Form","NestedFilterOptions","allOptions","firstLayerOption","isFirstLayerOptionDisabled","currentSelection","_a","secondLayerOptions","isFirstLayerIndeterminate","getIsFirstLayerIndeterminate","isFirstLayerOptionChecked","secondLayerOption","isSecondLayerOptionDisabled","isSecondLayerOptionChecked","hasSecondLayerSelection","allSecondLayerOptionsChecked","_b","SecondLayerOptions","NestedCheckboxFilter","selectedOption","isCurrentlyCheckedOrIndeterminate","indexOfOption","o","enabled2ndLayerOptions","newSelectedOptionWith2ndLayerOptions","newSelection","firstLayer","ArrayHelper","selectionItem","onToggleChildItem","parentOption","indexOfParentOption","newChildSelection","newParentSelection","new2ndLayerSelection","SwitchFilter","isActive","onToggle","ToggleSwitch","DropdownFilter","onSelect","Dropdown","RadioFilter","isSelected","styles","RatingButton","ref","isHovering","useHover","React","button","Tooltip","RatingRangeSelector","hoverRange","setHoverRange","getRange","rating","r","onClickRating","onHover","ButtonGroup","RatingFilter","onSelectRange","range","filteredRatings","firstRating","lastRating","className","FilterConstants","getPhrase","LanguageService","LIBRARY_FILTER","getTypeMap","libraries","prev","next","SourceFilterHelper","opts","isLearner","isGuest","hasCustomLibraries","libraryTypes","MasterObjectTypes","SourceFilterOptions","val","acc","value","libraryIds","CustomerStatus","CustomerStatusString","SpecialEventTypeLabelMap","WizardActionInfoContainer","BulkUserActivationActionInfo","UserGroup","BulkUserActivationEmailActionInfo","BulkAddToClassroomActionInfo","BulkChangeYearGroupActionInfo","BulkUserDeleteActionInfo","BulkUserRemoveActionInfo","BulkUserResetEmailActionInfo","BulkResetPasswordActionInfo","BulkUserYearGroupRolloverActionInfo","CheckCircleSvg","UserStatusBadge","UserHelper","ObjectStatus","_c","_d","_e","BasicUserDetails","user","currentUser","SvgContainer","getBadgeText","_f","_g","_i","_h","UserRole","_k","_j","RoleOrYearGroup","badgeText","UserItemAvatar","Avatar","BulkUserActionsErroredUserItem","UserManagerClient","WizardLayoutContext","BatchDataType","BatchJobName","BatchJobResultErrorCode","BatchJobType","KeySvg","BulkUserActionsHelper","userType","userCount","appLinks","actions","reviewAccountsAction","allowYearGroupRollover","countsByStatus","client","products","yearGroups","hasClassroomsFeature","FolderSvg","disableDeleteAction","ProductId","DeleteSvg","GroupSvg","EmailSvg","ClassroomsSvg","GraduationCapSvg","getYearGroupRolloverDisabledTooltip","a","b","subAction","actionDetailsActions","key","confirmationAppLinks","statusAppLinks","object","imageCdnUrl","errorMessage","errorCode","viewModel","customerId","getYearGroupRolloverJobMetadata","getChangeYearGroupJobMetadata","setupBaseJobMetadata","getDeactivateUsersJobMetadata","getAddToClassroomJobMetadata","getResetPasswordJobMetadata","Core.ErrorHelper","DevError","onClickConfirm","setOnClickConfirm","useViewModel","SharedViewModelKeys","alerts","useAlerts","dataType","type","params","MasterType","metadata","status","DateHelper","id","mapOptionToDurationRange","phraseKey","DurationOption","DurationFilter","onClickDuration","duration","XmasConstants","MoviesAndTvFilter","filter","currentFilterState","isFloating","setIsFloating","activeRef","applyFilter","newState","classNames","GroupedCheckboxFilter","optionGroups","groupName","ClassificationFilterHelper","selectedId","DurationFilterHelper","PresentationFilterHelper","filterOptions","queryParams","getSelectedOptions","audienceSelection","secondLayerSelection","ProductionYearFilterHelper","currentYear","RatingFilterHelper","ratingOptions","ratingRange","getRatingsFromFrontendQuery","highestRating","first","last","ratings","selectedRatings","studentYearGroup","foundRatings","code","TwoColumnFilters","getValidIndices","allIndices","Filters","labelPrefix","_hasNewSearch","getMappedPresentationOptions","url","extraUrl","inaccessibleIndices","_hasPartnerProfiles","maxRating","customer","countryCode","hasOrg","description","channels","categories","opt","TopicsConstants","presentationFilter","filters","mainFilters","moreFilters","appLink","initialStates","getFilterSelectionsFromQueryParams","reduceFunc","filterState","derivedState","paramKeys","q","SEARCH_CURRICULUM_CODE_PARAM","SEARCH_IN_PARAM","count","firstLayerSelection","availableOptions","index","filterStates","updatedParams","param","active","isDefault","secondaryParam","ids","ObjectHelper","presentationIds","defaultParams","paramName","values","FilterWhitelist","CurationTag","indices","validIndices","newIndices","validateIndices","indice","extraIndices","draftState","baseAppLink","payload","filterId","f","draftFilterState","isDefaultValue","currentQueryParams","Core.LocationUtils","Core.AppLinkHelper","allFilters","disableFilters","disableFilterOptions","response","query","analyticsOptions","analyticsFilterObjects","FilterDescriptor","AnalyticsHelper","WorkflowPhase","UserAction","y","channel","CustomerType","CustomerTypeString","category","appliedIndices","activeFilterIds","shouldDisableFilter","activeFilterId","activeFilter","activeFilterIndices","FunctionHelper","getCustomWidthClass","FilterButton","React.useContext","isDropdownFilter","label","setLabel","React.useState","showDropdown","setShowDropdown","setDraftState","React.useEffect","onSelectItem","onClickReset","defaultOption","onClickApply","onToggleDropdown","isShowing","FilterComponent","React.useMemo","baseClass","caretClass","customWidthClass","StateHelper","setState","callback","data","fn","getTotalActiveFilters","currentState","MoreFiltersButton","totalActiveFilters","setTotalActiveFilters","currentFilterStateKey","e","PartialTagItem","tagClass","SLIDER_ANIMATION_TIME","useWidgetKeyboard","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","isTouch","UserAgentHelper","getDynamicAttributes","dynamicWidgetState","focusableItems","item","rect","isItemVisable","getFixedAttributes","fixedWidgetState","focusNext","items","nextFocusableElement","focusPrev","prevFocusableElement","onFocusWidget","onBlurWidget","CssMeasurement","blankImage","DragHelper","event","isTouchScreen","getPositionStyling","xPosition","measurement","dragPercentage","SlidingListContainer","React.forwardRef","children","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","getEventListeners","listenerProps","ChevronRightSvg","WidgetButtonDirection","WidgetButton","React.memo","isLeft","arrowSvg","ChevronLeftSvg","getPositionClass","getStyle","SvgContainerSize","WidgetInteraction","useResizeListener","onResize","onResizeEnd","dependencies","resizeTimeout","onResizeModified","getResizeHandler","elementRefs","dispatch","getResizeEndHandler","getDragHandler","widgetState","widgetSnapshot","setWidgetSnapshot","mouseX","snapshot","getDragEndHandler","getMaxSlideDistance","MediaQueryStrings","initialSliderState","onInit","container","lastElement","containerRect","containerLeftPosition","containerRightPosition","firstElementPosition","lastElementPosition","leftOffsetLimit","onNext","prevState","maxSlideDistance","offset","slideDistance","onPrevious","fullSlide","currentMouseX","dragDistance","hideLeftButton","hideRightButton","DynamicWidgetReducer","DynamicWidget","WidgetItemComponent","staticChildren","getWidgetItemAnalyticsData","React.useReducer","React.useRef","useGetMediaQueryString","inView","useLazyLoad","widgetData","getWidgetItems","firstChildren","child","lastChildren","widgetItem","itemRef","isLast","WidgetHelper","Component","widgetItems","PartialDynamicWidget","getSliderAnalyticsData","hideButtons","WidgetHeader","partialLoadingOptions","PartialLoadingHelper","idx","TagWidgetItem","colorClass","TagItem","TagFilter","unappliedOptions","onClickOption","nextFilterState","getContainerClass","collection","ResetButton","currentParams","ContextService","savedParams","SearchFilters","hideHeading","isFetchingOptions","constantIndices","mainFiltersWithoutTags","tagFilter","LanguageNamespaceContext"],"mappings":"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"}
1
+ {"version":3,"file":"CwuTuPLO.chunk.js","sources":["../../../../libs/shared/src/interfaces/models/CalendarEvent.ts","../../../../libs/shared/src/apps/search/interfaces/SearchTypes.ts","../../../../libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","../../../../libs/shared/src/apps/search/reducers/FilterReducer.tsx","../../../../libs/shared/src/apps/search/components/filter-dropdown-title/FilterDropdownTitle.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilterList.tsx","../../../../libs/shared/src/apps/search/components/filter-types/checkbox-filter/CheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/NestedFilterOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/components/SecondLayerOptions.tsx","../../../../libs/shared/src/apps/search/components/filter-types/nested-checkbox-filter/NestedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/switch-filter/SwitchFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/dropdown-filter/DropdownFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/radio-filter/RadioFilter.tsx","../../../../libs/shared/src/components/rating-range-selector/RatingRangeSelector.tsx","../../../../libs/shared/src/apps/search/components/filter-types/rating-filter/RatingFilter.tsx","../../../../libs/shared/src/apps/search/constants/FilterConstants.ts","../../../../libs/shared/src/apps/search/utils/SourceFilterHelper.ts","../../../../libs/shared/src/enums/CustomerStatus.ts","../../../../libs/shared/src/apps/calendar/constants/SpecialEventTypeLabelMap.ts","../../../../libs/shared/src/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo.tsx","../../../../libs/shared/src/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo.tsx","../../../../libs/shared/src/images/svg/status/CheckCircleSvg.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserStatusBadge.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/BasicUserDetails.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/RoleOrYearGroup.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserItemAvatar.tsx","../../../../libs/shared/src/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem.tsx","../../../../libs/shared/src/apps/user-manager/enums/UserManagerClient.ts","../../../../libs/shared/src/context/WizardLayoutContext.tsx","../../../../libs/shared/src/enums/BatchDataType.ts","../../../../libs/shared/src/enums/BatchJobName.ts","../../../../libs/shared/src/enums/BatchJobResultErrorCode.ts","../../../../libs/shared/src/enums/BatchJobType.ts","../../../../libs/shared/src/images/svg/objects/KeySvg.tsx","../../../../libs/shared/src/apps/user-manager/utils/BulkUserActionsHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-types/custom/duration-filter/DurationFilter.tsx","../../../../libs/shared/src/constants/XmasConstants.ts","../../../../libs/shared/src/apps/search/components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter.tsx","../../../../libs/shared/src/apps/search/components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter.tsx","../../../../libs/shared/src/apps/search/utils/ClassificationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/DurationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/PresentationFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/ProductionYearFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/RatingFilterHelper.ts","../../../../libs/shared/src/apps/search/utils/FilterHelper.tsx","../../../../libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","../../../../libs/shared/src/utils/StateHelper.ts","../../../../libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","../../../../libs/shared/src/components/tags/PartialTagItem.tsx","../../../../libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","../../../../libs/shared/src/enums/CssMeasurement.ts","../../../../libs/shared/src/utils/DragHelper.ts","../../../../libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","../../../../libs/shared/src/images/svg/arrows/ChevronRightSvg.tsx","../../../../libs/shared/src/components/widgets/widget-button/WidgetButton.tsx","../../../../libs/shared/src/enums/WidgetInteraction.ts","../../../../libs/shared/src/hooks/UseResizeListener.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetEventHandlers.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetReducer.tsx","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidget.tsx","../../../../libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","../../../../libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","../../../../libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","../../../../libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx"],"sourcesContent":["import { BaseObject, BasePaginatedCollection, Classification, Livestream } from 'libs/shared/interfaces';\n\nexport type CalendarEventType = 'Observance' | 'ReligiousEvent' | 'Holiday' | 'Livestream';\n\nexport enum SpecialEventType {\n Holiday = 'Holiday',\n SportingEvent = 'SportingEvent',\n Observance = 'Observance',\n NaturalDisaster = 'NaturalDisaster',\n HistoricalEvent = 'HistoricalEvent',\n BreakingNews = 'BreakingNews',\n Informal = 'Informal',\n ReligiousEvent = 'ReligiousEvent',\n Livestream = 'Livestream',\n Other = 'Other'\n}\n\nexport enum CalendarEventContentType {\n Classification,\n Livestream\n}\n\nexport enum CalendarEventFrequency {\n Regular = 'Regular',\n Daily = 'Daily',\n Weekly = 'Weekly',\n Monthly = 'Monthly',\n Yearly = 'Yearly'\n}\n\nexport enum CalendarEventStatus {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport type CalendarEventContent = Classification | Livestream;\n\nexport interface CalendarEvent<T extends CalendarEventContent = Classification> {\n id: string;\n type: CalendarEventType;\n name: string;\n description?: string;\n startDate: string;\n endDate?: string;\n content: T;\n specialEventId?: string;\n specialEventPolicyId?: string;\n metadata?: {\n objectType: 'Topic' | 'Livestream';\n objectId: string;\n };\n}\n\nexport interface SpecialEvent<T extends CalendarEventContent = Classification> {\n id: string;\n name: string;\n description: string;\n policies: SpecialEventPolicy<T>[];\n status: CalendarEventStatus;\n type: SpecialEventType;\n}\n\nexport type SpecialEventCollection<T extends CalendarEventContent = Classification>\n = BasePaginatedCollection<SpecialEvent<T>>;\n\nexport interface SpecialEventPolicy<T extends CalendarEventContent = Classification> extends BaseObject {\n content: T;\n specialEventId: string;\n status: CalendarEventStatus;\n presentationId: string;\n startDate: string;\n endDate: string;\n frequency: CalendarEventFrequency;\n interval: number;\n visible: boolean;\n metadata: {\n objectId: string;\n objectType: 'Topic' | 'Livestream';\n };\n}","import { ObjectHash } from 'backbone';\nimport Bloodhound from 'bloodhound';\n\nimport { SearchIndices } from 'libs/shared/apps/search/interfaces';\n\nexport interface RemoteSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n remote: Bloodhound.RemoteOptions<T>;\n}\n\nexport interface LocalSearch<T> extends Bloodhound.BloodhoundOptions<T> {\n local: T[] | (() => T[]);\n}\n\nexport type TypeaheadDataSource<T> = Bloodhound<T> |\n((query: string, syncResults: (result: T[]) => void, asyncResults?: (result: T[]) => void) => void);\n\nexport interface InstantSearchBloodhound<T> {\n bloodhound: TypeaheadDataSource<T>;\n name: string;\n}\n\nexport type TypeaheadConfig<T> = Twitter.Typeahead.Dataset<T>;\n\nexport interface TypeaheadConfigHandler<T> {\n (source?: InstantSearchBloodhound<T>, index?: number, options?: ObjectHash): Twitter.Typeahead.Dataset<T>;\n}\n\nexport interface BloodhoundConfigHandler<T> {\n (source: string, options?: ObjectHash): LocalSearch<T> | RemoteSearch<T>;\n}\n\nexport interface TypeaheadSourceItem<T> {\n name: string;\n typeaheadConfig: TypeaheadConfigHandler<T>;\n bloodhoundConfig?: BloodhoundConfigHandler<T>;\n options?: ObjectHash;\n}\n\nexport const AllSearchIndicesVideoStyle: SearchIndices[] = [ 'video', 'clip', 'interactive' ];\nexport const AllSearchIndicesInSearch: SearchIndices[] = [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video', 'company', 'category', 'partner_profile' ];\nexport const AllSearchIndicesInUserManager: SearchIndices[] = ['user'];","import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}","import { createContext } from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { FilterIds, FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport type FilterState = {\n active: boolean;\n selection?: FilterOption[];\n};\n\nexport type DraftState = {\n [key in FilterIds]?: FilterState;\n};\n\ntype FilterStateHashFilters = {\n [key in FilterIds]: FilterState;\n};\n\nexport type FilterStateHash = FilterStateHashFilters & {\n appLink: Core.AppLink;\n moreFilters?: Omit<FilterStateHash, 'moreFilters'>;\n};\n\nexport type FilterActionType = 'update';\n\nexport type FilterPayloadType = {\n filter: SearchFilter;\n state: FilterState;\n};\n\n/**\n * Context\n */\ninterface FilterContextType {\n state: FilterStateHash;\n dispatch: React.Dispatch<ReducerActions<FilterActionType>>;\n}\n\nexport const FilterContext = createContext<FilterContextType>(null);\n\n/**\n * Reducer - root level keys should match the filter object's corresponding \"id\" field\n */\nexport function FilterReducer(\n state: FilterStateHash,\n action: ReducerActions<FilterActionType, FilterStateHash>\n): FilterStateHash {\n switch (action.type) {\n case 'update': {\n return action.payload;\n }\n\n default:\n return state;\n }\n}\n","import React from 'react';\n\ninterface FilterDropdownTitleProps {\n id?: string;\n title: string;\n}\n\nexport function FilterDropdownTitle(props: FilterDropdownTitleProps): JSX.Element {\n return (\n <label htmlFor={props.id} className='mb-0'>\n <h3 className='h6 mb-2'>{props.title}</h3>\n </label>\n );\n}","import React from 'react';\n\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\nimport { FilterOption, MoreFilters, SearchFilter } from '../../../interfaces';\nimport { FilterState } from '../../../reducers';\n\ninterface CheckboxFilterListProps {\n displayOptionsIn2Columns: boolean;\n filter: SearchFilter | MoreFilters;\n draftState: FilterState;\n setDraftState: (state: FilterState) => void;\n options: FilterOption[];\n}\n\nexport function CheckboxFilterList(props: CheckboxFilterListProps): JSX.Element {\n const selections = props.draftState.selection;\n\n function onToggleItem(option: FilterOption, isCurrentlyChecked: boolean): void {\n /**\n * If the item is currently checked, we remove it from the array\n */\n if (isCurrentlyChecked) {\n let indexOfItem: number = -1;\n\n // Find the index of the clicked item\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n // Return a new array with the clicked item sliced out\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n\n props.setDraftState({ active: !!newItems.length, selection: newItems });\n\n return;\n }\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n const newItems = [...selections];\n newItems.push(option);\n\n props.setDraftState({\n active: !!newItems.length,\n selection: newItems\n });\n }\n\n const options = props.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isChecked = !!props.draftState.selection.find(s => s.id.toString() === option.id.toString());\n const joinedIds = Array.isArray(option.id) ? option.id.join('_') : option.id;\n \n return (\n <li key={joinedIds} className={`my-1 ${props.displayOptionsIn2Columns ? 'col-md-6 col-12' : ''}`}>\n <Checkbox\n label={option.name}\n name={joinedIds}\n id={joinedIds}\n onChange={() => onToggleItem(option, isChecked)}\n checked={!isDisabled && isChecked}\n isLabelEllipsis={props.displayOptionsIn2Columns}\n disabled={isDisabled}\n />\n </li>\n );\n });\n \n return <ul className={`list-unstyled ${props.displayOptionsIn2Columns ? 'd-flex flex-wrap' : ''}`}>{options}</ul>;\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { CheckboxFilterList } from './CheckboxFilterList';\n\nexport function CheckboxFilter(props: FilterProps): JSX.Element {\n const displayOptionsIn2Columns = FilterHelper.displayTwoColumns(props.filter);\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form className='mb-3'>\n <CheckboxFilterList\n displayOptionsIn2Columns={displayOptionsIn2Columns}\n options={props.filter.options}\n filter={props.filter}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n />\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype NestedFilterOptionsProps = FilterProps & {\n onToggleItem: (selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean) => void;\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function NestedFilterOptions(props: NestedFilterOptionsProps): JSX.Element {\n const allOptions: JSX.Element[] = [];\n\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n const isFirstLayerIndeterminate = getIsFirstLayerIndeterminate(currentSelection, secondLayerOptions);\n const isFirstLayerOptionChecked = !isFirstLayerIndeterminate && !!currentSelection;\n\n // 1st layer\n allOptions.push(\n <Checkbox\n key={firstLayerOption.id}\n label={firstLayerOption.name}\n name={firstLayerOption.id}\n id={firstLayerOption.id}\n indeterminate={isFirstLayerIndeterminate}\n onChange={() => props.onToggleItem(firstLayerOption, isFirstLayerOptionChecked || isFirstLayerIndeterminate)}\n checked={ !isFirstLayerOptionDisabled && isFirstLayerOptionChecked}\n className='my-1'\n disabled={isFirstLayerOptionDisabled}\n />\n );\n\n // 2nd layer\n const showSecondLayer = FilterHelper.hasManyFilterOptions(secondLayerOptions);\n\n showSecondLayer && allOptions.push(\n ...secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1 ms-3'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n })\n );\n }\n\n return <>{allOptions}</>;\n}\n\nfunction getIsFirstLayerIndeterminate(currentSelection: FilterOption, secondLayerOptions: FilterOption[]): boolean {\n const hasSecondLayerSelection = currentSelection?.secondLayerSelection?.length > 0;\n const allSecondLayerOptionsChecked = currentSelection?.secondLayerSelection?.length === secondLayerOptions.length;\n return hasSecondLayerSelection && !allSecondLayerOptionsChecked;\n}","import * as React from 'react';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\n\ntype SecondLayerOptionProps = FilterProps & {\n onToggleChildItem: (selectedOption: FilterOption, isCurrentlyChecked: boolean, parentOption: FilterOption) => void;\n}\n\nexport function SecondLayerOptions(props: SecondLayerOptionProps): JSX.Element {\n for (const firstLayerOption of props.filter.options) {\n const isFirstLayerOptionDisabled = props.filter.disabled || firstLayerOption.disabled;\n const currentSelection = props.draftState.selection?.find(s => s?.id === firstLayerOption.id);\n const secondLayerOptions = firstLayerOption.secondLayerOptions ?? [];\n\n const options = secondLayerOptions.map(secondLayerOption => {\n const isSecondLayerOptionDisabled = isFirstLayerOptionDisabled || secondLayerOption.disabled;\n const isSecondLayerOptionChecked = !!currentSelection?.secondLayerSelection\n ?.find(s => s.id === secondLayerOption.id);\n\n return (\n <Checkbox\n key={secondLayerOption.id}\n label={secondLayerOption.name}\n name={secondLayerOption.id}\n id={secondLayerOption.id}\n onChange={() => props.onToggleChildItem(secondLayerOption, isSecondLayerOptionChecked, firstLayerOption)}\n checked={!isSecondLayerOptionDisabled && isSecondLayerOptionChecked}\n className={'my-1'}\n disabled={isSecondLayerOptionDisabled}\n />\n );\n });\n\n return <>{options}</>;\n }\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\n\nimport { NestedFilterOptions } from './components/NestedFilterOptions';\nimport { SecondLayerOptions } from './components/SecondLayerOptions';\n\nexport function NestedCheckboxFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options;\n\n function onToggleItem(selectedOption: FilterOption, isCurrentlyCheckedOrIndeterminate: boolean): void {\n const { selection } = props.draftState;\n const indexOfOption = selection.findIndex(o => o.id === selectedOption.id);\n\n /**\n * If the item wasn't checked, simply push it onto the selections array\n */\n if (!isCurrentlyCheckedOrIndeterminate) {\n const enabled2ndLayerOptions = (options\n ?.find(o => o.id === selectedOption.id).secondLayerOptions)\n ?.filter(o => !o.disabled);\n\n // Also select all enabled 2nd layer options\n const newSelectedOptionWith2ndLayerOptions =\n { ...selectedOption, secondLayerSelection: enabled2ndLayerOptions };\n\n // Add new option\n if (selection.length === 0 || indexOfOption === -1) {\n const newSelection = [ ...selection, newSelectedOptionWith2ndLayerOptions ];\n\n props.setDraftState({\n active: true,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === selectedOption.id) {\n return newSelectedOptionWith2ndLayerOptions;\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n /**\n * If the item is currently checked, we remove it from the array\n */\n const newSelection = ArrayHelper.removeItemFromIndex(\n selection,\n selection.findIndex(selectionItem => selectionItem.id === selectedOption.id)\n );\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n function onToggleChildItem(\n selectedOption: FilterOption,\n isCurrentlyChecked: boolean,\n parentOption: FilterOption\n ): void {\n const { selection } = props.draftState;\n const indexOfParentOption = selection.findIndex(o => o.id === parentOption.id);\n\n if (!isCurrentlyChecked) {\n const newChildSelection = [ ...selection[indexOfParentOption]?.secondLayerSelection ?? [], selectedOption ];\n\n // If no selection/new item is not in selection, add new option\n if (selection.length === 0 || indexOfParentOption === -1) {\n const newParentSelection = {\n ...parentOption,\n secondLayerSelection: newChildSelection\n };\n\n const newSelection = [ ...selection, newParentSelection ];\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n\n // Merge selectedItem into selection\n if (indexOfParentOption !== -1) {\n const newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n return {\n ...firstLayer,\n secondLayerSelection: newChildSelection\n };\n }\n\n return firstLayer;\n });\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n\n return;\n }\n }\n\n // Uncheck child\n let newSelection = selection.map(firstLayer => {\n if (firstLayer.id === parentOption.id) {\n const new2ndLayerSelection = ArrayHelper.removeItem(firstLayer.secondLayerSelection, selectedOption);\n return { ...parentOption, secondLayerSelection: new2ndLayerSelection };\n }\n\n return firstLayer;\n });\n\n // Uncheck parent if no child\n if (newSelection[indexOfParentOption].secondLayerSelection.length === 0) {\n newSelection = ArrayHelper.removeItem(newSelection, parentOption);\n }\n\n props.setDraftState({\n active: !!newSelection.length,\n selection: newSelection\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n <Form className='mb-3'>\n { FilterHelper.hasManyFilterOptions(options)\n ? <NestedFilterOptions onToggleItem={onToggleItem} onToggleChildItem={onToggleChildItem} {...props} />\n : <SecondLayerOptions onToggleChildItem={onToggleChildItem} {...props} />\n }\n </Form>\n </>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\n\nexport function SwitchFilter(props: FilterProps): JSX.Element {\n const isActive = props.draftState.active;\n\n function onToggle(): void {\n props.setDraftState({ active: !isActive });\n }\n\n return (\n <>\n <FilterDropdownTitle id={props.filter.id} title={props.filter.name} />\n\n <div className='d-flex align-items-start justify-content-between'>\n <p className='d-inline-block w-75'>{props.filter.description}</p>\n\n <ToggleSwitch id={props.filter.id} disabled={props.filter.disabled} onClick={onToggle} on={isActive} />\n </div>\n </>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nexport function DropdownFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n {props.filter.options.map(option => (\n <Dropdown.Item\n key={option.id}\n onClick={() => onSelect(option)}\n disabled={props.filter.disabled || option.disabled}\n >\n {option.name}\n </Dropdown.Item>\n ))}\n </>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport styles from './radio-filter.module.scss';\n\nexport function RadioFilter(props: FilterProps): JSX.Element {\n function onSelect(option: FilterOption): void {\n props.setDraftState({\n active: !option.default,\n selection: [option]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <Form>\n <ul className={`${props.isOnMoreFilters ? 'd-flex flex-wrap' : ''} list-unstyled`}>\n {props.filter.options.map(option => {\n const isDisabled = props.filter.disabled || option.disabled;\n const isSelected = ArrayHelper.first(props.draftState.selection)?.id.toString() === option.id.toString();\n return (\n <li key={option.id} className={`${props.isOnMoreFilters ? 'w-50' : ''}`}>\n <Form.Check\n type='radio'\n label={option.name}\n name={option.id}\n id={option.id}\n value={option.id}\n onChange={() => onSelect(option)}\n checked={!isDisabled && isSelected}\n className={`${styles.radioFilter}`}\n disabled={isDisabled}\n />\n </li>\n );\n })}\n </ul>\n </Form>\n </>\n );\n}","import React from 'react';\nimport { ButtonGroup } from 'react-bootstrap';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { useHover } from 'libs/shared/hooks/UseHover';\nimport { Rating, YearGroup } from 'libs/shared/interfaces';\n\ninterface RatingButtonProps {\n rating: Rating;\n isActive: boolean;\n onClick: () => void;\n onHover: (rating: Rating) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n disabled?: boolean;\n}\n\nfunction RatingButton(props: RatingButtonProps): JSX.Element {\n const [ ref, isHovering ] = useHover<HTMLDivElement>({ delay: 1 });\n\n React.useEffect(() => {\n props.onHover(isHovering ? props.rating : null);\n }, [isHovering]);\n\n if (!props.rating.code)\n return <></>;\n\n const button = (\n <DivButton\n ref={ref}\n className={props.getButtonClasses(props.rating, props.isActive, isHovering)}\n onClick={props.onClick}\n disabled={props.disabled}\n >\n {props.rating.code}\n </DivButton>\n );\n\n if (props.disabled)\n return button;\n\n return (\n <Tooltip title={props.rating.name} spanHack>\n {button}\n </Tooltip>\n );\n}\n\ninterface RatingRangeSelectorProps {\n ratings: Rating[];\n yearGroup?: YearGroup;\n yearGroups?: YearGroup[];\n selections: Rating[];\n onSelectRange: (range: Rating[]) => void;\n getButtonClasses: (rating: Rating, isActive: boolean, isHovering: boolean) => string;\n isDisabled?: (rating: Rating) => boolean;\n disabled?: boolean;\n}\n\nRatingRangeSelector.defaultProps = {\n selections: []\n};\n\nexport function RatingRangeSelector(props: RatingRangeSelectorProps): JSX.Element {\n const [ hoverRange, setHoverRange ] = React.useState<Rating[]>([]);\n\n function getRange(rating: Rating): Rating[] {\n return props.ratings.filter(r => r.code && r.value <= rating.value);\n }\n\n function onClickRating(rating: Rating): void {\n props.onSelectRange(getRange(rating));\n }\n\n function onHover(rating: Rating): void {\n if (!rating || props.isDisabled(rating)) {\n setHoverRange([]);\n return;\n }\n }\n\n function isActive(rating: Rating): boolean {\n if (hoverRange.length)\n return !!hoverRange.find(r => r.id === rating.id);\n\n return !!props.selections.find(r => r.id === rating.id);\n }\n\n return (\n <div>\n <ButtonGroup as='ul' className='list-unstyled mb-0'>\n {props.ratings.map(rating => (\n <li key={rating.id}>\n <RatingButton\n rating={rating}\n onClick={() => onClickRating(rating)}\n onHover={onHover}\n isActive={isActive(rating)}\n disabled={props.disabled || props.isDisabled?.(rating)}\n getButtonClasses={props.getButtonClasses}\n />\n </li>\n ))}\n </ButtonGroup>\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\nimport { RatingRangeSelector } from 'libs/shared/components/rating-range-selector/RatingRangeSelector';\nimport { Rating } from 'libs/shared/interfaces';\n\nimport styles from './rating-filter.module.scss';\n\ntype OptionType = FilterOption & Rating;\n\nexport function RatingFilter(props: FilterProps): JSX.Element {\n const options = props.filter.options as OptionType[];\n\n function onSelectRange(range: OptionType[]): void {\n props.setDraftState({\n active: !!range.length,\n selection: range as FilterOption[]\n });\n }\n\n const filteredRatings: Rating[] = options.filter(r => r.code);\n const [firstRating] = filteredRatings;\n const lastRating = filteredRatings[filteredRatings.length - 1];\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n <p>{props.filter.description}</p>\n\n <div className='mb-2'>\n <RatingRangeSelector\n ratings={options}\n selections={props.draftState.selection as Rating[]}\n onSelectRange={onSelectRange}\n disabled={props.filter.disabled}\n isDisabled={(rating: Rating & FilterOption) => rating.disabled}\n getButtonClasses={(rating, isActive, isHovering) => {\n let className = 'btn border text-nowrap';\n\n if (isActive || isHovering)\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n if (isHovering)\n className += ' active';\n\n if (filteredRatings.length === 1)\n className += ' rounded';\n else if (firstRating.id === rating.id)\n className += ' ' + styles.firstButton;\n else if (lastRating.id === rating.id)\n className += ' ' + styles.lastButton;\n else\n className += ' rounded-0';\n\n return className;\n }}\n />\n </div>\n </>\n );\n}","export const FilterConstants = {\n FILTER_PARAM_PREFIX: 'filters.',\n MAX_CHECKBOXES_PER_COLUMN: 10\n};","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { FilterOption, SourceFilterOptions } from 'libs/shared/apps/search/interfaces';\nimport { MasterObjectTypes } from 'libs/shared/enums/MasterObjectTypes';\nimport { Library } from 'libs/shared/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst LIBRARY_FILTER = `${FilterConstants.FILTER_PARAM_PREFIX}library`;\n\nfunction getTypeMap(libraries: Library[]): HashObject {\n return libraries.reduce<HashObject>((prev, next) => {\n return {\n ...prev,\n [next.type]: true\n };\n }, {});\n}\n\nexport const SourceFilterHelper = {\n getOptions(opts: {\n libraries: Library[],\n isLearner: boolean,\n isGuest: boolean,\n hasCustomLibraries: boolean\n }): FilterOption<SourceFilterOptions>[] {\n const { libraries, isLearner, isGuest, hasCustomLibraries } = opts;\n\n const options: FilterOption<SourceFilterOptions>[] = [];\n\n const libraryTypes = getTypeMap(libraries);\n\n if (libraryTypes[MasterObjectTypes.Workspace] && !isGuest)\n options.push({ id: SourceFilterOptions.MyVideos, name: getPhrase('myVideos') });\n\n if (libraryTypes[MasterObjectTypes.CustomLibrary] && (!isLearner || hasCustomLibraries))\n options.push({ id: SourceFilterOptions.School, name: getPhrase('schoolVideos') });\n\n if (libraryTypes[MasterObjectTypes.Exchange])\n options.push({ id: SourceFilterOptions.ExchangeArchive, name: getPhrase('exchangeArchiveVideos') });\n\n if (libraryTypes[MasterObjectTypes.HostedLibrary])\n options.push({ id: SourceFilterOptions.ClickView, name: getPhrase('clickViewVideos') });\n\n return options;\n },\n\n getBackendParamValue(\n val: SourceFilterOptions | SourceFilterOptions[],\n libraries: Library[]\n ): HashObject {\n const values = Array.isArray(val) ? val : [val];\n\n return values.reduce((acc, value) => {\n return libraries.reduce((prev, next) => {\n const libraryIds = prev[LIBRARY_FILTER] || [];\n \n if (value === SourceFilterOptions.MyVideos && next.type === MasterObjectTypes.Workspace)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.School && next.type === MasterObjectTypes.CustomLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n\n if (value === SourceFilterOptions.ExchangeArchive && next.type === MasterObjectTypes.Exchange)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n if (value === SourceFilterOptions.ClickView && next.type === MasterObjectTypes.HostedLibrary)\n return { ...prev, [LIBRARY_FILTER]: [ ...libraryIds, next.id.toString() ]};\n \n return prev;\n }, acc);\n }, {} as HashObject);\n }\n};","export enum CustomerStatus {\n Unclassified = 0,\n Active = 1,\n Prospect = 2,\n LostCustomer = 3,\n Disabled = 4,\n Other = 5\n}\n\nexport enum CustomerStatusString {\n Unclassified = 'Unclassified',\n Active = 'Active',\n Prospect = 'Prospect',\n LostCustomer = 'LostCustomer',\n Disabled = 'Disabled',\n Other = 'Other'\n}","import { SpecialEventType } from 'libs/shared/interfaces';\n\nexport const SpecialEventTypeLabelMap: Record<SpecialEventType, string> = {\n [SpecialEventType.BreakingNews]: 'Breaking news',\n [SpecialEventType.HistoricalEvent]: 'Historical event',\n [SpecialEventType.Holiday]: 'Holiday',\n [SpecialEventType.Informal]: 'Informal',\n [SpecialEventType.Livestream]: 'Livestream',\n [SpecialEventType.NaturalDisaster]: 'Natural disaster',\n [SpecialEventType.Observance]: 'Observance',\n [SpecialEventType.ReligiousEvent]: 'Religious event',\n [SpecialEventType.SportingEvent]: 'Sporting event',\n \n [SpecialEventType.Other]: 'Other'\n};","import React from 'react';\n\nexport function WizardActionInfoContainer(props: React.PropsWithChildren<any>): JSX.Element {\n return (\n <div className='alert text-dark bg-light-blue px-2 rounded-3'>\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserActivationActionInfo';\n\ninterface BulkUserActivationActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserActivationActionInfo(props: BulkUserActivationActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='deactivate' /></h4>\n <p>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'deactivateInfoStudent' : 'deactivateInfoStaff'} />\n </p>\n\n <h4 className='h5'><Text namespace={namespace} phrase='reactivate' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'reactivateInfoStudent' : 'reactivateInfoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserActivationEmailActionInfo';\n\nexport function BulkUserActivationEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.addToClassroomActionInfo';\n\nexport function BulkAddToClassroomActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.changeYearGroupActionInfo';\n\nexport function BulkChangeYearGroupActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserDeleteActionInfo';\n\ninterface BulkUserDeleteActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserDeleteActionInfo(props: BulkUserDeleteActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='delete' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\n\nconst namespace = 'userManager.bulkUserRemoveActionInfo';\n\ninterface BulkUserRemoveActionInfoProps {\n userType: UserGroup;\n}\n\nexport function BulkUserRemoveActionInfo(props: BulkUserRemoveActionInfoProps): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='remove' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase={props.userType === UserGroup.Learner ? 'infoStudent' : 'infoStaff'} />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserResetEmailActionInfo';\n\nexport function BulkUserResetEmailActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkResetPasswordActionInfo';\n\nexport function BulkResetPasswordActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { WizardActionInfoContainer } from 'libs/shared/components/wizard/select-action/wizard-action-info-container/WizardActionInfoContainer';\n\nconst namespace = 'userManager.bulkUserYearGroupRolloverActionInfo';\n\nexport function BulkUserYearGroupRolloverActionInfo(): JSX.Element {\n return (\n <WizardActionInfoContainer>\n <h4 className='h5'><Text namespace={namespace} phrase='heading' /></h4>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='info' />\n </p>\n </WizardActionInfoContainer>\n );\n}","import React from 'react';\n\nexport function CheckCircleSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12 3c4.972 0 9 4.028 9 9s-4.028 9-9 9-9-4.028-9-9 4.028-9 9-9m4.244 5.578a.77.77 0 0 0-1.058.068l-4.722 5.18-1.684-1.615a.77.77 0 0 0-1.06 0 .7.7 0 0 0 0 1.018l2.25 2.16a.77.77 0 0 0 1.094-.035l5.25-5.76a.7.7 0 0 0-.07-1.016'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserStatusBadgeProps {\n user?: Partial<User>;\n status?: ObjectStatus;\n currentUser?: CurrentUser;\n className?: string;\n showActiveBadge?: boolean;\n}\n\nexport function UserStatusBadge(props: UserStatusBadgeProps): JSX.Element {\n return (\n <>\n {/* \"Deactivated\" badge */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Disabled) && (\n <div className={`text-white px-1 ${styles.badge} bg-danger ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='deactivated' />\n </div>\n )}\n\n {/* \"Pending badge\" */}\n {(UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Inactive) && (\n <div className={`text-white px-1 ${styles.badge} ${styles.pending} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'pendingTooltip')} spanHack>\n <Text namespace={namespace} phrase='pending' />\n </Tooltip>\n </div>\n )}\n\n\n {/* \"Active badge\" */}\n {props.showActiveBadge &&\n (UserHelper.getUserStatusFromValue(props.user?.status ?? props.status) === ObjectStatus.Active)\n && (\n <div className={`text-white px-1 ${styles.badge} ${styles.active} ${props.className ?? ''}`}>\n <Tooltip title={LanguageService.getPhrase(namespace, 'active')} spanHack>\n <Text namespace={namespace} phrase='active' />\n </Tooltip>\n </div>\n )}\n\n {/* \"That's me\" badge */}\n {props.user?.id.toString() === props.currentUser?.id.toString() && (\n <div className={`text-white px-1 ${styles.badge} bg-blue ${props.className ?? ''}`}>\n <Text namespace={namespace} phrase='thatsYou' />\n </div>\n )}\n </>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CheckCircleSvg } from 'libs/shared/images/svg/status/CheckCircleSvg';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { UserStatusBadge } from './UserStatusBadge';\n\nimport styles from './user-item-components.module.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface BasicUserDetailsProps {\n user: Partial<User>;\n currentUser?: CurrentUser;\n wrapperClassName?: string;\n}\n\nexport function BasicUserDetails(props: BasicUserDetailsProps): JSX.Element {\n const { user, currentUser } = props;\n\n return (\n <div className={`d-flex flex-column justify-content-center me-auto w-100 ${props.wrapperClassName}`}>\n <div className='pb-1 d-flex align-items-center'>\n {/* Name, username, and status */}\n <div className={`d-flex ${styles.name}`}>\n {user.name ? (\n <h2\n className='h5 m-0 me-1 d-inline-block align-middle text-truncate'\n title={`${user.name} ${user.surname || ''}`}\n >\n {user.name} {user.surname || ''}\n </h2>\n ) : (\n <span className='fst-italic text-secondary me-2'>\n <Text namespace={namespace} phrase='noName' />\n </span>\n )}\n {user.username && (\n <>\n (\n <p title={user.username} className={`m-0 d-inline-block align-middle text-truncate ${styles.username}`}>\n {user.username}\n </p>\n )\n </>\n )}\n </div>\n\n <UserStatusBadge user={user} currentUser={currentUser} className='ms-2' />\n </div>\n\n {/* Email and verification status */}\n <div className='d-flex'>\n {!!user.metadata?.isEmailVerified && (\n <SvgContainer\n className={`svg-container text-secondary ms-n1 ${styles.verifiedEmail}`}\n svg={CheckCircleSvg}\n title={LanguageService.getPhrase(namespace, 'emailVerified')}\n tooltipSpanHack\n tooltipPlacement='top'\n />\n )}\n <p className='text-truncate mb-0 overflow-visible'>\n {user.email\n ? user.email\n : (\n <span className='fst-italic'>\n <Text namespace={namespace} phrase='noEmail' />\n </span>\n )\n }\n </p>\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface RoleOrYearGroupProps {\n userType: UserGroup;\n user?: Partial<User>;\n countryCode?: string;\n badgeText?: string;\n}\n\nfunction getBadgeText(props: RoleOrYearGroupProps): string {\n if (props.userType === UserGroup.Learner) {\n if (props.user?.masterYearGroup?.name)\n return props.user?.masterYearGroup.name;\n\n if (props.user?.yearGroups?.data?.length)\n return ArrayHelper.first(props.user?.yearGroups.data).name;\n\n return null;\n }\n\n if (props.userType === UserGroup.Staff) {\n if (props.user?.userProfile?.role === UserRole.Admin)\n return LanguageService.getPhrase(namespace, 'admin');\n \n if (props.user?.userProfile?.role === UserRole.SuperAdmin)\n return LanguageService.getPhrase(namespace, props.countryCode === 'US' ? 'superAdminUs' : 'superAdmin');\n\n return null;\n }\n}\n\nexport function RoleOrYearGroup(props: RoleOrYearGroupProps): JSX.Element {\n const badgeText = props.badgeText || getBadgeText(props);\n\n if (!badgeText)\n return <></>;\n\n return (\n <div className={`rounded-pill border border-dark bg-white px-2 me-3 d-inline-block flex-shrink-0`}>\n {badgeText}\n </div>\n );\n}","import React from 'react';\n\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport styles from './user-item-components.module.scss';\n\ninterface UserItemAvatarProps {\n user: Partial<User>;\n imageCdnUrl: string;\n}\n\nexport function UserItemAvatar(props: UserItemAvatarProps): JSX.Element {\n return (\n <div className={`${styles.avatarContainer} mx-2`}>\n <Avatar\n imageUrl={props.user.avatar?.url}\n imageCdnUrl={props.imageCdnUrl}\n initials={UserHelper.getInitials(props.user.name, props.user.surname)}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { BaseUserItemProps } from 'libs/shared/apps/user-manager/components/user-list/UserList';\nimport { BasicUserDetails } from 'libs/shared/apps/user-manager/components/user-list-items/components/BasicUserDetails';\nimport { RoleOrYearGroup } from 'libs/shared/apps/user-manager/components/user-list-items/components/RoleOrYearGroup';\nimport { UserItemAvatar } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemAvatar';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface BulkUserActionsErroredUserItemProps extends BaseUserItemProps {\n imageCdnUrl: string;\n errorMessage: string;\n currentUser?: CurrentUser;\n}\n\nexport function BulkUserActionsErroredUserItem(props: BulkUserActionsErroredUserItemProps): JSX.Element {\n return (\n <li className='d-flex align-items-center p-2'>\n <UserItemAvatar user={props.user} imageCdnUrl={props.imageCdnUrl} />\n\n <BasicUserDetails user={props.user} currentUser={props.currentUser} />\n\n <RoleOrYearGroup userType={props.userType} user={props.user} />\n\n <p className='mb-0 mx-2 text-danger'>\n {props.errorMessage}\n </p>\n </li>\n );\n}","export enum UserManagerClient {\n Online = 'online',\n Primary = 'primary',\n Curator = 'curator'\n}","import React from 'react';\n\ntype WizardContext = {\n disableNext?: boolean;\n setDisableNext?: (val: boolean) => void;\n\n onClickConfirm?: () => void;\n setOnClickConfirm?: (cb: () => void) => void;\n\n showButtons?: boolean;\n setShowButtons?: (val: boolean) => void;\n\n showSpinner?: boolean;\n setShowSpinner?: (val: boolean) => void;\n};\n\nexport const WizardLayoutContext = React.createContext<WizardContext>({});\n\nexport const WizardLayoutContextProvider = (props: React.PropsWithChildren<any>) => {\n const [ disableNext, setDisableNext ] = React.useState(false);\n const [ onClickConfirm, setOnClickConfirm ] = React.useState(null);\n const [ showButtons, setShowButtons ] = React.useState(true);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n return (\n <WizardLayoutContext.Provider value={{\n disableNext,\n setDisableNext,\n onClickConfirm,\n setOnClickConfirm,\n showButtons,\n setShowButtons,\n showSpinner,\n setShowSpinner\n }}>\n {props.children}\n </WizardLayoutContext.Provider>\n );\n};","export enum BatchDataType {\n Unknown = 0,\n Staff = 1,\n Learner = 2,\n MasterVideo = 3,\n Rostering = 8,\n MarketingProfile = 16\n}","export enum BatchJobName {\n YearGroupRollover = 'year-group-rollover',\n ChangeYearGroup = 'change-year-group',\n DeleteUser = 'delete-user',\n RemoveUser = 'remove-user',\n DeactivateUser = 'deactivate-user',\n ActivateUser = 'activate-user',\n AddToClassroom = 'add-to-classroom',\n ResetPassword = 'reset-password',\n SendResetPasswordEmail = 'send-reset-password-email',\n SendAccountActivationEmail = 'send-account-activation-email',\n CreateUser = 'create-user',\n\n AddToAudience = 'add-to-audience',\n AddToBackboneClassification = 'add-to-backbone-classification',\n AddToBackboneAudience = 'add-to-backbone-audience',\n AddToClassification = 'add-to-classification',\n AddToSeries = 'add-to-series',\n AddToDirector = 'add-to-director',\n AddToDistributor = 'add-to-distributor',\n AddToProductionCompany = 'add-to-production-company',\n AddToProducer = 'add-to-producer',\n SetProductionYear = 'set-production-year',\n AddToLibrary = 'add-to-library',\n AddToCurationTag = 'add-to-curation-tag',\n AddToSkillTag = 'add-to-skill-tag',\n AddToPedagogyTag = 'add-to-pedagogy-tag',\n AddToNormalTag = 'add-to-normal-tag',\n AddToHiddenTag = 'add-to-hidden-tag',\n AddResourceAndLink = 'add-resource-and-link',\n\n Rostering = 'rostering',\n MarketingProfile = 'marketing-profile',\n UpdateProspectDomains = 'update-prospect-domains',\n AddAliases = 'add-aliases',\n AddPartnerProfiles = 'add-partner-profiles'\n}","export enum BatchJobResultErrorCode {\n NoAction = 1,\n // eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values\n Succeed = 1,\n Unknown = 10,\n\n CustomerNotFound = 100,\n UserNotFound = 101,\n\n EmailNotVerified = 131,\n UserDisabled = 133,\n\n InvalidYearGroup = 200,\n MissingYearGroup = 201,\n NewYearGroupNotSet = 202,\n\n ObjectNotFoundInBackboneClassification = 300,\n ObjectNotFoundInBackboneAudience = 301\n}","export enum BatchJobType {\n RolloverYearGroup = 1,\n DeactivateUser = 2,\n ChangeYearGroup = 3,\n DeleteUser = 4,\n CreateUser = 5,\n ResetPassword = 6,\n AddUsersClassroom = 7,\n SendAccountReminderEmail = 8,\n ActivateUser = 9,\n AddToBackboneClassification = 10,\n AddToClassification = 11,\n AddToBackboneAudience = 12,\n AddToAudience = 13,\n AddVideosSeries = 14,\n AddVideosDistributor = 15,\n AddVideosProductionCompany = 16,\n AddVideosProducer = 17,\n AddVideosDirector = 18,\n AddVideosLibrary = 19,\n AddVideosResourceAndLinks = 21,\n AddVideosTag = 22,\n SendAccountActivationEmail = 23,\n RemoveUser = 24,\n Rostering = 25,\n MarketingProfile = 26,\n SetProductionYear = 28,\n UpdateProspectDomains = 29,\n AddAliases = 30,\n AddPartnerProfiles = 31\n}","import React from 'react';\n\nexport function KeySvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n fill='currentColor'\n d='M12.335 4C14.7258 4.00011 16.6631 5.90392 16.6631 8.26074C16.6629 9.95954 15.6586 11.3904 13.877 12.2334L15.2314 13.5742C15.4776 13.8297 15.4899 14.2192 15.2373 14.4619L13.7734 15.8994L14.7773 16.8828C15.0235 17.1318 15.0366 17.5149 14.7842 17.7705L12.7822 19.7441C12.523 19.9933 12.153 19.9618 11.8809 19.7383L10.8252 18.8252C10.6373 18.6591 10.5723 18.4158 10.5723 18.2051V12.1758C8.99791 11.4924 8.00018 9.97233 8 8.26074C8 5.89108 9.9246 4 12.335 4ZM12.335 5.02832C10.5078 5.02832 9.03711 6.47232 9.03711 8.26074C9.03732 9.79975 10.0929 11.096 11.6152 11.4346V18.0264L12.335 18.7285L13.7471 17.3174L12.8271 16.4229V15.3633L14.2012 14.0283L12.9307 12.7695V11.4795C14.5568 11.0963 15.6199 9.78709 15.6201 8.26074C15.6201 6.47238 14.1556 5.02843 12.335 5.02832ZM12.3496 5.875C13.125 5.875 13.7559 6.50584 13.7559 7.28125C13.7559 8.05666 13.125 8.6875 12.3496 8.6875C11.5744 8.68728 10.9434 8.05652 10.9434 7.28125C10.9434 6.50598 11.5744 5.87522 12.3496 5.875ZM12.3496 6.8125C12.0913 6.81272 11.8809 7.02291 11.8809 7.28125C11.8809 7.53959 12.0913 7.74978 12.3496 7.75C12.6081 7.75 12.8184 7.53972 12.8184 7.28125C12.8184 7.02278 12.6081 6.8125 12.3496 6.8125Z'\n />\n </svg>\n );\n}\n","import React from 'react';\n\nimport { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { BulkUserActionOptions, BulkUserActionStepId, BulkUserSubAction } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BulkUserActivationActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-action-info/BulkUserActivationActionInfo';\nimport { BulkUserActivationEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/activation-email-info/BulkUserActivationEmailActionInfo';\nimport { BulkAddToClassroomActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/add-to-classroom-action-info/BulkAddToClassroomActionInfo';\nimport { BulkChangeYearGroupActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/change-year-group-action-info/ChangeYearGroupActionInfo';\nimport { BulkUserDeleteActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/delete-action-info/BulkUserDeleteActionInfo';\nimport { BulkUserRemoveActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/remove-action-info/BulkUserRemoveActionInfo';\nimport { BulkUserResetEmailActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-email-info/BulkUserResetEmailActionInfo';\nimport { BulkResetPasswordActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/reset-password-action-info/BulkResetPasswordActionInfo';\nimport { BulkUserYearGroupRolloverActionInfo } from 'libs/shared/apps/user-manager/components/bulk-actions-wizard/select-action/year-group-rollover-action-info/BulkUserYearGroupRolloverActionInfo';\nimport { BulkUserActionsErroredUserItem } from 'libs/shared/apps/user-manager/components/user-list-items/bulk-user-actions-errored-user-item/BulkUserActionsErroredUserItem';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { AllowYearGroupRollover } from 'libs/shared/apps/user-manager/hooks/useAllowAnnualYearGroupRollover';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkUserActionsAddToClassroomViewModel, BulkUserActionsResetPasswordViewModel, BulkUserActionsViewModel, BulkUserActionsYearGroupRolloverViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { WizardOptionHash } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { ObjectWithErrorCode } from 'libs/shared/components/wizard/status/statuses/completed-with-error/WizardCompletedWithError';\nimport { WizardStep } from 'libs/shared/components/wizard/step-list/WizardStepList';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobResultErrorCode } from 'libs/shared/enums/BatchJobResultErrorCode';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { ClassroomsSvg } from 'libs/shared/images/svg/objects/ClassroomsSvg';\nimport { EmailSvg } from 'libs/shared/images/svg/objects/EmailSvg';\nimport { FolderSvg } from 'libs/shared/images/svg/objects/FolderSvg';\nimport { GraduationCapSvg } from 'libs/shared/images/svg/objects/GraduationCapSvg';\nimport { GroupSvg } from 'libs/shared/images/svg/objects/GroupSvg';\nimport { KeySvg } from 'libs/shared/images/svg/objects/KeySvg';\nimport { AddToClassroomJobMetadata, BaseBatchJobMetadata, BatchJobMetadata, ChangeYearGroupJobMetadata, CreateBatchJobRequest, CurrentUser, ResetPasswordJobMetadata, User, WizardActionVerb, YearGroup, YearGroupRolloverJobMetadata } from 'libs/shared/interfaces';\nimport { CountsByStatus } from 'libs/shared/interfaces/models/SearchAggregation';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\nexport const SUPPORTED_BATCH_JOB_TYPES = [\n BatchJobType.ActivateUser,\n BatchJobType.AddUsersClassroom,\n BatchJobType.ChangeYearGroup,\n BatchJobType.DeactivateUser,\n BatchJobType.DeleteUser,\n BatchJobType.ResetPassword,\n BatchJobType.RolloverYearGroup,\n BatchJobType.SendAccountReminderEmail,\n BatchJobType.CreateUser,\n BatchJobType.SendAccountActivationEmail,\n BatchJobType.RemoveUser\n];\n\nexport const BulkUserActionsHelper = {\n getSteps(\n userType: UserGroup,\n userCount: number,\n appLinks?: UserManagerAppLinks,\n action?: BulkUserActionOptions\n ): WizardStep<BulkUserActionStepId>[] {\n const actions: WizardStep<BulkUserActionStepId>[] = [\n {\n id: 'select-action',\n text: getPhrase('choose'),\n appLink: appLinks?.bulkActionsSelectAction\n },\n {\n id: 'action-details',\n text: getPhrase('details'),\n appLink: appLinks?.bulkActionsActionDetails?.[action],\n disabled: !appLinks?.bulkActionsActionDetails?.[action]\n },\n {\n id: 'confirmation',\n text: getPhrase('confirmation')\n },\n {\n id: 'status',\n text: getPhrase('status')\n }\n ];\n\n const reviewAccountsAction: WizardStep<BulkUserActionStepId> = {\n id: 'review-accounts',\n text: getPhrase(userType === UserGroup.Learner ? 'reviewStudents' : 'reviewStaff'),\n subText: getPhrase(userType === UserGroup.Learner ? 'reviewSubTextStudents' : 'reviewSubTextStaff', { smartCount: userCount }),\n appLink: appLinks?.bulkActionsReviewAccounts\n };\n\n if (typeof (userCount) !== 'number')\n delete reviewAccountsAction.subText;\n\n actions.unshift(reviewAccountsAction);\n\n return actions;\n },\n\n getActionOptions({\n userType,\n allowYearGroupRollover,\n countsByStatus,\n client,\n products,\n yearGroups,\n hasClassroomsFeature\n }: {\n userType: UserGroup,\n allowYearGroupRollover: AllowYearGroupRollover,\n countsByStatus: CountsByStatus,\n client: UserManagerClient,\n products?: ProductId[],\n yearGroups?: YearGroup[],\n hasClassroomsFeature: boolean\n}): WizardOptionHash<BulkUserActionOptions>[] {\n const actions: WizardOptionHash<BulkUserActionOptions>[] = [];\n\n actions.push({\n order: 40,\n id: 'activation',\n icon: FolderSvg,\n name: getPhrase('deactivateReactivate'),\n infoComponent: () => <BulkUserActivationActionInfo userType={userType} />\n });\n\n const disableDeleteAction = !countsByStatus?.Disabled && !countsByStatus?.Inactive;\n\n const showDelete = client !== UserManagerClient.Primary || products?.includes(ProductId.Online);\n if (showDelete) {\n actions.push({\n order: 50,\n id: 'delete',\n icon: DeleteSvg,\n name: getPhrase('delete'),\n infoComponent: () => <BulkUserDeleteActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('deleteDisabledTooltip') : ''\n });\n }\n const showRemove = client !== UserManagerClient.Online && !products?.includes(ProductId.Online);\n\n if (showRemove) {\n actions.push({\n order: 50,\n id: 'removeFromSchool',\n icon: DeleteSvg,\n name: getPhrase('removeFromSchool'),\n infoComponent: () => <BulkUserRemoveActionInfo userType={userType} />,\n disabled: disableDeleteAction,\n tooltip: disableDeleteAction ? getPhrase('removeFromSchoolDisabledTooltip') : ''\n });\n }\n\n if (userType === UserGroup.Learner) {\n if (yearGroups?.length > 1) {\n actions.push({\n order: 20,\n id: 'changeYearGroup',\n icon: GroupSvg,\n name: getPhrase('changeYearGroup'),\n infoComponent: () => <BulkChangeYearGroupActionInfo />\n });\n }\n \n actions.push({\n order: 30,\n id: 'resetPassword',\n icon: KeySvg,\n name: getPhrase('resetPassword'),\n // TODO: Replace all of these info components with a shared component that accepts a heading and message prop\n infoComponent: () => <BulkResetPasswordActionInfo />\n });\n\n actions.push({\n order: 35,\n id: 'activationEmail',\n icon: EmailSvg,\n name: getPhrase('activationEmail'),\n infoComponent: () => <BulkUserActivationEmailActionInfo />\n });\n\n if (hasClassroomsFeature) {\n actions.push({\n order: 60,\n id: 'addToClassroom',\n icon: ClassroomsSvg,\n name: getPhrase('addToClassroom'),\n infoComponent: () => <BulkAddToClassroomActionInfo />\n });\n }\n \n if (yearGroups?.length > 1) {\n actions.push({\n order: 70,\n id: 'yearGroupRollover',\n icon: GraduationCapSvg,\n name: getPhrase('yearGroupRollover'),\n infoComponent: () => <BulkUserYearGroupRolloverActionInfo />,\n disabled: !allowYearGroupRollover?.canRollover,\n tooltip: getYearGroupRolloverDisabledTooltip(allowYearGroupRollover)\n });\n }\n }\n\n if (userType === UserGroup.Staff) {\n actions.push({\n order: 60,\n id: 'resetEmail',\n icon: EmailSvg,\n name: getPhrase('resetEmail'),\n infoComponent: () => <BulkUserResetEmailActionInfo />\n });\n }\n\n return actions.sort((a, b) => a.order - b.order);\n },\n\n mapSubActionToDisplayName(subAction: BulkUserSubAction): string {\n switch (subAction) {\n case 'yearGroupRollover':\n return getPhrase('yearGroupRolloverDisplayName');\n case 'changeYearGroup':\n return getPhrase('changeYearGroupDisplayName');\n case 'deactivate':\n return getPhrase('deactivateDisplayName');\n case 'reactivate':\n return getPhrase('reactivateDisplayName');\n case 'delete':\n return getPhrase('deleteDisplayName');\n case 'addToClassroom':\n return getPhrase('addToClassroomDisplayName');\n case 'resetPassword':\n return getPhrase('resetPasswordDisplayName');\n case 'resetEmail':\n return getPhrase('resetEmailDisplayName');\n case 'activationEmail':\n return getPhrase('activationEmailDisplayName');\n case 'removeFromSchool':\n return getPhrase('removeFromSchoolDisplayName');\n default:\n return '';\n }\n },\n\n getWizardAppLinks(appLinks: UserManagerAppLinks): Core.AppLink[] {\n const actionDetailsActions = Object.keys(appLinks.bulkActionsActionDetails)\n .map((key: keyof typeof appLinks.bulkActionsActionDetails) => {\n return appLinks.bulkActionsActionDetails[key];\n });\n\n const confirmationAppLinks = Object.keys(appLinks.bulkActionsConfirmation)\n .map((key: keyof typeof appLinks.bulkActionsConfirmation) => {\n return appLinks.bulkActionsConfirmation[key];\n });\n\n const statusAppLinks = Object.keys(appLinks.bulkActionsStatus)\n .map((key: keyof typeof appLinks.bulkActionsStatus) => {\n return appLinks.bulkActionsStatus[key];\n });\n\n return [\n appLinks.bulkActionsReviewAccounts,\n appLinks.bulkActionsSelectAction,\n ...actionDetailsActions,\n ...confirmationAppLinks,\n ...statusAppLinks\n ];\n },\n\n getErrorListItem(\n object: ObjectWithErrorCode<User>,\n imageCdnUrl: string,\n currentUser?: CurrentUser\n ): JSX.Element {\n const errorMessage = this.getUserErrorMessage(object.errorCode);\n return (\n <BulkUserActionsErroredUserItem\n user={object}\n userType={object.userType}\n imageCdnUrl={imageCdnUrl}\n errorMessage={errorMessage}\n currentUser={currentUser}\n />\n );\n },\n\n getUserErrorMessage(errorCode: BatchJobResultErrorCode): string {\n switch (errorCode) {\n case BatchJobResultErrorCode.NoAction:\n case BatchJobResultErrorCode.Succeed:\n return '';\n\n case BatchJobResultErrorCode.InvalidYearGroup:\n return getPhrase('invalidYearGroupError');\n case BatchJobResultErrorCode.MissingYearGroup:\n return getPhrase('missingYearGroupError');\n case BatchJobResultErrorCode.NewYearGroupNotSet:\n return getPhrase('yearGroupUpdateError');\n\n case BatchJobResultErrorCode.EmailNotVerified:\n return getPhrase('emailNotVerifiedError');\n\n case BatchJobResultErrorCode.UserDisabled:\n return getPhrase('userDeactivatedError');\n\n /**\n * I feel like by the this point, none of these errors should be getting thrown.\n * If they do get thrown, we use a generic error message and append the error code\n * in case it does happen and a screenshot is sent to support (hoping this helps).\n */\n case BatchJobResultErrorCode.Unknown:\n case BatchJobResultErrorCode.CustomerNotFound:\n case BatchJobResultErrorCode.UserNotFound:\n default:\n return getPhrase('genericUnexpectedError', { errorCode });\n }\n },\n\n getCreateJobRequestData(\n viewModel: BulkUserActionsViewModel,\n customerId: string,\n userType: UserGroup,\n currentUser?: CurrentUser\n ): CreateBatchJobRequest {\n switch (viewModel.subAction) {\n case 'yearGroupRollover': {\n return {\n name: BatchJobName.YearGroupRollover,\n type: BatchJobType.RolloverYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getYearGroupRolloverJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel,\n customerId\n )\n };\n }\n\n case 'changeYearGroup': {\n return {\n name: BatchJobName.ChangeYearGroup,\n type: BatchJobType.ChangeYearGroup,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getChangeYearGroupJobMetadata(\n viewModel as BulkUserActionsYearGroupRolloverViewModel\n )\n };\n }\n\n case 'delete': {\n return {\n name: BatchJobName.DeleteUser,\n type: BatchJobType.DeleteUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'removeFromSchool': {\n return {\n name: BatchJobName.RemoveUser,\n type: BatchJobType.RemoveUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'deactivate': {\n return {\n name: BatchJobName.DeactivateUser,\n type: BatchJobType.DeactivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getDeactivateUsersJobMetadata(viewModel, currentUser)\n };\n }\n\n case 'reactivate': {\n return {\n name: BatchJobName.ActivateUser,\n type: BatchJobType.ActivateUser,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'addToClassroom': {\n return {\n name: BatchJobName.AddToClassroom,\n type: BatchJobType.AddUsersClassroom,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getAddToClassroomJobMetadata(\n viewModel as BulkUserActionsAddToClassroomViewModel\n )\n };\n }\n\n case 'resetPassword': {\n return {\n name: BatchJobName.ResetPassword,\n type: BatchJobType.ResetPassword,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: getResetPasswordJobMetadata(viewModel as BulkUserActionsResetPasswordViewModel)\n };\n }\n\n case 'resetEmail': {\n return {\n name: BatchJobName.SendResetPasswordEmail,\n type: BatchJobType.SendAccountReminderEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n case 'activationEmail': {\n return {\n name: BatchJobName.SendAccountActivationEmail,\n type: BatchJobType.SendAccountActivationEmail,\n dataType: BulkUserActionsHelper.mapUserTypeToDataType(userType),\n customerId,\n metadata: setupBaseJobMetadata(viewModel)\n };\n }\n\n default:\n Core.ErrorHelper.throw(\n new DevError(`No handler for type ${viewModel.subAction} in BulkUserActionsHelper.getCreateJobRequestData`)\n );\n }\n\n return null;\n },\n\n useSetWizardConfirmationCallback(onClickConfirm: () => void): void {\n const { setOnClickConfirm } = React.useContext(WizardLayoutContext);\n const [viewModel] = useViewModel<BulkUserActionsViewModel>(SharedViewModelKeys.BULK_USER_ACTIONS);\n\n React.useEffect(() => {\n setOnClickConfirm(() => onClickConfirm);\n }, [viewModel?.subAction]);\n },\n\n useCreateJobErrorAlert(): () => void {\n const alerts = useAlerts();\n return () => {\n alerts.error(getPhrase('failedToCreateJob'));\n };\n },\n\n mapDataTypeToUserType(dataType: BatchDataType): UserGroup {\n switch (dataType) {\n case BatchDataType.Staff:\n return UserGroup.Staff;\n case BatchDataType.Learner:\n return UserGroup.Learner;\n default:\n return UserGroup.Unknown;\n }\n },\n\n mapUserTypeToDataType(userType: UserGroup): BatchDataType {\n switch (userType) {\n case UserGroup.Learner:\n return BatchDataType.Learner;\n case UserGroup.Staff:\n return BatchDataType.Staff;\n case UserGroup.Unknown:\n return BatchDataType.Unknown;\n }\n },\n\n getActionTypeFilterOptions(): FilterOption<BatchJobType>[] {\n return [{\n id: BatchJobType.ActivateUser,\n name: getPhrase('activate')\n }, {\n id: BatchJobType.DeactivateUser,\n name: getPhrase('deactivate')\n }, {\n id: BatchJobType.DeleteUser,\n name: getPhrase('deleteUser')\n }, {\n id: BatchJobType.RolloverYearGroup,\n name: getPhrase('yearGroupRollover')\n }, {\n id: BatchJobType.ChangeYearGroup,\n name: getPhrase('changeYearGroup')\n }, {\n id: BatchJobType.CreateUser,\n name: getPhrase('createUser')\n }, {\n id: BatchJobType.ResetPassword,\n name: getPhrase('resetPassword')\n }, {\n id: BatchJobType.SendAccountReminderEmail,\n name: getPhrase('resetEmail')\n }, {\n id: BatchJobType.AddUsersClassroom,\n name: getPhrase('addToClassroom')\n }, {\n id: BatchJobType.SendAccountActivationEmail,\n name: getPhrase('activationEmail')\n }, {\n id: BatchJobType.RemoveUser,\n name: getPhrase('removeFromSchool')\n }];\n },\n\n getUserTypeFilterOptions(): FilterOption<UserGroup>[] {\n return [{\n id: UserGroup.Staff,\n name: getPhrase('staff')\n }, {\n id: UserGroup.Learner,\n name: getPhrase('students')\n }];\n },\n\n mapSubActionToVerb(subAction: BulkUserSubAction): WizardActionVerb {\n if (subAction === 'delete')\n return 'Delete';\n\n if (subAction === 'removeFromSchool')\n return 'Remove';\n\n if (subAction === 'resetEmail' || subAction === 'activationEmail')\n return 'Email';\n\n if (subAction === 'addToClassroom')\n return 'Add';\n\n return 'Update';\n },\n\n mapJobTypeToName(type: BatchJobType): string {\n switch (type) {\n case BatchJobType.ActivateUser:\n return getPhrase('activate');\n case BatchJobType.AddUsersClassroom:\n return getPhrase('addToClassroom');\n case BatchJobType.ChangeYearGroup:\n return getPhrase('changeYearGroup');\n case BatchJobType.DeactivateUser:\n return getPhrase('deactivate');\n case BatchJobType.DeleteUser:\n return getPhrase('delete');\n case BatchJobType.ResetPassword:\n return getPhrase('resetPassword');\n case BatchJobType.RolloverYearGroup:\n return getPhrase('yearGroupRollover');\n case BatchJobType.SendAccountReminderEmail:\n return getPhrase('sendAccountReminderEmail');\n case BatchJobType.CreateUser:\n return getPhrase('bulkUpload');\n case BatchJobType.SendAccountActivationEmail:\n return getPhrase('sendAccountActivationEmail');\n case BatchJobType.RemoveUser:\n return getPhrase('removeUser');\n default:\n return getPhrase('unknown');\n }\n },\n\n hasFilterOrQuery(params: UserManagerQueryParams): boolean {\n return !!(params.query ||\n params.isAdmin ||\n params.status ||\n params.yearGroup);\n }\n};\n\nfunction setupBaseJobMetadata(\n viewModel: BulkUserActionsViewModel\n): BatchJobMetadata {\n return {\n batchObjectIds: [...viewModel.userIdMap.keys()],\n fullBatchObjects: undefined\n };\n}\n\nfunction getYearGroupRolloverJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel,\n customerId: string\n): YearGroupRolloverJobMetadata {\n // Year level rollover can only ever be run with all students\n return {\n fullBatchObjects: {\n source: 'UserApi',\n ownerId: customerId,\n objectType: MasterType.User,\n query: `{userType:${UserGroup.Learner}}`\n },\n finalYearGroupId: viewModel.yearGroup.id\n };\n}\n\nfunction getChangeYearGroupJobMetadata(\n viewModel: BulkUserActionsYearGroupRolloverViewModel\n): ChangeYearGroupJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ChangeYearGroupJobMetadata;\n\n metadata.newYearGroupId = viewModel.yearGroup.id;\n\n return metadata;\n}\n\nfunction getResetPasswordJobMetadata(\n viewModel: BulkUserActionsResetPasswordViewModel\n): ResetPasswordJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as ResetPasswordJobMetadata;\n\n metadata.newPassword = viewModel.password;\n metadata.changeOnNextLogin = viewModel.changeOnNextLogin;\n\n return metadata;\n}\n\nfunction getYearGroupRolloverDisabledTooltip(status: AllowYearGroupRollover): string {\n if (status.canRollover)\n return '';\n\n switch (status.reason) {\n case 'select-all-students':\n return getPhrase('selectAllStudents');\n case 'cooldown':\n return getPhrase('rolloverCooldown', {\n date: DateHelper.format(status.lastRolloverDate, 'DD/MM/YYYY')\n });\n }\n}\n\nfunction getAddToClassroomJobMetadata(\n viewModel: BulkUserActionsAddToClassroomViewModel\n): AddToClassroomJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as AddToClassroomJobMetadata;\n\n metadata.classroomIds = [viewModel.classroom.id];\n\n return metadata;\n}\n\nfunction getDeactivateUsersJobMetadata(\n viewModel: BulkUserActionsViewModel,\n currentUser: CurrentUser\n): BatchJobMetadata {\n const metadata = setupBaseJobMetadata(viewModel) as BaseBatchJobMetadata;\n\n if (!currentUser?.id)\n return metadata;\n\n metadata.batchObjectIds = metadata.batchObjectIds?.filter(id => {\n return id.toString() !== currentUser.id.toString();\n }) ?? [];\n\n return metadata;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { DurationFilterOptions, FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'search.durationFilter';\n\nfunction mapOptionToDurationRange(option: FilterOption<DurationFilterOptions>): string {\n let phraseKey = '';\n\n switch (option.id) {\n case 'bite-sized':\n phraseKey = 'rangeBiteSized';\n break;\n\n case 'short':\n phraseKey = 'rangeShort';\n break;\n \n case 'medium':\n phraseKey = 'rangeMedium';\n break;\n\n case 'long':\n phraseKey = 'rangeLong';\n break;\n }\n \n return LanguageService.getPhrase(namespace, phraseKey);\n}\n\ninterface DurationOptionProps {\n onClick: (option: FilterOption<DurationFilterOptions>) => void;\n option: FilterOption<DurationFilterOptions>;\n active: boolean;\n disabled?: boolean;\n}\n\nfunction DurationOption(props: DurationOptionProps): JSX.Element {\n return (\n <li className='d-flex flex-fill flex-column align-items-center mb-2 mb-md-0 mx-1'>\n <button\n onClick={() => props.onClick(props.option)}\n className={`btn w-100 text-center btn-${props.active ? 'dark' : 'outline-dark'} mb-1`}\n disabled={props.disabled}\n >\n {props.option.name}\n </button>\n\n <span>{mapOptionToDurationRange(props.option)}</span>\n </li>\n );\n}\n\nexport function DurationFilter(props: FilterProps): JSX.Element {\n const currentSelection = ArrayHelper.first(props.draftState.selection);\n\n function onClickDuration(duration: FilterOption<DurationFilterOptions>): void {\n // If the clicked option is already selected, deselect it\n if (currentSelection?.id === duration.id) {\n props.setDraftState({\n active: false,\n selection: []\n });\n \n return;\n }\n\n props.setDraftState({\n active: true,\n selection: [duration]\n });\n }\n\n return (\n <>\n <FilterDropdownTitle title={props.filter.name} />\n\n <ul className='d-flex list-unstyled flex-column flex-md-row mx-n1 mb-2'>\n {props.filter.options.map(option => (\n <DurationOption\n key={option.id}\n option={option as FilterOption<DurationFilterOptions>}\n onClick={onClickDuration}\n active={currentSelection?.id === option.id}\n disabled={props.filter.disabled || option.disabled}\n />\n ))}\n </ul>\n </>\n );\n}","export const XmasConstants = {\n IS_XMAS: false\n};","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { XmasConstants } from 'libs/shared/constants/XmasConstants';\n\nimport styles from './movies-and-tv-filter.module.scss';\n\nconst namespace = 'search.moviesAndTvFilter';\n\ninterface MoviesAndTvFilterProps {\n filter: SearchFilter;\n iconUrl: string;\n extraIconUrl: string\n}\n\nexport function MoviesAndTvFilter(props: MoviesAndTvFilterProps): JSX.Element {\n const filter = props.filter;\n const { state } = React.useContext(FilterContext);\n\n const currentFilterState = state[filter.id];\n const isActive = currentFilterState?.active;\n\n // local state to correct attach & detach animation class\n const [ isFloating, setIsFloating ] = React.useState(false);\n const activeRef = React.useRef(isFloating);\n\n React.useEffect(() => {\n if (isActive !== activeRef.current) {\n activeRef.current = isActive;\n }\n if (isFloating !== activeRef.current)\n setIsFloating(activeRef.current);\n }, [isActive]);\n\n function applyFilter(newState: FilterState): void {\n FilterHelper.applyFilter(\n [filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n \n return (\n <DivButton\n onClick={() => {\n setIsFloating(!isActive);\n applyFilter({ active: !isActive });\n }}\n className={classNames(\n 'mx-1 btn position-relative fw-semibold d-flex align-items-center flex-shrink-0',\n isActive ? 'btn-dark' : 'btn-outline-dark',\n props.filter.disabled && 'disabled'\n )}\n disabled={props.filter.disabled}\n >\n \n <img src={props.iconUrl} className={`${styles.icon} position-absolute ${isActive ? styles.activeIcon : ''}`}/>\n \n <div className={styles.text}>\n <Text namespace={namespace} phrase={'title'}/>\n </div>\n\n <img\n src={props.extraIconUrl}\n className={classNames(\n 'position-absolute',\n styles.floatingIcon,\n isFloating ? styles.active : styles.default,\n XmasConstants.IS_XMAS && styles.xmas\n )}\n />\n </DivButton>\n );\n}","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { FilterDropdownTitle } from 'libs/shared/apps/search/components/filter-dropdown-title/FilterDropdownTitle';\nimport { FilterOption, FilterProps } from 'libs/shared/apps/search/interfaces';\n\nimport { CheckboxFilterList } from '../checkbox-filter/CheckboxFilterList';\n\nexport function GroupedCheckboxFilter(props: FilterProps): JSX.Element {\n const optionGroups: Record<string, FilterOption[]> = {};\n\n for (const option of props.filter.options) {\n if (!option.group)\n continue;\n\n if (!optionGroups[option.group])\n optionGroups[option.group] = [];\n\n optionGroups[option.group].push(option);\n }\n\n return (\n <Form className='mb-3'>\n {Object.entries(optionGroups).map(([ groupName, options ]) => {\n return (\n <ul className='list-unstyled' key={groupName}>\n <FilterDropdownTitle title={groupName} />\n <CheckboxFilterList\n filter={props.filter}\n options={options}\n draftState={props.draftState}\n setDraftState={props.setDraftState}\n displayOptionsIn2Columns={false}\n />\n </ul>\n );\n })}\n </Form>\n );\n}\n","import { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\n\nexport const ClassificationFilterHelper = {\n deriveInitialClassificationFilterStateFromQueryParams(filter: SearchFilter, selections: any): FilterOption[] {\n return filter?.options?.filter(option => {\n const areAllIdsInOptionFoundInSelections = option.id.split(':').every(id => {\n const isIdFoundInSelections = selections.find(\n (selectedId: number | string) => selectedId.toString() === id.toString()\n );\n\n return isIdFoundInSelections;\n });\n\n return areAllIdsInOptionFoundInSelections;\n }) ?? [];\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { DurationFilterOptions, FilterOption } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const DurationFilterHelper = {\n getOptions(): FilterOption<DurationFilterOptions>[] {\n return [\n {\n id: 'bite-sized',\n name: getPhrase('durationBiteSized')\n },\n {\n id: 'short',\n name: getPhrase('durationShort')\n },\n {\n id: 'medium',\n name: getPhrase('durationMedium')\n },\n {\n id: 'long',\n name: getPhrase('durationLong')\n }\n ];\n },\n\n getBackendParamValue(value: DurationFilterOptions): string {\n switch (value) {\n case 'bite-sized':\n return '...179999'; // 3 minutes in ms\n case 'short':\n return '180000...299999'; // 3 - 5 minutes in ms\n \n case 'medium':\n return '300000...899999'; // 5 - 15 minutes in ms\n \n case 'long':\n return '900000...'; // 15 minutes in ms\n }\n }\n};","import { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\n\nimport { getSelectedOptions } from './FilterHelper';\n\nexport const PresentationFilterHelper = {\n deriveInitialPresentationFilterStateFromQueryParams:\n (filterOptions: FilterOption[], selections: any, queryParams: HashObject): FilterOption[] => {\n return getSelectedOptions(filterOptions, selections)\n .map(option => {\n const audienceSelection = queryParams['audience'];\n\n if (!audienceSelection?.length)\n return option;\n\n const secondLayerSelection = getSelectedOptions(option.secondLayerOptions, audienceSelection);\n\n return { ...option, secondLayerSelection };\n }).filter(r => {\n return !!r.secondLayerSelection?.length;\n });\n }\n};\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FilterOption, ProductionYearFilterOptions } from 'libs/shared/apps/search/interfaces';\n\nconst namespace = 'sharedSearch.utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const ProductionYearFilterHelper = {\n getOptions(): FilterOption<ProductionYearFilterOptions>[] {\n return [\n {\n id: 'any-year',\n name: getPhrase('anyYear'),\n default: true\n },\n {\n id: 'this-year',\n name: getPhrase('thisYear')\n },\n {\n id: 'last-3-years',\n name: getPhrase('last3Years')\n },\n {\n id: 'last-5-years',\n name: getPhrase('last5Years')\n }\n ];\n },\n\n getBackendParamValue(value: ProductionYearFilterOptions): string {\n const currentYear = new Date().getFullYear();\n \n switch (value) {\n case 'any-year':\n return '';\n \n case 'this-year':\n return `${currentYear}...`;\n \n case 'last-3-years':\n return `${currentYear - 3}...`;\n \n case 'last-5-years':\n return `${currentYear - 5}...`;\n }\n }\n};","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { Rating, User, YearGroup } from 'libs/shared/interfaces';\n\nexport const RatingFilterHelper = {\n deriveInitialRatingFilterStateFromQueryParams(range: string | [], filter: SearchFilter): FilterOption[] {\n /**\n * When the rating filter is cleared, the app router temporarily sets the rating query param\n * value to an empty array instead of a string. In this case, we just return no selections\n */\n if (Array.isArray(range))\n return range;\n\n const ratingOptions = filter.options as Rating[];\n\n const ratingRange = getRatingsFromFrontendQuery(range, ratingOptions);\n\n if (!ratingRange.length)\n return [];\n\n const highestRating = ArrayHelper.last(ratingRange);\n\n return ratingOptions.filter(option => {\n return option.value > 0 && option.value <= highestRating.value;\n }) as FilterOption[];\n },\n\n getFrontendParamValue(selections: Rating[]): string {\n if (!selections?.length)\n return '';\n \n const first = ArrayHelper.first(selections);\n const last = ArrayHelper.last(selections);\n\n if (selections.length === 1)\n return first.code;\n \n return `${first.code}-to-${last.code}`;\n },\n \n getBackendParamValue(range: string, ratings: Rating[]): string {\n const selectedRatings = getRatingsFromFrontendQuery(range, ratings);\n \n if (!selectedRatings.length)\n return undefined;\n \n if (selectedRatings.length === 1) {\n const upperValue = ArrayHelper.first(selectedRatings);\n return `0...${upperValue.value}`;\n }\n \n const upperValue = ArrayHelper.last(selectedRatings);\n return `0...${upperValue.value}`;\n },\n\n getStudentMaxRating(yearGroups: YearGroup[], user: User): Rating {\n const studentYearGroup = ArrayHelper.findWhere(\n yearGroups,\n { value: user.masterYearGroup?.value }\n );\n\n return studentYearGroup?.rating;\n }\n};\n\nfunction getRatingsFromFrontendQuery(range: string, ratings: Rating[]): Rating[] {\n const codes = range.split('-to-');\n const foundRatings = codes.map(code => ratings.find(r => r.code === code));\n\n /**\n * If we can't map all our values, don't use any values.\n */\n if (!foundRatings.every(r => !!r))\n return [];\n\n return foundRatings;\n}","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, FilterDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CheckboxFilter, DropdownFilter, NestedCheckboxFilter, RadioFilter, SwitchFilter } from 'libs/shared/apps/search/components/filter-types';\nimport { RatingFilter } from 'libs/shared/apps/search/components/filter-types/rating-filter/RatingFilter';\nimport { FilterConstants } from 'libs/shared/apps/search/constants/FilterConstants';\nimport { AllSearchIndicesInSearch, AllSearchIndicesInUserManager, AllSearchIndicesVideoStyle, FilterIds, FilterOption, FilterProps, FilterType, FilterWhitelist, MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { AnalyticsFilterHash } from 'libs/shared/apps/search/interfaces/AnalyticsFilterHash';\nimport { DraftState, FilterPayloadType, FilterState, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { SourceFilterHelper } from 'libs/shared/apps/search/utils/SourceFilterHelper';\nimport { TopicsConstants } from 'libs/shared/constants/TopicsConstants';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { CurationTag } from 'libs/shared/enums/CurationTag';\nimport { CustomerStatus, CustomerStatusString } from 'libs/shared/enums/CustomerStatus';\nimport { CustomerType, CustomerTypeString } from 'libs/shared/enums/CustomerType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { BaseObject, Customer, Library, MasterNestedObject, PresentationWithAudiences, Rating, SpecialEventType, YearGroup } from 'libs/shared/interfaces';\n\nimport { SpecialEventTypeLabelMap } from '../../calendar/constants/SpecialEventTypeLabelMap';\nimport { BulkUserActionsHelper } from '../../user-manager/utils/BulkUserActionsHelper';\nimport { DurationFilter } from '../components/filter-types/custom/duration-filter/DurationFilter';\nimport { MoviesAndTvFilter } from '../components/filter-types/custom/movies-and-tv-filter/MoviesAndTvFilter';\nimport { GroupedCheckboxFilter } from '../components/filter-types/grouped-checkbox-filter/GroupedCheckboxFilter';\n\nimport { ClassificationFilterHelper } from './ClassificationFilterHelper';\nimport { DurationFilterHelper } from './DurationFilterHelper';\nimport { PresentationFilterHelper } from './PresentationFilterHelper';\nimport { ProductionYearFilterHelper } from './ProductionYearFilterHelper';\nimport { RatingFilterHelper } from './RatingFilterHelper';\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from './SharedSearchHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('sharedSearch.utils');\n\ntype MixinDisableFieldsFn = {\n mainFilters: SearchFilter[];\n moreFilters?: MoreFilters;\n};\n\nconst TwoColumnFilters: Record<string, boolean> = {\n classification: true,\n categoryId: true,\n channel: true\n};\n\ninterface GetValidIndicesOptions {\n hasPartnerProfiles: boolean;\n}\n\nfunction getValidIndices(options: GetValidIndicesOptions): Record<string, boolean> {\n const allIndices: Record<string, boolean> = {\n series: true,\n video: true,\n playlist: true,\n classification: true,\n clip: true,\n interactive: true,\n company: true,\n category: true,\n partner_profile: false\n };\n\n if (options.hasPartnerProfiles) {\n allIndices.partner_profile = true;\n allIndices.company = false;\n }\n \n return allIndices;\n}\n\nexport const Filters: Filters = {\n SortBy: (options: FilterOption[], labelPrefix?: string) => ({\n id: 'sort',\n name: getPhrase('newest'),\n type: 'dropdown',\n options,\n compatibleIndices: [ ...AllSearchIndicesInSearch, ...AllSearchIndicesInUserManager ],\n labelPrefix\n }),\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch: boolean) => ({\n id: 'presentation',\n secondaryId: 'audience',\n name: getPhrase('schoolLevels'),\n type: 'nested-checkbox',\n options: getMappedPresentationOptions(options),\n compatibleIndices: _hasNewSearch ?\n [ 'playlist', 'series', 'clip', 'interactive', 'video', 'company', 'category' ] :\n AllSearchIndicesInSearch\n }),\n Topics: (options: FilterOption[]) => ({\n compatibleIndices: [ 'playlist', 'series', 'clip', 'classification', 'interactive', 'video' ],\n options,\n type: 'checkbox',\n name: getPhrase('topicsFilter'),\n id: 'classification'\n }),\n Source: (options: FilterOption[]) => ({\n id: 'source',\n type: 'checkbox',\n name: getPhrase('sources'),\n options,\n compatibleIndices: [ 'video', 'clip', 'interactive', 'category' ]\n }),\n MoviesAndTv: (url: string, extraUrl: string) => ({\n id: 'moviesAndTv',\n name: getPhrase('moviesAndTv'),\n type: 'button',\n compatibleIndices: [ 'video', 'series', 'clip', 'interactive', 'classification', 'playlist', 'company' ],\n customComponent: props => (\n <MoviesAndTvFilter\n {...props}\n filter={props.filter as SearchFilter}\n iconUrl={url}\n extraIconUrl={extraUrl}\n />\n )\n }),\n YearGroup: (options: FilterOption[]) => ({\n id: 'yearGroup', // \"id\" should match the state keys in `FilterReducer`\n name: getPhrase('yearGroup'),\n type: 'checkbox',\n options,\n compatibleIndices: AllSearchIndicesInUserManager\n }),\n ObjectTypes: (inaccessibleIndices: SearchIndices[] = [], _hasNewSearch = false, _hasPartnerProfiles = false) => ({\n id: 'type',\n name: getPhrase('types'),\n type: _hasNewSearch ? 'grouped-checkbox' : 'checkbox',\n options: FilterHelper.getObjectTypeOptions(inaccessibleIndices, _hasNewSearch, _hasPartnerProfiles),\n disableOptions: FilterHelper.getIsObjectTypeOptionDisabled,\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Rating: (options: FilterOption[], maxRating: Rating) => ({\n id: 'rating',\n name: getPhrase('rating'),\n description: getPhrase('ratingDescription'),\n type: 'rating',\n options: options && maxRating ? options.filter((rating: Rating) => rating.value <= maxRating.value) : options,\n compatibleIndices: [ 'video', 'series' ]\n }),\n Interactives: () => ({\n id: 'interactives',\n name: getPhrase('interactives'),\n type: 'switch',\n description: getPhrase('interactivesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n Clips: () => ({\n id: 'clips',\n name: getPhrase('clips'),\n type: 'switch',\n description: getPhrase('clipsDescription'),\n compatibleIndices: ['video']\n }),\n HasResources: () => ({\n id: 'hasResources',\n name: getPhrase('resources'),\n type: 'switch',\n description: getPhrase('resourcesDescription'),\n compatibleIndices: [ 'video', 'clip' ]\n }),\n HasSubtitles: () => ({\n id: 'hasSubtitles',\n name: getPhrase('subtitles'),\n type: 'switch',\n description: getPhrase('subtitlesDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n ProductionYear: () => ({\n id: 'productionYear',\n name: getPhrase('productionYear'),\n type: 'radio',\n options: ProductionYearFilterHelper.getOptions(),\n compatibleIndices: [ ...AllSearchIndicesVideoStyle, 'series' ]\n }),\n IsHD: () => ({\n id: 'isHd',\n name: getPhrase('isHd'),\n type: 'switch',\n description: getPhrase('isHdDescription'),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n IsClickViewContent: () => ({\n id: 'producedByClickView',\n name: getPhrase('producedByClickView'),\n type: 'switch',\n description: getPhrase('producedByClickViewDescription'),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Duration: () => ({\n id: 'duration',\n name: getPhrase('duration'),\n type: 'radio',\n customComponent: DurationFilter,\n options: DurationFilterHelper.getOptions(),\n compatibleIndices: AllSearchIndicesVideoStyle\n }),\n TagOrClassification: (options: string[]) => ({\n id: 'tagOrClassification',\n type: 'tag',\n options: options && options.map(option => ({\n id: option,\n name: option\n })),\n compatibleIndices: AllSearchIndicesInSearch\n }),\n Status: (options?: FilterOption[]) => ({\n id: 'status',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [ ...AllSearchIndicesInUserManager, 'customer' ],\n options: options || FilterHelper.getStatusOptions()\n }),\n JobStatus: () => ({\n id: 'jobStatus',\n name: getPhrase('status'),\n type: 'checkbox',\n compatibleIndices: [],\n options: FilterHelper.getJobStatusOptions()\n }),\n IsAdmin: (customer: Customer, countryCode: string) => {\n const hasOrg = !!customer?.organisation;\n const isUs = countryCode === 'US';\n const description = !hasOrg ? getPhrase('isAdminDescription')\n : isUs ? getPhrase('isAdminDescriptionOrgUs') : getPhrase('isAdminDescriptionOrg');\n\n return {\n id: 'isAdmin',\n name: getPhrase('isAdmin'),\n type: 'switch',\n compatibleIndices: AllSearchIndicesInUserManager,\n description\n };\n },\n BulkActionType: () => ({\n id: 'bulkActionType',\n name: getPhrase('actionType'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getActionTypeFilterOptions(),\n compatibleIndices: []\n }),\n UserType: () => ({\n id: 'userType',\n name: getPhrase('users'),\n type: 'checkbox',\n options: BulkUserActionsHelper.getUserTypeFilterOptions(),\n compatibleIndices: []\n }),\n TvFields: () => ({\n id: 'filter',\n name: getPhrase('tvFields'),\n type: 'radio',\n options: FilterHelper.getTvFieldsOptions(),\n compatibleIndices: []\n }),\n TvChannel: (channels: BaseObject[]) => ({\n id: 'channel',\n name: getPhrase('tvChannel'),\n type: 'checkbox',\n options: FilterHelper.getTvChannelOptions(channels),\n compatibleIndices: []\n }),\n TvDateBroadcast: () => ({\n id: 'dateBroadcast',\n name: getPhrase('tvDateBroadcast'),\n type: 'radio',\n options: FilterHelper.getTvDateBroadcastOptions(),\n compatibleIndices: []\n }),\n Categories: (categories: MasterNestedObject<Library>[]) => ({\n id: 'categoryId',\n name: getPhrase('categories'),\n type: 'checkbox',\n options: FilterHelper.getCategoriesOptions(categories),\n compatibleIndices: []\n }),\n CustomerStatus: () => ({\n id: 'customerStatus',\n name: getPhrase('customerStatus'),\n type: 'radio',\n options: FilterHelper.getCustomerStatusOptions(),\n compatibleIndices: []\n }),\n SpecialEventTypes: () => ({\n id: 'specialEventType',\n type: 'checkbox',\n name: 'Event Type',\n compatibleIndices: [],\n options: FilterHelper.getSpecialEventTypeOptions()\n }),\n CustomerType: () => ({\n id: 'customerType',\n name: getPhrase('customerType'),\n type: 'radio',\n options: FilterHelper.getCustomerTypeOptions(),\n compatibleIndices: []\n })\n};\n\ninterface Filters {\n SortBy: (options: FilterOption[], labelPrefix?: string) => SearchFilter;\n Presentation: (options: PresentationWithAudiences[], _hasNewSearch?: boolean) => SearchFilter;\n Topics: (options: FilterOption[]) => SearchFilter;\n YearGroup: (options: FilterOption[]) => SearchFilter;\n MoviesAndTv: (iconUrl: string, extraUrl: string) => SearchFilter;\n ObjectTypes: (\n inaccessibleIndices: SearchIndices[],\n _hasNewSearch?: boolean,\n _hasPartnerProfiles?: boolean\n ) => SearchFilter;\n Rating: (options: FilterOption[], maxRating: Rating) => SearchFilter;\n Interactives: () => SearchFilter;\n Clips: () => SearchFilter;\n HasResources: () => SearchFilter;\n HasSubtitles: () => SearchFilter;\n ProductionYear: () => SearchFilter;\n IsHD: () => SearchFilter;\n IsClickViewContent: () => SearchFilter;\n Duration: () => SearchFilter;\n TagOrClassification: (options: string[]) => SearchFilter;\n Status: (options?: FilterOption[]) => SearchFilter;\n JobStatus: () => SearchFilter;\n IsAdmin: (customer?: Customer, countryCode?: string) => SearchFilter;\n BulkActionType: () => SearchFilter<BatchJobType>;\n UserType: () => SearchFilter<UserGroup>;\n TvFields: () => SearchFilter;\n TvChannel: (channels: BaseObject[]) => SearchFilter;\n TvDateBroadcast: () => SearchFilter;\n Categories: (categories: MasterNestedObject<Library>[]) => SearchFilter;\n Source: (options: FilterOption[]) => SearchFilter;\n CustomerStatus: () => SearchFilter;\n SpecialEventTypes: () => SearchFilter;\n CustomerType: () => SearchFilter;\n}\n\nfunction getMappedPresentationOptions(options: PresentationWithAudiences[]): FilterOption[] {\n if (!options)\n return [];\n\n return options.map(opt => ({\n ...opt,\n id: opt.id.toString(),\n secondLayerOptions: opt.audiences.map(a => ({ ...a, id: a.id.toString() }))\n }));\n}\n\nexport const FilterHelper = {\n displayTwoLayers(filter: SearchFilter): boolean {\n if (filter.type !== 'nested-checkbox')\n return false;\n\n // With one presso we only show second layer options\n if (!this.hasManyFilterOptions(filter.options))\n return false;\n\n // Show first layer only\n if (filter.options.every(o => !this.hasManyFilterOptions(o?.secondLayerOptions)))\n return false;\n\n return true;\n },\n\n hasManyFilterOptions(options: FilterOption[]) {\n return options.length >= TopicsConstants.MULTI_PRESENTATION_THRESHOLD;\n },\n\n displayTwoColumns(filter: SearchFilter | MoreFilters): boolean {\n return (\n (TwoColumnFilters[filter.id]) &&\n filter.options?.length >= FilterConstants.MAX_CHECKBOXES_PER_COLUMN\n );\n },\n\n showPresentationFilter(presentationFilter: SearchFilter): boolean {\n // If the school's topic presentation has no audiences, don't show\n if (!presentationFilter.options?.length)\n return false;\n\n // If the school has more than 1 topic presentation, always show\n if (presentationFilter.options.length > 1)\n return true;\n \n // If the school has only 1 topic presentation but it has >1 audience, always show\n if (ArrayHelper.first(presentationFilter.options).secondLayerOptions?.length > 1)\n return true;\n\n return false;\n },\n\n getMoreFilters(filters: SearchFilter[]): MoreFilters {\n return {\n id: 'moreFilters',\n name: getPhrase('moreFilters'),\n type: 'more-filters',\n filters\n };\n },\n\n mapTypeToComponent(type: FilterType): (props: FilterProps) => JSX.Element {\n switch (type) {\n case 'switch':\n return (props: any) => <SwitchFilter key={props.id} {...props} />;\n case 'checkbox':\n return (props: any) => <CheckboxFilter key={props.id} {...props} />;\n case 'nested-checkbox':\n return (props: any) => <NestedCheckboxFilter key={props.id} {...props} />;\n case 'grouped-checkbox':\n return (props: any) => <GroupedCheckboxFilter key={props.id} {...props} />;\n case 'radio':\n return (props: any) => <RadioFilter key={props.id} {...props} />;\n case 'rating':\n return (props: any) => <RatingFilter key={props.id} {...props} />;\n case 'dropdown':\n return (props: any) => <DropdownFilter key={props.id} {...props} />;\n default:\n return () => <></>;\n }\n },\n\n deriveInitialStateFromQuery(\n queryParams: HashObject = {},\n mainFilters: SearchFilter[] = null,\n moreFilters: MoreFilters = null,\n appLink: Core.AppLink\n ): FilterStateHash {\n const initialStates: Omit<FilterStateHash, 'appLink' | 'moreFilters'> = {\n sort: {\n active: !!queryParams.sort,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'sort')\n },\n\n classification: {\n active: !!queryParams.classification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classification')\n },\n\n presentation: {\n active: !!queryParams.presentation,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'presentation')\n },\n\n type: {\n active: !!queryParams.type,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'type')\n },\n\n specialEventType: {\n active: !!queryParams.specialEventType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'specialEventType')\n },\n\n rating: {\n active: !!queryParams.rating,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'rating')\n },\n \n interactives: {\n active: queryParams.interactives?.toString() === 'true'\n },\n\n clips: {\n active: queryParams.clips?.toString() === 'true'\n },\n\n yearGroup: {\n active: !!queryParams.yearGroup,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'yearGroup')\n },\n\n moviesAndTv: {\n active: queryParams.moviesAndTv?.toString() === 'true'\n },\n\n classroom: {\n active: !!queryParams.classroom,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'classroom')\n },\n\n audience: {\n active: !!queryParams.audience,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'audience')\n },\n\n hasResources: {\n active: queryParams.hasResources?.toString() === 'true'\n },\n\n hasSubtitles: {\n active: queryParams.hasSubtitles?.toString() === 'true'\n },\n\n productionYear: {\n active: !!queryParams.productionYear,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'productionYear')\n },\n\n isHd: {\n active: queryParams.isHd?.toString() === 'true'\n },\n\n producedByClickView: {\n active: queryParams.producedByClickView?.toString() === 'true'\n },\n\n duration: {\n active: queryParams.duration,\n selection: getFilterSelectionsFromQueryParams(queryParams, moreFilters?.filters, 'duration')\n },\n\n tagOrClassification: {\n active: !!queryParams.tagOrClassification,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'tagOrClassification')\n },\n\n status: {\n active: !!queryParams.status,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'status')\n },\n\n jobStatus: {\n active: !!queryParams.jobStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'jobStatus')\n },\n isAdmin: {\n active: queryParams.isAdmin?.toString() === 'true'\n },\n\n bulkActionType: {\n active: !!queryParams.bulkActionType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'bulkActionType')\n },\n\n userType: {\n active: !!queryParams.userType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'userType')\n },\n\n filter: {\n active: !!queryParams.filter,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'filter')\n },\n\n channel: {\n active: !!queryParams.channel,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'channel')\n },\n\n dateBroadcast: {\n active: !!queryParams.dateBroadcast,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'dateBroadcast')\n },\n\n categoryId: {\n active: !!queryParams.categoryId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'categoryId')\n },\n \n hasInteractives: {\n active: !!queryParams.hasInteractives,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'hasInteractives')\n },\n\n source: {\n active: !!queryParams.source,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'source')\n },\n\n customerStatus: {\n active: !!queryParams.customerStatus,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerStatus')\n },\n\n customerType: {\n active: !!queryParams.customerType,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'customerType')\n },\n\n seriesId: {\n active: !!queryParams.seriesId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'seriesId')\n },\n\n scopeId: {\n active: !!queryParams.scopeId,\n selection: getFilterSelectionsFromQueryParams(queryParams, mainFilters, 'scopeId')\n }\n };\n\n const reduceFunc = (state: FilterStateHash, filter: SearchFilter<string>) => {\n const filterState = initialStates[filter.id];\n\n /**\n * If we had the query param value, but were not able to parse it into a valid selection.\n * We're actually not active.\n * \n * e.g. For `?rating=bleep-to-bloop` the value of !!queryParams.rating is true, but we are not able\n * to extract any meaningful values from it so the call to getFilterSelectionsFromQueryParams returns an empty array.\n * \n * - Sha\n */\n if (filterState.active && 'selection' in filterState && !filterState.selection?.length)\n filterState.active = false;\n\n state[filter.id] = initialStates[filter.id];\n return state;\n };\n\n const derivedState = mainFilters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n\n if (moreFilters?.filters) {\n derivedState.moreFilters = moreFilters.filters.reduce<FilterStateHash>(reduceFunc, {} as FilterStateHash);\n }\n\n derivedState.appLink = appLink;\n\n return derivedState;\n },\n\n hasActiveFilters(queryParams: HashObject): boolean {\n const paramKeys = Object.keys(queryParams);\n\n if (!paramKeys.length)\n return false;\n\n const activeFilters = paramKeys.filter(q => {\n // 'query', 'cursor', 'page', 'scopeId' and 'curriculumCode' don't count as filters\n if ([ 'query', 'cursor', 'page', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ].includes(q))\n return false;\n\n // Filters that can have multiple selections (e.g. checkbox types) do not count as active if they are empty\n if (Array.isArray(queryParams[q]) && !queryParams[q].length)\n return false;\n\n return true;\n });\n\n return !!activeFilters.length;\n },\n\n getLabel(filter: SearchFilter, filterState: FilterState): string {\n if (!filterState?.selection?.length)\n return filter.name;\n\n if (filter.type === 'dropdown')\n return ArrayHelper.first(filterState.selection).name;\n\n if (filter.type === 'radio') {\n const selection = ArrayHelper.first(filterState.selection);\n if (!selection || selection.default)\n return filter.name;\n\n return selection.name;\n }\n\n if (filter.type === 'nested-checkbox' || filter.type === 'checkbox' || filter.type === 'grouped-checkbox') {\n const isDefaultState = filter.options.find(opt => {\n return opt.default && filterState.selection.find(selection => selection.id === opt.id);\n });\n\n if (isDefaultState)\n return filter.name;\n\n if (filter.secondaryId) {\n const count = filterState.selection?.reduce((acc, firstLayerSelection) => {\n const availableOptions = filter.options;\n const index = availableOptions.findIndex(option => option.id === firstLayerSelection.id);\n if (availableOptions[index].secondLayerOptions?.length === 0) {\n return acc + 1;\n }\n\n return acc + (firstLayerSelection.secondLayerSelection?.length ?? 0);\n }, 0);\n\n return `${filter.name} - ${count}`;\n }\n\n return `${filter.name} - ${filterState.selection.length}`;\n }\n\n if (filter.type === 'rating') {\n if (!filterState.selection.length)\n return filter.name;\n\n const first = ArrayHelper.first(filterState.selection) as Rating;\n const last = ArrayHelper.last(filterState.selection) as Rating;\n\n if (filterState.selection.length === 1)\n return `${filter.name}: ${first.code}`;\n\n return `${filter.name}: ${first.code} to ${last.code}`;\n }\n },\n\n buildFrontendFilterParams(queryParams: HashObject, filterStates: Array<FilterPayloadType>): HashObject {\n const updatedParams = { ...queryParams };\n\n filterStates.forEach(filterState => {\n if (!filterState?.filter)\n return;\n\n const { id: param, type } = filterState.filter;\n const { active, selection } = filterState.state;\n\n switch (type) {\n case 'switch':\n updatedParams[param] = active ? 'true' : '';\n break;\n\n case 'radio':\n case 'dropdown':\n const isDefault =\n filterState.state.selection?.length === 1 && ArrayHelper.first(filterState.state.selection)?.default;\n\n updatedParams[param] = (filterState.state.selection.length && !isDefault) ? ArrayHelper.first(filterState.state.selection).id : '';\n break;\n\n case 'nested-checkbox':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n const { secondaryId: secondaryParam } = filterState.filter;\n\n if (secondaryParam) {\n // FlatMap\n updatedParams[secondaryParam] = [].concat(...selection.map(s => s.secondLayerSelection.map(o => o.id)));\n }\n\n break;\n\n case 'checkbox':\n case 'grouped-checkbox':\n if (!active) {\n updatedParams[param] = null;\n break;\n }\n\n const options = [];\n for (const option of selection) {\n const ids = option.id.toString().split(':');\n if (ids.length > 1) {\n // When an option has more than one id\n // e.g. An topic option can used by many presentations\n for (const id of ids) {\n options.push(id);\n }\n } else {\n options.push(option.id);\n }\n }\n\n updatedParams[param] = options;\n break;\n\n case 'tag':\n updatedParams[param] = active ? selection.map(option => option.id) : null;\n break;\n\n case 'rating':\n updatedParams[param] = active ? RatingFilterHelper.getFrontendParamValue(selection as Rating[]) : null;\n break;\n\n case 'button':\n updatedParams[param] = active ? 'true' : '';\n break;\n }\n\n if (!updatedParams[param]) // If the param is empty, delete it\n delete updatedParams[param];\n });\n\n return ObjectHelper.omit(updatedParams, ['cursor']);\n },\n\n buildBackendFilterParams(\n queryParams: HashObject,\n ratings: Rating[] = [],\n presentationIds: string[],\n isLearner: boolean,\n libraries: Library[]\n ): HashObject {\n const defaultParams: HashObject = isLearner ? {\n ['filters.presentation']: presentationIds,\n isLearner\n } : {};\n\n return Object.keys(queryParams).reduce((acc: HashObject, paramName: FilterIds) => {\n const values = queryParams[paramName];\n\n if ((Array.isArray(values) && !values.length) || !values)\n return acc;\n\n if (!FilterWhitelist[paramName])\n return acc;\n\n if (paramName === 'rating') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = RatingFilterHelper.getBackendParamValue(values, ratings);\n return acc;\n }\n\n if (paramName === 'productionYear') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = ProductionYearFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'duration') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = DurationFilterHelper.getBackendParamValue(values);\n return acc;\n }\n\n if (paramName === 'moviesAndTv') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}curationTag`] = CurationTag.MOVIES_AND_TV;\n return acc;\n }\n\n if (paramName === 'source') {\n return {\n ...acc,\n ...SourceFilterHelper.getBackendParamValue(values, libraries)\n };\n }\n\n if (paramName === 'scopeId') {\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}partnerProfile`] = [values];\n return acc;\n }\n\n acc[`${FilterConstants.FILTER_PARAM_PREFIX}${paramName}`] = values;\n\n return acc;\n }, defaultParams);\n },\n\n getAppliedIndices(\n queryParams: HashObject = {},\n _hasNewSearch: boolean = false,\n _hasPartnerProfiles: boolean = false\n ): SearchIndices[] {\n const { type: indices } = queryParams;\n\n const validIndices = getValidIndices({ hasPartnerProfiles: _hasPartnerProfiles });\n \n const newIndices: SearchIndices[] = ['category'];\n\n function validateIndices(indice: SearchIndices): boolean {\n if (_hasNewSearch) {\n return validIndices[indice];\n }\n\n return !newIndices.includes(indice) && validIndices[indice];\n }\n\n if (indices) {\n if (!Array.isArray(indices))\n return [indices].filter(validateIndices);\n\n if (indices.length)\n return indices.filter(validateIndices);\n }\n\n const extraIndices: SearchIndices[] = [];\n if (_hasNewSearch)\n extraIndices.push(...newIndices);\n \n if (queryParams.source)\n return [ 'video', 'clip', 'interactive', ...extraIndices ];\n\n if (_hasPartnerProfiles)\n return [ 'series', 'video', 'playlist', 'classification', 'clip', 'interactive', 'partner_profile', ...extraIndices ];\n\n return [ 'series', 'video', 'playlist', 'classification', 'clip', 'interactive', 'company', ...extraIndices ];\n },\n\n applyFilter(\n filters: Array<SearchFilter>,\n currentFilterState: FilterState | FilterStateHash,\n draftState: DraftState,\n baseAppLink: Core.AppLink\n ): void {\n if (ObjectHelper.isEqual(currentFilterState, draftState))\n return;\n\n const filterIds = Object.keys(draftState) as FilterIds[];\n\n const payload: Array<FilterPayloadType> = filterIds.map(filterId => {\n const filter = filters.find(f => f.id === filterId);\n const draftFilterState = draftState[filterId];\n\n const isDefaultValue =\n draftFilterState.selection?.length === 1 && ArrayHelper.first(draftFilterState.selection)?.default;\n\n return {\n filter,\n state: {\n active: draftFilterState.active && !isDefaultValue,\n selection: draftFilterState.selection\n }\n };\n });\n\n const currentQueryParams = Core.LocationUtils.GetQuery();\n Core.AppLinkHelper.trigger({\n ...baseAppLink,\n params: FilterHelper.buildFrontendFilterParams(currentQueryParams, payload)\n }, { replace: true });\n },\n\n mixinDisabledFields(\n state: FilterStateHash,\n indices: SearchIndices[],\n mainFilters: SearchFilter[],\n moreFilters?: MoreFilters\n ): MixinDisableFieldsFn {\n let allFilters = [ ...mainFilters, ...(moreFilters?.filters ?? []) ];\n\n // Iterate through each filter, and disable them if they should be disabled\n allFilters = disableFilters(state, allFilters, indices);\n\n // Iterate through each filter option, and disable them if they should be disabled\n allFilters = disableFilterOptions(state, allFilters);\n\n const response: MixinDisableFieldsFn = {\n mainFilters: allFilters.filter(filter => mainFilters.find(f => f.id === filter.id))\n };\n\n if (moreFilters?.filters) {\n response.moreFilters = {\n ...moreFilters,\n filters: allFilters.filter(filter => moreFilters.filters.find(f => f.id === filter.id))\n };\n }\n\n return response;\n },\n\n logFilterEvent(\n mainFilters: SearchFilter[],\n moreFilters: MoreFilters,\n state: FilterStateHash,\n query: string,\n analyticsOptions: AnalyticsOptions\n ): void {\n const analyticsFilterObjects: AnalyticsFilterHash[] = [];\n\n mainFilters?.forEach(f => {\n const filterState = state[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n moreFilters?.filters?.forEach(f => {\n const filterState = state.moreFilters[f.id];\n\n if (filterState.active) {\n analyticsFilterObjects.push({\n type: f.id,\n selection: filterState.selection\n });\n }\n });\n\n if (!analyticsFilterObjects.length)\n analyticsOptions.descriptor = FilterDescriptor.Reset;\n\n AnalyticsHelper.logUserAction({\n query: query ?? '',\n filters: analyticsFilterObjects\n }, AnalyticsHelper.mergeOptions(analyticsOptions, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Filter\n }));\n },\n\n /**\n * Helpers below this comment return hard coded filter options for a particular filter.\n * If you are adding a new filter with hard coded options, add a new function here.\n */\n getObjectTypeOptions(\n inaccessibleIndices: SearchIndices[] = [],\n _hasNewSearch: boolean,\n _hasPartnerProfiles: boolean\n ): FilterOption<SearchIndices>[] {\n if (_hasNewSearch) {\n const options: FilterOption<SearchIndices>[] = [\n {\n id: 'video',\n name: getPhrase('videos'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'clip',\n name: getPhrase('clips'),\n group: getPhrase('videoTypes')\n },\n {\n id: 'classification',\n name: getPhrase('topics'),\n group: getPhrase('collections')\n },\n {\n id: 'series',\n name: getPhrase('series'),\n group: getPhrase('collections')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists'),\n group: getPhrase('collections')\n },\n {\n id: 'category',\n name: getPhrase('category'),\n group: getPhrase('collections')\n }\n ];\n \n if (_hasPartnerProfiles) {\n options.push({\n id: 'partner_profile',\n name: getPhrase('channels'),\n group: getPhrase('collections')\n });\n }\n \n return options.filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n }\n\n return [\n {\n id: 'classification',\n name: getPhrase('topics')\n },\n {\n id: 'playlist',\n name: getPhrase('playlists')\n },\n {\n id: 'series',\n name: getPhrase('series')\n },\n {\n id: 'video',\n name: getPhrase('videos')\n },\n {\n id: 'clip',\n name: getPhrase('clips')\n },\n {\n id: 'interactive',\n name: getPhrase('interactives')\n }\n ].filter(opt => !inaccessibleIndices.find(i => i === opt.id)) as FilterOption<SearchIndices>[];\n },\n\n /**\n * Loops through each option on the \"object type\" filter, and determines whether\n * they should be disabled based on the currently active filters\n */\n getIsObjectTypeOptionDisabled(\n options: FilterOption<SearchIndices>[],\n filters: SearchFilter[],\n state: FilterStateHash\n ): FilterOption<SearchIndices>[] {\n return options.map(option => {\n let isDisabled = false;\n\n filters.forEach(filter => {\n if (isDisabled)\n return;\n\n const filterState = state[filter.id] || state.moreFilters[filter.id];\n\n if (!filterState?.active || !filter.compatibleIndices?.length)\n return;\n\n if (!filter.compatibleIndices.find(i => option.id === i))\n isDisabled = true;\n });\n\n return {\n ...option,\n disabled: isDisabled\n };\n });\n },\n\n getNameSortOptions(): FilterOption[] {\n return [\n {\n id: 'newest',\n name: getPhrase('newest')\n },\n {\n id: 'oldest',\n name: getPhrase('oldest')\n },\n {\n id: 'first-name-atoz',\n name: getPhrase('firstNameAToZ')\n },\n {\n id: 'first-name-ztoa',\n name: getPhrase('firstNameZToA')\n },\n {\n id: 'surname-atoz',\n name: getPhrase('surnameAToZ')\n },\n {\n id: 'surname-ztoa',\n name: getPhrase('surnameZToA')\n }\n ];\n },\n\n getYearGroupOptions(yearGroups: YearGroup[]): FilterOption[] {\n if (!yearGroups?.length)\n return [];\n\n return yearGroups.map(y => ({\n id: y.value.toString(),\n name: y.name\n }));\n },\n\n getStatusOptions(): FilterOption[] {\n return [\n {\n id: 'active',\n name: getPhrase('active')\n },\n {\n id: 'deactivated',\n name: getPhrase('deactivated')\n },\n {\n id: 'pending',\n name: getPhrase('pending')\n }\n ];\n },\n\n getJobStatusOptions(): FilterOption[] {\n return [\n {\n id: 'completed',\n name: getPhrase('completed')\n },\n {\n id: 'failed',\n name: getPhrase('errored')\n },\n {\n id: 'inProgress',\n name: getPhrase('inProgress')\n }\n ];\n },\n\n getTvFieldsOptions(): FilterOption[] {\n return [\n {\n id: '0',\n name: getPhrase('allFields'),\n default: true\n },\n {\n id: '1',\n name: getPhrase('titleDescriptionField')\n },\n {\n id: '2',\n name: getPhrase('captionsField')\n }\n ];\n },\n\n getTvChannelOptions(channels: BaseObject[]): FilterOption[] {\n if (!channels?.length)\n return [];\n\n return channels.map(channel => ({\n id: channel.name,\n name: channel.name\n }));\n },\n\n getTvDateBroadcastOptions(): FilterOption[] {\n return [\n {\n id: 'any-time',\n name: getPhrase('anyTime'),\n default: true\n },\n {\n id: 'yesterday',\n name: getPhrase('yesterday')\n },\n {\n id: 'last-week',\n name: getPhrase('lastWeek')\n },\n {\n id: 'last-2-weeks',\n name: getPhrase('last2Weeks')\n }\n ];\n },\n\n getCustomerStatusOptions(): FilterOption[] {\n return [\n {\n id: CustomerStatus.Unclassified.toString(),\n name: CustomerStatusString.Unclassified\n },\n {\n id: CustomerStatus.Active.toString(),\n name: CustomerStatusString.Active\n },\n {\n id: CustomerStatus.Prospect.toString(),\n name: CustomerStatusString.Prospect\n },\n {\n id: CustomerStatus.LostCustomer.toString(),\n name: CustomerStatusString.LostCustomer\n },\n {\n id: CustomerStatus.Disabled.toString(),\n name: CustomerStatusString.Disabled\n },\n {\n id: CustomerStatus.Other.toString(),\n name: CustomerStatusString.Other\n }\n ];\n },\n\n getCustomerTypeOptions(): FilterOption[] {\n return [\n {\n id: CustomerType.Unclassified.toString(),\n name: CustomerTypeString.Unclassified\n },\n {\n id: CustomerType.Primary.toString(),\n name: CustomerTypeString.Primary\n },\n {\n id: CustomerType.Secondary.toString(),\n name: CustomerTypeString.Secondary\n },\n {\n id: CustomerType.K12.toString(),\n name: CustomerTypeString.K12\n },\n {\n id: CustomerType.Tertiary.toString(),\n name: CustomerTypeString.Tertiary\n },\n {\n id: CustomerType.NonEducational.toString(),\n name: CustomerTypeString.NonEducational\n },\n {\n id: CustomerType.Partners.toString(),\n name: CustomerTypeString.Partners\n },\n {\n id: CustomerType.Internal.toString(),\n name: CustomerTypeString.Internal\n },\n {\n id: CustomerType.Other.toString(),\n name: CustomerTypeString.Other\n },\n {\n id: CustomerType.ClickView.toString(),\n name: CustomerTypeString.ClickView\n },\n {\n id: CustomerType.System.toString(),\n name: CustomerTypeString.System\n }\n ];\n },\n \n getCategoriesOptions(categories: MasterNestedObject<Library>[]): FilterOption[] {\n if (!categories?.length)\n return [];\n\n // TODO: Custom nested checkbox\n return categories.map(category => {\n return {\n id: category.data.id,\n name: category.data.name\n // secondLayerOptions: category.children.map(\n // nestedCategory => ({ id: nestedCategory.data.id, name: nestedCategory.data.name })\n // )\n };\n });\n },\n\n getSpecialEventTypeOptions(): FilterOption[] {\n return [\n {\n id: SpecialEventType.BreakingNews,\n name: SpecialEventTypeLabelMap[SpecialEventType.BreakingNews]\n },\n {\n id: SpecialEventType.SportingEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.SportingEvent]\n },\n {\n id: SpecialEventType.Observance,\n name: SpecialEventTypeLabelMap[SpecialEventType.Observance]\n },\n {\n id: SpecialEventType.NaturalDisaster,\n name: SpecialEventTypeLabelMap[SpecialEventType.NaturalDisaster]\n },\n {\n id: SpecialEventType.HistoricalEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.HistoricalEvent]\n },\n {\n id: SpecialEventType.Holiday,\n name: SpecialEventTypeLabelMap[SpecialEventType.Holiday]\n },\n {\n id: SpecialEventType.Informal,\n name: SpecialEventTypeLabelMap[SpecialEventType.Informal]\n },\n {\n id: SpecialEventType.ReligiousEvent,\n name: SpecialEventTypeLabelMap[SpecialEventType.ReligiousEvent]\n },\n {\n id: SpecialEventType.Other,\n name: SpecialEventTypeLabelMap[SpecialEventType.Other]\n }\n ];\n }\n};\n\n// This allows us to determine which filters should be applied based on the query params set on first load\nfunction getFilterSelectionsFromQueryParams(\n queryParams: HashObject,\n filters: SearchFilter[] = [],\n filterId: FilterIds\n): FilterOption[] {\n const filter = filters.find(f => f.id === filterId);\n\n if (!filter)\n return [];\n\n if (!queryParams[filterId])\n return filter.options?.filter(option => option.default) ?? [];\n\n if (filterId === 'rating')\n return RatingFilterHelper.deriveInitialRatingFilterStateFromQueryParams(queryParams[filterId], filter);\n\n let selections = queryParams[filterId];\n\n if (!Array.isArray(selections))\n selections = [selections];\n\n if (filterId === 'classification') {\n return ClassificationFilterHelper.deriveInitialClassificationFilterStateFromQueryParams(filter, selections);\n }\n\n if (filterId === 'presentation') {\n return PresentationFilterHelper.\n deriveInitialPresentationFilterStateFromQueryParams(filter.options, selections, queryParams);\n }\n\n return getSelectedOptions(filter.options, selections);\n}\n\nexport function getSelectedOptions(options: FilterOption[] | undefined, selections: any): any[] {\n if (!Array.isArray(selections))\n selections = [selections];\n\n return options?.filter(option => {\n return selections.find((id: number | string) => id.toString() === option.id.toString());\n }) ?? [];\n}\n\n/**\n * This basically iterates through every filter, and works out if that filter should be disabled.\n * This is based on:\n * - If the filter is compatible with any of the currently applied search indices\n * - If the filter is compatible with any of the filter indices that are compatible with any of the active filters\n */\nfunction disableFilters(state: FilterStateHash, filters: SearchFilter[], indices: SearchIndices[]): SearchFilter[] {\n // Convert the currently applied search indices into a hashmap\n const appliedIndices = indices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n return filters.map(filter => {\n if (!filter.compatibleIndices?.length)\n return filter;\n\n // If none of the applied indices works with the filter, it should be disabled.\n // For example, if the user filters by \"playlists\", the \"has resources\" filter will be disabled.\n if (!filter.compatibleIndices.find(i => appliedIndices[i])) {\n return {\n ...filter,\n disabled: true\n };\n }\n \n // Get all currently active filters\n const activeFilterIds = Object.keys(state).filter((filterId: keyof typeof state) => {\n const filterState = state[filterId];\n\n if (!('active' in filterState))\n return false;\n\n return filterState.active;\n });\n\n let shouldDisableFilter = false;\n\n activeFilterIds.forEach(activeFilterId => {\n if (shouldDisableFilter)\n return;\n\n const activeFilter = filters.find(f => f.id === activeFilterId);\n\n if (!activeFilter.compatibleIndices?.length)\n return;\n\n const activeFilterIndices = activeFilter.compatibleIndices.reduce((acc: HashObject, index) => {\n acc[index] = true;\n return acc;\n }, {});\n\n /**\n * Check if the active filter's indices are compatible with the current filter's indices.\n * For example, if the \"has resources\" filter is active, then all filters that are incompatible\n * with videos will be disabled.\n */\n if (!filter.compatibleIndices.find(i => activeFilterIndices[i]))\n shouldDisableFilter = true;\n });\n\n return {\n ...filter,\n disabled: shouldDisableFilter\n };\n });\n}\n\n/**\n * This will disable particular option on a filter if they are incompatible with the currently\n * active filters.\n *\n * For example, if we apply the \"rating\" filter, then the \"playlist\" and \"classification\" options\n * on the \"ObjectTypes\" filter will be disabled, as we cannot filter by those options _and_ by rating\n * at the same time.\n */\nfunction disableFilterOptions(state: FilterStateHash, filters: SearchFilter[]): SearchFilter[] {\n return filters.map(filter => {\n if (!FunctionHelper.isFunction(filter.disableOptions))\n return filter;\n\n // Only filters that have a `disableOptions` function will run here.\n const options = filter.disableOptions(filter.options, filters, state);\n\n return {\n ...filter,\n options\n };\n });\n}","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.module.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent\n ? props.filter.customComponent\n : FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svg={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.module.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active\n ? acc + 1\n : acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent\n ? filter.customComponent\n : FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport styles from './tags.module.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 { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n\n const isTouch = React.useMemo(() => UserAgentHelper.isTouchScreen(), []);\n\n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition || isTouch) return;\n\n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n\n if (!containerRef.current?.children)\n return;\n\n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n isTouch ||\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n\n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n if (!containerRef.current)\n return;\n\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n\n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n\n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100 mb-0'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","import React from 'react';\n\nexport function ChevronRightSvg(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...props}>\n <path\n d='M15.695 11.267c.407.41.407 1.056 0 1.466L9.79 18.696a1.046 1.046 0 0 1-1.474 0l-.01-.01a1.034 1.034 0 0 1 0-1.467L13.474 12l-5.17-5.22a1.034 1.034 0 0 1 0-1.465l.012-.011a1.046 1.046 0 0 1 1.474 0z'\n fill='currentColor'\n />\n </svg>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\n\nimport styles from './widget-button.module.scss';\n\nconst namespace = 'shared.widgetButton';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport enum WidgetButtonDirection {\n Left,\n Right\n}\n\ninterface WidgetButtonProps {\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n direction: WidgetButtonDirection;\n hide: boolean;\n contents?: WidgetContents;\n useGradientBackdrop?: boolean;\n className?: string;\n hoverText?: string;\n hideExtendedClickableArea?: boolean;\n state?: FixedWidgetState;\n\n leftButtonClassName?: string;\n rightButtonClassName?: string;\n leftGradientClassName?: string;\n rightGradientClassName?: string;\n containerClassName?: string;\n}\n\nexport const WidgetButton = React.memo(function(props: WidgetButtonProps): JSX.Element {\n const isLeft = props.direction === WidgetButtonDirection.Left;\n\n const arrowSvg = isLeft ? ChevronLeftSvg : ChevronRightSvg;\n\n function getPositionClass(): string {\n let className = styles.topPos;\n \n // Left / Right\n if (isLeft)\n className += ` ${styles.left} ${props.leftButtonClassName}`;\n else\n className += ` ${styles.right} ${props.rightButtonClassName}`;\n \n return className;\n }\n\n function getStyle(): React.CSSProperties {\n if (props.state?.contents === 'videos')\n return { paddingBottom: (56.25 / props.state?.viewableItems) + '%' };\n\n return { height: '100%' };\n }\n\n if (props.hide)\n return <></>;\n\n return (\n <div className={`${styles.buttonContainer} ${props.containerClassName ? props.containerClassName : ''}`} style={getStyle()}>\n {props.useGradientBackdrop &&\n <div className={isLeft ? `${styles.gradientLeft} ${props.leftGradientClassName}` : `${styles.gradientRight} ${props.rightGradientClassName}`} />\n }\n\n {!props.hideExtendedClickableArea && (\n <button\n onClick={props.onClick}\n className={`${styles.extendedClickableArea} ${isLeft ? styles.left : styles.right}`}\n tabIndex={-1}\n />\n )}\n\n <button\n className={`${getPositionClass()} ${styles.button} ${props.className || ''}`}\n onClick={props.onClick}\n aria-label={isLeft ? getPhrase('previous') : getPhrase('next')}\n >\n {props.hoverText && (\n <span className={`ps-3 pe-2 ${styles.hoverText}`}>{props.hoverText}</span>\n )}\n <SvgContainer\n svg={arrowSvg}\n size={SvgContainerSize.Medium}\n className={`svg-container d-inline-block ${styles.chevron}`}\n />\n </button>\n </div>\n );\n});","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import * as React from 'react';\n\n/**\n * Hook function for listening to scroll events\n * @param onResize - gets called on resize.\n * @param onResizeEnd (optional) - gets called 100ms after the last resize event. Timer restarts everytime the callback\n * runs so that endCallback only fires after a stretch of resize events.\n * @param dependencies - values from the component (e.g. state, props and functions) that are used \n * inside the effect hook.\n */\nexport function useResizeListener(onResize: () => void, onResizeEnd?: () => void, dependencies: any[] = []): void {\n let resizeTimeout: number;\n\n const onResizeModified = () => {\n onResize();\n\n window.clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(onResizeEnd, 100);\n };\n\n React.useEffect(() => {\n window.addEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n return () => window.removeEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n }, [...dependencies]);\n}","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nimport { DynamicWidgetState } from './DynamicWidgetReducer';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\n/**\n * Resize events\n */\nexport const getResizeHandler = (\n elementRefs: SlidingListRefs,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n mediaQuery: MediaQueryStrings\n) => () => {\n if (elementRefs.container.current)\n elementRefs.container.current.style.transition = '';\n\n dispatch({\n type: WidgetInteraction.Resize,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n};\n\nexport const getResizeEndHandler = (containerRef: React.MutableRefObject<HTMLUListElement>) => () => {\n if (containerRef.current)\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n};\n\nexport const getDragHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n widgetState: DynamicWidgetState,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n widgetSnapshot: WidgetSnapshot,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => (event: React.DragEvent<HTMLUListElement>): void => {\n const mouseX = event.clientX;\n\n let snapshot = widgetSnapshot;\n\n if (!snapshot) {\n snapshot = { ...widgetState, initialMouseX: mouseX };\n setWidgetSnapshot(snapshot);\n containerRef.current.style.transition = '';\n }\n\n dispatch({\n type: WidgetInteraction.Drag,\n payload: {\n widgetSnapshot: snapshot,\n currentMouseX: mouseX\n }\n });\n};\n\nexport const getDragEndHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => () => {\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n setWidgetSnapshot(null);\n};","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nexport interface DynamicWidgetState {\n /**\n * X-position argument for `translate3d()` to determine where the slider is positioned.\n */\n offset: number;\n\n /**\n * Left position of the slider container.\n * Set on `Init`, and updated on `Resize`.\n * Used for calculations on `Previous`, or for dragging to the right.\n */\n containerLeftPosition: number;\n\n /**\n * Right position of the slider container.\n * Set on Init, and updated on Resize.\n * Used for calculations on `Next`, or for dragging to the left.\n */\n containerRightPosition: number;\n\n /**\n * The position of the left edge of the very first element in the slider list.\n * Initially this will always be equal to `containerLeftPosition`.\n */\n firstElementPosition: number;\n\n /**\n * The position of the right edge of the very last element in the slider list.\n */\n lastElementPosition: number;\n\n /**\n * True when `firstElementPosition === containerLeftPosition`.\n */\n hideLeftButton: boolean;\n\n /**\n * True when `lastElementPositon === containerRightPosition`.\n */\n hideRightButton: boolean;\n\n /**\n * When clicking left or right, this number is the max distance in pixels that the slider.\n * will move.\n * Default 300.\n * Can only be set once on `Init` action.\n */\n maxSlideDistance: number;\n\n /**\n * This is calculated on `Init`, and is the lowest number the `offset` state can ever be.\n * This is needed for the `Drag` event, as the `Drag` event can only calculate whole numbers.\n * 99% of the time, the leftOffsetLimit is a very specific decimal number, so we calculate it\n * on `Init` and reference it on `Drag` events when necessary.\n */\n leftOffsetLimit: number;\n}\n\nfunction getMaxSlideDistance(mediaQuery: MediaQueryStrings): number {\n if (mediaQuery === MediaQueryStrings.XS)\n return 200;\n\n if (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.MD)\n return 350;\n\n return 500;\n}\n\n/**\n * `null` values are initialized in the `Init` action. This is dispatched\n * later, because it uses JQuery elements that aren't immediately available\n * when `useReducer` is called.\n */\nexport const initialSliderState: DynamicWidgetState = {\n offset: 0,\n containerLeftPosition: null,\n containerRightPosition: null,\n firstElementPosition: null,\n lastElementPosition: null,\n hideLeftButton: true,\n hideRightButton: true,\n maxSlideDistance: 0,\n leftOffsetLimit: null\n};\n\ninterface InitPayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onInit = (payload: InitPayload): DynamicWidgetState => {\n const { container, lastElement } = payload.elementRefs;\n\n if (!container?.current || !lastElement?.current)\n return initialSliderState;\n\n const containerRect = container.current.getBoundingClientRect();\n const containerLeftPosition = containerRect.left;\n const containerRightPosition = containerRect.right;\n\n const firstElementPosition = containerLeftPosition;\n const lastElementPosition = lastElement.current.getBoundingClientRect().right;\n const leftOffsetLimit = containerRightPosition - lastElementPosition;\n\n return {\n ...initialSliderState,\n containerLeftPosition,\n containerRightPosition,\n firstElementPosition,\n lastElementPosition,\n hideRightButton: lastElementPosition < containerRightPosition,\n leftOffsetLimit,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\ninterface ResizePayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onResize = (payload: ResizePayload): DynamicWidgetState => {\n const initialState = onInit({\n ...payload,\n ...payload.elementRefs\n });\n\n return {\n ...initialState,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\nconst onNext = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { firstElementPosition, lastElementPosition, maxSlideDistance, offset, containerRightPosition } = prevState;\n\n /**\n * The distance in pixels that the slider will move along the x-axis.\n * This will be the `maxSlideDistance` constant value, or if that value is too large we calculate\n * the remaining overflowing space and only slide by that amount.\n */\n const slideDistance = lastElementPosition - containerRightPosition >= maxSlideDistance\n ? maxSlideDistance\n : lastElementPosition - containerRightPosition;\n\n return {\n firstElementPosition: firstElementPosition - slideDistance,\n lastElementPosition: lastElementPosition - slideDistance,\n offset: offset - slideDistance,\n hideRightButton: lastElementPosition - slideDistance === containerRightPosition,\n hideLeftButton: false\n };\n};\n\nconst onPrevious = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { containerLeftPosition, firstElementPosition, lastElementPosition, maxSlideDistance, offset } = prevState;\n\n const fullSlide = firstElementPosition + maxSlideDistance <= containerLeftPosition;\n const slideDistance = fullSlide ? maxSlideDistance : Math.abs(offset);\n\n return {\n firstElementPosition: firstElementPosition + slideDistance,\n lastElementPosition: lastElementPosition + slideDistance,\n offset: offset + slideDistance,\n hideLeftButton: !fullSlide || firstElementPosition + slideDistance === containerLeftPosition,\n hideRightButton: false\n };\n};\n\nconst onDrag = (prevState: DynamicWidgetState, payload: any): Partial<DynamicWidgetState> => {\n const { widgetSnapshot, currentMouseX } = payload;\n\n // Disable dragging if the slider isn't long enough\n if (widgetSnapshot.hideLeftButton && widgetSnapshot.hideRightButton)\n return {};\n\n // The distance from the initial `MouseDown` event x-coordinate, to the present x-coordinate\n const dragDistance = widgetSnapshot.initialMouseX - currentMouseX;\n\n let offset = widgetSnapshot.offset - dragDistance;\n let firstElementPosition = widgetSnapshot.firstElementPosition - dragDistance;\n let lastElementPosition = widgetSnapshot.lastElementPosition - dragDistance;\n let hideLeftButton = false;\n let hideRightButton = false;\n\n if (firstElementPosition > prevState.containerLeftPosition) {\n offset = 0;\n firstElementPosition = prevState.containerLeftPosition;\n lastElementPosition = prevState.lastElementPosition;\n hideLeftButton = true;\n }\n\n if (lastElementPosition <= prevState.containerRightPosition) {\n offset = prevState.leftOffsetLimit;\n firstElementPosition = prevState.containerLeftPosition - Math.abs(prevState.leftOffsetLimit);\n lastElementPosition = widgetSnapshot.containerRightPosition;\n hideRightButton = true;\n }\n\n return {\n offset,\n firstElementPosition,\n lastElementPosition,\n hideLeftButton,\n hideRightButton\n };\n};\n\nexport function DynamicWidgetReducer(\n prevState: DynamicWidgetState,\n action: ReducerActions<WidgetInteraction>\n): DynamicWidgetState {\n switch (action.type) {\n case WidgetInteraction.Init:\n return {\n ...prevState,\n ...onInit(action.payload)\n };\n\n case WidgetInteraction.Resize:\n return {\n ...prevState,\n ...onResize(action.payload)\n };\n\n case WidgetInteraction.Next:\n return {\n ...prevState,\n ...onNext(prevState)\n };\n\n case WidgetInteraction.Previous:\n return {\n ...prevState,\n ...onPrevious(prevState)\n };\n\n case WidgetInteraction.Drag:\n return {\n ...prevState,\n ...onDrag(prevState, action.payload)\n };\n\n default:\n return prevState;\n }\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { useWidgetKeyboard } from 'libs/shared/components/widgets/hooks/useWidgetKeyboard';\nimport { SlidingListContainer } from 'libs/shared/components/widgets/sliding-list/SlidingListContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\nimport { PartialLoadingHelper, PartialLoadingOptions } from 'libs/shared/utils/PartialLoadingHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { getDragEndHandler, getDragHandler, getResizeEndHandler, getResizeHandler } from './DynamicWidgetEventHandlers';\nimport { DynamicWidgetReducer, DynamicWidgetState, initialSliderState } from './DynamicWidgetReducer';\n\nimport styles from './dynamic-widget.module.scss';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\ninterface StaticChild {\n position: 'start' | 'end';\n component: React.ElementType;\n}\n\ninterface DynamicWidgetProps {\n id?: string;\n childComponent: React.ElementType;\n childComponentProps?: any;\n partialLoadingComponent: React.ElementType;\n partialLoadingOptions?: PartialLoadingOptions;\n\n widgetDataDeps?: (any)[];\n getChildAppLink?: (data: any) => Core.AppLink;\n\n staticChildren?: StaticChild[];\n collection?: BaseObject[];\n fetch?: (...args: any[]) => any;\n lazyLoad?: boolean;\n\n heading?: string;\n headingAppLink?: Core.AppLink;\n description?: string;\n getSubtitle?: (data: any) => string\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n getWidgetItemAnalyticsData?: (data: any) => HashObject;\n hideButtons?: boolean;\n childClassName?: string;\n // set to true if the widget get cut off by the container\n noNegativePadding?: boolean;\n}\n\nDynamicWidget.defaultProps = {\n heading: '',\n description: '',\n childComponentProps: {}\n};\n\nexport function DynamicWidget(props: DynamicWidgetProps): JSX.Element {\n const { childComponent: WidgetItemComponent, staticChildren, getWidgetItemAnalyticsData = () => {} } = props;\n\n const [ state, dispatch ] = React.useReducer(DynamicWidgetReducer, initialSliderState);\n\n // A snapshot of the widget state is captured on the very first `Drag` event as a point of reference\n const [ widgetSnapshot, setWidgetSnapshot ] = React.useState<WidgetSnapshot>(null);\n\n const elementRefs: SlidingListRefs = {\n container: React.useRef(null),\n firstElement: React.useRef(null),\n lastElement: React.useRef(null)\n };\n\n const mediaQuery = useGetMediaQueryString();\n const isTouchScreen = UserAgentHelper.isTabletOrMobile();\n \n const { dynamicAttributes, focusNext, focusPrev, onFocusWidget, onBlurWidget } = useWidgetKeyboard({ type: 'dynamic', state, containerRef: elementRefs.container, mediaQuery });\n\n useResizeListener(\n getResizeHandler(elementRefs, dispatch, mediaQuery),\n getResizeEndHandler(elementRefs.container),\n [mediaQuery]\n );\n\n const { ref, inView } = useLazyLoad({ prevent: !props.lazyLoad });\n\n let widgetData = props.collection;\n\n if (!props.collection && FunctionHelper.isFunction(props.fetch)) {\n const request = props.fetch(inView);\n widgetData = request.data;\n }\n\n /**\n * Once the widget data has been set, we can initialize the reducer. This is because\n * the reducer depends on the refs being set, but they don't get set until the markup has been loaded.\n */\n React.useEffect(() => {\n if (!widgetData || ObjectHelper.isEmpty(widgetData))\n return;\n\n dispatch({\n type: WidgetInteraction.Init,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n }, [widgetData]);\n\n function getWidgetItems(): JSX.Element {\n if (!widgetData)\n return;\n\n const firstChildren = staticChildren?.filter(child => child.position === 'start') ?? [];\n const lastChildren = staticChildren?.filter(child => child.position === 'end') ?? [];\n\n let items = widgetData.map((widgetItem, index) => {\n let itemRef: React.MutableRefObject<HTMLLIElement>;\n\n if (widgetItem === ArrayHelper.first(widgetData) && firstChildren?.length)\n itemRef = elementRefs.firstElement;\n\n if (widgetItem === ArrayHelper.last(widgetData) && !lastChildren?.length)\n itemRef = elementRefs.lastElement;\n\n const isLast = index + 1 === widgetData.length;\n\n return (\n <li\n id={widgetItem.id}\n key={widgetItem.id}\n ref={itemRef}\n onFocus={() => onFocusWidget(index)}\n onBlur={() => onBlurWidget()}\n className={`${styles.itemSpacing} ${props.childClassName || ''} ${(isLast && isTouchScreen) ? 'pe-4' : ''}`}\n {...dynamicAttributes[widgetItem.id]}\n >\n <WidgetItemComponent\n getChildAppLink={props.getChildAppLink}\n data={widgetItem}\n getSubtitle={props.getSubtitle}\n analyticsData={{\n itemIndex: index,\n ...props.analyticsData,\n ...getWidgetItemAnalyticsData(widgetItem)\n }}\n analyticsOptions={{ ...props?.analyticsOptions, ...WidgetHelper.getSliderItemAnalyticsOptions() }}\n {...props.childComponentProps}\n />\n </li>\n );\n });\n\n if (firstChildren.length) {\n items = [\n ...firstChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`first-widget-component:${i}`}\n ref={i === 0 ? elementRefs.firstElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n }),\n ...items\n ];\n }\n\n if (lastChildren.length) {\n items = [\n ...items,\n ...lastChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`end-widget-component:${i}`}\n ref={i === lastChildren.length - 1 ? elementRefs.lastElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n })\n ];\n }\n\n return <>{items}</>;\n }\n const widgetItems = React.useMemo(getWidgetItems, [\n widgetData, dynamicAttributes, state.offset, mediaQuery, ...props.widgetDataDeps || []\n ]);\n\n if (widgetData && !widgetData.length && !staticChildren?.length)\n return <></>;\n\n if (!widgetData || ObjectHelper.isEmpty(widgetData)) {\n return (\n <div ref={ref}>\n <PartialDynamicWidget\n partialLoadingComponent={props.partialLoadingComponent}\n partialLoadingOptions={props.partialLoadingOptions}\n />\n </div>\n );\n }\n\n const getSliderAnalyticsData = (type: WidgetInteraction) => ({\n ...props.analyticsData,\n id: props.id,\n name: props.heading,\n direction: type === WidgetInteraction.Next ? 'right' : 'left'\n });\n\n const hideButtons = isTouchScreen || props.hideButtons;\n\n return (\n <div className={`${props.noNegativePadding ? '' : 'mx-n4'}`}>\n <div className={`px-4 ${styles.header}`}>\n <WidgetHeader\n name={props.heading}\n description={props.description}\n appLink={props.headingAppLink}\n showSeeMoreLink={!!props.headingAppLink}\n />\n </div>\n\n <div className='position-relative'>\n <div className={`${props.noNegativePadding ? '' : 'px-4' } py-3 my-n3 position-relative ${isTouchScreen ? styles.mobileScroll : 'overflow-hidden-x'}`}>\n <div className={`position-relative ${props.hideButtons ? 'overflow-hidden-x' : ''}`}>\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => {\n focusPrev();\n\n dispatch({ type: WidgetInteraction.Previous });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Previous),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n leftButtonClassName={`${styles.leftButton} ${props.noNegativePadding ? styles.leftButtonNoPadding : ''}`}\n leftGradientClassName={`${styles.leftGradient} ${props.noNegativePadding ? styles.leftGradientNoPadding : ''}`}\n hide={state.hideLeftButton}\n useGradientBackdrop\n />\n )}\n\n <SlidingListContainer\n position={state.offset}\n positionType={CssMeasurement.Pixels}\n onDrag={getDragHandler(elementRefs.container, state, dispatch, widgetSnapshot, setWidgetSnapshot)}\n onDragEnd={getDragEndHandler(elementRefs.container, setWidgetSnapshot)}\n ref={elementRefs.container}\n >\n {widgetItems}\n </SlidingListContainer>\n\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => {\n focusNext();\n\n dispatch({ type: WidgetInteraction.Next });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Next),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n hide={state.hideRightButton}\n rightButtonClassName={`${styles.rightButton} ${props.noNegativePadding ? styles.rightButtonNoPadding : ''}`}\n rightGradientClassName={`${styles.rightGradient} ${props.noNegativePadding ? styles.rightGradientNoPadding : ''}`}\n useGradientBackdrop\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ntype PartialDynamicWidgetProps = Pick<DynamicWidgetProps, 'partialLoadingComponent'> & {\n partialLoadingOptions?: PartialLoadingOptions;\n}\n\nexport const PartialDynamicWidget = (props: PartialDynamicWidgetProps) => {\n const { partialLoadingComponent: Component, partialLoadingOptions } = props;\n\n return (\n <div className='d-flex flex-nowrap overflow-hidden'>\n {PartialLoadingHelper.getPartialLoadingItems(partialLoadingOptions).map((item, idx) => <Component key={idx} />)}\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';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.module.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching\n ? new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n })\n : []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\n\nimport { SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM } from '../../utils/SharedSearchHelper';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string;\n mainFilters: Array<SearchFilter>;\n moreFilters: MoreFilters;\n alignLeft?: boolean;\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n const currentParams = (ContextService.getCurrentRoute().appLink?.params ?? {}) as HashObject;\n const savedParams = ObjectHelper.pick(currentParams, [ 'query', SEARCH_CURRICULUM_CODE_PARAM, SEARCH_IN_PARAM ]);\n\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: savedParams\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.module.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject;\n mainFilters: SearchFilter[];\n appLink: Core.AppLink;\n moreFilters?: MoreFilters;\n isFetchingOptions?: boolean;\n constantIndices?: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n\n hideHeading?: boolean;\n hideDivider?: boolean;\n hideResetButton?: boolean;\n alignResetButtonLeft?: boolean;\n hideCaret?: boolean;\n\n /**\n * Incremental changes flag for new search\n */\n _hasNewSearch?: boolean;\n /**\n * Incremental changes flag for partner profiles\n */\n _hasPartnerProfiles?: boolean;\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams, props._hasNewSearch, props._hasPartnerProfiles),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={classNames(\n 'd-flex',\n !props.hideDivider && 'border-bottom pb-3 mb-3',\n (props._hasNewSearch && props.hideDivider && 'pb-3'),\n (props._hasNewSearch && !props.hideDivider && 'border-gray-300')\n )}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={classNames(`d-flex flex-wrap ${styles.filtersContainer}`, !hideHeading && 'ms-2')}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n"],"names":["SpecialEventType","AllSearchIndicesVideoStyle","AllSearchIndicesInSearch","AllSearchIndicesInUserManager","namespace","FilterActions","props","jsx","DivButton","Text","FilterContext","createContext","FilterReducer","state","action","FilterDropdownTitle","CheckboxFilterList","selections","onToggleItem","option","isCurrentlyChecked","indexOfItem","selection","i","newItems","options","isDisabled","isChecked","s","joinedIds","Checkbox","CheckboxFilter","displayOptionsIn2Columns","FilterHelper","jsxs","Fragment","Form","NestedFilterOptions","allOptions","firstLayerOption","isFirstLayerOptionDisabled","currentSelection","_a","secondLayerOptions","isFirstLayerIndeterminate","getIsFirstLayerIndeterminate","isFirstLayerOptionChecked","secondLayerOption","isSecondLayerOptionDisabled","isSecondLayerOptionChecked","hasSecondLayerSelection","allSecondLayerOptionsChecked","_b","SecondLayerOptions","NestedCheckboxFilter","selectedOption","isCurrentlyCheckedOrIndeterminate","indexOfOption","o","enabled2ndLayerOptions","newSelectedOptionWith2ndLayerOptions","newSelection","firstLayer","ArrayHelper","selectionItem","onToggleChildItem","parentOption","indexOfParentOption","newChildSelection","newParentSelection","new2ndLayerSelection","SwitchFilter","isActive","onToggle","ToggleSwitch","DropdownFilter","onSelect","Dropdown","RadioFilter","isSelected","styles","RatingButton","ref","isHovering","useHover","React","button","Tooltip","RatingRangeSelector","hoverRange","setHoverRange","getRange","rating","r","onClickRating","onHover","ButtonGroup","RatingFilter","onSelectRange","range","filteredRatings","firstRating","lastRating","className","FilterConstants","getPhrase","LanguageService","LIBRARY_FILTER","getTypeMap","libraries","prev","next","SourceFilterHelper","opts","isLearner","isGuest","hasCustomLibraries","libraryTypes","MasterObjectTypes","SourceFilterOptions","val","acc","value","libraryIds","CustomerStatus","CustomerStatusString","SpecialEventTypeLabelMap","WizardActionInfoContainer","BulkUserActivationActionInfo","UserGroup","BulkUserActivationEmailActionInfo","BulkAddToClassroomActionInfo","BulkChangeYearGroupActionInfo","BulkUserDeleteActionInfo","BulkUserRemoveActionInfo","BulkUserResetEmailActionInfo","BulkResetPasswordActionInfo","BulkUserYearGroupRolloverActionInfo","CheckCircleSvg","UserStatusBadge","UserHelper","ObjectStatus","_c","_d","_e","BasicUserDetails","user","currentUser","SvgContainer","getBadgeText","_f","_g","_i","_h","UserRole","_k","_j","RoleOrYearGroup","badgeText","UserItemAvatar","Avatar","BulkUserActionsErroredUserItem","UserManagerClient","WizardLayoutContext","BatchDataType","BatchJobName","BatchJobResultErrorCode","BatchJobType","KeySvg","BulkUserActionsHelper","userType","userCount","appLinks","actions","reviewAccountsAction","allowYearGroupRollover","countsByStatus","client","products","yearGroups","hasClassroomsFeature","FolderSvg","disableDeleteAction","ProductId","DeleteSvg","GroupSvg","EmailSvg","ClassroomsSvg","GraduationCapSvg","getYearGroupRolloverDisabledTooltip","a","b","subAction","actionDetailsActions","key","confirmationAppLinks","statusAppLinks","object","imageCdnUrl","errorMessage","errorCode","viewModel","customerId","getYearGroupRolloverJobMetadata","getChangeYearGroupJobMetadata","setupBaseJobMetadata","getDeactivateUsersJobMetadata","getAddToClassroomJobMetadata","getResetPasswordJobMetadata","Core.ErrorHelper","DevError","onClickConfirm","setOnClickConfirm","useViewModel","SharedViewModelKeys","alerts","useAlerts","dataType","type","params","MasterType","metadata","status","DateHelper","id","mapOptionToDurationRange","phraseKey","DurationOption","DurationFilter","onClickDuration","duration","XmasConstants","MoviesAndTvFilter","filter","currentFilterState","isFloating","setIsFloating","activeRef","applyFilter","newState","classNames","GroupedCheckboxFilter","optionGroups","groupName","ClassificationFilterHelper","selectedId","DurationFilterHelper","PresentationFilterHelper","filterOptions","queryParams","getSelectedOptions","audienceSelection","secondLayerSelection","ProductionYearFilterHelper","currentYear","RatingFilterHelper","ratingOptions","ratingRange","getRatingsFromFrontendQuery","highestRating","first","last","ratings","selectedRatings","studentYearGroup","foundRatings","code","TwoColumnFilters","getValidIndices","allIndices","Filters","labelPrefix","_hasNewSearch","getMappedPresentationOptions","url","extraUrl","inaccessibleIndices","_hasPartnerProfiles","maxRating","customer","countryCode","hasOrg","description","channels","categories","opt","TopicsConstants","presentationFilter","filters","mainFilters","moreFilters","appLink","initialStates","getFilterSelectionsFromQueryParams","reduceFunc","filterState","derivedState","paramKeys","q","SEARCH_CURRICULUM_CODE_PARAM","SEARCH_IN_PARAM","count","firstLayerSelection","availableOptions","index","filterStates","updatedParams","param","active","isDefault","secondaryParam","ids","ObjectHelper","presentationIds","defaultParams","paramName","values","FilterWhitelist","CurationTag","indices","validIndices","newIndices","validateIndices","indice","extraIndices","draftState","baseAppLink","payload","filterId","f","draftFilterState","isDefaultValue","currentQueryParams","Core.LocationUtils","Core.AppLinkHelper","allFilters","disableFilters","disableFilterOptions","response","query","analyticsOptions","analyticsFilterObjects","FilterDescriptor","AnalyticsHelper","WorkflowPhase","UserAction","y","channel","CustomerType","CustomerTypeString","category","appliedIndices","activeFilterIds","shouldDisableFilter","activeFilterId","activeFilter","activeFilterIndices","FunctionHelper","getCustomWidthClass","FilterButton","React.useContext","isDropdownFilter","label","setLabel","React.useState","showDropdown","setShowDropdown","setDraftState","React.useEffect","onSelectItem","onClickReset","defaultOption","onClickApply","onToggleDropdown","isShowing","FilterComponent","React.useMemo","baseClass","caretClass","customWidthClass","StateHelper","setState","callback","data","fn","getTotalActiveFilters","currentState","MoreFiltersButton","totalActiveFilters","setTotalActiveFilters","currentFilterStateKey","e","PartialTagItem","tagClass","SLIDER_ANIMATION_TIME","useWidgetKeyboard","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","isTouch","UserAgentHelper","getDynamicAttributes","dynamicWidgetState","focusableItems","item","rect","isItemVisable","getFixedAttributes","fixedWidgetState","focusNext","items","nextFocusableElement","focusPrev","prevFocusableElement","onFocusWidget","onBlurWidget","CssMeasurement","blankImage","DragHelper","event","isTouchScreen","getPositionStyling","xPosition","measurement","dragPercentage","SlidingListContainer","React.forwardRef","children","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","position","getEventListeners","listenerProps","ChevronRightSvg","WidgetButtonDirection","WidgetButton","React.memo","isLeft","arrowSvg","ChevronLeftSvg","getPositionClass","getStyle","SvgContainerSize","WidgetInteraction","useResizeListener","onResize","onResizeEnd","dependencies","resizeTimeout","onResizeModified","getResizeHandler","elementRefs","dispatch","getResizeEndHandler","getDragHandler","widgetState","widgetSnapshot","setWidgetSnapshot","mouseX","snapshot","getDragEndHandler","getMaxSlideDistance","MediaQueryStrings","initialSliderState","onInit","container","lastElement","containerRect","containerLeftPosition","containerRightPosition","firstElementPosition","lastElementPosition","leftOffsetLimit","onNext","prevState","maxSlideDistance","offset","slideDistance","onPrevious","fullSlide","currentMouseX","dragDistance","hideLeftButton","hideRightButton","DynamicWidgetReducer","DynamicWidget","WidgetItemComponent","staticChildren","getWidgetItemAnalyticsData","React.useReducer","React.useRef","useGetMediaQueryString","inView","useLazyLoad","widgetData","getWidgetItems","firstChildren","child","lastChildren","widgetItem","itemRef","isLast","WidgetHelper","Component","widgetItems","PartialDynamicWidget","getSliderAnalyticsData","hideButtons","WidgetHeader","partialLoadingOptions","PartialLoadingHelper","idx","TagWidgetItem","colorClass","TagItem","TagFilter","unappliedOptions","onClickOption","nextFilterState","getContainerClass","collection","ResetButton","currentParams","ContextService","savedParams","SearchFilters","hideHeading","isFetchingOptions","constantIndices","mainFiltersWithoutTags","tagFilter","LanguageNamespaceContext"],"mappings":"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"}