From 9e22fa07ec2d8fdd5f839fedb5fb1c51aadf99a8 Mon Sep 17 00:00:00 2001 From: tamibalogh Date: Mon, 5 Jan 2026 17:57:59 +0100 Subject: [PATCH 1/4] EX-136: Add note field to category (Backend) --- .../com/exence/finance/common/util/ValidationConstants.java | 1 + .../com/exence/finance/modules/category/dto/CategoryDTO.java | 5 +++++ .../com/exence/finance/modules/category/entity/Category.java | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/backend/exence/src/main/java/com/exence/finance/common/util/ValidationConstants.java b/backend/exence/src/main/java/com/exence/finance/common/util/ValidationConstants.java index 95ee7ee..1772aac 100644 --- a/backend/exence/src/main/java/com/exence/finance/common/util/ValidationConstants.java +++ b/backend/exence/src/main/java/com/exence/finance/common/util/ValidationConstants.java @@ -32,6 +32,7 @@ public class ValidationConstants { public static final int CATEGORY_NAME_MIN_LENGTH = 1; public static final int CATEGORY_NAME_MAX_LENGTH = 25; public static final int CATEGORY_EMOJI_MAX_LENGTH = 50; + public static final int CATEGORY_NOTE_MAX_LENGTH = 500; // Transaction validations public static final int TRANSACTION_TITLE_MIN_LENGTH = 1; diff --git a/backend/exence/src/main/java/com/exence/finance/modules/category/dto/CategoryDTO.java b/backend/exence/src/main/java/com/exence/finance/modules/category/dto/CategoryDTO.java index 6bcf36e..3860b1b 100644 --- a/backend/exence/src/main/java/com/exence/finance/modules/category/dto/CategoryDTO.java +++ b/backend/exence/src/main/java/com/exence/finance/modules/category/dto/CategoryDTO.java @@ -14,6 +14,7 @@ import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NAME_MAX_LENGTH; import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NAME_MIN_LENGTH; +import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NOTE_MAX_LENGTH; @SuperBuilder @NoArgsConstructor @@ -33,4 +34,8 @@ public class CategoryDTO { @ValidEmoji(allowEmpty = false, message = "Must contain exactly one emoji character") private String emoji; + + @Size(max = CATEGORY_NOTE_MAX_LENGTH, + message = "Note can be a maximum of " + CATEGORY_NOTE_MAX_LENGTH + " characters.") + private String note; } diff --git a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java index ebdfdb8..a0be285 100644 --- a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java +++ b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java @@ -28,6 +28,8 @@ import static com.exence.finance.common.util.ValidationConstants.CATEGORY_EMOJI_MAX_LENGTH; import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NAME_MAX_LENGTH; +import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NOTE_MAX_LENGTH; +import static com.exence.finance.common.util.ValidationConstants.TRANSACTION_NOTE_MAX_LENGTH; @SuperBuilder @Entity @@ -53,6 +55,9 @@ public class Category extends BaseAuditableEntity { @Column(name = "emoji", length = CATEGORY_EMOJI_MAX_LENGTH) private String emoji; + @Column(name = "NOTE", length = CATEGORY_NOTE_MAX_LENGTH) + private String note; + @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "user_id", nullable = false) private User user; From 20ddbe13a4b0f39b3e8a4c3f622fc53c667d45ed Mon Sep 17 00:00:00 2001 From: tamibalogh Date: Mon, 12 Jan 2026 20:12:13 +0100 Subject: [PATCH 2/4] EX-136: Add note field to category (Frontend + Liquibase) --- .../modules/category/entity/Category.java | 2 +- .../db/changelog/db.changelog-master.yaml | 4 ++++ .../v1.1.0/add-note-to-category.yaml | 12 +++++++++++ .../db/changelog/v1.1.0/changelog-v1.1.0.yaml | 4 ++++ .../data-model/modules/category/Category.ts | 1 + .../create-category-dialog.component.html | 9 ++++++++ .../create-category-dialog.component.ts | 21 ++++++++++++++----- 7 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 backend/exence/src/main/resources/db/changelog/v1.1.0/add-note-to-category.yaml create mode 100644 backend/exence/src/main/resources/db/changelog/v1.1.0/changelog-v1.1.0.yaml diff --git a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java index a0be285..8f85095 100644 --- a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java +++ b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java @@ -55,7 +55,7 @@ public class Category extends BaseAuditableEntity { @Column(name = "emoji", length = CATEGORY_EMOJI_MAX_LENGTH) private String emoji; - @Column(name = "NOTE", length = CATEGORY_NOTE_MAX_LENGTH) + @Column(name = "note", length = CATEGORY_NOTE_MAX_LENGTH) private String note; @ManyToOne(fetch = FetchType.LAZY, optional = false) diff --git a/backend/exence/src/main/resources/db/changelog/db.changelog-master.yaml b/backend/exence/src/main/resources/db/changelog/db.changelog-master.yaml index b37113b..14508bc 100644 --- a/backend/exence/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/backend/exence/src/main/resources/db/changelog/db.changelog-master.yaml @@ -4,6 +4,10 @@ databaseChangeLog: file: v1.0.0/changelog-v1.0.0.yaml relativeToChangelogFile: true + - include: + file: v1.1.0/changelog-v1.1.0.yaml + relativeToChangelogFile: true + # Test data - include: file: data/test-data.yaml diff --git a/backend/exence/src/main/resources/db/changelog/v1.1.0/add-note-to-category.yaml b/backend/exence/src/main/resources/db/changelog/v1.1.0/add-note-to-category.yaml new file mode 100644 index 0000000..7d1d308 --- /dev/null +++ b/backend/exence/src/main/resources/db/changelog/v1.1.0/add-note-to-category.yaml @@ -0,0 +1,12 @@ +databaseChangeLog: + - changeSet: + id: add-note-to-category + author: tamibalogh + comment: Create note column in category table + changes: + - addColumn: + tableName: category + columns: + - column: + name: note + type: VARCHAR(500) diff --git a/backend/exence/src/main/resources/db/changelog/v1.1.0/changelog-v1.1.0.yaml b/backend/exence/src/main/resources/db/changelog/v1.1.0/changelog-v1.1.0.yaml new file mode 100644 index 0000000..181b9c5 --- /dev/null +++ b/backend/exence/src/main/resources/db/changelog/v1.1.0/changelog-v1.1.0.yaml @@ -0,0 +1,4 @@ +databaseChangeLog: + - include: + file: add-note-to-category.yaml + relativeToChangelogFile: true diff --git a/frontend/Exence/src/app/data-model/modules/category/Category.ts b/frontend/Exence/src/app/data-model/modules/category/Category.ts index d2e9ef0..ed609fa 100644 --- a/frontend/Exence/src/app/data-model/modules/category/Category.ts +++ b/frontend/Exence/src/app/data-model/modules/category/Category.ts @@ -2,4 +2,5 @@ export interface Category { id?: number; name: string; emoji: string; + note?: string; } diff --git a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.html b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.html index 60b8f22..25cf4e6 100644 --- a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.html +++ b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.html @@ -47,6 +47,15 @@

New category

} + + @let noteControl = form.controls.note; + + Note + + + + + diff --git a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts index 73ed26d..fba31b9 100644 --- a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts +++ b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts @@ -1,5 +1,9 @@ import { Component, inject } from '@angular/core'; -import { NonNullableFormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; +import { + NonNullableFormBuilder, + ReactiveFormsModule, + Validators, +} from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -32,21 +36,27 @@ import { CategoryService } from '../../category.service'; ], }) export class CreateCategoryDialogComponent { - private readonly dialogRef = inject(MatDialogRef); + private readonly dialogRef = inject( + MatDialogRef, + ); private readonly categoryService = inject(CategoryService); private readonly fb = inject(NonNullableFormBuilder); data = inject(MAT_DIALOG_DATA); form = this.fb.group({ - name: this.fb.control('', [Validators.required, Validators.maxLength(255)]), + name: this.fb.control('', [ + Validators.required, + Validators.maxLength(255), + ]), emoji: this.fb.control('', [Validators.required]), + note: this.fb.control('', [Validators.maxLength(500)]), }); emojiInvalid = false; ngOnInit(): void { - this.form.controls.emoji.valueChanges.subscribe(emoji => { + this.form.controls.emoji.valueChanges.subscribe((emoji) => { this.emojiInvalid = !emoji; }); } @@ -66,6 +76,7 @@ export class CreateCategoryDialogComponent { const request: Category = { name: formValue.name, emoji: formValue.emoji, + note: formValue.note, }; try { const newCategory = await this.categoryService.create(request); @@ -74,4 +85,4 @@ export class CreateCategoryDialogComponent { this.dialogRef.close(); } } -} \ No newline at end of file +} From ca471f2341222cf8088c0369456c9b37d475fd4e Mon Sep 17 00:00:00 2001 From: tamibalogh Date: Mon, 12 Jan 2026 20:29:46 +0100 Subject: [PATCH 3/4] Remove unneccessary constant value --- .../com/exence/finance/modules/category/entity/Category.java | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java index 8f85095..37d36db 100644 --- a/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java +++ b/backend/exence/src/main/java/com/exence/finance/modules/category/entity/Category.java @@ -29,7 +29,6 @@ import static com.exence.finance.common.util.ValidationConstants.CATEGORY_EMOJI_MAX_LENGTH; import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NAME_MAX_LENGTH; import static com.exence.finance.common.util.ValidationConstants.CATEGORY_NOTE_MAX_LENGTH; -import static com.exence.finance.common.util.ValidationConstants.TRANSACTION_NOTE_MAX_LENGTH; @SuperBuilder @Entity From 35107e59c92f830d1e64dc67eeedda4c7d8716c2 Mon Sep 17 00:00:00 2001 From: tamibalogh Date: Tue, 13 Jan 2026 23:14:01 +0100 Subject: [PATCH 4/4] revert prettier formatting --- .../create-category-dialog.component.ts | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts index fba31b9..2da155a 100644 --- a/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts +++ b/frontend/Exence/src/app/private/transactions-and-categories/create-category-dialog/create-category-dialog.component.ts @@ -1,9 +1,5 @@ import { Component, inject } from '@angular/core'; -import { - NonNullableFormBuilder, - ReactiveFormsModule, - Validators, -} from '@angular/forms'; +import { NonNullableFormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -36,19 +32,14 @@ import { CategoryService } from '../../category.service'; ], }) export class CreateCategoryDialogComponent { - private readonly dialogRef = inject( - MatDialogRef, - ); + private readonly dialogRef = inject(MatDialogRef); private readonly categoryService = inject(CategoryService); private readonly fb = inject(NonNullableFormBuilder); data = inject(MAT_DIALOG_DATA); form = this.fb.group({ - name: this.fb.control('', [ - Validators.required, - Validators.maxLength(255), - ]), + name: this.fb.control('', [Validators.required, Validators.maxLength(255)]), emoji: this.fb.control('', [Validators.required]), note: this.fb.control('', [Validators.maxLength(500)]), }); @@ -56,7 +47,7 @@ export class CreateCategoryDialogComponent { emojiInvalid = false; ngOnInit(): void { - this.form.controls.emoji.valueChanges.subscribe((emoji) => { + this.form.controls.emoji.valueChanges.subscribe(emoji => { this.emojiInvalid = !emoji; }); } @@ -85,4 +76,4 @@ export class CreateCategoryDialogComponent { this.dialogRef.close(); } } -} +} \ No newline at end of file