@powerhousedao/contributor-billing 0.1.39 → 0.1.41
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/dist/document-models/index.d.ts +1 -0
- package/dist/document-models/index.d.ts.map +1 -1
- package/dist/document-models/index.js +1 -0
- package/dist/document-models/resource-template/actions.d.ts +32 -0
- package/dist/document-models/resource-template/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/actions.js +12 -0
- package/dist/document-models/resource-template/gen/actions.d.ts +14 -0
- package/dist/document-models/resource-template/gen/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/actions.js +6 -0
- package/dist/document-models/resource-template/gen/audience-management/actions.d.ts +12 -0
- package/dist/document-models/resource-template/gen/audience-management/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/audience-management/actions.js +1 -0
- package/dist/document-models/resource-template/gen/audience-management/creators.d.ts +5 -0
- package/dist/document-models/resource-template/gen/audience-management/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/audience-management/creators.js +4 -0
- package/dist/document-models/resource-template/gen/audience-management/error.d.ts +21 -0
- package/dist/document-models/resource-template/gen/audience-management/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/audience-management/error.js +20 -0
- package/dist/document-models/resource-template/gen/audience-management/operations.d.ts +8 -0
- package/dist/document-models/resource-template/gen/audience-management/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/audience-management/operations.js +3 -0
- package/dist/document-models/resource-template/gen/creators.d.ts +13 -0
- package/dist/document-models/resource-template/gen/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/creators.js +12 -0
- package/dist/document-models/resource-template/gen/document-model.d.ts +3 -0
- package/dist/document-models/resource-template/gen/document-model.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/document-model.js +410 -0
- package/dist/document-models/resource-template/gen/document-schema.d.ts +408 -0
- package/dist/document-models/resource-template/gen/document-schema.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/document-schema.js +33 -0
- package/dist/document-models/resource-template/gen/document-type.d.ts +2 -0
- package/dist/document-models/resource-template/gen/document-type.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/document-type.js +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts +20 -0
- package/dist/document-models/resource-template/gen/facet-targeting/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/actions.js +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts +7 -0
- package/dist/document-models/resource-template/gen/facet-targeting/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/creators.js +6 -0
- package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts +28 -0
- package/dist/document-models/resource-template/gen/facet-targeting/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/error.js +29 -0
- package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts +10 -0
- package/dist/document-models/resource-template/gen/facet-targeting/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/facet-targeting/operations.js +3 -0
- package/dist/document-models/resource-template/gen/index.d.ts +17 -0
- package/dist/document-models/resource-template/gen/index.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/index.js +16 -0
- package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts +16 -0
- package/dist/document-models/resource-template/gen/option-group-management/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/option-group-management/actions.js +1 -0
- package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts +6 -0
- package/dist/document-models/resource-template/gen/option-group-management/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/option-group-management/creators.js +5 -0
- package/dist/document-models/resource-template/gen/option-group-management/error.d.ts +28 -0
- package/dist/document-models/resource-template/gen/option-group-management/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/option-group-management/error.js +29 -0
- package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts +9 -0
- package/dist/document-models/resource-template/gen/option-group-management/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/option-group-management/operations.js +3 -0
- package/dist/document-models/resource-template/gen/ph-factories.d.ts +23 -0
- package/dist/document-models/resource-template/gen/ph-factories.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/ph-factories.js +61 -0
- package/dist/document-models/resource-template/gen/reducer.d.ts +3 -0
- package/dist/document-models/resource-template/gen/reducer.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/reducer.js +98 -0
- package/dist/document-models/resource-template/gen/schema/index.d.ts +3 -0
- package/dist/document-models/resource-template/gen/schema/index.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/schema/index.js +2 -0
- package/dist/document-models/resource-template/gen/schema/types.d.ts +305 -0
- package/dist/document-models/resource-template/gen/schema/types.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/schema/types.js +1 -0
- package/dist/document-models/resource-template/gen/schema/zod.d.ts +37 -0
- package/dist/document-models/resource-template/gen/schema/zod.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/schema/zod.js +236 -0
- package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts +12 -0
- package/dist/document-models/resource-template/gen/service-category-management/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/actions.js +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts +5 -0
- package/dist/document-models/resource-template/gen/service-category-management/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/creators.js +4 -0
- package/dist/document-models/resource-template/gen/service-category-management/error.d.ts +2 -0
- package/dist/document-models/resource-template/gen/service-category-management/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/error.js +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts +8 -0
- package/dist/document-models/resource-template/gen/service-category-management/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-category-management/operations.js +3 -0
- package/dist/document-models/resource-template/gen/service-management/actions.d.ts +24 -0
- package/dist/document-models/resource-template/gen/service-management/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-management/actions.js +1 -0
- package/dist/document-models/resource-template/gen/service-management/creators.d.ts +8 -0
- package/dist/document-models/resource-template/gen/service-management/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-management/creators.js +7 -0
- package/dist/document-models/resource-template/gen/service-management/error.d.ts +52 -0
- package/dist/document-models/resource-template/gen/service-management/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-management/error.js +61 -0
- package/dist/document-models/resource-template/gen/service-management/operations.d.ts +11 -0
- package/dist/document-models/resource-template/gen/service-management/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/service-management/operations.js +3 -0
- package/dist/document-models/resource-template/gen/template-management/actions.d.ts +20 -0
- package/dist/document-models/resource-template/gen/template-management/actions.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/template-management/actions.js +1 -0
- package/dist/document-models/resource-template/gen/template-management/creators.d.ts +7 -0
- package/dist/document-models/resource-template/gen/template-management/creators.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/template-management/creators.js +6 -0
- package/dist/document-models/resource-template/gen/template-management/error.d.ts +2 -0
- package/dist/document-models/resource-template/gen/template-management/error.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/template-management/error.js +1 -0
- package/dist/document-models/resource-template/gen/template-management/operations.d.ts +10 -0
- package/dist/document-models/resource-template/gen/template-management/operations.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/template-management/operations.js +3 -0
- package/dist/document-models/resource-template/gen/types.d.ts +12 -0
- package/dist/document-models/resource-template/gen/types.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/types.js +1 -0
- package/dist/document-models/resource-template/gen/utils.d.ts +15 -0
- package/dist/document-models/resource-template/gen/utils.d.ts.map +1 -0
- package/dist/document-models/resource-template/gen/utils.js +65 -0
- package/dist/document-models/resource-template/hooks.d.ts +11 -0
- package/dist/document-models/resource-template/hooks.d.ts.map +1 -0
- package/dist/document-models/resource-template/hooks.js +26 -0
- package/dist/document-models/resource-template/index.d.ts +10 -0
- package/dist/document-models/resource-template/index.d.ts.map +1 -0
- package/dist/document-models/resource-template/index.js +9 -0
- package/dist/document-models/resource-template/module.d.ts +5 -0
- package/dist/document-models/resource-template/module.d.ts.map +1 -0
- package/dist/document-models/resource-template/module.js +10 -0
- package/dist/document-models/resource-template/src/index.d.ts +2 -0
- package/dist/document-models/resource-template/src/index.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/index.js +1 -0
- package/dist/document-models/resource-template/src/reducers/audience-management.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/audience-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/audience-management.js +17 -0
- package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/facet-targeting.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/facet-targeting.js +46 -0
- package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/option-group-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/option-group-management.js +42 -0
- package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/service-category-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/service-category-management.js +10 -0
- package/dist/document-models/resource-template/src/reducers/service-management.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/service-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/service-management.js +68 -0
- package/dist/document-models/resource-template/src/reducers/template-management.d.ts +3 -0
- package/dist/document-models/resource-template/src/reducers/template-management.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/reducers/template-management.js +32 -0
- package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/audience-management.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/audience-management.test.js +29 -0
- package/dist/document-models/resource-template/src/tests/document-model.test.d.ts +10 -0
- package/dist/document-models/resource-template/src/tests/document-model.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/document-model.test.js +104 -0
- package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/facet-targeting.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/facet-targeting.test.js +49 -0
- package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/option-group-management.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/option-group-management.test.js +39 -0
- package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/service-category-management.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/service-category-management.test.js +29 -0
- package/dist/document-models/resource-template/src/tests/service-management.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/service-management.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/service-management.test.js +59 -0
- package/dist/document-models/resource-template/src/tests/template-management.test.d.ts +6 -0
- package/dist/document-models/resource-template/src/tests/template-management.test.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/tests/template-management.test.js +49 -0
- package/dist/document-models/resource-template/src/utils.d.ts +2 -0
- package/dist/document-models/resource-template/src/utils.d.ts.map +1 -0
- package/dist/document-models/resource-template/src/utils.js +1 -0
- package/dist/document-models/resource-template/utils.d.ts +14 -0
- package/dist/document-models/resource-template/utils.d.ts.map +1 -0
- package/dist/document-models/resource-template/utils.js +7 -0
- package/dist/document-models/service-offering/actions.d.ts +2 -0
- package/dist/document-models/service-offering/actions.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/document-model.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/document-model.js +47 -2
- package/dist/document-models/service-offering/gen/document-schema.d.ts +35 -16
- package/dist/document-models/service-offering/gen/document-schema.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/offering-management/actions.d.ts +10 -2
- package/dist/document-models/service-offering/gen/offering-management/actions.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/offering-management/creators.d.ts +4 -2
- package/dist/document-models/service-offering/gen/offering-management/creators.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/offering-management/creators.js +3 -1
- package/dist/document-models/service-offering/gen/offering-management/error.d.ts +20 -1
- package/dist/document-models/service-offering/gen/offering-management/error.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/offering-management/error.js +25 -0
- package/dist/document-models/service-offering/gen/offering-management/operations.d.ts +3 -1
- package/dist/document-models/service-offering/gen/offering-management/operations.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/ph-factories.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/ph-factories.js +1 -0
- package/dist/document-models/service-offering/gen/reducer.d.ts +1 -1
- package/dist/document-models/service-offering/gen/reducer.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/reducer.js +9 -1
- package/dist/document-models/service-offering/gen/schema/types.d.ts +21 -11
- package/dist/document-models/service-offering/gen/schema/types.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/schema/zod.d.ts +3 -1
- package/dist/document-models/service-offering/gen/schema/zod.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/schema/zod.js +14 -0
- package/dist/document-models/service-offering/gen/utils.d.ts.map +1 -1
- package/dist/document-models/service-offering/gen/utils.js +1 -0
- package/dist/document-models/service-offering/src/reducers/offering-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/offering-management.js +22 -4
- package/dist/document-models/service-offering/src/reducers/option-group-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/option-group-management.js +8 -11
- package/dist/document-models/service-offering/src/reducers/service-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/service-management.js +12 -15
- package/dist/document-models/service-offering/src/reducers/tier-management.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/reducers/tier-management.js +19 -21
- package/dist/document-models/service-offering/src/tests/offering-management.test.js +1 -81
- package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts +4 -0
- package/dist/document-models/service-offering/src/tests/tier-management.test.d.ts.map +1 -1
- package/dist/document-models/service-offering/src/tests/tier-management.test.js +109 -1
- package/dist/editors/accounts-editor/components/AccountForm.d.ts.map +1 -1
- package/dist/editors/builder-team-admin/components/DriveExplorer.d.ts.map +1 -1
- package/dist/editors/builder-team-admin/components/DriveExplorer.js +4 -0
- package/dist/editors/builder-team-admin/components/FolderTree.d.ts +1 -1
- package/dist/editors/builder-team-admin/components/FolderTree.d.ts.map +1 -1
- package/dist/editors/builder-team-admin/components/FolderTree.js +134 -9
- package/dist/editors/builder-team-admin/components/ResourcesServices.d.ts +8 -0
- package/dist/editors/builder-team-admin/components/ResourcesServices.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/ResourcesServices.js +76 -0
- package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.d.ts +27 -0
- package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/hooks/useResourcesServicesAutoPlacement.js +123 -0
- package/dist/editors/index.d.ts +1 -0
- package/dist/editors/index.d.ts.map +1 -1
- package/dist/editors/index.js +1 -0
- package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts +9 -0
- package/dist/editors/resource-template-editor/components/FacetTargeting.d.ts.map +1 -0
- package/dist/editors/resource-template-editor/components/FacetTargeting.js +451 -0
- package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts +9 -0
- package/dist/editors/resource-template-editor/components/TemplateInfo.d.ts.map +1 -0
- package/dist/editors/resource-template-editor/components/TemplateInfo.js +988 -0
- package/dist/editors/resource-template-editor/editor.d.ts +2 -0
- package/dist/editors/resource-template-editor/editor.d.ts.map +1 -0
- package/dist/editors/resource-template-editor/editor.js +149 -0
- package/dist/editors/resource-template-editor/module.d.ts +4 -0
- package/dist/editors/resource-template-editor/module.d.ts.map +1 -0
- package/dist/editors/resource-template-editor/module.js +10 -0
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts +9 -0
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.d.ts.map +1 -0
- package/dist/editors/service-offering-editor/components/ResourceTemplateSelector.js +1050 -0
- package/dist/editors/service-offering-editor/components/ServicesList.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/ServicesList.js +1 -1
- package/dist/editors/service-offering-editor/components/TabNavigation.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TabNavigation.js +17 -3
- package/dist/editors/service-offering-editor/components/TheMatrix.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/components/TheMatrix.js +284 -25
- package/dist/editors/service-offering-editor/editor.d.ts.map +1 -1
- package/dist/editors/service-offering-editor/editor.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/style.css +25 -0
- package/dist/subgraphs/budget-statements/resolvers.d.ts.map +1 -1
- package/dist/subgraphs/budget-statements/resolvers.js +76 -11
- package/dist/subgraphs/budget-statements/schema.d.ts.map +1 -1
- package/dist/subgraphs/budget-statements/schema.js +2 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServicesList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/ServicesList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,wDAAwD,CAAC;
|
|
1
|
+
{"version":3,"file":"ServicesList.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/ServicesList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAEtB,MAAM,wDAAwD,CAAC;AAOhE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CA8QrE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { generateId } from "document-model/core";
|
|
4
|
-
import { addService, updateService, deleteService,
|
|
4
|
+
import { addService, updateService, deleteService, } from "../../../document-models/service-offering/gen/creators.js";
|
|
5
5
|
export function ServicesList({ document, dispatch }) {
|
|
6
6
|
const { state } = document;
|
|
7
7
|
const globalState = state.global;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabNavigation.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TabNavigation.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"TabNavigation.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TabNavigation.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,GACb,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,CAAC;AA6EjB,UAAU,kBAAkB;IAC1B,SAAS,EAAE,KAAK,CAAC;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACpC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,WAAW,EACX,aAAkB,GACnB,EAAE,kBAAkB,2CAsDpB"}
|
|
@@ -2,9 +2,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
const tabs = [
|
|
3
3
|
{
|
|
4
4
|
id: "scope-facets",
|
|
5
|
-
label: "
|
|
6
|
-
accentColor: "
|
|
7
|
-
icon: (
|
|
5
|
+
label: "Resource Template",
|
|
6
|
+
accentColor: "teal",
|
|
7
|
+
icon: (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" }) })),
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
id: "tier-definition",
|
|
@@ -199,6 +199,20 @@ const styles = `
|
|
|
199
199
|
font-weight: 600;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
.so-tabs__item--active[data-accent="teal"] .so-tabs__icon-ring {
|
|
203
|
+
background: #ccfbf1;
|
|
204
|
+
box-shadow: 0 0 0 4px #f0fdfa, 0 4px 12px rgba(20, 184, 166, 0.25);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.so-tabs__item--active[data-accent="teal"] .so-tabs__icon {
|
|
208
|
+
color: #0d9488;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.so-tabs__item--active[data-accent="teal"] .so-tabs__label {
|
|
212
|
+
color: #0f766e;
|
|
213
|
+
font-weight: 600;
|
|
214
|
+
}
|
|
215
|
+
|
|
202
216
|
.so-tabs__item--active[data-accent="emerald"] .so-tabs__icon-ring {
|
|
203
217
|
background: var(--so-emerald-100);
|
|
204
218
|
box-shadow: 0 0 0 4px var(--so-emerald-50), 0 4px 12px rgba(16, 185, 129, 0.25);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TheMatrix.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TheMatrix.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAOtB,MAAM,wDAAwD,CAAC;AAUhE,UAAU,cAAc;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;
|
|
1
|
+
{"version":3,"file":"TheMatrix.d.ts","sourceRoot":"","sources":["../../../../editors/service-offering-editor/components/TheMatrix.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EAOtB,MAAM,wDAAwD,CAAC;AAUhE,UAAU,cAAc;IACtB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AAg0CD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,cAAmB,GACpB,EAAE,cAAc,2CAi+BhB"}
|
|
@@ -465,6 +465,12 @@ const matrixStyles = `
|
|
|
465
465
|
/* Metric Row */
|
|
466
466
|
.matrix__metric-row {
|
|
467
467
|
background: inherit;
|
|
468
|
+
cursor: pointer;
|
|
469
|
+
transition: var(--so-transition-fast);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.matrix__metric-row:hover {
|
|
473
|
+
background: rgba(124, 58, 237, 0.08);
|
|
468
474
|
}
|
|
469
475
|
|
|
470
476
|
.matrix__metric-cell {
|
|
@@ -476,6 +482,12 @@ const matrixStyles = `
|
|
|
476
482
|
z-index: 10;
|
|
477
483
|
}
|
|
478
484
|
|
|
485
|
+
.matrix__metric-name-wrapper {
|
|
486
|
+
display: flex;
|
|
487
|
+
align-items: center;
|
|
488
|
+
gap: 0.5rem;
|
|
489
|
+
}
|
|
490
|
+
|
|
479
491
|
.matrix__metric-name {
|
|
480
492
|
font-family: var(--so-font-sans);
|
|
481
493
|
font-size: 0.6875rem;
|
|
@@ -483,6 +495,47 @@ const matrixStyles = `
|
|
|
483
495
|
color: var(--so-slate-500);
|
|
484
496
|
}
|
|
485
497
|
|
|
498
|
+
.matrix__metric-actions {
|
|
499
|
+
display: flex;
|
|
500
|
+
gap: 0.25rem;
|
|
501
|
+
opacity: 0;
|
|
502
|
+
transition: var(--so-transition-fast);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.matrix__metric-row:hover .matrix__metric-actions {
|
|
506
|
+
opacity: 1;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.matrix__metric-btn {
|
|
510
|
+
padding: 0.125rem;
|
|
511
|
+
background: transparent;
|
|
512
|
+
border: none;
|
|
513
|
+
color: var(--so-slate-400);
|
|
514
|
+
cursor: pointer;
|
|
515
|
+
border-radius: var(--so-radius-sm);
|
|
516
|
+
transition: var(--so-transition-fast);
|
|
517
|
+
display: flex;
|
|
518
|
+
align-items: center;
|
|
519
|
+
justify-content: center;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
.matrix__metric-btn:hover {
|
|
523
|
+
background: var(--so-slate-200);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
.matrix__metric-btn--edit:hover {
|
|
527
|
+
color: var(--so-violet-600);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
.matrix__metric-btn--remove:hover {
|
|
531
|
+
color: var(--so-rose-600);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
.matrix__metric-btn-icon {
|
|
535
|
+
width: 0.75rem;
|
|
536
|
+
height: 0.75rem;
|
|
537
|
+
}
|
|
538
|
+
|
|
486
539
|
.matrix__metric-value-cell {
|
|
487
540
|
padding: 0.375rem 1rem;
|
|
488
541
|
text-align: center;
|
|
@@ -494,6 +547,38 @@ const matrixStyles = `
|
|
|
494
547
|
color: var(--so-slate-500);
|
|
495
548
|
}
|
|
496
549
|
|
|
550
|
+
/* Add Metric Button on Service Row */
|
|
551
|
+
.matrix__service-cell-wrapper {
|
|
552
|
+
display: flex;
|
|
553
|
+
align-items: center;
|
|
554
|
+
justify-content: space-between;
|
|
555
|
+
gap: 0.5rem;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.matrix__add-metric-btn {
|
|
559
|
+
opacity: 0.6;
|
|
560
|
+
font-family: var(--so-font-sans);
|
|
561
|
+
font-size: 0.6875rem;
|
|
562
|
+
font-weight: 500;
|
|
563
|
+
color: var(--so-violet-600);
|
|
564
|
+
background: transparent;
|
|
565
|
+
border: none;
|
|
566
|
+
cursor: pointer;
|
|
567
|
+
padding: 0.125rem 0.375rem;
|
|
568
|
+
border-radius: var(--so-radius-sm);
|
|
569
|
+
transition: var(--so-transition-fast);
|
|
570
|
+
white-space: nowrap;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.matrix__service-row:hover .matrix__add-metric-btn {
|
|
574
|
+
opacity: 1;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.matrix__add-metric-btn:hover {
|
|
578
|
+
background: var(--so-violet-100);
|
|
579
|
+
color: var(--so-violet-700);
|
|
580
|
+
}
|
|
581
|
+
|
|
497
582
|
/* Add Service Row */
|
|
498
583
|
.matrix__add-service-row td {
|
|
499
584
|
padding: 0.5rem 1rem;
|
|
@@ -1268,6 +1353,11 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
|
|
|
1268
1353
|
TEAM_STRUCTURE: "remote-team",
|
|
1269
1354
|
ANONYMITY: "high-anonymity",
|
|
1270
1355
|
});
|
|
1356
|
+
// Metric editing modal state
|
|
1357
|
+
const [metricModal, setMetricModal] = useState(null);
|
|
1358
|
+
const [metricName, setMetricName] = useState("");
|
|
1359
|
+
const [metricLimits, setMetricLimits] = useState({});
|
|
1360
|
+
const [metricEnabledTiers, setMetricEnabledTiers] = useState(new Set());
|
|
1271
1361
|
const getServiceGroup = (service) => {
|
|
1272
1362
|
// Services now have optionGroupId directly on them
|
|
1273
1363
|
return service.optionGroupId || null;
|
|
@@ -1389,6 +1479,104 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
|
|
|
1389
1479
|
setNewServiceDescription("");
|
|
1390
1480
|
setNewServiceSelectedTiers(new Set());
|
|
1391
1481
|
};
|
|
1482
|
+
// Metric modal handlers
|
|
1483
|
+
const handleAddMetric = (serviceId) => {
|
|
1484
|
+
setMetricModal({ serviceId, metric: null });
|
|
1485
|
+
setMetricName("");
|
|
1486
|
+
// Initialize limits for all tiers to empty string
|
|
1487
|
+
const initialLimits = {};
|
|
1488
|
+
// For new metrics, enable all tiers by default
|
|
1489
|
+
const allTierIds = new Set();
|
|
1490
|
+
tiers.forEach((tier) => {
|
|
1491
|
+
initialLimits[tier.id] = "";
|
|
1492
|
+
allTierIds.add(tier.id);
|
|
1493
|
+
});
|
|
1494
|
+
setMetricLimits(initialLimits);
|
|
1495
|
+
setMetricEnabledTiers(allTierIds);
|
|
1496
|
+
};
|
|
1497
|
+
const handleEditMetric = (serviceId, metric) => {
|
|
1498
|
+
setMetricModal({ serviceId, metric });
|
|
1499
|
+
setMetricName(metric);
|
|
1500
|
+
// Initialize limits with existing values and track which tiers have this metric
|
|
1501
|
+
const existingLimits = {};
|
|
1502
|
+
const enabledTiers = new Set();
|
|
1503
|
+
tiers.forEach((tier) => {
|
|
1504
|
+
const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
|
|
1505
|
+
// Load value from either limit (numeric) or notes (string)
|
|
1506
|
+
existingLimits[tier.id] =
|
|
1507
|
+
usageLimit?.limit?.toString() || usageLimit?.notes || "";
|
|
1508
|
+
if (usageLimit) {
|
|
1509
|
+
enabledTiers.add(tier.id);
|
|
1510
|
+
}
|
|
1511
|
+
});
|
|
1512
|
+
setMetricLimits(existingLimits);
|
|
1513
|
+
setMetricEnabledTiers(enabledTiers);
|
|
1514
|
+
};
|
|
1515
|
+
const handleRemoveMetric = (serviceId, metric) => {
|
|
1516
|
+
// Remove this metric from all tiers
|
|
1517
|
+
tiers.forEach((tier) => {
|
|
1518
|
+
const usageLimit = tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === metric);
|
|
1519
|
+
if (usageLimit) {
|
|
1520
|
+
dispatch(removeUsageLimit({
|
|
1521
|
+
tierId: tier.id,
|
|
1522
|
+
limitId: usageLimit.id,
|
|
1523
|
+
lastModified: new Date().toISOString(),
|
|
1524
|
+
}));
|
|
1525
|
+
}
|
|
1526
|
+
});
|
|
1527
|
+
};
|
|
1528
|
+
const handleSaveMetric = () => {
|
|
1529
|
+
if (!metricModal || !metricName.trim())
|
|
1530
|
+
return;
|
|
1531
|
+
const { serviceId, metric: originalMetric } = metricModal;
|
|
1532
|
+
const now = new Date().toISOString();
|
|
1533
|
+
tiers.forEach((tier) => {
|
|
1534
|
+
const isEnabled = metricEnabledTiers.has(tier.id);
|
|
1535
|
+
const limitValue = metricLimits[tier.id];
|
|
1536
|
+
const existingLimit = originalMetric
|
|
1537
|
+
? tier.usageLimits.find((ul) => ul.serviceId === serviceId && ul.metric === originalMetric)
|
|
1538
|
+
: null;
|
|
1539
|
+
// Check if value is numeric or string
|
|
1540
|
+
const parsedLimit = limitValue ? parseInt(limitValue, 10) : null;
|
|
1541
|
+
const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
|
|
1542
|
+
if (existingLimit && !isEnabled) {
|
|
1543
|
+
// Remove limit - tier was disabled
|
|
1544
|
+
dispatch(removeUsageLimit({
|
|
1545
|
+
tierId: tier.id,
|
|
1546
|
+
limitId: existingLimit.id,
|
|
1547
|
+
lastModified: now,
|
|
1548
|
+
}));
|
|
1549
|
+
}
|
|
1550
|
+
else if (existingLimit && isEnabled) {
|
|
1551
|
+
// Update existing limit - use limit for numeric values, notes for strings
|
|
1552
|
+
dispatch(updateUsageLimit({
|
|
1553
|
+
tierId: tier.id,
|
|
1554
|
+
limitId: existingLimit.id,
|
|
1555
|
+
metric: metricName.trim(),
|
|
1556
|
+
limit: isNumeric ? parsedLimit : null,
|
|
1557
|
+
notes: !isNumeric && limitValue ? limitValue.trim() : null,
|
|
1558
|
+
lastModified: now,
|
|
1559
|
+
}));
|
|
1560
|
+
}
|
|
1561
|
+
else if (!existingLimit && isEnabled) {
|
|
1562
|
+
// Add new limit - use limit for numeric values, notes for strings
|
|
1563
|
+
dispatch(addUsageLimit({
|
|
1564
|
+
tierId: tier.id,
|
|
1565
|
+
limitId: generateId(),
|
|
1566
|
+
serviceId,
|
|
1567
|
+
metric: metricName.trim(),
|
|
1568
|
+
limit: isNumeric ? parsedLimit : null,
|
|
1569
|
+
notes: !isNumeric && limitValue ? limitValue.trim() : null,
|
|
1570
|
+
resetPeriod: "MONTHLY",
|
|
1571
|
+
lastModified: now,
|
|
1572
|
+
}));
|
|
1573
|
+
}
|
|
1574
|
+
});
|
|
1575
|
+
setMetricModal(null);
|
|
1576
|
+
setMetricName("");
|
|
1577
|
+
setMetricLimits({});
|
|
1578
|
+
setMetricEnabledTiers(new Set());
|
|
1579
|
+
};
|
|
1392
1580
|
const getLevelDisplay = (serviceLevel) => {
|
|
1393
1581
|
if (!serviceLevel)
|
|
1394
1582
|
return { label: "—", color: "var(--so-slate-300)" };
|
|
@@ -1425,22 +1613,22 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
|
|
|
1425
1613
|
: ""}`, children: _jsxs("div", { className: "matrix__tier-header-inner", children: [_jsx("div", { className: "matrix__tier-radio" }), _jsx("span", { className: "matrix__tier-name", children: tier.name }), _jsx("span", { className: "matrix__tier-price", children: tier.isCustomPricing
|
|
1426
1614
|
? "Custom"
|
|
1427
1615
|
: `$${tier.pricing.amount}/mo` })] }) }, tier.id)))] }) }), _jsxs("tbody", { children: [_jsx("tr", { children: _jsx("td", { colSpan: tiers.length + 1, className: "matrix__section-header", children: "Service Catalog" }) }), (setupGroups.length > 0 ||
|
|
1428
|
-
ungroupedSetupServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M19 21V5a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v16" }), _jsx("path", { d: "M9 21v-6h6v6" }), _jsx("path", { d: "M9 7h.01M9 11h.01M15 7h.01M15 11h.01" })] }) }), "Setup & Formation"] }) })), setupGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[group.id], onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx }, group.id))), ungroupedSetupServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
|
|
1616
|
+
ungroupedSetupServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: [_jsx("path", { d: "M19 21V5a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v16" }), _jsx("path", { d: "M9 21v-6h6v6" }), _jsx("path", { d: "M9 7h.01M9 11h.01M15 7h.01M15 11h.01" })] }) }), "Setup & Formation"] }) })), setupGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[group.id], onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), ungroupedSetupServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
|
|
1429
1617
|
id: UNGROUPED_ID,
|
|
1430
1618
|
name: "Setup & Formation",
|
|
1431
1619
|
description: null,
|
|
1432
1620
|
isAddOn: false,
|
|
1433
1621
|
defaultSelected: true,
|
|
1434
|
-
}, services: ungroupedSetupServices, tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[UNGROUPED_ID], selectedTierIdx: selectedTierIdx }, "ungrouped-setup")), (regularGroups.length > 0 ||
|
|
1435
|
-
ungroupedRegularServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" }) }) }), "Recurring Services"] }) })), regularGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, dispatch: dispatch }, group.id))), ungroupedRegularServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
|
|
1622
|
+
}, services: ungroupedSetupServices, tiers: tiers, isSetupFormation: true, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, setupFee: groupSetupFees[UNGROUPED_ID], selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, "ungrouped-setup")), (regularGroups.length > 0 ||
|
|
1623
|
+
ungroupedRegularServices.length > 0) && (_jsx("tr", { children: _jsxs("td", { colSpan: tiers.length + 1, className: "matrix__category-header", children: [_jsx("span", { className: "matrix__category-icon", children: _jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.75", children: _jsx("path", { d: "M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83" }) }) }), "Recurring Services"] }) })), regularGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, dispatch: dispatch, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), ungroupedRegularServices.length > 0 && (_jsx(ServiceGroupSection, { group: {
|
|
1436
1624
|
id: UNGROUPED_ID,
|
|
1437
1625
|
name: "Recurring Services",
|
|
1438
1626
|
description: null,
|
|
1439
1627
|
isAddOn: false,
|
|
1440
1628
|
defaultSelected: true,
|
|
1441
|
-
}, services: ungroupedRegularServices, tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, selectedTierIdx: selectedTierIdx }, "ungrouped-regular")), _jsxs("tr", { className: "matrix__total-row", children: [_jsx("td", { children: "SUBTOTAL" }), tiers.map((tier) => (_jsx("td", { style: { textAlign: "center" }, children: tier.isCustomPricing
|
|
1629
|
+
}, services: ungroupedRegularServices, tiers: tiers, isSetupFormation: false, isOptional: false, isEnabled: true, onToggle: () => { }, getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, "ungrouped-regular")), _jsxs("tr", { className: "matrix__total-row", children: [_jsx("td", { children: "SUBTOTAL" }), tiers.map((tier) => (_jsx("td", { style: { textAlign: "center" }, children: tier.isCustomPricing
|
|
1442
1630
|
? "Custom"
|
|
1443
|
-
: `$${tier.pricing.amount}` }, tier.id)))] }), addonGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: true, isEnabled: enabledOptionalGroups.has(group.id), onToggle: () => toggleOptionalGroup(group.id), getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx }, group.id))), _jsxs("tr", { className: "matrix__grand-total-row", children: [_jsx("td", { children: "Grand Total (Recurring)" }), tiers.map((tier, idx) => {
|
|
1631
|
+
: `$${tier.pricing.amount}` }, tier.id)))] }), addonGroups.map((group) => (_jsx(ServiceGroupSection, { group: group, services: groupedServices.get(group.id) || [], tiers: tiers, isSetupFormation: false, isOptional: true, isEnabled: enabledOptionalGroups.has(group.id), onToggle: () => toggleOptionalGroup(group.id), getServiceLevelForTier: getServiceLevelForTier, getUniqueMetricsForService: getUniqueMetricsForService, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, handleSetServiceLevel: handleSetServiceLevel, dispatch: dispatch, onAddService: openAddServiceModal, selectedTierIdx: selectedTierIdx, onAddMetric: handleAddMetric, onEditMetric: handleEditMetric, onRemoveMetric: handleRemoveMetric }, group.id))), _jsxs("tr", { className: "matrix__grand-total-row", children: [_jsx("td", { children: "Grand Total (Recurring)" }), tiers.map((tier, idx) => {
|
|
1444
1632
|
const tierPrice = tier.pricing.amount || 0;
|
|
1445
1633
|
const grandTotal = tierPrice;
|
|
1446
1634
|
return (_jsx("td", { className: idx === selectedTierIdx
|
|
@@ -1468,9 +1656,67 @@ export function TheMatrix({ document, dispatch, groupSetupFees = {}, }) {
|
|
|
1468
1656
|
setNewServiceName("");
|
|
1469
1657
|
setNewServiceDescription("");
|
|
1470
1658
|
setNewServiceSelectedTiers(new Set());
|
|
1471
|
-
}, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleAddService, disabled: !newServiceName.trim() || newServiceSelectedTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: "Add Service" })] })] }) }))
|
|
1659
|
+
}, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleAddService, disabled: !newServiceName.trim() || newServiceSelectedTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: "Add Service" })] })] }) })), metricModal && (_jsx("div", { className: "matrix__modal-overlay", children: _jsxs("div", { className: "matrix__modal matrix__modal--wide", children: [_jsx("h3", { className: "matrix__modal-title", children: metricModal.metric ? "Edit Metric" : "Add Metric" }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Metric Name" }), _jsx("input", { type: "text", value: metricName, onChange: (e) => setMetricName(e.target.value), placeholder: "e.g., API Calls, Storage, Users", className: "matrix__modal-input", autoFocus: true })] }), _jsxs("div", { className: "matrix__modal-field", children: [_jsx("label", { className: "matrix__modal-label", children: "Pricing Tiers & Values" }), _jsx("p", { className: "matrix__modal-hint", style: { marginBottom: "0.75rem" }, children: "Enable the metric for each tier and set values." }), _jsx("div", { style: {
|
|
1660
|
+
display: "flex",
|
|
1661
|
+
flexDirection: "column",
|
|
1662
|
+
gap: "0.5rem",
|
|
1663
|
+
}, children: tiers.map((tier) => {
|
|
1664
|
+
const isEnabled = metricEnabledTiers.has(tier.id);
|
|
1665
|
+
return (_jsxs("div", { style: {
|
|
1666
|
+
display: "flex",
|
|
1667
|
+
alignItems: "center",
|
|
1668
|
+
gap: "0.75rem",
|
|
1669
|
+
padding: "0.5rem",
|
|
1670
|
+
borderRadius: "6px",
|
|
1671
|
+
background: isEnabled
|
|
1672
|
+
? "rgba(124, 58, 237, 0.05)"
|
|
1673
|
+
: "#f8fafc",
|
|
1674
|
+
border: isEnabled
|
|
1675
|
+
? "1px solid rgba(124, 58, 237, 0.2)"
|
|
1676
|
+
: "1px solid #e2e8f0",
|
|
1677
|
+
transition: "all 0.15s ease",
|
|
1678
|
+
}, children: [_jsxs("label", { style: {
|
|
1679
|
+
display: "flex",
|
|
1680
|
+
alignItems: "center",
|
|
1681
|
+
gap: "0.5rem",
|
|
1682
|
+
cursor: "pointer",
|
|
1683
|
+
minWidth: "120px",
|
|
1684
|
+
}, children: [_jsx("input", { type: "checkbox", checked: isEnabled, onChange: (e) => {
|
|
1685
|
+
setMetricEnabledTiers((prev) => {
|
|
1686
|
+
const next = new Set(prev);
|
|
1687
|
+
if (e.target.checked) {
|
|
1688
|
+
next.add(tier.id);
|
|
1689
|
+
}
|
|
1690
|
+
else {
|
|
1691
|
+
next.delete(tier.id);
|
|
1692
|
+
}
|
|
1693
|
+
return next;
|
|
1694
|
+
});
|
|
1695
|
+
}, style: {
|
|
1696
|
+
width: "16px",
|
|
1697
|
+
height: "16px",
|
|
1698
|
+
accentColor: "#7c3aed",
|
|
1699
|
+
cursor: "pointer",
|
|
1700
|
+
} }), _jsx("span", { style: {
|
|
1701
|
+
fontWeight: 600,
|
|
1702
|
+
color: isEnabled ? "#334155" : "#94a3b8",
|
|
1703
|
+
fontSize: "0.875rem",
|
|
1704
|
+
}, children: tier.name })] }), _jsx("input", { type: "text", value: metricLimits[tier.id] || "", onChange: (e) => setMetricLimits((prev) => ({
|
|
1705
|
+
...prev,
|
|
1706
|
+
[tier.id]: e.target.value,
|
|
1707
|
+
})), placeholder: isEnabled ? "Enter value" : "—", className: "matrix__modal-input", disabled: !isEnabled, style: {
|
|
1708
|
+
flex: 1,
|
|
1709
|
+
opacity: isEnabled ? 1 : 0.5,
|
|
1710
|
+
cursor: isEnabled ? "text" : "not-allowed",
|
|
1711
|
+
} })] }, tier.id));
|
|
1712
|
+
}) })] }), _jsxs("div", { className: "matrix__modal-actions", children: [_jsx("button", { onClick: () => {
|
|
1713
|
+
setMetricModal(null);
|
|
1714
|
+
setMetricName("");
|
|
1715
|
+
setMetricLimits({});
|
|
1716
|
+
setMetricEnabledTiers(new Set());
|
|
1717
|
+
}, className: "matrix__modal-btn matrix__modal-btn--cancel", children: "Cancel" }), _jsx("button", { onClick: handleSaveMetric, disabled: !metricName.trim() || metricEnabledTiers.size === 0, className: "matrix__modal-btn matrix__modal-btn--primary", children: metricModal.metric ? "Save Changes" : "Add Metric" })] })] }) }))] })] }));
|
|
1472
1718
|
}
|
|
1473
|
-
function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptional, isEnabled, onToggle, getServiceLevelForTier, getUniqueMetricsForService, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, setupFee, onAddService, selectedTierIdx, }) {
|
|
1719
|
+
function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptional, isEnabled, onToggle, getServiceLevelForTier, getUniqueMetricsForService, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, setupFee, onAddService, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, }) {
|
|
1474
1720
|
const showGroup = services.length > 0 || onAddService;
|
|
1475
1721
|
if (!showGroup)
|
|
1476
1722
|
return null;
|
|
@@ -1492,7 +1738,7 @@ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptio
|
|
|
1492
1738
|
? "OPTIONAL"
|
|
1493
1739
|
: "INCLUDED" }) })] }), services.map((service) => {
|
|
1494
1740
|
const metrics = getUniqueMetricsForService(service.id);
|
|
1495
|
-
return (_jsx(ServiceRowWithMetrics, { service: service, metrics: metrics, tiers: tiers, rowClass: rowClass, getServiceLevelForTier: getServiceLevelForTier, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, selectedTierIdx: selectedTierIdx }, service.id));
|
|
1741
|
+
return (_jsx(ServiceRowWithMetrics, { service: service, metrics: metrics, tiers: tiers, rowClass: rowClass, getServiceLevelForTier: getServiceLevelForTier, getUsageLimitForMetric: getUsageLimitForMetric, getLevelDisplay: getLevelDisplay, selectedCell: selectedCell, setSelectedCell: setSelectedCell, selectedTierIdx: selectedTierIdx, onAddMetric: onAddMetric, onEditMetric: onEditMetric, onRemoveMetric: onRemoveMetric }, service.id));
|
|
1496
1742
|
}), onAddService && group.id !== "__ungrouped__" && (_jsxs("tr", { className: `matrix__add-service-row ${rowClass}`, children: [_jsx("td", { className: rowClass, children: _jsxs("button", { onClick: () => onAddService(group.id, isSetupFormation), className: "matrix__add-service-btn", children: [_jsx("svg", { className: "matrix__add-service-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 4v16m8-8H4" }) }), "+ Add a Service"] }) }), _jsx("td", { colSpan: tiers.length, className: rowClass })] })), isSetupFormation && (_jsxs("tr", { className: "matrix__setup-total-row", children: [_jsx("td", { children: "TOTAL SETUP FEE" }), _jsx("td", { colSpan: tiers.length, style: { textAlign: "center" }, children: setupFee
|
|
1497
1743
|
? `$${setupFee} flat fee (applied to all tiers)`
|
|
1498
1744
|
: "No setup fee configured" })] })), isOptional && (_jsxs("tr", { className: `matrix__total-row ${headerClass}`, children: [_jsx("td", { className: headerClass, children: "SUBTOTAL" }), tiers.map((tier, tierIdx) => {
|
|
@@ -1508,8 +1754,11 @@ function ServiceGroupSection({ group, services, tiers, isSetupFormation, isOptio
|
|
|
1508
1754
|
}, children: isEnabled ? priceDisplay : "$0" }, tier.id));
|
|
1509
1755
|
})] }))] }));
|
|
1510
1756
|
}
|
|
1511
|
-
function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLevelForTier, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, selectedTierIdx, }) {
|
|
1512
|
-
return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `matrix__service-row ${rowClass}`, children: [_jsx("td", { className: `matrix__service-cell ${rowClass}`, children: _jsx("span", { className: "matrix__service-title", children: service.title })
|
|
1757
|
+
function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLevelForTier, getUsageLimitForMetric, getLevelDisplay, selectedCell, setSelectedCell, selectedTierIdx, onAddMetric, onEditMetric, onRemoveMetric, }) {
|
|
1758
|
+
return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `matrix__service-row ${rowClass}`, children: [_jsx("td", { className: `matrix__service-cell ${rowClass}`, children: _jsxs("div", { className: "matrix__service-cell-wrapper", children: [_jsx("span", { className: "matrix__service-title", children: service.title }), _jsx("button", { onClick: (e) => {
|
|
1759
|
+
e.stopPropagation();
|
|
1760
|
+
onAddMetric(service.id);
|
|
1761
|
+
}, className: "matrix__add-metric-btn", title: "Add metric to this service", children: "+ Metric" })] }) }), tiers.map((tier, tierIdx) => {
|
|
1513
1762
|
const serviceLevel = getServiceLevelForTier(service.id, tier);
|
|
1514
1763
|
const display = getLevelDisplay(serviceLevel);
|
|
1515
1764
|
const isSelected = selectedCell?.serviceId === service.id &&
|
|
@@ -1517,14 +1766,20 @@ function ServiceRowWithMetrics({ service, metrics, tiers, rowClass, getServiceLe
|
|
|
1517
1766
|
return (_jsx("td", { className: `matrix__level-cell ${isSelected ? "matrix__level-cell--selected" : ""} ${tierIdx === selectedTierIdx ? "matrix__level-cell--highlight" : ""}`, onClick: () => setSelectedCell(isSelected
|
|
1518
1767
|
? null
|
|
1519
1768
|
: { serviceId: service.id, tierId: tier.id }), children: _jsx("span", { className: "matrix__level-value", style: { color: display.color }, children: display.label }) }, tier.id));
|
|
1520
|
-
})] }), metrics.map((metric) => (_jsxs("tr", { className: `matrix__metric-row ${rowClass}`, children: [_jsx("td", { className: `matrix__metric-cell ${rowClass}`, children: _jsx("span", { className: "matrix__metric-name", children: metric })
|
|
1769
|
+
})] }), metrics.map((metric) => (_jsxs("tr", { className: `matrix__metric-row ${rowClass}`, onClick: () => onEditMetric(service.id, metric), children: [_jsx("td", { className: `matrix__metric-cell ${rowClass}`, children: _jsxs("div", { className: "matrix__metric-name-wrapper", children: [_jsx("span", { className: "matrix__metric-name", children: metric }), _jsxs("div", { className: "matrix__metric-actions", children: [_jsx("button", { onClick: (e) => {
|
|
1770
|
+
e.stopPropagation();
|
|
1771
|
+
onEditMetric(service.id, metric);
|
|
1772
|
+
}, className: "matrix__metric-btn matrix__metric-btn--edit", title: "Edit metric", children: _jsx("svg", { className: "matrix__metric-btn-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }), _jsx("button", { onClick: (e) => {
|
|
1773
|
+
e.stopPropagation();
|
|
1774
|
+
onRemoveMetric(service.id, metric);
|
|
1775
|
+
}, className: "matrix__metric-btn matrix__metric-btn--remove", title: "Remove metric", children: _jsx("svg", { className: "matrix__metric-btn-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" }) }) })] })] }) }), tiers.map((tier, tierIdx) => {
|
|
1521
1776
|
const usageLimit = getUsageLimitForMetric(service.id, metric, tier);
|
|
1522
1777
|
return (_jsx("td", { className: `matrix__metric-value-cell ${tierIdx === selectedTierIdx
|
|
1523
1778
|
? "matrix__level-cell--highlight"
|
|
1524
1779
|
: ""}`, children: _jsx("span", { className: "matrix__metric-value", children: usageLimit
|
|
1525
1780
|
? usageLimit.limit
|
|
1526
1781
|
? `Up to ${usageLimit.limit}`
|
|
1527
|
-
: "Unlimited"
|
|
1782
|
+
: usageLimit.notes || "Unlimited"
|
|
1528
1783
|
: "—" }) }, tier.id));
|
|
1529
1784
|
})] }, `${service.id}-${metric}`)))] }));
|
|
1530
1785
|
}
|
|
@@ -1601,12 +1856,15 @@ function ServiceLevelDetailPanel({ serviceId, tierId, services, tiers, optionGro
|
|
|
1601
1856
|
const handleAddLimit = () => {
|
|
1602
1857
|
if (!newMetric.trim())
|
|
1603
1858
|
return;
|
|
1859
|
+
const parsedLimit = newLimit ? parseInt(newLimit, 10) : null;
|
|
1860
|
+
const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
|
|
1604
1861
|
dispatch(addUsageLimit({
|
|
1605
1862
|
tierId: tier.id,
|
|
1606
1863
|
limitId: generateId(),
|
|
1607
1864
|
serviceId: service.id,
|
|
1608
1865
|
metric: newMetric.trim(),
|
|
1609
|
-
limit:
|
|
1866
|
+
limit: isNumeric ? parsedLimit : undefined,
|
|
1867
|
+
notes: !isNumeric && newLimit ? newLimit.trim() : undefined,
|
|
1610
1868
|
resetPeriod: "MONTHLY",
|
|
1611
1869
|
lastModified: new Date().toISOString(),
|
|
1612
1870
|
}));
|
|
@@ -1652,35 +1910,36 @@ function ServiceLevelDetailPanel({ serviceId, tierId, services, tiers, optionGro
|
|
|
1652
1910
|
}));
|
|
1653
1911
|
}
|
|
1654
1912
|
};
|
|
1655
|
-
return (_jsx("div", { ref: overlayRef, className: "matrix__panel-overlay", onClick: handleOverlayClick, role: "dialog", "aria-modal": "true", "aria-labelledby": "panel-title", children: _jsxs("div", { ref: panelRef, className: "matrix__panel", children: [_jsxs("div", { className: "matrix__panel-header", children: [_jsxs("div", { className: "matrix__panel-header-top", children: [_jsxs("span", { className: "matrix__panel-tier", children: [tier.name, " Tier"] }), _jsx("button", { onClick: onClose, className: "matrix__panel-close", children: _jsx("svg", { className: "matrix__panel-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx("h3", { id: "panel-title", className: "matrix__panel-title", children: service.title })] }),
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
setIsAddingMetric(false);
|
|
1661
|
-
}, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }))] })] }), _jsx("div", { className: "matrix__panel-footer", children: _jsx("button", { onClick: onClose, className: "matrix__panel-done-btn", children: "Done" }) })] }) }));
|
|
1913
|
+
return (_jsx("div", { ref: overlayRef, className: "matrix__panel-overlay", onClick: handleOverlayClick, role: "dialog", "aria-modal": "true", "aria-labelledby": "panel-title", children: _jsxs("div", { ref: panelRef, className: "matrix__panel", children: [_jsxs("div", { className: "matrix__panel-header", children: [_jsxs("div", { className: "matrix__panel-header-top", children: [_jsxs("span", { className: "matrix__panel-tier", children: [tier.name, " Tier"] }), _jsx("button", { onClick: onClose, className: "matrix__panel-close", children: _jsx("svg", { className: "matrix__panel-close-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), _jsx("h3", { id: "panel-title", className: "matrix__panel-title", children: service.title })] }), _jsx("div", { className: "matrix__panel-body", children: _jsxs("div", { children: [_jsxs("div", { className: "matrix__panel-limits-header", children: [_jsx("label", { className: "matrix__panel-section-label", style: { marginBottom: 0 }, children: "Metrics" }), _jsx("button", { onClick: () => setIsAddingMetric(true), className: "matrix__panel-add-btn", children: "+ Add Metric" })] }), usageLimits.map((limit) => (_jsx(MetricLimitItem, { limit: limit, tierId: tier.id, dispatch: dispatch, onRemove: () => handleRemoveLimit(limit.id) }, limit.id))), usageLimits.length === 0 && !isAddingMetric && (_jsx("p", { className: "matrix__panel-empty-text", children: "No metrics added yet. Metrics will appear as nested rows under this service in the matrix." })), isAddingMetric && (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: newMetric, onChange: (e) => setNewMetric(e.target.value), placeholder: "e.g., API Calls, Storage, Users", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Value" }), _jsx("input", { type: "text", value: newLimit, onChange: (e) => setNewLimit(e.target.value), placeholder: "e.g., 100, Unlimited, Custom", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Enter a value or leave empty" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleAddLimit, disabled: !newMetric.trim(), className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Add Metric" }), _jsx("button", { onClick: () => {
|
|
1914
|
+
setNewMetric("");
|
|
1915
|
+
setNewLimit("");
|
|
1916
|
+
setIsAddingMetric(false);
|
|
1917
|
+
}, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }))] }) }), _jsx("div", { className: "matrix__panel-footer", children: _jsx("button", { onClick: onClose, className: "matrix__panel-done-btn", children: "Done" }) })] }) }));
|
|
1662
1918
|
}
|
|
1663
1919
|
function MetricLimitItem({ limit, tierId, dispatch, onRemove, }) {
|
|
1664
1920
|
const [isEditing, setIsEditing] = useState(false);
|
|
1665
1921
|
const [editMetric, setEditMetric] = useState(limit.metric);
|
|
1666
|
-
const [editLimit, setEditLimit] = useState(limit.limit?.toString() || "");
|
|
1922
|
+
const [editLimit, setEditLimit] = useState(limit.limit?.toString() || limit.notes || "");
|
|
1667
1923
|
const handleSave = () => {
|
|
1924
|
+
const parsedLimit = editLimit ? parseInt(editLimit, 10) : null;
|
|
1925
|
+
const isNumeric = parsedLimit !== null && !isNaN(parsedLimit);
|
|
1668
1926
|
dispatch(updateUsageLimit({
|
|
1669
1927
|
tierId,
|
|
1670
1928
|
limitId: limit.id,
|
|
1671
1929
|
metric: editMetric.trim() || limit.metric,
|
|
1672
|
-
limit:
|
|
1930
|
+
limit: isNumeric ? parsedLimit : undefined,
|
|
1931
|
+
notes: !isNumeric && editLimit ? editLimit.trim() : undefined,
|
|
1673
1932
|
lastModified: new Date().toISOString(),
|
|
1674
1933
|
}));
|
|
1675
1934
|
setIsEditing(false);
|
|
1676
1935
|
};
|
|
1677
1936
|
const handleCancel = () => {
|
|
1678
1937
|
setEditMetric(limit.metric);
|
|
1679
|
-
setEditLimit(limit.limit?.toString() || "");
|
|
1938
|
+
setEditLimit(limit.limit?.toString() || limit.notes || "");
|
|
1680
1939
|
setIsEditing(false);
|
|
1681
1940
|
};
|
|
1682
1941
|
if (isEditing) {
|
|
1683
|
-
return (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: editMetric, onChange: (e) => setEditMetric(e.target.value), placeholder: "Metric name", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "
|
|
1942
|
+
return (_jsxs("div", { className: "matrix__panel-edit-form", children: [_jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Metric Name" }), _jsx("input", { type: "text", value: editMetric, onChange: (e) => setEditMetric(e.target.value), placeholder: "Metric name", className: "matrix__panel-input", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { className: "matrix__panel-edit-label", children: "Value" }), _jsx("input", { type: "text", value: editLimit, onChange: (e) => setEditLimit(e.target.value), placeholder: "e.g., 100, Unlimited, Custom", className: "matrix__panel-input" }), _jsx("p", { className: "matrix__panel-edit-hint", children: "Enter a value or leave empty" })] }), _jsxs("div", { className: "matrix__panel-edit-actions", children: [_jsx("button", { onClick: handleSave, className: "matrix__panel-edit-btn matrix__panel-edit-btn--primary", children: "Save" }), _jsx("button", { onClick: handleCancel, className: "matrix__panel-edit-btn matrix__panel-edit-btn--secondary", children: "Cancel" })] })] }));
|
|
1684
1943
|
}
|
|
1685
|
-
return (_jsxs("div", { className: "matrix__panel-limit-item", children: [_jsxs("div", { className: "matrix__panel-limit-content", onClick: () => setIsEditing(true), children: [_jsx("div", { className: "matrix__panel-limit-metric", children: limit.metric }), _jsx("div", { className: "matrix__panel-limit-value", children: limit.limit
|
|
1944
|
+
return (_jsxs("div", { className: "matrix__panel-limit-item", children: [_jsxs("div", { className: "matrix__panel-limit-content", onClick: () => setIsEditing(true), children: [_jsx("div", { className: "matrix__panel-limit-metric", children: limit.metric }), _jsx("div", { className: "matrix__panel-limit-value", children: limit.limit ?? limit.notes ?? "—" })] }), _jsxs("div", { className: "matrix__panel-limit-actions", children: [_jsx("button", { onClick: () => setIsEditing(true), className: "matrix__panel-limit-btn matrix__panel-limit-btn--edit", title: "Edit metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" }) }) }), _jsx("button", { onClick: onRemove, className: "matrix__panel-limit-btn matrix__panel-limit-btn--remove", title: "Remove metric", children: _jsx("svg", { className: "matrix__panel-limit-icon", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] })] }));
|
|
1686
1945
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,qBAAqB,
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/service-offering-editor/editor.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,qBAAqB,4CAuF5C"}
|
|
@@ -3,7 +3,7 @@ import { useState } from "react";
|
|
|
3
3
|
import { DocumentToolbar } from "@powerhousedao/design-system/connect";
|
|
4
4
|
import { useSelectedServiceOfferingDocument } from "../../document-models/service-offering/hooks.js";
|
|
5
5
|
import { TabNavigation } from "./components/TabNavigation.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ResourceTemplateSelector } from "./components/ResourceTemplateSelector.js";
|
|
7
7
|
import { ServiceCatalog, } from "./components/ServiceCatalog.js";
|
|
8
8
|
import { TierDefinition } from "./components/TierDefinition.js";
|
|
9
9
|
import { TheMatrix } from "./components/TheMatrix.js";
|
|
@@ -25,7 +25,7 @@ export default function ServiceOfferingEditor() {
|
|
|
25
25
|
const renderTabContent = () => {
|
|
26
26
|
switch (activeTab) {
|
|
27
27
|
case "scope-facets":
|
|
28
|
-
return _jsx(
|
|
28
|
+
return (_jsx(ResourceTemplateSelector, { document: document, dispatch: dispatch }));
|
|
29
29
|
case "service-catalog":
|
|
30
30
|
return (_jsx(ServiceCatalog, { document: document, dispatch: dispatch, groupMetadata: groupMetadata, setGroupMetadata: setGroupMetadata }));
|
|
31
31
|
case "tier-definition":
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Manifest } from "document-model";
|
|
2
2
|
export declare const manifest: Manifest;
|
|
3
|
-
export declare const documentModels: (import("document-model").DocumentModelModule<import("./document-models/account-transactions/index.js").AccountTransactionsPHState> | import("document-model").DocumentModelModule<import("./document-models/accounts/index.js").AccountsPHState> | import("document-model").DocumentModelModule<import("./document-models/billing-statement/index.js").BillingStatementPHState> | import("document-model").DocumentModelModule<import("./document-models/expense-report/index.js").ExpenseReportPHState> | import("document-model").DocumentModelModule<import("./document-models/invoice/index.js").InvoicePHState> | import("document-model").DocumentModelModule<import("./document-models/snapshot-report/index.js").SnapshotReportPHState> | import("document-model").DocumentModelModule<import("./document-models/service-subscriptions/index.js").ServiceSubscriptionsPHState> | import("document-model").DocumentModelModule<import("./document-models/service-offering/index.js").ServiceOfferingPHState>)[];
|
|
3
|
+
export declare const documentModels: (import("document-model").DocumentModelModule<import("./document-models/account-transactions/index.js").AccountTransactionsPHState> | import("document-model").DocumentModelModule<import("./document-models/accounts/index.js").AccountsPHState> | import("document-model").DocumentModelModule<import("./document-models/billing-statement/index.js").BillingStatementPHState> | import("document-model").DocumentModelModule<import("./document-models/expense-report/index.js").ExpenseReportPHState> | import("document-model").DocumentModelModule<import("./document-models/invoice/index.js").InvoicePHState> | import("document-model").DocumentModelModule<import("./document-models/snapshot-report/index.js").SnapshotReportPHState> | import("document-model").DocumentModelModule<import("./document-models/service-subscriptions/index.js").ServiceSubscriptionsPHState> | import("document-model").DocumentModelModule<import("./document-models/service-offering/index.js").ServiceOfferingPHState> | import("document-model").DocumentModelModule<import("./document-models/resource-template/index.js").ResourceTemplatePHState>)[];
|
|
4
4
|
export declare const editors: import("document-model").EditorModule[];
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,eAAO,MAAM,QAAQ,EAAE,QAAuB,CAAC;AAC/C,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,eAAO,MAAM,QAAQ,EAAE,QAAuB,CAAC;AAC/C,eAAO,MAAM,cAAc,wlCAAuC,CAAC;AACnE,eAAO,MAAM,OAAO,yCAAgC,CAAC"}
|