Skip to content

Noble Web

Last updated: 2026-03-15 Stack: Angular 18+ · NgRx Signals · Firebase · Syncfusion · Angular Material



Noble is a cloud-based enterprise accounting and property management platform. It is purpose-built for:

  • Condominium associations managing common-area finances
  • Property management companies overseeing multiple properties
  • Small-to-medium businesses requiring full double-entry bookkeeping
  • Non-profit organisations tracking fund-based accounting

The application provides a complete accounting cycle — from chart of accounts setup through journal entry, financial reporting, and audit evidence — alongside project/task management and team collaboration tools.


LayerTechnology
FrameworkAngular 18+ (standalone components, zoneless)
State ManagementNgRx Signals (signal-based stores)
UI — Data GridsSyncfusion EJ2 Grid
UI — ComponentsAngular Material + PrimeNG
UI — ReportsMESCIUS ActiveReports
ChartsApexCharts (ng-apexcharts)
Backend / AuthFirebase Auth
DatabaseFirebase Firestore (real-time)
File StorageFirebase Storage
Bank IntegrationPlaid API
StylingTailwind CSS
BuildVite + Angular CLI
ContainerisationDocker + Nginx

src/app/
├── app.component.ts # Root component — layout shell
├── app.config.ts # Bootstrap: providers, interceptors, router
├── app.routing.ts # Top-level lazy-loaded routes
├── features/ # 21 feature modules (lazy-loaded)
│ ├── accounting/ # GL, AP, AR, templates, static setup
│ ├── reporting/ # Financial reports
│ ├── budget/ # Budget creation and tracking
│ ├── finance/ # Finance dashboard
│ ├── dashboard/ # Condo/project dashboard
│ ├── kanban/ # Task boards and Gantt
│ ├── evidence-manager/ # Document/file management
│ ├── chat/ # Real-time messaging
│ ├── admin/ # Admin finance panels
│ ├── auth/ # Sign-in, sign-up, password flows
│ ├── user/ # User profile
│ ├── pages/ # Settings, activities, invoices
│ ├── help-center/ # FAQs and guides
│ └── landing/ # Public landing page
├── store/ # 25 NgRx Signal stores
├── services/ # 45+ injectable services
├── models/ # TypeScript interfaces and types
├── shared/ # Guards, interceptors, shared components
├── fuse/ # Layout framework (Fuse template)
└── utils/ # Pure utility functions
  • Standalone components — no NgModules; every component, directive, and pipe is self-contained.
  • Lazy loading — every feature route is lazy-loaded via loadComponent / loadChildren, keeping the initial bundle small.
  • Zoneless change detection — uses Angular’s experimental zoneless mode with signal-based reactivity.
  • Multi-tenant — an HTTP interceptor attaches a tenant identifier to every API request, isolating data per organisation.
  • Auth interceptor — a separate interceptor attaches Firebase ID tokens to outbound requests automatically.

Path: src/app/features/auth/

Handles all user identity flows powered by Firebase Auth.

ComponentPurpose
sign-inEmail/password login form
sign-upNew account registration
forgot-passwordPassword reset request
reset-passwordReset via emailed link
unlock-sessionRe-authenticate locked session
sign-outLogout and clear session
confirmation-requiredEmail verification gate

Guards in src/app/shared/ protect all authenticated routes and redirect unauthenticated users to sign-in.


Path: src/app/features/accounting/static/

The GL main panel (gl.main.component.ts) is a drawer-navigated hub for all reference/setup data. Sections are accessible from a persistent left-hand drawer:

SectionRoute segmentPurpose
GL Accountsaccts/Create and maintain the chart of accounts
Account Typesgl_account_type/High-level account classification (Asset, Liability, etc.)
Subtypessubtype/Detailed sub-classification within types
Fundsfunds/Fund / cost-centre definitions
Partiesparty/Vendor and customer master records
Periodsperiods/Fiscal period definitions
Teamsteam/Internal team records
Rolesroles/Permission roles assigned to users
Settingssettings/Organisation-wide accounting settings
AP Vendorsap-vendors/Accounts payable vendor list

All grids use Syncfusion EJ2 Grid with inline editing, sorting, filtering, and Excel export.


Path: src/app/features/accounting/transactions/general-ledger/

The core double-entry journal entry system.

ComponentPurpose
gl-create.tsCreate a new GL journal entry
gl-edit.tsEdit an existing GL journal entry
journal-create-details.tsManage line items (debits/credits) within a journal
transaction-evidence.tsAttach supporting documents to a journal entry

How a GL journal entry works:

  1. User creates a header (date, description, journal type, period, year, reference).
  2. User adds detail lines — each line has: GL account, fund, subtype, debit or credit amount, and a narrative.
  3. The system validates that total debits = total credits before allowing save.
  4. Evidence files (images, PDFs) can be attached per entry.
  5. Posted entries update the trial balance and financial reports in real time.

Path: src/app/features/accounting/transactions/accounts-payable/

Manages vendor invoices and payments.

ComponentPurpose
ap-update.component.tsCreate / edit AP journal entries linked to a vendor
AP vendor list (static)Vendor master maintenance

AP entries are journal entries that carry an additional vendor (party) reference. They feed into the AP aging reports and vendor payment tracking.


Path: src/app/features/accounting/transactions/accounts-receivable/

Mirrors AP but for customer-facing receivable transactions. AR journal entries carry a customer party reference and are tracked for collections and ageing.


Path: src/app/features/accounting/transactions/template/

Templates allow recurring journal entries (e.g. monthly depreciation, rent invoices) to be defined once and reused.

ComponentPurpose
template-list.tsBrowse all saved templates
template-detail.tsView a template’s header and line items
template-update.tsCreate or edit a template

A template stores the same structure as a journal entry (header + detail lines) but without a date. When a user creates a journal from a template, the template lines are copied into a new journal entry ready for posting.

Routes are defined in journal.template.routes.ts with a resolver (journal.template.resolver.ts) that pre-fetches template data before the component loads.


Path: src/app/features/reporting/

A reporting hub accessible from a persistent left-hand drawer panel (reporting-panel.component.ts).

ReportComponentDescription
Trial Balancetrial-balance.componentPeriod-end account balances vs. debits/credits
Balance Sheetbalance-sheetAssets, liabilities, equity (via MESCIUS ActiveReports)
Income Statementincome-statement-rpt.componentRevenue vs. expenses for a period
Expense Reportexpense-rpt.componentDetailed expense breakdown
Distributed TBdistributed-tb.componentTrial balance spread across multiple periods
TB Pivottb-pivot.componentPivot-table view of trial balance data
Distribution Comparisondist-list-comparisonCompare distributions across periods
Transaction Analysis(analysis component)Deep-dive into transaction-level data
Grid Reportsreporting-gridCustomisable Syncfusion grid-based reports

Reports are generated from live Firestore data via reports.service.ts and financial-service.service.ts. Users can filter by period, year, fund, and account range.


Path: src/app/features/budget/

ComponentPurpose
budget-landingOverview — list of budgets and summary cards
budget-main.tsBudget header and detail entry (Syncfusion grid)
expenseActual vs. budget variance tracking
updateEdit existing budget lines

Budgets are defined per period/year and account. The expense view compares posted GL amounts against budget figures, showing variances in both absolute and percentage terms.


Path: src/app/features/finance/

A summary dashboard targeted at finance staff and board members.

  • Account balance charts (ApexCharts)
  • Recent transaction list
  • Key financial KPI cards
  • Quick-access links to common accounting tasks

Path: src/app/features/dashboard/

ComponentPurpose
condo.dashboard.tsPrimary project/property dashboard with charts and summaries
project.component.tsPer-project detail view
dashboard-chart.tsReusable chart components

The dashboard surfaces property-level data including financial summaries, open tasks, recent activity, and project status — designed for board members and property managers.


Path: src/app/features/kanban/

ComponentPurpose
kanban-panel.component.tsMain entry point with board/Gantt toggle
kanban.board.component.tsDrag-and-drop task board
task.component.tsIndividual task card
kanban.task.form.tsTask create/edit form

Tasks have: title, description, status, priority, assignee, start/due dates, dependencies, and attached files. The Gantt view shows tasks on a timeline with dependency arrows. Used for tracking maintenance, renovation projects, and administrative tasks within the property.


Path: src/app/features/evidence-manager/

Cloud-based document store backed by Firebase Storage.

  • Upload files (drag-and-drop via drag-n-drop/ feature)
  • Associate files with journal entries as supporting evidence
  • Image gallery with lightbox viewer (lightbox/ feature)
  • Image batch operations and indexing
  • Supports PDFs, images, spreadsheets

Path: src/app/features/chat/

Real-time team messaging using Firestore as the message store.

  • Threaded conversations
  • Per-team and per-project channels
  • Message history with timestamps
  • Integrated with task/kanban system for task-level discussions

Path: src/app/features/admin/finance/

Administrative-level finance views including:

  • Sales graphs and revenue analytics
  • Reconciliation management (reconciliation boards using Kanban pattern)
  • Admin configuration wizards
  • Image/attachment administration

Path: src/app/features/user/ and src/app/features/pages/

  • User profile editing (name, avatar, contact details)
  • Password change
  • Application settings (multi-tab: general, notifications, security)
  • Activity history
  • Invoice history
  • Pricing / plan information

Path: src/app/features/help-center/

In-app help documentation:

  • FAQ accordion lists
  • User guides and how-to articles
  • Support contact information

Path: src/app/features/landing/

The public-facing entry point for unauthenticated users. Describes the Noble platform’s features and pricing, with call-to-action links to sign-in and sign-up.


Noble uses NgRx Signal Stores — a modern, signal-based alternative to traditional Redux-style stores. Each store is a class decorated with signalStore() that exposes computed signals and updater methods.

StoreFileResponsibility
Application Storeapplication.store.tsCurrent period/year, user profile, panel loading
Main Panel Storemain.panel.store.tsNavigation state, TB parameters, start/end dates
Journal Storejournal.store.tsActive journal header, detail lines, journal lists
Template Storetemplate.store.tsTemplate header/details, dropdown data
Accounts Storeaccounts.store.tsGL account list and dropdown references
Auth Storeauth.store.tsAuthenticated user identity
Period Storeperiod.store.tsAccounting period list
Date Storedate.store.tsSelected date range
Budget Storebudget.store.tsBudget data and variance tracking
Evidence Storeevidence.store.tsAttached documents per journal
Funds Storefunds.store.tsFund/cost-centre references
GL Type Storegltype.store.tsAccount type lookup
Party Storeparty.store.tsVendor/customer references
Payments Storepayments.store.tsAP payment records
Reconciliation Storereconciliation.store.tsReconciliation state
Reports Storereports.store.tsReport data and filters
AP Vendor Storeap-vendor.store.tsAccounts payable vendor data

Components inject stores directly and react to signal changes with no explicit subscriptions required.


Services are Angular injectables (providedIn: 'root') responsible for all data access and business logic.

ServiceResponsibility
journal.service.tsFull CRUD for GL journal entries, trial balance fetch
accounts.service.tsGL account CRUD
template.service.tsJournal template management
journal-template.service.tsTemplate detail lines
periods.service.tsAccounting period management
party.service.tsVendor/customer master data
funds.service.tsFund / cost-centre data
subtype.service.tsTransaction subtype lookup
type.service.tsTransaction type lookup
roles.service.tsUser role data
team.service.tsTeam data
ServiceResponsibility
reports.service.tsGenerate and fetch report data
distribution.ledger.service.tsDistributed trial balance logic
financial-service.service.tsFinancial calculations and aggregations
ServiceResponsibility
auth.service.tsFirebase Auth integration (sign-in, sign-out, token refresh)
application.service.tsApp initialisation — loads initial data on startup
ai-agent.service.tsAI assistant integration
plaid.service.tsBank account data via Plaid API
local-storage.service.tsPersistent client-side key-value storage
grid.settings.service.tsSyncfusion grid column configuration per user
ServiceResponsibility
excel.service.tsExport grid data to Excel
image-list.service.tsImage collection management
chat.service.tsFirestore-backed chat messages
message.service.tsIn-app toastr/snackbar notifications
faq.service.tsHelp centre content retrieval
file-manager.service.tsFirebase Storage file operations

All interfaces are in src/app/models/.

IJournalHeader {
id: string
date: Timestamp
description: string
journalType: string // 'GL' | 'AP' | 'AR'
status: string // 'draft' | 'posted'
period: number
year: number
reference: string
totalDebit: number
totalCredit: number
tenantId: string
}
IDetail {
id: string
headerId: string
accountId: string
fundId: string
subtypeId: string
debit: number
credit: number
narrative: string
}
IJournalTemplate {
id: string
name: string
description: string
details: IJournalDetailTemplate[]
}
IAccounts {
id: string
accountNumber: string
accountName: string
accountTypeId: string
subtypeId: string
isActive: boolean
}
IFunds {
id: string
fundCode: string
fundName: string
}
IParty {
id: string
partyName: string
partyType: string // 'vendor' | 'customer'
email: string
address: string
}
IPeriod {
id: string
periodNumber: number
year: number
startDate: Timestamp
endDate: Timestamp
isClosed: boolean
}
ProfileModel {
uid: string
displayName: string
email: string
photoURL: string
tenantId: string
role: string
}
ITasks {
id: string
title: string
description: string
status: string
priority: string
assigneeId: string
startDate: Timestamp
dueDate: Timestamp
boardId: string
}

/ → Landing page (public)
/sign-in → Authentication
/sign-up → Registration
/app/ → Authenticated shell (layout)
dashboard/ → Condo/project dashboard
finance/ → Finance summary dashboard
accounting/
gl/ → GL transaction list
gl/create → New GL journal
gl/edit/:id → Edit GL journal
templates/ → Template list
templates/detail/:id → Template detail
templates/update/:id → Edit template
ap/ → Accounts payable journals
ar/ → Accounts receivable journals
setup/ → Chart of accounts panel (drawer nav)
accts/
gl_account_type/
subtype/
funds/
party/
periods/
team/
roles/
settings/
ap-vendors/
reporting/ → Reporting hub (drawer nav)
trial-balance/
balance-sheet/
income-statement/
expense-report/
distributed-tb/
tb-pivot/
budget/ → Budget management
kanban/ → Task boards
evidence/ → Document management
chat/ → Messaging
admin/finance/ → Admin finance panel
pages/settings → App settings
user/profile → User profile
help-center/ → FAQ and guides

  1. Navigate to Accounting → General Ledger → Create
  2. Fill in the journal header: date, period, year, description, journal type
  3. Add detail lines: select GL account, fund, subtype; enter debit or credit amount
  4. Confirm debit total equals credit total (system validates)
  5. Optionally attach evidence documents
  6. Save as draft or post immediately
  1. Navigate to Accounting → Templates
  2. Select an existing template or create a new one
  3. Template stores a set of pre-configured detail lines
  4. When creating a new journal, choose “From Template” to auto-populate lines
  5. Adjust amounts or accounts as needed and post
  1. Navigate to Reporting → Trial Balance
  2. Select period and year
  3. Optionally filter by fund or account range
  4. Report displays opening balance, period debits/credits, and closing balance per account
  5. Export to Excel if required
  1. Navigate to Accounting → Setup → AP Vendors
  2. Add vendor name, address, contact details, and default account
  3. Vendor is now available in AP journal entry dropdowns
  1. Navigate to Budget → Create
  2. Select year and period range
  3. Enter budgeted amounts per GL account
  4. Save budget
  5. View variance in Budget → Expense comparing actuals vs. budget
  1. Navigate to Kanban
  2. Create a board or select an existing one
  3. Add task cards with title, priority, assignee, and due date
  4. Drag cards between status columns (To Do → In Progress → Done)
  5. Switch to Gantt view for timeline/dependency visualisation

All backend data lives in Firebase:

ServiceUsed For
Firebase AuthUser authentication and session management
FirestoreAll application data (journals, accounts, tasks, chat)
Firebase StorageFile uploads (evidence documents, images)
Firebase HostingStatic asset serving (production)

Firestore security rules (firestore.rules) enforce tenant isolation and role-based read/write access.

  • Every Firestore document includes a tenantId field
  • An HTTP interceptor reads the tenant from the user’s profile and appends it to every outbound request
  • Queries always filter by tenantId ensuring complete data isolation between organisations

Plaid is integrated via plaid.service.ts to pull bank account balances and transaction data for reconciliation workflows.

ai-agent.service.ts exposes an AI assistant capability — likely used for natural-language queries over financial data or automated journal suggestions.

FilePurpose
DockerfileContainerise the Angular app with Nginx
nginx.confServe the SPA with proper HTML5 history routing
docker-compose.yamlLocal multi-service development setup
firebase.jsonFirebase Hosting, Firestore, and Storage configuration
MakefileCommon build/deploy commands

Generated from source code analysis — 2026-03-15