@clickview/lite 0.73.1 → 0.74.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/{7122-lite-a094f8fe17.chunk.css → 7122-lite-e0652641e4.chunk.css} +1 -1
  3. package/dist/css/{4499-lite-c43d17524f.chunk.css → 7150-lite-60d455ba66.chunk.css} +1 -1
  4. package/dist/css/{lite-app-10d57977f3.css → lite-app-98b3200025.css} +1 -1
  5. package/dist/languages/en.json +1 -1
  6. package/dist/scripts/{1362-061cd588c0-lite.chunk.js → 1362-56810ef4c8-lite.chunk.js} +3 -3
  7. package/dist/scripts/1362-56810ef4c8-lite.chunk.js.map +1 -0
  8. package/dist/scripts/{1367-12750422b0-lite.chunk.js → 1367-e0481edee3-lite.chunk.js} +2 -2
  9. package/dist/scripts/1367-e0481edee3-lite.chunk.js.map +1 -0
  10. package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js → 1735-e4cdbc46ed-lite.chunk.js} +3 -3
  11. package/dist/scripts/1735-e4cdbc46ed-lite.chunk.js.map +1 -0
  12. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js → 324-e7a99b7d52-lite.chunk.js} +2 -2
  13. package/dist/scripts/{324-6d6ee95d5d-lite.chunk.js.map → 324-e7a99b7d52-lite.chunk.js.map} +1 -1
  14. package/dist/scripts/{3252-22fac3da15-lite.chunk.js → 3252-50b5c19f19-lite.chunk.js} +1 -1
  15. package/dist/scripts/{3252-22fac3da15-lite.chunk.js.map → 3252-50b5c19f19-lite.chunk.js.map} +1 -1
  16. package/dist/scripts/3677-4904f30c6a-lite.chunk.js +2 -0
  17. package/dist/scripts/3677-4904f30c6a-lite.chunk.js.map +1 -0
  18. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js → 3781-e092f92668-lite.chunk.js} +2 -2
  19. package/dist/scripts/{3781-7a9ddc7736-lite.chunk.js.map → 3781-e092f92668-lite.chunk.js.map} +1 -1
  20. package/dist/scripts/{3823-e38a508a3c-lite.chunk.js → 3823-0dc1972eb2-lite.chunk.js} +2 -2
  21. package/dist/scripts/3823-0dc1972eb2-lite.chunk.js.map +1 -0
  22. package/dist/scripts/3915-abd9a65a08-lite.chunk.js +2 -0
  23. package/dist/scripts/3915-abd9a65a08-lite.chunk.js.map +1 -0
  24. package/dist/scripts/{3978-09fb1f250e-lite.chunk.js → 3978-a551dd2648-lite.chunk.js} +2 -2
  25. package/dist/scripts/3978-a551dd2648-lite.chunk.js.map +1 -0
  26. package/dist/scripts/{4013-d31272b42a-lite.chunk.js → 4013-6f68d7031e-lite.chunk.js} +1 -1
  27. package/dist/scripts/{4013-d31272b42a-lite.chunk.js.map → 4013-6f68d7031e-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js → 4014-3eccce2f89-lite.chunk.js} +3 -3
  29. package/dist/scripts/4014-3eccce2f89-lite.chunk.js.map +1 -0
  30. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js → 4050-ffe5b6ae6d-lite.chunk.js} +2 -2
  31. package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.map → 4050-ffe5b6ae6d-lite.chunk.js.map} +1 -1
  32. package/dist/scripts/{4061-525ef00f69-lite.chunk.js → 4061-100002abf6-lite.chunk.js} +2 -2
  33. package/dist/scripts/4061-100002abf6-lite.chunk.js.map +1 -0
  34. package/dist/scripts/4191-9a08c4b205-lite.chunk.js +2 -0
  35. package/dist/scripts/4191-9a08c4b205-lite.chunk.js.map +1 -0
  36. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js → 4358-a1bbca8249-lite.chunk.js} +1 -1
  37. package/dist/scripts/{4358-b21c24f96a-lite.chunk.js.map → 4358-a1bbca8249-lite.chunk.js.map} +1 -1
  38. package/dist/scripts/{4400-8c36fb4ab5-lite.chunk.js → 4400-755a158a52-lite.chunk.js} +2 -2
  39. package/dist/scripts/4400-755a158a52-lite.chunk.js.map +1 -0
  40. package/dist/scripts/4806-13c9302b2c-lite.chunk.js +2 -0
  41. package/dist/scripts/4806-13c9302b2c-lite.chunk.js.map +1 -0
  42. package/dist/scripts/{5135-864055ab0b-lite.chunk.js → 5135-166ec46620-lite.chunk.js} +2 -2
  43. package/dist/scripts/5135-166ec46620-lite.chunk.js.map +1 -0
  44. package/dist/scripts/{5143-286c66de2b-lite.chunk.js → 5143-d6c4a357ea-lite.chunk.js} +2 -2
  45. package/dist/scripts/5143-d6c4a357ea-lite.chunk.js.map +1 -0
  46. package/dist/scripts/{5743-a764171a6d-lite.chunk.js → 5743-14700e4f76-lite.chunk.js} +2 -2
  47. package/dist/scripts/5743-14700e4f76-lite.chunk.js.map +1 -0
  48. package/dist/scripts/{6030-5db8cc1bc4-lite.chunk.js → 6030-c2e07df714-lite.chunk.js} +2 -2
  49. package/dist/scripts/6030-c2e07df714-lite.chunk.js.map +1 -0
  50. package/dist/scripts/{618-4334f9451b-lite.chunk.js → 618-996d8b560b-lite.chunk.js} +2 -2
  51. package/dist/scripts/618-996d8b560b-lite.chunk.js.map +1 -0
  52. package/dist/scripts/{6207-f444184025-lite.chunk.js → 6207-be843186e0-lite.chunk.js} +1 -1
  53. package/dist/scripts/{6207-f444184025-lite.chunk.js.map → 6207-be843186e0-lite.chunk.js.map} +1 -1
  54. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js → 6413-caaae6a383-lite.chunk.js} +3 -3
  55. package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.map → 6413-caaae6a383-lite.chunk.js.map} +1 -1
  56. package/dist/scripts/{6646-24a34f7d99-lite.chunk.js → 6646-c5775f6553-lite.chunk.js} +3 -3
  57. package/dist/scripts/6646-c5775f6553-lite.chunk.js.map +1 -0
  58. package/dist/scripts/{6909-8a45942b63-lite.chunk.js → 6909-6805b6a0d9-lite.chunk.js} +2 -2
  59. package/dist/scripts/6909-6805b6a0d9-lite.chunk.js.map +1 -0
  60. package/dist/scripts/7064-b3bafc599f-lite.chunk.js +2 -0
  61. package/dist/scripts/7064-b3bafc599f-lite.chunk.js.map +1 -0
  62. package/dist/scripts/7122-dbf374af58-lite.chunk.js +2 -0
  63. package/dist/scripts/7122-dbf374af58-lite.chunk.js.map +1 -0
  64. package/dist/scripts/7150-93a205975c-lite.chunk.js +2 -0
  65. package/dist/scripts/7150-93a205975c-lite.chunk.js.map +1 -0
  66. package/dist/scripts/{7234-85d4acaa33-lite.chunk.js → 7234-bcddfe2112-lite.chunk.js} +2 -2
  67. package/dist/scripts/7234-bcddfe2112-lite.chunk.js.map +1 -0
  68. package/dist/scripts/{7383-690bc234f1-lite.chunk.js → 7383-02d4956304-lite.chunk.js} +2 -2
  69. package/dist/scripts/7383-02d4956304-lite.chunk.js.map +1 -0
  70. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js → 7873-0ce0523a28-lite.chunk.js} +2 -2
  71. package/dist/scripts/{7873-2e64f4eb37-lite.chunk.js.map → 7873-0ce0523a28-lite.chunk.js.map} +1 -1
  72. package/dist/scripts/{8248-050265ed2d-lite.chunk.js → 8248-41dad9bf71-lite.chunk.js} +3 -3
  73. package/dist/scripts/8248-41dad9bf71-lite.chunk.js.map +1 -0
  74. package/dist/scripts/8385-6ef08fa319-lite.chunk.js +2 -0
  75. package/dist/scripts/8385-6ef08fa319-lite.chunk.js.map +1 -0
  76. package/dist/scripts/{8451-1cb649a3f3-lite.chunk.js → 8451-0103210a8f-lite.chunk.js} +2 -2
  77. package/dist/scripts/8451-0103210a8f-lite.chunk.js.map +1 -0
  78. package/dist/scripts/8630-80f676dcda-lite.chunk.js +2 -0
  79. package/dist/scripts/8630-80f676dcda-lite.chunk.js.map +1 -0
  80. package/dist/scripts/8891-5118c47b59-lite.chunk.js +2 -0
  81. package/dist/scripts/8891-5118c47b59-lite.chunk.js.map +1 -0
  82. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js +2 -0
  83. package/dist/scripts/8982-b9e53e43ec-lite.chunk.js.map +1 -0
  84. package/dist/scripts/{9186-daf77d7174-lite.chunk.js → 9186-c1d2615458-lite.chunk.js} +2 -2
  85. package/dist/scripts/9186-c1d2615458-lite.chunk.js.map +1 -0
  86. package/dist/scripts/{9241-dbac9cb9f9-lite.chunk.js → 9241-2386134dd3-lite.chunk.js} +2 -2
  87. package/dist/scripts/9241-2386134dd3-lite.chunk.js.map +1 -0
  88. package/dist/scripts/{9345-30ccf524c5-lite.chunk.js → 9345-0a7f58bb53-lite.chunk.js} +3 -3
  89. package/dist/scripts/9345-0a7f58bb53-lite.chunk.js.map +1 -0
  90. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js +2 -0
  91. package/dist/scripts/9352-d4b2dc16a8-lite.chunk.js.map +1 -0
  92. package/dist/scripts/{9503-275c13891d-lite.chunk.js → 9503-715c46ecc1-lite.chunk.js} +2 -2
  93. package/dist/scripts/9503-715c46ecc1-lite.chunk.js.map +1 -0
  94. package/dist/scripts/9630-ca2a850260-lite.chunk.js +2 -0
  95. package/dist/scripts/9630-ca2a850260-lite.chunk.js.map +1 -0
  96. package/dist/scripts/{9767-d69fdc31b0-lite.chunk.js → 9767-1b583ceb6c-lite.chunk.js} +2 -2
  97. package/dist/scripts/9767-1b583ceb6c-lite.chunk.js.map +1 -0
  98. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js +2 -0
  99. package/dist/scripts/9894-7c119a8fe3-lite.chunk.js.map +1 -0
  100. package/dist/scripts/bundle-5b65703152.min.js +3 -0
  101. package/dist/scripts/{bundle-0075afb6af.min.js.map → bundle-5b65703152.min.js.map} +1 -1
  102. package/package.json +1 -1
  103. package/dist/scripts/1362-061cd588c0-lite.chunk.js.map +0 -1
  104. package/dist/scripts/1367-12750422b0-lite.chunk.js.map +0 -1
  105. package/dist/scripts/1735-c0f3f1238a-lite.chunk.js.map +0 -1
  106. package/dist/scripts/3677-20958f59d3-lite.chunk.js +0 -2
  107. package/dist/scripts/3677-20958f59d3-lite.chunk.js.map +0 -1
  108. package/dist/scripts/3823-e38a508a3c-lite.chunk.js.map +0 -1
  109. package/dist/scripts/3915-a1f15d687a-lite.chunk.js +0 -2
  110. package/dist/scripts/3915-a1f15d687a-lite.chunk.js.map +0 -1
  111. package/dist/scripts/3978-09fb1f250e-lite.chunk.js.map +0 -1
  112. package/dist/scripts/4014-4225ce1eb6-lite.chunk.js.map +0 -1
  113. package/dist/scripts/4061-525ef00f69-lite.chunk.js.map +0 -1
  114. package/dist/scripts/4191-7612e1713c-lite.chunk.js +0 -2
  115. package/dist/scripts/4191-7612e1713c-lite.chunk.js.map +0 -1
  116. package/dist/scripts/4400-8c36fb4ab5-lite.chunk.js.map +0 -1
  117. package/dist/scripts/4499-1365934bf2-lite.chunk.js +0 -2
  118. package/dist/scripts/4499-1365934bf2-lite.chunk.js.map +0 -1
  119. package/dist/scripts/4806-384760d9c9-lite.chunk.js +0 -2
  120. package/dist/scripts/4806-384760d9c9-lite.chunk.js.map +0 -1
  121. package/dist/scripts/5135-864055ab0b-lite.chunk.js.map +0 -1
  122. package/dist/scripts/5143-286c66de2b-lite.chunk.js.map +0 -1
  123. package/dist/scripts/5743-a764171a6d-lite.chunk.js.map +0 -1
  124. package/dist/scripts/6030-5db8cc1bc4-lite.chunk.js.map +0 -1
  125. package/dist/scripts/618-4334f9451b-lite.chunk.js.map +0 -1
  126. package/dist/scripts/6646-24a34f7d99-lite.chunk.js.map +0 -1
  127. package/dist/scripts/6909-8a45942b63-lite.chunk.js.map +0 -1
  128. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js +0 -2
  129. package/dist/scripts/7064-3ccf1b82d1-lite.chunk.js.map +0 -1
  130. package/dist/scripts/7122-352fdd3516-lite.chunk.js +0 -2
  131. package/dist/scripts/7122-352fdd3516-lite.chunk.js.map +0 -1
  132. package/dist/scripts/7234-85d4acaa33-lite.chunk.js.map +0 -1
  133. package/dist/scripts/7383-690bc234f1-lite.chunk.js.map +0 -1
  134. package/dist/scripts/8248-050265ed2d-lite.chunk.js.map +0 -1
  135. package/dist/scripts/8385-083e882d77-lite.chunk.js +0 -2
  136. package/dist/scripts/8385-083e882d77-lite.chunk.js.map +0 -1
  137. package/dist/scripts/8451-1cb649a3f3-lite.chunk.js.map +0 -1
  138. package/dist/scripts/8630-0945271ea2-lite.chunk.js +0 -2
  139. package/dist/scripts/8630-0945271ea2-lite.chunk.js.map +0 -1
  140. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js +0 -2
  141. package/dist/scripts/8891-393bb5bdaf-lite.chunk.js.map +0 -1
  142. package/dist/scripts/8982-8c21fab48a-lite.chunk.js +0 -2
  143. package/dist/scripts/8982-8c21fab48a-lite.chunk.js.map +0 -1
  144. package/dist/scripts/9186-daf77d7174-lite.chunk.js.map +0 -1
  145. package/dist/scripts/9241-dbac9cb9f9-lite.chunk.js.map +0 -1
  146. package/dist/scripts/9345-30ccf524c5-lite.chunk.js.map +0 -1
  147. package/dist/scripts/9352-04db4c533d-lite.chunk.js +0 -2
  148. package/dist/scripts/9352-04db4c533d-lite.chunk.js.map +0 -1
  149. package/dist/scripts/9503-275c13891d-lite.chunk.js.map +0 -1
  150. package/dist/scripts/9630-285237c980-lite.chunk.js +0 -2
  151. package/dist/scripts/9630-285237c980-lite.chunk.js.map +0 -1
  152. package/dist/scripts/9767-d69fdc31b0-lite.chunk.js.map +0 -1
  153. package/dist/scripts/9894-10943e41f7-lite.chunk.js +0 -2
  154. package/dist/scripts/9894-10943e41f7-lite.chunk.js.map +0 -1
  155. package/dist/scripts/bundle-0075afb6af.min.js +0 -3
  156. /package/dist/scripts/{1362-061cd588c0-lite.chunk.js.LICENSE.txt → 1362-56810ef4c8-lite.chunk.js.LICENSE.txt} +0 -0
  157. /package/dist/scripts/{1735-c0f3f1238a-lite.chunk.js.LICENSE.txt → 1735-e4cdbc46ed-lite.chunk.js.LICENSE.txt} +0 -0
  158. /package/dist/scripts/{4014-4225ce1eb6-lite.chunk.js.LICENSE.txt → 4014-3eccce2f89-lite.chunk.js.LICENSE.txt} +0 -0
  159. /package/dist/scripts/{4050-cf35c4ec45-lite.chunk.js.LICENSE.txt → 4050-ffe5b6ae6d-lite.chunk.js.LICENSE.txt} +0 -0
  160. /package/dist/scripts/{6413-c4333e80d4-lite.chunk.js.LICENSE.txt → 6413-caaae6a383-lite.chunk.js.LICENSE.txt} +0 -0
  161. /package/dist/scripts/{6646-24a34f7d99-lite.chunk.js.LICENSE.txt → 6646-c5775f6553-lite.chunk.js.LICENSE.txt} +0 -0
  162. /package/dist/scripts/{8248-050265ed2d-lite.chunk.js.LICENSE.txt → 8248-41dad9bf71-lite.chunk.js.LICENSE.txt} +0 -0
  163. /package/dist/scripts/{9345-30ccf524c5-lite.chunk.js.LICENSE.txt → 9345-0a7f58bb53-lite.chunk.js.LICENSE.txt} +0 -0
  164. /package/dist/scripts/{bundle-0075afb6af.min.js.LICENSE.txt → bundle-5b65703152.min.js.LICENSE.txt} +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7122],{23201:(e,t,n)=>{n.d(t,{A:()=>s});var a=n(32735),r=n(92802),c=n(2102),o=n(83345),l=n(33936),i="shared.formButtons";function s(e){var t=(0,r.u6)(),n=(0,l.l)(t);return a.createElement(c.m,{variant:e.variant||"primary",type:"submit",disabled:!n,size:e.size,className:e.className?e.className:"",showSpinner:t.isSubmitting},e.submitText?a.createElement(a.Fragment,null,e.submitText):a.createElement(o.x,{namespace:i,phrase:e.isNew?"create":"save"}))}},29057:(e,t,n)=>{n.d(t,{n:()=>E,W:()=>k});var a=n(32735),r=n(80247),c=n(80130),o=n(92802),l=n(91967),i=n(1048),s=n(15611),u=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function m(e){var t=e.label,n=e.checkboxLabelClassName,r=e.checkboxLabelFontWeight,o=e.className,l=u(e,["label","checkboxLabelClassName","checkboxLabelFontWeight","className"]);return a.createElement(c.Z.Group,{className:"form-group"},a.createElement("div",{className:"form-check ".concat(o||"")},a.createElement(E,Object.assign({className:"form-check-input"},l)),a.createElement(c.Z.Label,{className:"form-check-label cursor-pointer ".concat("normal"===r?"fw-normal":""," \n ").concat(n),htmlFor:l.id},t),e.checkboxAppLink&&e.checkboxAppLinkText&&a.createElement(a.Fragment,null,a.createElement("span",null," "),a.createElement(s.F,{appLink:e.checkboxAppLink,className:"info-link"},e.checkboxAppLinkText))))}var d=n(83914),p=n(83345),f=n(73814),y=n(35223);function b(e){var t=(0,o.u6)().values,n=i.t.get(t,e.fieldName);return"string"!=typeof n?a.createElement(a.Fragment,null):a.createElement("div",{className:"float-end text-secondary fw-normal"},n.length,"/",e.limit," characters")}const v={revealPassword:"jCfI0",passwordInput:"RBJnf",passwordContainer:"d78lK",passwordContainerDisabled:"asbVo",infoTooltip:"wzyOG",spinner:"CycFx"};function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var h=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n},S="shared.formField";function E(e){var t,n,c=e.children,s=e.showLoadingSpinner,u=h(e,["children","showLoadingSpinner"]),m=(t=a.useState(e.type),n=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,o,l=[],i=!0,s=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=c.call(n)).done)&&(l.push(a.value),l.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{if(!i&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw r}}return l}}(t,n)||function(e,t){if(e){if("string"==typeof e)return g(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?g(e,t):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),p=m[0],f=m[1],b=l.q.isFunction(c)?function(e){return c(e)}:a.Children.count(c)?c:null;if("password"!==u.type)return s?a.createElement("div",{className:"position-relative"},a.createElement(o.gN,Object.assign({},i.t.omit(u,["formSize"])),b),a.createElement("div",{className:v.spinner},a.createElement(r.Z,{animation:"border",size:"sm"}))):a.createElement(o.gN,Object.assign({},i.t.omit(u,["formSize"])),b);var S="position-relative ".concat(v.passwordContainer);return u.className&&(S+=" ".concat(u.className)),u.disabled&&(S+=" ".concat(v.passwordContainerDisabled)),a.createElement("div",{className:S},a.createElement(o.gN,Object.assign({},i.t.omit(u,["formSize","type","className"]),{type:p,className:"".concat(v.passwordInput," border-0 w-100 h-100 outline-none rounded")}),b),"password"===u.type&&a.createElement(d.x,{svgName:"password"===p?y.vn.VisibleOn:y.vn.VisibleOff,className:"svg-container cursor-pointer ".concat(v.revealPassword),onClick:function(){f("password"===p?"text":"password")}}))}function k(e){var t=e.label,n=e.className,r=e.showCharacterCounter,l=e.showRequiredStar,s=e.infoTooltip,u=e.infoTooltipPlacement,g=e.infoText,k=e.formSize,N=e.showOptionalLabel,O=e.formGroupClassname,w=h(e,["label","className","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname"]),x=(0,o.u6)(),T=x.errors,C=x.touched,A=function(){};if("checkbox"===w.type){var j=i.t.omit(e,["formSize","infoTooltipPlacement"]);return e.disabled&&(j.onChange=A),a.createElement(m,Object.assign({},j))}var I=Object.assign(Object.assign({},w),{className:f.w.getCustomFormControlClassName(T,C,w.name,k,n,"string"==typeof e.as?e.as:null)});return e.disabled&&(I.onChange=A),a.createElement(c.Z.Group,{className:"form-group ".concat(O)},!!t&&a.createElement(c.Z.Label,{htmlFor:w.id,className:"d-flex align-items-center"},t,l&&a.createElement("span",{className:"text-danger"},"*"),s&&a.createElement(d.x,{className:"svg-container text-secondary ".concat(v.infoTooltip),svgName:y.vn.Info,title:s,tooltipPlacement:u,tooltipSpanHack:!0}),N&&a.createElement("span",{className:"text-secondary"}," ",a.createElement(p.x,{namespace:S,phrase:"optional"})),!!r&&!!w.maxLength&&a.createElement("div",{className:"ms-auto"},a.createElement(b,{fieldName:w.name,limit:w.maxLength}))),a.createElement(E,Object.assign({},I,{"aria-errormessage":"".concat(w.name,"Error")})),!!g&&a.createElement(c.Z.Text,{className:"text-secondary"},g),a.createElement(o.Bc,{name:w.name},(function(e){return a.createElement(c.Z.Control.Feedback,{id:"".concat(w.name,"Error"),type:"invalid",role:"status"},e)})))}E.defaultProps={autoComplete:"off"},k.defaultProps={autoComplete:"off",infoTooltipPlacement:"top"}},82644:(e,t,n)=>{n.d(t,{b:()=>u,n:()=>s});var a=n(32735),r=n(92802),c=n(91967),o=n(1048);function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var i=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function s(e){var t=e.castInitialValues,n=e.castValuesOnSubmit,s=e.initialValues,u=e.onSubmit,m=i(e,["castInitialValues","castValuesOnSubmit","initialValues","onSubmit"]),d=t&&e.validationSchema?e.validationSchema.cast(function(e){if(!e)return{};var t=o.t.deepClone(e);return function e(n){Object.keys(t).forEach((function(a){t.hasOwnProperty(a)&&(o.t.isObject(n[a])?e(n[a]):null===t[a]&&delete t[a])}))}(t),t}(s)):s,p={allowInitialSubmit:e.allowInitialSubmit};return a.createElement(r.J9,Object.assign({enableReinitialize:!0},m,{initialValues:d,onSubmit:function(t,a){var r=a.setSubmitting,c=a.resetForm,o=a.setFieldError,i=n&&e.validationSchema?e.validationSchema.cast(t):t;u(i,(function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(n.reset&&c(),n.errors)for(var a=0,i=Object.entries(n.errors);a<i.length;a++){var s=(e=i[a],t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,c,o,l=[],i=!0,s=!1;try{if(c=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;i=!1}else for(;!(i=(a=c.call(n)).done)&&(l.push(a.value),l.length!==t);i=!0);}catch(e){s=!0,r=e}finally{try{if(!i&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(s)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return l(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?l(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=s[0],m=s[1];o(u,m)}r(!1)}))},initialStatus:p}),c.q.isFunction(e.children)?function(t){return e.children(t)}:a.Children.count(e.children)?e.children:null)}function u(){return(0,r.u6)()}s.defaultProps={castInitialValues:!0,castValuesOnSubmit:!0}},38502:(e,t,n)=>{n.d(t,{r:()=>m});var a=n(32735),r=n(49985),c=n(15611),o=n(18559),l=n(11607),i=n(83914),s=n(22771);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(i.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(o.C,{type:o.g.Count,data:e.tab.count})))}function m(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(s.Z.pillTabSelector,"\n ").concat(e.borderRadius?s.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(s.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?s.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(c.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(l.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(s.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},31647:(e,t,n)=>{n.d(t,{E:()=>l});var a=n(32735),r=n(23481),c=n(38502),o="rostering.settingHeader";function l(e){var t,n,l=[{name:r.T.getPhrase(o,"syncJobs"),appLink:null===(t=e.appLinks)||void 0===t?void 0:t.syncJobs,active:"syncJobs"===e.active},{name:r.T.getPhrase(o,"settings"),appLink:null===(n=e.appLinks)||void 0===n?void 0:n.settings,active:"settings"===e.active}];return a.createElement("div",null,a.createElement(c.r,{tabs:l}))}},18549:(e,t,n)=>{n.d(t,{G:()=>i});var a=n(32735),r=n(23481),c=n(36532);const o={rightButton:"GcqRT"};var l=r.T.encloseNamespace("rostering.syncActionButtonGroup");function i(e){return a.createElement("div",{className:"btn-group px-2",role:"group"},a.createElement(c.u,{title:l("syncNowTooltip"),spanHack:!0,placement:"left",spanHackClassName:o.buttonBorder},a.createElement("button",{type:"button",className:"btn btn-outline-dark ".concat(o.leftButton),onClick:null==e?void 0:e.onSyncNow},l("syncNow"))))}},62394:(e,t,n)=>{n.d(t,{y:()=>o});var a=n(75896),r=n(110),c=new Date,o={parseUTCToLocal:function(e){var t=e.utcHour,n=e.utcWeekdays,c=e.utcMinute,o=void 0===c?0:c,l=n.map((function(e){return r.O.buildLocalDateFromUTC(e,t,o)})),i=l.map((function(e){return e.getDay()}));return{hour:+r.O.format(a.m.first(l),"HH"),daysOfWeek:i,minute:o}},getScheduledJobBySetting:function(e){var t;if(!e||!e.fullSyncSchedule||!e.fullSyncSchedule.enabled)return null;var n=o.parseUTCToLocal({utcHour:e.fullSyncSchedule.hour,utcWeekdays:e.fullSyncSchedule.daysOfWeek,utcMinute:e.fullSyncSchedule.minute}),a=new Date,r=c.getDay(),l=n.daysOfWeek.sort((function(e,t){return e-t})),i=n.daysOfWeek.includes(r),s=n.hour,u=null!==(t=null==n?void 0:n.minute)&&void 0!==t?t:0;if(i&&(a.setHours(s,u,0,0),c<a))return a;var m=new Date,d=l.find((function(e){return e>r}));d||(d=l[0]);var p=Math.abs(d-r);return m.setDate(c.getDate()+p),m.setHours(s,0,0,0),m}}},44538:(e,t,n)=>{n.d(t,{K:()=>l});var a=n(99940),r=n(97395),c=n(58739),o=n(38389),l={getRostering:function(){return{url:"{gateway}/v1/users/me/rostering",key:"rostering"}},getSyncList:function(e){var t={};if(e.cursor&&(t.cursor=e.cursor),e.sort&&("oldest"===e.sort?t.order="ASC":t.order="DESC"),e.jobStatus){var n=[];e.jobStatus.includes("completed")&&n.push.apply(n,[c.K.Completed,c.K.CompletedWithError]),e.jobStatus.includes("failed")&&n.push(c.K.Failed),e.jobStatus.includes("inProgress")&&n.push.apply(n,[c.K.Submitted,c.K.Queued,c.K.Pending,c.K.InProgress]),t.status=n}return t.type=o.m.Rostering,{url:r._.urlBuilder("{gateway}/v1/batch/jobs",t),key:"rostering:sync:".concat(e.cursor,":").concat(e.sort,":").concat(e.jobStatus)}},createJob:function(e,t,n){return{url:"{gateway}/v1/batch/jobs",key:"rostering:sync",type:a.k.POST,invalidationKeys:["rostering:sync"],data:e,success:t,error:n}},getJobSummary:function(e){return{url:"{gateway}/v1/batch/jobs/".concat(e,"/summary"),key:"job:summary:".concat(e)}},getSyncScheduleSettings:function(e){return{url:"{gateway}/v1/rostering/".concat(e,"/schedule"),key:"sync-settings:".concat(e)}},updateScheduleSetting:function(e,t,n,r,c){return{type:a.k.PUT,url:"{gateway}/v1/rostering/".concat(t,"/schedule"),key:"update:sync-settings:".concat(e.customerId,":").concat(t),invalidationKeys:["sync-settings:".concat(t)],data:e,success:n,error:r,always:c}}}},73814:(e,t,n)=>{n.d(t,{w:()=>r});var a=n(92802),r={getCustomFormControlClassName:function(e,t,n,r,c,o){var l="";return l=function(e,t){var n="";return n="select"===e?"form-select":"form-control","sm"===t&&(n+=" ".concat(n,"-sm")),"lg"===t&&(n+=" ".concat(n,"-lg")),n}(o,r),(0,a.u9)(t,n)&&(0,a.u9)(e,n)&&(l+=" is-invalid"),c&&(l+=" ".concat(c)),l}}},81803:(e,t,n)=>{n.d(t,{d:()=>f});var a=n(32735),r=n(81886),c=n(23481),o=n(49935),l=n(22902),i=n(14070),s=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var d="settings.settingsLayout",p=function(e){var t=(0,l.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var a=r.Q.C$.getCurrentAppLink();return a.application!==s.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===a.action}))}))};function f(e){var t,n=p(e.requiredPermissions);if(a.useEffect((function(){n||r.Q.C$.trigger({application:s.O.SETTINGS,action:i.e.Settings.HOME},{replace:!0})}),[n]),!n)return a.createElement(a.Fragment,null);var l,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:s.O.SETTINGS,action:i.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"d-flex align-items-center justify-content-between"},a.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),a.createElement("div",{className:"pb-3"},a.createElement(o.Oo,{breadcrumbs:[{name:c.T.getPhrase(d,"settingsBreadcrumb"),appLink:{application:s.O.SETTINGS,action:i.e.Settings.HOME}}].concat((l=u,function(e){if(Array.isArray(e))return m(e)}(l)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(l)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&a.createElement(a.Fragment,null,a.createElement("p",null,e.description),a.createElement("hr",null)),e.children)}},52834:(e,t,n)=>{n.d(t,{y:()=>u});var a=n(32735),r=n(97958),c=n(98461),o=n(83345),l=n(12778),i=n(99742),s="rostering.requiresSetUp";function u(){return a.createElement(r.u,null,a.createElement(r.u.Image,{src:i.W.EmptyStates.Rostering.REQUIRES_SET_UP}),a.createElement(r.u.Heading,null,a.createElement(o.x,{namespace:s,phrase:"emptyHeading"})),a.createElement(r.u.Info,{className:"w-50 mb-3"},a.createElement(o.x,{namespace:s,phrase:"emptyInfo"})),a.createElement(c.d,{className:"btn btn-dark",href:l.o.getSupportRequestUrl(),newTab:!0},a.createElement(o.x,{namespace:s,phrase:"button"})))}},67122:(e,t,n)=>{n.r(t),n.d(t,{RosteringSyncSettingsView:()=>z});var a=n(32735),r=n(80247),c=n(23481),o=n(20354),l=n(31647),i=n(5173),s=n(75896),u=n(110),m=n(82644),d=n(92802),p=n(28400),f=n(23201),y=n(29057),b=n(83345);const v={select:"eHERO",sourceLabel:"P7yI8",source:"dsINO",logoWrapper:"kPI9A",wrapper:"PYTsc",weekdaysPicker:"W8qyy"};function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var h="rostering.settings.schedule",S=c.T.encloseNamespace(h),E=new Array(24).fill(0).map((function(e,t){return t})),k=["daily","weekly"],N=[1,2,3,4,5,6,0],O=new Date,w=(new Date).getTimezoneOffset()/60;function x(e){if(0===e)return"12:00 AM";var t=12===e?12:e%12;return e/12<1?t<10?"0".concat(t,":00 AM"):"".concat(t,":00 AM"):t<10?"0".concat(t,":00 PM"):"".concat(t,":00 PM")}function T(e){return u.O.format(u.O.weekday(O,e),"ddd")}function C(){var e,t=(0,d.u6)();return a.createElement(d.l0,null,a.createElement("div",null,a.createElement("p",null,a.createElement(b.x,{namespace:h,phrase:"info"})),a.createElement("div",{className:"row"}),a.createElement("div",{className:"row align-items-center"},a.createElement("p",{className:"col col-3"},S("start")),a.createElement("div",{className:"col"},a.createElement("div",{className:"d-flex align-items-center flex-gap"},a.createElement(y.W,{className:"".concat(v.select," me-2"),id:"start",name:"startAt",as:"select",value:null!==(e=t.values.startAt)&&void 0!==e?e:2},E.map((function(e){return a.createElement("option",{className:"text-dark",value:e,key:e},x(e))}))),a.createElement("p",null,"(EST UTC","".concat(w),") ",Intl.DateTimeFormat().resolvedOptions().timeZone.replace("/"," - "))))),a.createElement("div",{className:"row align-items-center"},a.createElement("p",{className:"col col-3"},S("repeat")),a.createElement("div",{className:"col ".concat(v.wrapper," position-relative")},a.createElement(y.W,{className:"".concat(v.select," d-inline-block"),id:"repeat",name:"repeat",as:"select",value:t.values.repeat},k.map((function(e){return a.createElement("option",{className:"text-dark",value:e,key:e},p.m.toTitleCase(e))}))),"weekly"===t.values.repeat&&a.createElement("div",{className:"d-flex align-items-center position-absolute ".concat(v.weekdaysPicker)},a.createElement("span",{className:"ms-2 me-3"},S("on")),a.createElement("div",{className:"btn-group mb-1"},N.map((function(e){return a.createElement("button",{key:e,className:(n=e,r="btn border",t.values.daysOfWeek.includes(n)?r+=" btn-dark":r+=" btn-outline-dark",r),onClick:function(n){!function(e,n){e.preventDefault();var a,r=t.values.daysOfWeek.includes(n)?t.values.daysOfWeek.filter((function(e){return e!==n})):[].concat(function(e){if(Array.isArray(e))return g(e)}(a=t.values.daysOfWeek)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(a)||function(e,t){if(e){if("string"==typeof e)return g(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?g(e,t):void 0}}(a)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),[n]);0!==r.length&&t.setFieldValue("daysOfWeek",r)}(n,e)},type:"button"},T(e).charAt(0));var n,r}))))))),a.createElement("div",{className:"rounded p-2 bg-light-blue text-info fw-semibold mb-3"},function(e){switch(e.repeat){case"daily":return S("summary",{time:x(e.startAt),repeat:e.repeat});case"weekly":var t,n=N.filter((function(t){return e.daysOfWeek.includes(t)})).map((function(e){return T(e)}));return t=n.length>=2?n.slice(0,n.length-1).join(", ")+", and "+n[n.length-1]:n.join(", "),S("weeklySummary",{weekdays:t,time:x(e.startAt),repeat:e.repeat})}}(t.values)),a.createElement(f.A,{isNew:!1,variant:"outline-dark"}))}var A=n(62394),j="rostering.settings.schedule",I=i.Ry().shape({daysOfWeek:i.IX().min(1),startAt:i.Rx().min(0).max(23).required(),repeat:i.nK().oneOf(["daily","weekly"]).default("daily")});function L(e){return a.createElement("div",{className:"py-3 border-bottom w-100"},a.createElement("h2",{className:"h4"},a.createElement(b.x,{namespace:j,phrase:"heading"})),a.createElement(m.n,{initialValues:(t=e.settings.fullSyncSchedule,n=A.y.parseUTCToLocal({utcHour:t.hour,utcWeekdays:t.daysOfWeek,utcMinute:t.minute}),{startAt:n.hour,daysOfWeek:n.daysOfWeek,repeat:7===t.daysOfWeek.length?"daily":"weekly"}),onSubmit:function(t,n){e.onSave(function(e,t){var n=function(e){var t=e.hour,n=e.minute,a=e.weekdays.map((function(e){return u.O.buildUTCDate(e,t,n)}));return{hour:+u.O.format(s.m.first(a),"HH"),daysOfWeek:a.map((function(e){return e.getDay()})),minute:+u.O.format(s.m.first(a),"mm")}}({hour:e.startAt,weekdays:e.daysOfWeek,minute:0});return{fullSyncSchedule:{daysOfWeek:"daily"===e.repeat?[0,1,2,3,4,5,6]:n.daysOfWeek,hour:n.hour,minute:n.minute,enabled:t.enabled}}}(t,e.settings.fullSyncSchedule),n)},validationSchema:I},a.createElement(C,null)));var t,n}var P=n(18549),W=n(16714),F=n(44538),R=n(31949),D=n(69883),H=n(79612),G=n(14070),B=n(97291),M=n(81803),Z=n(52834),K=n(56736);const U={settings:"K6Qs1",spinner:"PDZWp"};var V=c.T.encloseNamespace("rostering.rosteringSyncSettings");function z(){var e,t,n,c=o.a.useBasicFetch(R.N.currentUser()),i=o.a.useBasicFetch(F.K.getRostering()),s=o.a.useBasicFetch((null===(e=i.data)||void 0===e?void 0:e.id)&&F.K.getSyncScheduleSettings(i.data.id)),u=o.a.useGetFetch(),m=(0,D.Z)();(0,H.M)({title:V("pageTitle")});var d=(0,K.B)(c.data),p=d.syncNow,f=d.fullSync;return a.createElement(M.d,{heading:V("heading"),breadcrumbs:[V("breadcrumb")],headingButton:function(){var e;return"Active"!==(null===(e=i.data)||void 0===e?void 0:e.status)?a.createElement(a.Fragment,null):a.createElement(P.G,{onSyncNow:p,onFullSync:f})},requiredPermissions:W.C.Rostering},"Active"===(null===(t=i.data)||void 0===t?void 0:t.status)&&a.createElement(l.E,{active:"settings",appLinks:{syncJobs:{application:B.O.SETTINGS,action:G.e.Settings.ROSTERING},settings:{application:B.O.SETTINGS,action:G.e.Settings.ROSTERING_SETTINGS}}}),"Active"!==(null===(n=i.data)||void 0===n?void 0:n.status)?a.createElement(Z.y,null):a.createElement("div",{className:"d-flex flex-column align-items-center justify-content-center ".concat(U.settings)},s.data?a.createElement(a.Fragment,null,a.createElement(L,{onSave:function(e,t){var n=Object.assign(Object.assign({},e),{userId:c.data.id,customerId:c.data.customerId});u(F.K.updateScheduleSetting(n,i.data.id,(function(){return m.success(V("success"))}),(function(){return m.error(V("error"))}),(function(){return null==t?void 0:t()})))},settings:s.data})):a.createElement("div",{className:U.spinner},a.createElement(r.Z,{as:"div",animation:"border",role:"status"}))))}},56736:(e,t,n)=>{n.d(t,{B:()=>p});var a=n(60139),r=n(23481),c=n(20354),o=n(67651),l=n(72081),i=n(38389),s=n(4594),u=n(44538),m=n(69883),d=r.T.encloseNamespace("rostering.syncUtils"),p=function(e){var t=c.a.useGetFetchAsync(),n=(0,m.Z)();return e?{fullSync:function(){},syncNow:function(){var r={type:a.NK.Success,heading:d("startSyncAlertHeading"),message:d("startSyncAlertBody"),appLinkText:d("startSyncAlertAppLinkText"),appLinkClassName:"info-link"},c={name:l.g.Rostering,type:i.m.Rostering,metadata:{targetMasterId:e.customerId,targetMasterType:s.E.Customer},customerId:e.customerId,dataType:o.B.Learner};t(u.K.createJob(c,(function(){n.success(r)}),(function(){n.error(d("error"))})))}}:{syncNow:function(){},fullSync:function(){}}}},22771:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
2
- //# sourceMappingURL=7122-352fdd3516-lite.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7122-352fdd3516-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/forms/form-buttons/FormButtons.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-header/RosteringSettingHeader.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/sync-action-button-group.scss","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/SyncActionButtonGroup.tsx","file:///app/packages/libs/shared/src/components/rostering/utils/RosteringHelper.ts","file:///app/packages/libs/shared/src/flight-requests/RosteringRequests.ts","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/schedule-setting.scss","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleForm.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleSetting.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/rostering-sync-settings.scss","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/RosteringSyncSettingsView.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/utils/useSyncRostering.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\n\nconst namespace = 'shared.formButtons';\n\ninterface FormButtonsProps {\n isNew?: boolean;\n submitText?: string;\n variant?: ButtonProps['variant'];\n size?: FormSize;\n className?: string;\n}\n\nexport function FormButtons<Values extends HashObject>(props: FormButtonsProps): JSX.Element {\n const formikProps = useFormikContext<Values>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n return (\n <SpinnerButton\n variant={props.variant || 'primary'}\n type='submit'\n disabled={!canSubmit}\n size={props.size}\n className={props.className ? props.className : ''}\n showSpinner={formikProps.isSubmitting}\n >\n {props.submitText\n ? <>{props.submitText}</>\n : <Text namespace={namespace} phrase={props.isNew ? 'create' : 'save'} />}\n </SpinnerButton>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span>&nbsp;</span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = ObjectHelper.get(values, props.fieldName as string);\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n formGroupClassname?: string;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n formGroupClassname,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className={`form-group ${formGroupClassname}`}>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'>&nbsp;<Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} aria-errormessage={`${fieldProps.name}Error`} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback id={`${fieldProps.name}Error`} type='invalid' role='status'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nconst namespace = 'rostering.settingHeader';\n\nexport interface RosteringSettingHeaderAppLinks {\n syncJobs: Core.AppLink;\n settings: Core.AppLink;\n}\n\ninterface RosteringSettingHeaderProps {\n appLinks?: RosteringSettingHeaderAppLinks;\n active: keyof RosteringSettingHeaderAppLinks;\n}\n\nexport function RosteringSettingHeader(props: RosteringSettingHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'syncJobs'),\n appLink: props.appLinks?.syncJobs,\n active: props.active === 'syncJobs'\n \n }, {\n name: LanguageService.getPhrase(namespace, 'settings'),\n appLink: props.appLinks?.settings,\n active: props.active === 'settings'\n \n }];\n\n return (\n <div>\n <PillTabSelector tabs={tabs} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"rightButton\":\"GcqRT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport styles from './sync-action-button-group.scss';\n\nconst namespace = 'rostering.syncActionButtonGroup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncActionButtonGroupProps {\n onSyncNow?: () => void;\n onFullSync?: () => void;\n}\n\nexport function SyncActionButtonGroup(props: SyncActionButtonGroupProps): JSX.Element {\n return (\n <div className='btn-group px-2' role='group'>\n <Tooltip title={getPhrase('syncNowTooltip')} spanHack placement='left' spanHackClassName={styles.buttonBorder}>\n <button type='button' className={`btn btn-outline-dark ${styles.leftButton}`} onClick={props?.onSyncNow}>{getPhrase('syncNow')}</button>\n </Tooltip>\n {/* todo hide the dropdown for v1 */}\n {/* <button type='button' className={`btn dropdown-toggle btn-outline-dark ${styles.rightButton}`} data-bs-toggle='dropdown'>\n </button>\n <div className='dropdown-menu'>\n <Tooltip title={getPhrase('fullSyncTooltip')} spanHack placement='left' >\n <div className='dropdown-item cursor-pointer' onClick={props?.onFullSync}>{getPhrase('fullSync')}</div>\n </Tooltip>\n </div> */}\n </div>\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst now = new Date();\n\nexport const RosteringHelper = {\n parseUTCToLocal(\n {\n utcHour,\n utcWeekdays,\n utcMinute = 0\n }: {\n utcHour: number,\n utcWeekdays: number[],\n utcMinute: number\n }\n ) {\n const local = utcWeekdays.map(weekday => DateHelper.buildLocalDateFromUTC(weekday, utcHour, utcMinute));\n\n const localWeekdays = local.map(w => w.getDay());\n const localHour = DateHelper.format(ArrayHelper.first(local), 'HH');\n return { hour: +localHour, daysOfWeek: localWeekdays, minute: utcMinute };\n },\n\n // calculating next scheduled job by schedule setting\n getScheduledJobBySetting (setting: ScheduleSettingResponse): Date | null {\n if (!setting || !setting.fullSyncSchedule || !setting.fullSyncSchedule.enabled)\n return null;\n\n const schedule = RosteringHelper.parseUTCToLocal({\n utcHour: setting.fullSyncSchedule.hour,\n utcWeekdays: setting.fullSyncSchedule.daysOfWeek,\n utcMinute: setting.fullSyncSchedule.minute\n });\n const scheduledDate = new Date();\n const weekdayOfToday = now.getDay();\n\n const scheduledWeekday = schedule.daysOfWeek.sort((a, b) => a - b);\n const scheduledToday = schedule.daysOfWeek.includes(weekdayOfToday);\n const hour = schedule.hour;\n const minute = schedule?.minute ?? 0;\n\n if (scheduledToday) {\n scheduledDate.setHours(hour, minute, 0, 0);\n if (now < scheduledDate) {\n return scheduledDate;\n }\n }\n\n const nextScheduledDate = new Date();\n let nextScheduledWeekday = scheduledWeekday.find(d => d > weekdayOfToday);\n if (!nextScheduledWeekday) {\n // cannot find next scheduled date in the current week, must be next week\n nextScheduledWeekday = scheduledWeekday[0];\n }\n // use absolute value of gap to make sure next scheduled date is in the futrue\n const gap = Math.abs(nextScheduledWeekday - weekdayOfToday);\n nextScheduledDate.setDate(now.getDate() + gap);\n nextScheduledDate.setHours(hour, 0, 0, 0);\n return nextScheduledDate;\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { BatchJob, ScheduleSettingRequest } from 'libs/shared/interfaces';\nimport { CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const RosteringRequests = {\n getRostering(): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/rostering`,\n key: `rostering`\n };\n },\n\n getSyncList(queryParams: BulkJobsQueryParams): Flight.Request {\n const params: HashObject = {};\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.jobStatus) {\n const statuses = [];\n if (queryParams.jobStatus.includes('completed')) {\n statuses.push(...[ BatchJobStatus.Completed, BatchJobStatus.CompletedWithError ]);\n }\n if (queryParams.jobStatus.includes('failed')) {\n statuses.push(BatchJobStatus.Failed);\n }\n if (queryParams.jobStatus.includes('inProgress')) {\n statuses.push(...[\n BatchJobStatus.Submitted,\n BatchJobStatus.Queued,\n BatchJobStatus.Pending,\n BatchJobStatus.InProgress ]);\n }\n params.status = statuses;\n }\n\n params.type = BatchJobType.Rostering;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `rostering:sync:${queryParams.cursor}:${queryParams.sort}:${queryParams.jobStatus}`\n };\n },\n\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'rostering:sync',\n type: HttpVerbs.POST,\n invalidationKeys: ['rostering:sync'],\n data,\n success,\n error\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n },\n\n getSyncScheduleSettings(integrationId: string): Flight.SimulatedRequest {\n return {\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `sync-settings:${integrationId}`\n };\n },\n\n updateScheduleSetting(\n data: ScheduleSettingRequest,\n integrationId: string,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n type: HttpVerbs.PUT,\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `update:sync-settings:${data.customerId}:${integrationId}`,\n invalidationKeys: [`sync-settings:${integrationId}`],\n data,\n success,\n error,\n always\n };\n }\n};","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.requiresSetUp';\n\nexport function RequiresSetUpEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.REQUIRES_SET_UP} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-3'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n \n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n \n <ExternalLink\n className='btn btn-dark'\n href={ArticleHelper.getSupportRequestUrl()}\n newTab\n >\n <Text namespace={namespace} phrase='button'/>\n </ExternalLink>\n \n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"select\":\"eHERO\",\"sourceLabel\":\"P7yI8\",\"source\":\"dsINO\",\"logoWrapper\":\"kPI9A\",\"wrapper\":\"PYTsc\",\"weekdaysPicker\":\"W8qyy\"};","import React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { IScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './schedule-setting.scss';\n\nconst namespace = 'rostering.settings.schedule';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// constant to build dropdown\nconst TIMES = new Array(24).fill(0).map((_, i) => i);\nconst REPEATS = [ 'daily', 'weekly' ];\nconst WEEK_DAYS = [ 1, 2, 3, 4, 5, 6, 0 ];\nconst date = new Date();\nconst offsetHours = new Date().getTimezoneOffset() / 60;\n\nfunction formatTime (number: number) {\n if (number === 0)\n return '12:00 AM';\n\n const isAm = number / 12 < 1;\n const time = number === 12 ? 12 : number % 12;\n\n if (isAm)\n return time < 10 ? `0${time}:00 AM` : `${time}:00 AM`;\n \n\n return time < 10 ? `0${time}:00 PM` : `${time}:00 PM`;\n}\n\nfunction parseWeekdayNumber(w: number): string {\n return DateHelper.format(DateHelper.weekday(date, w), 'ddd');\n}\n\nfunction getAlertContent(values: IScheduleSetting): string {\n switch (values.repeat) {\n case 'daily':\n return getPhrase('summary', { time: formatTime(values.startAt), repeat: values.repeat });\n case 'weekly':\n const sortedWeekDays = WEEK_DAYS.filter(v => values.daysOfWeek.includes(v)).map(w => parseWeekdayNumber(w));\n\n let str = '';\n if (sortedWeekDays.length >= 2) {\n const firstPart = sortedWeekDays.slice(0, sortedWeekDays.length - 1).join(', ');\n const lastPart = 'and ' + sortedWeekDays[sortedWeekDays.length - 1];\n str = firstPart + ', ' + lastPart;\n } else {\n str = sortedWeekDays.join(', ');\n }\n\n return getPhrase('weeklySummary', {\n weekdays: str,\n time: formatTime(values.startAt),\n repeat: values.repeat\n });\n }\n}\n\nexport function ScheduleForm(): JSX.Element {\n const formikProps = useFormikContext<IScheduleSetting>();\n\n function getButtonClassName(day: number): string {\n let className = 'btn border';\n\n if (formikProps.values.daysOfWeek.includes(day))\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n return className;\n }\n\n function onClick(e: React.MouseEvent, day: number): void {\n e.preventDefault();\n\n const nextValue = formikProps.values.daysOfWeek.includes(day)\n ? formikProps.values.daysOfWeek.filter(v => v !== day)\n : [ ...formikProps.values.daysOfWeek, day ];\n // don't allow an empty array, user have to select at least one weekday\n if (nextValue.length === 0) return;\n\n formikProps.setFieldValue('daysOfWeek', nextValue);\n }\n\n return (\n <Form>\n <div>\n <p><Text namespace={namespace} phrase='info' /></p>\n\n <div className='row'>\n {/* todo waiting for decision if we going to keep it since we only support single source */}\n {/* <p className={`col col-3 ${styles.sourceLabel}`}>{getPhrase('from')}</p>\n <div className={`col d-flex align-items-center ${styles.source}`}>\n <div className={`${styles.logoWrapper} bg-white rounded-circle border d-flex align-items-center justify-content-center me-2`}>\n <img src='https://img.clickviewapp.com/v2/logos/LqlKgd'/>\n </div> \n <p className='fw-semibold mb-0'>Clever</p>\n </div>*/}\n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('start')}</p>\n <div className='col'>\n <div className='d-flex align-items-center flex-gap'>\n <FormField\n className={`${styles.select} me-2`}\n id='start'\n name='startAt'\n as='select'\n value={formikProps.values.startAt ?? 2}\n >\n {TIMES.map(i => <option className='text-dark' value={i} key={i}>{formatTime(i)}</option>)}\n </FormField>\n {/* display current timezone based on browser */}\n <p>(EST UTC{`${offsetHours}`}) {Intl.DateTimeFormat().resolvedOptions().timeZone.replace('/', ' - ')}</p>\n </div>\n </div>\n \n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('repeat')}</p>\n <div className={`col ${styles.wrapper} position-relative`}>\n <FormField\n className={`${styles.select} d-inline-block`}\n id='repeat'\n name='repeat'\n as='select'\n value={formikProps.values.repeat}\n >\n {REPEATS.map(i => <option className='text-dark' value={i} key={i}>{TextHelper.toTitleCase(i)}</option>)}\n </FormField>\n\n {formikProps.values.repeat === 'weekly' && (\n <div className={`d-flex align-items-center position-absolute ${styles.weekdaysPicker}`}>\n <span className='ms-2 me-3'>{getPhrase('on')}</span>\n <div className='btn-group mb-1'>\n {WEEK_DAYS.map(option => {\n return (\n <button\n key={option}\n className={getButtonClassName(option)}\n onClick={e => {\n onClick(e, option);\n }}\n type='button'\n >\n {parseWeekdayNumber(option).charAt(0)}\n </button>\n );\n })}\n </div>\n </div>)}\n </div>\n </div>\n </div>\n\n <div className='rounded p-2 bg-light-blue text-info fw-semibold mb-3'>\n {getAlertContent(formikProps.values)}\n </div>\n\n <FormButtons<IScheduleSetting>\n isNew={false}\n variant='outline-dark'\n />\n </Form>\n\n );\n}","import React from 'react';\nimport * as Yup from 'yup';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ScheduleForm } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleForm';\nimport { RosteringHelper } from 'libs/shared/components/rostering/utils/RosteringHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FullRosterSyncSchedule, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.settings.schedule';\n\ninterface ScheduleSettingProps {\n onSave: (val: Partial<ScheduleSettingRequest>, onDone?: () => void) => any;\n settings: ScheduleSettingResponse;\n}\n\nconst ScheduleSchema = Yup.object().shape<IScheduleSetting>({\n daysOfWeek: Yup.array<number>().min(1),\n startAt: Yup.number().min(0).max(23).required(),\n repeat: Yup.mixed<'daily' | 'weekly'>().oneOf([ 'daily', 'weekly' ]).default('daily')\n});\n\nexport interface IScheduleSetting {\n startAt: number;\n repeat: 'daily' | 'weekly';\n daysOfWeek: number[];\n}\n\nfunction parseLocalToUTC(\n {\n hour,\n weekdays,\n minute\n }: {\n hour: number,\n weekdays: number[],\n minute: number\n}\n): Omit<FullRosterSyncSchedule, 'enabled'> {\n const utc = weekdays.map(weekday => DateHelper.buildUTCDate(weekday, hour, minute));\n const utcHour = DateHelper.format(ArrayHelper.first(utc), 'HH');\n const utcWeekday = utc.map(w => w.getDay());\n const utcMinute = DateHelper.format(ArrayHelper.first(utc), 'mm');\n\n return { hour: +utcHour, daysOfWeek: utcWeekday, minute: +utcMinute };\n}\n\nfunction parseValueToForm(schedule: FullRosterSyncSchedule): IScheduleSetting {\n const { hour, daysOfWeek } = RosteringHelper.parseUTCToLocal({\n utcHour: schedule.hour,\n utcWeekdays: schedule.daysOfWeek,\n utcMinute: schedule.minute\n });\n\n return {\n startAt: hour,\n daysOfWeek: daysOfWeek,\n repeat: schedule.daysOfWeek.length === 7 ? 'daily' : 'weekly'\n };\n}\n\nfunction parseFormToPayload(val: IScheduleSetting, schedule: FullRosterSyncSchedule): Omit<ScheduleSettingRequest, 'userId'|'customerId'> {\n const utc = parseLocalToUTC({ hour: val.startAt, weekdays: val.daysOfWeek, minute: 0 });\n\n return {\n fullSyncSchedule: {\n daysOfWeek: val.repeat === 'daily' ? [ 0, 1, 2, 3, 4, 5, 6 ] : utc.daysOfWeek,\n hour: utc.hour,\n minute: utc.minute,\n enabled: schedule.enabled\n }\n };\n}\n\nexport function ScheduleSetting(props: ScheduleSettingProps): JSX.Element {\n function onSave(val: IScheduleSetting, onDone: () => void) {\n props.onSave(parseFormToPayload(val, props.settings.fullSyncSchedule), onDone);\n }\n return (\n <div className='py-3 border-bottom w-100'>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n\n <FormWrapper<IScheduleSetting>\n initialValues={parseValueToForm(props.settings.fullSyncSchedule)}\n onSubmit={onSave}\n validationSchema={ScheduleSchema}\n >\n <ScheduleForm />\n </FormWrapper>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"settings\":\"K6Qs1\",\"spinner\":\"PDZWp\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { RosteringSettingHeader } from 'libs/shared/components/rostering/rostering-header/RosteringSettingHeader';\nimport { ScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { SyncActionButtonGroup } from 'libs/shared/components/rostering/sync-action-button-group/SyncActionButtonGroup';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, RosteringResponse, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { RequiresSetUpEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState';\nimport { useSyncRostering } from 'apps/settings/views/rostering/utils/useSyncRostering';\n\nimport styles from './rostering-sync-settings.scss';\n\nconst namespace = 'rostering.rosteringSyncSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function RosteringSyncSettingsView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const settings = Flight.useBasicFetch<ScheduleSettingResponse>(rostering.data?.id &&\n RosteringRequests.getSyncScheduleSettings(rostering.data.id));\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n function onSave(val: Omit<ScheduleSettingRequest, 'userId'|'customerId'>, onDone?: () => void) {\n const payload = { ...val, userId: currentUser.data.id, customerId: currentUser.data.customerId };\n\n fetch(\n RosteringRequests.updateScheduleSetting(\n payload,\n rostering.data.id,\n () => alerts.success(getPhrase('success')),\n () => alerts.error(getPhrase('error')),\n () => onDone?.()\n )\n );\n }\n\n const { syncNow, fullSync } = useSyncRostering(currentUser.data);\n\n function renderButton() {\n if (rostering.data?.status !== 'Active')\n return <></>;\n return <SyncActionButtonGroup onSyncNow={syncNow} onFullSync={fullSync}/>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n headingButton={renderButton}\n requiredPermissions={PermissionName.Rostering}\n >\n \n {rostering.data?.status === 'Active' && (\n <RosteringSettingHeader\n active='settings'\n appLinks={{\n syncJobs: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING },\n settings: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING_SETTINGS }\n }}\n />\n )}\n {rostering.data?.status !== 'Active' ? (\n <RequiresSetUpEmptyState />\n ) : (\n <div className={`d-flex flex-column align-items-center justify-content-center ${styles.settings}`}>\n {settings.data ? (\n <>\n <ScheduleSetting onSave={onSave} settings={settings.data}/>\n \n {/* todo uncomment these form when backend supports */}\n {/* <CheckUpdatesSetting onSave={onSave}/>\n <ClassroomCreationSetting onSave={onSave}/>\n <EmailNotificationSetting onSave={onSave}/> */}\n </>\n ) : (\n <div className={styles.spinner}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </div>\n )}\n \n\n </SettingsLayout>\n );\n}","import { AlertType, BaseAlert } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.syncUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useSyncRostering = (currentUser: CurrentUser) => {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n if (!currentUser) {\n return { syncNow: () => {}, fullSync: () => {} };\n }\n\n function syncNow() {\n const alert: BaseAlert = {\n type: AlertType.Success,\n heading: getPhrase('startSyncAlertHeading'),\n message: getPhrase('startSyncAlertBody'),\n appLinkText: getPhrase('startSyncAlertAppLinkText'),\n appLinkClassName: 'info-link'\n };\n\n const data = {\n name: BatchJobName.Rostering,\n type: BatchJobType.Rostering,\n metadata: {\n targetMasterId: currentUser.customerId,\n targetMasterType: MasterType.Customer\n },\n customerId: currentUser.customerId,\n dataType: BatchDataType.Learner\n };\n fetchAsync(RosteringRequests.createJob(\n data,\n () => {\n alerts.success(alert);\n },\n () => {\n alerts.error(getPhrase('error'));\n }\n ));\n }\n\n function fullSync() {\n // todo\n }\n return { fullSync, syncNow };\n};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["namespace","FormButtons","props","formikProps","canSubmit","variant","type","disabled","size","className","showSpinner","isSubmitting","submitText","phrase","isNew","FormCheckbox","label","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","appLink","CharacterCounter","values","field","ObjectHelper","fieldName","length","limit","children","showLoadingSpinner","setType","resolvedChildren","FunctionHelper","f","Spinner","animation","containerClassName","SvgContainer","svgName","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","formGroupClassname","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","name","as","title","tooltipPlacement","tooltipSpanHack","Text","maxLength","errorMessage","role","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formattedInitialValues","validationSchema","cast","omitChildValues","child","Object","keys","forEach","key","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","TabContents","tab","count","data","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","map","index","active","analyticsData","analyticsOptions","onSelect","onSelectTab","RosteringSettingHeader","appLinks","syncJobs","settings","getPhrase","LanguageService","SyncActionButtonGroup","Tooltip","spanHack","placement","spanHackClassName","onSyncNow","now","Date","RosteringHelper","parseUTCToLocal","utcHour","utcWeekdays","utcMinute","local","weekday","localWeekdays","w","getDay","hour","daysOfWeek","minute","getScheduledJobBySetting","setting","fullSyncSchedule","enabled","schedule","scheduledDate","weekdayOfToday","scheduledWeekday","sort","a","b","scheduledToday","includes","setHours","nextScheduledDate","nextScheduledWeekday","find","d","gap","Math","abs","setDate","getDate","RosteringRequests","getRostering","url","getSyncList","queryParams","params","cursor","order","jobStatus","statuses","push","status","createJob","success","error","invalidationKeys","getJobSummary","getSyncScheduleSettings","integrationId","updateScheduleSetting","always","customerId","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","breadcrumbs","i","heading","headingButton","description","RequiresSetUpEmptyState","src","href","newTab","TIMES","Array","fill","_","REPEATS","WEEK_DAYS","date","offsetHours","getTimezoneOffset","formatTime","number","time","parseWeekdayNumber","DateHelper","ScheduleForm","startAt","Intl","DateTimeFormat","resolvedOptions","timeZone","repeat","TextHelper","option","day","e","preventDefault","nextValue","filter","v","setFieldValue","charAt","str","sortedWeekDays","slice","join","firstPart","weekdays","getAlertContent","ScheduleSchema","shape","min","max","required","oneOf","ScheduleSetting","val","onDone","onSave","utc","ArrayHelper","parseLocalToUTC","parseFormToPayload","RosteringSyncSettingsView","currentUser","UserRequests","rostering","fetch","alerts","useSetPageMetadata","useSyncRostering","syncNow","fullSync","onFullSync","PermissionName","payload","userId","fetchAsync","alert","message","appLinkText","appLinkClassName","metadata","targetMasterId","targetMasterType","dataType","B"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7234-85d4acaa33-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/popout-video-widget-item/popout-video-widget-item.scss","file:///app/packages/libs/shared/src/hooks/UseBatchFetch.ts","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/nav-tiles.scss","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/components/Navtiles.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/PopupPluginView.tsx","file:///app/packages/projects/lite/src/apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos.ts","file:///app/packages/projects/lite/src/apps/watch-history/flight-requests/VideoHistoryRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/projects/lite/src/shared/hooks/useVideoMixin.ts"],"sourcesContent":["import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { VideoThumbnail } from 'libs/shared/components/thumbnails/video/VideoThumbnail';\nimport { FixedWidgetItemProps } from 'libs/shared/components/widgets/items/FixedWidgetItemProps';\nimport { ThumbnailTextPosition } from 'libs/shared/enums/ThumbnailTextPosition';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useMergeAudiences } from 'libs/shared/hooks/UseMergeAudiences';\nimport { PresentationAudience, VideoTypes, WidgetType } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport styles from './popout-video-widget-item.scss';\n\nexport interface PopoutVideoWidgetItemProps extends FixedWidgetItemProps<VideoTypes> {\n presentationAudiences: PresentationAudience[];\n showVideoGuidance: boolean;\n hideTitle?: boolean;\n hideSeries?: boolean;\n onClickRemoveItem: (videoId: string, videoName: string) => void;\n removeButtonTooltip?: string;\n preventPopout?: boolean;\n showNewVideoIndicator?: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport const PopoutVideoWidgetItem = React.memo(function(props: PopoutVideoWidgetItemProps): JSX.Element {\n const { data: video, context, thumbnailSize, preloadImage, presentationAudiences } = props;\n \n const videoAudiences = video?.subjectPresentationAudiences?.data;\n const mergedAudience = useMergeAudiences(videoAudiences, presentationAudiences);\n\n const breakpoints = useBreakpoints();\n\n let width = styles.rowWidth;\n\n if (context.type === WidgetType.LargeRow)\n width = styles.largeRowWidth;\n\n return (\n <div className={`px-1 flex-shrink-0 position-relative ${width}`}>\n <VideoThumbnail\n video={props.data}\n analyticsData={props.analyticsData}\n analyticsOptions={props.analyticsOptions}\n hideTitle={props.hideTitle}\n showVideoGuidance={props.showVideoGuidance}\n type={props.preventPopout || breakpoints.xs ? 'static' : 'popout'}\n textPosition={ThumbnailTextPosition.Below}\n appLink={props.getAppLink(video)}\n imageOptions={{ size: thumbnailSize }}\n preload={preloadImage}\n audience={mergedAudience}\n hideRating={!!mergedAudience}\n hideDuration={false}\n onClickRemove={FunctionHelper.isFunction(props.onClickRemoveItem)\n && (() => props.onClickRemoveItem(video.id, video.name))}\n removeButtonTooltip={props.removeButtonTooltip}\n commonVideoProps={props.commonVideoProps}\n />\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"rowWidth\":\"JSM4l\",\"largeRowWidth\":\"YYpNz\"};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nconst CHUNK_SIZE = 50;\n\nexport interface UseBatchFetchResult<T extends BaseObject> {\n itemsArr: T[];\n items: { [key: string]: T} | null;\n isFetching: boolean;\n}\n\n/**\n * Used to fetch multiple items by id with Flight. Will fetch 25 items at a time firing off multiple\n * requests if there are more than 25 items.\n * This will return items as null until we have all our items. Items will be returned as an object with\n * their ids as they key for easy mapping\n * \n * @param itemIds \n * @param getRequest \n */\nexport function useBatchFetch<T extends BaseObject>(\n itemIds: string[],\n getRequest: (ids: string[]) => Flight.Request\n): UseBatchFetchResult<T> {\n const chunks = ArrayHelper.chunk<string>(itemIds, CHUNK_SIZE);\n\n const requests = chunks.map(chunk => getRequest(ArrayHelper.uniq(chunk)));\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [item.id]: item }), {})\n : null;\n\n return {\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}\n\n/**\n * When you need the useBatchFetch() behavior, but your list of objects to hydrate\n * will grow, such as on a scrolling page. useGrowingBatchFetch() will use local state\n * to determine what we've already built a request for and what items are new\n * as to not re-fetch items - Sha\n */\nexport function useGrowingBatchFetch<T>(\n objs: T[],\n getRequest: (items: T[]) => Flight.Request,\n _getKey?: (obj: T) => string\n) {\n const getKey = _getKey || ((obj: any) => {\n if (typeof obj === 'object')\n return obj.id;\n\n return obj;\n });\n\n const fetchedItems = React.useRef<Set<string>>(new Set<string>());\n\n const [ requests, setRequests ] = React.useState<Flight.Request[]>([]);\n\n React.useEffect(() => {\n if (!objs?.length)\n return;\n\n const unfetchedItems: T[] = [];\n \n objs.forEach(obj => {\n const key = getKey(obj);\n\n if (fetchedItems.current.has(key))\n return;\n\n unfetchedItems.push(obj);\n fetchedItems.current.add(key);\n });\n \n if (!unfetchedItems.length)\n return;\n\n setRequests(r => ([ ...r, ...ArrayHelper.chunk<T>(unfetchedItems, CHUNK_SIZE).map(getRequest) ]));\n }, [objs?.length]);\n\n const responses = Flight.useBasicFetchAll<T[]>(requests);\n\n const itemsArr = ArrayHelper.flatten(responses.data);\n const items = responses.data.length\n ? itemsArr.reduce((acc, item) => ({ ...acc, [getKey(item)]: item }), {})\n : null;\n\n return {\n hasFirstRequestCompleted: !!responses.responses?.[0]?.hasCompleted,\n itemsArr,\n items,\n isFetching: responses.isFetching\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"leftNavIcon\":\"ssG3i\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LibraryHelper } from 'libs/shared/apps/libraries/utils/LibraryHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CuratedDashboard, Library } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { LeftNavId } from 'shared/enums/LeftNavId';\nimport { LeftNavConfig } from 'shared/views/left-nav/LeftNavConfig';\n\nimport styles from './nav-tiles.scss';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface NavItemTileProps {\n id: LeftNavId;\n name: string;\n imageUrl?: string;\n iconClassName: string;\n svgName: string;\n appLink: Core.AppLink;\n}\n\nfunction NavItemTile(props: NavItemTileProps): JSX.Element {\n return (\n <li className='col-6 mb-3'>\n <AppLink\n appLink={props.appLink}\n className={`border rounded-3 d-flex align-items-center\n justify-content-center flex-column text-decoration-none h-100 py-3 px-1 text-center`}\n >\n <div className={`${styles.leftNavIcon} ${props.iconClassName} mx-auto mb-3`}>\n <IconCircle\n imageUrl={ImageHelper.createUrl(props.imageUrl, { size: ImageSize.Small })}\n svgName={props.svgName}\n svgSize={SvgContainerSize.Large}\n />\n </div>\n <div className='h6'>\n {props.name}\n </div>\n </AppLink>\n </li>\n );\n}\n\ninterface NavTilesProps {\n hasPermissions: HasPermissionsFunc;\n moviesAndTvDashboard: CuratedDashboard;\n libraries: Library[];\n hasShareFlowV2?: boolean;\n hasClassrooms?: boolean;\n}\n\nexport function NavTiles(props: NavTilesProps): JSX.Element {\n const { hasPermissions, moviesAndTvDashboard, libraries } = props;\n\n function shouldShowLibraries(): boolean {\n if (!libraries?.length)\n return false;\n\n if (!hasPermissions(PermissionName.StudentExperience))\n return true;\n\n return hasPermissions(PermissionName.ViewLibraries);\n }\n\n function showNavItem(leftNavId: LeftNavId) {\n switch (leftNavId) {\n case LeftNavId.StudentFeed: return hasPermissions(PermissionName.StudentExperience) && props.hasClassrooms;\n case LeftNavId.Discover: return hasPermissions(PermissionName.ViewDiscover);\n case LeftNavId.MoviesAndTv: return hasPermissions(PermissionName.ViewMoviesTv);\n case LeftNavId.Libraries: return shouldShowLibraries();\n case LeftNavId.Classrooms: return hasPermissions(PermissionName.ViewClassrooms);\n case LeftNavId.MyShares: return hasPermissions(PermissionName.ViewMyShares) && props.hasShareFlowV2;\n default: return true;\n }\n }\n\n return (\n <ul className='list-unstyled row row-cols-md-5'>\n {showNavItem(LeftNavId.StudentFeed) && (\n <NavItemTile\n id={LeftNavId.StudentFeed}\n appLink={LeftNavConfig[LeftNavId.StudentFeed].appLink}\n name={getPhrase('home')}\n iconClassName='bg-purple'\n svgName={cvSvgLibrary.House}\n />\n )}\n {showNavItem(LeftNavId.Discover) && (\n <NavItemTile\n id={LeftNavId.Discover}\n appLink={LeftNavConfig[LeftNavId.Discover].appLink}\n name={getPhrase('discover')}\n iconClassName='bg-blue'\n svgName={cvSvgLibrary.Compass}\n />\n )}\n {showNavItem(LeftNavId.MoviesAndTv) && !!moviesAndTvDashboard && (\n <NavItemTile\n id={LeftNavId.MoviesAndTv}\n appLink={LeftNavConfig[LeftNavId.MoviesAndTv].appLink}\n name={getPhrase('moviesAndTv')}\n iconClassName='bg-indigo'\n svgName={cvSvgLibrary.Popcorn}\n />\n )}\n <NavItemTile\n id={LeftNavId.Playlists}\n appLink={LeftNavConfig[LeftNavId.Playlists].appLink}\n name={getPhrase('playlists')}\n iconClassName='bg-green'\n svgName={cvSvgLibrary.Playlist}\n />\n <NavItemTile\n id={LeftNavId.MyVideos}\n appLink={LeftNavConfig[LeftNavId.MyVideos].appLink}\n name={getPhrase('myVideos')}\n iconClassName='bg-orange'\n svgName={cvSvgLibrary.Video}\n />\n {showNavItem(LeftNavId.MyShares) && (\n <NavItemTile\n id={LeftNavId.MyShares}\n appLink={LeftNavConfig[LeftNavId.MyShares].appLink}\n name={getPhrase('myShares')}\n iconClassName='bg-ultramarine'\n svgName={cvSvgLibrary.Share}\n />\n )}\n {showNavItem(LeftNavId.Libraries) && (\n LibraryHelper.sort(libraries).map((library, index) => (\n <NavItemTile\n key={index}\n id={LeftNavId.Library}\n name={library.name}\n appLink={{\n ...LeftNavConfig[LeftNavId.Library].appLink,\n args: [ library.id, TextHelper.slugify(library.name) ]\n }}\n iconClassName='bg-teal'\n imageUrl={library.owner?.logo?.url}\n svgName={!(library.owner?.logo?.url) && cvSvgLibrary.Library}\n />\n ))\n )}\n </ul>\n );\n}\n","import React from 'react';\nimport { Radio } from 'backbone';\n\nimport { CommonChannels } from 'libs/common/backbone/constants/CommonChannels';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { useFocusSearchBar } from 'libs/shared/components/search-bar/SearchUtils';\nimport { FixedWidget, PartialFixedWidget } from 'libs/shared/components/widgets/fixed-widget';\nimport { PopoutVideoWidgetItem } from 'libs/shared/components/widgets/items/popout-video-widget-item/PopoutVideoWidgetItem';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { WidgetContents } from 'libs/shared/enums/WidgetContents';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { FavouriteRequests } from 'libs/shared/flight-requests/FavouriteRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useListenOn } from 'libs/shared/hooks/UseListenOn';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { CurrentUser, DashboardTargetType, Library, PresentationAudience, VideoTypesCollection } from 'libs/shared/interfaces';\nimport { LayoutHelper } from 'libs/shared/utils/LayoutHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { usePresentation } from 'shared/hooks/usePresentation';\nimport { useFetchCuratedDashboard } from 'shared/utils/DashboardHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { NavTiles } from 'apps/default/views/popup-plugin/components/Navtiles';\nimport { useGetVideoHistory } from 'apps/default/views/popup-plugin/hooks/useGetVideoHistoryVideos';\n\nconst namespace = 'default.popupPlugin';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n\nexport function PopupPluginView(): JSX.Element {\n const { focusSearchBar } = useFocusSearchBar();\n const { hasNewSearch } = useSettings(null);\n\n useSetPageMetadata({ title: getPhrase('title') });\n\n /**\n * Required for video widgets\n */\n const { activePresentation } = usePresentation();\n const { hasPermissions, isLoaded } = usePermissions();\n const { hasShareFlowV2, hasClassrooms } = useSettings(null);\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n /**\n * Watch history videos\n */\n const videoHistory = useGetVideoHistory();\n\n /**\n * Favourite videos\n */\n const favouriteVideos = Flight.useBasicFetch<VideoTypesCollection>(\n currentUser.data && FavouriteRequests.getFavourites(currentUser.data.id)\n );\n\n /**\n * Required for displaying our Nav item tiles.\n */\n const libraries = Flight.useBasicFetch<Library[]>(\n hasPermissions(PermissionName.ViewLibraries) &&\n LibraryRequests.domainLibraries([ 'customLibrary', 'sharedLibrary' ])\n );\n const {\n dashboard: moviesAndTvDashboard\n } = useFetchCuratedDashboard({\n targetType: DashboardTargetType.MoviesAndTv,\n queryParams: {}\n });\n Flight.useBasicFetch(!!libraries.data?.length &&\n LibraryRequests.librariesWithOwnerLogos(libraries.data.map(s => s.id)));\n\n useListenOn(CommonChannels.SHELL, Core.EventNames.ROUTE, appLink => {\n /**\n * Ignore applinks with no href. Like the embed popup - Sha\n */\n if (!Core.AppLinkHelper.getHref(appLink))\n return;\n\n /**\n * Enable the nav as we leave our popup view - Sha\n */\n LayoutHelper.enableNav();\n\n if (hasNewSearch)\n return;\n \n /**\n * Re-focus the search bar when the routing has ended.\n * We need to do this because the user may be mid typing, but the layout\n * re-render causes the search bar to lose focus - Sha\n */\n Radio.channel(CommonChannels.SHELL).once('routing:end', focusSearchBar);\n });\n\n const hasLoaded = (\n moviesAndTvDashboard.hasCompleted &&\n isLoaded &&\n (!hasPermissions(PermissionName.ViewLibraries) || libraries.hasCompleted) &&\n hasCommonVideoPropsCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='px-4'>\n <NavTiles\n hasPermissions={hasPermissions}\n moviesAndTvDashboard={moviesAndTvDashboard.data}\n libraries={libraries.data}\n hasShareFlowV2={hasShareFlowV2}\n hasClassrooms={hasClassrooms}\n />\n\n {videoHistory.hasCompleted ?\n <div className='mb-3'>\n <FixedWidget\n name={getPhrase('recentlyWatched')}\n collection={videoHistory.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n presentationAudiences: audiences.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n onClickRemoveItem: null,\n commonVideoProps\n }}\n getChildAppLink={v =>\n VideoAppLinkHelper.getAppLink(v, { includeContext: currentUser.data?.isAuthenticated })}\n appLink={{\n application: AppChannels.WATCH_HISTORY,\n action: Actions.WatchHistory.HOME\n }}\n prefetched\n />\n </div> :\n <div className='mb-3'><PartialFixedWidget /></div>\n }\n\n {favouriteVideos.hasCompleted ?\n <FixedWidget\n name={getPhrase('favourites')}\n collection={favouriteVideos.data.data || []}\n contents={WidgetContents.Videos}\n childComponent={PopoutVideoWidgetItem}\n extraChildComponentProps={{\n presentationAudiences: audiences.data,\n showVideoGuidance: VideoHelper.showVideoGuidance(hasPermissions),\n onClickRemoveItem: null,\n commonVideoProps\n }}\n getChildAppLink={v =>\n VideoAppLinkHelper.getAppLink(v, { includeContext: currentUser.data?.isAuthenticated })}\n appLink={{\n application: AppChannels.DEFAULT,\n action: Actions.MyFavourites.MY_FAVOURITES\n }}\n prefetched\n /> :\n <PartialFixedWidget />\n }\n </div>\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { VideoHistoryCollection, VideoTypes } from 'libs/shared/interfaces';\n\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\n\nimport { VideoHistoryRequests } from 'apps/watch-history/flight-requests/VideoHistoryRequests';\n\nexport function useGetVideoHistory() {\n const videoHistory = Flight.useBasicFetch<VideoHistoryCollection>(VideoHistoryRequests.userVideoHistory());\n\n const videosFetchResult = useBatchFetch<VideoTypes>(\n videoHistory.data?.data?.map(v => v.videoId) ?? [],\n VideoRequests.watchHistoryVideos\n );\n\n /**\n * We must do this to get the videos back into the correct order - Sha\n */\n const videoHistoryVideos = React.useMemo(() => {\n const videosMap = new Map<string, VideoTypes>();\n\n videoHistory.data?.data?.forEach(history => {\n if (videosMap.has(history.videoId))\n return;\n\n const video = videosFetchResult.items?.[history.videoId];\n\n if (video)\n videosMap.set(history.videoId, video);\n });\n\n return [...videosMap.values()];\n }, [ videosFetchResult.items, videoHistory.data ]);\n \n useVideoMixin(videoHistoryVideos);\n\n return {\n data: videoHistoryVideos,\n hasCompleted: !videosFetchResult.isFetching\n };\n}","\nimport { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { VideoHistoryCollection } from 'libs/shared/interfaces';\n\nexport const VideoHistoryRequests = {\n userVideoHistory(\n cursor?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n let key = 'video:history';\n let url = `{gateway}/v1/users/me/watch-history`;\n\n if (cursor) {\n key += `:${cursor}`;\n url += `?cursor=${cursor}`;\n }\n\n return {\n key,\n url,\n formatData: (historyCollection: VideoHistoryCollection) => {\n return {\n data: historyCollection.data.map(historyData => {\n // Convert last watched times from UTC to local time\n const lastTimeWatchedLocal = DateHelper.format(historyData.lastTimeWatched);\n const lastDateWatchedLocal = DateHelper.format(lastTimeWatchedLocal, 'YYYY-MM-DD');\n\n return {\n ...historyData,\n lastTimeWatched: lastTimeWatchedLocal,\n lastDateWatched: lastDateWatchedLocal\n };\n }),\n pagination: historyCollection.pagination\n };\n },\n success,\n error,\n always\n };\n },\n\n videoHistory(\n ids: string[],\n namespace?: string,\n success?: (data: HashObject) => void,\n error?: (Xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n const params = ids.sort().map(i => `videoId=${i}`);\n\n return {\n key: `video:history:videos:${params.join('&')}`,\n url: `{gateway}/v1/videos/history?${params.join('&')}`,\n normalizeOptions: {\n namespace\n },\n formatData: (historyCollection: HashObject[]) => {\n if (!historyCollection?.length)\n return historyCollection;\n\n /**\n * Data is formatted to enable it to be merged with the existing video object in the store\n * Where we need to merge more history properties with the video object, map them below.\n */\n return historyCollection.map((watchHistory: HashObject) => ({\n id: watchHistory.videoId,\n lastProgressPoint: watchHistory.lastProgressPoint\n }));\n },\n success,\n error,\n always\n };\n },\n\n removeFromHistory(videoId: string, invalidationKeys: string[] = []): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/videos/${videoId}/watch-history`,\n key: `remove:video:history:${videoId}`,\n type: HttpVerbs.DELETE,\n invalidationKeys: [\n 'video:history',\n ...invalidationKeys\n ]\n };\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","import { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useGrowingBatchFetch } from 'libs/shared/hooks/UseBatchFetch';\nimport { Clip, ClipCollection, Video, VideoCollection } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\ntype Types = Video[] | VideoCollection | Clip[] | ClipCollection;\n\nfunction getValidObjects(objects: Types): (Video | Clip)[] {\n if (!objects)\n return [];\n\n if (Array.isArray(objects))\n return objects.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n if ('data' in objects)\n return objects.data.filter(o => !!o && (VideoHelper.isVideo(o) || VideoHelper.isClip(o)));\n\n return [];\n}\n\ninterface VideoMixinOptions {\n /**\n * If the videos that are having new data mixed into are sitting on an explicit Flight namespace,\n * providing that namespace here is required\n */\n flightNamespace?: string;\n}\n\nexport function useVideoMixin(objects: Types, options: VideoMixinOptions = {}): void {\n const videoIds = getValidObjects(objects).map(v => v.id);\n\n useGrowingBatchFetch(videoIds, ids => VideoRequests.videoMixinAssocs(ids, options.flightNamespace));\n}"],"names":["PopoutVideoWidgetItem","props","video","data","context","thumbnailSize","preloadImage","presentationAudiences","videoAudiences","subjectPresentationAudiences","mergedAudience","breakpoints","useBreakpoints","width","type","className","VideoThumbnail","analyticsData","analyticsOptions","hideTitle","showVideoGuidance","preventPopout","xs","textPosition","ThumbnailTextPosition","appLink","getAppLink","imageOptions","size","preload","audience","hideRating","hideDuration","onClickRemove","FunctionHelper","onClickRemoveItem","id","name","removeButtonTooltip","commonVideoProps","CHUNK_SIZE","useBatchFetch","itemIds","getRequest","requests","map","chunk","responses","itemsArr","items","length","reduce","acc","item","isFetching","useGrowingBatchFetch","objs","_getKey","getKey","obj","fetchedItems","Set","setRequests","unfetchedItems","forEach","key","current","has","push","add","r","hasFirstRequestCompleted","hasCompleted","getPhrase","LanguageService","NavItemTile","AppLink","iconClassName","IconCircle","imageUrl","ImageHelper","svgName","svgSize","SvgContainer","S","NavTiles","hasPermissions","moviesAndTvDashboard","libraries","showNavItem","leftNavId","LeftNavId","PermissionName","hasClassrooms","hasShareFlowV2","LeftNavConfig","LibraryHelper","library","index","args","TextHelper","owner","logo","url","PopupPluginView","focusSearchBar","hasNewSearch","useSettings","useSetPageMetadata","title","activePresentation","usePresentation","usePermissions","isLoaded","useCommonVideoProps","locationContext","hasCommonVideoPropsCompleted","currentUser","UserRequests","audiences","AudienceRequests","videoHistory","VideoHistoryRequests","videosFetchResult","v","videoId","VideoRequests","videoHistoryVideos","videosMap","Map","history","set","values","useVideoMixin","useGetVideoHistory","favouriteVideos","FavouriteRequests","LibraryRequests","targetType","queryParams","dashboard","s","CommonChannels","LayoutHelper","Radio","once","collection","contents","WidgetContents","childComponent","extraChildComponentProps","VideoHelper","getChildAppLink","VideoAppLinkHelper","includeContext","isAuthenticated","application","action","prefetched","userVideoHistory","cursor","success","error","always","formatData","historyCollection","historyData","lastTimeWatchedLocal","lastTimeWatched","lastDateWatchedLocal","lastDateWatched","pagination","ids","namespace","params","sort","i","join","normalizeOptions","watchHistory","lastProgressPoint","removeFromHistory","invalidationKeys","options","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","hasStudentExperience","config","yearGroups","customerId","subTextType","getSubTextAppLink","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl","objects","videoIds","Array","isArray","filter","o","getValidObjects"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scripts/7383-690bc234f1-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/projects/lite/src/apps/settings/components/restricted-videos-tabs/RestrictedVideosTabs.tsx","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/views/video-restrictions/VideoRestrictionsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/settings/views/video-restrictions/VideoRestrictionsView.tsx","file:///app/packages/projects/lite/src/shared/flight-requests/RestrictionRequests.ts","file:///app/packages/projects/lite/src/shared/hooks/useCommonVideoProps.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\n}\n","import React from 'react';\n\nimport { AppLinkHelper } from 'libs/common/backbone/core';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'settings.restrictedVideosTabs';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst APPLINKS = {\n restrictedVideos: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.VIDEO_RESTRICTIONS\n },\n contentReview: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.CONTENT_REVIEW\n },\n contentReviewSettings: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.CONTENT_REVIEW_SETTINGS\n }\n};\n\ninterface RestrictionTabsProps {\n active: 'restricted-videos' | 'content-review' | 'content-review-settings'\n}\n\nexport function RestrictionTabs(props: RestrictionTabsProps): JSX.Element {\n return (\n <div className='mb-3'>\n <PillTabSelector\n tabs={[{\n name: getPhrase('restrictedVideos'),\n appLink: APPLINKS.restrictedVideos,\n active: props.active === 'restricted-videos',\n analyticsData: {\n name: getPhrase('restrictedVideos'),\n url: AppLinkHelper.getHref(APPLINKS.restrictedVideos)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('contentReview'),\n appLink: APPLINKS.contentReview,\n active: props.active === 'content-review',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'contentReview'),\n url: AppLinkHelper.getHref(APPLINKS.contentReview)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('contentReviewSettings'),\n appLink: APPLINKS.contentReviewSettings,\n active: props.active === 'content-review-settings',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'contentReviewSettings'),\n url: AppLinkHelper.getHref(APPLINKS.contentReviewSettings)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }]}\n />\n </div>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'settings.videoRestrictions';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function VideoRestrictionsEmptyState(): JSX.Element {\n const href = ArticleHelper.getLiteArticle(LiteSupportArticle.ContentReview);\n\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.ContentReview.RESTRICTED_VIDEOS} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext, VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { VideoTypes, VideoTypesCollection } from 'libs/shared/interfaces';\nimport { RestrictionHelper } from 'libs/shared/utils/RestrictionHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RestrictionRequests } from 'shared/flight-requests/RestrictionRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { RestrictionTabs } from 'apps/settings/components/restricted-videos-tabs/RestrictedVideosTabs';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { VideoRestrictionsEmptyState } from 'apps/settings/views/video-restrictions/VideoRestrictionsEmptyState';\n\nconst namespace = 'settings.videoRestrictions';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst ContentPermissionAppLink = {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.CONTENT_PERMISSIONS\n};\n\ninterface VideoRestrictionsViewProps {\n cursor?: string;\n}\n\nexport function VideoRestrictionsView(props: VideoRestrictionsViewProps): JSX.Element {\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n const { commonVideoProps } = useCommonVideoProps({ locationContext: LocationContext.VideoThumbnail });\n const { hasPermissions } = usePermissions();\n\n const videos = Flight.useBasicFetch<VideoTypesCollection>(\n RestrictionRequests.getRestrictedObjects([RestrictionType.User], props.cursor)\n );\n\n function getVideoActions(video: VideoTypes, options: VideoActionsOptions): ActionOptions[] {\n return [{\n order: 1,\n label: getPhrase('manageVideoAccess'),\n button: true,\n className: 'btn btn-outline-dark text-nowrap',\n appLink: {\n application: AppChannels.DEFAULT,\n action: Actions.Default.MANAGE_ACCCESS,\n params: {\n objectId: video.id,\n objectTypeId: video.typeId\n }\n },\n analyticsOptions: {\n ...options.analyticsOptions,\n actionType: UserAction.SetAccess,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData: options.analyticsData\n }];\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n requiredPermissions={PermissionName.ManageVideoAccess}\n >\n <RestrictionTabs active='restricted-videos' />\n <div className='d-flex justify-content-between align-items-center'>\n <p className='mb-0'>\n <Text namespace={namespace} phrase='description'/>\n &nbsp;\n <AppLink appLink={ContentPermissionAppLink} className='info-link'>\n <Text namespace={namespace} phrase='contentPermissions'/>\n </AppLink>\n </p>\n </div>\n <hr />\n {!videos.hasCompleted &&\n <PartialVideoList />\n }\n\n {videos.hasCompleted && !videos.data?.data?.length &&\n <VideoRestrictionsEmptyState />\n }\n\n {!!videos.data?.data?.length &&\n <>\n <VideoActionsContext.Provider value={{ getVideoActions }}>\n <VideoList\n videos={videos.data.data.filter(v =>\n !!RestrictionHelper.getRestrictionByType(v, RestrictionType.User))}\n getVideoAppLink={VideoAppLinkHelper.getAppLink}\n hasPermissions={hasPermissions}\n // we want to show rating badge not year level badge all the time\n presentationAudiences={[]}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n commonVideoProps={commonVideoProps}\n />\n </VideoActionsContext.Provider>\n {videos.data.pagination?.cursors &&\n <div className='clearfix'>\n <Pagination\n cursors={videos.data.pagination.cursors}\n appLink={{\n application: AppChannels.SETTINGS,\n action: Actions.Settings.VIDEO_RESTRICTIONS\n }}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n />\n </div>\n }\n </>\n }\n </SettingsLayout>\n );\n}","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { SharedWithStatements } from 'libs/shared/constants/WithStatements';\nimport { RestrictionType } from 'libs/shared/enums/RestrictionType';\n\nimport { AddRestrictionRequest } from 'shared/interfaces/requests/AddRestrictionRequest';\n\nexport const RestrictionRequests = {\n getRestrictions(id: string): Flight.Request {\n return {\n key: `restrictions:${id}`,\n url: UrlHelper.urlBuilder(`{gateway}/v1/objects/restrictions`, { id })\n };\n },\n\n addRestriction(data: AddRestrictionRequest): Flight.Request {\n return {\n type: HttpVerbs.POST,\n key: `restrictions:${data.objectTypeId}:${data.objectId}:add`,\n url: `{gateway}/v1/restrictions`,\n data: [data],\n invalidationKeys: ['restrictions']\n };\n },\n\n\n deleteRestrictions(objectId: string): Flight.Request {\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/restrictions', { objectId }),\n key: 'restrictions:delete',\n type: HttpVerbs.DELETE,\n invalidationKeys: ['restrictions']\n };\n },\n\n\n getRestrictedObjects(\n type: RestrictionType[],\n cursor?: string\n ): Flight.Request {\n const params: any = {\n 'type': type,\n 'query.video': SharedWithStatements.VIDEO_COLLECTION,\n 'query.interactive': SharedWithStatements.INTERACTIVE_COLLECTION,\n 'query.clip': SharedWithStatements.CLIP_COLLECTION\n };\n\n if (cursor)\n params.cursor = cursor;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/restrictions/objects', params),\n key: `restrictions:objects:${type.sort().join(',')}:${cursor}`\n };\n },\n\n approveAll(): Flight.Request {\n return {\n url: '{gateway}/v1/library-reviews/restrictions',\n key: 'restrictions:approve:all',\n type: HttpVerbs.DELETE\n };\n }\n};","import { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Config, CurrentUser, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { SeriesAppLinkHelper } from 'apps/series/SeriesAppLinkHelper';\n\nimport { usePluginHelper } from './use-plugin-helper/usePluginHelper';\nimport { useLiteFavourites } from './useLiteFavourites';\n\ninterface UseCommonVideoPropsResult {\n hasCommonVideoPropsCompleted: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\ninterface UseCommonVideoPropsOptions {\n locationContext: LocationContext,\n mtv?: boolean;\n flightNamespace?: string;\n sharedPlaylist?: boolean;\n}\n\nexport function useCommonVideoProps(options: UseCommonVideoPropsOptions): UseCommonVideoPropsResult {\n const { locationContext, mtv, flightNamespace, sharedPlaylist } = options || {};\n\n const { isPlugin } = usePluginHelper();\n const { setFavourite, canFavourite } = useLiteFavourites(locationContext, flightNamespace);\n const { hasTopicDirectories, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded: hasLoadedPermissions } = usePermissions();\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n\n function getSubTextAppLink(video: VideoTypes): Core.AppLink {\n if (!('series' in video))\n return null;\n\n /**\n * We do not allow navigating to series on shared playlists when the user is not signed in\n * because most series are customer created and will be empty for public users\n * \n * We do not have to do this for shared series, because all the series links are self referencing\n * - Sha\n */\n if (sharedPlaylist && !currentUser.data?.isAuthenticated)\n return null;\n \n return SeriesAppLinkHelper.getSeriesAppLink(video.series, { mtv });\n }\n\n const hasCommonVideoPropsCompleted = (\n !isLoadingSettings &&\n hasLoadedPermissions &&\n config.hasCompleted &&\n currentUser.hasCompleted &&\n (!currentUser.data?.isAuthenticated || yearGroups.hasCompleted)\n );\n\n return {\n hasCommonVideoPropsCompleted,\n commonVideoProps: {\n subTextType: 'series',\n getSubTextAppLink,\n isPlugin,\n canFavourite,\n setFavourite,\n imageCdnUrl: config.data?.imageCdnUrl,\n yearGroups: yearGroups.data,\n getClassroomGuideAppLink: VideoAppLinkHelper.getClassroomGuideAppLink,\n getInteractiveGuidanceAppLink: VideoAppLinkHelper.getInteractiveGuidanceAppLink,\n getResourceGuidanceAppLink: VideoAppLinkHelper.getResourceGuidanceAppLink,\n showNewVideoIndicator: hasTopicDirectories,\n companyLogoFallbackUrl: null,\n hasStudentExperience\n }\n };\n}","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["TabContents","props","tab","svgName","className","name","count","type","data","PillTabSelector","ref","containerRef","borderRadius","listClassName","tabs","map","index","active","key","appLink","analyticsData","analyticsOptions","onClick","onSelect","onSelectTab","defaultProps","OnlineSupportArticle","LiteSupportArticle","namespace","getPhrase","APPLINKS","restrictedVideos","application","action","contentReview","contentReviewSettings","RestrictionTabs","url","actionType","entity","location","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","some","group","modules","settingsModule","SettingsLayout","canAccess","replace","breadcrumbs","i","length","heading","headingButton","description","children","LanguageService","VideoRestrictionsEmptyState","href","ArticleHelper","EmptyState","src","ImageUrls","Text","phrase","text","ContentPermissionAppLink","VideoRestrictionsView","useSetPageMetadata","title","commonVideoProps","useCommonVideoProps","locationContext","usePermissions","videos","RestrictionRequests","RestrictionType","cursor","PermissionName","AppLink","hasCompleted","PartialVideoList","VideoActionsContext","value","getVideoActions","video","options","order","label","button","params","objectId","id","objectTypeId","typeId","workflowPhase","VideoList","filter","v","RestrictionHelper","getVideoAppLink","VideoAppLinkHelper","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","pagination","cursors","Pagination","buttonVariant","getRestrictions","addRestriction","invalidationKeys","deleteRestrictions","getRestrictedObjects","sort","join","approveAll","mtv","flightNamespace","sharedPlaylist","isPlugin","u","setFavourite","canFavourite","hasTopicDirectories","isLoadingSettings","hasLoadedPermissions","isLoaded","hasStudentExperience","config","currentUser","yearGroups","isAuthenticated","customerId","hasCommonVideoPropsCompleted","subTextType","getSubTextAppLink","series","imageCdnUrl","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","showNewVideoIndicator","companyLogoFallbackUrl"],"sourceRoot":""}