@cratis/showrunner.boxoffice.react 0.0.0-stage → 1.9.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 (329) hide show
  1. package/Banners/NoLicense.tsx +36 -0
  2. package/Banners/SuspensionBanner.tsx +54 -0
  3. package/Banners/TrialBanner.tsx +30 -0
  4. package/Banners/bannerModels.ts +117 -0
  5. package/Banners/index.ts +7 -0
  6. package/Entitlements/EntitlementsContext.ts +17 -0
  7. package/Entitlements/RequiresModule.tsx +68 -0
  8. package/Entitlements/entitlementModel.ts +175 -0
  9. package/Entitlements/index.ts +9 -0
  10. package/Entitlements/moduleFilter.ts +23 -0
  11. package/Entitlements/requiresModuleModel.ts +44 -0
  12. package/Entitlements/useEntitlements.ts +25 -0
  13. package/Labels/BoxOfficeLabels.ts +239 -0
  14. package/Labels/defaultBoxOfficeLabels.ts +119 -0
  15. package/Labels/format.ts +13 -0
  16. package/Labels/index.ts +7 -0
  17. package/Labels/resolveLabels.ts +36 -0
  18. package/Plan/PlanPage.tsx +24 -0
  19. package/Plan/PlanView.tsx +80 -0
  20. package/Plan/index.ts +6 -0
  21. package/Plan/planModels.ts +127 -0
  22. package/Portal/PortalButton.tsx +48 -0
  23. package/Portal/index.ts +5 -0
  24. package/Portal/portalLinks.ts +32 -0
  25. package/Provider/BoxOfficeContext.ts +67 -0
  26. package/Provider/BoxOfficeProvider.tsx +96 -0
  27. package/Provider/index.ts +5 -0
  28. package/README.md +71 -2
  29. package/Seats/AssignSeatDialog.tsx +73 -0
  30. package/Seats/SeatsPage.tsx +85 -0
  31. package/Seats/SeatsView.tsx +108 -0
  32. package/Seats/index.ts +7 -0
  33. package/Seats/seatModels.ts +97 -0
  34. package/Usage/UsagePage.tsx +26 -0
  35. package/Usage/UsageView.tsx +94 -0
  36. package/Usage/index.ts +6 -0
  37. package/Usage/usageModels.ts +92 -0
  38. package/dist/cjs/Banners/NoLicense.d.ts +2 -0
  39. package/dist/cjs/Banners/NoLicense.d.ts.map +1 -0
  40. package/dist/cjs/Banners/NoLicense.js +50 -0
  41. package/dist/cjs/Banners/NoLicense.js.map +1 -0
  42. package/dist/cjs/Banners/SuspensionBanner.d.ts +7 -0
  43. package/dist/cjs/Banners/SuspensionBanner.d.ts.map +1 -0
  44. package/dist/cjs/Banners/SuspensionBanner.js +62 -0
  45. package/dist/cjs/Banners/SuspensionBanner.js.map +1 -0
  46. package/dist/cjs/Banners/TrialBanner.d.ts +2 -0
  47. package/dist/cjs/Banners/TrialBanner.d.ts.map +1 -0
  48. package/dist/cjs/Banners/TrialBanner.js +38 -0
  49. package/dist/cjs/Banners/TrialBanner.js.map +1 -0
  50. package/dist/cjs/Banners/bannerModels.d.ts +19 -0
  51. package/dist/cjs/Banners/bannerModels.d.ts.map +1 -0
  52. package/dist/cjs/Banners/bannerModels.js +101 -0
  53. package/dist/cjs/Banners/bannerModels.js.map +1 -0
  54. package/dist/cjs/Banners/index.d.ts +5 -0
  55. package/dist/cjs/Banners/index.d.ts.map +1 -0
  56. package/dist/cjs/Entitlements/EntitlementsContext.d.ts +4 -0
  57. package/dist/cjs/Entitlements/EntitlementsContext.d.ts.map +1 -0
  58. package/dist/cjs/Entitlements/EntitlementsContext.js +19 -0
  59. package/dist/cjs/Entitlements/EntitlementsContext.js.map +1 -0
  60. package/dist/cjs/Entitlements/RequiresModule.d.ts +9 -0
  61. package/dist/cjs/Entitlements/RequiresModule.d.ts.map +1 -0
  62. package/dist/cjs/Entitlements/RequiresModule.js +68 -0
  63. package/dist/cjs/Entitlements/RequiresModule.js.map +1 -0
  64. package/dist/cjs/Entitlements/entitlementModel.d.ts +25 -0
  65. package/dist/cjs/Entitlements/entitlementModel.d.ts.map +1 -0
  66. package/dist/cjs/Entitlements/entitlementModel.js +93 -0
  67. package/dist/cjs/Entitlements/entitlementModel.js.map +1 -0
  68. package/dist/cjs/Entitlements/index.d.ts +7 -0
  69. package/dist/cjs/Entitlements/index.d.ts.map +1 -0
  70. package/dist/cjs/Entitlements/moduleFilter.d.ts +6 -0
  71. package/dist/cjs/Entitlements/moduleFilter.d.ts.map +1 -0
  72. package/dist/cjs/Entitlements/moduleFilter.js +16 -0
  73. package/dist/cjs/Entitlements/moduleFilter.js.map +1 -0
  74. package/dist/cjs/Entitlements/requiresModuleModel.d.ts +10 -0
  75. package/dist/cjs/Entitlements/requiresModuleModel.d.ts.map +1 -0
  76. package/dist/cjs/Entitlements/requiresModuleModel.js +32 -0
  77. package/dist/cjs/Entitlements/requiresModuleModel.js.map +1 -0
  78. package/dist/cjs/Entitlements/useEntitlements.d.ts +5 -0
  79. package/dist/cjs/Entitlements/useEntitlements.d.ts.map +1 -0
  80. package/dist/cjs/Entitlements/useEntitlements.js +26 -0
  81. package/dist/cjs/Entitlements/useEntitlements.js.map +1 -0
  82. package/dist/cjs/Labels/BoxOfficeLabels.d.ts +116 -0
  83. package/dist/cjs/Labels/BoxOfficeLabels.d.ts.map +1 -0
  84. package/dist/cjs/Labels/defaultBoxOfficeLabels.d.ts +3 -0
  85. package/dist/cjs/Labels/defaultBoxOfficeLabels.d.ts.map +1 -0
  86. package/dist/cjs/Labels/defaultBoxOfficeLabels.js +120 -0
  87. package/dist/cjs/Labels/defaultBoxOfficeLabels.js.map +1 -0
  88. package/dist/cjs/Labels/format.d.ts +2 -0
  89. package/dist/cjs/Labels/format.d.ts.map +1 -0
  90. package/dist/cjs/Labels/format.js +15 -0
  91. package/dist/cjs/Labels/format.js.map +1 -0
  92. package/dist/cjs/Labels/index.d.ts +5 -0
  93. package/dist/cjs/Labels/index.d.ts.map +1 -0
  94. package/dist/cjs/Labels/resolveLabels.d.ts +3 -0
  95. package/dist/cjs/Labels/resolveLabels.d.ts.map +1 -0
  96. package/dist/cjs/Labels/resolveLabels.js +35 -0
  97. package/dist/cjs/Labels/resolveLabels.js.map +1 -0
  98. package/dist/cjs/Plan/PlanPage.d.ts +2 -0
  99. package/dist/cjs/Plan/PlanPage.d.ts.map +1 -0
  100. package/dist/cjs/Plan/PlanPage.js +24 -0
  101. package/dist/cjs/Plan/PlanPage.js.map +1 -0
  102. package/dist/cjs/Plan/PlanView.d.ts +10 -0
  103. package/dist/cjs/Plan/PlanView.d.ts.map +1 -0
  104. package/dist/cjs/Plan/PlanView.js +123 -0
  105. package/dist/cjs/Plan/PlanView.js.map +1 -0
  106. package/dist/cjs/Plan/index.d.ts +4 -0
  107. package/dist/cjs/Plan/index.d.ts.map +1 -0
  108. package/dist/cjs/Plan/planModels.d.ts +24 -0
  109. package/dist/cjs/Plan/planModels.d.ts.map +1 -0
  110. package/dist/cjs/Plan/planModels.js +83 -0
  111. package/dist/cjs/Plan/planModels.js.map +1 -0
  112. package/dist/cjs/Portal/PortalButton.d.ts +10 -0
  113. package/dist/cjs/Portal/PortalButton.d.ts.map +1 -0
  114. package/dist/cjs/Portal/PortalButton.js +37 -0
  115. package/dist/cjs/Portal/PortalButton.js.map +1 -0
  116. package/dist/cjs/Portal/index.d.ts +3 -0
  117. package/dist/cjs/Portal/index.d.ts.map +1 -0
  118. package/dist/cjs/Portal/portalLinks.d.ts +6 -0
  119. package/dist/cjs/Portal/portalLinks.d.ts.map +1 -0
  120. package/dist/cjs/Portal/portalLinks.js +34 -0
  121. package/dist/cjs/Portal/portalLinks.js.map +1 -0
  122. package/dist/cjs/Provider/BoxOfficeContext.d.ts +16 -0
  123. package/dist/cjs/Provider/BoxOfficeContext.d.ts.map +1 -0
  124. package/dist/cjs/Provider/BoxOfficeContext.js +34 -0
  125. package/dist/cjs/Provider/BoxOfficeContext.js.map +1 -0
  126. package/dist/cjs/Provider/BoxOfficeProvider.d.ts +15 -0
  127. package/dist/cjs/Provider/BoxOfficeProvider.d.ts.map +1 -0
  128. package/dist/cjs/Provider/BoxOfficeProvider.js +72 -0
  129. package/dist/cjs/Provider/BoxOfficeProvider.js.map +1 -0
  130. package/dist/cjs/Provider/index.d.ts +3 -0
  131. package/dist/cjs/Provider/index.d.ts.map +1 -0
  132. package/dist/cjs/Seats/AssignSeatDialog.d.ts +9 -0
  133. package/dist/cjs/Seats/AssignSeatDialog.d.ts.map +1 -0
  134. package/dist/cjs/Seats/AssignSeatDialog.js +99 -0
  135. package/dist/cjs/Seats/AssignSeatDialog.js.map +1 -0
  136. package/dist/cjs/Seats/SeatsPage.d.ts +2 -0
  137. package/dist/cjs/Seats/SeatsPage.d.ts.map +1 -0
  138. package/dist/cjs/Seats/SeatsPage.js +87 -0
  139. package/dist/cjs/Seats/SeatsPage.js.map +1 -0
  140. package/dist/cjs/Seats/SeatsView.d.ts +14 -0
  141. package/dist/cjs/Seats/SeatsView.d.ts.map +1 -0
  142. package/dist/cjs/Seats/SeatsView.js +111 -0
  143. package/dist/cjs/Seats/SeatsView.js.map +1 -0
  144. package/dist/cjs/Seats/index.d.ts +5 -0
  145. package/dist/cjs/Seats/index.d.ts.map +1 -0
  146. package/dist/cjs/Seats/seatModels.d.ts +23 -0
  147. package/dist/cjs/Seats/seatModels.d.ts.map +1 -0
  148. package/dist/cjs/Seats/seatModels.js +65 -0
  149. package/dist/cjs/Seats/seatModels.js.map +1 -0
  150. package/dist/cjs/Usage/UsagePage.d.ts +2 -0
  151. package/dist/cjs/Usage/UsagePage.d.ts.map +1 -0
  152. package/dist/cjs/Usage/UsagePage.js +26 -0
  153. package/dist/cjs/Usage/UsagePage.js.map +1 -0
  154. package/dist/cjs/Usage/UsageView.d.ts +9 -0
  155. package/dist/cjs/Usage/UsageView.d.ts.map +1 -0
  156. package/dist/cjs/Usage/UsageView.js +108 -0
  157. package/dist/cjs/Usage/UsageView.js.map +1 -0
  158. package/dist/cjs/Usage/index.d.ts +4 -0
  159. package/dist/cjs/Usage/index.d.ts.map +1 -0
  160. package/dist/cjs/Usage/usageModels.d.ts +17 -0
  161. package/dist/cjs/Usage/usageModels.d.ts.map +1 -0
  162. package/dist/cjs/Usage/usageModels.js +57 -0
  163. package/dist/cjs/Usage/usageModels.js.map +1 -0
  164. package/dist/cjs/formatting.d.ts +5 -0
  165. package/dist/cjs/formatting.d.ts.map +1 -0
  166. package/dist/cjs/formatting.js +46 -0
  167. package/dist/cjs/formatting.js.map +1 -0
  168. package/dist/cjs/index.d.ts +10 -0
  169. package/dist/cjs/index.d.ts.map +1 -0
  170. package/dist/cjs/index.js +85 -0
  171. package/dist/cjs/index.js.map +1 -0
  172. package/dist/cjs/package.json +3 -0
  173. package/dist/esm/Banners/NoLicense.d.ts +2 -0
  174. package/dist/esm/Banners/NoLicense.d.ts.map +1 -0
  175. package/dist/esm/Banners/NoLicense.js +48 -0
  176. package/dist/esm/Banners/NoLicense.js.map +1 -0
  177. package/dist/esm/Banners/SuspensionBanner.d.ts +7 -0
  178. package/dist/esm/Banners/SuspensionBanner.d.ts.map +1 -0
  179. package/dist/esm/Banners/SuspensionBanner.js +59 -0
  180. package/dist/esm/Banners/SuspensionBanner.js.map +1 -0
  181. package/dist/esm/Banners/TrialBanner.d.ts +2 -0
  182. package/dist/esm/Banners/TrialBanner.d.ts.map +1 -0
  183. package/dist/esm/Banners/TrialBanner.js +36 -0
  184. package/dist/esm/Banners/TrialBanner.js.map +1 -0
  185. package/dist/esm/Banners/bannerModels.d.ts +19 -0
  186. package/dist/esm/Banners/bannerModels.d.ts.map +1 -0
  187. package/dist/esm/Banners/bannerModels.js +96 -0
  188. package/dist/esm/Banners/bannerModels.js.map +1 -0
  189. package/dist/esm/Banners/index.d.ts +5 -0
  190. package/dist/esm/Banners/index.d.ts.map +1 -0
  191. package/dist/esm/Banners/index.js +5 -0
  192. package/dist/esm/Banners/index.js.map +1 -0
  193. package/dist/esm/Entitlements/EntitlementsContext.d.ts +4 -0
  194. package/dist/esm/Entitlements/EntitlementsContext.d.ts.map +1 -0
  195. package/dist/esm/Entitlements/EntitlementsContext.js +16 -0
  196. package/dist/esm/Entitlements/EntitlementsContext.js.map +1 -0
  197. package/dist/esm/Entitlements/RequiresModule.d.ts +9 -0
  198. package/dist/esm/Entitlements/RequiresModule.d.ts.map +1 -0
  199. package/dist/esm/Entitlements/RequiresModule.js +66 -0
  200. package/dist/esm/Entitlements/RequiresModule.js.map +1 -0
  201. package/dist/esm/Entitlements/entitlementModel.d.ts +25 -0
  202. package/dist/esm/Entitlements/entitlementModel.d.ts.map +1 -0
  203. package/dist/esm/Entitlements/entitlementModel.js +89 -0
  204. package/dist/esm/Entitlements/entitlementModel.js.map +1 -0
  205. package/dist/esm/Entitlements/index.d.ts +7 -0
  206. package/dist/esm/Entitlements/index.d.ts.map +1 -0
  207. package/dist/esm/Entitlements/index.js +7 -0
  208. package/dist/esm/Entitlements/index.js.map +1 -0
  209. package/dist/esm/Entitlements/moduleFilter.d.ts +6 -0
  210. package/dist/esm/Entitlements/moduleFilter.d.ts.map +1 -0
  211. package/dist/esm/Entitlements/moduleFilter.js +14 -0
  212. package/dist/esm/Entitlements/moduleFilter.js.map +1 -0
  213. package/dist/esm/Entitlements/requiresModuleModel.d.ts +10 -0
  214. package/dist/esm/Entitlements/requiresModuleModel.d.ts.map +1 -0
  215. package/dist/esm/Entitlements/requiresModuleModel.js +30 -0
  216. package/dist/esm/Entitlements/requiresModuleModel.js.map +1 -0
  217. package/dist/esm/Entitlements/useEntitlements.d.ts +5 -0
  218. package/dist/esm/Entitlements/useEntitlements.d.ts.map +1 -0
  219. package/dist/esm/Entitlements/useEntitlements.js +23 -0
  220. package/dist/esm/Entitlements/useEntitlements.js.map +1 -0
  221. package/dist/esm/Labels/BoxOfficeLabels.d.ts +116 -0
  222. package/dist/esm/Labels/BoxOfficeLabels.d.ts.map +1 -0
  223. package/dist/esm/Labels/BoxOfficeLabels.js +2 -0
  224. package/dist/esm/Labels/BoxOfficeLabels.js.map +1 -0
  225. package/dist/esm/Labels/defaultBoxOfficeLabels.d.ts +3 -0
  226. package/dist/esm/Labels/defaultBoxOfficeLabels.d.ts.map +1 -0
  227. package/dist/esm/Labels/defaultBoxOfficeLabels.js +118 -0
  228. package/dist/esm/Labels/defaultBoxOfficeLabels.js.map +1 -0
  229. package/dist/esm/Labels/format.d.ts +2 -0
  230. package/dist/esm/Labels/format.d.ts.map +1 -0
  231. package/dist/esm/Labels/format.js +13 -0
  232. package/dist/esm/Labels/format.js.map +1 -0
  233. package/dist/esm/Labels/index.d.ts +5 -0
  234. package/dist/esm/Labels/index.d.ts.map +1 -0
  235. package/dist/esm/Labels/index.js +5 -0
  236. package/dist/esm/Labels/index.js.map +1 -0
  237. package/dist/esm/Labels/resolveLabels.d.ts +3 -0
  238. package/dist/esm/Labels/resolveLabels.d.ts.map +1 -0
  239. package/dist/esm/Labels/resolveLabels.js +33 -0
  240. package/dist/esm/Labels/resolveLabels.js.map +1 -0
  241. package/dist/esm/Plan/PlanPage.d.ts +2 -0
  242. package/dist/esm/Plan/PlanPage.d.ts.map +1 -0
  243. package/dist/esm/Plan/PlanPage.js +22 -0
  244. package/dist/esm/Plan/PlanPage.js.map +1 -0
  245. package/dist/esm/Plan/PlanView.d.ts +10 -0
  246. package/dist/esm/Plan/PlanView.d.ts.map +1 -0
  247. package/dist/esm/Plan/PlanView.js +121 -0
  248. package/dist/esm/Plan/PlanView.js.map +1 -0
  249. package/dist/esm/Plan/index.d.ts +4 -0
  250. package/dist/esm/Plan/index.d.ts.map +1 -0
  251. package/dist/esm/Plan/index.js +4 -0
  252. package/dist/esm/Plan/index.js.map +1 -0
  253. package/dist/esm/Plan/planModels.d.ts +24 -0
  254. package/dist/esm/Plan/planModels.d.ts.map +1 -0
  255. package/dist/esm/Plan/planModels.js +78 -0
  256. package/dist/esm/Plan/planModels.js.map +1 -0
  257. package/dist/esm/Portal/PortalButton.d.ts +10 -0
  258. package/dist/esm/Portal/PortalButton.d.ts.map +1 -0
  259. package/dist/esm/Portal/PortalButton.js +35 -0
  260. package/dist/esm/Portal/PortalButton.js.map +1 -0
  261. package/dist/esm/Portal/index.d.ts +3 -0
  262. package/dist/esm/Portal/index.d.ts.map +1 -0
  263. package/dist/esm/Portal/index.js +3 -0
  264. package/dist/esm/Portal/index.js.map +1 -0
  265. package/dist/esm/Portal/portalLinks.d.ts +6 -0
  266. package/dist/esm/Portal/portalLinks.d.ts.map +1 -0
  267. package/dist/esm/Portal/portalLinks.js +31 -0
  268. package/dist/esm/Portal/portalLinks.js.map +1 -0
  269. package/dist/esm/Provider/BoxOfficeContext.d.ts +16 -0
  270. package/dist/esm/Provider/BoxOfficeContext.d.ts.map +1 -0
  271. package/dist/esm/Provider/BoxOfficeContext.js +29 -0
  272. package/dist/esm/Provider/BoxOfficeContext.js.map +1 -0
  273. package/dist/esm/Provider/BoxOfficeProvider.d.ts +15 -0
  274. package/dist/esm/Provider/BoxOfficeProvider.d.ts.map +1 -0
  275. package/dist/esm/Provider/BoxOfficeProvider.js +70 -0
  276. package/dist/esm/Provider/BoxOfficeProvider.js.map +1 -0
  277. package/dist/esm/Provider/index.d.ts +3 -0
  278. package/dist/esm/Provider/index.d.ts.map +1 -0
  279. package/dist/esm/Provider/index.js +3 -0
  280. package/dist/esm/Provider/index.js.map +1 -0
  281. package/dist/esm/Seats/AssignSeatDialog.d.ts +9 -0
  282. package/dist/esm/Seats/AssignSeatDialog.d.ts.map +1 -0
  283. package/dist/esm/Seats/AssignSeatDialog.js +97 -0
  284. package/dist/esm/Seats/AssignSeatDialog.js.map +1 -0
  285. package/dist/esm/Seats/SeatsPage.d.ts +2 -0
  286. package/dist/esm/Seats/SeatsPage.d.ts.map +1 -0
  287. package/dist/esm/Seats/SeatsPage.js +85 -0
  288. package/dist/esm/Seats/SeatsPage.js.map +1 -0
  289. package/dist/esm/Seats/SeatsView.d.ts +14 -0
  290. package/dist/esm/Seats/SeatsView.d.ts.map +1 -0
  291. package/dist/esm/Seats/SeatsView.js +109 -0
  292. package/dist/esm/Seats/SeatsView.js.map +1 -0
  293. package/dist/esm/Seats/index.d.ts +5 -0
  294. package/dist/esm/Seats/index.d.ts.map +1 -0
  295. package/dist/esm/Seats/index.js +5 -0
  296. package/dist/esm/Seats/index.js.map +1 -0
  297. package/dist/esm/Seats/seatModels.d.ts +23 -0
  298. package/dist/esm/Seats/seatModels.d.ts.map +1 -0
  299. package/dist/esm/Seats/seatModels.js +59 -0
  300. package/dist/esm/Seats/seatModels.js.map +1 -0
  301. package/dist/esm/Usage/UsagePage.d.ts +2 -0
  302. package/dist/esm/Usage/UsagePage.d.ts.map +1 -0
  303. package/dist/esm/Usage/UsagePage.js +24 -0
  304. package/dist/esm/Usage/UsagePage.js.map +1 -0
  305. package/dist/esm/Usage/UsageView.d.ts +9 -0
  306. package/dist/esm/Usage/UsageView.d.ts.map +1 -0
  307. package/dist/esm/Usage/UsageView.js +106 -0
  308. package/dist/esm/Usage/UsageView.js.map +1 -0
  309. package/dist/esm/Usage/index.d.ts +4 -0
  310. package/dist/esm/Usage/index.d.ts.map +1 -0
  311. package/dist/esm/Usage/index.js +4 -0
  312. package/dist/esm/Usage/index.js.map +1 -0
  313. package/dist/esm/Usage/usageModels.d.ts +17 -0
  314. package/dist/esm/Usage/usageModels.d.ts.map +1 -0
  315. package/dist/esm/Usage/usageModels.js +53 -0
  316. package/dist/esm/Usage/usageModels.js.map +1 -0
  317. package/dist/esm/formatting.d.ts +5 -0
  318. package/dist/esm/formatting.d.ts.map +1 -0
  319. package/dist/esm/formatting.js +42 -0
  320. package/dist/esm/formatting.js.map +1 -0
  321. package/dist/esm/index.d.ts +10 -0
  322. package/dist/esm/index.d.ts.map +1 -0
  323. package/dist/esm/index.js +29 -0
  324. package/dist/esm/index.js.map +1 -0
  325. package/dist/esm/package.json +3 -0
  326. package/formatting.ts +41 -0
  327. package/index.ts +12 -0
  328. package/package.json +84 -4
  329. package/styles.css +166 -0
@@ -0,0 +1,70 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ArcContext } from '@cratis/arc.react';
3
+ import { toast } from '@cratis/components/Notifications';
4
+ import { CurrentEntitlements, Mine } from '@cratis/showrunner.boxoffice';
5
+ import { useContext, useMemo } from 'react';
6
+ import { entitlementsOf } from '../Entitlements/entitlementModel.js';
7
+ import { EntitlementsContext } from '../Entitlements/EntitlementsContext.js';
8
+ import { resolveLabels } from '../Labels/resolveLabels.js';
9
+ import { linkToPortal, openInNewTab } from '../Portal/portalLinks.js';
10
+ import { BoxOfficeContext } from './BoxOfficeContext.js';
11
+
12
+ /**
13
+ * Slots Box Office into an application: asks the backend what the signed-in user's tenant may do and where the user
14
+ * stands with its seats, and gives {@link useEntitlements}, {@link RequiresModule}, the banners and the pages what they
15
+ * need. Render it inside `<Arc>` and a `CratisComponentsProvider` with a toaster, once, around the shell.
16
+ */ const BoxOfficeProvider = ({ labels, locale, entitlements: preloaded, seat: preloadedSeat, openLink = openInNewTab, portalLink, children })=>{
17
+ const arc = useContext(ArcContext);
18
+ const resolvedLabels = useMemo(()=>resolveLabels(labels), [
19
+ labels
20
+ ]);
21
+ const [summaryResult, refreshSummary] = CurrentEntitlements.when(preloaded === undefined).use();
22
+ const [seatResult, refreshSeat] = Mine.when(preloadedSeat === undefined).use();
23
+ const summary = preloaded ?? (summaryResult.isSuccess && summaryResult.data?.modules ? summaryResult.data : undefined);
24
+ const seat = preloadedSeat ?? (seatResult.isSuccess && seatResult.data?.status !== undefined ? seatResult.data : undefined);
25
+ const entitlements = useMemo(()=>entitlementsOf(summary), [
26
+ summary
27
+ ]);
28
+ const value = useMemo(()=>({
29
+ isProvided: true,
30
+ labels: resolvedLabels,
31
+ locale,
32
+ seat,
33
+ openPortal: async (intent, offer)=>{
34
+ try {
35
+ const url = await (portalLink ? portalLink(intent, offer) : linkToPortal(arc, intent, offer));
36
+ if (url) {
37
+ openLink(url);
38
+ return;
39
+ }
40
+ } catch {
41
+ /* The toast below says what went wrong; the details are of no use to the user. */ }
42
+ toast.error({
43
+ title: resolvedLabels.common.portalFailed
44
+ });
45
+ },
46
+ refresh: ()=>{
47
+ void refreshSummary();
48
+ void refreshSeat();
49
+ }
50
+ }), [
51
+ resolvedLabels,
52
+ locale,
53
+ seat,
54
+ arc,
55
+ openLink,
56
+ portalLink,
57
+ refreshSummary,
58
+ refreshSeat
59
+ ]);
60
+ return /*#__PURE__*/ jsx(BoxOfficeContext.Provider, {
61
+ value: value,
62
+ children: /*#__PURE__*/ jsx(EntitlementsContext.Provider, {
63
+ value: entitlements,
64
+ children: children
65
+ })
66
+ });
67
+ };
68
+
69
+ export { BoxOfficeProvider };
70
+ //# sourceMappingURL=BoxOfficeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoxOfficeProvider.js","sources":["../../../Provider/BoxOfficeProvider.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ArcContext } from '@cratis/arc.react';\nimport { toast } from '@cratis/components/Notifications';\nimport { Guid } from '@cratis/fundamentals';\nimport { CurrentEntitlements, EntitlementSummary, Mine, PortalIntent, SeatStanding } from '@cratis/showrunner.boxoffice';\nimport { ReactNode, useContext, useMemo } from 'react';\nimport { entitlementsOf } from '../Entitlements/entitlementModel.js';\nimport { EntitlementsContext } from '../Entitlements/EntitlementsContext.js';\nimport { BoxOfficeLabelOverrides, resolveLabels } from '../Labels/index.js';\nimport { linkToPortal, openInNewTab } from '../Portal/portalLinks.js';\nimport { BoxOfficeContext, BoxOfficeContextValue } from './BoxOfficeContext.js';\n\n/**\n * Props for {@link BoxOfficeProvider}.\n */\nexport interface BoxOfficeProviderProps {\n /** The labels that replace the English defaults, for instance to localize them. */\n labels?: BoxOfficeLabelOverrides;\n\n /** The locale to format dates and numbers for; the browser's when not given. */\n locale?: string;\n\n /**\n * The entitlements to use instead of asking the backend. For stories, specifications and previews; leave it out in\n * the application.\n */\n entitlements?: EntitlementSummary;\n\n /**\n * Where the user stands with the tenant's seats, to use instead of asking the backend. For stories,\n * specifications and previews; leave it out in the application.\n */\n seat?: SeatStanding;\n\n /** Opens a link to the customer portal. Defaults to opening it in a new tab. */\n openLink?: (url: string) => void;\n\n /**\n * Gets the link that opens the customer portal, instead of asking the backend for a signed one. For stories and\n * specifications; leave it out in the application.\n */\n portalLink?: (intent: PortalIntent, offer?: Guid) => Promise<string | undefined>;\n\n /** The application. */\n children?: ReactNode;\n}\n\n/**\n * Slots Box Office into an application: asks the backend what the signed-in user's tenant may do and where the user\n * stands with its seats, and gives {@link useEntitlements}, {@link RequiresModule}, the banners and the pages what they\n * need. Render it inside `<Arc>` and a `CratisComponentsProvider` with a toaster, once, around the shell.\n */\nexport const BoxOfficeProvider = ({ labels, locale, entitlements: preloaded, seat: preloadedSeat, openLink = openInNewTab, portalLink, children }: BoxOfficeProviderProps) => {\n const arc = useContext(ArcContext);\n const resolvedLabels = useMemo(() => resolveLabels(labels), [labels]);\n const [summaryResult, refreshSummary] = CurrentEntitlements.when(preloaded === undefined).use();\n const [seatResult, refreshSeat] = Mine.when(preloadedSeat === undefined).use();\n\n const summary = preloaded ?? (summaryResult.isSuccess && summaryResult.data?.modules ? summaryResult.data : undefined);\n const seat = preloadedSeat ?? (seatResult.isSuccess && seatResult.data?.status !== undefined ? seatResult.data : undefined);\n const entitlements = useMemo(() => entitlementsOf(summary), [summary]);\n\n const value = useMemo<BoxOfficeContextValue>(() => ({\n isProvided: true,\n labels: resolvedLabels,\n locale,\n seat,\n openPortal: async (intent: PortalIntent, offer?: Guid) => {\n try {\n const url = await (portalLink ? portalLink(intent, offer) : linkToPortal(arc, intent, offer));\n if (url) {\n openLink(url);\n return;\n }\n } catch {\n /* The toast below says what went wrong; the details are of no use to the user. */\n }\n\n toast.error({ title: resolvedLabels.common.portalFailed });\n },\n refresh: () => {\n void refreshSummary();\n void refreshSeat();\n }\n }), [resolvedLabels, locale, seat, arc, openLink, portalLink, refreshSummary, refreshSeat]);\n\n return (\n <BoxOfficeContext.Provider value={value}>\n <EntitlementsContext.Provider value={entitlements}>\n {children}\n </EntitlementsContext.Provider>\n </BoxOfficeContext.Provider>\n );\n};\n"],"names":["BoxOfficeProvider","labels","locale","entitlements","preloaded","seat","preloadedSeat","openLink","openInNewTab","portalLink","children","arc","useContext","ArcContext","resolvedLabels","useMemo","resolveLabels","summaryResult","refreshSummary","CurrentEntitlements","when","undefined","use","seatResult","refreshSeat","Mine","summary","isSuccess","data","modules","status","entitlementsOf","value","isProvided","openPortal","intent","offer","url","linkToPortal","toast","error","title","common","portalFailed","refresh","_jsx","BoxOfficeContext","Provider","EntitlementsContext"],"mappings":";;;;;;;;;;;AAiDA;;;;UAKaA,iBAAAA,GAAoB,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAEC,YAAAA,EAAcC,SAAS,EAAEC,IAAAA,EAAMC,aAAa,EAAEC,QAAAA,GAAWC,YAAY,EAAEC,UAAU,EAAEC,QAAQ,EAA0B,GAAA;AACrK,IAAA,MAAMC,MAAMC,UAAAA,CAAWC,UAAAA,CAAAA;AACvB,IAAA,MAAMC,cAAAA,GAAiBC,OAAAA,CAAQ,IAAMC,aAAAA,CAAcf,MAAAA,CAAAA,EAAS;AAACA,QAAAA;AAAO,KAAA,CAAA;IACpE,MAAM,CAACgB,eAAeC,cAAAA,CAAe,GAAGC,oBAAoBC,IAAI,CAAChB,SAAAA,KAAciB,SAAAA,CAAAA,CAAWC,GAAG,EAAA;IAC7F,MAAM,CAACC,YAAYC,WAAAA,CAAY,GAAGC,KAAKL,IAAI,CAACd,aAAAA,KAAkBe,SAAAA,CAAAA,CAAWC,GAAG,EAAA;AAE5E,IAAA,MAAMI,OAAAA,GAAUtB,SAAAA,KAAca,aAAAA,CAAcU,SAAS,IAAIV,aAAAA,CAAcW,IAAI,EAAEC,OAAAA,GAAUZ,aAAAA,CAAcW,IAAI,GAAGP,SAAQ,CAAA;AACpH,IAAA,MAAMhB,IAAAA,GAAOC,aAAAA,KAAkBiB,UAAAA,CAAWI,SAAS,IAAIJ,UAAAA,CAAWK,IAAI,EAAEE,MAAAA,KAAWT,SAAAA,GAAYE,UAAAA,CAAWK,IAAI,GAAGP,SAAQ,CAAA;AACzH,IAAA,MAAMlB,YAAAA,GAAeY,OAAAA,CAAQ,IAAMgB,cAAAA,CAAeL,OAAAA,CAAAA,EAAU;AAACA,QAAAA;AAAQ,KAAA,CAAA;IAErE,MAAMM,KAAAA,GAAQjB,OAAAA,CAA+B,KAAO;YAChDkB,UAAAA,EAAY,IAAA;YACZhC,MAAAA,EAAQa,cAAAA;AACRZ,YAAAA,MAAAA;AACAG,YAAAA,IAAAA;AACA6B,YAAAA,UAAAA,EAAY,OAAOC,MAAAA,EAAsBC,KAAAA,GAAAA;gBACrC,IAAI;oBACA,MAAMC,GAAAA,GAAM,OAAO5B,UAAAA,GAAaA,UAAAA,CAAW0B,QAAQC,KAAAA,CAAAA,GAASE,YAAAA,CAAa3B,GAAAA,EAAKwB,MAAAA,EAAQC,KAAAA,CAAK,CAAA;AAC3F,oBAAA,IAAIC,GAAAA,EAAK;wBACL9B,QAAAA,CAAS8B,GAAAA,CAAAA;AACT,wBAAA;AACJ,oBAAA;AACJ,gBAAA,CAAA,CAAE,OAAM;AACJ,mGACJ;AAEAE,gBAAAA,KAAAA,CAAMC,KAAK,CAAC;oBAAEC,KAAAA,EAAO3B,cAAAA,CAAe4B,MAAM,CAACC;AAAa,iBAAA,CAAA;AAC5D,YAAA,CAAA;YACAC,OAAAA,EAAS,IAAA;gBACL,KAAK1B,cAAAA,EAAAA;gBACL,KAAKM,WAAAA,EAAAA;AACT,YAAA;AACJ,SAAA,CAAA,EAAI;AAACV,QAAAA,cAAAA;AAAgBZ,QAAAA,MAAAA;AAAQG,QAAAA,IAAAA;AAAMM,QAAAA,GAAAA;AAAKJ,QAAAA,QAAAA;AAAUE,QAAAA,UAAAA;AAAYS,QAAAA,cAAAA;AAAgBM,QAAAA;AAAY,KAAA,CAAA;IAE1F,qBACIqB,GAAA,CAACC,iBAAiBC,QAAQ,EAAA;QAACf,KAAAA,EAAOA,KAAAA;gCAC9Ba,GAAA,CAACG,oBAAoBD,QAAQ,EAAA;YAACf,KAAAA,EAAO7B,YAAAA;AAChCO,YAAAA,QAAAA,EAAAA;;;AAIjB;;"}
@@ -0,0 +1,3 @@
1
+ export * from './BoxOfficeContext.js';
2
+ export * from './BoxOfficeProvider.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Provider/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './BoxOfficeContext.js';
2
+ export * from './BoxOfficeProvider.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../Provider/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { SeatPersonInput } from './seatModels.js';
2
+ export interface AssignSeatDialogProps {
3
+ visible: boolean;
4
+ isBusy?: boolean;
5
+ onAssign: (person: SeatPersonInput) => void;
6
+ onClose: () => void;
7
+ }
8
+ export declare const AssignSeatDialog: ({ visible, isBusy, onAssign, onClose }: AssignSeatDialogProps) => import("react").JSX.Element;
9
+ //# sourceMappingURL=AssignSeatDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssignSeatDialog.d.ts","sourceRoot":"","sources":["../../../Seats/AssignSeatDialog.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAsC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKtF,MAAM,WAAW,qBAAqB;IAElC,OAAO,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAG5C,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAKD,eAAO,MAAM,gBAAgB,GAAI,wCAAwC,qBAAqB,gCA0C7F,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { DialogResult } from '@cratis/arc.react/dialogs';
3
+ import { TextInput } from '@cratis/components/Common';
4
+ import { Dialog, DialogInitialFocus } from '@cratis/components/Dialogs';
5
+ import { useState } from 'react';
6
+ import { useBoxOfficeLabels } from '../Provider/BoxOfficeContext.js';
7
+ import { emptySeatPerson, isValidSeatPerson } from './seatModels.js';
8
+
9
+ /**
10
+ * Asks who to give a seat.
11
+ */ const AssignSeatDialog = ({ visible, isBusy, onAssign, onClose })=>{
12
+ const labels = useBoxOfficeLabels();
13
+ const [person, setPerson] = useState(emptySeatPerson);
14
+ const change = (field)=>(value)=>setPerson((current)=>({
15
+ ...current,
16
+ [field]: value
17
+ }));
18
+ return /*#__PURE__*/ jsx(Dialog, {
19
+ title: labels.seats.assignTitle,
20
+ visible: visible,
21
+ okLabel: labels.seats.assignConfirm,
22
+ cancelLabel: labels.common.cancel,
23
+ closeAriaLabel: labels.common.close,
24
+ initialFocus: DialogInitialFocus.Content,
25
+ isValid: isValidSeatPerson(person),
26
+ isBusy: isBusy,
27
+ onConfirm: ()=>onAssign(person),
28
+ onClose: (result)=>{
29
+ if (result !== DialogResult.Ok) {
30
+ setPerson(emptySeatPerson);
31
+ onClose();
32
+ }
33
+ },
34
+ children: /*#__PURE__*/ jsxs("form", {
35
+ className: "boxoffice-seat-form",
36
+ onSubmit: (event)=>event.preventDefault(),
37
+ children: [
38
+ /*#__PURE__*/ jsxs("label", {
39
+ className: "boxoffice-field",
40
+ children: [
41
+ /*#__PURE__*/ jsx("span", {
42
+ children: labels.seats.name
43
+ }),
44
+ /*#__PURE__*/ jsx(TextInput, {
45
+ value: person.name,
46
+ onChange: change('name'),
47
+ autoComplete: "off"
48
+ })
49
+ ]
50
+ }),
51
+ /*#__PURE__*/ jsxs("label", {
52
+ className: "boxoffice-field",
53
+ children: [
54
+ /*#__PURE__*/ jsx("span", {
55
+ children: labels.seats.email
56
+ }),
57
+ /*#__PURE__*/ jsx(TextInput, {
58
+ type: "email",
59
+ value: person.email,
60
+ onChange: change('email'),
61
+ autoComplete: "off"
62
+ })
63
+ ]
64
+ }),
65
+ /*#__PURE__*/ jsxs("label", {
66
+ className: "boxoffice-field",
67
+ children: [
68
+ /*#__PURE__*/ jsx("span", {
69
+ children: labels.seats.identityProvider
70
+ }),
71
+ /*#__PURE__*/ jsx(TextInput, {
72
+ value: person.identityProvider,
73
+ onChange: change('identityProvider'),
74
+ autoComplete: "off"
75
+ })
76
+ ]
77
+ }),
78
+ /*#__PURE__*/ jsxs("label", {
79
+ className: "boxoffice-field",
80
+ children: [
81
+ /*#__PURE__*/ jsx("span", {
82
+ children: labels.seats.subject
83
+ }),
84
+ /*#__PURE__*/ jsx(TextInput, {
85
+ value: person.subject,
86
+ onChange: change('subject'),
87
+ autoComplete: "off"
88
+ })
89
+ ]
90
+ })
91
+ ]
92
+ })
93
+ });
94
+ };
95
+
96
+ export { AssignSeatDialog };
97
+ //# sourceMappingURL=AssignSeatDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssignSeatDialog.js","sources":["../../../Seats/AssignSeatDialog.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { DialogResult } from '@cratis/arc.react/dialogs';\nimport { TextInput } from '@cratis/components/Common';\nimport { Dialog, DialogInitialFocus } from '@cratis/components/Dialogs';\nimport { useState } from 'react';\nimport { useBoxOfficeLabels } from '../Provider/BoxOfficeContext.js';\nimport { emptySeatPerson, isValidSeatPerson, SeatPersonInput } from './seatModels.js';\n\n/**\n * Props for {@link AssignSeatDialog}.\n */\nexport interface AssignSeatDialogProps {\n /** Whether the dialog is open. */\n visible: boolean;\n\n /** Whether the seat is being assigned. */\n isBusy?: boolean;\n\n /** Called when the user confirms, with the person to give a seat. */\n onAssign: (person: SeatPersonInput) => void;\n\n /** Called when the user closes the dialog. */\n onClose: () => void;\n}\n\n/**\n * Asks who to give a seat.\n */\nexport const AssignSeatDialog = ({ visible, isBusy, onAssign, onClose }: AssignSeatDialogProps) => {\n const labels = useBoxOfficeLabels();\n const [person, setPerson] = useState<SeatPersonInput>(emptySeatPerson);\n const change = (field: keyof SeatPersonInput) => (value: string) => setPerson(current => ({ ...current, [field]: value }));\n\n return (\n <Dialog\n title={labels.seats.assignTitle}\n visible={visible}\n okLabel={labels.seats.assignConfirm}\n cancelLabel={labels.common.cancel}\n closeAriaLabel={labels.common.close}\n initialFocus={DialogInitialFocus.Content}\n isValid={isValidSeatPerson(person)}\n isBusy={isBusy}\n onConfirm={() => onAssign(person)}\n onClose={result => {\n if (result !== DialogResult.Ok) {\n setPerson(emptySeatPerson);\n onClose();\n }\n }}>\n <form className='boxoffice-seat-form' onSubmit={event => event.preventDefault()}>\n <label className='boxoffice-field'>\n <span>{labels.seats.name}</span>\n <TextInput value={person.name} onChange={change('name')} autoComplete='off' />\n </label>\n <label className='boxoffice-field'>\n <span>{labels.seats.email}</span>\n <TextInput type='email' value={person.email} onChange={change('email')} autoComplete='off' />\n </label>\n <label className='boxoffice-field'>\n <span>{labels.seats.identityProvider}</span>\n <TextInput value={person.identityProvider} onChange={change('identityProvider')} autoComplete='off' />\n </label>\n <label className='boxoffice-field'>\n <span>{labels.seats.subject}</span>\n <TextInput value={person.subject} onChange={change('subject')} autoComplete='off' />\n </label>\n </form>\n </Dialog>\n );\n};\n"],"names":["AssignSeatDialog","visible","isBusy","onAssign","onClose","labels","useBoxOfficeLabels","person","setPerson","useState","emptySeatPerson","change","field","value","current","_jsx","Dialog","title","seats","assignTitle","okLabel","assignConfirm","cancelLabel","common","cancel","closeAriaLabel","close","initialFocus","DialogInitialFocus","Content","isValid","isValidSeatPerson","onConfirm","result","DialogResult","Ok","_jsxs","form","className","onSubmit","event","preventDefault","label","span","name","TextInput","onChange","autoComplete","email","type","identityProvider","subject"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const SeatsPage: () => import("react").JSX.Element;
2
+ //# sourceMappingURL=SeatsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatsPage.d.ts","sourceRoot":"","sources":["../../../Seats/SeatsPage.tsx"],"names":[],"mappings":"AAmBA,eAAO,MAAM,SAAS,mCAiErB,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useConfirmationDialog, DialogButtons, DialogResult } from '@cratis/arc.react/dialogs';
3
+ import { toastCommandResult } from '@cratis/components/Notifications';
4
+ import { CurrentRoster, AssignSeat, ReleaseSeat, SeatHolder } from '@cratis/showrunner.boxoffice';
5
+ import { useState } from 'react';
6
+ import { useEntitlementsContext } from '../Entitlements/EntitlementsContext.js';
7
+ import { format } from '../Labels/format.js';
8
+ import { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';
9
+ import { AssignSeatDialog } from './AssignSeatDialog.js';
10
+ import { seatRows, seatSummary, personOf } from './seatModels.js';
11
+ import { SeatsView } from './SeatsView.js';
12
+
13
+ /**
14
+ * The seats page: who holds the tenant's seats, with buttons to assign and release them. For the people who maintain
15
+ * the product; the backend refuses everyone else. Render it inside a {@link BoxOfficeProvider}, the `DialogComponents`
16
+ * registration and a `CratisComponentsProvider` with a toaster.
17
+ */ const SeatsPage = ()=>{
18
+ const { labels, refresh } = useBoxOfficeContext();
19
+ const entitlements = useEntitlementsContext();
20
+ const [roster, performRoster] = CurrentRoster.use();
21
+ const [assignSeat] = AssignSeat.use();
22
+ const [releaseSeat] = ReleaseSeat.use();
23
+ const [confirm] = useConfirmationDialog();
24
+ const [isAssigning, setIsAssigning] = useState(false);
25
+ const [isBusy, setIsBusy] = useState(false);
26
+ const rows = seatRows(roster.isSuccess ? roster.data : undefined, entitlements.seats);
27
+ const changed = ()=>{
28
+ void performRoster();
29
+ refresh();
30
+ };
31
+ const assign = async (input)=>{
32
+ setIsBusy(true);
33
+ try {
34
+ assignSeat.holder = personOf(input);
35
+ if (toastCommandResult(await assignSeat.execute(), {
36
+ successTitle: labels.seats.assignConfirm
37
+ })) {
38
+ setIsAssigning(false);
39
+ changed();
40
+ }
41
+ } finally{
42
+ setIsBusy(false);
43
+ }
44
+ };
45
+ const release = async (holding)=>{
46
+ const answer = await confirm(labels.seats.releaseTitle, format(labels.seats.releaseMessage, {
47
+ name: holding.holder.name
48
+ }), DialogButtons.YesNo);
49
+ if (answer !== DialogResult.Yes) {
50
+ return;
51
+ }
52
+ const holder = new SeatHolder();
53
+ holder.identityProvider = holding.holder.identityProvider;
54
+ holder.subject = holding.holder.identityProviderSubject;
55
+ releaseSeat.holder = holder;
56
+ if (toastCommandResult(await releaseSeat.execute(), {
57
+ showSuccess: false
58
+ })) {
59
+ changed();
60
+ }
61
+ };
62
+ return /*#__PURE__*/ jsxs(Fragment, {
63
+ children: [
64
+ /*#__PURE__*/ jsx(SeatsView, {
65
+ rows: rows,
66
+ summary: seatSummary(rows, entitlements.seats),
67
+ isReadOnly: entitlements.isReadOnly,
68
+ isLoading: roster.isPerforming && !roster.isSuccess,
69
+ isUnauthorized: !roster.isAuthorized,
70
+ hasFailed: !roster.isPerforming && roster.isAuthorized && !roster.isSuccess,
71
+ onAssign: ()=>setIsAssigning(true),
72
+ onRelease: (holding)=>void release(holding)
73
+ }),
74
+ /*#__PURE__*/ jsx(AssignSeatDialog, {
75
+ visible: isAssigning,
76
+ isBusy: isBusy,
77
+ onAssign: (input)=>void assign(input),
78
+ onClose: ()=>setIsAssigning(false)
79
+ })
80
+ ]
81
+ });
82
+ };
83
+
84
+ export { SeatsPage };
85
+ //# sourceMappingURL=SeatsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatsPage.js","sources":["../../../Seats/SeatsPage.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { DialogButtons, DialogResult, useConfirmationDialog } from '@cratis/arc.react/dialogs';\nimport { toastCommandResult } from '@cratis/components/Notifications';\nimport { AssignSeat, CurrentRoster, ReleaseSeat, SeatHolder, SeatHolding } from '@cratis/showrunner.boxoffice';\nimport { useState } from 'react';\nimport { useEntitlementsContext } from '../Entitlements/EntitlementsContext.js';\nimport { format } from '../Labels/index.js';\nimport { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';\nimport { AssignSeatDialog } from './AssignSeatDialog.js';\nimport { personOf, seatRows, seatSummary, SeatPersonInput } from './seatModels.js';\nimport { SeatsView } from './SeatsView.js';\n\n/**\n * The seats page: who holds the tenant's seats, with buttons to assign and release them. For the people who maintain\n * the product; the backend refuses everyone else. Render it inside a {@link BoxOfficeProvider}, the `DialogComponents`\n * registration and a `CratisComponentsProvider` with a toaster.\n */\nexport const SeatsPage = () => {\n const { labels, refresh } = useBoxOfficeContext();\n const entitlements = useEntitlementsContext();\n const [roster, performRoster] = CurrentRoster.use();\n const [assignSeat] = AssignSeat.use();\n const [releaseSeat] = ReleaseSeat.use();\n const [confirm] = useConfirmationDialog();\n const [isAssigning, setIsAssigning] = useState(false);\n const [isBusy, setIsBusy] = useState(false);\n\n const rows = seatRows(roster.isSuccess ? roster.data : undefined, entitlements.seats);\n const changed = () => {\n void performRoster();\n refresh();\n };\n\n const assign = async (input: SeatPersonInput) => {\n setIsBusy(true);\n try {\n assignSeat.holder = personOf(input);\n if (toastCommandResult(await assignSeat.execute(), { successTitle: labels.seats.assignConfirm })) {\n setIsAssigning(false);\n changed();\n }\n } finally {\n setIsBusy(false);\n }\n };\n\n const release = async (holding: SeatHolding) => {\n const answer = await confirm(\n labels.seats.releaseTitle,\n format(labels.seats.releaseMessage, { name: holding.holder.name }),\n DialogButtons.YesNo);\n if (answer !== DialogResult.Yes) {\n return;\n }\n\n const holder = new SeatHolder();\n holder.identityProvider = holding.holder.identityProvider;\n holder.subject = holding.holder.identityProviderSubject;\n releaseSeat.holder = holder;\n if (toastCommandResult(await releaseSeat.execute(), { showSuccess: false })) {\n changed();\n }\n };\n\n return (\n <>\n <SeatsView\n rows={rows}\n summary={seatSummary(rows, entitlements.seats)}\n isReadOnly={entitlements.isReadOnly}\n isLoading={roster.isPerforming && !roster.isSuccess}\n isUnauthorized={!roster.isAuthorized}\n hasFailed={!roster.isPerforming && roster.isAuthorized && !roster.isSuccess}\n onAssign={() => setIsAssigning(true)}\n onRelease={holding => void release(holding)} />\n <AssignSeatDialog\n visible={isAssigning}\n isBusy={isBusy}\n onAssign={input => void assign(input)}\n onClose={() => setIsAssigning(false)} />\n </>\n );\n};\n"],"names":["SeatsPage","labels","refresh","useBoxOfficeContext","entitlements","useEntitlementsContext","roster","performRoster","CurrentRoster","use","assignSeat","AssignSeat","releaseSeat","ReleaseSeat","confirm","useConfirmationDialog","isAssigning","setIsAssigning","useState","isBusy","setIsBusy","rows","seatRows","isSuccess","data","undefined","seats","changed","assign","input","holder","personOf","toastCommandResult","execute","successTitle","assignConfirm","release","holding","answer","releaseTitle","format","releaseMessage","name","DialogButtons","YesNo","DialogResult","Yes","SeatHolder","identityProvider","subject","identityProviderSubject","showSuccess","_jsxs","_Fragment","_jsx","SeatsView","summary","seatSummary","isReadOnly","isLoading","isPerforming","isUnauthorized","isAuthorized","hasFailed","onAssign","onRelease","AssignSeatDialog","visible","onClose"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { SeatHolding } from '@cratis/showrunner.boxoffice';
2
+ import { SeatRow, SeatSummary } from './seatModels.js';
3
+ export interface SeatsViewProps {
4
+ rows: readonly SeatRow[];
5
+ summary: SeatSummary;
6
+ isReadOnly: boolean;
7
+ isLoading?: boolean;
8
+ isUnauthorized?: boolean;
9
+ hasFailed?: boolean;
10
+ onAssign: () => void;
11
+ onRelease: (holding: SeatHolding) => void;
12
+ }
13
+ export declare const SeatsView: ({ rows, summary, isReadOnly, isLoading, isUnauthorized, hasFailed, onAssign, onRelease }: SeatsViewProps) => import("react").JSX.Element;
14
+ //# sourceMappingURL=SeatsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatsView.d.ts","sourceRoot":"","sources":["../../../Seats/SeatsView.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKvD,MAAM,WAAW,cAAc;IAE3B,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IAGzB,OAAO,EAAE,WAAW,CAAC;IAGrB,UAAU,EAAE,OAAO,CAAC;IAGpB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IAGrB,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;CAC7C;AAiBD,eAAO,MAAM,SAAS,GAAI,0FAA0F,cAAc,gCAmDjI,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Button } from '@cratis/components/Common';
3
+ import { DataTableCore, Column, DataTableStatus } from '@cratis/components/DataTables';
4
+ import { Message, Tag } from '@cratis/components/Display';
5
+ import { formatDay } from '../formatting.js';
6
+ import { format } from '../Labels/format.js';
7
+ import { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';
8
+
9
+ const statusOf = (isLoading, isUnauthorized, hasFailed)=>{
10
+ if (isUnauthorized) {
11
+ return DataTableStatus.Unauthorized;
12
+ }
13
+ if (hasFailed) {
14
+ return DataTableStatus.Failed;
15
+ }
16
+ return isLoading ? DataTableStatus.Loading : DataTableStatus.Ready;
17
+ };
18
+ /**
19
+ * The seats of the tenant: how many are used, who holds them, and buttons to assign and release.
20
+ */ const SeatsView = ({ rows, summary, isReadOnly, isLoading, isUnauthorized, hasFailed, onAssign, onRelease })=>{
21
+ const { labels, locale } = useBoxOfficeContext();
22
+ return /*#__PURE__*/ jsxs("section", {
23
+ className: "boxoffice-seats",
24
+ "aria-labelledby": "boxoffice-seats-title",
25
+ children: [
26
+ /*#__PURE__*/ jsxs("header", {
27
+ className: "boxoffice-page__header",
28
+ children: [
29
+ /*#__PURE__*/ jsx("h2", {
30
+ id: "boxoffice-seats-title",
31
+ className: "boxoffice-page__title",
32
+ children: labels.seats.title
33
+ }),
34
+ /*#__PURE__*/ jsx(Button, {
35
+ label: labels.seats.assign,
36
+ disabled: isReadOnly || summary.capacity === 0,
37
+ onClick: onAssign
38
+ })
39
+ ]
40
+ }),
41
+ /*#__PURE__*/ jsx("p", {
42
+ className: "boxoffice-seats__summary",
43
+ children: summary.capacity === 0 ? labels.seats.noCapacity : format(labels.seats.summary, {
44
+ held: summary.held,
45
+ capacity: summary.capacity
46
+ })
47
+ }),
48
+ summary.over > 0 && /*#__PURE__*/ jsx(Message, {
49
+ severity: "warn",
50
+ children: format(labels.seats.overCapacity, {
51
+ over: summary.over
52
+ })
53
+ }),
54
+ isReadOnly && /*#__PURE__*/ jsx(Message, {
55
+ severity: "info",
56
+ children: labels.seats.readOnly
57
+ }),
58
+ /*#__PURE__*/ jsxs(DataTableCore, {
59
+ data: [
60
+ ...rows
61
+ ],
62
+ dataKey: "holding.holder.identityProviderSubject",
63
+ status: statusOf(isLoading, isUnauthorized, hasFailed),
64
+ emptyMessage: labels.seats.empty,
65
+ loadingMessage: labels.common.loading,
66
+ failureMessage: labels.common.failed,
67
+ unauthorizedMessage: labels.common.unauthorized,
68
+ children: [
69
+ /*#__PURE__*/ jsx(Column, {
70
+ header: labels.seats.holderColumn,
71
+ body: (row)=>row.holding.holder.name
72
+ }),
73
+ /*#__PURE__*/ jsx(Column, {
74
+ header: labels.seats.emailColumn,
75
+ body: (row)=>row.holding.holder.email
76
+ }),
77
+ /*#__PURE__*/ jsx(Column, {
78
+ header: labels.seats.assignedColumn,
79
+ body: (row)=>formatDay(row.holding.assignedAt, locale)
80
+ }),
81
+ /*#__PURE__*/ jsx(Column, {
82
+ header: labels.seats.statusColumn,
83
+ body: (row)=>/*#__PURE__*/ jsx(Tag, {
84
+ severity: row.coverage === 'licensed' ? 'success' : 'warn',
85
+ value: row.coverage === 'licensed' ? labels.seats.licensed : labels.seats.overCapacityStatus
86
+ })
87
+ }),
88
+ /*#__PURE__*/ jsx(Column, {
89
+ header: "",
90
+ body: (row)=>/*#__PURE__*/ jsx(Button, {
91
+ variant: "ghost",
92
+ tone: "critical",
93
+ size: "small",
94
+ label: labels.seats.releaseShort,
95
+ "aria-label": format(labels.seats.release, {
96
+ name: row.holding.holder.name
97
+ }),
98
+ disabled: isReadOnly,
99
+ onClick: ()=>onRelease(row.holding)
100
+ })
101
+ })
102
+ ]
103
+ })
104
+ ]
105
+ });
106
+ };
107
+
108
+ export { SeatsView };
109
+ //# sourceMappingURL=SeatsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeatsView.js","sources":["../../../Seats/SeatsView.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Button } from '@cratis/components/Common';\nimport { Column, DataTableCore, DataTableStatus } from '@cratis/components/DataTables';\nimport { Message, Tag } from '@cratis/components/Display';\nimport { SeatHolding } from '@cratis/showrunner.boxoffice';\nimport { formatDay } from '../formatting.js';\nimport { format } from '../Labels/index.js';\nimport { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';\nimport { SeatRow, SeatSummary } from './seatModels.js';\n\n/**\n * Props for {@link SeatsView}.\n */\nexport interface SeatsViewProps {\n /** The seats, oldest first. */\n rows: readonly SeatRow[];\n\n /** What to summarize. */\n summary: SeatSummary;\n\n /** Whether the tenant is read-only, so seats cannot be changed. */\n isReadOnly: boolean;\n\n /** Whether the seats are still loading. */\n isLoading?: boolean;\n\n /** Whether the seats could not be loaded because the user may not see them. */\n isUnauthorized?: boolean;\n\n /** Whether the seats could not be loaded. */\n hasFailed?: boolean;\n\n /** Called when the user wants to assign a seat. */\n onAssign: () => void;\n\n /** Called when the user wants to release a seat. */\n onRelease: (holding: SeatHolding) => void;\n}\n\nconst statusOf = (isLoading?: boolean, isUnauthorized?: boolean, hasFailed?: boolean) => {\n if (isUnauthorized) {\n return DataTableStatus.Unauthorized;\n }\n\n if (hasFailed) {\n return DataTableStatus.Failed;\n }\n\n return isLoading ? DataTableStatus.Loading : DataTableStatus.Ready;\n};\n\n/**\n * The seats of the tenant: how many are used, who holds them, and buttons to assign and release.\n */\nexport const SeatsView = ({ rows, summary, isReadOnly, isLoading, isUnauthorized, hasFailed, onAssign, onRelease }: SeatsViewProps) => {\n const { labels, locale } = useBoxOfficeContext();\n\n return (\n <section className='boxoffice-seats' aria-labelledby='boxoffice-seats-title'>\n <header className='boxoffice-page__header'>\n <h2 id='boxoffice-seats-title' className='boxoffice-page__title'>{labels.seats.title}</h2>\n <Button label={labels.seats.assign} disabled={isReadOnly || summary.capacity === 0} onClick={onAssign} />\n </header>\n\n <p className='boxoffice-seats__summary'>\n {summary.capacity === 0\n ? labels.seats.noCapacity\n : format(labels.seats.summary, { held: summary.held, capacity: summary.capacity })}\n </p>\n {summary.over > 0 && <Message severity='warn'>{format(labels.seats.overCapacity, { over: summary.over })}</Message>}\n {isReadOnly && <Message severity='info'>{labels.seats.readOnly}</Message>}\n\n <DataTableCore<SeatRow>\n data={[...rows]}\n dataKey='holding.holder.identityProviderSubject'\n status={statusOf(isLoading, isUnauthorized, hasFailed)}\n emptyMessage={labels.seats.empty}\n loadingMessage={labels.common.loading}\n failureMessage={labels.common.failed}\n unauthorizedMessage={labels.common.unauthorized}>\n <Column<SeatRow> header={labels.seats.holderColumn} body={row => row.holding.holder.name} />\n <Column<SeatRow> header={labels.seats.emailColumn} body={row => row.holding.holder.email} />\n <Column<SeatRow> header={labels.seats.assignedColumn} body={row => formatDay(row.holding.assignedAt, locale)} />\n <Column<SeatRow>\n header={labels.seats.statusColumn}\n body={row => (\n <Tag\n severity={row.coverage === 'licensed' ? 'success' : 'warn'}\n value={row.coverage === 'licensed' ? labels.seats.licensed : labels.seats.overCapacityStatus} />\n )} />\n <Column<SeatRow>\n header=''\n body={row => (\n <Button\n variant='ghost'\n tone='critical'\n size='small'\n label={labels.seats.releaseShort}\n aria-label={format(labels.seats.release, { name: row.holding.holder.name })}\n disabled={isReadOnly}\n onClick={() => onRelease(row.holding)} />\n )} />\n </DataTableCore>\n </section>\n );\n};\n"],"names":["statusOf","isLoading","isUnauthorized","hasFailed","DataTableStatus","Unauthorized","Failed","Loading","Ready","SeatsView","rows","summary","isReadOnly","onAssign","onRelease","labels","locale","useBoxOfficeContext","_jsxs","section","className","aria-labelledby","header","_jsx","h2","id","seats","title","Button","label","assign","disabled","capacity","onClick","p","noCapacity","format","held","over","Message","severity","overCapacity","readOnly","DataTableCore","data","dataKey","status","emptyMessage","empty","loadingMessage","common","loading","failureMessage","failed","unauthorizedMessage","unauthorized","Column","holderColumn","body","row","holding","holder","name","emailColumn","email","assignedColumn","formatDay","assignedAt","statusColumn","Tag","coverage","value","licensed","overCapacityStatus","variant","tone","size","releaseShort","aria-label","release"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './AssignSeatDialog.js';
2
+ export * from './seatModels.js';
3
+ export * from './SeatsPage.js';
4
+ export * from './SeatsView.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Seats/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './AssignSeatDialog.js';
2
+ export * from './seatModels.js';
3
+ export * from './SeatsPage.js';
4
+ export * from './SeatsView.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../Seats/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Person, SeatHolding, SeatRoster } from '@cratis/showrunner.boxoffice';
2
+ export type SeatCoverage = 'licensed' | 'overCapacity';
3
+ export interface SeatRow {
4
+ readonly holding: SeatHolding;
5
+ readonly coverage: SeatCoverage;
6
+ }
7
+ export interface SeatSummary {
8
+ readonly held: number;
9
+ readonly capacity: number;
10
+ readonly over: number;
11
+ }
12
+ export declare function seatRows(roster: SeatRoster | undefined, capacity: number): SeatRow[];
13
+ export declare function seatSummary(rows: readonly SeatRow[], capacity: number): SeatSummary;
14
+ export interface SeatPersonInput {
15
+ identityProvider: string;
16
+ subject: string;
17
+ name: string;
18
+ email: string;
19
+ }
20
+ export declare const emptySeatPerson: SeatPersonInput;
21
+ export declare function isValidSeatPerson(input: SeatPersonInput): boolean;
22
+ export declare function personOf(input: SeatPersonInput): Person;
23
+ //# sourceMappingURL=seatModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seatModels.d.ts","sourceRoot":"","sources":["../../../Seats/seatModels.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG/E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAKvD,MAAM,WAAW,OAAO;IAEpB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAG9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACnC;AAKD,MAAM,WAAW,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AASD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,CAGpF;AAQD,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAEnF;AAKD,MAAM,WAAW,eAAe;IAE5B,gBAAgB,EAAE,MAAM,CAAC;IAGzB,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;CACjB;AAGD,eAAO,MAAM,eAAe,EAAE,eAA4E,CAAC;AAO3G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAEjE;AAOD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAOvD"}
@@ -0,0 +1,59 @@
1
+ import { Person } from '@cratis/showrunner.boxoffice';
2
+
3
+ // Copyright (c) Cratis. All rights reserved.
4
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
5
+ /**
6
+ * Lays out the seats the way the backend licenses them: the first people to be given a seat, in the order they were
7
+ * given them, are covered by the tenant's seats, and the rest are not.
8
+ * @param roster Who holds the seats.
9
+ * @param capacity How many seats the tenant has.
10
+ * @returns The seats, oldest first.
11
+ */ function seatRows(roster, capacity) {
12
+ const holdings = [
13
+ ...roster?.holdings ?? []
14
+ ].sort((a, b)=>new Date(a.assignedAt).getTime() - new Date(b.assignedAt).getTime());
15
+ return holdings.map((holding, index)=>({
16
+ holding,
17
+ coverage: index < Math.max(capacity, 0) ? 'licensed' : 'overCapacity'
18
+ }));
19
+ }
20
+ /**
21
+ * Summarizes the seats.
22
+ * @param rows The seats from {@link seatRows}.
23
+ * @param capacity How many seats the tenant has.
24
+ * @returns The {@link SeatSummary}.
25
+ */ function seatSummary(rows, capacity) {
26
+ return {
27
+ held: rows.length,
28
+ capacity,
29
+ over: rows.filter((_)=>_.coverage === 'overCapacity').length
30
+ };
31
+ }
32
+ /** An empty {@link SeatPersonInput}. */ const emptySeatPerson = {
33
+ identityProvider: '',
34
+ subject: '',
35
+ name: '',
36
+ email: ''
37
+ };
38
+ /**
39
+ * Gets whether what the user typed can be assigned a seat.
40
+ * @param input What the user typed.
41
+ * @returns True when every field has something in it.
42
+ */ function isValidSeatPerson(input) {
43
+ return Object.values(input).every((value)=>value.trim().length > 0);
44
+ }
45
+ /**
46
+ * Makes the person a seat is assigned to.
47
+ * @param input What the user typed.
48
+ * @returns The {@link Person}.
49
+ */ function personOf(input) {
50
+ const person = new Person();
51
+ person.identityProvider = input.identityProvider.trim();
52
+ person.identityProviderSubject = input.subject.trim();
53
+ person.name = input.name.trim();
54
+ person.email = input.email.trim();
55
+ return person;
56
+ }
57
+
58
+ export { emptySeatPerson, isValidSeatPerson, personOf, seatRows, seatSummary };
59
+ //# sourceMappingURL=seatModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seatModels.js","sources":["../../../Seats/seatModels.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Person, SeatHolding, SeatRoster } from '@cratis/showrunner.boxoffice';\n\n/** Whether a seat is covered by what the tenant has bought. */\nexport type SeatCoverage = 'licensed' | 'overCapacity';\n\n/**\n * One person's seat on the seats page.\n */\nexport interface SeatRow {\n /** The seat. */\n readonly holding: SeatHolding;\n\n /** Whether the tenant's seats cover it. */\n readonly coverage: SeatCoverage;\n}\n\n/**\n * What the seats page summarizes.\n */\nexport interface SeatSummary {\n /** How many seats are held. */\n readonly held: number;\n\n /** How many seats the tenant has. */\n readonly capacity: number;\n\n /** How many people hold a seat the tenant has no room for. */\n readonly over: number;\n}\n\n/**\n * Lays out the seats the way the backend licenses them: the first people to be given a seat, in the order they were\n * given them, are covered by the tenant's seats, and the rest are not.\n * @param roster Who holds the seats.\n * @param capacity How many seats the tenant has.\n * @returns The seats, oldest first.\n */\nexport function seatRows(roster: SeatRoster | undefined, capacity: number): SeatRow[] {\n const holdings = [...(roster?.holdings ?? [])].sort((a, b) => new Date(a.assignedAt).getTime() - new Date(b.assignedAt).getTime());\n return holdings.map((holding, index) => ({ holding, coverage: index < Math.max(capacity, 0) ? 'licensed' : 'overCapacity' }));\n}\n\n/**\n * Summarizes the seats.\n * @param rows The seats from {@link seatRows}.\n * @param capacity How many seats the tenant has.\n * @returns The {@link SeatSummary}.\n */\nexport function seatSummary(rows: readonly SeatRow[], capacity: number): SeatSummary {\n return { held: rows.length, capacity, over: rows.filter(_ => _.coverage === 'overCapacity').length };\n}\n\n/**\n * What the user types to assign a seat.\n */\nexport interface SeatPersonInput {\n /** The identity provider that knows the person. */\n identityProvider: string;\n\n /** The person's subject at the identity provider. */\n subject: string;\n\n /** The person's name. */\n name: string;\n\n /** The person's email address. */\n email: string;\n}\n\n/** An empty {@link SeatPersonInput}. */\nexport const emptySeatPerson: SeatPersonInput = { identityProvider: '', subject: '', name: '', email: '' };\n\n/**\n * Gets whether what the user typed can be assigned a seat.\n * @param input What the user typed.\n * @returns True when every field has something in it.\n */\nexport function isValidSeatPerson(input: SeatPersonInput): boolean {\n return Object.values(input).every(value => value.trim().length > 0);\n}\n\n/**\n * Makes the person a seat is assigned to.\n * @param input What the user typed.\n * @returns The {@link Person}.\n */\nexport function personOf(input: SeatPersonInput): Person {\n const person = new Person();\n person.identityProvider = input.identityProvider.trim();\n person.identityProviderSubject = input.subject.trim();\n person.name = input.name.trim();\n person.email = input.email.trim();\n return person;\n}\n"],"names":["seatRows","roster","capacity","holdings","sort","a","b","Date","assignedAt","getTime","map","holding","index","coverage","Math","max","seatSummary","rows","held","length","over","filter","_","emptySeatPerson","identityProvider","subject","name","email","isValidSeatPerson","input","Object","values","every","value","trim","personOf","person","Person","identityProviderSubject"],"mappings":";;AAAA;AACA;AAgCA;;;;;;AAMC,IACM,SAASA,QAAAA,CAASC,MAA8B,EAAEC,QAAgB,EAAA;AACrE,IAAA,MAAMC,QAAAA,GAAW;AAAKF,QAAAA,GAAAA,MAAAA,EAAQE,YAAY;AAAI,KAAA,CAACC,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAM,IAAIC,IAAAA,CAAKF,CAAAA,CAAEG,UAAU,CAAA,CAAEC,OAAO,EAAA,GAAK,IAAIF,KAAKD,CAAAA,CAAEE,UAAU,EAAEC,OAAO,EAAA,CAAA;AAC/H,IAAA,OAAON,SAASO,GAAG,CAAC,CAACC,OAAAA,EAASC,SAAW;AAAED,YAAAA,OAAAA;AAASE,YAAAA,QAAAA,EAAUD,QAAQE,IAAAA,CAAKC,GAAG,CAACb,QAAAA,EAAU,KAAK,UAAA,GAAa;SAAe,CAAA,CAAA;AAC9H;AAEA;;;;;AAKC,IACM,SAASc,WAAAA,CAAYC,IAAwB,EAAEf,QAAgB,EAAA;IAClE,OAAO;AAAEgB,QAAAA,IAAAA,EAAMD,KAAKE,MAAM;AAAEjB,QAAAA,QAAAA;QAAUkB,IAAAA,EAAMH,IAAAA,CAAKI,MAAM,CAACC,CAAAA,IAAKA,CAAAA,CAAET,QAAQ,KAAK,cAAA,CAAA,CAAgBM;AAAO,KAAA;AACvG;AAmBA,yCACO,MAAMI,eAAAA,GAAmC;IAAEC,gBAAAA,EAAkB,EAAA;IAAIC,OAAAA,EAAS,EAAA;IAAIC,IAAAA,EAAM,EAAA;IAAIC,KAAAA,EAAO;AAAG;AAEzG;;;;IAKO,SAASC,iBAAAA,CAAkBC,KAAsB,EAAA;AACpD,IAAA,OAAOC,MAAAA,CAAOC,MAAM,CAACF,KAAAA,CAAAA,CAAOG,KAAK,CAACC,CAAAA,KAAAA,GAASA,KAAAA,CAAMC,IAAI,EAAA,CAAGf,MAAM,GAAG,CAAA,CAAA;AACrE;AAEA;;;;IAKO,SAASgB,QAAAA,CAASN,KAAsB,EAAA;AAC3C,IAAA,MAAMO,SAAS,IAAIC,MAAAA,EAAAA;AACnBD,IAAAA,MAAAA,CAAOZ,gBAAgB,GAAGK,KAAAA,CAAML,gBAAgB,CAACU,IAAI,EAAA;AACrDE,IAAAA,MAAAA,CAAOE,uBAAuB,GAAGT,KAAAA,CAAMJ,OAAO,CAACS,IAAI,EAAA;AACnDE,IAAAA,MAAAA,CAAOV,IAAI,GAAGG,KAAAA,CAAMH,IAAI,CAACQ,IAAI,EAAA;AAC7BE,IAAAA,MAAAA,CAAOT,KAAK,GAAGE,KAAAA,CAAMF,KAAK,CAACO,IAAI,EAAA;IAC/B,OAAOE,MAAAA;AACX;;"}
@@ -0,0 +1,2 @@
1
+ export declare const UsagePage: () => import("react").JSX.Element;
2
+ //# sourceMappingURL=UsagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsagePage.d.ts","sourceRoot":"","sources":["../../../Usage/UsagePage.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,SAAS,mCAYrB,CAAC"}