feat(notes): vues structurées tableau/kanban, flashcards et MCP robuste
Some checks failed
CI / Lint, Test & Build (push) Failing after 57s
CI / Deploy production (on server) (push) Has been skipped

Ajoute la base organisable par carnet (schéma, champs partagés, valeurs par note)
avec activation guidée, tableau éditable, kanban et suppression de colonnes.
Corrige le multiselect en vue tableau et enrichit sidebar, grille et i18n FR/EN.
Inclut aussi les améliorations flashcards SM-2, l'audit consentement IA et la
robustesse du serveur MCP (config, validation, rate-limit, métriques).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Antigravity
2026-05-24 23:03:16 +00:00
parent ecd7e57c2e
commit 0784c94242
63 changed files with 10133 additions and 619 deletions

View File

@@ -71,7 +71,10 @@
"sortManual": "Custom order",
"moveFailed": "Failed to move notebook",
"dropToRoot": "Drop here to move to root",
"noReminders": "No active reminders."
"noReminders": "No active reminders.",
"documents": "Documents",
"searchNotebooksPlaceholder": "Search notebooks…",
"clearSearch": "Clear search"
},
"notes": {
"title": "Notes",
@@ -2410,6 +2413,7 @@
"confirmSave": "Save to deck",
"generateFailed": "Could not generate flashcards",
"saveFailed": "Could not save flashcards",
"schemaMissing": "Flashcards are not available yet on this server (database migration pending).",
"savedCount": "{count} flashcards saved",
"cardCount": "Number of cards",
"styleLabel": "Card style",
@@ -2434,6 +2438,10 @@
"cardCountLabel": "{count} cards",
"masteredShort": "mastered",
"viewDeck": "Details",
"hideDeck": "Hide",
"deckCardsEmpty": "This deck has no cards yet.",
"dueBadge": "Due",
"masteredBadge": "Mastered",
"review": "Review",
"startReview": "Start review",
"activeDeck": "Active deck",
@@ -2446,6 +2454,8 @@
"front": "Front",
"back": "Back",
"tapToFlip": "Space or tap to flip",
"gradeSelected": "Saved — {label}",
"ratePrompt": "How well did you remember this card?",
"grade": {
"hard": "Hard (1)",
"difficult": "Difficult (2)",
@@ -2459,8 +2469,161 @@
"heatmapTitle": "Review activity",
"heatmapLast90": "Last 90 days",
"retentionRate": "Retention rate",
"retentionCurve": "Weekly retention",
"difficultCards": "Hardest cards"
"masteredLabel": "{count}/{total} mastered",
"retentionCurve": "Weekly success rate",
"retentionCurveHint": "Based on reviews with grade \u2265 Good (3 or 4)",
"retentionNoDataYet": "Review more cards across multiple weeks to see your retention curve.",
"streak": "Current streak",
"streakDays": "days",
"totalReviewsLabel": "Total reviews",
"totalCardsLabel": "Total cards",
"nextReviewLabel": "Next",
"dueToday": "Due today",
"nextReviewIn": "In {days}d",
"difficultCards": "Hardest cards",
"notebookBadge": "Notebook",
"reviewMode": "Mode",
"reviewModeAll": "All cards",
"reviewModeDue": "Due only",
"sessionStats": "Session summary",
"sessionReviewed": "Cards reviewed",
"sessionNewMastered": "Newly mastered",
"sessionDuration": "Duration",
"editCard": "Edit",
"deleteCard": "Delete card",
"deleteCardConfirm": "Delete this card?",
"deleteDeck": "Delete deck",
"deleteDeckConfirm": "Delete this deck and all its cards permanently?",
"deckDeleted": "Deck deleted",
"cardDeleted": "Card deleted",
"cardSaved": "Card saved",
"cardTypeBadge": "{type}",
"reviewNow": "Review now",
"deleteFailed": "Could not delete"
},
"structuredViews": {
"enableTitle": "Organize this notebook (table, kanban, gallery…)",
"enableLabel": "Organize",
"enabledHint": "Organized mode enabled",
"enabledHintDetail": "Fields show up in each note's Info panel.",
"enableFailed": "Could not enable organized view",
"viewList": "List",
"viewTable": "Table",
"viewTableHint": "Structured table — one row per note, one column per field (status, date…)",
"viewKanban": "Kanban",
"viewGallery": "Gallery",
"viewKanbanHint": "Columns — like Trello to track your notes",
"viewGalleryHint": "Visual cards — browse your notes at a glance",
"intro": {
"databaseTitle": "Organized notebook",
"databaseBody": "Add shared fields (Status, Due date, Priority…) to every note in this notebook. Your note content stays the same — these are shared metadata, like a lightweight Notion database.",
"tableTitle": "Table view",
"tableBody": "All notes as rows, your fields as columns. Edit status or dates inline in the grid.",
"kanbanTitle": "Kanban view",
"kanbanBody": "The same notes as cards grouped in columns (e.g. To do → In progress → Done). Drag and drop to update status.",
"activateTableHint": "We create a default “Status” field. Add more fields anytime with the + button.",
"activateKanbanHint": "We create a “Status” field with three columns. You can rename options or add fields later.",
"enableTable": "Enable table",
"enableKanban": "Enable Kanban",
"enabling": "Enabling…",
"enabledSuccess": "Organized notebook enabled for this notebook"
},
"helpBanner": {
"table": "Table view: one row per note, one column per field. Click a cell to edit. Hover a column header to delete it (trash icon).",
"kanban": "Kanban view: drag a card to change its status. Use + in a column to create a note already classified.",
"dismiss": "Got it"
},
"addPropertyTitle": "Add field",
"addProperty": "Add field",
"addPropertyHint": "The column appears on every note in this notebook, but each note keeps its own value (empty until you fill it in).",
"deleteProperty": "Delete field",
"deletePropertyTitle": "Delete this field?",
"deletePropertyConfirm": "The field \"{name}\" and all its values on notes in this notebook will be removed. This cannot be undone.",
"deletePropertySuccess": "Field deleted",
"cellEmpty": "—",
"multiselectPick": "Choose…",
"propertyName": "Field name",
"propertyType": "Data type",
"selectOptions": "Options (one per line)",
"selectOptionsPlaceholder": "To do\nIn progress\nDone",
"propertiesSection": "Notebook fields",
"noPropertiesYet": "No fields yet.",
"noFilter": "No filter",
"filterContains": "Contains",
"filterEquals": "Equals",
"filterEmpty": "Is empty",
"filterValue": "Filter value…",
"noMatchingNotes": "No notes match this filter.",
"kanbanGroupBy": "Group by",
"kanbanUnassigned": "Unassigned",
"kanbanAllNotes": "All notes",
"kanbanSingleColumnHint": "Your notes are here. For multiple columns (To do, In progress, Done), one click.",
"kanbanAddStatusColumns": "Add Status columns",
"chooseGroupProperty": "Choose grouping field",
"newNoteInColumn": "New note",
"propertyTypes": {
"text": "Text",
"number": "Number",
"date": "Date",
"select": "Single choice",
"multiselect": "Multi-choice",
"checkbox": "Yes/no"
},
"wizard": {
"title": "Organize this notebook",
"subtitle": "Like a light spreadsheet: extra info on each note, without changing the text.",
"stepGoal": "What is this notebook for?",
"stepFields": "Which fields to add?",
"stepView": "How should notes appear?",
"fieldsHint": "A field = a shared column (status, date…). Fill it per note when you want.",
"kanbanNeedsStatus": "Check a single-choice field (e.g. Status) to use Kanban.",
"doneHint": "You can fill fields later — or leave them empty.",
"back": "Back",
"next": "Next",
"finish": "Finish",
"readyToast": "Ready — fill in fields whenever you like.",
"openFromKanban": "Set up with assistant",
"goals": {
"tasks": {
"title": "Track tasks",
"desc": "Status, due date — great for Kanban."
},
"learning": {
"title": "Learn / review",
"desc": "Level, last review — works well as gallery."
},
"reading": {
"title": "Read and collect",
"desc": "Read flag, source — for articles and references."
},
"simple": {
"title": "Just organize",
"desc": "Change views without required fields."
}
},
"fields": {
"status": {
"name": "Status",
"options": "To do\nIn progress\nDone"
},
"dueDate": {
"name": "Due date"
},
"level": {
"name": "Level",
"options": "Beginner\nIntermediate\nAdvanced"
},
"lastReview": {
"name": "Last review"
},
"read": {
"name": "Read"
},
"source": {
"name": "Source"
}
}
}
},
"brainstorm": {
"title": "Waves of Thought",
@@ -3148,4 +3311,4 @@
"uploadFailed": "Upload failed",
"uploading": "Uploading..."
}
}
}