feat: RTL/i18n, AI translate+undo, no-refresh saves, settings perf

- RTL: force dir=rtl on LabelFilter, NotesViewToggle, LabelManagementDialog
- i18n: add missing keys (notifications, privacy, edit/preview, AI translate/undo)
- Settings pages: convert to Server Components (general, appearance) + loading skeleton
- AI menu: add Translate option (10 languages) + Undo AI button in toolbar
- Fix: saveInline uses REST API instead of Server Action → eliminates all implicit refreshes in list mode
- Fix: NotesTabsView notes sync effect preserves selected note on content changes
- Fix: auto-tag suggestions now filter already-assigned labels
- Fix: color change in card view uses local state (no refresh)
- Fix: nav links use <Link> for prefetching (Settings, Admin)
- Fix: suppress duplicate label suggestions already on note
- Route: add /api/ai/translate endpoint
This commit is contained in:
Sepehr Ramezani
2026-04-15 23:48:28 +02:00
parent 39671c6472
commit b6a548acd8
68 changed files with 5014 additions and 485 deletions

File diff suppressed because one or more lines are too long

View File

@@ -275,6 +275,7 @@ exports.Prisma.UserAISettingsScalarFieldEnum = {
fontSize: 'fontSize',
demoMode: 'demoMode',
showRecentNotes: 'showRecentNotes',
notesViewMode: 'notesViewMode',
emailNotifications: 'emailNotifications',
desktopNotifications: 'desktopNotifications',
anonymousAnalytics: 'anonymousAnalytics'

View File

@@ -13554,6 +13554,7 @@ export namespace Prisma {
fontSize: string | null
demoMode: boolean | null
showRecentNotes: boolean | null
notesViewMode: string | null
emailNotifications: boolean | null
desktopNotifications: boolean | null
anonymousAnalytics: boolean | null
@@ -13571,6 +13572,7 @@ export namespace Prisma {
fontSize: string | null
demoMode: boolean | null
showRecentNotes: boolean | null
notesViewMode: string | null
emailNotifications: boolean | null
desktopNotifications: boolean | null
anonymousAnalytics: boolean | null
@@ -13588,6 +13590,7 @@ export namespace Prisma {
fontSize: number
demoMode: number
showRecentNotes: number
notesViewMode: number
emailNotifications: number
desktopNotifications: number
anonymousAnalytics: number
@@ -13607,6 +13610,7 @@ export namespace Prisma {
fontSize?: true
demoMode?: true
showRecentNotes?: true
notesViewMode?: true
emailNotifications?: true
desktopNotifications?: true
anonymousAnalytics?: true
@@ -13624,6 +13628,7 @@ export namespace Prisma {
fontSize?: true
demoMode?: true
showRecentNotes?: true
notesViewMode?: true
emailNotifications?: true
desktopNotifications?: true
anonymousAnalytics?: true
@@ -13641,6 +13646,7 @@ export namespace Prisma {
fontSize?: true
demoMode?: true
showRecentNotes?: true
notesViewMode?: true
emailNotifications?: true
desktopNotifications?: true
anonymousAnalytics?: true
@@ -13731,6 +13737,7 @@ export namespace Prisma {
fontSize: string
demoMode: boolean
showRecentNotes: boolean
notesViewMode: string
emailNotifications: boolean
desktopNotifications: boolean
anonymousAnalytics: boolean
@@ -13765,6 +13772,7 @@ export namespace Prisma {
fontSize?: boolean
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: boolean
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -13783,6 +13791,7 @@ export namespace Prisma {
fontSize?: boolean
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: boolean
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -13801,6 +13810,7 @@ export namespace Prisma {
fontSize?: boolean
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: boolean
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -13830,6 +13840,10 @@ export namespace Prisma {
fontSize: string
demoMode: boolean
showRecentNotes: boolean
/**
* "masonry" = cartes Muuri ; "list" = liste classique
*/
notesViewMode: string
emailNotifications: boolean
desktopNotifications: boolean
anonymousAnalytics: boolean
@@ -14238,6 +14252,7 @@ export namespace Prisma {
readonly fontSize: FieldRef<"UserAISettings", 'String'>
readonly demoMode: FieldRef<"UserAISettings", 'Boolean'>
readonly showRecentNotes: FieldRef<"UserAISettings", 'Boolean'>
readonly notesViewMode: FieldRef<"UserAISettings", 'String'>
readonly emailNotifications: FieldRef<"UserAISettings", 'Boolean'>
readonly desktopNotifications: FieldRef<"UserAISettings", 'Boolean'>
readonly anonymousAnalytics: FieldRef<"UserAISettings", 'Boolean'>
@@ -14771,6 +14786,7 @@ export namespace Prisma {
fontSize: 'fontSize',
demoMode: 'demoMode',
showRecentNotes: 'showRecentNotes',
notesViewMode: 'notesViewMode',
emailNotifications: 'emailNotifications',
desktopNotifications: 'desktopNotifications',
anonymousAnalytics: 'anonymousAnalytics'
@@ -15817,6 +15833,7 @@ export namespace Prisma {
fontSize?: StringFilter<"UserAISettings"> | string
demoMode?: BoolFilter<"UserAISettings"> | boolean
showRecentNotes?: BoolFilter<"UserAISettings"> | boolean
notesViewMode?: StringFilter<"UserAISettings"> | string
emailNotifications?: BoolFilter<"UserAISettings"> | boolean
desktopNotifications?: BoolFilter<"UserAISettings"> | boolean
anonymousAnalytics?: BoolFilter<"UserAISettings"> | boolean
@@ -15835,6 +15852,7 @@ export namespace Prisma {
fontSize?: SortOrder
demoMode?: SortOrder
showRecentNotes?: SortOrder
notesViewMode?: SortOrder
emailNotifications?: SortOrder
desktopNotifications?: SortOrder
anonymousAnalytics?: SortOrder
@@ -15856,6 +15874,7 @@ export namespace Prisma {
fontSize?: StringFilter<"UserAISettings"> | string
demoMode?: BoolFilter<"UserAISettings"> | boolean
showRecentNotes?: BoolFilter<"UserAISettings"> | boolean
notesViewMode?: StringFilter<"UserAISettings"> | string
emailNotifications?: BoolFilter<"UserAISettings"> | boolean
desktopNotifications?: BoolFilter<"UserAISettings"> | boolean
anonymousAnalytics?: BoolFilter<"UserAISettings"> | boolean
@@ -15874,6 +15893,7 @@ export namespace Prisma {
fontSize?: SortOrder
demoMode?: SortOrder
showRecentNotes?: SortOrder
notesViewMode?: SortOrder
emailNotifications?: SortOrder
desktopNotifications?: SortOrder
anonymousAnalytics?: SortOrder
@@ -15897,6 +15917,7 @@ export namespace Prisma {
fontSize?: StringWithAggregatesFilter<"UserAISettings"> | string
demoMode?: BoolWithAggregatesFilter<"UserAISettings"> | boolean
showRecentNotes?: BoolWithAggregatesFilter<"UserAISettings"> | boolean
notesViewMode?: StringWithAggregatesFilter<"UserAISettings"> | string
emailNotifications?: BoolWithAggregatesFilter<"UserAISettings"> | boolean
desktopNotifications?: BoolWithAggregatesFilter<"UserAISettings"> | boolean
anonymousAnalytics?: BoolWithAggregatesFilter<"UserAISettings"> | boolean
@@ -16978,6 +16999,7 @@ export namespace Prisma {
fontSize?: string
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: string
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -16996,6 +17018,7 @@ export namespace Prisma {
fontSize?: string
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: string
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -17012,6 +17035,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean
@@ -17030,6 +17054,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean
@@ -17047,6 +17072,7 @@ export namespace Prisma {
fontSize?: string
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: string
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -17063,6 +17089,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean
@@ -17080,6 +17107,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean
@@ -17946,6 +17974,7 @@ export namespace Prisma {
fontSize?: SortOrder
demoMode?: SortOrder
showRecentNotes?: SortOrder
notesViewMode?: SortOrder
emailNotifications?: SortOrder
desktopNotifications?: SortOrder
anonymousAnalytics?: SortOrder
@@ -17963,6 +17992,7 @@ export namespace Prisma {
fontSize?: SortOrder
demoMode?: SortOrder
showRecentNotes?: SortOrder
notesViewMode?: SortOrder
emailNotifications?: SortOrder
desktopNotifications?: SortOrder
anonymousAnalytics?: SortOrder
@@ -17980,6 +18010,7 @@ export namespace Prisma {
fontSize?: SortOrder
demoMode?: SortOrder
showRecentNotes?: SortOrder
notesViewMode?: SortOrder
emailNotifications?: SortOrder
desktopNotifications?: SortOrder
anonymousAnalytics?: SortOrder
@@ -19613,6 +19644,7 @@ export namespace Prisma {
fontSize?: string
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: string
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -19629,6 +19661,7 @@ export namespace Prisma {
fontSize?: string
demoMode?: boolean
showRecentNotes?: boolean
notesViewMode?: string
emailNotifications?: boolean
desktopNotifications?: boolean
anonymousAnalytics?: boolean
@@ -19947,6 +19980,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean
@@ -19963,6 +19997,7 @@ export namespace Prisma {
fontSize?: StringFieldUpdateOperationsInput | string
demoMode?: BoolFieldUpdateOperationsInput | boolean
showRecentNotes?: BoolFieldUpdateOperationsInput | boolean
notesViewMode?: StringFieldUpdateOperationsInput | string
emailNotifications?: BoolFieldUpdateOperationsInput | boolean
desktopNotifications?: BoolFieldUpdateOperationsInput | boolean
anonymousAnalytics?: BoolFieldUpdateOperationsInput | boolean

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"name": "prisma-client-c6853a2d560fc459913c7f241f4427cd8f8957f5474f01e1a2cabb8c1f55d4d8",
"name": "prisma-client-2331c58c0b3910e5ab8251136c7336826e2ba4756d13e7c07da246b228c31c54",
"main": "index.js",
"types": "index.d.ts",
"browser": "index-browser.js",

View File

@@ -229,6 +229,8 @@ model UserAISettings {
fontSize String @default("medium")
demoMode Boolean @default(false)
showRecentNotes Boolean @default(true)
/// "masonry" = cartes Muuri ; "list" = liste classique
notesViewMode String @default("masonry")
emailNotifications Boolean @default(false)
desktopNotifications Boolean @default(false)
anonymousAnalytics Boolean @default(false)

View File

@@ -275,6 +275,7 @@ exports.Prisma.UserAISettingsScalarFieldEnum = {
fontSize: 'fontSize',
demoMode: 'demoMode',
showRecentNotes: 'showRecentNotes',
notesViewMode: 'notesViewMode',
emailNotifications: 'emailNotifications',
desktopNotifications: 'desktopNotifications',
anonymousAnalytics: 'anonymousAnalytics'

Binary file not shown.

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "UserAISettings" ADD COLUMN "notesViewMode" TEXT NOT NULL DEFAULT 'masonry';

View File

@@ -229,6 +229,8 @@ model UserAISettings {
fontSize String @default("medium")
demoMode Boolean @default(false)
showRecentNotes Boolean @default(true)
/// "masonry" = grille cartes Muuri ; "tabs" = onglets + panneau (type OneNote). Ancienne valeur "list" migrée vers "tabs" en lecture.
notesViewMode String @default("masonry")
emailNotifications Boolean @default(false)
desktopNotifications Boolean @default(false)
anonymousAnalytics Boolean @default(false)