feat(expense): wire routes + sidebar nav for expense pages

Also fix kendo-grid [total] binding in expenses-page template by
switching to GridDataResult object form ({ data, total }) on [data].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Chris Chen
2026-05-29 18:59:25 -07:00
parent f5ff03260b
commit 95008788f3
4 changed files with 50 additions and 5 deletions
@@ -43,6 +43,17 @@
</a>
</div>
<div class="nav-section">
<h4 *ngIf="!sidebarCollapsed">Personal</h4>
<a *ngFor="let item of personalNavItems" class="nav-item" [class.active]="item.active"
[title]="item.text" (click)="navigateTo(item.path)">
<div class="nav-icon">
<kendo-svgicon [icon]="item.icon"></kendo-svgicon>
</div>
<span *ngIf="!sidebarCollapsed">{{ item.text }}</span>
</a>
</div>
<div class="nav-section">
<h4 *ngIf="!sidebarCollapsed">Management</h4>
<a *ngFor="let item of managementNavItems" class="nav-item" [class.active]="item.active"
@@ -71,9 +71,16 @@ export class UserPortalComponent implements OnInit, OnDestroy {
];
public financeNavItems: NavItem[] = [
{ text: 'Offering Entry', icon: this.creditCardIcon, path: '/user-portal/finance/offering-session' },
{ text: 'Givings', icon: this.creditCardIcon, path: '/user-portal/finance/givings' },
{ text: 'Giving Types', icon: this.creditCardIcon, path: '/user-portal/finance/giving-categories' },
{ text: 'Offering Entry', icon: this.creditCardIcon, path: '/user-portal/finance/offering-session' },
{ text: 'Givings', icon: this.creditCardIcon, path: '/user-portal/finance/givings' },
{ text: 'Giving Types', icon: this.creditCardIcon, path: '/user-portal/finance/giving-categories' },
{ text: 'Expenses', icon: this.creditCardIcon, path: '/user-portal/finance/expenses' },
{ text: 'Expense Categories', icon: this.creditCardIcon, path: '/user-portal/finance/expense-categories' },
{ text: 'Monthly Statement', icon: this.creditCardIcon, path: '/user-portal/finance/monthly-statement' },
];
public personalNavItems: NavItem[] = [
{ text: 'My Reimbursements', icon: this.creditCardIcon, path: '/user-portal/reimbursements' },
];
public showMemberAdminSection = false;
@@ -153,6 +160,7 @@ export class UserPortalComponent implements OnInit, OnDestroy {
...this.memberAdminNavItems,
...this.userAdminNavItems,
...this.financeNavItems,
...this.personalNavItems,
];
allItems.forEach(item => (item.active = false));
@@ -194,6 +202,10 @@ export class UserPortalComponent implements OnInit, OnDestroy {
'finance/offering-session': 'Sunday Offering Entry',
'finance/givings': 'Givings',
'finance/giving-categories': 'Giving Types',
'reimbursements': 'My Reimbursements',
'finance/expenses': 'Expenses',
'finance/expense-categories': 'Expense Categories',
'finance/monthly-statement': 'Monthly Statement',
};
return titles[page] ?? 'Dashboard';
}