feat(giving): keyboard-first Sunday offering batch entry page + routes

- Add MemberQuickAddDialogComponent for fast in-session member creation
- Add OfferingSessionPageComponent: client-side buffer, reconcile totals, date-conflict check, submit to API
- Wire finance/giving-categories, finance/givings, finance/offering-session routes (RoleGuard: finance + super_admin)
- Fix givings-page: replace [total] + data[] with GridDataResult for Kendo v20 server-side paging

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Chris Chen
2026-05-28 17:14:56 -07:00
parent 81a0b5a038
commit 001db35cef
8 changed files with 364 additions and 6 deletions
@@ -12,9 +12,9 @@
<button kendoButton (click)="onSearch()">Search</button>
</div>
<kendo-grid [data]="data" [loading]="isLoading"
<kendo-grid [data]="gridData" [loading]="isLoading"
[pageable]="true" [skip]="(page-1)*pageSize" [pageSize]="pageSize"
[total]="totalCount" (pageChange)="onPageChange($event)">
(pageChange)="onPageChange($event)">
<kendo-grid-column field="givingDate" title="Date" [width]="110"></kendo-grid-column>
<kendo-grid-column title="Giver">
<ng-template kendoGridCellTemplate let-g>{{ g.isAnonymous ? '(Anonymous)' : g.memberName }}</ng-template>
@@ -1,7 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { GridModule, PageChangeEvent } from '@progress/kendo-angular-grid';
import { GridModule, GridDataResult, PageChangeEvent } from '@progress/kendo-angular-grid';
import { InputsModule } from '@progress/kendo-angular-inputs';
import { ButtonsModule } from '@progress/kendo-angular-buttons';
import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
@@ -32,8 +32,7 @@ interface MemberOption {
styleUrls: ['./givings-page.component.scss'],
})
export class GivingsPageComponent implements OnInit {
data: GivingListItemDto[] = [];
totalCount = 0;
gridData: GridDataResult = { data: [], total: 0 };
page = 1;
pageSize = 20;
isLoading = false;
@@ -73,7 +72,7 @@ export class GivingsPageComponent implements OnInit {
categoryId: this.filterCategoryId ?? undefined,
}).subscribe({
next: (r: PagedResult<GivingListItemDto>) => {
this.data = r.items; this.totalCount = r.totalCount; this.isLoading = false;
this.gridData = { data: r.items, total: r.totalCount }; this.isLoading = false;
},
error: () => { this.isLoading = false; },
});