Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ private static string NormalizeDescription(string? description)
}

var trimmed = description.Trim();
return trimmed.Length <= 500 ? trimmed : trimmed.Substring(0, 500);
return trimmed.Length <= 500 ? trimmed : trimmed[..500];
}

private static DateTime EnsureUtc(DateTime value)
Expand Down
2 changes: 1 addition & 1 deletion frontend/codegen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ if (!token) {
}

const config: CodegenConfig = {
schema: buildSchemaConfig(token),
schema: process.env.USE_LOCAL_SCHEMA === 'true' ? './schema.graphql' : buildSchemaConfig(token),
documents: ['src/**/*.graphql'],
generates: {
'./src/generated/graphql.ts': {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
import { toSignal } from '@angular/core/rxjs-interop';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
Expand Down Expand Up @@ -67,13 +67,11 @@ export class AddEntry {
recurrenceEndDate: [this.initialValue.recurrenceEndDate],
});

private readonly formInvalidSignal = toSignal(
readonly isSubmitDisabled = toSignal(
this.financeRecordForm.statusChanges.pipe(map(() => this.financeRecordForm.invalid)),
{ initialValue: this.financeRecordForm.invalid },
);

readonly isSubmitDisabled = computed(() => this.formInvalidSignal());

readonly isRecurringSignal = toSignal(this.financeRecordForm.controls.recurring.valueChanges, {
initialValue: this.initialValue.recurring,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ class ConfiguratorComponent implements OnInit {
panelClass: 'add-entry-dialog',
});

dialogRef.afterClosed().subscribe((result: FinanceRecord | undefined) => {
dialogRef.afterClosed().subscribe(async (result: FinanceRecord | undefined) => {
if (result) {
this.financeRecordService.createFinanceRecord(result);
await this.financeRecordService.createFinanceRecord(result);
}
});
}
Expand Down
48 changes: 25 additions & 23 deletions frontend/src/app/models/finance-record/finance-record-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export class FinanceRecordService {
amount: record.amount,
currency: record.currency,
date: record.date.toISOString(),
recurrenceFrequency: record.recurrenceFrequency ?? RecurrenceFrequency.NONE,
recurrenceFrequency: record.recurrenceFrequency,
recurrenceEndDate: record.recurrenceEndDate
? record.recurrenceEndDate.toISOString()
: undefined,
Expand All @@ -47,34 +47,36 @@ export class FinanceRecordService {
}),
);

if (result) {
this._selectedFinanceRecord.set({
id: result.data?.createFinanceRecord.id ?? 0,
name: result.data?.createFinanceRecord.name ?? '',
description: result.data?.createFinanceRecord.description ?? '',
amount: result.data?.createFinanceRecord.amount ?? 0,
currency: result.data?.createFinanceRecord.currency ?? '',
date: new Date(result.data?.createFinanceRecord.date ?? ''),
recurring: result.data?.createFinanceRecord.isRecurring ?? false,
});
this._financeRecords.update((prev) => [
...prev,
{
id: result.data?.createFinanceRecord.id ?? 0,
name: result.data?.createFinanceRecord.name ?? '',
description: result.data?.createFinanceRecord.description ?? '',
amount: result.data?.createFinanceRecord.amount ?? 0,
currency: result.data?.createFinanceRecord.currency ?? '',
date: new Date(result.data?.createFinanceRecord.date ?? ''),
recurring: result.data?.createFinanceRecord.isRecurring ?? false,
},
]);
if (result?.data?.createFinanceRecord) {
const newRecord = this.mapToFinanceRecord(result.data.createFinanceRecord);
this._selectedFinanceRecord.set(newRecord);
this._financeRecords.update((prev) => [...prev, newRecord]);
} else {
this._error.set('Failed to create finance record');
}
this._loading.set(false);
}

private mapToFinanceRecord(data: {
id: number;
name: string;
description: string;
amount: number;
currency: string;
date: any;
Copy link

Copilot AI Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The date parameter type should be string instead of any since GraphQL returns ISO date strings. This provides better type safety and makes the conversion on line 75 more explicit.

Suggested change
date: any;
date: string;

Copilot uses AI. Check for mistakes.
isRecurring: boolean;
}): FinanceRecord {
Comment on lines +60 to +68
Copy link

Copilot AI Nov 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Consider extracting the inline type definition for the data parameter into a separate type or interface (e.g., CreateFinanceRecordResponse). This would improve reusability if the mapping needs to be used elsewhere and make the type definition more maintainable.

Copilot uses AI. Check for mistakes.
return {
id: data.id,
name: data.name,
description: data.description,
amount: data.amount,
currency: data.currency,
date: new Date(data.date),
recurring: data.isRecurring,
};
}

async getFinanceRecords(): Promise<void> {
this._loading.set(true);
this._error.set(null);
Expand Down
Loading