@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.
- package/Banners/NoLicense.tsx +36 -0
- package/Banners/SuspensionBanner.tsx +54 -0
- package/Banners/TrialBanner.tsx +30 -0
- package/Banners/bannerModels.ts +117 -0
- package/Banners/index.ts +7 -0
- package/Entitlements/EntitlementsContext.ts +17 -0
- package/Entitlements/RequiresModule.tsx +68 -0
- package/Entitlements/entitlementModel.ts +175 -0
- package/Entitlements/index.ts +9 -0
- package/Entitlements/moduleFilter.ts +23 -0
- package/Entitlements/requiresModuleModel.ts +44 -0
- package/Entitlements/useEntitlements.ts +25 -0
- package/Labels/BoxOfficeLabels.ts +239 -0
- package/Labels/defaultBoxOfficeLabels.ts +119 -0
- package/Labels/format.ts +13 -0
- package/Labels/index.ts +7 -0
- package/Labels/resolveLabels.ts +36 -0
- package/Plan/PlanPage.tsx +24 -0
- package/Plan/PlanView.tsx +80 -0
- package/Plan/index.ts +6 -0
- package/Plan/planModels.ts +127 -0
- package/Portal/PortalButton.tsx +48 -0
- package/Portal/index.ts +5 -0
- package/Portal/portalLinks.ts +32 -0
- package/Provider/BoxOfficeContext.ts +67 -0
- package/Provider/BoxOfficeProvider.tsx +96 -0
- package/Provider/index.ts +5 -0
- package/README.md +71 -2
- package/Seats/AssignSeatDialog.tsx +73 -0
- package/Seats/SeatsPage.tsx +85 -0
- package/Seats/SeatsView.tsx +108 -0
- package/Seats/index.ts +7 -0
- package/Seats/seatModels.ts +97 -0
- package/Usage/UsagePage.tsx +26 -0
- package/Usage/UsageView.tsx +94 -0
- package/Usage/index.ts +6 -0
- package/Usage/usageModels.ts +92 -0
- package/dist/cjs/Banners/NoLicense.d.ts +2 -0
- package/dist/cjs/Banners/NoLicense.d.ts.map +1 -0
- package/dist/cjs/Banners/NoLicense.js +50 -0
- package/dist/cjs/Banners/NoLicense.js.map +1 -0
- package/dist/cjs/Banners/SuspensionBanner.d.ts +7 -0
- package/dist/cjs/Banners/SuspensionBanner.d.ts.map +1 -0
- package/dist/cjs/Banners/SuspensionBanner.js +62 -0
- package/dist/cjs/Banners/SuspensionBanner.js.map +1 -0
- package/dist/cjs/Banners/TrialBanner.d.ts +2 -0
- package/dist/cjs/Banners/TrialBanner.d.ts.map +1 -0
- package/dist/cjs/Banners/TrialBanner.js +38 -0
- package/dist/cjs/Banners/TrialBanner.js.map +1 -0
- package/dist/cjs/Banners/bannerModels.d.ts +19 -0
- package/dist/cjs/Banners/bannerModels.d.ts.map +1 -0
- package/dist/cjs/Banners/bannerModels.js +101 -0
- package/dist/cjs/Banners/bannerModels.js.map +1 -0
- package/dist/cjs/Banners/index.d.ts +5 -0
- package/dist/cjs/Banners/index.d.ts.map +1 -0
- package/dist/cjs/Entitlements/EntitlementsContext.d.ts +4 -0
- package/dist/cjs/Entitlements/EntitlementsContext.d.ts.map +1 -0
- package/dist/cjs/Entitlements/EntitlementsContext.js +19 -0
- package/dist/cjs/Entitlements/EntitlementsContext.js.map +1 -0
- package/dist/cjs/Entitlements/RequiresModule.d.ts +9 -0
- package/dist/cjs/Entitlements/RequiresModule.d.ts.map +1 -0
- package/dist/cjs/Entitlements/RequiresModule.js +68 -0
- package/dist/cjs/Entitlements/RequiresModule.js.map +1 -0
- package/dist/cjs/Entitlements/entitlementModel.d.ts +25 -0
- package/dist/cjs/Entitlements/entitlementModel.d.ts.map +1 -0
- package/dist/cjs/Entitlements/entitlementModel.js +93 -0
- package/dist/cjs/Entitlements/entitlementModel.js.map +1 -0
- package/dist/cjs/Entitlements/index.d.ts +7 -0
- package/dist/cjs/Entitlements/index.d.ts.map +1 -0
- package/dist/cjs/Entitlements/moduleFilter.d.ts +6 -0
- package/dist/cjs/Entitlements/moduleFilter.d.ts.map +1 -0
- package/dist/cjs/Entitlements/moduleFilter.js +16 -0
- package/dist/cjs/Entitlements/moduleFilter.js.map +1 -0
- package/dist/cjs/Entitlements/requiresModuleModel.d.ts +10 -0
- package/dist/cjs/Entitlements/requiresModuleModel.d.ts.map +1 -0
- package/dist/cjs/Entitlements/requiresModuleModel.js +32 -0
- package/dist/cjs/Entitlements/requiresModuleModel.js.map +1 -0
- package/dist/cjs/Entitlements/useEntitlements.d.ts +5 -0
- package/dist/cjs/Entitlements/useEntitlements.d.ts.map +1 -0
- package/dist/cjs/Entitlements/useEntitlements.js +26 -0
- package/dist/cjs/Entitlements/useEntitlements.js.map +1 -0
- package/dist/cjs/Labels/BoxOfficeLabels.d.ts +116 -0
- package/dist/cjs/Labels/BoxOfficeLabels.d.ts.map +1 -0
- package/dist/cjs/Labels/defaultBoxOfficeLabels.d.ts +3 -0
- package/dist/cjs/Labels/defaultBoxOfficeLabels.d.ts.map +1 -0
- package/dist/cjs/Labels/defaultBoxOfficeLabels.js +120 -0
- package/dist/cjs/Labels/defaultBoxOfficeLabels.js.map +1 -0
- package/dist/cjs/Labels/format.d.ts +2 -0
- package/dist/cjs/Labels/format.d.ts.map +1 -0
- package/dist/cjs/Labels/format.js +15 -0
- package/dist/cjs/Labels/format.js.map +1 -0
- package/dist/cjs/Labels/index.d.ts +5 -0
- package/dist/cjs/Labels/index.d.ts.map +1 -0
- package/dist/cjs/Labels/resolveLabels.d.ts +3 -0
- package/dist/cjs/Labels/resolveLabels.d.ts.map +1 -0
- package/dist/cjs/Labels/resolveLabels.js +35 -0
- package/dist/cjs/Labels/resolveLabels.js.map +1 -0
- package/dist/cjs/Plan/PlanPage.d.ts +2 -0
- package/dist/cjs/Plan/PlanPage.d.ts.map +1 -0
- package/dist/cjs/Plan/PlanPage.js +24 -0
- package/dist/cjs/Plan/PlanPage.js.map +1 -0
- package/dist/cjs/Plan/PlanView.d.ts +10 -0
- package/dist/cjs/Plan/PlanView.d.ts.map +1 -0
- package/dist/cjs/Plan/PlanView.js +123 -0
- package/dist/cjs/Plan/PlanView.js.map +1 -0
- package/dist/cjs/Plan/index.d.ts +4 -0
- package/dist/cjs/Plan/index.d.ts.map +1 -0
- package/dist/cjs/Plan/planModels.d.ts +24 -0
- package/dist/cjs/Plan/planModels.d.ts.map +1 -0
- package/dist/cjs/Plan/planModels.js +83 -0
- package/dist/cjs/Plan/planModels.js.map +1 -0
- package/dist/cjs/Portal/PortalButton.d.ts +10 -0
- package/dist/cjs/Portal/PortalButton.d.ts.map +1 -0
- package/dist/cjs/Portal/PortalButton.js +37 -0
- package/dist/cjs/Portal/PortalButton.js.map +1 -0
- package/dist/cjs/Portal/index.d.ts +3 -0
- package/dist/cjs/Portal/index.d.ts.map +1 -0
- package/dist/cjs/Portal/portalLinks.d.ts +6 -0
- package/dist/cjs/Portal/portalLinks.d.ts.map +1 -0
- package/dist/cjs/Portal/portalLinks.js +34 -0
- package/dist/cjs/Portal/portalLinks.js.map +1 -0
- package/dist/cjs/Provider/BoxOfficeContext.d.ts +16 -0
- package/dist/cjs/Provider/BoxOfficeContext.d.ts.map +1 -0
- package/dist/cjs/Provider/BoxOfficeContext.js +34 -0
- package/dist/cjs/Provider/BoxOfficeContext.js.map +1 -0
- package/dist/cjs/Provider/BoxOfficeProvider.d.ts +15 -0
- package/dist/cjs/Provider/BoxOfficeProvider.d.ts.map +1 -0
- package/dist/cjs/Provider/BoxOfficeProvider.js +72 -0
- package/dist/cjs/Provider/BoxOfficeProvider.js.map +1 -0
- package/dist/cjs/Provider/index.d.ts +3 -0
- package/dist/cjs/Provider/index.d.ts.map +1 -0
- package/dist/cjs/Seats/AssignSeatDialog.d.ts +9 -0
- package/dist/cjs/Seats/AssignSeatDialog.d.ts.map +1 -0
- package/dist/cjs/Seats/AssignSeatDialog.js +99 -0
- package/dist/cjs/Seats/AssignSeatDialog.js.map +1 -0
- package/dist/cjs/Seats/SeatsPage.d.ts +2 -0
- package/dist/cjs/Seats/SeatsPage.d.ts.map +1 -0
- package/dist/cjs/Seats/SeatsPage.js +87 -0
- package/dist/cjs/Seats/SeatsPage.js.map +1 -0
- package/dist/cjs/Seats/SeatsView.d.ts +14 -0
- package/dist/cjs/Seats/SeatsView.d.ts.map +1 -0
- package/dist/cjs/Seats/SeatsView.js +111 -0
- package/dist/cjs/Seats/SeatsView.js.map +1 -0
- package/dist/cjs/Seats/index.d.ts +5 -0
- package/dist/cjs/Seats/index.d.ts.map +1 -0
- package/dist/cjs/Seats/seatModels.d.ts +23 -0
- package/dist/cjs/Seats/seatModels.d.ts.map +1 -0
- package/dist/cjs/Seats/seatModels.js +65 -0
- package/dist/cjs/Seats/seatModels.js.map +1 -0
- package/dist/cjs/Usage/UsagePage.d.ts +2 -0
- package/dist/cjs/Usage/UsagePage.d.ts.map +1 -0
- package/dist/cjs/Usage/UsagePage.js +26 -0
- package/dist/cjs/Usage/UsagePage.js.map +1 -0
- package/dist/cjs/Usage/UsageView.d.ts +9 -0
- package/dist/cjs/Usage/UsageView.d.ts.map +1 -0
- package/dist/cjs/Usage/UsageView.js +108 -0
- package/dist/cjs/Usage/UsageView.js.map +1 -0
- package/dist/cjs/Usage/index.d.ts +4 -0
- package/dist/cjs/Usage/index.d.ts.map +1 -0
- package/dist/cjs/Usage/usageModels.d.ts +17 -0
- package/dist/cjs/Usage/usageModels.d.ts.map +1 -0
- package/dist/cjs/Usage/usageModels.js +57 -0
- package/dist/cjs/Usage/usageModels.js.map +1 -0
- package/dist/cjs/formatting.d.ts +5 -0
- package/dist/cjs/formatting.d.ts.map +1 -0
- package/dist/cjs/formatting.js +46 -0
- package/dist/cjs/formatting.js.map +1 -0
- package/dist/cjs/index.d.ts +10 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +85 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/Banners/NoLicense.d.ts +2 -0
- package/dist/esm/Banners/NoLicense.d.ts.map +1 -0
- package/dist/esm/Banners/NoLicense.js +48 -0
- package/dist/esm/Banners/NoLicense.js.map +1 -0
- package/dist/esm/Banners/SuspensionBanner.d.ts +7 -0
- package/dist/esm/Banners/SuspensionBanner.d.ts.map +1 -0
- package/dist/esm/Banners/SuspensionBanner.js +59 -0
- package/dist/esm/Banners/SuspensionBanner.js.map +1 -0
- package/dist/esm/Banners/TrialBanner.d.ts +2 -0
- package/dist/esm/Banners/TrialBanner.d.ts.map +1 -0
- package/dist/esm/Banners/TrialBanner.js +36 -0
- package/dist/esm/Banners/TrialBanner.js.map +1 -0
- package/dist/esm/Banners/bannerModels.d.ts +19 -0
- package/dist/esm/Banners/bannerModels.d.ts.map +1 -0
- package/dist/esm/Banners/bannerModels.js +96 -0
- package/dist/esm/Banners/bannerModels.js.map +1 -0
- package/dist/esm/Banners/index.d.ts +5 -0
- package/dist/esm/Banners/index.d.ts.map +1 -0
- package/dist/esm/Banners/index.js +5 -0
- package/dist/esm/Banners/index.js.map +1 -0
- package/dist/esm/Entitlements/EntitlementsContext.d.ts +4 -0
- package/dist/esm/Entitlements/EntitlementsContext.d.ts.map +1 -0
- package/dist/esm/Entitlements/EntitlementsContext.js +16 -0
- package/dist/esm/Entitlements/EntitlementsContext.js.map +1 -0
- package/dist/esm/Entitlements/RequiresModule.d.ts +9 -0
- package/dist/esm/Entitlements/RequiresModule.d.ts.map +1 -0
- package/dist/esm/Entitlements/RequiresModule.js +66 -0
- package/dist/esm/Entitlements/RequiresModule.js.map +1 -0
- package/dist/esm/Entitlements/entitlementModel.d.ts +25 -0
- package/dist/esm/Entitlements/entitlementModel.d.ts.map +1 -0
- package/dist/esm/Entitlements/entitlementModel.js +89 -0
- package/dist/esm/Entitlements/entitlementModel.js.map +1 -0
- package/dist/esm/Entitlements/index.d.ts +7 -0
- package/dist/esm/Entitlements/index.d.ts.map +1 -0
- package/dist/esm/Entitlements/index.js +7 -0
- package/dist/esm/Entitlements/index.js.map +1 -0
- package/dist/esm/Entitlements/moduleFilter.d.ts +6 -0
- package/dist/esm/Entitlements/moduleFilter.d.ts.map +1 -0
- package/dist/esm/Entitlements/moduleFilter.js +14 -0
- package/dist/esm/Entitlements/moduleFilter.js.map +1 -0
- package/dist/esm/Entitlements/requiresModuleModel.d.ts +10 -0
- package/dist/esm/Entitlements/requiresModuleModel.d.ts.map +1 -0
- package/dist/esm/Entitlements/requiresModuleModel.js +30 -0
- package/dist/esm/Entitlements/requiresModuleModel.js.map +1 -0
- package/dist/esm/Entitlements/useEntitlements.d.ts +5 -0
- package/dist/esm/Entitlements/useEntitlements.d.ts.map +1 -0
- package/dist/esm/Entitlements/useEntitlements.js +23 -0
- package/dist/esm/Entitlements/useEntitlements.js.map +1 -0
- package/dist/esm/Labels/BoxOfficeLabels.d.ts +116 -0
- package/dist/esm/Labels/BoxOfficeLabels.d.ts.map +1 -0
- package/dist/esm/Labels/BoxOfficeLabels.js +2 -0
- package/dist/esm/Labels/BoxOfficeLabels.js.map +1 -0
- package/dist/esm/Labels/defaultBoxOfficeLabels.d.ts +3 -0
- package/dist/esm/Labels/defaultBoxOfficeLabels.d.ts.map +1 -0
- package/dist/esm/Labels/defaultBoxOfficeLabels.js +118 -0
- package/dist/esm/Labels/defaultBoxOfficeLabels.js.map +1 -0
- package/dist/esm/Labels/format.d.ts +2 -0
- package/dist/esm/Labels/format.d.ts.map +1 -0
- package/dist/esm/Labels/format.js +13 -0
- package/dist/esm/Labels/format.js.map +1 -0
- package/dist/esm/Labels/index.d.ts +5 -0
- package/dist/esm/Labels/index.d.ts.map +1 -0
- package/dist/esm/Labels/index.js +5 -0
- package/dist/esm/Labels/index.js.map +1 -0
- package/dist/esm/Labels/resolveLabels.d.ts +3 -0
- package/dist/esm/Labels/resolveLabels.d.ts.map +1 -0
- package/dist/esm/Labels/resolveLabels.js +33 -0
- package/dist/esm/Labels/resolveLabels.js.map +1 -0
- package/dist/esm/Plan/PlanPage.d.ts +2 -0
- package/dist/esm/Plan/PlanPage.d.ts.map +1 -0
- package/dist/esm/Plan/PlanPage.js +22 -0
- package/dist/esm/Plan/PlanPage.js.map +1 -0
- package/dist/esm/Plan/PlanView.d.ts +10 -0
- package/dist/esm/Plan/PlanView.d.ts.map +1 -0
- package/dist/esm/Plan/PlanView.js +121 -0
- package/dist/esm/Plan/PlanView.js.map +1 -0
- package/dist/esm/Plan/index.d.ts +4 -0
- package/dist/esm/Plan/index.d.ts.map +1 -0
- package/dist/esm/Plan/index.js +4 -0
- package/dist/esm/Plan/index.js.map +1 -0
- package/dist/esm/Plan/planModels.d.ts +24 -0
- package/dist/esm/Plan/planModels.d.ts.map +1 -0
- package/dist/esm/Plan/planModels.js +78 -0
- package/dist/esm/Plan/planModels.js.map +1 -0
- package/dist/esm/Portal/PortalButton.d.ts +10 -0
- package/dist/esm/Portal/PortalButton.d.ts.map +1 -0
- package/dist/esm/Portal/PortalButton.js +35 -0
- package/dist/esm/Portal/PortalButton.js.map +1 -0
- package/dist/esm/Portal/index.d.ts +3 -0
- package/dist/esm/Portal/index.d.ts.map +1 -0
- package/dist/esm/Portal/index.js +3 -0
- package/dist/esm/Portal/index.js.map +1 -0
- package/dist/esm/Portal/portalLinks.d.ts +6 -0
- package/dist/esm/Portal/portalLinks.d.ts.map +1 -0
- package/dist/esm/Portal/portalLinks.js +31 -0
- package/dist/esm/Portal/portalLinks.js.map +1 -0
- package/dist/esm/Provider/BoxOfficeContext.d.ts +16 -0
- package/dist/esm/Provider/BoxOfficeContext.d.ts.map +1 -0
- package/dist/esm/Provider/BoxOfficeContext.js +29 -0
- package/dist/esm/Provider/BoxOfficeContext.js.map +1 -0
- package/dist/esm/Provider/BoxOfficeProvider.d.ts +15 -0
- package/dist/esm/Provider/BoxOfficeProvider.d.ts.map +1 -0
- package/dist/esm/Provider/BoxOfficeProvider.js +70 -0
- package/dist/esm/Provider/BoxOfficeProvider.js.map +1 -0
- package/dist/esm/Provider/index.d.ts +3 -0
- package/dist/esm/Provider/index.d.ts.map +1 -0
- package/dist/esm/Provider/index.js +3 -0
- package/dist/esm/Provider/index.js.map +1 -0
- package/dist/esm/Seats/AssignSeatDialog.d.ts +9 -0
- package/dist/esm/Seats/AssignSeatDialog.d.ts.map +1 -0
- package/dist/esm/Seats/AssignSeatDialog.js +97 -0
- package/dist/esm/Seats/AssignSeatDialog.js.map +1 -0
- package/dist/esm/Seats/SeatsPage.d.ts +2 -0
- package/dist/esm/Seats/SeatsPage.d.ts.map +1 -0
- package/dist/esm/Seats/SeatsPage.js +85 -0
- package/dist/esm/Seats/SeatsPage.js.map +1 -0
- package/dist/esm/Seats/SeatsView.d.ts +14 -0
- package/dist/esm/Seats/SeatsView.d.ts.map +1 -0
- package/dist/esm/Seats/SeatsView.js +109 -0
- package/dist/esm/Seats/SeatsView.js.map +1 -0
- package/dist/esm/Seats/index.d.ts +5 -0
- package/dist/esm/Seats/index.d.ts.map +1 -0
- package/dist/esm/Seats/index.js +5 -0
- package/dist/esm/Seats/index.js.map +1 -0
- package/dist/esm/Seats/seatModels.d.ts +23 -0
- package/dist/esm/Seats/seatModels.d.ts.map +1 -0
- package/dist/esm/Seats/seatModels.js +59 -0
- package/dist/esm/Seats/seatModels.js.map +1 -0
- package/dist/esm/Usage/UsagePage.d.ts +2 -0
- package/dist/esm/Usage/UsagePage.d.ts.map +1 -0
- package/dist/esm/Usage/UsagePage.js +24 -0
- package/dist/esm/Usage/UsagePage.js.map +1 -0
- package/dist/esm/Usage/UsageView.d.ts +9 -0
- package/dist/esm/Usage/UsageView.d.ts.map +1 -0
- package/dist/esm/Usage/UsageView.js +106 -0
- package/dist/esm/Usage/UsageView.js.map +1 -0
- package/dist/esm/Usage/index.d.ts +4 -0
- package/dist/esm/Usage/index.d.ts.map +1 -0
- package/dist/esm/Usage/index.js +4 -0
- package/dist/esm/Usage/index.js.map +1 -0
- package/dist/esm/Usage/usageModels.d.ts +17 -0
- package/dist/esm/Usage/usageModels.d.ts.map +1 -0
- package/dist/esm/Usage/usageModels.js +53 -0
- package/dist/esm/Usage/usageModels.js.map +1 -0
- package/dist/esm/formatting.d.ts +5 -0
- package/dist/esm/formatting.d.ts.map +1 -0
- package/dist/esm/formatting.js +42 -0
- package/dist/esm/formatting.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +29 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/formatting.ts +41 -0
- package/index.ts +12 -0
- package/package.json +84 -4
- package/styles.css +166 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var Common = require('@cratis/components/Common');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
|
|
7
|
+
var EntitlementsContext = require('../Entitlements/EntitlementsContext.js');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A button that opens the operator's customer portal with a signed link, to buy, try or change plan. It is not shown
|
|
11
|
+
* when the product has no customer portal.
|
|
12
|
+
*/ const PortalButton = ({ intent, label, offer, variant = 'solid', ...rest })=>{
|
|
13
|
+
const { openPortal } = BoxOfficeContext.useBoxOfficeContext();
|
|
14
|
+
const { canOpenPortal } = EntitlementsContext.useEntitlementsContext();
|
|
15
|
+
const [isOpening, setIsOpening] = react.useState(false);
|
|
16
|
+
if (!canOpenPortal) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const open = async ()=>{
|
|
20
|
+
setIsOpening(true);
|
|
21
|
+
try {
|
|
22
|
+
await openPortal(intent, offer);
|
|
23
|
+
} finally{
|
|
24
|
+
setIsOpening(false);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return /*#__PURE__*/ jsxRuntime.jsx(Common.Button, {
|
|
28
|
+
...rest,
|
|
29
|
+
variant: variant,
|
|
30
|
+
label: label,
|
|
31
|
+
loading: isOpening,
|
|
32
|
+
onClick: ()=>void open()
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.PortalButton = PortalButton;
|
|
37
|
+
//# sourceMappingURL=PortalButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortalButton.js","sources":["../../../Portal/PortalButton.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, ButtonProps } from '@cratis/components/Common';\nimport { Guid } from '@cratis/fundamentals';\nimport { PortalIntent } from '@cratis/showrunner.boxoffice';\nimport { useState } from 'react';\nimport { useBoxOfficeContext } from '../Provider/BoxOfficeContext.js';\nimport { useEntitlementsContext } from '../Entitlements/EntitlementsContext.js';\n\n/**\n * Props for {@link PortalButton}.\n */\nexport interface PortalButtonProps extends Pick<ButtonProps, 'variant' | 'tone' | 'size' | 'className' | 'icon'> {\n /** What the user wants to do in the customer portal. */\n intent: PortalIntent;\n\n /** The text of the button. */\n label: string;\n\n /** The offer the user looked at, when they did. */\n offer?: Guid;\n}\n\n/**\n * A button that opens the operator's customer portal with a signed link, to buy, try or change plan. It is not shown\n * when the product has no customer portal.\n */\nexport const PortalButton = ({ intent, label, offer, variant = 'solid', ...rest }: PortalButtonProps) => {\n const { openPortal } = useBoxOfficeContext();\n const { canOpenPortal } = useEntitlementsContext();\n const [isOpening, setIsOpening] = useState(false);\n\n if (!canOpenPortal) {\n return null;\n }\n\n const open = async () => {\n setIsOpening(true);\n try {\n await openPortal(intent, offer);\n } finally {\n setIsOpening(false);\n }\n };\n\n return <Button {...rest} variant={variant} label={label} loading={isOpening} onClick={() => void open()} />;\n};\n"],"names":["PortalButton","intent","label","offer","variant","rest","openPortal","useBoxOfficeContext","canOpenPortal","useEntitlementsContext","isOpening","setIsOpening","useState","open","_jsx","Button","loading","onClick"],"mappings":";;;;;;;;AAwBA;;;AAGC,IACM,MAAMA,YAAAA,GAAe,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,OAAAA,GAAU,OAAO,EAAE,GAAGC,IAAAA,EAAyB,GAAA;IAChG,MAAM,EAAEC,UAAU,EAAE,GAAGC,oCAAAA,EAAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,0CAAAA,EAAAA;AAC1B,IAAA,MAAM,CAACC,SAAAA,EAAWC,YAAAA,CAAa,GAAGC,cAAAA,CAAS,KAAA,CAAA;AAE3C,IAAA,IAAI,CAACJ,aAAAA,EAAe;QAChB,OAAO,IAAA;AACX,IAAA;AAEA,IAAA,MAAMK,IAAAA,GAAO,UAAA;QACTF,YAAAA,CAAa,IAAA,CAAA;QACb,IAAI;AACA,YAAA,MAAML,WAAWL,MAAAA,EAAQE,KAAAA,CAAAA;QAC7B,CAAA,QAAU;YACNQ,YAAAA,CAAa,KAAA,CAAA;AACjB,QAAA;AACJ,IAAA,CAAA;AAEA,IAAA,qBAAOG,cAAA,CAACC,aAAAA,EAAAA;AAAQ,QAAA,GAAGV,IAAI;QAAED,OAAAA,EAASA,OAAAA;QAASF,KAAAA,EAAOA,KAAAA;QAAOc,OAAAA,EAASN,SAAAA;AAAWO,QAAAA,OAAAA,EAAS,IAAM,KAAKJ,IAAAA;;AACrG;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../Portal/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ArcConfiguration } from '@cratis/arc.react';
|
|
2
|
+
import { Guid } from '@cratis/fundamentals';
|
|
3
|
+
import { PortalIntent } from '@cratis/showrunner.boxoffice';
|
|
4
|
+
export declare function linkToPortal(arc: ArcConfiguration, intent: PortalIntent, offer?: Guid): Promise<string | undefined>;
|
|
5
|
+
export declare function openInNewTab(url: string): void;
|
|
6
|
+
//# sourceMappingURL=portalLinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portalLinks.d.ts","sourceRoot":"","sources":["../../../Portal/portalLinks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAgB,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAS1E,wBAAsB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CASzH;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE9C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
* Asks the backend for a signed link that opens the customer portal for what the user wants to do there.
|
|
9
|
+
* @param arc The Arc configuration the application runs with.
|
|
10
|
+
* @param intent What the user wants to do.
|
|
11
|
+
* @param offer The offer the user looked at, when they did.
|
|
12
|
+
* @returns The link; undefined when the backend gave none.
|
|
13
|
+
*/ async function linkToPortal(arc, intent, offer) {
|
|
14
|
+
const query = new showrunner_boxoffice.LinkToPortal();
|
|
15
|
+
query.setMicroservice(arc.microservice);
|
|
16
|
+
query.setApiBasePath(arc.apiBasePath ?? '');
|
|
17
|
+
query.setOrigin(arc.origin ?? '');
|
|
18
|
+
query.setHttpHeadersCallback(arc.httpHeadersCallback ?? (()=>({})));
|
|
19
|
+
const result = await query.perform({
|
|
20
|
+
intent,
|
|
21
|
+
offer
|
|
22
|
+
});
|
|
23
|
+
return result.isSuccess && result.data?.url ? result.data.url : undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Opens a link in a new tab, without letting the page it opens reach back to this one.
|
|
27
|
+
* @param url The link.
|
|
28
|
+
*/ function openInNewTab(url) {
|
|
29
|
+
window.open(url, '_blank', 'noopener,noreferrer');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.linkToPortal = linkToPortal;
|
|
33
|
+
exports.openInNewTab = openInNewTab;
|
|
34
|
+
//# sourceMappingURL=portalLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portalLinks.js","sources":["../../../Portal/portalLinks.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 { ArcConfiguration } from '@cratis/arc.react';\nimport { Guid } from '@cratis/fundamentals';\nimport { LinkToPortal, PortalIntent } from '@cratis/showrunner.boxoffice';\n\n/**\n * Asks the backend for a signed link that opens the customer portal for what the user wants to do there.\n * @param arc The Arc configuration the application runs with.\n * @param intent What the user wants to do.\n * @param offer The offer the user looked at, when they did.\n * @returns The link; undefined when the backend gave none.\n */\nexport async function linkToPortal(arc: ArcConfiguration, intent: PortalIntent, offer?: Guid): Promise<string | undefined> {\n const query = new LinkToPortal();\n query.setMicroservice(arc.microservice);\n query.setApiBasePath(arc.apiBasePath ?? '');\n query.setOrigin(arc.origin ?? '');\n query.setHttpHeadersCallback(arc.httpHeadersCallback ?? (() => ({})));\n\n const result = await query.perform({ intent, offer });\n return result.isSuccess && result.data?.url ? result.data.url : undefined;\n}\n\n/**\n * Opens a link in a new tab, without letting the page it opens reach back to this one.\n * @param url The link.\n */\nexport function openInNewTab(url: string): void {\n window.open(url, '_blank', 'noopener,noreferrer');\n}\n"],"names":["linkToPortal","arc","intent","offer","query","LinkToPortal","setMicroservice","microservice","setApiBasePath","apiBasePath","setOrigin","origin","setHttpHeadersCallback","httpHeadersCallback","result","perform","isSuccess","data","url","undefined","openInNewTab","window","open"],"mappings":";;;;AAAA;AACA;AAMA;;;;;;AAMC,IACM,eAAeA,YAAAA,CAAaC,GAAqB,EAAEC,MAAoB,EAAEC,KAAY,EAAA;AACxF,IAAA,MAAMC,QAAQ,IAAIC,iCAAAA,EAAAA;IAClBD,KAAAA,CAAME,eAAe,CAACL,GAAAA,CAAIM,YAAY,CAAA;AACtCH,IAAAA,KAAAA,CAAMI,cAAc,CAACP,GAAAA,CAAIQ,WAAW,IAAI,EAAA,CAAA;AACxCL,IAAAA,KAAAA,CAAMM,SAAS,CAACT,GAAAA,CAAIU,MAAM,IAAI,EAAA,CAAA;IAC9BP,KAAAA,CAAMQ,sBAAsB,CAACX,GAAAA,CAAIY,mBAAmB,KAAK,KAAO,EAAC,CAAC,CAAA,CAAA;AAElE,IAAA,MAAMC,MAAAA,GAAS,MAAMV,KAAAA,CAAMW,OAAO,CAAC;AAAEb,QAAAA,MAAAA;AAAQC,QAAAA;AAAM,KAAA,CAAA;IACnD,OAAOW,MAAAA,CAAOE,SAAS,IAAIF,MAAAA,CAAOG,IAAI,EAAEC,GAAAA,GAAMJ,MAAAA,CAAOG,IAAI,CAACC,GAAG,GAAGC,SAAAA;AACpE;AAEA;;;IAIO,SAASC,YAAAA,CAAaF,GAAW,EAAA;IACpCG,MAAAA,CAAOC,IAAI,CAACJ,GAAAA,EAAK,QAAA,EAAU,qBAAA,CAAA;AAC/B;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Guid } from '@cratis/fundamentals';
|
|
2
|
+
import { PortalIntent, SeatStanding } from '@cratis/showrunner.boxoffice';
|
|
3
|
+
import { BoxOfficeLabels } from '../Labels/index.js';
|
|
4
|
+
export interface BoxOfficeContextValue {
|
|
5
|
+
readonly isProvided: boolean;
|
|
6
|
+
readonly labels: BoxOfficeLabels;
|
|
7
|
+
readonly locale?: string;
|
|
8
|
+
readonly seat?: SeatStanding;
|
|
9
|
+
openPortal(intent: PortalIntent, offer?: Guid): Promise<void>;
|
|
10
|
+
refresh(): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const defaultBoxOfficeContextValue: BoxOfficeContextValue;
|
|
13
|
+
export declare const BoxOfficeContext: import("react").Context<BoxOfficeContextValue>;
|
|
14
|
+
export declare const useBoxOfficeContext: () => BoxOfficeContextValue;
|
|
15
|
+
export declare const useBoxOfficeLabels: () => BoxOfficeLabels;
|
|
16
|
+
//# sourceMappingURL=BoxOfficeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxOfficeContext.d.ts","sourceRoot":"","sources":["../../../Provider/BoxOfficeContext.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAKpE,MAAM,WAAW,qBAAqB;IAElC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAG7B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAGjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGzB,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;IAO7B,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAK9D,OAAO,IAAI,IAAI,CAAC;CACnB;AASD,eAAO,MAAM,4BAA4B,EAAE,qBAK1C,CAAC;AAKF,eAAO,MAAM,gBAAgB,gDAAqE,CAAC;AAMnG,eAAO,MAAM,mBAAmB,QAAO,qBAAqD,CAAC;AAM7F,eAAO,MAAM,kBAAkB,QAAO,eAAsD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var resolveLabels = require('../Labels/resolveLabels.js');
|
|
5
|
+
|
|
6
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
7
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
8
|
+
const noop = ()=>{
|
|
9
|
+
/* Without a BoxOfficeProvider there is nothing to refresh. */ };
|
|
10
|
+
/**
|
|
11
|
+
* The value without a {@link BoxOfficeProvider}: English labels, and no portal to open.
|
|
12
|
+
*/ const defaultBoxOfficeContextValue = {
|
|
13
|
+
isProvided: false,
|
|
14
|
+
labels: resolveLabels.resolveLabels(),
|
|
15
|
+
openPortal: ()=>Promise.resolve(),
|
|
16
|
+
refresh: noop
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The React context {@link BoxOfficeProvider} provides.
|
|
20
|
+
*/ const BoxOfficeContext = react.createContext(defaultBoxOfficeContextValue);
|
|
21
|
+
/**
|
|
22
|
+
* Gets what {@link BoxOfficeProvider} provides, or the defaults outside one.
|
|
23
|
+
* @returns The {@link BoxOfficeContextValue}.
|
|
24
|
+
*/ const useBoxOfficeContext = ()=>react.useContext(BoxOfficeContext);
|
|
25
|
+
/**
|
|
26
|
+
* Gets the labels to show.
|
|
27
|
+
* @returns The {@link BoxOfficeLabels}.
|
|
28
|
+
*/ const useBoxOfficeLabels = ()=>react.useContext(BoxOfficeContext).labels;
|
|
29
|
+
|
|
30
|
+
exports.BoxOfficeContext = BoxOfficeContext;
|
|
31
|
+
exports.defaultBoxOfficeContextValue = defaultBoxOfficeContextValue;
|
|
32
|
+
exports.useBoxOfficeContext = useBoxOfficeContext;
|
|
33
|
+
exports.useBoxOfficeLabels = useBoxOfficeLabels;
|
|
34
|
+
//# sourceMappingURL=BoxOfficeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxOfficeContext.js","sources":["../../../Provider/BoxOfficeContext.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 { Guid } from '@cratis/fundamentals';\nimport { PortalIntent, SeatStanding } from '@cratis/showrunner.boxoffice';\nimport { createContext, useContext } from 'react';\nimport { BoxOfficeLabels, resolveLabels } from '../Labels/index.js';\n\n/**\n * What {@link BoxOfficeProvider} gives the Box Office components.\n */\nexport interface BoxOfficeContextValue {\n /** Whether a {@link BoxOfficeProvider} provides the value; the defaults otherwise. */\n readonly isProvided: boolean;\n\n /** The labels to show. */\n readonly labels: BoxOfficeLabels;\n\n /** The locale to format dates and numbers for; the browser's when not given. */\n readonly locale?: string;\n\n /** Where the signed-in user stands with the tenant's seats; nothing while it loads. */\n readonly seat?: SeatStanding;\n\n /**\n * Opens the customer portal for what the user wants to do there. Reports a failure with a toast.\n * @param intent What the user wants to do.\n * @param offer The offer the user looked at, when they did.\n */\n openPortal(intent: PortalIntent, offer?: Guid): Promise<void>;\n\n /**\n * Asks the backend again what the tenant may do, for after something changed it.\n */\n refresh(): void;\n}\n\nconst noop = () => {\n /* Without a BoxOfficeProvider there is nothing to refresh. */\n};\n\n/**\n * The value without a {@link BoxOfficeProvider}: English labels, and no portal to open.\n */\nexport const defaultBoxOfficeContextValue: BoxOfficeContextValue = {\n isProvided: false,\n labels: resolveLabels(),\n openPortal: () => Promise.resolve(),\n refresh: noop\n};\n\n/**\n * The React context {@link BoxOfficeProvider} provides.\n */\nexport const BoxOfficeContext = createContext<BoxOfficeContextValue>(defaultBoxOfficeContextValue);\n\n/**\n * Gets what {@link BoxOfficeProvider} provides, or the defaults outside one.\n * @returns The {@link BoxOfficeContextValue}.\n */\nexport const useBoxOfficeContext = (): BoxOfficeContextValue => useContext(BoxOfficeContext);\n\n/**\n * Gets the labels to show.\n * @returns The {@link BoxOfficeLabels}.\n */\nexport const useBoxOfficeLabels = (): BoxOfficeLabels => useContext(BoxOfficeContext).labels;\n"],"names":["noop","defaultBoxOfficeContextValue","isProvided","labels","resolveLabels","openPortal","Promise","resolve","refresh","BoxOfficeContext","createContext","useBoxOfficeContext","useContext","useBoxOfficeLabels"],"mappings":";;;;;AAAA;AACA;AAoCA,MAAMA,IAAAA,GAAO,IAAA;AACT,+DACJ,CAAA;AAEA;;UAGaC,4BAAAA,GAAsD;IAC/DC,UAAAA,EAAY,KAAA;IACZC,MAAAA,EAAQC,2BAAAA,EAAAA;IACRC,UAAAA,EAAY,IAAMC,QAAQC,OAAO,EAAA;IACjCC,OAAAA,EAASR;AACb;AAEA;;AAEC,IACM,MAAMS,gBAAAA,GAAmBC,mBAAAA,CAAqCT,4BAAAA;AAErE;;;AAGC,IACM,MAAMU,mBAAAA,GAAsB,IAA6BC,iBAAWH,gBAAAA;AAE3E;;;AAGC,IACM,MAAMI,kBAAAA,GAAqB,IAAuBD,gBAAAA,CAAWH,gBAAAA,CAAAA,CAAkBN;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Guid } from '@cratis/fundamentals';
|
|
2
|
+
import { EntitlementSummary, PortalIntent, SeatStanding } from '@cratis/showrunner.boxoffice';
|
|
3
|
+
import { ReactNode } from 'react';
|
|
4
|
+
import { BoxOfficeLabelOverrides } from '../Labels/index.js';
|
|
5
|
+
export interface BoxOfficeProviderProps {
|
|
6
|
+
labels?: BoxOfficeLabelOverrides;
|
|
7
|
+
locale?: string;
|
|
8
|
+
entitlements?: EntitlementSummary;
|
|
9
|
+
seat?: SeatStanding;
|
|
10
|
+
openLink?: (url: string) => void;
|
|
11
|
+
portalLink?: (intent: PortalIntent, offer?: Guid) => Promise<string | undefined>;
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare const BoxOfficeProvider: ({ labels, locale, entitlements: preloaded, seat: preloadedSeat, openLink, portalLink, children }: BoxOfficeProviderProps) => import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=BoxOfficeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxOfficeProvider.d.ts","sourceRoot":"","sources":["../../../Provider/BoxOfficeProvider.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAuB,kBAAkB,EAAQ,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACzH,OAAO,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAGvD,OAAO,EAAE,uBAAuB,EAAiB,MAAM,oBAAoB,CAAC;AAO5E,MAAM,WAAW,sBAAsB;IAEnC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAGjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAMhB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAMlC,IAAI,CAAC,EAAE,YAAY,CAAC;IAGpB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAMjC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAGjF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAOD,eAAO,MAAM,iBAAiB,GAAI,kGAAiH,sBAAsB,gCAyCxK,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var arc_react = require('@cratis/arc.react');
|
|
5
|
+
var Notifications = require('@cratis/components/Notifications');
|
|
6
|
+
var showrunner_boxoffice = require('@cratis/showrunner.boxoffice');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var entitlementModel = require('../Entitlements/entitlementModel.js');
|
|
9
|
+
var EntitlementsContext = require('../Entitlements/EntitlementsContext.js');
|
|
10
|
+
var resolveLabels = require('../Labels/resolveLabels.js');
|
|
11
|
+
var portalLinks = require('../Portal/portalLinks.js');
|
|
12
|
+
var BoxOfficeContext = require('./BoxOfficeContext.js');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Slots Box Office into an application: asks the backend what the signed-in user's tenant may do and where the user
|
|
16
|
+
* stands with its seats, and gives {@link useEntitlements}, {@link RequiresModule}, the banners and the pages what they
|
|
17
|
+
* need. Render it inside `<Arc>` and a `CratisComponentsProvider` with a toaster, once, around the shell.
|
|
18
|
+
*/ const BoxOfficeProvider = ({ labels, locale, entitlements: preloaded, seat: preloadedSeat, openLink = portalLinks.openInNewTab, portalLink, children })=>{
|
|
19
|
+
const arc = react.useContext(arc_react.ArcContext);
|
|
20
|
+
const resolvedLabels = react.useMemo(()=>resolveLabels.resolveLabels(labels), [
|
|
21
|
+
labels
|
|
22
|
+
]);
|
|
23
|
+
const [summaryResult, refreshSummary] = showrunner_boxoffice.CurrentEntitlements.when(preloaded === undefined).use();
|
|
24
|
+
const [seatResult, refreshSeat] = showrunner_boxoffice.Mine.when(preloadedSeat === undefined).use();
|
|
25
|
+
const summary = preloaded ?? (summaryResult.isSuccess && summaryResult.data?.modules ? summaryResult.data : undefined);
|
|
26
|
+
const seat = preloadedSeat ?? (seatResult.isSuccess && seatResult.data?.status !== undefined ? seatResult.data : undefined);
|
|
27
|
+
const entitlements = react.useMemo(()=>entitlementModel.entitlementsOf(summary), [
|
|
28
|
+
summary
|
|
29
|
+
]);
|
|
30
|
+
const value = react.useMemo(()=>({
|
|
31
|
+
isProvided: true,
|
|
32
|
+
labels: resolvedLabels,
|
|
33
|
+
locale,
|
|
34
|
+
seat,
|
|
35
|
+
openPortal: async (intent, offer)=>{
|
|
36
|
+
try {
|
|
37
|
+
const url = await (portalLink ? portalLink(intent, offer) : portalLinks.linkToPortal(arc, intent, offer));
|
|
38
|
+
if (url) {
|
|
39
|
+
openLink(url);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
/* The toast below says what went wrong; the details are of no use to the user. */ }
|
|
44
|
+
Notifications.toast.error({
|
|
45
|
+
title: resolvedLabels.common.portalFailed
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
refresh: ()=>{
|
|
49
|
+
void refreshSummary();
|
|
50
|
+
void refreshSeat();
|
|
51
|
+
}
|
|
52
|
+
}), [
|
|
53
|
+
resolvedLabels,
|
|
54
|
+
locale,
|
|
55
|
+
seat,
|
|
56
|
+
arc,
|
|
57
|
+
openLink,
|
|
58
|
+
portalLink,
|
|
59
|
+
refreshSummary,
|
|
60
|
+
refreshSeat
|
|
61
|
+
]);
|
|
62
|
+
return /*#__PURE__*/ jsxRuntime.jsx(BoxOfficeContext.BoxOfficeContext.Provider, {
|
|
63
|
+
value: value,
|
|
64
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(EntitlementsContext.EntitlementsContext.Provider, {
|
|
65
|
+
value: entitlements,
|
|
66
|
+
children: children
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
exports.BoxOfficeProvider = BoxOfficeProvider;
|
|
72
|
+
//# 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,wBAAY,EAAEC,UAAU,EAAEC,QAAQ,EAA0B,GAAA;AACrK,IAAA,MAAMC,MAAMC,gBAAAA,CAAWC,oBAAAA,CAAAA;AACvB,IAAA,MAAMC,cAAAA,GAAiBC,aAAAA,CAAQ,IAAMC,2BAAAA,CAAcf,MAAAA,CAAAA,EAAS;AAACA,QAAAA;AAAO,KAAA,CAAA;IACpE,MAAM,CAACgB,eAAeC,cAAAA,CAAe,GAAGC,yCAAoBC,IAAI,CAAChB,SAAAA,KAAciB,SAAAA,CAAAA,CAAWC,GAAG,EAAA;IAC7F,MAAM,CAACC,YAAYC,WAAAA,CAAY,GAAGC,0BAAKL,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,aAAAA,CAAQ,IAAMgB,+BAAAA,CAAeL,OAAAA,CAAAA,EAAU;AAACA,QAAAA;AAAQ,KAAA,CAAA;IAErE,MAAMM,KAAAA,GAAQjB,aAAAA,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,wBAAAA,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,mBAAAA,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,cAAA,CAACC,kCAAiBC,QAAQ,EAAA;QAACf,KAAAA,EAAOA,KAAAA;gCAC9Ba,cAAA,CAACG,wCAAoBD,QAAQ,EAAA;YAACf,KAAAA,EAAO7B,YAAAA;AAChCO,YAAAA,QAAAA,EAAAA;;;AAIjB;;"}
|
|
@@ -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,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,99 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var dialogs = require('@cratis/arc.react/dialogs');
|
|
5
|
+
var Common = require('@cratis/components/Common');
|
|
6
|
+
var Dialogs = require('@cratis/components/Dialogs');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
|
|
9
|
+
var seatModels = require('./seatModels.js');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Asks who to give a seat.
|
|
13
|
+
*/ const AssignSeatDialog = ({ visible, isBusy, onAssign, onClose })=>{
|
|
14
|
+
const labels = BoxOfficeContext.useBoxOfficeLabels();
|
|
15
|
+
const [person, setPerson] = react.useState(seatModels.emptySeatPerson);
|
|
16
|
+
const change = (field)=>(value)=>setPerson((current)=>({
|
|
17
|
+
...current,
|
|
18
|
+
[field]: value
|
|
19
|
+
}));
|
|
20
|
+
return /*#__PURE__*/ jsxRuntime.jsx(Dialogs.Dialog, {
|
|
21
|
+
title: labels.seats.assignTitle,
|
|
22
|
+
visible: visible,
|
|
23
|
+
okLabel: labels.seats.assignConfirm,
|
|
24
|
+
cancelLabel: labels.common.cancel,
|
|
25
|
+
closeAriaLabel: labels.common.close,
|
|
26
|
+
initialFocus: Dialogs.DialogInitialFocus.Content,
|
|
27
|
+
isValid: seatModels.isValidSeatPerson(person),
|
|
28
|
+
isBusy: isBusy,
|
|
29
|
+
onConfirm: ()=>onAssign(person),
|
|
30
|
+
onClose: (result)=>{
|
|
31
|
+
if (result !== dialogs.DialogResult.Ok) {
|
|
32
|
+
setPerson(seatModels.emptySeatPerson);
|
|
33
|
+
onClose();
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs("form", {
|
|
37
|
+
className: "boxoffice-seat-form",
|
|
38
|
+
onSubmit: (event)=>event.preventDefault(),
|
|
39
|
+
children: [
|
|
40
|
+
/*#__PURE__*/ jsxRuntime.jsxs("label", {
|
|
41
|
+
className: "boxoffice-field",
|
|
42
|
+
children: [
|
|
43
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
44
|
+
children: labels.seats.name
|
|
45
|
+
}),
|
|
46
|
+
/*#__PURE__*/ jsxRuntime.jsx(Common.TextInput, {
|
|
47
|
+
value: person.name,
|
|
48
|
+
onChange: change('name'),
|
|
49
|
+
autoComplete: "off"
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
}),
|
|
53
|
+
/*#__PURE__*/ jsxRuntime.jsxs("label", {
|
|
54
|
+
className: "boxoffice-field",
|
|
55
|
+
children: [
|
|
56
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
57
|
+
children: labels.seats.email
|
|
58
|
+
}),
|
|
59
|
+
/*#__PURE__*/ jsxRuntime.jsx(Common.TextInput, {
|
|
60
|
+
type: "email",
|
|
61
|
+
value: person.email,
|
|
62
|
+
onChange: change('email'),
|
|
63
|
+
autoComplete: "off"
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
}),
|
|
67
|
+
/*#__PURE__*/ jsxRuntime.jsxs("label", {
|
|
68
|
+
className: "boxoffice-field",
|
|
69
|
+
children: [
|
|
70
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
71
|
+
children: labels.seats.identityProvider
|
|
72
|
+
}),
|
|
73
|
+
/*#__PURE__*/ jsxRuntime.jsx(Common.TextInput, {
|
|
74
|
+
value: person.identityProvider,
|
|
75
|
+
onChange: change('identityProvider'),
|
|
76
|
+
autoComplete: "off"
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
}),
|
|
80
|
+
/*#__PURE__*/ jsxRuntime.jsxs("label", {
|
|
81
|
+
className: "boxoffice-field",
|
|
82
|
+
children: [
|
|
83
|
+
/*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
84
|
+
children: labels.seats.subject
|
|
85
|
+
}),
|
|
86
|
+
/*#__PURE__*/ jsxRuntime.jsx(Common.TextInput, {
|
|
87
|
+
value: person.subject,
|
|
88
|
+
onChange: change('subject'),
|
|
89
|
+
autoComplete: "off"
|
|
90
|
+
})
|
|
91
|
+
]
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
})
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
exports.AssignSeatDialog = AssignSeatDialog;
|
|
99
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"SeatsPage.d.ts","sourceRoot":"","sources":["../../../Seats/SeatsPage.tsx"],"names":[],"mappings":"AAmBA,eAAO,MAAM,SAAS,mCAiErB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var dialogs = require('@cratis/arc.react/dialogs');
|
|
5
|
+
var Notifications = require('@cratis/components/Notifications');
|
|
6
|
+
var showrunner_boxoffice = require('@cratis/showrunner.boxoffice');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var EntitlementsContext = require('../Entitlements/EntitlementsContext.js');
|
|
9
|
+
var format = require('../Labels/format.js');
|
|
10
|
+
var BoxOfficeContext = require('../Provider/BoxOfficeContext.js');
|
|
11
|
+
var AssignSeatDialog = require('./AssignSeatDialog.js');
|
|
12
|
+
var seatModels = require('./seatModels.js');
|
|
13
|
+
var SeatsView = require('./SeatsView.js');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The seats page: who holds the tenant's seats, with buttons to assign and release them. For the people who maintain
|
|
17
|
+
* the product; the backend refuses everyone else. Render it inside a {@link BoxOfficeProvider}, the `DialogComponents`
|
|
18
|
+
* registration and a `CratisComponentsProvider` with a toaster.
|
|
19
|
+
*/ const SeatsPage = ()=>{
|
|
20
|
+
const { labels, refresh } = BoxOfficeContext.useBoxOfficeContext();
|
|
21
|
+
const entitlements = EntitlementsContext.useEntitlementsContext();
|
|
22
|
+
const [roster, performRoster] = showrunner_boxoffice.CurrentRoster.use();
|
|
23
|
+
const [assignSeat] = showrunner_boxoffice.AssignSeat.use();
|
|
24
|
+
const [releaseSeat] = showrunner_boxoffice.ReleaseSeat.use();
|
|
25
|
+
const [confirm] = dialogs.useConfirmationDialog();
|
|
26
|
+
const [isAssigning, setIsAssigning] = react.useState(false);
|
|
27
|
+
const [isBusy, setIsBusy] = react.useState(false);
|
|
28
|
+
const rows = seatModels.seatRows(roster.isSuccess ? roster.data : undefined, entitlements.seats);
|
|
29
|
+
const changed = ()=>{
|
|
30
|
+
void performRoster();
|
|
31
|
+
refresh();
|
|
32
|
+
};
|
|
33
|
+
const assign = async (input)=>{
|
|
34
|
+
setIsBusy(true);
|
|
35
|
+
try {
|
|
36
|
+
assignSeat.holder = seatModels.personOf(input);
|
|
37
|
+
if (Notifications.toastCommandResult(await assignSeat.execute(), {
|
|
38
|
+
successTitle: labels.seats.assignConfirm
|
|
39
|
+
})) {
|
|
40
|
+
setIsAssigning(false);
|
|
41
|
+
changed();
|
|
42
|
+
}
|
|
43
|
+
} finally{
|
|
44
|
+
setIsBusy(false);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const release = async (holding)=>{
|
|
48
|
+
const answer = await confirm(labels.seats.releaseTitle, format.format(labels.seats.releaseMessage, {
|
|
49
|
+
name: holding.holder.name
|
|
50
|
+
}), dialogs.DialogButtons.YesNo);
|
|
51
|
+
if (answer !== dialogs.DialogResult.Yes) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const holder = new showrunner_boxoffice.SeatHolder();
|
|
55
|
+
holder.identityProvider = holding.holder.identityProvider;
|
|
56
|
+
holder.subject = holding.holder.identityProviderSubject;
|
|
57
|
+
releaseSeat.holder = holder;
|
|
58
|
+
if (Notifications.toastCommandResult(await releaseSeat.execute(), {
|
|
59
|
+
showSuccess: false
|
|
60
|
+
})) {
|
|
61
|
+
changed();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
65
|
+
children: [
|
|
66
|
+
/*#__PURE__*/ jsxRuntime.jsx(SeatsView.SeatsView, {
|
|
67
|
+
rows: rows,
|
|
68
|
+
summary: seatModels.seatSummary(rows, entitlements.seats),
|
|
69
|
+
isReadOnly: entitlements.isReadOnly,
|
|
70
|
+
isLoading: roster.isPerforming && !roster.isSuccess,
|
|
71
|
+
isUnauthorized: !roster.isAuthorized,
|
|
72
|
+
hasFailed: !roster.isPerforming && roster.isAuthorized && !roster.isSuccess,
|
|
73
|
+
onAssign: ()=>setIsAssigning(true),
|
|
74
|
+
onRelease: (holding)=>void release(holding)
|
|
75
|
+
}),
|
|
76
|
+
/*#__PURE__*/ jsxRuntime.jsx(AssignSeatDialog.AssignSeatDialog, {
|
|
77
|
+
visible: isAssigning,
|
|
78
|
+
isBusy: isBusy,
|
|
79
|
+
onAssign: (input)=>void assign(input),
|
|
80
|
+
onClose: ()=>setIsAssigning(false)
|
|
81
|
+
})
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
exports.SeatsPage = SeatsPage;
|
|
87
|
+
//# 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"}
|