@mj-biz-apps/accounting-ng 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.component.d.ts +103 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.component.d.ts.map +1 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.component.js +527 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.component.js.map +1 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.module.d.ts +8 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.module.d.ts.map +1 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.module.js +21 -0
- package/dist/lib/components/deferred-revenue-waterfall/deferred-revenue-waterfall.module.js.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/chart-of-accounts.module.d.ts +20 -0
- package/dist/lib/custom/ChartOfAccounts/chart-of-accounts.module.d.ts.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/chart-of-accounts.module.js +75 -0
- package/dist/lib/custom/ChartOfAccounts/chart-of-accounts.module.js.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/coa-dashboard.component.d.ts +167 -0
- package/dist/lib/custom/ChartOfAccounts/coa-dashboard.component.d.ts.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/coa-dashboard.component.js +756 -0
- package/dist/lib/custom/ChartOfAccounts/coa-dashboard.component.js.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/coa-resource.component.d.ts +19 -0
- package/dist/lib/custom/ChartOfAccounts/coa-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/ChartOfAccounts/coa-resource.component.js +50 -0
- package/dist/lib/custom/ChartOfAccounts/coa-resource.component.js.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup-dashboard.component.d.ts +102 -0
- package/dist/lib/custom/CompanySetup/company-setup-dashboard.component.d.ts.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup-dashboard.component.js +516 -0
- package/dist/lib/custom/CompanySetup/company-setup-dashboard.component.js.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup-resource.component.d.ts +19 -0
- package/dist/lib/custom/CompanySetup/company-setup-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup-resource.component.js +50 -0
- package/dist/lib/custom/CompanySetup/company-setup-resource.component.js.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup.module.d.ts +17 -0
- package/dist/lib/custom/CompanySetup/company-setup.module.d.ts.map +1 -0
- package/dist/lib/custom/CompanySetup/company-setup.module.js +57 -0
- package/dist/lib/custom/CompanySetup/company-setup.module.js.map +1 -0
- package/dist/lib/custom/GLAccount/gl-account-form.component.d.ts +69 -0
- package/dist/lib/custom/GLAccount/gl-account-form.component.d.ts.map +1 -0
- package/dist/lib/custom/GLAccount/gl-account-form.component.js +315 -0
- package/dist/lib/custom/GLAccount/gl-account-form.component.js.map +1 -0
- package/dist/lib/custom/JournalEntry/journal-entry.client.d.ts +14 -0
- package/dist/lib/custom/JournalEntry/journal-entry.client.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntry/journal-entry.client.js +28 -0
- package/dist/lib/custom/JournalEntry/journal-entry.client.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-dashboard.component.d.ts +95 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-dashboard.component.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-dashboard.component.js +483 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-dashboard.component.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-resource.component.d.ts +22 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-resource.component.js +55 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch-resource.component.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.client.d.ts +53 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.client.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.client.js +116 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.client.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.module.d.ts +18 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.module.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.module.js +60 -0
- package/dist/lib/custom/JournalEntryBatchDispatch/journal-entry-batch-dispatch.module.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-dashboard.component.d.ts +189 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-dashboard.component.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-dashboard.component.js +1004 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-dashboard.component.js.map +1 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-resource.component.d.ts +18 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-resource.component.js +49 -0
- package/dist/lib/custom/JournalEntryBatchStatus/journal-entry-batch-status-resource.component.js.map +1 -0
- package/dist/lib/custom/custom-forms.module.d.ts +35 -0
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -0
- package/dist/lib/custom/custom-forms.module.js +159 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -0
- package/dist/lib/custom/form-panels/company-accounting-header.panel.d.ts +23 -0
- package/dist/lib/custom/form-panels/company-accounting-header.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/company-accounting-header.panel.js +447 -0
- package/dist/lib/custom/form-panels/company-accounting-header.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/company-accounting-overview.panel.d.ts +36 -0
- package/dist/lib/custom/form-panels/company-accounting-overview.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/company-accounting-overview.panel.js +760 -0
- package/dist/lib/custom/form-panels/company-accounting-overview.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/company-profile-hierarchy.panel.d.ts +22 -0
- package/dist/lib/custom/form-panels/company-profile-hierarchy.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/company-profile-hierarchy.panel.js +113 -0
- package/dist/lib/custom/form-panels/company-profile-hierarchy.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/dimension-value-hierarchy.panel.d.ts +23 -0
- package/dist/lib/custom/form-panels/dimension-value-hierarchy.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/dimension-value-hierarchy.panel.js +118 -0
- package/dist/lib/custom/form-panels/dimension-value-hierarchy.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/gl-account-hierarchy.panel.d.ts +23 -0
- package/dist/lib/custom/form-panels/gl-account-hierarchy.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/gl-account-hierarchy.panel.js +118 -0
- package/dist/lib/custom/form-panels/gl-account-hierarchy.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-header.panel.d.ts +21 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-header.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-header.panel.js +414 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-header.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-overview.panel.d.ts +39 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-overview.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-overview.panel.js +777 -0
- package/dist/lib/custom/form-panels/journal-entry-batch-overview.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-header.panel.d.ts +32 -0
- package/dist/lib/custom/form-panels/journal-entry-header.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-header.panel.js +242 -0
- package/dist/lib/custom/form-panels/journal-entry-header.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-lines.panel.d.ts +42 -0
- package/dist/lib/custom/form-panels/journal-entry-lines.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-lines.panel.js +314 -0
- package/dist/lib/custom/form-panels/journal-entry-lines.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-overview.panel.d.ts +27 -0
- package/dist/lib/custom/form-panels/journal-entry-overview.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-overview.panel.js +278 -0
- package/dist/lib/custom/form-panels/journal-entry-overview.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-panel.helpers.d.ts +26 -0
- package/dist/lib/custom/form-panels/journal-entry-panel.helpers.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-panel.helpers.js +65 -0
- package/dist/lib/custom/form-panels/journal-entry-panel.helpers.js.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-reversal.panel.d.ts +12 -0
- package/dist/lib/custom/form-panels/journal-entry-reversal.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/journal-entry-reversal.panel.js +55 -0
- package/dist/lib/custom/form-panels/journal-entry-reversal.panel.js.map +1 -0
- package/dist/lib/custom/form-panels/tax-jurisdiction-hierarchy.panel.d.ts +22 -0
- package/dist/lib/custom/form-panels/tax-jurisdiction-hierarchy.panel.d.ts.map +1 -0
- package/dist/lib/custom/form-panels/tax-jurisdiction-hierarchy.panel.js +113 -0
- package/dist/lib/custom/form-panels/tax-jurisdiction-hierarchy.panel.js.map +1 -0
- package/dist/lib/custom/overview/accounting-batches.component.d.ts +52 -0
- package/dist/lib/custom/overview/accounting-batches.component.d.ts.map +1 -0
- package/dist/lib/custom/overview/accounting-batches.component.js +531 -0
- package/dist/lib/custom/overview/accounting-batches.component.js.map +1 -0
- package/dist/lib/custom/overview/accounting-overview.component.d.ts +62 -0
- package/dist/lib/custom/overview/accounting-overview.component.d.ts.map +1 -0
- package/dist/lib/custom/overview/accounting-overview.component.js +718 -0
- package/dist/lib/custom/overview/accounting-overview.component.js.map +1 -0
- package/dist/lib/custom/resources/accounting-overview-resource.component.d.ts +18 -0
- package/dist/lib/custom/resources/accounting-overview-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/resources/accounting-overview-resource.component.js +48 -0
- package/dist/lib/custom/resources/accounting-overview-resource.component.js.map +1 -0
- package/dist/lib/custom/resources/approvals-resource.component.d.ts +18 -0
- package/dist/lib/custom/resources/approvals-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/resources/approvals-resource.component.js +49 -0
- package/dist/lib/custom/resources/approvals-resource.component.js.map +1 -0
- package/dist/lib/custom/resources/batches-resource.component.d.ts +18 -0
- package/dist/lib/custom/resources/batches-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/resources/batches-resource.component.js +48 -0
- package/dist/lib/custom/resources/batches-resource.component.js.map +1 -0
- package/dist/lib/custom/resources/dimensions-resource.component.d.ts +18 -0
- package/dist/lib/custom/resources/dimensions-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/resources/dimensions-resource.component.js +49 -0
- package/dist/lib/custom/resources/dimensions-resource.component.js.map +1 -0
- package/dist/lib/custom/resources/journal-entries-resource.component.d.ts +22 -0
- package/dist/lib/custom/resources/journal-entries-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/resources/journal-entries-resource.component.js +70 -0
- package/dist/lib/custom/resources/journal-entries-resource.component.js.map +1 -0
- package/dist/lib/custom/shared/biz-detail-form.d.ts +47 -0
- package/dist/lib/custom/shared/biz-detail-form.d.ts.map +1 -0
- package/dist/lib/custom/shared/biz-detail-form.js +42 -0
- package/dist/lib/custom/shared/biz-detail-form.js.map +1 -0
- package/dist/lib/custom/shared/check-dropdown.component.d.ts +45 -0
- package/dist/lib/custom/shared/check-dropdown.component.d.ts.map +1 -0
- package/dist/lib/custom/shared/check-dropdown.component.js +172 -0
- package/dist/lib/custom/shared/check-dropdown.component.js.map +1 -0
- package/dist/lib/custom/shared/company-scope-chip.component.d.ts +29 -0
- package/dist/lib/custom/shared/company-scope-chip.component.d.ts.map +1 -0
- package/dist/lib/custom/shared/company-scope-chip.component.js +178 -0
- package/dist/lib/custom/shared/company-scope-chip.component.js.map +1 -0
- package/dist/lib/custom/shared/company-scope.service.d.ts +64 -0
- package/dist/lib/custom/shared/company-scope.service.d.ts.map +1 -0
- package/dist/lib/custom/shared/company-scope.service.js +142 -0
- package/dist/lib/custom/shared/company-scope.service.js.map +1 -0
- package/dist/lib/custom/shared/gl-resolution-preview.component.d.ts +39 -0
- package/dist/lib/custom/shared/gl-resolution-preview.component.d.ts.map +1 -0
- package/dist/lib/custom/shared/gl-resolution-preview.component.js +164 -0
- package/dist/lib/custom/shared/gl-resolution-preview.component.js.map +1 -0
- package/dist/lib/custom/shared/je-rules.d.ts +56 -0
- package/dist/lib/custom/shared/je-rules.d.ts.map +1 -0
- package/dist/lib/custom/shared/je-rules.js +64 -0
- package/dist/lib/custom/shared/je-rules.js.map +1 -0
- package/dist/lib/custom/shared/list-toolbar.component.d.ts +58 -0
- package/dist/lib/custom/shared/list-toolbar.component.d.ts.map +1 -0
- package/dist/lib/custom/shared/list-toolbar.component.js +261 -0
- package/dist/lib/custom/shared/list-toolbar.component.js.map +1 -0
- package/dist/lib/custom/shared/read-model.shared.d.ts +22 -0
- package/dist/lib/custom/shared/read-model.shared.d.ts.map +1 -0
- package/dist/lib/custom/shared/read-model.shared.js +67 -0
- package/dist/lib/custom/shared/read-model.shared.js.map +1 -0
- package/dist/lib/custom/shared/read-models.module.d.ts +15 -0
- package/dist/lib/custom/shared/read-models.module.d.ts.map +1 -0
- package/dist/lib/custom/shared/read-models.module.js +81 -0
- package/dist/lib/custom/shared/read-models.module.js.map +1 -0
- package/dist/lib/custom/shared/summary-strip.component.d.ts +44 -0
- package/dist/lib/custom/shared/summary-strip.component.d.ts.map +1 -0
- package/dist/lib/custom/shared/summary-strip.component.js +103 -0
- package/dist/lib/custom/shared/summary-strip.component.js.map +1 -0
- package/dist/lib/custom/shell/accounts-category-resource.component.d.ts +18 -0
- package/dist/lib/custom/shell/accounts-category-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/accounts-category-resource.component.js +48 -0
- package/dist/lib/custom/shell/accounts-category-resource.component.js.map +1 -0
- package/dist/lib/custom/shell/accounts-category.component.d.ts +26 -0
- package/dist/lib/custom/shell/accounts-category.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/accounts-category.component.js +174 -0
- package/dist/lib/custom/shell/accounts-category.component.js.map +1 -0
- package/dist/lib/custom/shell/batches-category-resource.component.d.ts +21 -0
- package/dist/lib/custom/shell/batches-category-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/batches-category-resource.component.js +51 -0
- package/dist/lib/custom/shell/batches-category-resource.component.js.map +1 -0
- package/dist/lib/custom/shell/batches-category.component.d.ts +40 -0
- package/dist/lib/custom/shell/batches-category.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/batches-category.component.js +228 -0
- package/dist/lib/custom/shell/batches-category.component.js.map +1 -0
- package/dist/lib/custom/shell/category-shell.base.d.ts +95 -0
- package/dist/lib/custom/shell/category-shell.base.d.ts.map +1 -0
- package/dist/lib/custom/shell/category-shell.base.js +135 -0
- package/dist/lib/custom/shell/category-shell.base.js.map +1 -0
- package/dist/lib/custom/shell/configuration-category-resource.component.d.ts +18 -0
- package/dist/lib/custom/shell/configuration-category-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/configuration-category-resource.component.js +48 -0
- package/dist/lib/custom/shell/configuration-category-resource.component.js.map +1 -0
- package/dist/lib/custom/shell/configuration-category.component.d.ts +24 -0
- package/dist/lib/custom/shell/configuration-category.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/configuration-category.component.js +130 -0
- package/dist/lib/custom/shell/configuration-category.component.js.map +1 -0
- package/dist/lib/custom/shell/journal-entries-category-resource.component.d.ts +22 -0
- package/dist/lib/custom/shell/journal-entries-category-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/journal-entries-category-resource.component.js +52 -0
- package/dist/lib/custom/shell/journal-entries-category-resource.component.js.map +1 -0
- package/dist/lib/custom/shell/journal-entries-category.component.d.ts +37 -0
- package/dist/lib/custom/shell/journal-entries-category.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/journal-entries-category.component.js +162 -0
- package/dist/lib/custom/shell/journal-entries-category.component.js.map +1 -0
- package/dist/lib/custom/shell/pages/account-links.page.d.ts +112 -0
- package/dist/lib/custom/shell/pages/account-links.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/account-links.page.js +375 -0
- package/dist/lib/custom/shell/pages/account-links.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/accounting-dashboard.base.d.ts +85 -0
- package/dist/lib/custom/shell/pages/accounting-dashboard.base.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/accounting-dashboard.base.js +55 -0
- package/dist/lib/custom/shell/pages/accounting-dashboard.base.js.map +1 -0
- package/dist/lib/custom/shell/pages/all-batches.page.d.ts +105 -0
- package/dist/lib/custom/shell/pages/all-batches.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/all-batches.page.js +348 -0
- package/dist/lib/custom/shell/pages/all-batches.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/all-journal-entries.page.d.ts +218 -0
- package/dist/lib/custom/shell/pages/all-journal-entries.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/all-journal-entries.page.js +504 -0
- package/dist/lib/custom/shell/pages/all-journal-entries.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/batch-detail-panel.component.d.ts +88 -0
- package/dist/lib/custom/shell/pages/batch-detail-panel.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/batch-detail-panel.component.js +444 -0
- package/dist/lib/custom/shell/pages/batch-detail-panel.component.js.map +1 -0
- package/dist/lib/custom/shell/pages/dashboard-breakdown.d.ts +59 -0
- package/dist/lib/custom/shell/pages/dashboard-breakdown.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/dashboard-breakdown.js +34 -0
- package/dist/lib/custom/shell/pages/dashboard-breakdown.js.map +1 -0
- package/dist/lib/custom/shell/pages/dimensions.page.d.ts +65 -0
- package/dist/lib/custom/shell/pages/dimensions.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/dimensions.page.js +277 -0
- package/dist/lib/custom/shell/pages/dimensions.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/dispatch-status.page.d.ts +181 -0
- package/dist/lib/custom/shell/pages/dispatch-status.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/dispatch-status.page.js +693 -0
- package/dist/lib/custom/shell/pages/dispatch-status.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/gl-accounts.page.d.ts +280 -0
- package/dist/lib/custom/shell/pages/gl-accounts.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/gl-accounts.page.js +878 -0
- package/dist/lib/custom/shell/pages/gl-accounts.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/je-approvals.page.d.ts +90 -0
- package/dist/lib/custom/shell/pages/je-approvals.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/je-approvals.page.js +251 -0
- package/dist/lib/custom/shell/pages/je-approvals.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/je-dashboard.page.d.ts +73 -0
- package/dist/lib/custom/shell/pages/je-dashboard.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/je-dashboard.page.js +493 -0
- package/dist/lib/custom/shell/pages/je-dashboard.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/je-draft.d.ts +82 -0
- package/dist/lib/custom/shell/pages/je-draft.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/je-draft.js +108 -0
- package/dist/lib/custom/shell/pages/je-draft.js.map +1 -0
- package/dist/lib/custom/shell/pages/je-workspace.client.d.ts +27 -0
- package/dist/lib/custom/shell/pages/je-workspace.client.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/je-workspace.client.js +34 -0
- package/dist/lib/custom/shell/pages/je-workspace.client.js.map +1 -0
- package/dist/lib/custom/shell/pages/je-workspace.page.d.ts +265 -0
- package/dist/lib/custom/shell/pages/je-workspace.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/je-workspace.page.js +994 -0
- package/dist/lib/custom/shell/pages/je-workspace.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.client.d.ts +75 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.client.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.client.js +52 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.client.js.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.page.d.ts +171 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.page.js +859 -0
- package/dist/lib/custom/shell/pages/journal-entry-batch-workspace.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batches-dashboard.page.d.ts +57 -0
- package/dist/lib/custom/shell/pages/journal-entry-batches-dashboard.page.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-batches-dashboard.page.js +481 -0
- package/dist/lib/custom/shell/pages/journal-entry-batches-dashboard.page.js.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-detail-panel.component.d.ts +154 -0
- package/dist/lib/custom/shell/pages/journal-entry-detail-panel.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/journal-entry-detail-panel.component.js +681 -0
- package/dist/lib/custom/shell/pages/journal-entry-detail-panel.component.js.map +1 -0
- package/dist/lib/custom/shell/pages/shell-page-pending.component.d.ts +20 -0
- package/dist/lib/custom/shell/pages/shell-page-pending.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/pages/shell-page-pending.component.js +45 -0
- package/dist/lib/custom/shell/pages/shell-page-pending.component.js.map +1 -0
- package/dist/lib/custom/shell/reports-category-resource.component.d.ts +18 -0
- package/dist/lib/custom/shell/reports-category-resource.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/reports-category-resource.component.js +48 -0
- package/dist/lib/custom/shell/reports-category-resource.component.js.map +1 -0
- package/dist/lib/custom/shell/reports-category.component.d.ts +21 -0
- package/dist/lib/custom/shell/reports-category.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/reports-category.component.js +96 -0
- package/dist/lib/custom/shell/reports-category.component.js.map +1 -0
- package/dist/lib/custom/shell/shell-rail-state.service.d.ts +33 -0
- package/dist/lib/custom/shell/shell-rail-state.service.d.ts.map +1 -0
- package/dist/lib/custom/shell/shell-rail-state.service.js +52 -0
- package/dist/lib/custom/shell/shell-rail-state.service.js.map +1 -0
- package/dist/lib/custom/shell/shell-rail.component.d.ts +97 -0
- package/dist/lib/custom/shell/shell-rail.component.d.ts.map +1 -0
- package/dist/lib/custom/shell/shell-rail.component.js +208 -0
- package/dist/lib/custom/shell/shell-rail.component.js.map +1 -0
- package/dist/lib/custom/shell/shell.module.d.ts +60 -0
- package/dist/lib/custom/shell/shell.module.d.ts.map +1 -0
- package/dist/lib/custom/shell/shell.module.js +267 -0
- package/dist/lib/custom/shell/shell.module.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingAccountingCompanyProfile/mjbizappsaccountingaccountingcompanyprofile.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingAccountingCompanyProfile/mjbizappsaccountingaccountingcompanyprofile.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingAccountingCompanyProfile/mjbizappsaccountingaccountingcompanyprofile.form.component.js +152 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingAccountingCompanyProfile/mjbizappsaccountingaccountingcompanyprofile.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCompanyTaxNexus/mjbizappsaccountingcompanytaxnexus.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCompanyTaxNexus/mjbizappsaccountingcompanytaxnexus.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCompanyTaxNexus/mjbizappsaccountingcompanytaxnexus.form.component.js +91 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCompanyTaxNexus/mjbizappsaccountingcompanytaxnexus.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrency/mjbizappsaccountingcurrency.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrency/mjbizappsaccountingcurrency.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrency/mjbizappsaccountingcurrency.form.component.js +180 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrency/mjbizappsaccountingcurrency.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrencySpotRate/mjbizappsaccountingcurrencyspotrate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrencySpotRate/mjbizappsaccountingcurrencyspotrate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrencySpotRate/mjbizappsaccountingcurrencyspotrate.form.component.js +79 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingCurrencySpotRate/mjbizappsaccountingcurrencyspotrate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimension/mjbizappsaccountingdimension.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimension/mjbizappsaccountingdimension.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimension/mjbizappsaccountingdimension.form.component.js +150 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimension/mjbizappsaccountingdimension.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimensionValue/mjbizappsaccountingdimensionvalue.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimensionValue/mjbizappsaccountingdimensionvalue.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimensionValue/mjbizappsaccountingdimensionvalue.form.component.js +158 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingDimensionValue/mjbizappsaccountingdimensionvalue.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccount/mjbizappsaccountingglaccount.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccount/mjbizappsaccountingglaccount.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccount/mjbizappsaccountingglaccount.form.component.js +202 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccount/mjbizappsaccountingglaccount.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLink/mjbizappsaccountingglaccountlink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLink/mjbizappsaccountingglaccountlink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLink/mjbizappsaccountingglaccountlink.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLink/mjbizappsaccountingglaccountlink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLinkDimension/mjbizappsaccountingglaccountlinkdimension.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLinkDimension/mjbizappsaccountingglaccountlinkdimension.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLinkDimension/mjbizappsaccountingglaccountlinkdimension.form.component.js +67 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountLinkDimension/mjbizappsaccountingglaccountlinkdimension.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountRole/mjbizappsaccountingglaccountrole.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountRole/mjbizappsaccountingglaccountrole.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountRole/mjbizappsaccountingglaccountrole.form.component.js +88 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingGLAccountRole/mjbizappsaccountingglaccountrole.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatch/mjbizappsaccountingintercompanyaccountmatch.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatch/mjbizappsaccountingintercompanyaccountmatch.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatch/mjbizappsaccountingintercompanyaccountmatch.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatch/mjbizappsaccountingintercompanyaccountmatch.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatchDimension/mjbizappsaccountingintercompanyaccountmatchdimension.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatchDimension/mjbizappsaccountingintercompanyaccountmatchdimension.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatchDimension/mjbizappsaccountingintercompanyaccountmatchdimension.form.component.js +77 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingIntercompanyAccountMatchDimension/mjbizappsaccountingintercompanyaccountmatchdimension.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntry/mjbizappsaccountingjournalentry.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntry/mjbizappsaccountingjournalentry.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntry/mjbizappsaccountingjournalentry.form.component.js +206 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntry/mjbizappsaccountingjournalentry.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatch/mjbizappsaccountingjournalentrybatch.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatch/mjbizappsaccountingjournalentrybatch.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatch/mjbizappsaccountingjournalentrybatch.form.component.js +142 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatch/mjbizappsaccountingjournalentrybatch.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatchSequence/mjbizappsaccountingjournalentrybatchsequence.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatchSequence/mjbizappsaccountingjournalentrybatchsequence.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatchSequence/mjbizappsaccountingjournalentrybatchsequence.form.component.js +63 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryBatchSequence/mjbizappsaccountingjournalentrybatchsequence.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLine/mjbizappsaccountingjournalentryline.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLine/mjbizappsaccountingjournalentryline.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLine/mjbizappsaccountingjournalentryline.form.component.js +112 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLine/mjbizappsaccountingjournalentryline.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLineDimension/mjbizappsaccountingjournalentrylinedimension.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLineDimension/mjbizappsaccountingjournalentrylinedimension.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLineDimension/mjbizappsaccountingjournalentrylinedimension.form.component.js +73 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryLineDimension/mjbizappsaccountingjournalentrylinedimension.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntrySequence/mjbizappsaccountingjournalentrysequence.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntrySequence/mjbizappsaccountingjournalentrysequence.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntrySequence/mjbizappsaccountingjournalentrysequence.form.component.js +67 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntrySequence/mjbizappsaccountingjournalentrysequence.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryType/mjbizappsaccountingjournalentrytype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryType/mjbizappsaccountingjournalentrytype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryType/mjbizappsaccountingjournalentrytype.form.component.js +98 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingJournalEntryType/mjbizappsaccountingjournalentrytype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxAuthority/mjbizappsaccountingtaxauthority.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxAuthority/mjbizappsaccountingtaxauthority.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxAuthority/mjbizappsaccountingtaxauthority.form.component.js +116 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxAuthority/mjbizappsaccountingtaxauthority.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxJurisdiction/mjbizappsaccountingtaxjurisdiction.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxJurisdiction/mjbizappsaccountingtaxjurisdiction.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxJurisdiction/mjbizappsaccountingtaxjurisdiction.form.component.js +182 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxJurisdiction/mjbizappsaccountingtaxjurisdiction.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxLiability/mjbizappsaccountingtaxliability.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxLiability/mjbizappsaccountingtaxliability.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxLiability/mjbizappsaccountingtaxliability.form.component.js +89 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxLiability/mjbizappsaccountingtaxliability.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxRate/mjbizappsaccountingtaxrate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxRate/mjbizappsaccountingtaxrate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxRate/mjbizappsaccountingtaxrate.form.component.js +85 -0
- package/dist/lib/generated/Entities/mjBizAppsAccountingTaxRate/mjbizappsaccountingtaxrate.form.component.js.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts +7 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.js +7 -0
- package/dist/lib/generated/class-registrations-manifest.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +45 -0
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
- package/dist/lib/generated/generated-forms.module.js +159 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -0
- package/dist/lib/transfer-pending/cross-app-link/cross-app-link.service.d.ts +44 -0
- package/dist/lib/transfer-pending/cross-app-link/cross-app-link.service.d.ts.map +1 -0
- package/dist/lib/transfer-pending/cross-app-link/cross-app-link.service.js +76 -0
- package/dist/lib/transfer-pending/cross-app-link/cross-app-link.service.js.map +1 -0
- package/dist/lib/transfer-pending/dialog-dismiss/discard-confirm.component.d.ts +18 -0
- package/dist/lib/transfer-pending/dialog-dismiss/discard-confirm.component.d.ts.map +1 -0
- package/dist/lib/transfer-pending/dialog-dismiss/discard-confirm.component.js +53 -0
- package/dist/lib/transfer-pending/dialog-dismiss/discard-confirm.component.js.map +1 -0
- package/dist/lib/transfer-pending/dialog-dismiss/dismissable-dialog.directive.d.ts +49 -0
- package/dist/lib/transfer-pending/dialog-dismiss/dismissable-dialog.directive.d.ts.map +1 -0
- package/dist/lib/transfer-pending/dialog-dismiss/dismissable-dialog.directive.js +122 -0
- package/dist/lib/transfer-pending/dialog-dismiss/dismissable-dialog.directive.js.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/grid-row-key.d.ts +24 -0
- package/dist/lib/transfer-pending/list-scaffold/grid-row-key.d.ts.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/grid-row-key.js +38 -0
- package/dist/lib/transfer-pending/list-scaffold/grid-row-key.js.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/sql-filter.d.ts +37 -0
- package/dist/lib/transfer-pending/list-scaffold/sql-filter.d.ts.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/sql-filter.js +51 -0
- package/dist/lib/transfer-pending/list-scaffold/sql-filter.js.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/time-window.d.ts +46 -0
- package/dist/lib/transfer-pending/list-scaffold/time-window.d.ts.map +1 -0
- package/dist/lib/transfer-pending/list-scaffold/time-window.js +77 -0
- package/dist/lib/transfer-pending/list-scaffold/time-window.js.map +1 -0
- package/dist/lib/transfer-pending/shell-refresh/page-refresh.service.d.ts +43 -0
- package/dist/lib/transfer-pending/shell-refresh/page-refresh.service.d.ts.map +1 -0
- package/dist/lib/transfer-pending/shell-refresh/page-refresh.service.js +60 -0
- package/dist/lib/transfer-pending/shell-refresh/page-refresh.service.js.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-card.component.d.ts +55 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-card.component.d.ts.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-card.component.js +243 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-card.component.js.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-store.d.ts +47 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-store.d.ts.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-store.js +112 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-store.js.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-strip.component.d.ts +36 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-strip.component.d.ts.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-strip.component.js +179 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tab-strip.component.js.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tabs.types.d.ts +36 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tabs.types.d.ts.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tabs.types.js +9 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tabs.types.js.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tip.directive.d.ts +35 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tip.directive.d.ts.map +1 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tip.directive.js +124 -0
- package/dist/lib/transfer-pending/workspace-tabs/workspace-tip.directive.js.map +1 -0
- package/dist/public-api.d.ts +63 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +175 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,878 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, inject, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
|
|
3
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
|
+
import { EntityDataGridComponent } from '@memberjunction/ng-entity-viewer';
|
|
5
|
+
import { PageRefreshService } from '../../../transfer-pending/shell-refresh/page-refresh.service';
|
|
6
|
+
import { rowKeyToId } from '../../../transfer-pending/list-scaffold/grid-row-key';
|
|
7
|
+
import { CompanyScopeService } from '../../shared/company-scope.service';
|
|
8
|
+
import { AccountingEngineBase } from '@mj-biz-apps/accounting-engine-base';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@memberjunction/ng-ui-components";
|
|
11
|
+
import * as i2 from "../../shared/check-dropdown.component";
|
|
12
|
+
import * as i3 from "../../shared/summary-strip.component";
|
|
13
|
+
import * as i4 from "../../shared/list-toolbar.component";
|
|
14
|
+
import * as i5 from "@angular/forms";
|
|
15
|
+
import * as i6 from "@memberjunction/ng-entity-viewer";
|
|
16
|
+
function GLAccountsPageComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
17
|
+
i0.ɵɵelement(0, "mj-alert", 10);
|
|
18
|
+
} if (rf & 2) {
|
|
19
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
20
|
+
i0.ɵɵproperty("Message", ctx_r0.LoadError);
|
|
21
|
+
} }
|
|
22
|
+
function GLAccountsPageComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
+
i0.ɵɵelement(0, "mj-alert", 11);
|
|
24
|
+
} }
|
|
25
|
+
function GLAccountsPageComponent_Conditional_19_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
i0.ɵɵelement(0, "mj-stat-badge", 17);
|
|
27
|
+
} }
|
|
28
|
+
function GLAccountsPageComponent_Conditional_19_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
29
|
+
i0.ɵɵelement(0, "mj-alert", 10);
|
|
30
|
+
} if (rf & 2) {
|
|
31
|
+
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
32
|
+
i0.ɵɵproperty("Message", ctx_r0.EditorError);
|
|
33
|
+
} }
|
|
34
|
+
function GLAccountsPageComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
36
|
+
i0.ɵɵelementStart(0, "section", 12)(1, "header", 15)(2, "h3", 16);
|
|
37
|
+
i0.ɵɵtext(3);
|
|
38
|
+
i0.ɵɵelementEnd();
|
|
39
|
+
i0.ɵɵconditionalCreate(4, GLAccountsPageComponent_Conditional_19_Conditional_4_Template, 1, 0, "mj-stat-badge", 17);
|
|
40
|
+
i0.ɵɵelementEnd();
|
|
41
|
+
i0.ɵɵconditionalCreate(5, GLAccountsPageComponent_Conditional_19_Conditional_5_Template, 1, 1, "mj-alert", 10);
|
|
42
|
+
i0.ɵɵelementStart(6, "div", 18)(7, "label", 5)(8, "span", 6);
|
|
43
|
+
i0.ɵɵtext(9, "Company");
|
|
44
|
+
i0.ɵɵelementEnd();
|
|
45
|
+
i0.ɵɵelementStart(10, "mj-dropdown", 19);
|
|
46
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_mj_dropdown_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.CompanyID, $event) || (ctx_r0.Draft.CompanyID = $event); return i0.ɵɵresetView($event); });
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
i0.ɵɵelementStart(11, "span", 20);
|
|
49
|
+
i0.ɵɵtext(12);
|
|
50
|
+
i0.ɵɵelementEnd()();
|
|
51
|
+
i0.ɵɵelementStart(13, "label", 5)(14, "span", 6);
|
|
52
|
+
i0.ɵɵtext(15, "Code");
|
|
53
|
+
i0.ɵɵelementEnd();
|
|
54
|
+
i0.ɵɵelementStart(16, "input", 21);
|
|
55
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.Code, $event) || (ctx_r0.Draft.Code = $event); return i0.ɵɵresetView($event); });
|
|
56
|
+
i0.ɵɵelementEnd();
|
|
57
|
+
i0.ɵɵelementStart(17, "span", 20);
|
|
58
|
+
i0.ɵɵtext(18, "Unique within this company\u2019s chart.");
|
|
59
|
+
i0.ɵɵelementEnd()();
|
|
60
|
+
i0.ɵɵelementStart(19, "label", 22)(20, "span", 6);
|
|
61
|
+
i0.ɵɵtext(21, "Name");
|
|
62
|
+
i0.ɵɵelementEnd();
|
|
63
|
+
i0.ɵɵelementStart(22, "input", 23);
|
|
64
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_input_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.Name, $event) || (ctx_r0.Draft.Name = $event); return i0.ɵɵresetView($event); });
|
|
65
|
+
i0.ɵɵelementEnd()();
|
|
66
|
+
i0.ɵɵelementStart(23, "label", 5)(24, "span", 6);
|
|
67
|
+
i0.ɵɵtext(25, "Account type");
|
|
68
|
+
i0.ɵɵelementEnd();
|
|
69
|
+
i0.ɵɵelementStart(26, "mj-dropdown", 24);
|
|
70
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_mj_dropdown_ngModelChange_26_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.AccountType, $event) || (ctx_r0.Draft.AccountType = $event); return i0.ɵɵresetView($event); });
|
|
71
|
+
i0.ɵɵelementEnd()();
|
|
72
|
+
i0.ɵɵelementStart(27, "label", 22)(28, "span", 6);
|
|
73
|
+
i0.ɵɵtext(29, "Parent account (rollup)");
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
i0.ɵɵelementStart(30, "mj-dropdown", 25);
|
|
76
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_mj_dropdown_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.ParentGLAccountID, $event) || (ctx_r0.Draft.ParentGLAccountID = $event); return i0.ɵɵresetView($event); });
|
|
77
|
+
i0.ɵɵelementEnd();
|
|
78
|
+
i0.ɵɵelementStart(31, "span", 20);
|
|
79
|
+
i0.ɵɵtext(32);
|
|
80
|
+
i0.ɵɵelementEnd()();
|
|
81
|
+
i0.ɵɵelementStart(33, "label", 5)(34, "span", 6);
|
|
82
|
+
i0.ɵɵtext(35, "Currency");
|
|
83
|
+
i0.ɵɵelementEnd();
|
|
84
|
+
i0.ɵɵelementStart(36, "mj-dropdown", 26);
|
|
85
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_mj_dropdown_ngModelChange_36_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.CurrencyCode, $event) || (ctx_r0.Draft.CurrencyCode = $event); return i0.ɵɵresetView($event); });
|
|
86
|
+
i0.ɵɵelementEnd()();
|
|
87
|
+
i0.ɵɵelementStart(37, "label", 5)(38, "span", 6);
|
|
88
|
+
i0.ɵɵtext(39, "External system");
|
|
89
|
+
i0.ɵɵelementEnd();
|
|
90
|
+
i0.ɵɵelementStart(40, "input", 27);
|
|
91
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_input_ngModelChange_40_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.ExternalSystem, $event) || (ctx_r0.Draft.ExternalSystem = $event); return i0.ɵɵresetView($event); });
|
|
92
|
+
i0.ɵɵelementEnd();
|
|
93
|
+
i0.ɵɵelementStart(41, "span", 20);
|
|
94
|
+
i0.ɵɵtext(42, "The system this account syncs OUT to. Leave blank for local-only.");
|
|
95
|
+
i0.ɵɵelementEnd()();
|
|
96
|
+
i0.ɵɵelementStart(43, "label", 5)(44, "span", 6);
|
|
97
|
+
i0.ɵɵtext(45, "External account ID");
|
|
98
|
+
i0.ɵɵelementEnd();
|
|
99
|
+
i0.ɵɵelementStart(46, "input", 28);
|
|
100
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_input_ngModelChange_46_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.ExternalAccountID, $event) || (ctx_r0.Draft.ExternalAccountID = $event); return i0.ɵɵresetView($event); });
|
|
101
|
+
i0.ɵɵelementEnd()();
|
|
102
|
+
i0.ɵɵelementStart(47, "label", 22)(48, "span", 6);
|
|
103
|
+
i0.ɵɵtext(49, "Description");
|
|
104
|
+
i0.ɵɵelementEnd();
|
|
105
|
+
i0.ɵɵelementStart(50, "textarea", 29);
|
|
106
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_textarea_ngModelChange_50_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.Description, $event) || (ctx_r0.Draft.Description = $event); return i0.ɵɵresetView($event); });
|
|
107
|
+
i0.ɵɵelementEnd()();
|
|
108
|
+
i0.ɵɵelementStart(51, "label", 30)(52, "input", 31);
|
|
109
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Conditional_19_Template_input_ngModelChange_52_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.Draft.IsActive, $event) || (ctx_r0.Draft.IsActive = $event); return i0.ɵɵresetView($event); });
|
|
110
|
+
i0.ɵɵelementEnd();
|
|
111
|
+
i0.ɵɵelementStart(53, "span");
|
|
112
|
+
i0.ɵɵtext(54, "Active \u2014 available for new journal-entry lines");
|
|
113
|
+
i0.ɵɵelementEnd()()();
|
|
114
|
+
i0.ɵɵelementStart(55, "div", 32)(56, "button", 33);
|
|
115
|
+
i0.ɵɵlistener("click", function GLAccountsPageComponent_Conditional_19_Template_button_click_56_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Save()); });
|
|
116
|
+
i0.ɵɵtext(57);
|
|
117
|
+
i0.ɵɵelementEnd();
|
|
118
|
+
i0.ɵɵelementStart(58, "button", 34);
|
|
119
|
+
i0.ɵɵlistener("click", function GLAccountsPageComponent_Conditional_19_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.CancelEdit()); });
|
|
120
|
+
i0.ɵɵtext(59, "Cancel");
|
|
121
|
+
i0.ɵɵelementEnd()()();
|
|
122
|
+
} if (rf & 2) {
|
|
123
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
124
|
+
i0.ɵɵadvance(3);
|
|
125
|
+
i0.ɵɵtextInterpolate(ctx_r0.Draft.ID ? "Edit account" : "New account");
|
|
126
|
+
i0.ɵɵadvance();
|
|
127
|
+
i0.ɵɵconditional(ctx_r0.EditingSeeded ? 4 : -1);
|
|
128
|
+
i0.ɵɵadvance();
|
|
129
|
+
i0.ɵɵconditional(ctx_r0.EditorError ? 5 : -1);
|
|
130
|
+
i0.ɵɵadvance(5);
|
|
131
|
+
i0.ɵɵproperty("Data", ctx_r0.CompanyOptions)("ValuePrimitive", true)("DefaultItem", ctx_r0.OwningCompanyDefault)("Disabled", !!ctx_r0.Draft.ID);
|
|
132
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.CompanyID);
|
|
133
|
+
i0.ɵɵadvance(2);
|
|
134
|
+
i0.ɵɵtextInterpolate(ctx_r0.Draft.ID ? "An account stays in the chart it was created in." : "This company will own the account.");
|
|
135
|
+
i0.ɵɵadvance(4);
|
|
136
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.Code);
|
|
137
|
+
i0.ɵɵadvance(6);
|
|
138
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.Name);
|
|
139
|
+
i0.ɵɵadvance(4);
|
|
140
|
+
i0.ɵɵproperty("Data", ctx_r0.AccountTypes)("ValuePrimitive", true);
|
|
141
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.AccountType);
|
|
142
|
+
i0.ɵɵadvance(4);
|
|
143
|
+
i0.ɵɵproperty("Data", ctx_r0.ParentOptions)("ValuePrimitive", true)("DefaultItem", ctx_r0.ParentNoneDefault)("Disabled", !ctx_r0.Draft.CompanyID);
|
|
144
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.ParentGLAccountID);
|
|
145
|
+
i0.ɵɵadvance(2);
|
|
146
|
+
i0.ɵɵtextInterpolate1(" The account this one rolls up into \u2014 always another account in ", ctx_r0.Draft.CompanyID ? "this same company\u2019s chart" : "the owning company\u2019s chart", ". Leave as \u201CNone\u201D for a top-level account. ");
|
|
147
|
+
i0.ɵɵadvance(4);
|
|
148
|
+
i0.ɵɵproperty("Data", ctx_r0.CurrencyChoices)("ValuePrimitive", true)("DefaultItem", ctx_r0.CurrencyDefault);
|
|
149
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.CurrencyCode);
|
|
150
|
+
i0.ɵɵadvance(4);
|
|
151
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.ExternalSystem);
|
|
152
|
+
i0.ɵɵadvance(6);
|
|
153
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.ExternalAccountID);
|
|
154
|
+
i0.ɵɵadvance(4);
|
|
155
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.Description);
|
|
156
|
+
i0.ɵɵadvance(2);
|
|
157
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.Draft.IsActive);
|
|
158
|
+
i0.ɵɵadvance(4);
|
|
159
|
+
i0.ɵɵproperty("disabled", ctx_r0.IsSaving);
|
|
160
|
+
i0.ɵɵadvance();
|
|
161
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.IsSaving ? "Saving\u2026" : ctx_r0.Draft.ID ? "Save account" : "Create account", " ");
|
|
162
|
+
i0.ɵɵadvance();
|
|
163
|
+
i0.ɵɵproperty("disabled", ctx_r0.IsSaving);
|
|
164
|
+
} }
|
|
165
|
+
const GL_ENTITY = 'MJ_BizApps_Accounting: GL Accounts';
|
|
166
|
+
/** The four account-type values, for the filter + the editor. Derived, never hand-listed as a type. */
|
|
167
|
+
const ACCOUNT_TYPES = ['Asset', 'Liability', 'Equity', 'Revenue', 'Expense'];
|
|
168
|
+
/**
|
|
169
|
+
* GL accounts — view and manage every account, across every company the user can see.
|
|
170
|
+
*
|
|
171
|
+
* **The shape this page has to make legible (Marcelo 2026-07-16 expected something different):**
|
|
172
|
+
* `GLAccount.CompanyID` is **NOT NULL** with **UNIQUE (CompanyID, Code)** — "each company has its
|
|
173
|
+
* own chart" (the field's own description). There is **no global pool of unowned accounts** that
|
|
174
|
+
* you then "hook to companies": an account is born inside exactly one company's chart, seeded by
|
|
175
|
+
* `spSeedDefaultChartOfAccounts` (which is what `IsSystemSeeded` distinguishes from deployment
|
|
176
|
+
* customizations). So this page is "every account, GROUPED BY COMPANY" — the Company column is
|
|
177
|
+
* first, the company drop-down narrows rather than assigns, and creating an account REQUIRES
|
|
178
|
+
* picking the company that will own it. That per-company reality is surfaced, not hidden. Whether
|
|
179
|
+
* a shared/global pool is ever wanted is Q29 in plans/QUESTIONS.md — and it would be a migration,
|
|
180
|
+
* not a UI change.
|
|
181
|
+
*
|
|
182
|
+
* **ERP direction is OUTBOUND.** `ExternalSystem` + `ExternalAccountID` map MJ's account OUT to the
|
|
183
|
+
* ERP's account: MJ's copy is the record, the ERP is the mirror target. The two columns sit
|
|
184
|
+
* together so "which system is this connected to?" reads at a glance.
|
|
185
|
+
*
|
|
186
|
+
* **Parent = rollup within ONE company's own chart** ("Parent account for hierarchical rollup
|
|
187
|
+
* (NULL = top of chart)"), e.g. 11200 Cash parents 11201 Cash — Operating. The picker therefore
|
|
188
|
+
* offers only the same company's accounts, minus the account itself and its own descendants (a
|
|
189
|
+
* cycle would break rollup), and the list indents children under parents so the structure is
|
|
190
|
+
* visible without opening anything.
|
|
191
|
+
*
|
|
192
|
+
* Data comes from `AccountingEngineBase`'s cache (`Config` is a no-op once loaded) — never one
|
|
193
|
+
* query per row.
|
|
194
|
+
*/
|
|
195
|
+
export class GLAccountsPageComponent extends BaseAngularComponent {
|
|
196
|
+
cdr = inject(ChangeDetectorRef);
|
|
197
|
+
/** The shell header's Refresh reaches this page while it is the mounted one — the page adds none of its own. */
|
|
198
|
+
pageRefresh = inject(PageRefreshService);
|
|
199
|
+
refreshSub = null;
|
|
200
|
+
/** The app-wide company scope (the rail-top chip) — the shared source, not a new one. */
|
|
201
|
+
Scope = inject(CompanyScopeService);
|
|
202
|
+
Rows = [];
|
|
203
|
+
CompanyOptions = [];
|
|
204
|
+
CurrencyOptions = [];
|
|
205
|
+
AccountTypes = ACCOUNT_TYPES;
|
|
206
|
+
IsLoading = false;
|
|
207
|
+
LoadError = null;
|
|
208
|
+
// --- filters (one line; search sits to the right of the drop-downs) ---
|
|
209
|
+
/** MULTI-select company narrowing (Marcelo 2026-08-05): empty = no narrowing ("All companies"). */
|
|
210
|
+
FilterCompanyIDs = [];
|
|
211
|
+
FilterAccountType = '';
|
|
212
|
+
/** '' = any, 'Active' | 'Inactive'. */
|
|
213
|
+
FilterActive = '';
|
|
214
|
+
/** The checkbox-dropdown hands back the whole selection (client-side filter — no refetch needed). */
|
|
215
|
+
OnFilterCompanyIDsChanged(ids) {
|
|
216
|
+
this.FilterCompanyIDs = ids;
|
|
217
|
+
this.rebuildGridParams();
|
|
218
|
+
}
|
|
219
|
+
/** Currency rows shaped for the dropdown ("USD — US Dollar"). */
|
|
220
|
+
get CurrencyChoices() {
|
|
221
|
+
return this.CurrencyOptions.map((c) => ({ Code: c.Code, Label: `${c.Code} — ${c.Name}` }));
|
|
222
|
+
}
|
|
223
|
+
/** The editor dropdowns' empty-state rows (mj-dropdown DefaultItem = the '' sentinel each select had). */
|
|
224
|
+
OwningCompanyDefault = { ID: '', Name: 'Choose the owning company…' };
|
|
225
|
+
ParentNoneDefault = { ID: '', Label: 'None — top of the chart' };
|
|
226
|
+
CurrencyDefault = { Code: '', Label: 'Company’s functional currency' };
|
|
227
|
+
StatusChoices = [
|
|
228
|
+
{ Label: 'Active & inactive', Value: '' },
|
|
229
|
+
{ Label: 'Active only', Value: 'Active' },
|
|
230
|
+
{ Label: 'Inactive only', Value: 'Inactive' },
|
|
231
|
+
];
|
|
232
|
+
SourceChoices = [
|
|
233
|
+
{ Label: 'Seeded & custom', Value: '' },
|
|
234
|
+
{ Label: 'System-seeded', Value: 'Seeded' },
|
|
235
|
+
{ Label: 'Custom', Value: 'Custom' },
|
|
236
|
+
];
|
|
237
|
+
/** '' = any, 'Seeded' = platform-shipped, 'Custom' = deployment customization. */
|
|
238
|
+
FilterSource = '';
|
|
239
|
+
SearchText = '';
|
|
240
|
+
// ─── list-page standard chrome (fused subheader: strip + toolbar) ────────────
|
|
241
|
+
/** The strip's figures — the same counts the old header badges carried. */
|
|
242
|
+
get SummaryFigures() {
|
|
243
|
+
const figures = [
|
|
244
|
+
{ Label: 'Accounts', Value: String(this.Rows.length) },
|
|
245
|
+
{ Label: 'Companies', Value: String(this.CompanyOptions.length) },
|
|
246
|
+
];
|
|
247
|
+
if (this.OrphanCount > 0)
|
|
248
|
+
figures.push({ Label: 'Broken parents', Value: String(this.OrphanCount), Tone: 'warning' });
|
|
249
|
+
return figures;
|
|
250
|
+
}
|
|
251
|
+
/** Account types as preset chips, with client-side counts — the fast path the selects buried. */
|
|
252
|
+
get TypeChips() {
|
|
253
|
+
return [
|
|
254
|
+
{ Key: 'all', Label: 'All' },
|
|
255
|
+
...this.AccountTypes.map((t) => ({ Key: t, Label: t, Count: this.Rows.filter((r) => r.AccountType === t).length })),
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
get ActiveTypeKeys() {
|
|
259
|
+
return this.FilterAccountType ? [this.FilterAccountType] : ['all'];
|
|
260
|
+
}
|
|
261
|
+
/** Single-select semantics (matching the old Type select): re-clicking the active chip clears. */
|
|
262
|
+
OnTypeToggled(key) {
|
|
263
|
+
this.FilterAccountType = key === 'all' || this.FilterAccountType === key ? '' : key;
|
|
264
|
+
this.rebuildGridParams();
|
|
265
|
+
}
|
|
266
|
+
AdvancedOpen = false;
|
|
267
|
+
/** Count pill on the Filters button — a hidden active filter must never silently shape the list. */
|
|
268
|
+
// ── the STANDARD MJ grid (Marcelo 2026-08-05) ─────────────────────────────────
|
|
269
|
+
/** Escape a value for an ExtraFilter literal (single quotes doubled). */
|
|
270
|
+
sqlLit(v) {
|
|
271
|
+
return v.replace(/'/g, "''");
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* The grid's query — the SAME predicate the old client-side filter applied, expressed as the
|
|
275
|
+
* entity view's ExtraFilter so the standard grid owns fetching/sorting/paging/state.
|
|
276
|
+
*/
|
|
277
|
+
GridParams = { EntityName: GL_ENTITY };
|
|
278
|
+
/** The grid itself — needed because its Params setter DEEP-COMPARES and skips the refetch when
|
|
279
|
+
* the rebuilt params are equivalent (same filters/search). After a save, the predicate hasn't
|
|
280
|
+
* changed but the DATA has, so the refresh must be explicit. */
|
|
281
|
+
grid;
|
|
282
|
+
GridColumns = [
|
|
283
|
+
// Company first, always: an account only exists inside a company's chart.
|
|
284
|
+
{ field: 'Company', title: 'Company', width: 180, sortable: true },
|
|
285
|
+
{ field: 'Code', title: 'Code', width: 110, sortable: true },
|
|
286
|
+
{ field: 'Name', title: 'Name', width: 'auto', maxWidth: 380, sortable: true },
|
|
287
|
+
{ field: 'AccountType', title: 'Type', width: 110, sortable: true },
|
|
288
|
+
{ field: 'CurrencyCode', title: 'Currency', width: 100, sortable: true },
|
|
289
|
+
{ field: 'ExternalSystem', title: 'External system', width: 140, sortable: true },
|
|
290
|
+
{ field: 'ExternalAccountID', title: 'External account ID', width: 160, sortable: true },
|
|
291
|
+
{ field: 'IsActive', title: 'Active', type: 'boolean', width: 90, sortable: true },
|
|
292
|
+
{ field: 'IsSystemSeeded', title: 'Seeded', type: 'boolean', width: 90, sortable: true },
|
|
293
|
+
{ field: 'ID', title: 'ID', width: 280, sortable: true },
|
|
294
|
+
];
|
|
295
|
+
/** Rebuild the grid predicate from the toolbar state. New object identity triggers a refetch. */
|
|
296
|
+
rebuildGridParams() {
|
|
297
|
+
const parts = [];
|
|
298
|
+
if (this.FilterCompanyIDs.length)
|
|
299
|
+
parts.push(`CompanyID IN (${this.FilterCompanyIDs.map((id) => `'${this.sqlLit(id)}'`).join(',')})`);
|
|
300
|
+
if (this.FilterAccountType)
|
|
301
|
+
parts.push(`AccountType='${this.sqlLit(this.FilterAccountType)}'`);
|
|
302
|
+
if (this.FilterActive)
|
|
303
|
+
parts.push(`IsActive=${this.FilterActive === 'Active' ? 1 : 0}`);
|
|
304
|
+
if (this.FilterSource)
|
|
305
|
+
parts.push(`IsSystemSeeded=${this.FilterSource === 'Seeded' ? 1 : 0}`);
|
|
306
|
+
const q = this.SearchText.trim();
|
|
307
|
+
if (q) {
|
|
308
|
+
const like = this.sqlLit(q);
|
|
309
|
+
parts.push(`(Name LIKE '%${like}%' OR Code LIKE '%${like}%' OR CAST(ID AS NVARCHAR(50)) LIKE '%${like}%')`);
|
|
310
|
+
}
|
|
311
|
+
const scope = this.Scope.FilterFor('CompanyID');
|
|
312
|
+
if (scope)
|
|
313
|
+
parts.push(scope);
|
|
314
|
+
this.GridParams = {
|
|
315
|
+
EntityName: GL_ENTITY,
|
|
316
|
+
ExtraFilter: parts.length ? parts.join(' AND ') : undefined,
|
|
317
|
+
OrderBy: 'Company ASC, Code ASC',
|
|
318
|
+
};
|
|
319
|
+
this.cdr.markForCheck();
|
|
320
|
+
}
|
|
321
|
+
/** Status/Source dropdowns re-query the grid like every other filter edit. */
|
|
322
|
+
OnStatusOrSourceChanged() {
|
|
323
|
+
this.rebuildGridParams();
|
|
324
|
+
}
|
|
325
|
+
/** Row click = edit (the per-row Edit button retired with the hand-rolled table). The grid's
|
|
326
|
+
* rowKey is a CompositeKey concatenated string ('ID|<uuid>'), not a bare ID — parse it (same
|
|
327
|
+
* lesson the JE detail panel learned; see rowKeyToId). */
|
|
328
|
+
OnGridRowClicked(rowKey) {
|
|
329
|
+
const id = rowKeyToId(rowKey);
|
|
330
|
+
if (!id)
|
|
331
|
+
return;
|
|
332
|
+
const row = this.Rows.find((r) => UUIDsEqual(r.ID, id));
|
|
333
|
+
if (row)
|
|
334
|
+
this.StartEdit(row);
|
|
335
|
+
}
|
|
336
|
+
get AdvancedCount() {
|
|
337
|
+
let n = 0;
|
|
338
|
+
if (this.FilterCompanyIDs.length)
|
|
339
|
+
n++;
|
|
340
|
+
if (this.FilterActive)
|
|
341
|
+
n++;
|
|
342
|
+
if (this.FilterSource)
|
|
343
|
+
n++;
|
|
344
|
+
return n;
|
|
345
|
+
}
|
|
346
|
+
/** Client-side filtering — instant, no debounce needed. */
|
|
347
|
+
OnToolbarSearch(text) {
|
|
348
|
+
this.SearchText = text;
|
|
349
|
+
this.rebuildGridParams();
|
|
350
|
+
}
|
|
351
|
+
// --- editor ---
|
|
352
|
+
/**
|
|
353
|
+
* The account being edited — the ENTITY, not a copy of one.
|
|
354
|
+
*
|
|
355
|
+
* This was an `AccountDraft`: eleven fields, every one a `GLAccount` column, filled by hand in two
|
|
356
|
+
* places and copied back by `applyDraft`. Three statements of the same shape, and the compiler
|
|
357
|
+
* could not see that they were meant to agree. Binding the entity means the form writes the record
|
|
358
|
+
* it will save, and a column added to the table needs no second and third edit here.
|
|
359
|
+
*/
|
|
360
|
+
Draft = null;
|
|
361
|
+
IsSaving = false;
|
|
362
|
+
EditorError = null;
|
|
363
|
+
/** The account being edited was seeded by the platform — worth knowing before you rename it. */
|
|
364
|
+
EditingSeeded = false;
|
|
365
|
+
ngOnInit() {
|
|
366
|
+
this.refreshSub = this.pageRefresh.OnRefresh(() => this.Refresh());
|
|
367
|
+
this.rebuildGridParams(); // the grid queries immediately; the engine rows load alongside
|
|
368
|
+
void this.load();
|
|
369
|
+
}
|
|
370
|
+
ngOnDestroy() {
|
|
371
|
+
// A destroyed page stops answering the header's Refresh — that's what makes it page-aware.
|
|
372
|
+
this.refreshSub?.unsubscribe();
|
|
373
|
+
}
|
|
374
|
+
Refresh() {
|
|
375
|
+
void this.load(true);
|
|
376
|
+
void this.grid?.Refresh(); // header Refresh must refetch the grid too — unchanged params won't
|
|
377
|
+
}
|
|
378
|
+
// ------------------------------------------------------------------ filtering
|
|
379
|
+
get Filtered() {
|
|
380
|
+
const q = this.SearchText.trim().toLowerCase();
|
|
381
|
+
return this.Rows.filter((r) => this.matchesFilters(r, q));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Search covers Name, Code AND ID. Humans search by name and code; the ID stays searchable (and
|
|
385
|
+
* visible) so an ID pasted from a log or a deep link still finds its row.
|
|
386
|
+
*/
|
|
387
|
+
matchesFilters(r, q) {
|
|
388
|
+
if (this.FilterCompanyIDs.length && !this.FilterCompanyIDs.some((id) => UUIDsEqual(r.CompanyID, id)))
|
|
389
|
+
return false;
|
|
390
|
+
if (this.FilterAccountType && r.AccountType !== this.FilterAccountType)
|
|
391
|
+
return false;
|
|
392
|
+
if (this.FilterActive === 'Active' && !r.IsActive)
|
|
393
|
+
return false;
|
|
394
|
+
if (this.FilterActive === 'Inactive' && r.IsActive)
|
|
395
|
+
return false;
|
|
396
|
+
if (this.FilterSource === 'Seeded' && !r.IsSystemSeeded)
|
|
397
|
+
return false;
|
|
398
|
+
if (this.FilterSource === 'Custom' && r.IsSystemSeeded)
|
|
399
|
+
return false;
|
|
400
|
+
if (!q)
|
|
401
|
+
return true;
|
|
402
|
+
return r.Name.toLowerCase().includes(q) || r.Code.toLowerCase().includes(q) || r.ID.toLowerCase().includes(q);
|
|
403
|
+
}
|
|
404
|
+
ClearFilters() {
|
|
405
|
+
this.FilterCompanyIDs = [];
|
|
406
|
+
this.FilterAccountType = '';
|
|
407
|
+
this.FilterActive = '';
|
|
408
|
+
this.FilterSource = '';
|
|
409
|
+
this.SearchText = '';
|
|
410
|
+
this.rebuildGridParams();
|
|
411
|
+
}
|
|
412
|
+
get OrphanCount() {
|
|
413
|
+
return this.Rows.filter((r) => r.IsOrphan || r.InCycle).length;
|
|
414
|
+
}
|
|
415
|
+
/** Indentation is the rollup — one step per level of parentage. */
|
|
416
|
+
IndentFor(r) {
|
|
417
|
+
return `${r.Depth * 18}px`;
|
|
418
|
+
}
|
|
419
|
+
// ------------------------------------------------------------------ editor
|
|
420
|
+
/** Monotonic counter from the category header's "New account" verb — each bump opens the editor. */
|
|
421
|
+
_createSignal = 0;
|
|
422
|
+
set CreateSignal(v) {
|
|
423
|
+
if (v > this._createSignal) {
|
|
424
|
+
this._createSignal = v;
|
|
425
|
+
this.StartCreate();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
async StartCreate() {
|
|
429
|
+
// An account cannot exist outside a company's chart, so the company is a REQUIRED first choice,
|
|
430
|
+
// not an optional afterthought. Pre-pick only when the choice is unambiguous.
|
|
431
|
+
const only = this.CompanyOptions.length === 1 ? this.CompanyOptions[0].ID : '';
|
|
432
|
+
const entity = await this.ProviderToUse.GetEntityObject(GL_ENTITY, this.ProviderToUse.CurrentUser);
|
|
433
|
+
entity.NewRecord();
|
|
434
|
+
// Pre-pick the filtered company only when the filter narrows to EXACTLY one — else unambiguous-only.
|
|
435
|
+
const company = (this.FilterCompanyIDs.length === 1 ? this.FilterCompanyIDs[0] : '') || only;
|
|
436
|
+
if (company)
|
|
437
|
+
entity.CompanyID = company;
|
|
438
|
+
entity.AccountType = 'Asset';
|
|
439
|
+
entity.IsActive = true;
|
|
440
|
+
this.Draft = entity;
|
|
441
|
+
this.EditingSeeded = false;
|
|
442
|
+
this.EditorError = null;
|
|
443
|
+
this.cdr.markForCheck();
|
|
444
|
+
}
|
|
445
|
+
async StartEdit(r) {
|
|
446
|
+
// LOADED, not copied from the grid row. The row is a projection for a table; the editor needs the
|
|
447
|
+
// record, and loading it is also what makes the save a normal update rather than a re-assembly.
|
|
448
|
+
const entity = await this.ProviderToUse.GetEntityObject(GL_ENTITY, this.ProviderToUse.CurrentUser);
|
|
449
|
+
if (!(await entity.Load(r.ID))) {
|
|
450
|
+
this.EditorError = `Could not load account ${r.Code}.`;
|
|
451
|
+
this.cdr.markForCheck();
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
this.Draft = entity;
|
|
455
|
+
this.EditingSeeded = r.IsSystemSeeded;
|
|
456
|
+
this.EditorError = null;
|
|
457
|
+
this.cdr.markForCheck();
|
|
458
|
+
}
|
|
459
|
+
CancelEdit() {
|
|
460
|
+
this.Draft = null;
|
|
461
|
+
this.EditorError = null;
|
|
462
|
+
this.cdr.markForCheck();
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* The parent picker for the draft: **only the draft company's own chart** (that is what a rollup
|
|
466
|
+
* parent IS), minus the account itself and its own descendants — a cycle would break rollup and
|
|
467
|
+
* is exactly the bad data this page has to guard the tree against.
|
|
468
|
+
*/
|
|
469
|
+
get ParentOptions() {
|
|
470
|
+
const d = this.Draft;
|
|
471
|
+
if (!d?.CompanyID)
|
|
472
|
+
return [];
|
|
473
|
+
const excluded = d.IsSaved ? this.selfAndDescendants(d.ID) : new Set();
|
|
474
|
+
return this.Rows.filter((r) => UUIDsEqual(r.CompanyID, d.CompanyID) && !excluded.has(NormalizeUUID(r.ID)))
|
|
475
|
+
.map((r) => ({ ID: r.ID, Label: `${r.Code} — ${r.Name}` }))
|
|
476
|
+
.sort((a, b) => a.Label.localeCompare(b.Label));
|
|
477
|
+
}
|
|
478
|
+
/** The id set that may not be a parent of `id`: itself plus everything beneath it. */
|
|
479
|
+
selfAndDescendants(id) {
|
|
480
|
+
const childrenByParent = this.buildChildIndex();
|
|
481
|
+
const out = new Set([NormalizeUUID(id)]);
|
|
482
|
+
const queue = [NormalizeUUID(id)];
|
|
483
|
+
while (queue.length > 0) {
|
|
484
|
+
const current = queue.shift();
|
|
485
|
+
for (const child of childrenByParent.get(current) ?? []) {
|
|
486
|
+
const key = NormalizeUUID(child.ID);
|
|
487
|
+
// The visited set doubles as the cycle guard: already-seen ids are never re-queued.
|
|
488
|
+
if (out.has(key))
|
|
489
|
+
continue;
|
|
490
|
+
out.add(key);
|
|
491
|
+
queue.push(key);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return out;
|
|
495
|
+
}
|
|
496
|
+
buildChildIndex() {
|
|
497
|
+
const index = new Map();
|
|
498
|
+
for (const r of this.Rows) {
|
|
499
|
+
if (!r.ParentGLAccountID)
|
|
500
|
+
continue;
|
|
501
|
+
const key = NormalizeUUID(r.ParentGLAccountID);
|
|
502
|
+
const bucket = index.get(key);
|
|
503
|
+
if (bucket)
|
|
504
|
+
bucket.push(r);
|
|
505
|
+
else
|
|
506
|
+
index.set(key, [r]);
|
|
507
|
+
}
|
|
508
|
+
return index;
|
|
509
|
+
}
|
|
510
|
+
async Save() {
|
|
511
|
+
const d = this.Draft;
|
|
512
|
+
if (!d)
|
|
513
|
+
return;
|
|
514
|
+
const invalid = this.validateDraft(d);
|
|
515
|
+
if (invalid) {
|
|
516
|
+
this.EditorError = invalid;
|
|
517
|
+
this.cdr.markForCheck();
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
this.IsSaving = true;
|
|
521
|
+
this.EditorError = null;
|
|
522
|
+
this.cdr.markForCheck();
|
|
523
|
+
try {
|
|
524
|
+
// Empty strings are NULL, not empty text: an optional FK or code left blank must be absent
|
|
525
|
+
// rather than a zero-length string the database would happily store and nothing would match.
|
|
526
|
+
this.blankToNull(d);
|
|
527
|
+
// Save() returns a boolean and does NOT throw on a logical failure (a UNIQUE violation, a
|
|
528
|
+
// permission denial) — reading the return value is the only way to know it worked.
|
|
529
|
+
const saved = await d.Save();
|
|
530
|
+
if (!saved) {
|
|
531
|
+
// MJ core already console-logs the full failure (SQL included) — here we only present the
|
|
532
|
+
// human sentence; adding our own console.error would double-log and trip the test keystone.
|
|
533
|
+
this.EditorError = this.friendlySaveError(d.LatestResult?.CompleteMessage, 'The account could not be saved.');
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
this.Draft = null;
|
|
537
|
+
await this.load(true);
|
|
538
|
+
void this.grid?.Refresh(); // params are unchanged post-save (deep-equal → setter skips), so refetch explicitly
|
|
539
|
+
}
|
|
540
|
+
catch (e) {
|
|
541
|
+
this.EditorError = this.friendlySaveError(e instanceof Error ? e.message : String(e), 'The account could not be saved.');
|
|
542
|
+
}
|
|
543
|
+
finally {
|
|
544
|
+
this.IsSaving = false;
|
|
545
|
+
this.cdr.markForCheck();
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Client-side guards, so the common mistakes read as sentences rather than as an opaque SQL
|
|
550
|
+
* constraint error. `UNIQUE (CompanyID, Code)` is the one that bites: a duplicate code inside one
|
|
551
|
+
* company is legal-looking and fails at the DB. The DB stays the authority — `Save()`'s return is
|
|
552
|
+
* still checked — this just gets there first with a message a human can act on.
|
|
553
|
+
*/
|
|
554
|
+
validateDraft(d) {
|
|
555
|
+
if (!d.CompanyID)
|
|
556
|
+
return 'Pick the company that will own this account — every account lives in exactly one company’s chart.';
|
|
557
|
+
if (!(d.Code ?? '').trim())
|
|
558
|
+
return 'Code is required.';
|
|
559
|
+
if (!(d.Name ?? '').trim())
|
|
560
|
+
return 'Name is required.';
|
|
561
|
+
const code = (d.Code ?? '').trim().toLowerCase();
|
|
562
|
+
const clash = this.Rows.find((r) => UUIDsEqual(r.CompanyID, d.CompanyID) && r.Code.trim().toLowerCase() === code && !(d.IsSaved && UUIDsEqual(r.ID, d.ID)));
|
|
563
|
+
if (clash) {
|
|
564
|
+
const company = this.CompanyOptions.find((c) => UUIDsEqual(c.ID, d.CompanyID))?.Name ?? 'this company';
|
|
565
|
+
return `${company} already has an account with code ${clash.Code} (“${clash.Name}”). Each company’s chart requires a unique code.`;
|
|
566
|
+
}
|
|
567
|
+
if (d.ParentGLAccountID) {
|
|
568
|
+
const parent = this.Rows.find((r) => UUIDsEqual(r.ID, d.ParentGLAccountID));
|
|
569
|
+
if (!parent)
|
|
570
|
+
return 'The selected parent account no longer exists — pick another.';
|
|
571
|
+
if (!UUIDsEqual(parent.CompanyID, d.CompanyID)) {
|
|
572
|
+
return 'A parent account must belong to the same company — rollup happens inside one company’s chart.';
|
|
573
|
+
}
|
|
574
|
+
if (d.IsSaved && this.selfAndDescendants(d.ID).has(NormalizeUUID(d.ParentGLAccountID))) {
|
|
575
|
+
return 'That account sits beneath this one — making it the parent would create a loop in the rollup.';
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Trim the text fields and turn the blanks into NULL, in place on the entity.
|
|
582
|
+
*
|
|
583
|
+
* All that survives of `applyDraft`, which copied eleven fields from a mirror. The copying is gone
|
|
584
|
+
* — the form writes the entity — but this rule is not cosmetic: an empty string in an optional FK
|
|
585
|
+
* or code is a value the database stores and nothing ever matches, which reads as "set to nothing"
|
|
586
|
+
* and behaves as "set to something nobody can find".
|
|
587
|
+
*
|
|
588
|
+
* `IsSystemSeeded` is deliberately never written by this page. It records that
|
|
589
|
+
* `spSeedDefaultChartOfAccounts` created the row — provenance, not a user preference. Letting the
|
|
590
|
+
* UI set it would let a deployment customization claim to be platform-shipped, which is precisely
|
|
591
|
+
* the distinction the flag exists to preserve. Binding the entity makes that a rule about what the
|
|
592
|
+
* TEMPLATE offers rather than one enforced by a copier nobody can see.
|
|
593
|
+
*/
|
|
594
|
+
blankToNull(d) {
|
|
595
|
+
d.Code = (d.Code ?? '').trim();
|
|
596
|
+
d.Name = (d.Name ?? '').trim();
|
|
597
|
+
d.ParentGLAccountID = d.ParentGLAccountID || null;
|
|
598
|
+
d.CurrencyCode = d.CurrencyCode || null;
|
|
599
|
+
d.ExternalSystem = (d.ExternalSystem ?? '').trim() || null;
|
|
600
|
+
d.ExternalAccountID = (d.ExternalAccountID ?? '').trim() || null;
|
|
601
|
+
d.Description = (d.Description ?? '').trim() || null;
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* **Retire, don't delete — deliberate.** There is no Delete on this page. An account referenced
|
|
605
|
+
* by a journal-entry line or a GLAccountLink cannot be deleted (FK), so a delete button would be
|
|
606
|
+
* a button that fails with an opaque constraint error on exactly the accounts people most want to
|
|
607
|
+
* clean up. The schema names the intended path itself: IsActive is "whether the account is
|
|
608
|
+
* available for new JE lines. **Inactive accounts retain historical data.**" So retiring an
|
|
609
|
+
* account = clearing IsActive, which is safe for every account, keeps the history readable, and
|
|
610
|
+
* never produces an error we'd have to translate.
|
|
611
|
+
*/
|
|
612
|
+
async ToggleActive(r) {
|
|
613
|
+
this.IsSaving = true;
|
|
614
|
+
this.cdr.markForCheck();
|
|
615
|
+
try {
|
|
616
|
+
const entity = await this.ProviderToUse.GetEntityObject(GL_ENTITY, this.ProviderToUse.CurrentUser);
|
|
617
|
+
const loaded = await entity.Load(r.ID);
|
|
618
|
+
if (!loaded)
|
|
619
|
+
throw new Error(`Could not load account ${r.Code}.`);
|
|
620
|
+
entity.IsActive = !r.IsActive;
|
|
621
|
+
const saved = await entity.Save();
|
|
622
|
+
if (!saved) {
|
|
623
|
+
this.LoadError = this.friendlySaveError(entity.LatestResult?.CompleteMessage, `Could not update ${r.Code}.`);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
await this.load(true);
|
|
627
|
+
void this.grid?.Refresh(); // params are unchanged post-save (deep-equal → setter skips), so refetch explicitly
|
|
628
|
+
}
|
|
629
|
+
catch (e) {
|
|
630
|
+
this.LoadError = e instanceof Error ? e.message : String(e);
|
|
631
|
+
}
|
|
632
|
+
finally {
|
|
633
|
+
this.IsSaving = false;
|
|
634
|
+
this.cdr.markForCheck();
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
// ------------------------------------------------------------------ loading
|
|
638
|
+
async load(forceRefresh = false) {
|
|
639
|
+
this.IsLoading = true;
|
|
640
|
+
this.LoadError = null;
|
|
641
|
+
this.cdr.markForCheck();
|
|
642
|
+
try {
|
|
643
|
+
const user = this.ProviderToUse.CurrentUser;
|
|
644
|
+
await AccountingEngineBase.Instance.Config(forceRefresh, user, this.ProviderToUse);
|
|
645
|
+
await this.Scope.Load(user, this.ProviderToUse);
|
|
646
|
+
const engine = AccountingEngineBase.Instance;
|
|
647
|
+
this.CurrencyOptions = engine.Currencies.map((c) => ({ Code: c.Code, Name: c.Name })).sort((a, b) => a.Code.localeCompare(b.Code));
|
|
648
|
+
const scoped = this.scopedAccounts(engine.GLAccounts);
|
|
649
|
+
// Companies come from the SCOPE service (ACP-backed, reactive) — NOT derived from cached GL
|
|
650
|
+
// account rows (Marcelo 2026-07-30). The old derivation had two failure modes: a freshly
|
|
651
|
+
// created company (whose W1 chart was seeded SERVER-side, so no client entity events) never
|
|
652
|
+
// appeared, and companies deleted out-of-band lingered as ghosts — picking one produced a raw
|
|
653
|
+
// FK_GLAccount_Company error at save. The scope roster tracks ACP saves live, and a company
|
|
654
|
+
// with no accounts yet is exactly the one you create the first account FOR.
|
|
655
|
+
this.CompanyOptions = this.Scope.Companies.map((c) => ({ ID: c.ID, Name: `${c.Name} (${c.CompanyCode})` }));
|
|
656
|
+
this.Rows = this.buildRollup(scoped);
|
|
657
|
+
}
|
|
658
|
+
catch (e) {
|
|
659
|
+
this.LoadError = e instanceof Error ? e.message : String(e);
|
|
660
|
+
this.Rows = [];
|
|
661
|
+
}
|
|
662
|
+
finally {
|
|
663
|
+
this.IsLoading = false;
|
|
664
|
+
this.cdr.markForCheck();
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* The company scope narrows the chart; empty scope = every company (the service's rule, applied
|
|
669
|
+
* through the service so it lives in one place). Permission-based narrowing lands here later —
|
|
670
|
+
* "eventually we will limit with what a person has permissions and access to see."
|
|
671
|
+
*/
|
|
672
|
+
scopedAccounts(all) {
|
|
673
|
+
if (this.Scope.IsAllCompanies)
|
|
674
|
+
return all;
|
|
675
|
+
const selected = new Set(this.Scope.SelectedIDs.map((id) => NormalizeUUID(id)));
|
|
676
|
+
return all.filter((a) => selected.has(NormalizeUUID(a.CompanyID)));
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Present a save failure as a human sentence, never a raw SQL dump (Marcelo 2026-07-30 — the
|
|
680
|
+
* FK-ghost incident leaked a full spCreate batch into the editor). MJ's CompleteMessage appends
|
|
681
|
+
* the executed SQL after "Query:"; everything from there down is log material, not UI copy. The
|
|
682
|
+
* one constraint a user can actually hit from this editor gets a specific, actionable message.
|
|
683
|
+
*/
|
|
684
|
+
friendlySaveError(raw, fallback) {
|
|
685
|
+
if (!raw)
|
|
686
|
+
return fallback;
|
|
687
|
+
const beforeQuery = raw.split(/\bQuery:/)[0].trim();
|
|
688
|
+
if (/FK_GLAccount_Company/i.test(beforeQuery)) {
|
|
689
|
+
return 'The selected owning company no longer exists — it may have been removed since this page loaded. Refresh and choose again.';
|
|
690
|
+
}
|
|
691
|
+
const firstLine = beforeQuery.split('\n').map((l) => l.trim()).find((l) => l.length > 0);
|
|
692
|
+
return firstLine ?? fallback;
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Order the chart company-by-company, each company's accounts walked as a rollup tree so children
|
|
696
|
+
* sit under their parents with a `Depth` the template turns into indentation.
|
|
697
|
+
*
|
|
698
|
+
* Two data hazards are handled rather than ignored: a parent that isn't in the set (**orphan**)
|
|
699
|
+
* and a parent chain that loops (**cycle**). Both are promoted to roots and flagged — a cycle
|
|
700
|
+
* that hung the walk would blank the page, and a dropped orphan would be a chart quietly missing
|
|
701
|
+
* accounts.
|
|
702
|
+
*/
|
|
703
|
+
buildRollup(accounts) {
|
|
704
|
+
const byID = new Map();
|
|
705
|
+
for (const a of accounts)
|
|
706
|
+
byID.set(NormalizeUUID(a.ID), a);
|
|
707
|
+
const cyclic = this.findCyclicIDs(accounts, byID);
|
|
708
|
+
const children = new Map();
|
|
709
|
+
const roots = [];
|
|
710
|
+
for (const a of accounts) {
|
|
711
|
+
const parentKey = a.ParentGLAccountID ? NormalizeUUID(a.ParentGLAccountID) : null;
|
|
712
|
+
const attachable = parentKey !== null && byID.has(parentKey) && !cyclic.has(NormalizeUUID(a.ID));
|
|
713
|
+
if (!attachable) {
|
|
714
|
+
roots.push(a);
|
|
715
|
+
continue;
|
|
716
|
+
}
|
|
717
|
+
const bucket = children.get(parentKey);
|
|
718
|
+
if (bucket)
|
|
719
|
+
bucket.push(a);
|
|
720
|
+
else
|
|
721
|
+
children.set(parentKey, [a]);
|
|
722
|
+
}
|
|
723
|
+
const byCode = (x, y) => x.Code.localeCompare(y.Code);
|
|
724
|
+
const rootsByCompany = new Map();
|
|
725
|
+
for (const r of roots) {
|
|
726
|
+
const key = NormalizeUUID(r.CompanyID);
|
|
727
|
+
const bucket = rootsByCompany.get(key);
|
|
728
|
+
if (bucket)
|
|
729
|
+
bucket.push(r);
|
|
730
|
+
else
|
|
731
|
+
rootsByCompany.set(key, [r]);
|
|
732
|
+
}
|
|
733
|
+
const companies = [...rootsByCompany.entries()].sort((a, b) => {
|
|
734
|
+
const an = byID.get(NormalizeUUID(a[1][0].ID))?.Company ?? '';
|
|
735
|
+
const bn = byID.get(NormalizeUUID(b[1][0].ID))?.Company ?? '';
|
|
736
|
+
return an.localeCompare(bn);
|
|
737
|
+
});
|
|
738
|
+
const out = [];
|
|
739
|
+
const emitted = new Set();
|
|
740
|
+
for (const [, companyRoots] of companies) {
|
|
741
|
+
for (const root of [...companyRoots].sort(byCode)) {
|
|
742
|
+
this.walk(root, 0, children, byID, cyclic, emitted, out, byCode);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
return out;
|
|
746
|
+
}
|
|
747
|
+
/** Depth-first emit. `emitted` is the belt-and-braces guard: no id is ever walked twice. */
|
|
748
|
+
walk(node, depth, children, byID, cyclic, emitted, out, byCode) {
|
|
749
|
+
const key = NormalizeUUID(node.ID);
|
|
750
|
+
if (emitted.has(key))
|
|
751
|
+
return;
|
|
752
|
+
emitted.add(key);
|
|
753
|
+
out.push(this.toRow(node, depth, byID, cyclic));
|
|
754
|
+
for (const child of [...(children.get(key) ?? [])].sort(byCode)) {
|
|
755
|
+
this.walk(child, depth + 1, children, byID, cyclic, emitted, out, byCode);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Every id whose parent chain loops. Walked per-node with a local visited set and a hard step cap,
|
|
760
|
+
* so bad data costs a bounded amount of work instead of hanging the page.
|
|
761
|
+
*/
|
|
762
|
+
findCyclicIDs(accounts, byID) {
|
|
763
|
+
const cyclic = new Set();
|
|
764
|
+
for (const start of accounts) {
|
|
765
|
+
const seen = new Set([NormalizeUUID(start.ID)]);
|
|
766
|
+
let current = start;
|
|
767
|
+
let steps = 0;
|
|
768
|
+
while (current.ParentGLAccountID && steps++ <= accounts.length) {
|
|
769
|
+
const parent = byID.get(NormalizeUUID(current.ParentGLAccountID));
|
|
770
|
+
if (!parent)
|
|
771
|
+
break;
|
|
772
|
+
const parentKey = NormalizeUUID(parent.ID);
|
|
773
|
+
if (seen.has(parentKey)) {
|
|
774
|
+
cyclic.add(NormalizeUUID(start.ID));
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
seen.add(parentKey);
|
|
778
|
+
current = parent;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
return cyclic;
|
|
782
|
+
}
|
|
783
|
+
toRow(a, depth, byID, cyclic) {
|
|
784
|
+
const parent = a.ParentGLAccountID ? byID.get(NormalizeUUID(a.ParentGLAccountID)) : undefined;
|
|
785
|
+
return {
|
|
786
|
+
ID: a.ID,
|
|
787
|
+
CompanyID: a.CompanyID,
|
|
788
|
+
Company: a.Company,
|
|
789
|
+
Code: a.Code,
|
|
790
|
+
Name: a.Name,
|
|
791
|
+
AccountType: a.AccountType,
|
|
792
|
+
ParentGLAccountID: a.ParentGLAccountID,
|
|
793
|
+
ParentLabel: parent ? `${parent.Code} — ${parent.Name}` : a.ParentGLAccount,
|
|
794
|
+
CurrencyCode: a.CurrencyCode,
|
|
795
|
+
ExternalSystem: a.ExternalSystem,
|
|
796
|
+
ExternalAccountID: a.ExternalAccountID,
|
|
797
|
+
IsActive: a.IsActive,
|
|
798
|
+
IsSystemSeeded: a.IsSystemSeeded,
|
|
799
|
+
Description: a.Description,
|
|
800
|
+
Depth: depth,
|
|
801
|
+
IsOrphan: !!a.ParentGLAccountID && !parent,
|
|
802
|
+
InCycle: cyclic.has(NormalizeUUID(a.ID)),
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵGLAccountsPageComponent_BaseFactory; return function GLAccountsPageComponent_Factory(__ngFactoryType__) { return (ɵGLAccountsPageComponent_BaseFactory || (ɵGLAccountsPageComponent_BaseFactory = i0.ɵɵgetInheritedFactory(GLAccountsPageComponent)))(__ngFactoryType__ || GLAccountsPageComponent); }; })();
|
|
806
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GLAccountsPageComponent, selectors: [["mj-gl-accounts-page"]], viewQuery: function GLAccountsPageComponent_Query(rf, ctx) { if (rf & 1) {
|
|
807
|
+
i0.ɵɵviewQuery(EntityDataGridComponent, 5);
|
|
808
|
+
} if (rf & 2) {
|
|
809
|
+
let _t;
|
|
810
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.grid = _t.first);
|
|
811
|
+
} }, inputs: { CreateSignal: "CreateSignal" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 22, vars: 29, consts: [[3, "Padding"], [1, "gla-body"], [1, "gla-subheader"], [3, "Bare", "Figures"], ["SearchPlaceholder", "Name, code or ID\u2026", "SearchLabel", "Search accounts", 3, "AdvancedOpenChange", "SearchChanged", "PresetToggled", "Bare", "Search", "Presets", "ActiveKeys", "HasAdvanced", "AdvancedCount", "AdvancedOpen"], [1, "gla-field"], [1, "gla-field__label"], ["AllLabel", "All companies", "AriaLabel", "Company", 3, "SelectedIDsChange", "Options", "SelectedIDs"], ["TextField", "Label", "ValueField", "Value", "aria-label", "Status", 3, "ngModelChange", "Data", "ValuePrimitive", "ngModel"], ["TextField", "Label", "ValueField", "Value", "aria-label", "Source", 3, "ngModelChange", "Data", "ValuePrimitive", "ngModel"], ["Variant", "error", 3, "Message"], ["Variant", "warning", "Message", "Some accounts point at a parent that isn't in this chart, or their parent chain loops back on itself. They're listed at the top of their company's chart and marked, rather than dropped \u2014 a rollup parent must be another account in the SAME company's chart."], ["aria-label", "Edit account", 1, "gla-editor"], [1, "gla-wrap"], ["PaginationMode", "client", "KeyField", "ID", "StateKey", "mj.bizappsacct.grid.allAccounts.v1", "Height", "auto", 3, "AfterRowClick", "Params", "Columns", "PageSize", "ShowPager", "AllowSorting", "ShowToolbar", "SelectionMode", "AutoPersistState"], [1, "gla-editor__head"], [1, "gla-editor__title"], ["Label", "system-seeded", "Icon", "fa-solid fa-cube", "Variant", "default", "title", "Created by spSeedDefaultChartOfAccounts \u2014 part of the platform-shipped chart, not a deployment customization."], [1, "gla-editor__grid"], ["TextField", "Name", "ValueField", "ID", "aria-label", "Owning company", 3, "ngModelChange", "Data", "ValuePrimitive", "DefaultItem", "Disabled", "ngModel"], [1, "gla-help"], ["type", "text", "maxlength", "40", "placeholder", "e.g. 11201", "aria-label", "Code", 1, "mj-input", 3, "ngModelChange", "ngModel"], [1, "gla-field", "gla-field--wide"], ["type", "text", "maxlength", "200", "placeholder", "e.g. Cash \u2014 Operating", "aria-label", "Name", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["aria-label", "Account type", 3, "ngModelChange", "Data", "ValuePrimitive", "ngModel"], ["TextField", "Label", "ValueField", "ID", "aria-label", "Parent account", 3, "ngModelChange", "Data", "ValuePrimitive", "DefaultItem", "Disabled", "ngModel"], ["TextField", "Label", "ValueField", "Code", "aria-label", "Currency", 3, "ngModelChange", "Data", "ValuePrimitive", "DefaultItem", "ngModel"], ["type", "text", "maxlength", "50", "placeholder", "BusinessCentral, QuickBooks, NetSuite\u2026", "aria-label", "External system", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["type", "text", "maxlength", "100", "placeholder", "That system\u2019s identifier", "aria-label", "External account ID", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["rows", "2", "aria-label", "Description", 1, "mj-textarea", 3, "ngModelChange", "ngModel"], [1, "gla-check"], ["type", "checkbox", "aria-label", "Active", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "gla-editor__actions"], ["type", "button", "mjButton", "", "Variant", "primary", "Size", "sm", 3, "click", "disabled"], ["type", "button", "mjButton", "", "Variant", "flat", "Size", "sm", 3, "click", "disabled"]], template: function GLAccountsPageComponent_Template(rf, ctx) { if (rf & 1) {
|
|
812
|
+
i0.ɵɵelementStart(0, "mj-page-body-interior", 0)(1, "div", 1)(2, "div", 2);
|
|
813
|
+
i0.ɵɵelement(3, "mja-summary-strip", 3);
|
|
814
|
+
i0.ɵɵelementStart(4, "mja-list-toolbar", 4);
|
|
815
|
+
i0.ɵɵtwoWayListener("AdvancedOpenChange", function GLAccountsPageComponent_Template_mja_list_toolbar_AdvancedOpenChange_4_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.AdvancedOpen, $event) || (ctx.AdvancedOpen = $event); return $event; });
|
|
816
|
+
i0.ɵɵlistener("SearchChanged", function GLAccountsPageComponent_Template_mja_list_toolbar_SearchChanged_4_listener($event) { return ctx.OnToolbarSearch($event); })("PresetToggled", function GLAccountsPageComponent_Template_mja_list_toolbar_PresetToggled_4_listener($event) { return ctx.OnTypeToggled($event); });
|
|
817
|
+
i0.ɵɵelementStart(5, "label", 5)(6, "span", 6);
|
|
818
|
+
i0.ɵɵtext(7, "Company");
|
|
819
|
+
i0.ɵɵelementEnd();
|
|
820
|
+
i0.ɵɵelementStart(8, "mja-check-dropdown", 7);
|
|
821
|
+
i0.ɵɵlistener("SelectedIDsChange", function GLAccountsPageComponent_Template_mja_check_dropdown_SelectedIDsChange_8_listener($event) { return ctx.OnFilterCompanyIDsChanged($event); });
|
|
822
|
+
i0.ɵɵelementEnd()();
|
|
823
|
+
i0.ɵɵelementStart(9, "label", 5)(10, "span", 6);
|
|
824
|
+
i0.ɵɵtext(11, "Status");
|
|
825
|
+
i0.ɵɵelementEnd();
|
|
826
|
+
i0.ɵɵelementStart(12, "mj-dropdown", 8);
|
|
827
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Template_mj_dropdown_ngModelChange_12_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.FilterActive, $event) || (ctx.FilterActive = $event); return $event; });
|
|
828
|
+
i0.ɵɵlistener("ngModelChange", function GLAccountsPageComponent_Template_mj_dropdown_ngModelChange_12_listener() { return ctx.OnStatusOrSourceChanged(); });
|
|
829
|
+
i0.ɵɵelementEnd()();
|
|
830
|
+
i0.ɵɵelementStart(13, "label", 5)(14, "span", 6);
|
|
831
|
+
i0.ɵɵtext(15, "Source");
|
|
832
|
+
i0.ɵɵelementEnd();
|
|
833
|
+
i0.ɵɵelementStart(16, "mj-dropdown", 9);
|
|
834
|
+
i0.ɵɵtwoWayListener("ngModelChange", function GLAccountsPageComponent_Template_mj_dropdown_ngModelChange_16_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.FilterSource, $event) || (ctx.FilterSource = $event); return $event; });
|
|
835
|
+
i0.ɵɵlistener("ngModelChange", function GLAccountsPageComponent_Template_mj_dropdown_ngModelChange_16_listener() { return ctx.OnStatusOrSourceChanged(); });
|
|
836
|
+
i0.ɵɵelementEnd()()()();
|
|
837
|
+
i0.ɵɵconditionalCreate(17, GLAccountsPageComponent_Conditional_17_Template, 1, 1, "mj-alert", 10);
|
|
838
|
+
i0.ɵɵconditionalCreate(18, GLAccountsPageComponent_Conditional_18_Template, 1, 0, "mj-alert", 11);
|
|
839
|
+
i0.ɵɵconditionalCreate(19, GLAccountsPageComponent_Conditional_19_Template, 60, 31, "section", 12);
|
|
840
|
+
i0.ɵɵelementStart(20, "div", 13)(21, "mj-entity-data-grid", 14);
|
|
841
|
+
i0.ɵɵlistener("AfterRowClick", function GLAccountsPageComponent_Template_mj_entity_data_grid_AfterRowClick_21_listener($event) { return ctx.OnGridRowClicked($event.rowKey); });
|
|
842
|
+
i0.ɵɵelementEnd()()()();
|
|
843
|
+
} if (rf & 2) {
|
|
844
|
+
i0.ɵɵproperty("Padding", false);
|
|
845
|
+
i0.ɵɵadvance(3);
|
|
846
|
+
i0.ɵɵproperty("Bare", true)("Figures", ctx.SummaryFigures);
|
|
847
|
+
i0.ɵɵadvance();
|
|
848
|
+
i0.ɵɵproperty("Bare", true)("Search", ctx.SearchText)("Presets", ctx.TypeChips)("ActiveKeys", ctx.ActiveTypeKeys)("HasAdvanced", true)("AdvancedCount", ctx.AdvancedCount);
|
|
849
|
+
i0.ɵɵtwoWayProperty("AdvancedOpen", ctx.AdvancedOpen);
|
|
850
|
+
i0.ɵɵadvance(4);
|
|
851
|
+
i0.ɵɵproperty("Options", ctx.CompanyOptions)("SelectedIDs", ctx.FilterCompanyIDs);
|
|
852
|
+
i0.ɵɵadvance(4);
|
|
853
|
+
i0.ɵɵproperty("Data", ctx.StatusChoices)("ValuePrimitive", true);
|
|
854
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.FilterActive);
|
|
855
|
+
i0.ɵɵadvance(4);
|
|
856
|
+
i0.ɵɵproperty("Data", ctx.SourceChoices)("ValuePrimitive", true);
|
|
857
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.FilterSource);
|
|
858
|
+
i0.ɵɵadvance();
|
|
859
|
+
i0.ɵɵconditional(ctx.LoadError ? 17 : -1);
|
|
860
|
+
i0.ɵɵadvance();
|
|
861
|
+
i0.ɵɵconditional(ctx.OrphanCount > 0 ? 18 : -1);
|
|
862
|
+
i0.ɵɵadvance();
|
|
863
|
+
i0.ɵɵconditional(ctx.Draft ? 19 : -1);
|
|
864
|
+
i0.ɵɵadvance(2);
|
|
865
|
+
i0.ɵɵproperty("Params", ctx.GridParams)("Columns", ctx.GridColumns)("PageSize", 100)("ShowPager", true)("AllowSorting", true)("ShowToolbar", false)("SelectionMode", "single")("AutoPersistState", true);
|
|
866
|
+
} }, dependencies: [i1.MJDropdownComponent, i2.MJACheckDropdownComponent, i3.MJASummaryStripComponent, i4.MJAListToolbarComponent, i5.DefaultValueAccessor, i5.CheckboxControlValueAccessor, i5.NgControlStatus, i5.MaxLengthValidator, i5.NgModel, i6.EntityDataGridComponent, i1.MJButtonDirective, i1.MJPageBodyInteriorComponent, i1.MJStatBadgeComponent, i1.MJAlertComponent], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.mjsh-tablewrap[_ngcontent-%COMP%] {\n \n\n\n\n height: min(68vh, 900px);\n min-height: 320px;\n \n\n overflow-x: auto;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n}\n\n.mjsh-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.mjsh-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--mj-bg-surface);\n \n\n\n\n\n box-shadow: inset 0 -1px 0 var(--mj-border-default);\n}", "\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n gap: 12px;\n}\n\n\n\n.gla-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.gla-field__label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n.gla-field--search[_ngcontent-%COMP%] {\n min-width: 220px;\n}\n.gla-field--wide[_ngcontent-%COMP%] {\n grid-column: span 2;\n}\n.gla-help[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n\n.gla-editor[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.gla-editor__head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.gla-editor__title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.gla-editor__grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 12px;\n}\n.gla-editor__actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.gla-check[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.gla-subheader[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n margin-bottom: 12px;\n}\n.gla-subheader[_ngcontent-%COMP%] mja-list-toolbar[_ngcontent-%COMP%] {\n display: block;\n border-top: 1px solid var(--mj-border-default);\n}\n.gla-wrap[_ngcontent-%COMP%] {\n \n\n\n\n\n flex: 1 1 auto;\n min-height: 320px;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n overflow: hidden;\n}\n\n\n\n.gla-body[_ngcontent-%COMP%] {\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: var(--mj-space-4);\n}\n.gla-body[_ngcontent-%COMP%] .gla-subheader[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}"], changeDetection: 0 });
|
|
867
|
+
}
|
|
868
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GLAccountsPageComponent, [{
|
|
869
|
+
type: Component,
|
|
870
|
+
args: [{ standalone: false, selector: 'mj-gl-accounts-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- The scrollable body ([Padding]=false: the page owns the 16px gutter so every bubble aligns,\n per the list-page standard). NOTE body-interior is display:block; .gla-body restores a flex\n column with definite height, so children may size with flex again. -->\n<mj-page-body-interior [Padding]=\"false\">\n <div class=\"gla-body\">\n <!-- The fused subheader (list-page standard, Marcelo 2026-08-04): no title card \u2014 the rail names\n the page. Stats row + search/type-chips/Filters row in ONE band; Company/Status/Source narrow\n from the Filters disclosure; the page-local \"New account\" verb rides the toolbar's actions\n slot (an inline create with no workspace to route to). -->\n <div class=\"gla-subheader\">\n <mja-summary-strip [Bare]=\"true\" [Figures]=\"SummaryFigures\" />\n <mja-list-toolbar\n [Bare]=\"true\"\n [Search]=\"SearchText\"\n SearchPlaceholder=\"Name, code or ID\u2026\"\n SearchLabel=\"Search accounts\"\n [Presets]=\"TypeChips\"\n [ActiveKeys]=\"ActiveTypeKeys\"\n [HasAdvanced]=\"true\"\n [AdvancedCount]=\"AdvancedCount\"\n [(AdvancedOpen)]=\"AdvancedOpen\"\n (SearchChanged)=\"OnToolbarSearch($event)\"\n (PresetToggled)=\"OnTypeToggled($event)\">\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Company</span>\n <!-- CHECKBOX multi-select (Marcelo 2026-08-05): narrow to any set of companies; empty = all. -->\n <mja-check-dropdown\n [Options]=\"CompanyOptions\"\n [SelectedIDs]=\"FilterCompanyIDs\"\n AllLabel=\"All companies\"\n AriaLabel=\"Company\"\n (SelectedIDsChange)=\"OnFilterCompanyIDsChanged($event)\" />\n </label>\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Status</span>\n <mj-dropdown [Data]=\"StatusChoices\" TextField=\"Label\" ValueField=\"Value\" [ValuePrimitive]=\"true\"\n [(ngModel)]=\"FilterActive\" (ngModelChange)=\"OnStatusOrSourceChanged()\" aria-label=\"Status\" />\n </label>\n <label class=\"gla-field\">\n <!-- IsSystemSeeded exists for exactly this distinction: platform-shipped accounts vs.\n deployment customizations. -->\n <span class=\"gla-field__label\">Source</span>\n <mj-dropdown [Data]=\"SourceChoices\" TextField=\"Label\" ValueField=\"Value\" [ValuePrimitive]=\"true\"\n [(ngModel)]=\"FilterSource\" (ngModelChange)=\"OnStatusOrSourceChanged()\" aria-label=\"Source\" />\n </label>\n </mja-list-toolbar>\n </div>\n\n @if (LoadError) {\n <mj-alert Variant=\"error\" [Message]=\"LoadError\"></mj-alert>\n }\n\n @if (OrphanCount > 0) {\n <mj-alert\n Variant=\"warning\"\n Message=\"Some accounts point at a parent that isn't in this chart, or their parent chain loops back on itself. They're listed at the top of their company's chart and marked, rather than dropped \u2014 a rollup parent must be another account in the SAME company's chart.\">\n </mj-alert>\n }\n\n @if (Draft) {\n <section class=\"gla-editor\" aria-label=\"Edit account\">\n <header class=\"gla-editor__head\">\n <h3 class=\"gla-editor__title\">{{ Draft.ID ? 'Edit account' : 'New account' }}</h3>\n @if (EditingSeeded) {\n <mj-stat-badge Label=\"system-seeded\" Icon=\"fa-solid fa-cube\" Variant=\"default\"\n title=\"Created by spSeedDefaultChartOfAccounts \u2014 part of the platform-shipped chart, not a deployment customization.\"></mj-stat-badge>\n }\n </header>\n\n @if (EditorError) {\n <mj-alert Variant=\"error\" [Message]=\"EditorError\"></mj-alert>\n }\n\n <div class=\"gla-editor__grid\">\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Company</span>\n <!-- Every account is born inside exactly one company's chart (CompanyID is NOT NULL,\n UNIQUE(CompanyID, Code)) \u2014 there is no pool of unowned accounts to hook up later.\n On edit the company is fixed: moving an account between charts would silently break\n its rollup parent and could collide with the target chart's codes. -->\n <mj-dropdown [Data]=\"CompanyOptions\" TextField=\"Name\" ValueField=\"ID\" [ValuePrimitive]=\"true\"\n [DefaultItem]=\"OwningCompanyDefault\" [Disabled]=\"!!Draft.ID\"\n [(ngModel)]=\"Draft.CompanyID\" aria-label=\"Owning company\" />\n <span class=\"gla-help\">{{ Draft.ID ? 'An account stays in the chart it was created in.' : 'This company will own the account.' }}</span>\n </label>\n\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Code</span>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"Draft.Code\" maxlength=\"40\" placeholder=\"e.g. 11201\" aria-label=\"Code\" />\n <span class=\"gla-help\">Unique within this company\u2019s chart.</span>\n </label>\n\n <label class=\"gla-field gla-field--wide\">\n <span class=\"gla-field__label\">Name</span>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"Draft.Name\" maxlength=\"200\" placeholder=\"e.g. Cash \u2014 Operating\" aria-label=\"Name\" />\n </label>\n\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Account type</span>\n <mj-dropdown [Data]=\"AccountTypes\" [ValuePrimitive]=\"true\"\n [(ngModel)]=\"Draft.AccountType\" aria-label=\"Account type\" />\n </label>\n\n <label class=\"gla-field gla-field--wide\">\n <span class=\"gla-field__label\">Parent account (rollup)</span>\n <!-- The picker offers only THIS company's own accounts, minus this account and everything\n beneath it. That IS what a parent is: the account this one rolls up into, inside the\n same chart (e.g. 11200 Cash parents 11201 Cash \u2014 Operating). -->\n <mj-dropdown [Data]=\"ParentOptions\" TextField=\"Label\" ValueField=\"ID\" [ValuePrimitive]=\"true\"\n [DefaultItem]=\"ParentNoneDefault\" [Disabled]=\"!Draft.CompanyID\"\n [(ngModel)]=\"Draft.ParentGLAccountID\" aria-label=\"Parent account\" />\n <span class=\"gla-help\">\n The account this one rolls up into \u2014 always another account in {{ Draft.CompanyID ? 'this same company\u2019s chart' : 'the owning company\u2019s chart' }}.\n Leave as \u201CNone\u201D for a top-level account.\n </span>\n </label>\n\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">Currency</span>\n <mj-dropdown [Data]=\"CurrencyChoices\" TextField=\"Label\" ValueField=\"Code\" [ValuePrimitive]=\"true\"\n [DefaultItem]=\"CurrencyDefault\"\n [(ngModel)]=\"Draft.CurrencyCode\" aria-label=\"Currency\" />\n </label>\n\n <label class=\"gla-field\">\n <!-- OUTBOUND: this maps MJ's account out to the ERP's account. MJ's copy is the record. -->\n <span class=\"gla-field__label\">External system</span>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"Draft.ExternalSystem\" maxlength=\"50\" placeholder=\"BusinessCentral, QuickBooks, NetSuite\u2026\" aria-label=\"External system\" />\n <span class=\"gla-help\">The system this account syncs OUT to. Leave blank for local-only.</span>\n </label>\n\n <label class=\"gla-field\">\n <span class=\"gla-field__label\">External account ID</span>\n <input class=\"mj-input\" type=\"text\" [(ngModel)]=\"Draft.ExternalAccountID\" maxlength=\"100\" placeholder=\"That system\u2019s identifier\" aria-label=\"External account ID\" />\n </label>\n\n <label class=\"gla-field gla-field--wide\">\n <span class=\"gla-field__label\">Description</span>\n <textarea class=\"mj-textarea\" rows=\"2\" [(ngModel)]=\"Draft.Description\" aria-label=\"Description\"></textarea>\n </label>\n\n <label class=\"gla-check\">\n <input class=\"mj-checkbox\" type=\"checkbox\" [(ngModel)]=\"Draft.IsActive\" aria-label=\"Active\" />\n <span>Active \u2014 available for new journal-entry lines</span>\n </label>\n </div>\n\n <!-- Confirm LEFT, Cancel RIGHT. -->\n <div class=\"gla-editor__actions\">\n <button type=\"button\" mjButton Variant=\"primary\" Size=\"sm\" [disabled]=\"IsSaving\" (click)=\"Save()\">\n {{ IsSaving ? 'Saving\u2026' : (Draft.ID ? 'Save account' : 'Create account') }}\n </button>\n <button type=\"button\" mjButton Variant=\"flat\" Size=\"sm\" [disabled]=\"IsSaving\" (click)=\"CancelEdit()\">Cancel</button>\n </div>\n </section>\n }\n\n <!-- MJ's house grid (Marcelo 2026-08-05: All accounts uses the STANDARD mj-entity-data-grid,\n same as All journal entries / All batches \u2014 \u00A78 MJ-wins). The toolbar filters + search feed\n the grid's ExtraFilter (server-side predicate, same shape the client filter used). Clicking\n a row opens the editor above (per-row Edit/Retire buttons retired with the hand-rolled\n table \u2014 the editor's Active checkbox is the retire path). Tree indentation + orphan/cycle\n flags were the hand-rolled table's extra; the rollup STRUCTURE lives on the Chart of\n accounts page (the tree view), so this page is the flat, sortable inventory. -->\n <div class=\"gla-wrap\">\n <mj-entity-data-grid\n [Params]=\"GridParams\"\n [Columns]=\"GridColumns\"\n PaginationMode=\"client\"\n [PageSize]=\"100\"\n [ShowPager]=\"true\"\n [AllowSorting]=\"true\"\n [ShowToolbar]=\"false\"\n [SelectionMode]=\"'single'\"\n KeyField=\"ID\"\n StateKey=\"mj.bizappsacct.grid.allAccounts.v1\"\n [AutoPersistState]=\"true\"\n Height=\"auto\"\n (AfterRowClick)=\"OnGridRowClicked($event.rowKey)\">\n </mj-entity-data-grid>\n </div>\n </div>\n</mj-page-body-interior>\n", styles: ["/* \u2550\u2550 SHARED: scrolling table + sticky header \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n Consumed by every shell page with a hand-rolled <table>, as the FIRST entry in its\n styleUrls (so a page's own file still wins on a tie and can restyle type/colour).\n Markup contract: <div class=\"mjsh-tablewrap\"><table class=\"mjsh-table\"> \u2026 </table></div>\n\n \u2500\u2500 WHY THIS FILE EXISTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n This block was pasted verbatim into 7 page stylesheets and half-pasted into ~10 more,\n which is exactly how the half-copies drifted into being silently broken (below). One\n home, one fix. Pages using MJ's <mj-entity-data-grid> (AG Grid) are NOT consumers \u2014\n AG Grid owns its own header and viewport; do not add these classes there.\n\n \u2500\u2500 THE THREE THINGS THAT MAKE STICKY WORK (all are load-bearing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n 1. A REAL BOUNDED HEIGHT + overflow-y on the ancestor. `position: sticky` is measured\n against the nearest SCROLLING ancestor; with no bounded height there is no scroll\n port, the th is inert, and THE PAGE scrolls instead \u2014 rows ride up OVER the header.\n This is the failure this file fixes. Note `flex: 1` is NOT a height here: these\n wrappers sit under <mj-page-body-interior>, which is display:block, so a flex child\n is a no-op that collapses to zero (it blanked All journal entries once). Height must\n come from height/min-height. Every consumer page's :host already declares\n `display:flex; flex-direction:column; height:100%; min-height:0` \u2014 the chain that\n makes min(68vh,900px) resolve. Same chain everywhere; don't invent a per-page one.\n 2. BOTH overflow axes, explicitly. Per the overflow spec a `visible` axis paired with a\n non-`visible` axis computes to `auto` \u2014 so `overflow-x: auto` alone silently turns on\n a VERTICAL scrollbar nobody asked for. Four pages shipped exactly that bug.\n 3. An OPAQUE background + a z-index. Rows scroll UNDER the header; a transparent or\n un-stacked th lets them show straight through it. The background MUST be a token\n (there is a CI gate on literals) \u2014 never `white`.\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjsh-tablewrap {\n /* 68vh keeps the table clearly INSIDE the viewport, so the page itself never grows a\n scrollbar because a table got long; 900px stops it stretching absurdly on a tall\n monitor; 320px keeps a near-empty table from collapsing to a sliver. */\n height: min(68vh, 900px);\n min-height: 320px;\n /* Both axes, always \u2014 see (2) above. */\n overflow-x: auto;\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n}\n\n.mjsh-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.mjsh-table thead th {\n position: sticky;\n top: 0;\n z-index: 2;\n background: var(--mj-bg-surface);\n /* NOT `border-bottom`: with border-collapse:collapse the collapsed border belongs to the\n table grid, not the th, so it does NOT travel with a sticky header \u2014 the rule detaches\n and rows slide over the gap. An inset shadow paints on the th itself and does stick.\n A page that wants no rule can override `box-shadow: none` in its own file. */\n box-shadow: inset 0 -1px 0 var(--mj-border-default);\n}\n", "/* GL accounts. Design tokens only \u2014 no hex/rgb literals, no .mj-btn overrides.\n\n \u26A0 These wrappers live inside <mj-page-body-interior>, which is display:block \u2014 so `flex: 1`\n does NOT size them (it is a no-op and collapses the list to zero height). Size with\n height/min-height; the percentage resolves against body-interior's flex-derived height. */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n gap: 12px;\n}\n\n/* --- filters (one line, in the header's toolbar slot) --- */\n.gla-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.gla-field__label {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n.gla-field--search {\n min-width: 220px;\n}\n.gla-field--wide {\n grid-column: span 2;\n}\n.gla-help {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* --- editor --- */\n.gla-editor {\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.gla-editor__head {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.gla-editor__title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.gla-editor__grid {\n display: grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: 12px;\n}\n.gla-editor__actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.gla-check {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n/* The fused subheader (list-page standard) + the rounded grid card, matching All JEs / batches. */\n.gla-subheader {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n margin-bottom: 12px;\n}\n.gla-subheader mja-list-toolbar {\n display: block;\n border-top: 1px solid var(--mj-border-default);\n}\n.gla-wrap {\n /* Same height chain as .aje-grid (the list idiom this page clones): mj-entity-data-grid's :host\n is height:100%, so the wrapper MUST have real height or the grid collapses to its borders\n (~4px) and AG Grid's rows are clipped invisible + unclickable. .gla-body is a flex column with\n a definite height, so flex sizing is legal here. overflow:hidden rounds the grid to the card. */\n flex: 1 1 auto;\n min-height: 320px;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n overflow: hidden;\n}\n\n/* Page-owned gutter (body-interior [Padding]=false) \u2014 16px, matching the list-page standard. */\n.gla-body {\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: var(--mj-space-4);\n}\n.gla-body .gla-subheader {\n margin-bottom: 0;\n}\n"] }]
|
|
871
|
+
}], null, { grid: [{
|
|
872
|
+
type: ViewChild,
|
|
873
|
+
args: [EntityDataGridComponent]
|
|
874
|
+
}], CreateSignal: [{
|
|
875
|
+
type: Input
|
|
876
|
+
}] }); })();
|
|
877
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GLAccountsPageComponent, { className: "GLAccountsPageComponent", filePath: "lib/custom/shell/pages/gl-accounts.page.ts", lineNumber: 98 }); })();
|
|
878
|
+
//# sourceMappingURL=gl-accounts.page.js.map
|