@cratis/showrunner.boxoffice.react 0.0.0-stage → 1.11.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 +78 -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,111 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var Common = require('@cratis/components/Common');
5
+ var DataTables = require('@cratis/components/DataTables');
6
+ var Display = require('@cratis/components/Display');
7
+ var formatting = require('../formatting.js');
8
+ var format = require('../Labels/format.js');
9
+ var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
10
+
11
+ const statusOf = (isLoading, isUnauthorized, hasFailed)=>{
12
+ if (isUnauthorized) {
13
+ return DataTables.DataTableStatus.Unauthorized;
14
+ }
15
+ if (hasFailed) {
16
+ return DataTables.DataTableStatus.Failed;
17
+ }
18
+ return isLoading ? DataTables.DataTableStatus.Loading : DataTables.DataTableStatus.Ready;
19
+ };
20
+ /**
21
+ * The seats of the tenant: how many are used, who holds them, and buttons to assign and release.
22
+ */ const SeatsView = ({ rows, summary, isReadOnly, isLoading, isUnauthorized, hasFailed, onAssign, onRelease })=>{
23
+ const { labels, locale } = BoxOfficeContext.useBoxOfficeContext();
24
+ return /*#__PURE__*/ jsxRuntime.jsxs("section", {
25
+ className: "boxoffice-seats",
26
+ "aria-labelledby": "boxoffice-seats-title",
27
+ children: [
28
+ /*#__PURE__*/ jsxRuntime.jsxs("header", {
29
+ className: "boxoffice-page__header",
30
+ children: [
31
+ /*#__PURE__*/ jsxRuntime.jsx("h2", {
32
+ id: "boxoffice-seats-title",
33
+ className: "boxoffice-page__title",
34
+ children: labels.seats.title
35
+ }),
36
+ /*#__PURE__*/ jsxRuntime.jsx(Common.Button, {
37
+ label: labels.seats.assign,
38
+ disabled: isReadOnly || summary.capacity === 0,
39
+ onClick: onAssign
40
+ })
41
+ ]
42
+ }),
43
+ /*#__PURE__*/ jsxRuntime.jsx("p", {
44
+ className: "boxoffice-seats__summary",
45
+ children: summary.capacity === 0 ? labels.seats.noCapacity : format.format(labels.seats.summary, {
46
+ held: summary.held,
47
+ capacity: summary.capacity
48
+ })
49
+ }),
50
+ summary.over > 0 && /*#__PURE__*/ jsxRuntime.jsx(Display.Message, {
51
+ severity: "warn",
52
+ children: format.format(labels.seats.overCapacity, {
53
+ over: summary.over
54
+ })
55
+ }),
56
+ isReadOnly && /*#__PURE__*/ jsxRuntime.jsx(Display.Message, {
57
+ severity: "info",
58
+ children: labels.seats.readOnly
59
+ }),
60
+ /*#__PURE__*/ jsxRuntime.jsxs(DataTables.DataTableCore, {
61
+ data: [
62
+ ...rows
63
+ ],
64
+ dataKey: "holding.holder.identityProviderSubject",
65
+ status: statusOf(isLoading, isUnauthorized, hasFailed),
66
+ emptyMessage: labels.seats.empty,
67
+ loadingMessage: labels.common.loading,
68
+ failureMessage: labels.common.failed,
69
+ unauthorizedMessage: labels.common.unauthorized,
70
+ children: [
71
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
72
+ header: labels.seats.holderColumn,
73
+ body: (row)=>row.holding.holder.name
74
+ }),
75
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
76
+ header: labels.seats.emailColumn,
77
+ body: (row)=>row.holding.holder.email
78
+ }),
79
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
80
+ header: labels.seats.assignedColumn,
81
+ body: (row)=>formatting.formatDay(row.holding.assignedAt, locale)
82
+ }),
83
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
84
+ header: labels.seats.statusColumn,
85
+ body: (row)=>/*#__PURE__*/ jsxRuntime.jsx(Display.Tag, {
86
+ severity: row.coverage === 'licensed' ? 'success' : 'warn',
87
+ value: row.coverage === 'licensed' ? labels.seats.licensed : labels.seats.overCapacityStatus
88
+ })
89
+ }),
90
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
91
+ header: "",
92
+ body: (row)=>/*#__PURE__*/ jsxRuntime.jsx(Common.Button, {
93
+ variant: "ghost",
94
+ tone: "critical",
95
+ size: "small",
96
+ label: labels.seats.releaseShort,
97
+ "aria-label": format.format(labels.seats.release, {
98
+ name: row.holding.holder.name
99
+ }),
100
+ disabled: isReadOnly,
101
+ onClick: ()=>onRelease(row.holding)
102
+ })
103
+ })
104
+ ]
105
+ })
106
+ ]
107
+ });
108
+ };
109
+
110
+ exports.SeatsView = SeatsView;
111
+ //# 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,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,65 @@
1
+ 'use strict';
2
+
3
+ var showrunner_boxoffice = require('@cratis/showrunner.boxoffice');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /**
8
+ * Lays out the seats the way the backend licenses them: the first people to be given a seat, in the order they were
9
+ * given them, are covered by the tenant's seats, and the rest are not.
10
+ * @param roster Who holds the seats.
11
+ * @param capacity How many seats the tenant has.
12
+ * @returns The seats, oldest first.
13
+ */ function seatRows(roster, capacity) {
14
+ const holdings = [
15
+ ...roster?.holdings ?? []
16
+ ].sort((a, b)=>new Date(a.assignedAt).getTime() - new Date(b.assignedAt).getTime());
17
+ return holdings.map((holding, index)=>({
18
+ holding,
19
+ coverage: index < Math.max(capacity, 0) ? 'licensed' : 'overCapacity'
20
+ }));
21
+ }
22
+ /**
23
+ * Summarizes the seats.
24
+ * @param rows The seats from {@link seatRows}.
25
+ * @param capacity How many seats the tenant has.
26
+ * @returns The {@link SeatSummary}.
27
+ */ function seatSummary(rows, capacity) {
28
+ return {
29
+ held: rows.length,
30
+ capacity,
31
+ over: rows.filter((_)=>_.coverage === 'overCapacity').length
32
+ };
33
+ }
34
+ /** An empty {@link SeatPersonInput}. */ const emptySeatPerson = {
35
+ identityProvider: '',
36
+ subject: '',
37
+ name: '',
38
+ email: ''
39
+ };
40
+ /**
41
+ * Gets whether what the user typed can be assigned a seat.
42
+ * @param input What the user typed.
43
+ * @returns True when every field has something in it.
44
+ */ function isValidSeatPerson(input) {
45
+ return Object.values(input).every((value)=>value.trim().length > 0);
46
+ }
47
+ /**
48
+ * Makes the person a seat is assigned to.
49
+ * @param input What the user typed.
50
+ * @returns The {@link Person}.
51
+ */ function personOf(input) {
52
+ const person = new showrunner_boxoffice.Person();
53
+ person.identityProvider = input.identityProvider.trim();
54
+ person.identityProviderSubject = input.subject.trim();
55
+ person.name = input.name.trim();
56
+ person.email = input.email.trim();
57
+ return person;
58
+ }
59
+
60
+ exports.emptySeatPerson = emptySeatPerson;
61
+ exports.isValidSeatPerson = isValidSeatPerson;
62
+ exports.personOf = personOf;
63
+ exports.seatRows = seatRows;
64
+ exports.seatSummary = seatSummary;
65
+ //# 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,2BAAAA,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"}
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var showrunner_boxoffice = require('@cratis/showrunner.boxoffice');
5
+ var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
6
+ var usageModels = require('./usageModels.js');
7
+ var UsageView = require('./UsageView.js');
8
+
9
+ /**
10
+ * The usage page: what the tenant has used of each meter in the period it is in, against its allowance and budget. For
11
+ * the people who maintain the product; the backend refuses everyone else. Render it inside a
12
+ * {@link BoxOfficeProvider}.
13
+ */ const UsagePage = ()=>{
14
+ const { labels, locale } = BoxOfficeContext.useBoxOfficeContext();
15
+ const [usage] = showrunner_boxoffice.CurrentUsage.use();
16
+ const meters = usage.isSuccess ? (usage.data ?? []).map((standing)=>usageModels.meterUsageModel(standing, labels, locale)) : [];
17
+ return /*#__PURE__*/ jsxRuntime.jsx(UsageView.UsageView, {
18
+ meters: meters,
19
+ isLoading: usage.isPerforming && !usage.isSuccess,
20
+ isUnauthorized: !usage.isAuthorized,
21
+ hasFailed: !usage.isPerforming && usage.isAuthorized && !usage.isSuccess
22
+ });
23
+ };
24
+
25
+ exports.UsagePage = UsagePage;
26
+ //# sourceMappingURL=UsagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsagePage.js","sources":["../../../Usage/UsagePage.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 { CurrentUsage } from '@cratis/showrunner.boxoffice';\nimport { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';\nimport { meterUsageModel } from './usageModels.js';\nimport { UsageView } from './UsageView.js';\n\n/**\n * The usage page: what the tenant has used of each meter in the period it is in, against its allowance and budget. For\n * the people who maintain the product; the backend refuses everyone else. Render it inside a\n * {@link BoxOfficeProvider}.\n */\nexport const UsagePage = () => {\n const { labels, locale } = useBoxOfficeContext();\n const [usage] = CurrentUsage.use();\n const meters = usage.isSuccess ? (usage.data ?? []).map(standing => meterUsageModel(standing, labels, locale)) : [];\n\n return (\n <UsageView\n meters={meters}\n isLoading={usage.isPerforming && !usage.isSuccess}\n isUnauthorized={!usage.isAuthorized}\n hasFailed={!usage.isPerforming && usage.isAuthorized && !usage.isSuccess} />\n );\n};\n"],"names":["UsagePage","labels","locale","useBoxOfficeContext","usage","CurrentUsage","use","meters","isSuccess","data","map","standing","meterUsageModel","_jsx","UsageView","isLoading","isPerforming","isUnauthorized","isAuthorized","hasFailed"],"mappings":";;;;;;;;AAQA;;;;UAKaA,SAAAA,GAAY,IAAA;AACrB,IAAA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGC,oCAAAA,EAAAA;AAC3B,IAAA,MAAM,CAACC,KAAAA,CAAM,GAAGC,iCAAAA,CAAaC,GAAG,EAAA;IAChC,MAAMC,MAAAA,GAASH,MAAMI,SAAS,GAAG,CAACJ,KAAAA,CAAMK,IAAI,IAAI,EAAE,EAAEC,GAAG,CAACC,CAAAA,QAAAA,GAAYC,4BAAgBD,QAAAA,EAAUV,MAAAA,EAAQC,WAAW,EAAE;AAEnH,IAAA,qBACIW,cAAA,CAACC,mBAAAA,EAAAA;QACGP,MAAAA,EAAQA,MAAAA;AACRQ,QAAAA,SAAAA,EAAWX,KAAAA,CAAMY,YAAY,IAAI,CAACZ,MAAMI,SAAS;QACjDS,cAAAA,EAAgB,CAACb,MAAMc,YAAY;QACnCC,SAAAA,EAAW,CAACf,MAAMY,YAAY,IAAIZ,MAAMc,YAAY,IAAI,CAACd,KAAAA,CAAMI;;AAE3E;;"}
@@ -0,0 +1,9 @@
1
+ import { MeterUsageModel } from './usageModels.js';
2
+ export interface UsageViewProps {
3
+ meters: readonly MeterUsageModel[];
4
+ isLoading?: boolean;
5
+ isUnauthorized?: boolean;
6
+ hasFailed?: boolean;
7
+ }
8
+ export declare const UsageView: ({ meters, isLoading, isUnauthorized, hasFailed }: UsageViewProps) => import("react").JSX.Element;
9
+ //# sourceMappingURL=UsageView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageView.d.ts","sourceRoot":"","sources":["../../../Usage/UsageView.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAc,MAAM,kBAAkB,CAAC;AAK/D,MAAM,WAAW,cAAc;IAE3B,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAGnC,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAiBD,eAAO,MAAM,SAAS,GAAI,kDAAkD,cAAc,gCAoDzF,CAAC"}
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var DataTables = require('@cratis/components/DataTables');
5
+ var Display = require('@cratis/components/Display');
6
+ var format = require('../Labels/format.js');
7
+ var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
8
+
9
+ const statusOf = (isLoading, isUnauthorized, hasFailed)=>{
10
+ if (isUnauthorized) {
11
+ return DataTables.DataTableStatus.Unauthorized;
12
+ }
13
+ if (hasFailed) {
14
+ return DataTables.DataTableStatus.Failed;
15
+ }
16
+ return isLoading ? DataTables.DataTableStatus.Loading : DataTables.DataTableStatus.Ready;
17
+ };
18
+ /**
19
+ * What a tenant has used of each meter in the period it is in, against its allowance and budget.
20
+ */ const UsageView = ({ meters, isLoading, isUnauthorized, hasFailed })=>{
21
+ const { labels } = BoxOfficeContext.useBoxOfficeContext();
22
+ const levelText = {
23
+ ok: undefined,
24
+ warning: undefined,
25
+ atBudget: labels.usage.atBudget,
26
+ atAllowance: labels.usage.atAllowance
27
+ };
28
+ const showsConcurrency = meters.some((_)=>_.standing.hasConcurrencyLimit);
29
+ return /*#__PURE__*/ jsxRuntime.jsxs("section", {
30
+ className: "boxoffice-usage",
31
+ "aria-labelledby": "boxoffice-usage-title",
32
+ children: [
33
+ /*#__PURE__*/ jsxRuntime.jsx("header", {
34
+ className: "boxoffice-page__header",
35
+ children: /*#__PURE__*/ jsxRuntime.jsx("h2", {
36
+ id: "boxoffice-usage-title",
37
+ className: "boxoffice-page__title",
38
+ children: labels.usage.title
39
+ })
40
+ }),
41
+ /*#__PURE__*/ jsxRuntime.jsxs(DataTables.DataTableCore, {
42
+ data: [
43
+ ...meters
44
+ ],
45
+ dataKey: "standing.meter",
46
+ status: statusOf(isLoading, isUnauthorized, hasFailed),
47
+ emptyMessage: labels.usage.empty,
48
+ loadingMessage: labels.common.loading,
49
+ failureMessage: labels.common.failed,
50
+ unauthorizedMessage: labels.common.unauthorized,
51
+ children: [
52
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
53
+ header: labels.usage.meterColumn,
54
+ body: (meter)=>/*#__PURE__*/ jsxRuntime.jsxs("span", {
55
+ className: "boxoffice-usage__meter",
56
+ children: [
57
+ /*#__PURE__*/ jsxRuntime.jsx("strong", {
58
+ children: meter.standing.name
59
+ }),
60
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
61
+ className: "boxoffice-usage__period",
62
+ children: meter.periodText
63
+ })
64
+ ]
65
+ })
66
+ }),
67
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
68
+ header: labels.usage.usedColumn,
69
+ body: (meter)=>/*#__PURE__*/ jsxRuntime.jsxs("span", {
70
+ className: `boxoffice-usage__used boxoffice-usage__used--${meter.level}`,
71
+ children: [
72
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
73
+ children: meter.usedText
74
+ }),
75
+ meter.standing.allowance > 0 && /*#__PURE__*/ jsxRuntime.jsx(Display.ProgressBar, {
76
+ value: meter.percent,
77
+ showValue: false,
78
+ "aria-label": format.format(labels.usage.progress, {
79
+ meter: meter.standing.name
80
+ })
81
+ }),
82
+ levelText[meter.level] && /*#__PURE__*/ jsxRuntime.jsx(Display.Tag, {
83
+ severity: meter.level === 'atAllowance' ? 'danger' : 'warn',
84
+ value: levelText[meter.level]
85
+ }),
86
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
87
+ className: "boxoffice-usage__overage",
88
+ children: meter.overageText
89
+ })
90
+ ]
91
+ })
92
+ }),
93
+ /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
94
+ header: labels.usage.budgetColumn,
95
+ body: (meter)=>meter.budgetText
96
+ }),
97
+ showsConcurrency && /*#__PURE__*/ jsxRuntime.jsx(DataTables.Column, {
98
+ header: labels.usage.concurrencyColumn,
99
+ body: (meter)=>meter.concurrencyText
100
+ })
101
+ ]
102
+ })
103
+ ]
104
+ });
105
+ };
106
+
107
+ exports.UsageView = UsageView;
108
+ //# sourceMappingURL=UsageView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsageView.js","sources":["../../../Usage/UsageView.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 { Column, DataTableCore, DataTableStatus } from '@cratis/components/DataTables';\nimport { ProgressBar, Tag } from '@cratis/components/Display';\nimport { format } from '../Labels/index.js';\nimport { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';\nimport { MeterUsageModel, UsageLevel } from './usageModels.js';\n\n/**\n * Props for {@link UsageView}.\n */\nexport interface UsageViewProps {\n /** How each meter stands. */\n meters: readonly MeterUsageModel[];\n\n /** Whether the usage is still loading. */\n isLoading?: boolean;\n\n /** Whether the usage could not be loaded because the user may not see it. */\n isUnauthorized?: boolean;\n\n /** Whether the usage could not be loaded. */\n hasFailed?: boolean;\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 * What a tenant has used of each meter in the period it is in, against its allowance and budget.\n */\nexport const UsageView = ({ meters, isLoading, isUnauthorized, hasFailed }: UsageViewProps) => {\n const { labels } = useBoxOfficeContext();\n const levelText: Record<UsageLevel, string | undefined> = {\n ok: undefined,\n warning: undefined,\n atBudget: labels.usage.atBudget,\n atAllowance: labels.usage.atAllowance\n };\n const showsConcurrency = meters.some(_ => _.standing.hasConcurrencyLimit);\n\n return (\n <section className='boxoffice-usage' aria-labelledby='boxoffice-usage-title'>\n <header className='boxoffice-page__header'>\n <h2 id='boxoffice-usage-title' className='boxoffice-page__title'>{labels.usage.title}</h2>\n </header>\n\n <DataTableCore<MeterUsageModel>\n data={[...meters]}\n dataKey='standing.meter'\n status={statusOf(isLoading, isUnauthorized, hasFailed)}\n emptyMessage={labels.usage.empty}\n loadingMessage={labels.common.loading}\n failureMessage={labels.common.failed}\n unauthorizedMessage={labels.common.unauthorized}>\n <Column<MeterUsageModel>\n header={labels.usage.meterColumn}\n body={meter => (\n <span className='boxoffice-usage__meter'>\n <strong>{meter.standing.name}</strong>\n <span className='boxoffice-usage__period'>{meter.periodText}</span>\n </span>\n )} />\n <Column<MeterUsageModel>\n header={labels.usage.usedColumn}\n body={meter => (\n <span className={`boxoffice-usage__used boxoffice-usage__used--${meter.level}`}>\n <span>{meter.usedText}</span>\n {meter.standing.allowance > 0 && (\n <ProgressBar\n value={meter.percent}\n showValue={false}\n aria-label={format(labels.usage.progress, { meter: meter.standing.name })} />\n )}\n {levelText[meter.level] && <Tag severity={meter.level === 'atAllowance' ? 'danger' : 'warn'} value={levelText[meter.level]} />}\n <span className='boxoffice-usage__overage'>{meter.overageText}</span>\n </span>\n )} />\n <Column<MeterUsageModel> header={labels.usage.budgetColumn} body={meter => meter.budgetText} />\n {showsConcurrency && <Column<MeterUsageModel> header={labels.usage.concurrencyColumn} body={meter => meter.concurrencyText} />}\n </DataTableCore>\n </section>\n );\n};\n"],"names":["statusOf","isLoading","isUnauthorized","hasFailed","DataTableStatus","Unauthorized","Failed","Loading","Ready","UsageView","meters","labels","useBoxOfficeContext","levelText","ok","undefined","warning","atBudget","usage","atAllowance","showsConcurrency","some","_","standing","hasConcurrencyLimit","_jsxs","section","className","aria-labelledby","_jsx","header","h2","id","title","DataTableCore","data","dataKey","status","emptyMessage","empty","loadingMessage","common","loading","failureMessage","failed","unauthorizedMessage","unauthorized","Column","meterColumn","body","meter","span","strong","name","periodText","usedColumn","level","usedText","allowance","ProgressBar","value","percent","showValue","aria-label","format","progress","Tag","severity","overageText","budgetColumn","budgetText","concurrencyColumn","concurrencyText"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './usageModels.js';
2
+ export * from './UsagePage.js';
3
+ export * from './UsageView.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Usage/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { MeterStanding } from '@cratis/showrunner.boxoffice';
2
+ import { BoxOfficeLabels } from '../Labels/index.js';
3
+ export type UsageLevel = 'ok' | 'warning' | 'atBudget' | 'atAllowance';
4
+ export declare const usageWarningShare = 0.8;
5
+ export interface MeterUsageModel {
6
+ readonly standing: MeterStanding;
7
+ readonly percent: number;
8
+ readonly level: UsageLevel;
9
+ readonly usedText: string;
10
+ readonly periodText: string;
11
+ readonly overageText: string;
12
+ readonly budgetText: string;
13
+ readonly concurrencyText: string;
14
+ }
15
+ export declare function usageLevel(standing: MeterStanding): UsageLevel;
16
+ export declare function meterUsageModel(standing: MeterStanding, labels: BoxOfficeLabels, locale?: string): MeterUsageModel;
17
+ //# sourceMappingURL=usageModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageModels.d.ts","sourceRoot":"","sources":["../../../Usage/usageModels.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,aAAa,EAAmB,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAU,MAAM,oBAAoB,CAAC;AAI7D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC;AAGvE,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAKrC,MAAM,WAAW,eAAe;IAE5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IAGjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAG3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAG7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAG5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACpC;AAOD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,UAAU,CAU9D;AASD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAyBlH"}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ var showrunner_boxoffice = require('@cratis/showrunner.boxoffice');
4
+ var format = require('../Labels/format.js');
5
+ var formatting = require('../formatting.js');
6
+
7
+ // Copyright (c) Cratis. All rights reserved.
8
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
9
+ /** The share of an allowance used from which a meter is shown as running out. */ const usageWarningShare = 0.8;
10
+ /**
11
+ * Works out how a meter stands.
12
+ * @param standing The meter's standing from the backend.
13
+ * @returns The {@link UsageLevel}.
14
+ */ function usageLevel(standing) {
15
+ if (standing.allowance > 0 && standing.used >= standing.allowance) {
16
+ return 'atAllowance';
17
+ }
18
+ if (standing.budget !== undefined && standing.budget !== null && standing.used >= standing.budget) {
19
+ return 'atBudget';
20
+ }
21
+ return standing.allowance > 0 && standing.used / standing.allowance >= usageWarningShare ? 'warning' : 'ok';
22
+ }
23
+ /**
24
+ * Lays out how a meter stands for the usage page.
25
+ * @param standing The meter's standing from the backend.
26
+ * @param labels The labels to show.
27
+ * @param locale The locale to format for; the browser's when not given.
28
+ * @returns The {@link MeterUsageModel}.
29
+ */ function meterUsageModel(standing, labels, locale) {
30
+ const hasAllowance = standing.allowance > 0;
31
+ const period = standing.period === showrunner_boxoffice.AllowancePeriod.month ? labels.usage.month : labels.usage.day;
32
+ const used = formatting.formatQuantity(standing.used, locale);
33
+ return {
34
+ standing,
35
+ percent: hasAllowance ? Math.min(100, Math.round(standing.used / standing.allowance * 100)) : 0,
36
+ level: usageLevel(standing),
37
+ usedText: hasAllowance ? format.format(labels.usage.usedOfAllowance, {
38
+ used,
39
+ allowance: formatting.formatQuantity(standing.allowance, locale),
40
+ unit: standing.unit
41
+ }) : format.format(labels.usage.noAllowance, {
42
+ used,
43
+ unit: standing.unit
44
+ }),
45
+ periodText: hasAllowance ? `${period}, ${format.format(labels.usage.resets, {
46
+ date: formatting.formatDay(standing.periodEnds, locale)
47
+ })}` : period,
48
+ overageText: standing.overage === showrunner_boxoffice.OverageBehavior.park ? labels.usage.park : labels.usage.block,
49
+ budgetText: standing.budget !== undefined && standing.budget !== null ? `${formatting.formatQuantity(standing.budget, locale)} ${standing.unit}` : labels.usage.notSet,
50
+ concurrencyText: !standing.hasConcurrencyLimit ? '' : standing.concurrencyLimit !== undefined && standing.concurrencyLimit !== null ? formatting.formatQuantity(standing.concurrencyLimit, locale) : labels.usage.notSet
51
+ };
52
+ }
53
+
54
+ exports.meterUsageModel = meterUsageModel;
55
+ exports.usageLevel = usageLevel;
56
+ exports.usageWarningShare = usageWarningShare;
57
+ //# sourceMappingURL=usageModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageModels.js","sources":["../../../Usage/usageModels.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 { AllowancePeriod, MeterStanding, OverageBehavior } from '@cratis/showrunner.boxoffice';\nimport { BoxOfficeLabels, format } from '../Labels/index.js';\nimport { formatDay, formatQuantity } from '../formatting.js';\n\n/** How a meter stands against what it may use. */\nexport type UsageLevel = 'ok' | 'warning' | 'atBudget' | 'atAllowance';\n\n/** The share of an allowance used from which a meter is shown as running out. */\nexport const usageWarningShare = 0.8;\n\n/**\n * What the usage page shows for one meter.\n */\nexport interface MeterUsageModel {\n /** The meter's standing. */\n readonly standing: MeterStanding;\n\n /** How much of the allowance is used, from 0 to 100; 0 when there is no allowance. */\n readonly percent: number;\n\n /** How the meter stands. */\n readonly level: UsageLevel;\n\n /** What is used against the allowance, in words. */\n readonly usedText: string;\n\n /** The allowance's period and when it starts over, in words. */\n readonly periodText: string;\n\n /** What happens beyond the allowance, in words. */\n readonly overageText: string;\n\n /** The budget, in words; nothing set when there is none. */\n readonly budgetText: string;\n\n /** The concurrency limit, in words; nothing set when there is none. */\n readonly concurrencyText: string;\n}\n\n/**\n * Works out how a meter stands.\n * @param standing The meter's standing from the backend.\n * @returns The {@link UsageLevel}.\n */\nexport function usageLevel(standing: MeterStanding): UsageLevel {\n if (standing.allowance > 0 && standing.used >= standing.allowance) {\n return 'atAllowance';\n }\n\n if (standing.budget !== undefined && standing.budget !== null && standing.used >= standing.budget) {\n return 'atBudget';\n }\n\n return standing.allowance > 0 && standing.used / standing.allowance >= usageWarningShare ? 'warning' : 'ok';\n}\n\n/**\n * Lays out how a meter stands for the usage page.\n * @param standing The meter's standing from the backend.\n * @param labels The labels to show.\n * @param locale The locale to format for; the browser's when not given.\n * @returns The {@link MeterUsageModel}.\n */\nexport function meterUsageModel(standing: MeterStanding, labels: BoxOfficeLabels, locale?: string): MeterUsageModel {\n const hasAllowance = standing.allowance > 0;\n const period = standing.period === AllowancePeriod.month ? labels.usage.month : labels.usage.day;\n const used = formatQuantity(standing.used, locale);\n\n return {\n standing,\n percent: hasAllowance ? Math.min(100, Math.round((standing.used / standing.allowance) * 100)) : 0,\n level: usageLevel(standing),\n usedText: hasAllowance\n ? format(labels.usage.usedOfAllowance, { used, allowance: formatQuantity(standing.allowance, locale), unit: standing.unit })\n : format(labels.usage.noAllowance, { used, unit: standing.unit }),\n periodText: hasAllowance\n ? `${period}, ${format(labels.usage.resets, { date: formatDay(standing.periodEnds, locale) })}`\n : period,\n overageText: standing.overage === OverageBehavior.park ? labels.usage.park : labels.usage.block,\n budgetText: standing.budget !== undefined && standing.budget !== null\n ? `${formatQuantity(standing.budget, locale)} ${standing.unit}`\n : labels.usage.notSet,\n concurrencyText: !standing.hasConcurrencyLimit\n ? ''\n : standing.concurrencyLimit !== undefined && standing.concurrencyLimit !== null\n ? formatQuantity(standing.concurrencyLimit, locale)\n : labels.usage.notSet\n };\n}\n"],"names":["usageWarningShare","usageLevel","standing","allowance","used","budget","undefined","meterUsageModel","labels","locale","hasAllowance","period","AllowancePeriod","month","usage","day","formatQuantity","percent","Math","min","round","level","usedText","format","usedOfAllowance","unit","noAllowance","periodText","resets","date","formatDay","periodEnds","overageText","overage","OverageBehavior","park","block","budgetText","notSet","concurrencyText","hasConcurrencyLimit","concurrencyLimit"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { DateOnly } from '@cratis/fundamentals';
2
+ export declare function formatDay(day: DateOnly | Date | string | undefined, locale?: string): string;
3
+ export declare function formatMoney(amount: number, currency: string, locale?: string): string;
4
+ export declare function formatQuantity(value: number, locale?: string): string;
5
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../formatting.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAShD,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5F;AASD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrF;AAQD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var entitlementModel = require('./Entitlements/entitlementModel.js');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /**
8
+ * Formats a day for a person.
9
+ * @param day The day.
10
+ * @param locale The locale; the browser's when not given.
11
+ * @returns The day, such as "Nov 2, 2026"; empty when there is no day.
12
+ */ function formatDay(day, locale) {
13
+ const date = entitlementModel.toDate(day);
14
+ return date ? new Intl.DateTimeFormat(locale, {
15
+ dateStyle: 'medium'
16
+ }).format(date) : '';
17
+ }
18
+ /**
19
+ * Formats an amount of money.
20
+ * @param amount The amount.
21
+ * @param currency The ISO currency code.
22
+ * @param locale The locale; the browser's when not given.
23
+ * @returns The amount with its currency, such as "$12.00".
24
+ */ function formatMoney(amount, currency, locale) {
25
+ try {
26
+ return new Intl.NumberFormat(locale, {
27
+ style: 'currency',
28
+ currency
29
+ }).format(amount);
30
+ } catch {
31
+ return `${amount} ${currency}`;
32
+ }
33
+ }
34
+ /**
35
+ * Formats a quantity.
36
+ * @param value The quantity.
37
+ * @param locale The locale; the browser's when not given.
38
+ * @returns The quantity with its thousands separated.
39
+ */ function formatQuantity(value, locale) {
40
+ return new Intl.NumberFormat(locale).format(value);
41
+ }
42
+
43
+ exports.formatDay = formatDay;
44
+ exports.formatMoney = formatMoney;
45
+ exports.formatQuantity = formatQuantity;
46
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sources":["../../formatting.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 { DateOnly } from '@cratis/fundamentals';\nimport { toDate } from './Entitlements/entitlementModel.js';\n\n/**\n * Formats a day for a person.\n * @param day The day.\n * @param locale The locale; the browser's when not given.\n * @returns The day, such as \"Nov 2, 2026\"; empty when there is no day.\n */\nexport function formatDay(day: DateOnly | Date | string | undefined, locale?: string): string {\n const date = toDate(day);\n return date ? new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(date) : '';\n}\n\n/**\n * Formats an amount of money.\n * @param amount The amount.\n * @param currency The ISO currency code.\n * @param locale The locale; the browser's when not given.\n * @returns The amount with its currency, such as \"$12.00\".\n */\nexport function formatMoney(amount: number, currency: string, locale?: string): string {\n try {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(amount);\n } catch {\n return `${amount} ${currency}`;\n }\n}\n\n/**\n * Formats a quantity.\n * @param value The quantity.\n * @param locale The locale; the browser's when not given.\n * @returns The quantity with its thousands separated.\n */\nexport function formatQuantity(value: number, locale?: string): string {\n return new Intl.NumberFormat(locale).format(value);\n}\n"],"names":["formatDay","day","locale","date","toDate","Intl","DateTimeFormat","dateStyle","format","formatMoney","amount","currency","NumberFormat","style","formatQuantity","value"],"mappings":";;;;AAAA;AACA;AAKA;;;;;AAKC,IACM,SAASA,SAAAA,CAAUC,GAAyC,EAAEC,MAAe,EAAA;AAChF,IAAA,MAAMC,OAAOC,uBAAAA,CAAOH,GAAAA,CAAAA;AACpB,IAAA,OAAOE,IAAAA,GAAO,IAAIE,IAAAA,CAAKC,cAAc,CAACJ,MAAAA,EAAQ;QAAEK,SAAAA,EAAW;KAAS,CAAA,CAAGC,MAAM,CAACL,IAAAA,CAAAA,GAAQ,EAAA;AAC1F;AAEA;;;;;;AAMC,IACM,SAASM,WAAAA,CAAYC,MAAc,EAAEC,QAAgB,EAAET,MAAe,EAAA;IACzE,IAAI;AACA,QAAA,OAAO,IAAIG,IAAAA,CAAKO,YAAY,CAACV,MAAAA,EAAQ;YAAEW,KAAAA,EAAO,UAAA;AAAYF,YAAAA;AAAS,SAAA,CAAA,CAAGH,MAAM,CAACE,MAAAA,CAAAA;AACjF,IAAA,CAAA,CAAE,OAAM;AACJ,QAAA,OAAO,CAAA,EAAGA,MAAAA,CAAO,CAAC,EAAEC,QAAAA,CAAAA,CAAU;AAClC,IAAA;AACJ;AAEA;;;;;AAKC,IACM,SAASG,cAAAA,CAAeC,KAAa,EAAEb,MAAe,EAAA;AACzD,IAAA,OAAO,IAAIG,IAAAA,CAAKO,YAAY,CAACV,MAAAA,CAAAA,CAAQM,MAAM,CAACO,KAAAA,CAAAA;AAChD;;;;"}
@@ -0,0 +1,10 @@
1
+ export * from './Banners/index.js';
2
+ export * from './Entitlements/index.js';
3
+ export * from './Labels/index.js';
4
+ export * from './Plan/index.js';
5
+ export * from './Portal/index.js';
6
+ export * from './Provider/index.js';
7
+ export * from './Seats/index.js';
8
+ export * from './Usage/index.js';
9
+ export * from './formatting.js';
10
+ //# sourceMappingURL=index.d.ts.map