From 8fd1f8d8388b68445e0bdbf0d365ae77b86f720e Mon Sep 17 00:00:00 2001 From: kimiti47 Date: Sat, 29 Nov 2025 19:34:12 +0300 Subject: [PATCH 1/3] feat: add AddNoteToBudgetCommand and handler --- .../budgetting/budget-notes/src/lib/domain/add-note.command.ts | 0 .../budgetting/budget-notes/src/lib/domain/add-note.handler.ts | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts create mode 100644 libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts diff --git a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts new file mode 100644 index 00000000..e69de29b diff --git a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts new file mode 100644 index 00000000..e69de29b From 0e7a4253b9ba04f0273bfa1ead401a3484402e3d Mon Sep 17 00:00:00 2001 From: kimiti47 Date: Sat, 29 Nov 2025 19:46:01 +0300 Subject: [PATCH 2/3] feat: add AddNoteToBudgetCommand and handler --- .../src/lib/domain/add-note.command.ts | 7 ++++++ .../src/lib/domain/add-note.handler.ts | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts index e69de29b..b1cffa49 100644 --- a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts +++ b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.command.ts @@ -0,0 +1,7 @@ +export class AddNoteToBudgetCommand { + constructor( + public readonly budgetId: string, + public readonly content: string, + public readonly createdBy: string, + ) {} +} diff --git a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts index e69de29b..1820b78c 100644 --- a/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts +++ b/libs/model/budgetting/budget-notes/src/lib/domain/add-note.handler.ts @@ -0,0 +1,25 @@ +import { AddNoteToBudgetCommand } from './add-note.command'; +import { FunctionHandler } from '@ngfire/functions'; + +export interface ICommandHandler { + execute(command: TCommand): Promise; +} + +export class AddNoteToBudgetHandler implements FunctionHandler, ICommandHandler { + async execute(command: AddNoteToBudgetCommand): Promise { + if (!command.content || !command.budgetId) { + throw new Error('Budget ID and content are required'); + } + + const repo = this.getRepository(); + await repo.addNote(command.budgetId, command.content, command.createdBy); + } + + private getRepository() { + return { + addNote: async (budgetId: string, content: string, createdBy: string) => { + // logic to persist the note + } + }; + } +} From 594f628ce6106ac8f735872ba64583781ad7a0bd Mon Sep 17 00:00:00 2001 From: kimiti47 Date: Sat, 29 Nov 2025 19:54:00 +0300 Subject: [PATCH 3/3] refactor: convert budget components to Angular Signals --- .../budget-table/budget-table.component.html | 6 ++++ .../budget-table/budget-table.component.ts | 10 ++++++ .../select-budget-page.component.html | 3 ++ .../select-budget-page.component.ts | 31 +++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.html create mode 100644 libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.ts create mode 100644 libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.html create mode 100644 libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.ts diff --git a/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.html b/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.html new file mode 100644 index 00000000..c7871f55 --- /dev/null +++ b/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.html @@ -0,0 +1,6 @@ + + + + + +
{{ budget.name }}{{ budget.amount }}
diff --git a/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.ts b/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.ts new file mode 100644 index 00000000..3babe339 --- /dev/null +++ b/libs/features/budgetting/budgets/src/lib/budget-table/budget-table.component.ts @@ -0,0 +1,10 @@ +import { Component, Input, Signal } from '@angular/core'; +import { Budget } from '../../models/budget.model'; + +@Component({ + selector: 'app-budget-table', + templateUrl: './budget-table.component.html', +}) +export class BudgetTableComponent { + @Input() budgets!: Signal; +} diff --git a/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.html b/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.html new file mode 100644 index 00000000..389591de --- /dev/null +++ b/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.ts b/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.ts new file mode 100644 index 00000000..f4347eb0 --- /dev/null +++ b/libs/features/budgetting/budgets/src/lib/select-budget-page/select-budget-page.component.ts @@ -0,0 +1,31 @@ +import { Component, inject, signal, computed, effect } from '@angular/core'; +import { BudgetService } from '../../services/budget.service'; +import { Budget } from '../../models/budget.model'; + +@Component({ + selector: 'app-select-budget-page', + templateUrl: './select-budget-page.component.html', +}) +export class SelectBudgetPageComponent { + private budgetService = inject(BudgetService); + + allBudgets = signal([]); + selectedBudgetId = signal(null); + + overview = computed(() => + this.allBudgets().find(b => b.id === this.selectedBudgetId()) + ); + + constructor() { + this.loadBudgets(); + } + + loadBudgets() { + this.budgetService.getBudgets().subscribe(budgets => this.allBudgets.set(budgets)); + } + + selectBudget(budgetId: string) { + this.selectedBudgetId.set(budgetId); + } +} +