diff --git a/APP/src/app/features/expense/models/expense.model.ts b/APP/src/app/features/expense/models/expense.model.ts index c701d89..e572426 100644 --- a/APP/src/app/features/expense/models/expense.model.ts +++ b/APP/src/app/features/expense/models/expense.model.ts @@ -5,10 +5,10 @@ export interface PagedResult { items: T[]; totalCount: number; page: number; pageSize: number; totalPages: number; } -export interface MinistryDto { id: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; } +export interface MinistryDto { id: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; label?: string; } -export interface ExpenseSubCategoryDto { id: number; groupId: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; } -export interface ExpenseCategoryGroupDto { id: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; subCategories: ExpenseSubCategoryDto[]; } +export interface ExpenseSubCategoryDto { id: number; groupId: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; label?: string; } +export interface ExpenseCategoryGroupDto { id: number; name_en: string; name_zh: string | null; sortOrder: number; isActive: boolean; subCategories: ExpenseSubCategoryDto[]; label?: string; } export interface CreateExpenseGroupRequest { name_en: string; name_zh: string | null; sortOrder: number; } export interface UpdateExpenseGroupRequest extends CreateExpenseGroupRequest { isActive: boolean; } export interface CreateExpenseSubCategoryRequest { groupId: number; name_en: string; name_zh: string | null; sortOrder: number; } diff --git a/APP/src/app/features/expense/services/expense-category-api.service.ts b/APP/src/app/features/expense/services/expense-category-api.service.ts index 6b21bf5..d204878 100644 --- a/APP/src/app/features/expense/services/expense-category-api.service.ts +++ b/APP/src/app/features/expense/services/expense-category-api.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { Observable, map } from 'rxjs'; +import { bilingual } from '../../../shared/i18n/bilingual'; import { ApiConfigService } from '../../../core/services/api-config.service'; import { ExpenseCategoryGroupDto, CreateExpenseGroupRequest, UpdateExpenseGroupRequest, @@ -14,7 +15,13 @@ export class ExpenseCategoryApiService { this.endpoint = apiConfig.getApiUrl('expense-categories'); } getAll(includeInactive = false): Observable { - return this.http.get(this.endpoint, { params: new HttpParams().set('includeInactive', includeInactive) }); + return this.http.get(this.endpoint, { params: new HttpParams().set('includeInactive', includeInactive) }).pipe( + map(groups => groups.map(g => ({ + ...g, + label: bilingual(g.name_en, g.name_zh), + subCategories: g.subCategories.map(s => ({ ...s, label: bilingual(s.name_en, s.name_zh) })), + }))), + ); } createGroup(r: CreateExpenseGroupRequest): Observable<{ id: number }> { return this.http.post<{ id: number }>(`${this.endpoint}/groups`, r); } updateGroup(id: number, r: UpdateExpenseGroupRequest): Observable { return this.http.put(`${this.endpoint}/groups/${id}`, r); } diff --git a/APP/src/app/features/expense/services/ministry-api.service.ts b/APP/src/app/features/expense/services/ministry-api.service.ts index d67794a..2e2c6db 100644 --- a/APP/src/app/features/expense/services/ministry-api.service.ts +++ b/APP/src/app/features/expense/services/ministry-api.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { Observable, map } from 'rxjs'; +import { bilingual } from '../../../shared/i18n/bilingual'; import { ApiConfigService } from '../../../core/services/api-config.service'; import { MinistryDto } from '../models/expense.model'; @@ -11,6 +12,8 @@ export class MinistryApiService { this.endpoint = apiConfig.getApiUrl('ministries'); } getAll(includeInactive = false): Observable { - return this.http.get(this.endpoint, { params: new HttpParams().set('includeInactive', includeInactive) }); + return this.http.get(this.endpoint, { params: new HttpParams().set('includeInactive', includeInactive) }).pipe( + map(list => list.map(m => ({ ...m, label: bilingual(m.name_en, m.name_zh) }))), + ); } } diff --git a/APP/src/app/features/giving/models/giving.model.ts b/APP/src/app/features/giving/models/giving.model.ts index c595c64..4fd26b3 100644 --- a/APP/src/app/features/giving/models/giving.model.ts +++ b/APP/src/app/features/giving/models/giving.model.ts @@ -18,6 +18,8 @@ export interface GivingCategoryDto { description_zh: string | null; isActive: boolean; sortOrder: number; + /** Display-only bilingual label, computed in the API service. */ + label?: string; } export interface CreateGivingCategoryRequest { name_en: string; diff --git a/APP/src/app/features/giving/services/giving-category-api.service.ts b/APP/src/app/features/giving/services/giving-category-api.service.ts index e8029ab..9b7c04f 100644 --- a/APP/src/app/features/giving/services/giving-category-api.service.ts +++ b/APP/src/app/features/giving/services/giving-category-api.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { Observable, map } from 'rxjs'; +import { bilingual } from '../../../shared/i18n/bilingual'; import { ApiConfigService } from '../../../core/services/api-config.service'; import { GivingCategoryDto, CreateGivingCategoryRequest, UpdateGivingCategoryRequest, @@ -15,7 +16,9 @@ export class GivingCategoryApiService { getAll(includeInactive = false): Observable { const params = new HttpParams().set('includeInactive', includeInactive); - return this.http.get(this.endpoint, { params }); + return this.http.get(this.endpoint, { params }).pipe( + map(list => list.map(c => ({ ...c, label: bilingual(c.name_en, c.name_zh) }))), + ); } create(request: CreateGivingCategoryRequest): Observable<{ id: number }> { return this.http.post<{ id: number }>(this.endpoint, request);