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
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [todo] Added server-side deletion for shared lists - when a shared list is deleted, it's removed from the backend.
- [todo] Added cross-user deletion detection - automatically removes shared lists from all users when deleted by another user.
- [todo] Added notification when a shared list is deleted by another user, with automatic list selection fallback.
- [todo] Added categories history tracking - all used categories are now stored in a persistent list similar to todo history.
- [todo] Added TodoCategories component displaying all categories with individual delete buttons and clear all functionality, positioned side-by-side with history on larger screens and stacked on mobile. Category tags and delete button are also responsive (side-by-side on desktop, stacked on mobile).
- [todo] Added Tab key autocomplete for category input fields using existing categories with visual hint showing matched category.
- [todo] Added click-to-insert functionality - clicking a category from the history inserts it into the focused category input field.
- [memorandum] Added "Copy link URL" option to link context menu for easy URL copying to clipboard.
- [memorandum] Added arrow-based reordering system with up/down buttons and "Move to Top/Bottom" context menu options for folders and links.
- [memorandum] Added editable preset overlay with JSON validation, allowing direct editing of preset configuration with real-time validation and sync to localStorage/cloud.
- [global] Added new setting to adjust background color if plain style is selected.

### Changed

- [todo] Added collapsible input section on mobile - a chevron toggle button next to the list name (visible only on phone) allows hiding/showing the History/Categories/Toggle/Input controls, giving more screen space to the todo list.
- [todo] Refactored history and categories from inline accordions to modal dialogs for cleaner UI and better mobile experience.
- [todo] Improved layout - todo list now takes remaining vertical space and scrolls independently with fixed header controls.
- [todo] Redesigned TodoInputSection as static section with modal trigger buttons instead of accordion.
- [todo] Refactored TodoItemList to display as modal component instead of inline accordion.
- [todo] Redesigned clear history and clear categories buttons - moved to modal with dedicated "Clear all" button.
- [backend] Updated all backend dependencies to latest compatible versions: NX 20.8.2 → 22.5.2, TypeScript 5.8.3 → 5.9.3, @swc/core 1.11.x → 1.15.13, NestJS packages to 11.1.14, Fastify 5.0.0 → 5.7.4, pino-http 10.2.0 → 11.0.0, cron 3.x → 4.4.0, and 50+ other packages.
- [backend] Upgraded Mongoose from 8.1.1 to 9.2.2 with complete API migration (FilterQuery → mongodb.Filter) across 10 files.
- [backend] Upgraded Jest from 29.7.0 to 30.2.0 with API migration (toThrowError → toThrow).
Expand Down Expand Up @@ -71,11 +81,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Removed

- [todo] Removed `amount` field from todo list entries completely - frontend types, components, input fields, translations, backend DTO, Mongoose schemas, and test data.
- [global] Removed Renovate bot - dependencies will be managed manually going forward.
- [memorandum] Removed drag-and-drop functionality for folders and links.

### Fixed

- [todo] Fixed double checkbox in todo items - removed redundant hidden native input that caused `todoChecked` to fire twice on click.
- [todo] Fixed History and Categories modals opening simultaneously - each modal now closes the other before opening.
- [todo] Fixed category click-to-insert from Categories modal not working - modal focus steal caused focus-based detection to fail; replaced with explicit context tracking (`lastCategoryInputContext`) captured before the modal opens.

- [frontend] Fixed Safari/iPhone "Cannot access uninitialized variable" error by refactoring applications.ts to eliminate top-level await and use Proxy pattern with async initialization.
- [backend] Fixed 5 security vulnerabilities through dependency updates (21 → 16 vulnerabilities, 24% reduction).
- [backend] Fixed TypeScript 5.9 stricter type checking in OCR service (Buffer → Uint8Array conversion for Blob constructor).
Expand Down
15 changes: 10 additions & 5 deletions backend/libs/shared/common/types/src/lib/todo.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@ export class TodoItemDto {
@IsBoolean()
done?: boolean;

@ApiProperty({ description: 'Todo item amount', required: false })
@IsOptional()
@IsString()
amount?: string;

@ApiProperty({ description: 'Todo item category', required: false })
@IsOptional()
@IsString()
Expand Down Expand Up @@ -53,6 +48,11 @@ export class SharedTodoListDto {
@IsArray()
history?: string[];

@ApiProperty({ description: 'Categories used in todos', type: [String], required: false })
@IsOptional()
@IsArray()
categories?: string[];

@ApiProperty({ description: 'Version for optimistic locking' })
@IsNumber()
version: number;
Expand Down Expand Up @@ -116,6 +116,11 @@ export class UpdateSharedTodoListInputDto {
@IsArray()
history?: string[];

@ApiProperty({ description: 'Categories used in todos', type: [String], required: false })
@IsOptional()
@IsArray()
categories?: string[];

@ApiProperty({ description: 'Current version for optimistic locking' })
@IsNumber()
version: number;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ class TodoItem {
@Prop({ required: false })
done?: boolean;

@Prop({ required: false })
amount?: string;

@Prop({ required: false })
category?: string;
}
Expand All @@ -36,6 +33,9 @@ export class SharedTodoList {
@Prop({ type: [String], required: false, default: [] })
history?: string[];

@Prop({ type: [String], required: false, default: [] })
categories?: string[];

@Prop({ type: Number, required: true, default: 1 })
version!: number;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ describe('TodoController', () => {
id: 'todo-1',
title: 'Test Todo',
done: false,
amount: '1x',
category: 'Test',
},
],
Expand Down Expand Up @@ -157,7 +156,6 @@ describe('TodoController', () => {
id: 'todo-1',
title: 'Updated Todo',
done: true,
amount: '2x',
category: 'Updated',
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ class TodoItem {
@Prop({ required: false })
done?: boolean;

@Prop({ required: false })
amount?: string;

@Prop({ required: false })
category?: string;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ describe('TodoPersistenceService', () => {
id: 'todo-1',
title: 'Test Todo',
done: false,
amount: '1x',
category: 'Test',
},
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ describe('TodoProviderService', () => {
id: 'todo-1',
title: 'Test Todo',
done: false,
amount: '1x',
category: 'Test',
},
],
Expand Down Expand Up @@ -208,7 +207,6 @@ describe('TodoProviderService', () => {
id: 'todo-1',
title: 'Updated Todo',
done: true,
amount: '2x',
category: 'Updated',
},
],
Expand Down
2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,4 @@
"socket.io-client": "^4.8.1",
"sveltekit-i18n": "^2.4.2"
}
}
}
1 change: 1 addition & 0 deletions frontend/src/lib/api/todo.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export const updateSharedTodoList = async (
emoji: string;
todos: any[];
history: string[];
categories: string[];
version: number;
},
): Promise<{ status: number; data: SharedTodoListResponse | null }> => {
Expand Down
Loading
Loading