@powerhousedao/builder-team-admin 0.0.1
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/LICENSE +661 -0
- package/README.md +179 -0
- package/dist/document-models/builders/actions.d.ts +14 -0
- package/dist/document-models/builders/actions.d.ts.map +1 -0
- package/dist/document-models/builders/actions.js +4 -0
- package/dist/document-models/builders/gen/actions.d.ts +4 -0
- package/dist/document-models/builders/gen/actions.d.ts.map +1 -0
- package/dist/document-models/builders/gen/actions.js +1 -0
- package/dist/document-models/builders/gen/builders/actions.d.ts +12 -0
- package/dist/document-models/builders/gen/builders/actions.d.ts.map +1 -0
- package/dist/document-models/builders/gen/builders/actions.js +1 -0
- package/dist/document-models/builders/gen/builders/creators.d.ts +5 -0
- package/dist/document-models/builders/gen/builders/creators.d.ts.map +1 -0
- package/dist/document-models/builders/gen/builders/creators.js +4 -0
- package/dist/document-models/builders/gen/builders/error.d.ts +2 -0
- package/dist/document-models/builders/gen/builders/error.d.ts.map +1 -0
- package/dist/document-models/builders/gen/builders/error.js +1 -0
- package/dist/document-models/builders/gen/builders/operations.d.ts +8 -0
- package/dist/document-models/builders/gen/builders/operations.d.ts.map +1 -0
- package/dist/document-models/builders/gen/builders/operations.js +3 -0
- package/dist/document-models/builders/gen/creators.d.ts +3 -0
- package/dist/document-models/builders/gen/creators.d.ts.map +1 -0
- package/dist/document-models/builders/gen/creators.js +2 -0
- package/dist/document-models/builders/gen/document-model.d.ts +3 -0
- package/dist/document-models/builders/gen/document-model.d.ts.map +1 -0
- package/dist/document-models/builders/gen/document-model.js +59 -0
- package/dist/document-models/builders/gen/document-schema.d.ts +142 -0
- package/dist/document-models/builders/gen/document-schema.d.ts.map +1 -0
- package/dist/document-models/builders/gen/document-schema.js +33 -0
- package/dist/document-models/builders/gen/document-type.d.ts +2 -0
- package/dist/document-models/builders/gen/document-type.d.ts.map +1 -0
- package/dist/document-models/builders/gen/document-type.js +1 -0
- package/dist/document-models/builders/gen/index.d.ts +12 -0
- package/dist/document-models/builders/gen/index.d.ts.map +1 -0
- package/dist/document-models/builders/gen/index.js +11 -0
- package/dist/document-models/builders/gen/ph-factories.d.ts +23 -0
- package/dist/document-models/builders/gen/ph-factories.d.ts.map +1 -0
- package/dist/document-models/builders/gen/ph-factories.js +47 -0
- package/dist/document-models/builders/gen/reducer.d.ts +3 -0
- package/dist/document-models/builders/gen/reducer.d.ts.map +1 -0
- package/dist/document-models/builders/gen/reducer.js +21 -0
- package/dist/document-models/builders/gen/schema/index.d.ts +3 -0
- package/dist/document-models/builders/gen/schema/index.d.ts.map +1 -0
- package/dist/document-models/builders/gen/schema/index.js +2 -0
- package/dist/document-models/builders/gen/schema/types.d.ts +146 -0
- package/dist/document-models/builders/gen/schema/types.d.ts.map +1 -0
- package/dist/document-models/builders/gen/schema/types.js +1 -0
- package/dist/document-models/builders/gen/schema/zod.d.ts +13 -0
- package/dist/document-models/builders/gen/schema/zod.d.ts.map +1 -0
- package/dist/document-models/builders/gen/schema/zod.js +21 -0
- package/dist/document-models/builders/gen/types.d.ts +12 -0
- package/dist/document-models/builders/gen/types.d.ts.map +1 -0
- package/dist/document-models/builders/gen/types.js +1 -0
- package/dist/document-models/builders/gen/utils.d.ts +15 -0
- package/dist/document-models/builders/gen/utils.d.ts.map +1 -0
- package/dist/document-models/builders/gen/utils.js +51 -0
- package/dist/document-models/builders/hooks.d.ts +11 -0
- package/dist/document-models/builders/hooks.d.ts.map +1 -0
- package/dist/document-models/builders/hooks.js +26 -0
- package/dist/document-models/builders/index.d.ts +10 -0
- package/dist/document-models/builders/index.d.ts.map +1 -0
- package/dist/document-models/builders/index.js +9 -0
- package/dist/document-models/builders/module.d.ts +5 -0
- package/dist/document-models/builders/module.d.ts.map +1 -0
- package/dist/document-models/builders/module.js +10 -0
- package/dist/document-models/builders/src/index.d.ts +2 -0
- package/dist/document-models/builders/src/index.d.ts.map +1 -0
- package/dist/document-models/builders/src/index.js +1 -0
- package/dist/document-models/builders/src/reducers/builders.d.ts +3 -0
- package/dist/document-models/builders/src/reducers/builders.d.ts.map +1 -0
- package/dist/document-models/builders/src/reducers/builders.js +8 -0
- package/dist/document-models/builders/src/tests/builders.test.d.ts +6 -0
- package/dist/document-models/builders/src/tests/builders.test.d.ts.map +1 -0
- package/dist/document-models/builders/src/tests/builders.test.js +29 -0
- package/dist/document-models/builders/src/tests/document-model.test.d.ts +10 -0
- package/dist/document-models/builders/src/tests/document-model.test.d.ts.map +1 -0
- package/dist/document-models/builders/src/tests/document-model.test.js +104 -0
- package/dist/document-models/builders/src/utils.d.ts +2 -0
- package/dist/document-models/builders/src/utils.d.ts.map +1 -0
- package/dist/document-models/builders/src/utils.js +1 -0
- package/dist/document-models/builders/utils.d.ts +14 -0
- package/dist/document-models/builders/utils.d.ts.map +1 -0
- package/dist/document-models/builders/utils.js +7 -0
- package/dist/document-models/document-models.d.ts +3 -0
- package/dist/document-models/document-models.d.ts.map +1 -0
- package/dist/document-models/document-models.js +6 -0
- package/dist/document-models/expense-report/actions.d.ts +27 -0
- package/dist/document-models/expense-report/actions.d.ts.map +1 -0
- package/dist/document-models/expense-report/actions.js +4 -0
- package/dist/document-models/expense-report/gen/actions.d.ts +4 -0
- package/dist/document-models/expense-report/gen/actions.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/actions.js +1 -0
- package/dist/document-models/expense-report/gen/creators.d.ts +3 -0
- package/dist/document-models/expense-report/gen/creators.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/creators.js +2 -0
- package/dist/document-models/expense-report/gen/document-model.d.ts +3 -0
- package/dist/document-models/expense-report/gen/document-model.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/document-model.js +202 -0
- package/dist/document-models/expense-report/gen/document-schema.d.ts +199 -0
- package/dist/document-models/expense-report/gen/document-schema.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/document-schema.js +33 -0
- package/dist/document-models/expense-report/gen/document-type.d.ts +2 -0
- package/dist/document-models/expense-report/gen/document-type.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/document-type.js +1 -0
- package/dist/document-models/expense-report/gen/index.d.ts +12 -0
- package/dist/document-models/expense-report/gen/index.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/index.js +11 -0
- package/dist/document-models/expense-report/gen/ph-factories.d.ts +23 -0
- package/dist/document-models/expense-report/gen/ph-factories.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/ph-factories.js +186 -0
- package/dist/document-models/expense-report/gen/reducer.d.ts +3 -0
- package/dist/document-models/expense-report/gen/reducer.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/reducer.js +73 -0
- package/dist/document-models/expense-report/gen/schema/index.d.ts +3 -0
- package/dist/document-models/expense-report/gen/schema/index.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/schema/index.js +2 -0
- package/dist/document-models/expense-report/gen/schema/types.d.ts +258 -0
- package/dist/document-models/expense-report/gen/schema/types.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/schema/types.js +1 -0
- package/dist/document-models/expense-report/gen/schema/zod.d.ts +32 -0
- package/dist/document-models/expense-report/gen/schema/zod.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/schema/zod.js +200 -0
- package/dist/document-models/expense-report/gen/types.d.ts +12 -0
- package/dist/document-models/expense-report/gen/types.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/types.js +1 -0
- package/dist/document-models/expense-report/gen/utils.d.ts +15 -0
- package/dist/document-models/expense-report/gen/utils.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/utils.js +190 -0
- package/dist/document-models/expense-report/gen/wallet/actions.d.ts +64 -0
- package/dist/document-models/expense-report/gen/wallet/actions.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/wallet/actions.js +1 -0
- package/dist/document-models/expense-report/gen/wallet/creators.d.ts +18 -0
- package/dist/document-models/expense-report/gen/wallet/creators.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/wallet/creators.js +17 -0
- package/dist/document-models/expense-report/gen/wallet/error.d.ts +2 -0
- package/dist/document-models/expense-report/gen/wallet/error.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/wallet/error.js +1 -0
- package/dist/document-models/expense-report/gen/wallet/operations.d.ts +21 -0
- package/dist/document-models/expense-report/gen/wallet/operations.d.ts.map +1 -0
- package/dist/document-models/expense-report/gen/wallet/operations.js +3 -0
- package/dist/document-models/expense-report/hooks.d.ts +11 -0
- package/dist/document-models/expense-report/hooks.d.ts.map +1 -0
- package/dist/document-models/expense-report/hooks.js +26 -0
- package/dist/document-models/expense-report/index.d.ts +10 -0
- package/dist/document-models/expense-report/index.d.ts.map +1 -0
- package/dist/document-models/expense-report/index.js +9 -0
- package/dist/document-models/expense-report/module.d.ts +5 -0
- package/dist/document-models/expense-report/module.d.ts.map +1 -0
- package/dist/document-models/expense-report/module.js +10 -0
- package/dist/document-models/expense-report/src/index.d.ts +2 -0
- package/dist/document-models/expense-report/src/index.d.ts.map +1 -0
- package/dist/document-models/expense-report/src/index.js +1 -0
- package/dist/document-models/expense-report/src/reducers/wallet.d.ts +3 -0
- package/dist/document-models/expense-report/src/reducers/wallet.d.ts.map +1 -0
- package/dist/document-models/expense-report/src/reducers/wallet.js +196 -0
- package/dist/document-models/expense-report/src/tests/document-model.test.d.ts +10 -0
- package/dist/document-models/expense-report/src/tests/document-model.test.d.ts.map +1 -0
- package/dist/document-models/expense-report/src/tests/document-model.test.js +104 -0
- package/dist/document-models/expense-report/src/tests/wallet.test.d.ts +6 -0
- package/dist/document-models/expense-report/src/tests/wallet.test.d.ts.map +1 -0
- package/dist/document-models/expense-report/src/tests/wallet.test.js +159 -0
- package/dist/document-models/expense-report/src/utils.d.ts +2 -0
- package/dist/document-models/expense-report/src/utils.d.ts.map +1 -0
- package/dist/document-models/expense-report/src/utils.js +1 -0
- package/dist/document-models/expense-report/utils.d.ts +14 -0
- package/dist/document-models/expense-report/utils.d.ts.map +1 -0
- package/dist/document-models/expense-report/utils.js +7 -0
- package/dist/document-models/index.d.ts +3 -0
- package/dist/document-models/index.d.ts.map +1 -0
- package/dist/document-models/index.js +2 -0
- package/dist/document-models/service-subscriptions/actions.d.ts +25 -0
- package/dist/document-models/service-subscriptions/actions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/actions.js +9 -0
- package/dist/document-models/service-subscriptions/gen/actions.d.ts +8 -0
- package/dist/document-models/service-subscriptions/gen/actions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/actions.js +3 -0
- package/dist/document-models/service-subscriptions/gen/categories/actions.d.ts +16 -0
- package/dist/document-models/service-subscriptions/gen/categories/actions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/actions.js +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/creators.d.ts +6 -0
- package/dist/document-models/service-subscriptions/gen/categories/creators.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/creators.js +5 -0
- package/dist/document-models/service-subscriptions/gen/categories/error.d.ts +2 -0
- package/dist/document-models/service-subscriptions/gen/categories/error.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/error.js +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/operations.d.ts +9 -0
- package/dist/document-models/service-subscriptions/gen/categories/operations.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/categories/operations.js +3 -0
- package/dist/document-models/service-subscriptions/gen/creators.d.ts +7 -0
- package/dist/document-models/service-subscriptions/gen/creators.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/creators.js +6 -0
- package/dist/document-models/service-subscriptions/gen/document-model.d.ts +3 -0
- package/dist/document-models/service-subscriptions/gen/document-model.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/document-model.js +194 -0
- package/dist/document-models/service-subscriptions/gen/document-schema.d.ts +180 -0
- package/dist/document-models/service-subscriptions/gen/document-schema.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/document-schema.js +33 -0
- package/dist/document-models/service-subscriptions/gen/document-type.d.ts +2 -0
- package/dist/document-models/service-subscriptions/gen/document-type.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/document-type.js +1 -0
- package/dist/document-models/service-subscriptions/gen/index.d.ts +14 -0
- package/dist/document-models/service-subscriptions/gen/index.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/index.js +13 -0
- package/dist/document-models/service-subscriptions/gen/ph-factories.d.ts +23 -0
- package/dist/document-models/service-subscriptions/gen/ph-factories.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/ph-factories.js +45 -0
- package/dist/document-models/service-subscriptions/gen/reducer.d.ts +3 -0
- package/dist/document-models/service-subscriptions/gen/reducer.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/reducer.js +67 -0
- package/dist/document-models/service-subscriptions/gen/schema/index.d.ts +3 -0
- package/dist/document-models/service-subscriptions/gen/schema/index.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/schema/index.js +2 -0
- package/dist/document-models/service-subscriptions/gen/schema/types.d.ts +274 -0
- package/dist/document-models/service-subscriptions/gen/schema/types.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/schema/types.js +1 -0
- package/dist/document-models/service-subscriptions/gen/schema/zod.d.ts +31 -0
- package/dist/document-models/service-subscriptions/gen/schema/zod.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/schema/zod.js +199 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/actions.d.ts +32 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/actions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/actions.js +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/creators.d.ts +10 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/creators.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/creators.js +9 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/error.d.ts +2 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/error.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/error.js +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/operations.d.ts +13 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/operations.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/subscriptions/operations.js +3 -0
- package/dist/document-models/service-subscriptions/gen/types.d.ts +12 -0
- package/dist/document-models/service-subscriptions/gen/types.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/types.js +1 -0
- package/dist/document-models/service-subscriptions/gen/utils.d.ts +15 -0
- package/dist/document-models/service-subscriptions/gen/utils.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/utils.js +53 -0
- package/dist/document-models/service-subscriptions/gen/vendors/actions.d.ts +16 -0
- package/dist/document-models/service-subscriptions/gen/vendors/actions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/actions.js +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/creators.d.ts +6 -0
- package/dist/document-models/service-subscriptions/gen/vendors/creators.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/creators.js +5 -0
- package/dist/document-models/service-subscriptions/gen/vendors/error.d.ts +2 -0
- package/dist/document-models/service-subscriptions/gen/vendors/error.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/error.js +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/operations.d.ts +9 -0
- package/dist/document-models/service-subscriptions/gen/vendors/operations.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/gen/vendors/operations.js +3 -0
- package/dist/document-models/service-subscriptions/hooks.d.ts +11 -0
- package/dist/document-models/service-subscriptions/hooks.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/hooks.js +26 -0
- package/dist/document-models/service-subscriptions/index.d.ts +10 -0
- package/dist/document-models/service-subscriptions/index.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/index.js +9 -0
- package/dist/document-models/service-subscriptions/module.d.ts +5 -0
- package/dist/document-models/service-subscriptions/module.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/module.js +10 -0
- package/dist/document-models/service-subscriptions/src/index.d.ts +2 -0
- package/dist/document-models/service-subscriptions/src/index.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/index.js +1 -0
- package/dist/document-models/service-subscriptions/src/reducers/categories.d.ts +3 -0
- package/dist/document-models/service-subscriptions/src/reducers/categories.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/reducers/categories.js +24 -0
- package/dist/document-models/service-subscriptions/src/reducers/subscriptions.d.ts +3 -0
- package/dist/document-models/service-subscriptions/src/reducers/subscriptions.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/reducers/subscriptions.js +114 -0
- package/dist/document-models/service-subscriptions/src/reducers/vendors.d.ts +3 -0
- package/dist/document-models/service-subscriptions/src/reducers/vendors.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/reducers/vendors.js +30 -0
- package/dist/document-models/service-subscriptions/src/tests/categories.test.d.ts +6 -0
- package/dist/document-models/service-subscriptions/src/tests/categories.test.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/tests/categories.test.js +39 -0
- package/dist/document-models/service-subscriptions/src/tests/document-model.test.d.ts +10 -0
- package/dist/document-models/service-subscriptions/src/tests/document-model.test.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/tests/document-model.test.js +104 -0
- package/dist/document-models/service-subscriptions/src/tests/subscriptions.test.d.ts +6 -0
- package/dist/document-models/service-subscriptions/src/tests/subscriptions.test.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/tests/subscriptions.test.js +79 -0
- package/dist/document-models/service-subscriptions/src/tests/vendors.test.d.ts +6 -0
- package/dist/document-models/service-subscriptions/src/tests/vendors.test.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/tests/vendors.test.js +39 -0
- package/dist/document-models/service-subscriptions/src/utils.d.ts +2 -0
- package/dist/document-models/service-subscriptions/src/utils.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/src/utils.js +1 -0
- package/dist/document-models/service-subscriptions/utils.d.ts +14 -0
- package/dist/document-models/service-subscriptions/utils.d.ts.map +1 -0
- package/dist/document-models/service-subscriptions/utils.js +7 -0
- package/dist/editors/builder-team-admin/components/CreateDocument.d.ts +6 -0
- package/dist/editors/builder-team-admin/components/CreateDocument.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/CreateDocument.js +18 -0
- package/dist/editors/builder-team-admin/components/DriveContents.d.ts +6 -0
- package/dist/editors/builder-team-admin/components/DriveContents.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/DriveContents.js +38 -0
- package/dist/editors/builder-team-admin/components/DriveExplorer.d.ts +7 -0
- package/dist/editors/builder-team-admin/components/DriveExplorer.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/DriveExplorer.js +45 -0
- package/dist/editors/builder-team-admin/components/EmptyState.d.ts +3 -0
- package/dist/editors/builder-team-admin/components/EmptyState.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/EmptyState.js +10 -0
- package/dist/editors/builder-team-admin/components/ExpenseReportsStats.d.ts +11 -0
- package/dist/editors/builder-team-admin/components/ExpenseReportsStats.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/ExpenseReportsStats.js +137 -0
- package/dist/editors/builder-team-admin/components/Files.d.ts +3 -0
- package/dist/editors/builder-team-admin/components/Files.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/Files.js +12 -0
- package/dist/editors/builder-team-admin/components/FolderTree.d.ts +14 -0
- package/dist/editors/builder-team-admin/components/FolderTree.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/FolderTree.js +209 -0
- package/dist/editors/builder-team-admin/components/Folders.d.ts +3 -0
- package/dist/editors/builder-team-admin/components/Folders.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/Folders.js +12 -0
- package/dist/editors/builder-team-admin/components/NavigationBreadcrumbs.d.ts +3 -0
- package/dist/editors/builder-team-admin/components/NavigationBreadcrumbs.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/NavigationBreadcrumbs.js +6 -0
- package/dist/editors/builder-team-admin/components/expense-reports.d.ts +2 -0
- package/dist/editors/builder-team-admin/components/expense-reports.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/expense-reports.js +250 -0
- package/dist/editors/builder-team-admin/components/overview/ProfileHeader.d.ts +10 -0
- package/dist/editors/builder-team-admin/components/overview/ProfileHeader.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/overview/ProfileHeader.js +24 -0
- package/dist/editors/builder-team-admin/components/overview/SubscriptionsStats.d.ts +15 -0
- package/dist/editors/builder-team-admin/components/overview/SubscriptionsStats.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/overview/SubscriptionsStats.js +61 -0
- package/dist/editors/builder-team-admin/components/overview/TeamMembersOverview.d.ts +10 -0
- package/dist/editors/builder-team-admin/components/overview/TeamMembersOverview.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/overview/TeamMembersOverview.js +97 -0
- package/dist/editors/builder-team-admin/components/team-members.d.ts +2 -0
- package/dist/editors/builder-team-admin/components/team-members.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/components/team-members.js +200 -0
- package/dist/editors/builder-team-admin/config.d.ts +4 -0
- package/dist/editors/builder-team-admin/config.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/config.js +10 -0
- package/dist/editors/builder-team-admin/editor.d.ts +4 -0
- package/dist/editors/builder-team-admin/editor.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/editor.js +11 -0
- package/dist/editors/builder-team-admin/module.d.ts +3 -0
- package/dist/editors/builder-team-admin/module.d.ts.map +1 -0
- package/dist/editors/builder-team-admin/module.js +10 -0
- package/dist/editors/builders/editor.d.ts +3 -0
- package/dist/editors/builders/editor.d.ts.map +1 -0
- package/dist/editors/builders/editor.js +204 -0
- package/dist/editors/builders/module.d.ts +4 -0
- package/dist/editors/builders/module.d.ts.map +1 -0
- package/dist/editors/builders/module.js +10 -0
- package/dist/editors/editors.d.ts +3 -0
- package/dist/editors/editors.d.ts.map +1 -0
- package/dist/editors/editors.js +8 -0
- package/dist/editors/expense-report/components/AddBillingStatementModal.d.ts +11 -0
- package/dist/editors/expense-report/components/AddBillingStatementModal.d.ts.map +1 -0
- package/dist/editors/expense-report/components/AddBillingStatementModal.js +195 -0
- package/dist/editors/expense-report/components/AggregatedExpensesTable.d.ts +11 -0
- package/dist/editors/expense-report/components/AggregatedExpensesTable.d.ts.map +1 -0
- package/dist/editors/expense-report/components/AggregatedExpensesTable.js +388 -0
- package/dist/editors/expense-report/components/ExpenseReportPDF.d.ts +10 -0
- package/dist/editors/expense-report/components/ExpenseReportPDF.d.ts.map +1 -0
- package/dist/editors/expense-report/components/ExpenseReportPDF.js +287 -0
- package/dist/editors/expense-report/components/ExpenseReportTransactionsTable.d.ts +14 -0
- package/dist/editors/expense-report/components/ExpenseReportTransactionsTable.d.ts.map +1 -0
- package/dist/editors/expense-report/components/ExpenseReportTransactionsTable.js +64 -0
- package/dist/editors/expense-report/components/WalletsTable.d.ts +12 -0
- package/dist/editors/expense-report/components/WalletsTable.d.ts.map +1 -0
- package/dist/editors/expense-report/components/WalletsTable.js +456 -0
- package/dist/editors/expense-report/config.d.ts +3 -0
- package/dist/editors/expense-report/config.d.ts.map +1 -0
- package/dist/editors/expense-report/config.js +3 -0
- package/dist/editors/expense-report/editor.d.ts +2 -0
- package/dist/editors/expense-report/editor.d.ts.map +1 -0
- package/dist/editors/expense-report/editor.js +107 -0
- package/dist/editors/expense-report/hooks/useSyncWallet.d.ts +5 -0
- package/dist/editors/expense-report/hooks/useSyncWallet.d.ts.map +1 -0
- package/dist/editors/expense-report/hooks/useSyncWallet.js +150 -0
- package/dist/editors/expense-report/hooks/useWalletSync.d.ts +9 -0
- package/dist/editors/expense-report/hooks/useWalletSync.d.ts.map +1 -0
- package/dist/editors/expense-report/hooks/useWalletSync.js +78 -0
- package/dist/editors/expense-report/module.d.ts +3 -0
- package/dist/editors/expense-report/module.d.ts.map +1 -0
- package/dist/editors/expense-report/module.js +9 -0
- package/dist/editors/index.d.ts +4 -0
- package/dist/editors/index.d.ts.map +1 -0
- package/dist/editors/index.js +3 -0
- package/dist/editors/service-subscriptions-editor/components/AddCategoryModal.d.ts +7 -0
- package/dist/editors/service-subscriptions-editor/components/AddCategoryModal.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/AddCategoryModal.js +39 -0
- package/dist/editors/service-subscriptions-editor/components/AddSubscriptionModal.d.ts +10 -0
- package/dist/editors/service-subscriptions-editor/components/AddSubscriptionModal.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/AddSubscriptionModal.js +64 -0
- package/dist/editors/service-subscriptions-editor/components/AddVendorModal.d.ts +7 -0
- package/dist/editors/service-subscriptions-editor/components/AddVendorModal.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/AddVendorModal.js +43 -0
- package/dist/editors/service-subscriptions-editor/components/CategoriesList.d.ts +8 -0
- package/dist/editors/service-subscriptions-editor/components/CategoriesList.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/CategoriesList.js +23 -0
- package/dist/editors/service-subscriptions-editor/components/EditName.d.ts +3 -0
- package/dist/editors/service-subscriptions-editor/components/EditName.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/EditName.js +31 -0
- package/dist/editors/service-subscriptions-editor/components/StatsOverview.d.ts +8 -0
- package/dist/editors/service-subscriptions-editor/components/StatsOverview.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/StatsOverview.js +32 -0
- package/dist/editors/service-subscriptions-editor/components/SubscriptionsList.d.ts +10 -0
- package/dist/editors/service-subscriptions-editor/components/SubscriptionsList.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/SubscriptionsList.js +88 -0
- package/dist/editors/service-subscriptions-editor/components/VendorsList.d.ts +8 -0
- package/dist/editors/service-subscriptions-editor/components/VendorsList.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/components/VendorsList.js +23 -0
- package/dist/editors/service-subscriptions-editor/editor.d.ts +2 -0
- package/dist/editors/service-subscriptions-editor/editor.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/editor.js +60 -0
- package/dist/editors/service-subscriptions-editor/module.d.ts +4 -0
- package/dist/editors/service-subscriptions-editor/module.d.ts.map +1 -0
- package/dist/editors/service-subscriptions-editor/module.js +10 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/package.json +119 -0
- package/dist/powerhouse.manifest.json +27 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.d.ts.map +1 -0
- package/dist/processors/index.js +1 -0
- package/dist/style.css +3948 -0
- package/dist/subgraphs/index.d.ts +2 -0
- package/dist/subgraphs/index.d.ts.map +1 -0
- package/dist/subgraphs/index.js +1 -0
- package/dist/subgraphs/service-subscriptions/index.d.ts +11 -0
- package/dist/subgraphs/service-subscriptions/index.d.ts.map +1 -0
- package/dist/subgraphs/service-subscriptions/index.js +11 -0
- package/dist/subgraphs/service-subscriptions/resolvers.d.ts +3 -0
- package/dist/subgraphs/service-subscriptions/resolvers.d.ts.map +1 -0
- package/dist/subgraphs/service-subscriptions/resolvers.js +228 -0
- package/dist/subgraphs/service-subscriptions/schema.d.ts +3 -0
- package/dist/subgraphs/service-subscriptions/schema.d.ts.map +1 -0
- package/dist/subgraphs/service-subscriptions/schema.js +193 -0
- package/dist/vite.config.d.ts +3 -0
- package/dist/vite.config.d.ts.map +1 -0
- package/dist/vite.config.js +13 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +15 -0
- package/package.json +119 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import { Button, TextInput } from "@powerhousedao/document-engineering";
|
|
4
|
+
import { Plus, Trash2, Pencil, Check, X, Copy, CheckCheck, RefreshCw, } from "lucide-react";
|
|
5
|
+
import { actions } from "../../../document-models/expense-report/index.js";
|
|
6
|
+
import { generateId } from "document-model/core";
|
|
7
|
+
import { useWalletSync } from "../hooks/useWalletSync.js";
|
|
8
|
+
import { useSyncWallet } from "../hooks/useSyncWallet.js";
|
|
9
|
+
import { addDocument, dispatchActions, useDocumentsInSelectedDrive, useSelectedDrive, setSelectedNode, useDocumentById, } from "@powerhousedao/reactor-browser";
|
|
10
|
+
import { actions as accountTransactionsActions } from "../../../document-models/expense-report/index.js";
|
|
11
|
+
export function WalletsTable({ wallets, groups, onAddBillingStatement, periodStart, periodEnd, dispatch, }) {
|
|
12
|
+
const [selectedAccountId, setSelectedAccountId] = useState("");
|
|
13
|
+
const [walletError, setWalletError] = useState("");
|
|
14
|
+
const [editingWallet, setEditingWallet] = useState(null);
|
|
15
|
+
const [editingName, setEditingName] = useState("");
|
|
16
|
+
const [copiedWallet, setCopiedWallet] = useState(null);
|
|
17
|
+
const [syncingWallet, setSyncingWallet] = useState(null);
|
|
18
|
+
const [addingWallet, setAddingWallet] = useState(false);
|
|
19
|
+
// State for handling newly created transaction documents
|
|
20
|
+
const [pendingTxDoc, setPendingTxDoc] = useState(null);
|
|
21
|
+
// Track if we're currently processing to prevent duplicate runs
|
|
22
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
23
|
+
// Progress state for Add Txns operation
|
|
24
|
+
const [txProgress, setTxProgress] = useState({
|
|
25
|
+
show: false,
|
|
26
|
+
step: "",
|
|
27
|
+
current: 0,
|
|
28
|
+
total: 5,
|
|
29
|
+
details: "",
|
|
30
|
+
});
|
|
31
|
+
// Get drive and documents for account/transactions document management
|
|
32
|
+
const [selectedDrive] = useSelectedDrive();
|
|
33
|
+
const allDocuments = useDocumentsInSelectedDrive();
|
|
34
|
+
// Load the pending transaction document if one exists
|
|
35
|
+
const [pendingDocument, pendingDocDispatch] = useDocumentById(pendingTxDoc?.documentId || null);
|
|
36
|
+
// Get available Account documents from the drive
|
|
37
|
+
const availableAccounts = allDocuments?.filter((doc) => doc.header.documentType === "powerhouse/accounts") || [];
|
|
38
|
+
// Extract all account entries from all Accounts documents
|
|
39
|
+
const accountEntries = availableAccounts.flatMap((doc) => {
|
|
40
|
+
const accounts = doc.state?.global?.accounts || [];
|
|
41
|
+
return accounts.map((acc) => ({
|
|
42
|
+
...acc,
|
|
43
|
+
accountsDocumentId: doc.header.id, // Store which Accounts document this came from
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
// Check sync status
|
|
47
|
+
const { needsSync, outdatedWallets, tagChangedWallets } = useWalletSync(wallets);
|
|
48
|
+
const { syncWallet } = useSyncWallet();
|
|
49
|
+
// Handle fetching and adding transactions when a new document is created
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
// Check if we have pending work and all required resources
|
|
52
|
+
if (!pendingTxDoc ||
|
|
53
|
+
!pendingDocument ||
|
|
54
|
+
!pendingDocDispatch ||
|
|
55
|
+
isProcessing) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Mark as processing and save current pending doc
|
|
59
|
+
setIsProcessing(true);
|
|
60
|
+
const currentPendingDoc = pendingTxDoc;
|
|
61
|
+
const fetchAndAddTransactions = async () => {
|
|
62
|
+
console.log("[WalletsTable] Processing pending transaction document:", currentPendingDoc.documentId);
|
|
63
|
+
try {
|
|
64
|
+
// Step 1: Set account info in the transaction document
|
|
65
|
+
setTxProgress({
|
|
66
|
+
show: true,
|
|
67
|
+
step: "Initializing",
|
|
68
|
+
current: 1,
|
|
69
|
+
total: 5,
|
|
70
|
+
details: "Setting up transaction document...",
|
|
71
|
+
});
|
|
72
|
+
// Add small delay to ensure document is fully initialized
|
|
73
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
74
|
+
console.log("[WalletsTable] Document state before setAccount:", {
|
|
75
|
+
documentId: pendingDocument?.header?.id,
|
|
76
|
+
hasState: !!pendingDocument?.state,
|
|
77
|
+
hasGlobal: !!pendingDocument?.state?.global,
|
|
78
|
+
});
|
|
79
|
+
const setAccountAction = accountTransactionsActions.updateWallet({
|
|
80
|
+
address: currentPendingDoc.accountEntry.account,
|
|
81
|
+
name: currentPendingDoc.accountEntry.name,
|
|
82
|
+
});
|
|
83
|
+
console.log("[WalletsTable] Dispatching setAccount action:", setAccountAction);
|
|
84
|
+
pendingDocDispatch(setAccountAction);
|
|
85
|
+
// Wait a bit for the action to be processed
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
87
|
+
console.log("[WalletsTable] Account info set - checking document state:", {
|
|
88
|
+
account: pendingDocument?.state?.global?.account,
|
|
89
|
+
});
|
|
90
|
+
// Step 2: Fetch transactions from Alchemy
|
|
91
|
+
setTxProgress({
|
|
92
|
+
show: true,
|
|
93
|
+
step: "Fetching Transactions",
|
|
94
|
+
current: 2,
|
|
95
|
+
total: 5,
|
|
96
|
+
details: "Retrieving blockchain transactions from Alchemy...",
|
|
97
|
+
});
|
|
98
|
+
console.log("[WalletsTable] Fetching transactions from Alchemy for:", currentPendingDoc.accountEntry.account);
|
|
99
|
+
// Step 4: Update the Accounts document with the transaction document ID
|
|
100
|
+
setTxProgress({
|
|
101
|
+
show: true,
|
|
102
|
+
step: "Linking Documents",
|
|
103
|
+
current: 4,
|
|
104
|
+
total: 5,
|
|
105
|
+
details: "Updating account references...",
|
|
106
|
+
});
|
|
107
|
+
console.log("[WalletsTable] Updating account in Accounts document:", {
|
|
108
|
+
accountId: currentPendingDoc.accountEntry.id,
|
|
109
|
+
accountsDocId: currentPendingDoc.accountsDocId,
|
|
110
|
+
transactionsDocId: currentPendingDoc.documentId,
|
|
111
|
+
});
|
|
112
|
+
await dispatchActions([
|
|
113
|
+
accountTransactionsActions.updateWallet({
|
|
114
|
+
address: currentPendingDoc.accountEntry.account,
|
|
115
|
+
accountTransactionsDocumentId: currentPendingDoc.documentId,
|
|
116
|
+
}),
|
|
117
|
+
], currentPendingDoc.accountsDocId);
|
|
118
|
+
console.log("[WalletsTable] Successfully updated account with transactions ID");
|
|
119
|
+
// Step 5: Link the transaction document to the wallet in ExpenseReport
|
|
120
|
+
setTxProgress({
|
|
121
|
+
show: true,
|
|
122
|
+
step: "Finalizing",
|
|
123
|
+
current: 5,
|
|
124
|
+
total: 5,
|
|
125
|
+
details: "Linking to expense report...",
|
|
126
|
+
});
|
|
127
|
+
dispatch(actions.updateWallet({
|
|
128
|
+
address: currentPendingDoc.walletAddress,
|
|
129
|
+
accountTransactionsDocumentId: currentPendingDoc.documentId,
|
|
130
|
+
}));
|
|
131
|
+
console.log("[WalletsTable] Successfully linked to wallet");
|
|
132
|
+
// Success! Close modal after a brief delay
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
setTxProgress({
|
|
135
|
+
show: false,
|
|
136
|
+
step: "",
|
|
137
|
+
current: 0,
|
|
138
|
+
total: 5,
|
|
139
|
+
details: "",
|
|
140
|
+
});
|
|
141
|
+
}, 1500);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error("[WalletsTable] Error processing pending transaction document:", error);
|
|
145
|
+
setTxProgress({
|
|
146
|
+
show: false,
|
|
147
|
+
step: "",
|
|
148
|
+
current: 0,
|
|
149
|
+
total: 5,
|
|
150
|
+
details: "",
|
|
151
|
+
});
|
|
152
|
+
alert(`Failed to fetch transactions: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
// Always clear processing state and pending doc
|
|
156
|
+
setPendingTxDoc(null);
|
|
157
|
+
setIsProcessing(false);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
fetchAndAddTransactions();
|
|
161
|
+
}, [pendingTxDoc, pendingDocument, pendingDocDispatch, isProcessing]);
|
|
162
|
+
const handleAddWallet = async () => {
|
|
163
|
+
if (!selectedAccountId) {
|
|
164
|
+
setWalletError("Please select an account");
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Find the selected account from accountEntries
|
|
168
|
+
const selectedAccount = accountEntries.find((acc) => acc.id === selectedAccountId);
|
|
169
|
+
if (!selectedAccount) {
|
|
170
|
+
setWalletError("Selected account not found");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Check if wallet already exists
|
|
174
|
+
const walletExists = wallets.some((w) => w.wallet === selectedAccount.account);
|
|
175
|
+
if (walletExists) {
|
|
176
|
+
setWalletError("This account is already added to the report");
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
setAddingWallet(true);
|
|
180
|
+
setWalletError("");
|
|
181
|
+
try {
|
|
182
|
+
// Add the wallet to the expense report
|
|
183
|
+
dispatch(actions.addWallet({
|
|
184
|
+
wallet: selectedAccount.account,
|
|
185
|
+
name: selectedAccount.name || undefined,
|
|
186
|
+
}));
|
|
187
|
+
// Immediately update with the linked document IDs
|
|
188
|
+
dispatch(actions.updateWallet({
|
|
189
|
+
address: selectedAccount.account,
|
|
190
|
+
accountDocumentId: selectedAccount.accountsDocumentId || undefined,
|
|
191
|
+
accountTransactionsDocumentId: selectedAccount.accountTransactionsId || undefined,
|
|
192
|
+
}));
|
|
193
|
+
// Clear selection
|
|
194
|
+
setSelectedAccountId("");
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error("Error adding wallet:", error);
|
|
198
|
+
setWalletError("Failed to add wallet. Please try again.");
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
setAddingWallet(false);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
const handleAddTransactions = async (wallet) => {
|
|
205
|
+
if (!wallet.wallet) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
// Check if transactions document already exists
|
|
209
|
+
if (wallet.accountTransactionsDocumentId) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (!selectedDrive?.header?.id) {
|
|
213
|
+
alert("No drive selected");
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
// Show initial progress
|
|
218
|
+
setTxProgress({
|
|
219
|
+
show: true,
|
|
220
|
+
step: "Preparing",
|
|
221
|
+
current: 0,
|
|
222
|
+
total: 5,
|
|
223
|
+
details: "Checking for existing documents...",
|
|
224
|
+
});
|
|
225
|
+
// Find or create AccountTransactions document for this wallet
|
|
226
|
+
const existingTxDoc = allDocuments?.find((doc) => doc.header.documentType === "powerhouse/account-transactions" &&
|
|
227
|
+
doc.state?.global?.account?.account === wallet.wallet);
|
|
228
|
+
if (existingTxDoc) {
|
|
229
|
+
// Link existing document
|
|
230
|
+
dispatch(actions.updateWallet({
|
|
231
|
+
address: wallet.wallet,
|
|
232
|
+
accountTransactionsDocumentId: existingTxDoc.header.id,
|
|
233
|
+
}));
|
|
234
|
+
setTxProgress({
|
|
235
|
+
show: false,
|
|
236
|
+
step: "",
|
|
237
|
+
current: 0,
|
|
238
|
+
total: 5,
|
|
239
|
+
details: "",
|
|
240
|
+
});
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
// Step 1: Find or create an Accounts document
|
|
244
|
+
setTxProgress({
|
|
245
|
+
show: true,
|
|
246
|
+
step: "Preparing",
|
|
247
|
+
current: 0,
|
|
248
|
+
total: 5,
|
|
249
|
+
details: "Setting up accounts...",
|
|
250
|
+
});
|
|
251
|
+
const accountsDoc = allDocuments?.find((doc) => doc.header.documentType === "powerhouse/accounts");
|
|
252
|
+
let accountsDocId;
|
|
253
|
+
let existingAccounts = [];
|
|
254
|
+
if (!accountsDoc) {
|
|
255
|
+
console.log("[WalletsTable] Creating new Accounts document");
|
|
256
|
+
const accountsNode = await addDocument(selectedDrive.header.id, "Accounts", "powerhouse/accounts", undefined, undefined, undefined, "powerhouse-accounts-editor");
|
|
257
|
+
if (!accountsNode?.id) {
|
|
258
|
+
throw new Error("Failed to create Accounts document");
|
|
259
|
+
}
|
|
260
|
+
accountsDocId = accountsNode.id;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
accountsDocId = accountsDoc.header.id;
|
|
264
|
+
existingAccounts = accountsDoc.state?.global?.accounts || [];
|
|
265
|
+
}
|
|
266
|
+
// Step 2: Find or create an AccountEntry for this wallet
|
|
267
|
+
const accountEntry = existingAccounts.find((acc) => acc.account === wallet.wallet);
|
|
268
|
+
if (!accountEntry) {
|
|
269
|
+
console.log("[WalletsTable] Creating new account entry for wallet:", wallet.wallet);
|
|
270
|
+
const newAccountId = generateId();
|
|
271
|
+
const newAccountName = wallet.name || wallet.wallet.substring(0, 10);
|
|
272
|
+
// Add the account to the Accounts document
|
|
273
|
+
console.log("[WalletsTable] Adding new account to Accounts document:", newAccountId);
|
|
274
|
+
await dispatchActions([], accountsDocId);
|
|
275
|
+
console.log("[WalletsTable] Account added successfully");
|
|
276
|
+
// Create accountEntry reference
|
|
277
|
+
// Give a small delay to ensure the account is persisted
|
|
278
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
279
|
+
}
|
|
280
|
+
// Step 3: Create the AccountTransactions document
|
|
281
|
+
setTxProgress({
|
|
282
|
+
show: true,
|
|
283
|
+
step: "Preparing",
|
|
284
|
+
current: 0,
|
|
285
|
+
total: 5,
|
|
286
|
+
details: "Creating transaction document...",
|
|
287
|
+
});
|
|
288
|
+
console.log("[WalletsTable] Creating AccountTransactions document");
|
|
289
|
+
const createdNode = await addDocument(selectedDrive.header.id, "powerhouse/account-transactions", "powerhouse-account-transactions-editor");
|
|
290
|
+
if (!createdNode?.id) {
|
|
291
|
+
throw new Error("Failed to create AccountTransactions document");
|
|
292
|
+
}
|
|
293
|
+
console.log("[WalletsTable] AccountTransactions document created:", createdNode.id);
|
|
294
|
+
// Step 4: Set up pending state to let useEffect handle the rest
|
|
295
|
+
setPendingTxDoc({
|
|
296
|
+
documentId: createdNode.id,
|
|
297
|
+
accountEntry,
|
|
298
|
+
accountsDocId,
|
|
299
|
+
walletAddress: wallet.wallet,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
console.error("[WalletsTable] Error adding transactions:", error);
|
|
304
|
+
setTxProgress({
|
|
305
|
+
show: false,
|
|
306
|
+
step: "",
|
|
307
|
+
current: 0,
|
|
308
|
+
total: 5,
|
|
309
|
+
details: "",
|
|
310
|
+
});
|
|
311
|
+
alert(`Failed to add transactions document: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
const handleStartEditName = (wallet) => {
|
|
315
|
+
setEditingWallet(wallet.wallet || null);
|
|
316
|
+
setEditingName(wallet.name || "");
|
|
317
|
+
};
|
|
318
|
+
const handleSaveEditName = (walletAddress) => {
|
|
319
|
+
const wallet = wallets.find((w) => w.wallet === walletAddress);
|
|
320
|
+
const trimmedName = editingName.trim();
|
|
321
|
+
// Only update if the name has changed
|
|
322
|
+
if (trimmedName && wallet && trimmedName !== (wallet.name || "")) {
|
|
323
|
+
dispatch(actions.updateWallet({
|
|
324
|
+
address: walletAddress,
|
|
325
|
+
name: trimmedName,
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
setEditingWallet(null);
|
|
329
|
+
setEditingName("");
|
|
330
|
+
};
|
|
331
|
+
const handleCancelEditName = () => {
|
|
332
|
+
setEditingWallet(null);
|
|
333
|
+
setEditingName("");
|
|
334
|
+
};
|
|
335
|
+
const handleCopyAddress = (address) => {
|
|
336
|
+
navigator.clipboard.writeText(address);
|
|
337
|
+
setCopiedWallet(address);
|
|
338
|
+
setTimeout(() => setCopiedWallet(null), 2000);
|
|
339
|
+
};
|
|
340
|
+
const formatAddress = (address) => {
|
|
341
|
+
if (!address || address.length < 11)
|
|
342
|
+
return address;
|
|
343
|
+
return `${address.substring(0, 6)}...${address.substring(address.length - 5)}`;
|
|
344
|
+
};
|
|
345
|
+
const handleSyncWallet = async (wallet) => {
|
|
346
|
+
if (!wallet.wallet) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
// Validate period dates before syncing
|
|
350
|
+
if (!periodStart || !periodEnd) {
|
|
351
|
+
alert("Please set the period start and end dates before syncing wallet transactions.");
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
setSyncingWallet(wallet.wallet);
|
|
355
|
+
try {
|
|
356
|
+
// Get existing line items (don't remove them, we'll update instead)
|
|
357
|
+
const existingLineItems = (wallet.lineItems || []).filter((item) => item !== null && item !== undefined);
|
|
358
|
+
// Get billing statement IDs
|
|
359
|
+
const billingStatementIds = (wallet.billingStatements || []).filter((id) => id !== null && id !== undefined);
|
|
360
|
+
// Sync wallet with all new parameters
|
|
361
|
+
syncWallet(wallet.wallet, existingLineItems, billingStatementIds, groups, wallets, wallet.accountTransactionsDocumentId, periodStart, periodEnd, dispatch);
|
|
362
|
+
// Small delay to show sync animation
|
|
363
|
+
setTimeout(() => {
|
|
364
|
+
setSyncingWallet(null);
|
|
365
|
+
}, 500);
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
console.error("Error syncing wallet:", error);
|
|
369
|
+
alert(error instanceof Error ? error.message : "Error syncing wallet");
|
|
370
|
+
setSyncingWallet(null);
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
const handleRemoveWallet = (walletAddress) => {
|
|
374
|
+
dispatch(actions.removeWallet({
|
|
375
|
+
wallet: walletAddress,
|
|
376
|
+
}));
|
|
377
|
+
};
|
|
378
|
+
// Calculate totals for a wallet
|
|
379
|
+
const calculateWalletTotals = (wallet) => {
|
|
380
|
+
const lineItems = wallet.lineItems || [];
|
|
381
|
+
return {
|
|
382
|
+
budget: lineItems.reduce((sum, item) => sum + (item?.budget || 0), 0),
|
|
383
|
+
forecast: lineItems.reduce((sum, item) => sum + (item?.forecast || 0), 0),
|
|
384
|
+
actuals: lineItems.reduce((sum, item) => sum + (item?.actuals || 0), 0),
|
|
385
|
+
difference: lineItems.reduce((sum, item) => {
|
|
386
|
+
const budget = item?.budget || 0;
|
|
387
|
+
const actuals = item?.actuals || 0;
|
|
388
|
+
return sum + (actuals - budget);
|
|
389
|
+
}, 0),
|
|
390
|
+
payments: lineItems.reduce((sum, item) => sum + (item?.payments || 0), 0),
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
const formatCurrency = (value) => {
|
|
394
|
+
return new Intl.NumberFormat("en-US", {
|
|
395
|
+
style: "currency",
|
|
396
|
+
currency: "USD",
|
|
397
|
+
minimumFractionDigits: 2,
|
|
398
|
+
}).format(value);
|
|
399
|
+
};
|
|
400
|
+
return (_jsxs("div", { className: "space-y-4", children: [wallets.length > 0 ? (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "min-w-full divide-y divide-gray-200 dark:divide-gray-700", children: [_jsx("thead", { className: "bg-gray-50 dark:bg-gray-800", children: _jsxs("tr", { children: [_jsx("th", { className: "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Wallet" }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Monthly Budget" }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Forecast" }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: _jsxs("div", { className: "flex items-center justify-end gap-2", children: [needsSync && (_jsx("button", { onClick: () => {
|
|
401
|
+
// Sync all outdated wallets
|
|
402
|
+
[...tagChangedWallets, ...outdatedWallets].forEach((walletAddress) => {
|
|
403
|
+
const wallet = wallets.find((w) => w.wallet === walletAddress);
|
|
404
|
+
if (wallet) {
|
|
405
|
+
handleSyncWallet(wallet);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}, disabled: syncingWallet !== null, className: `inline-flex items-center justify-center w-8 h-8 rounded-md transition-colors ${tagChangedWallets.length > 0
|
|
409
|
+
? "text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30 animate-pulse"
|
|
410
|
+
: "text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30 animate-pulse"} disabled:opacity-50 disabled:cursor-not-allowed`, title: tagChangedWallets.length > 0
|
|
411
|
+
? "ALERT: Tags have changed in billing statements - sync all wallets!"
|
|
412
|
+
: "Sync all wallets with latest billing statements", children: _jsx(RefreshCw, { size: 16, className: syncingWallet !== null ? "animate-spin" : "" }) })), _jsx("span", { children: "Actuals" })] }) }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Difference" }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Payments" }), _jsx("th", { className: "px-6 py-3 text-right text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider", children: "Actions" })] }) }), _jsx("tbody", { className: "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700", children: wallets.map((wallet) => {
|
|
413
|
+
const totals = calculateWalletTotals(wallet);
|
|
414
|
+
return (_jsxs("tr", { className: "hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors", children: [_jsx("td", { className: "px-6 py-4 whitespace-nowrap", children: editingWallet === wallet.wallet ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(TextInput, { value: editingName, onChange: (e) => setEditingName(e.target.value), placeholder: "Enter wallet name", className: "flex-1", onKeyDown: (e) => {
|
|
415
|
+
if (e.key === "Enter") {
|
|
416
|
+
handleSaveEditName(wallet.wallet || "");
|
|
417
|
+
}
|
|
418
|
+
else if (e.key === "Escape") {
|
|
419
|
+
handleCancelEditName();
|
|
420
|
+
}
|
|
421
|
+
}, autoFocus: true }), _jsx("button", { onClick: () => handleSaveEditName(wallet.wallet || ""), className: "inline-flex items-center justify-center w-7 h-7 text-green-600 dark:text-green-400 hover:bg-green-50 dark:hover:bg-green-900/20 rounded-md transition-colors", title: "Save", children: _jsx(Check, { size: 14 }) }), _jsx("button", { onClick: handleCancelEditName, className: "inline-flex items-center justify-center w-7 h-7 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-900/20 rounded-md transition-colors", title: "Cancel", children: _jsx(X, { size: 14 }) })] })) : (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx("span", { className: "text-sm font-medium text-gray-900 dark:text-white", children: wallet.name || "Unnamed Wallet" }), _jsx("button", { onClick: () => handleStartEditName(wallet), className: "inline-flex items-center justify-center w-6 h-6 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md transition-colors", title: "Edit name", children: _jsx(Pencil, { size: 12 }) }), _jsxs("button", { onClick: () => handleCopyAddress(wallet.wallet || ""), className: "inline-flex items-center gap-1 px-2 py-1 text-xs text-gray-500 dark:text-gray-400 font-mono hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors", title: `Copy address: ${wallet.wallet}`, children: [formatAddress(wallet.wallet || ""), copiedWallet === wallet.wallet ? (_jsx(CheckCheck, { size: 12, className: "text-green-500" })) : (_jsx(Copy, { size: 12 }))] })] })) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm text-gray-900 dark:text-white", children: formatCurrency(totals.budget) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm text-gray-900 dark:text-white", children: formatCurrency(totals.forecast) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm", children: totals.actuals === 0 &&
|
|
422
|
+
(!wallet.billingStatements ||
|
|
423
|
+
wallet.billingStatements.length === 0) ? (
|
|
424
|
+
// When actuals is 0 and no billing statements, only show the Add Bills button
|
|
425
|
+
_jsx("div", { className: "flex items-center justify-end", children: _jsxs("button", { onClick: () => onAddBillingStatement(wallet.wallet || ""), className: "inline-flex items-center gap-1 px-3 py-1 text-sm font-medium text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 rounded-md transition-colors", title: "Add billing statement for this wallet", children: [_jsx(Plus, { size: 16 }), _jsx("span", { children: "Add Bills" })] }) })) : (
|
|
426
|
+
// When actuals is not 0 or has billing statements, show compact buttons + value horizontally
|
|
427
|
+
_jsxs("div", { className: "flex items-center justify-end gap-2", children: [_jsx("button", { onClick: () => onAddBillingStatement(wallet.wallet || ""), className: "inline-flex items-center justify-center w-8 h-8 text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 rounded-md transition-colors", title: "Add billing statement for this wallet", children: _jsx(Plus, { size: 16 }) }), ((wallet.billingStatements &&
|
|
428
|
+
wallet.billingStatements.length > 0) ||
|
|
429
|
+
wallet.accountTransactionsDocumentId) && (_jsx("button", { onClick: () => handleSyncWallet(wallet), disabled: syncingWallet === wallet.wallet, className: `inline-flex items-center justify-center w-8 h-8 rounded-md transition-colors ${tagChangedWallets.includes(wallet.wallet || "")
|
|
430
|
+
? "text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 hover:bg-red-100 dark:hover:bg-red-900/30 animate-pulse"
|
|
431
|
+
: outdatedWallets.includes(wallet.wallet || "")
|
|
432
|
+
? "text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-900/20 hover:bg-amber-100 dark:hover:bg-amber-900/30 animate-pulse"
|
|
433
|
+
: "text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-800 hover:bg-gray-100 dark:hover:bg-gray-700"} disabled:opacity-50 disabled:cursor-not-allowed`, title: tagChangedWallets.includes(wallet.wallet || "")
|
|
434
|
+
? "ALERT: Tags have changed - sync required!"
|
|
435
|
+
: outdatedWallets.includes(wallet.wallet || "")
|
|
436
|
+
? "Sync needed - billing statements updated"
|
|
437
|
+
: wallet.accountTransactionsDocumentId
|
|
438
|
+
? "Sync wallet with billing statements and transactions"
|
|
439
|
+
: "Sync with latest billing statements", children: _jsx(RefreshCw, { size: 16, className: syncingWallet === wallet.wallet
|
|
440
|
+
? "animate-spin"
|
|
441
|
+
: "" }) })), _jsx("span", { className: "text-sm font-medium text-gray-900 dark:text-white", children: formatCurrency(totals.actuals) })] })) }), _jsx("td", { className: `px-6 py-4 whitespace-nowrap text-right text-sm font-medium ${totals.difference > 0
|
|
442
|
+
? "text-red-600 dark:text-red-400"
|
|
443
|
+
: totals.difference < 0
|
|
444
|
+
? "text-green-600 dark:text-green-400"
|
|
445
|
+
: "text-gray-900 dark:text-white"}`, children: formatCurrency(totals.difference) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm", children: wallet.accountTransactionsDocumentId ? (
|
|
446
|
+
// Show clickable document snippet card when transactions document is linked
|
|
447
|
+
_jsx("button", { onClick: () => setSelectedNode(wallet.accountTransactionsDocumentId), className: "w-full bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30 border border-green-200 dark:border-green-800 rounded-lg p-2 transition-colors text-left", children: _jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("svg", { className: "w-4 h-4 text-green-600 dark:text-green-400 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "text-xs font-medium text-green-900 dark:text-green-100 block", children: "Transactions" }), _jsx("span", { className: "text-xs text-green-600 dark:text-green-400", children: formatCurrency(totals.payments) })] })] }), _jsx("svg", { className: "w-4 h-4 text-green-600 dark:text-green-400 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })] }) })) : (
|
|
448
|
+
// Show Add Txns button when no transactions document is linked
|
|
449
|
+
_jsx("div", { className: "flex items-center justify-end", children: _jsxs("button", { onClick: () => handleAddTransactions(wallet), className: "inline-flex items-center gap-1 px-3 py-1 text-sm font-medium text-green-600 dark:text-green-400 hover:text-green-800 dark:hover:text-green-300 bg-green-50 dark:bg-green-900/20 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-md transition-colors", title: "Add transactions document for this wallet", children: [_jsx(Plus, { size: 16 }), _jsx("span", { children: "Add Txns" })] }) })) }), _jsx("td", { className: "px-6 py-4 whitespace-nowrap text-right text-sm", children: _jsx("div", { className: "flex items-center justify-end gap-2", children: _jsx("button", { onClick: () => handleRemoveWallet(wallet.wallet || ""), className: "inline-flex items-center justify-center w-8 h-8 text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 rounded-md transition-colors", title: "Remove wallet", children: _jsx(Trash2, { size: 16 }) }) }) })] }, wallet.wallet));
|
|
450
|
+
}) })] }) })) : (_jsx("div", { className: "text-center py-12 text-gray-500 dark:text-gray-400", children: _jsx("p", { className: "text-sm", children: "No wallets added yet. Add a wallet to get started." }) })), _jsxs("div", { className: "flex items-end gap-3 pt-4 border-t border-gray-200 dark:border-gray-700", children: [_jsxs("div", { className: "flex-1 relative", children: [_jsx("label", { className: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1", children: "Select Account" }), _jsxs("select", { value: selectedAccountId, onChange: (e) => {
|
|
451
|
+
setSelectedAccountId(e.target.value);
|
|
452
|
+
setWalletError(""); // Clear error when selecting
|
|
453
|
+
}, className: "w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500", children: [_jsx("option", { value: "", children: "-- Select an account --" }), accountEntries.map((acc) => (_jsxs("option", { value: acc.id, children: [acc.name, " (", acc.account?.substring(0, 10), "...", acc.account?.substring(acc.account.length - 4), ")"] }, acc.id)))] }), walletError && (_jsx("div", { className: "absolute left-0 right-0 top-full mt-1 px-3 py-2 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md shadow-lg z-10", children: _jsx("p", { className: "text-sm text-red-600 dark:text-red-400", children: walletError }) }))] }), _jsx(Button, { onClick: handleAddWallet, disabled: !selectedAccountId || addingWallet, children: addingWallet ? "Adding..." : "Add Account" })] }), txProgress.show && (_jsx("div", { className: "fixed bottom-4 right-4 z-50 transition-all duration-300 ease-out", children: _jsx("div", { className: "bg-white dark:bg-gray-800 rounded-lg shadow-2xl border border-gray-200 dark:border-gray-700 p-4 w-80", children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(RefreshCw, { size: 20, className: "animate-spin text-blue-600 dark:text-blue-500 flex-shrink-0" }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("h4", { className: "text-sm font-semibold text-gray-900 dark:text-white truncate", children: txProgress.step }), _jsxs("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: ["Step ", txProgress.current, " of ", txProgress.total] })] })] }), _jsx("div", { className: "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1.5", children: _jsx("div", { className: "bg-blue-600 dark:bg-blue-500 h-1.5 rounded-full transition-all duration-300 ease-in-out", style: {
|
|
454
|
+
width: `${(txProgress.current / txProgress.total) * 100}%`,
|
|
455
|
+
} }) }), _jsx("p", { className: "text-xs text-gray-600 dark:text-gray-400", children: txProgress.details })] }) }) }))] }));
|
|
456
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../editors/expense-report/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,eAAO,MAAM,YAAY,EAAE,sBAE1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../editors/expense-report/editor.tsx"],"names":[],"mappings":"AAsBA,MAAM,CAAC,OAAO,UAAU,MAAM,4CAqQ7B"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from "react";
|
|
3
|
+
import { useSelectedExpenseReportDocument } from "../../document-models/expense-report/hooks.js";
|
|
4
|
+
import { actions, } from "../../document-models/expense-report/index.js";
|
|
5
|
+
import { DatePicker, Icon, Button } from "@powerhousedao/document-engineering";
|
|
6
|
+
import { WalletsTable } from "./components/WalletsTable.js";
|
|
7
|
+
import { AggregatedExpensesTable } from "./components/AggregatedExpensesTable.js";
|
|
8
|
+
import { AddBillingStatementModal } from "./components/AddBillingStatementModal.js";
|
|
9
|
+
import { ExpenseReportPDF } from "./components/ExpenseReportPDF.js";
|
|
10
|
+
import { pdf } from "@react-pdf/renderer";
|
|
11
|
+
import { PDFViewer } from "@react-pdf/renderer";
|
|
12
|
+
import { DocumentToolbar } from "@powerhousedao/design-system/connect";
|
|
13
|
+
import { setSelectedNode, useParentFolderForSelectedNode, } from "@powerhousedao/reactor-browser";
|
|
14
|
+
import { useSyncWallet } from "./hooks/useSyncWallet.js";
|
|
15
|
+
import { RefreshCw } from "lucide-react";
|
|
16
|
+
export default function Editor() {
|
|
17
|
+
const [document, dispatch] = useSelectedExpenseReportDocument();
|
|
18
|
+
const [selectedWallet, setSelectedWallet] = useState(null);
|
|
19
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
20
|
+
const [isSyncingAll, setIsSyncingAll] = useState(false);
|
|
21
|
+
const [periodStart, setPeriodStart] = useState(document?.state.global.periodStart || "");
|
|
22
|
+
const [periodEnd, setPeriodEnd] = useState(document?.state.global.periodEnd || "");
|
|
23
|
+
const { wallets, groups } = document?.state.global || {
|
|
24
|
+
wallets: [],
|
|
25
|
+
groups: [],
|
|
26
|
+
};
|
|
27
|
+
const { syncWallet } = useSyncWallet();
|
|
28
|
+
// Handle period date changes
|
|
29
|
+
const handlePeriodStartChange = (e) => {
|
|
30
|
+
const value = e.target.value;
|
|
31
|
+
setPeriodStart(value);
|
|
32
|
+
if (value) {
|
|
33
|
+
dispatch?.(actions.setPeriodStart({ periodStart: value }));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const handlePeriodEndChange = (e) => {
|
|
37
|
+
const value = e.target.value;
|
|
38
|
+
setPeriodEnd(value);
|
|
39
|
+
if (value) {
|
|
40
|
+
dispatch?.(actions.setPeriodEnd({ periodEnd: value }));
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
// Handle wallet selection for adding billing statements
|
|
44
|
+
const handleAddBillingStatement = (walletAddress) => {
|
|
45
|
+
setSelectedWallet(walletAddress);
|
|
46
|
+
setIsModalOpen(true);
|
|
47
|
+
};
|
|
48
|
+
// Handle closing modal
|
|
49
|
+
const handleCloseModal = () => {
|
|
50
|
+
setIsModalOpen(false);
|
|
51
|
+
setSelectedWallet(null);
|
|
52
|
+
};
|
|
53
|
+
// Handle sync all wallets
|
|
54
|
+
const handleSyncAllWallets = () => {
|
|
55
|
+
if (!periodStart || !periodEnd) {
|
|
56
|
+
alert("Please set the period start and end dates before syncing wallet transactions.");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
setIsSyncingAll(true);
|
|
60
|
+
// Sync all wallets that have either billing statements or transactions
|
|
61
|
+
wallets.forEach((wallet) => {
|
|
62
|
+
if (wallet.wallet &&
|
|
63
|
+
((wallet.billingStatements && wallet.billingStatements.length > 0) ||
|
|
64
|
+
wallet.accountTransactionsDocumentId)) {
|
|
65
|
+
syncWallet(wallet.wallet, (wallet.lineItems || []).filter((item) => item !== null), (wallet.billingStatements || []).filter((id) => id !== null), groups, wallets, wallet.accountTransactionsDocumentId, periodStart, periodEnd, dispatch);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
setIsSyncingAll(false);
|
|
69
|
+
};
|
|
70
|
+
// Handle PDF export
|
|
71
|
+
const handleExportPDF = async () => {
|
|
72
|
+
try {
|
|
73
|
+
const blob = await pdf(_jsx(ExpenseReportPDF, { periodStart: periodStart, periodEnd: periodEnd, wallets: wallets, groups: groups })).toBlob();
|
|
74
|
+
// Create download link
|
|
75
|
+
const url = URL.createObjectURL(blob);
|
|
76
|
+
const link = window.document.createElement("a");
|
|
77
|
+
link.href = url;
|
|
78
|
+
// Generate filename with period
|
|
79
|
+
const filename = periodStart
|
|
80
|
+
? `expense-report-${new Date(periodStart).toISOString().split("T")[0]}.pdf`
|
|
81
|
+
: "expense-report.pdf";
|
|
82
|
+
link.download = filename;
|
|
83
|
+
link.click();
|
|
84
|
+
// Cleanup
|
|
85
|
+
URL.revokeObjectURL(url);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error("Error generating PDF:", error);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// Format period title for the breakdown section
|
|
92
|
+
const breakdownTitle = useMemo(() => {
|
|
93
|
+
if (!periodStart)
|
|
94
|
+
return "Breakdown";
|
|
95
|
+
const date = new Date(periodStart);
|
|
96
|
+
const month = date.toLocaleDateString("en-US", { month: "short" });
|
|
97
|
+
const year = date.getFullYear();
|
|
98
|
+
return `${month} ${year} Breakdown`;
|
|
99
|
+
}, [periodStart]);
|
|
100
|
+
// Get the parent folder node for the currently selected node
|
|
101
|
+
const parentFolder = useParentFolderForSelectedNode();
|
|
102
|
+
// Set the selected node to the parent folder node (close the editor)
|
|
103
|
+
function handleClose() {
|
|
104
|
+
setSelectedNode(parentFolder?.id);
|
|
105
|
+
}
|
|
106
|
+
return (_jsxs("div", { children: [_jsx(DocumentToolbar, { document: document, onClose: handleClose }), _jsxs("div", { className: "ph-default-styles flex flex-col h-full w-full bg-gray-50 dark:bg-gray-900", children: [_jsx("div", { className: "flex-1 overflow-auto px-8 py-6", children: _jsxs("div", { className: "max-w-7xl mx-auto space-y-8", children: [_jsx("section", { className: "bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700", children: _jsx("div", { className: "px-6 py-6", children: _jsxs("div", { className: "relative", children: [_jsxs("div", { className: "text-center", children: [_jsx("h1", { className: "text-3xl font-bold text-gray-900 dark:text-white mb-4", children: "Expense Report" }), _jsx("div", { className: "flex items-center justify-center gap-4 text-sm text-gray-600 dark:text-gray-400", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-medium", children: "Period:" }), _jsx(DatePicker, { name: "periodStart", value: periodStart, onChange: handlePeriodStartChange, className: "bg-white" }), _jsx("span", { children: "to" }), _jsx(DatePicker, { name: "periodEnd", value: periodEnd, onChange: handlePeriodEndChange, className: "bg-white" })] }) })] }), _jsxs(Button, { variant: "ghost", onClick: handleExportPDF, className: "absolute top-0 right-0 flex items-center gap-2", children: [_jsx(Icon, { name: "ExportPdf", size: 18 }), "Export to PDF"] })] }) }) }), _jsxs("section", { className: "bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700", children: [_jsxs("div", { className: "px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between", children: [_jsx("h2", { className: "text-xl font-semibold text-gray-900 dark:text-white", children: "Wallets" }), _jsxs(Button, { variant: "ghost", onClick: handleSyncAllWallets, disabled: isSyncingAll, className: "flex items-center gap-2", children: [_jsx(RefreshCw, { size: 16, className: isSyncingAll ? "animate-spin" : "" }), _jsx("span", { children: isSyncingAll ? "Syncing..." : "Sync All" })] })] }), _jsx("div", { className: "p-6", children: _jsx(WalletsTable, { wallets: wallets, groups: groups, onAddBillingStatement: handleAddBillingStatement, periodStart: periodStart, periodEnd: periodEnd, dispatch: dispatch }) })] }), wallets.length > 0 && (_jsxs("section", { className: "bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700", children: [_jsx("div", { className: "px-6 py-4 border-b border-gray-200 dark:border-gray-700", children: _jsx("h2", { className: "text-xl font-semibold text-gray-900 dark:text-white", children: breakdownTitle }) }), _jsx("div", { className: "p-6", children: _jsx(AggregatedExpensesTable, { wallets: wallets, groups: groups, periodStart: periodStart, periodEnd: periodEnd, dispatch: dispatch }) })] }))] }) }), isModalOpen && selectedWallet && (_jsx(AddBillingStatementModal, { isOpen: isModalOpen, onClose: handleCloseModal, walletAddress: selectedWallet, dispatch: dispatch, groups: groups }))] })] }));
|
|
107
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LineItemGroup, LineItem, Wallet } from "../../../document-models/expense-report/gen/types.js";
|
|
2
|
+
export declare function useSyncWallet(): {
|
|
3
|
+
syncWallet: (walletAddress: string, existingLineItems: LineItem[], billingStatementIds: string[], groups: LineItemGroup[], allWallets: Wallet[], accountTransactionsDocumentId: string | null | undefined, periodStart: string | null | undefined, periodEnd: string | null | undefined, dispatch: any) => void;
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=useSyncWallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSyncWallet.d.ts","sourceRoot":"","sources":["../../../../editors/expense-report/hooks/useSyncWallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,MAAM,EACP,MAAM,sDAAsD,CAAC;AAkB9D,wBAAgB,aAAa;gCAIV,MAAM,qBACF,QAAQ,EAAE,uBACR,MAAM,EAAE,UACrB,aAAa,EAAE,cACX,MAAM,EAAE,iCACW,MAAM,GAAG,IAAI,GAAG,SAAS,eAC3C,MAAM,GAAG,IAAI,GAAG,SAAS,aAC3B,MAAM,GAAG,IAAI,GAAG,SAAS,YAC1B,GAAG;EAuMhB"}
|