From 627bdcbd8037df1082bd6ac131c874246aac3010 Mon Sep 17 00:00:00 2001 From: Joe Arndt Date: Sat, 14 Feb 2026 10:20:23 -0600 Subject: [PATCH] created for validation and save button logic --- .../add-expense/add-expense.component.html | 10 ++-- .../add-expense/add-expense.component.scss | 4 +- .../add-expense/add-expense.component.ts | 51 ++++++++++++++----- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/app/components/add-expense/add-expense.component.html b/src/app/components/add-expense/add-expense.component.html index 00c2249..bcfe018 100644 --- a/src/app/components/add-expense/add-expense.component.html +++ b/src/app/components/add-expense/add-expense.component.html @@ -15,12 +15,12 @@ Cents - + Category - + @for (category of categories(); track category.id) { {{ category.name }} @@ -30,7 +30,7 @@ Merchant - + @for (merchant of merchants(); track merchant.id) { {{ merchant.name }} @@ -51,14 +51,14 @@ Note - + - + diff --git a/src/app/components/add-expense/add-expense.component.scss b/src/app/components/add-expense/add-expense.component.scss index a524941..74c3967 100644 --- a/src/app/components/add-expense/add-expense.component.scss +++ b/src/app/components/add-expense/add-expense.component.scss @@ -8,13 +8,13 @@ .add-expense-dropdowns { display: flex; - gap: 0.5rem; + gap: 1rem; justify-content: space-between; } .add-expense-additional { display: flex; - gap: 0.5rem; + gap: 1rem; justify-content: space-between; } diff --git a/src/app/components/add-expense/add-expense.component.ts b/src/app/components/add-expense/add-expense.component.ts index 0cde81e..5931c7a 100644 --- a/src/app/components/add-expense/add-expense.component.ts +++ b/src/app/components/add-expense/add-expense.component.ts @@ -1,8 +1,8 @@ import { Component, computed, signal } from '@angular/core'; import { CategoryService } from '../../services/category.service'; import { MerchantService } from '../../services/merchant.service'; -import { Tag, TagService } from '../../services/tag.service'; -import { form, FormField } from '@angular/forms/signals'; +import { TagService } from '../../services/tag.service'; +import { form, FormField, min, required } from '@angular/forms/signals'; import { MatCardModule } from '@angular/material/card'; import { MatInputModule } from '@angular/material/input'; import { MatDatepickerModule } from '@angular/material/datepicker'; @@ -12,13 +12,13 @@ import { MatSelectModule } from '@angular/material/select'; import { MatButtonModule } from '@angular/material/button'; import { provideNativeDateAdapter } from '@angular/material/core'; -interface AddExpenseForm { - date: Date, - amount: number | string, - categoryId: string, - merchantId: string, - note: string, - tags: Tag[] +interface ExpenseForm { + date: Date; + cents: number; + category: string; + merchant: string; + note: string; + tags: string[]; } @Component({ @@ -32,17 +32,40 @@ export class AddExpenseComponent { protected categories = computed(() => this.categoryService.categories()); protected merchants = computed(() => this.merchantService.merchants()); protected tags = computed(() => this.tagService.tags()); - private addExpenseModel = signal({ + protected enableSaveButton = computed(() => { + const dateValid = this.expenseForm.date().valid(); + const centsValid = this.expenseForm.cents().valid(); + const categoryValid = this.expenseForm.category().valid(); + const merchantValid = this.expenseForm.merchant().valid(); + const noteValid = this.expenseForm.note().valid(); + + return dateValid && centsValid && categoryValid && merchantValid && noteValid; + }); + + private defaultFormState: ExpenseForm = { date: new Date(), - amount: '', - categoryId: '', - merchantId: '', + cents: NaN, + category: '', + merchant: '', note: '', tags: [] + }; + private expenseModel = signal(this.defaultFormState); + public expenseForm = form(this.expenseModel, (schema) => { + required(schema.date); + required(schema.cents); + min(schema.cents, 1); + required(schema.category); }); - public expenseForm = form(this.addExpenseModel); public constructor(private readonly categoryService: CategoryService, private readonly merchantService: MerchantService, private readonly tagService: TagService) { } + + public saveClick(): void { + const saveExpense = this.expenseModel(); + console.log(saveExpense); + this.expenseModel.set({ ...this.defaultFormState, date: saveExpense.date }); + this.expenseForm().reset(this.expenseModel()); + } }