@nightkatana/kronosys-app 1.0.0-beta.2 → 1.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -1
- package/app/api/action/route.ts +39 -3
- package/app/api/action-logs/route.ts +24 -0
- package/app/api/backup/route.ts +1 -1
- package/app/api/restore/route.ts +145 -0
- package/app/changelog/page.tsx +71 -4
- package/app/globals.css +127 -0
- package/app/guide/page.tsx +61 -15
- package/app/implementation/page.tsx +700 -0
- package/app/layout.tsx +14 -3
- package/app/licenses/page.tsx +99 -37
- package/app/logs/page.tsx +258 -0
- package/app/manifest.ts +5 -5
- package/app/page.tsx +784 -229
- package/app/reporting/page.tsx +1266 -474
- package/app/settings/page.tsx +252 -18
- package/bin/kronosys.mjs +140 -15
- package/components/KronosysPayloadProvider.tsx +2 -0
- package/components/RouteTransition.tsx +18 -0
- package/components/dashboard/AppShellCommandCenterPlaceholder.tsx +17 -0
- package/components/dashboard/AppShellHeaderSessionMeta.tsx +210 -0
- package/components/dashboard/AppShellHeaderWallClock.tsx +54 -0
- package/components/dashboard/AppShellLiveSessionDrawer.tsx +154 -38
- package/components/dashboard/AppShellRouteNav.tsx +323 -48
- package/components/dashboard/DashboardPauseBackdrop.tsx +50 -0
- package/components/dashboard/DashboardSimpleModal.tsx +168 -25
- package/components/dashboard/DashboardTour.tsx +115 -29
- package/components/dashboard/GlobalPauseConfirmModal.tsx +183 -0
- package/components/dashboard/KronosysDatetimePopoverField.tsx +167 -122
- package/components/dashboard/KronosysTimePopoverField.tsx +54 -12
- package/components/dashboard/NewSessionScopeModal.tsx +211 -20
- package/components/dashboard/PlannedTaskBoundaryConflictWatcher.tsx +275 -0
- package/components/dashboard/ReportingTour.tsx +87 -21
- package/components/dashboard/SavedProjectPicker.tsx +16 -3
- package/components/dashboard/SelectedSessionSidebarBlock.tsx +512 -142
- package/components/dashboard/SessionListPanel.tsx +327 -44
- package/components/dashboard/SettingsTagsProjectsSection.tsx +1073 -264
- package/components/dashboard/SettingsTaskTemplatesSection.tsx +316 -0
- package/components/dashboard/SettingsTour.tsx +86 -21
- package/components/dashboard/TagPills.tsx +14 -1
- package/components/dashboard/TaskFocusPanel.tsx +1081 -478
- package/components/dashboard/TaskSessionLiveCard.tsx +650 -135
- package/components/dashboard/TaskTimelineGanttModal.tsx +601 -0
- package/components/dashboard/taskFieldStyles.ts +20 -4
- package/components/dashboard/useReportingInteractionState.ts +80 -0
- package/lib/appShellHeaderClasses.ts +13 -0
- package/lib/businessRulesMatrix.ts +210 -0
- package/lib/copyToClipboard.ts +43 -0
- package/lib/dashboardCopy.ts +494 -84
- package/lib/dashboardQuickSearch.ts +54 -2
- package/lib/dashboardTimeZone.ts +109 -0
- package/lib/formatAppShellWallClock.ts +66 -0
- package/lib/formatSessionNameTemplate.ts +141 -0
- package/lib/generatedUserChangelog.ts +177 -6
- package/lib/globalPausePreview.ts +292 -0
- package/lib/implementationNotes.ts +1188 -0
- package/lib/kronosysApi.ts +6 -0
- package/lib/kronosysDashboardModalGates.ts +24 -0
- package/lib/plannedBoundaryAttention.ts +9 -0
- package/lib/plannedBoundaryConflict.ts +23 -0
- package/lib/reportingAggregate.ts +517 -75
- package/lib/reportingMetricHelp.ts +8 -0
- package/lib/reportingStrings.ts +37 -3
- package/lib/sessionListMerge.ts +4 -0
- package/lib/sessionTaskSidebarStats.ts +182 -21
- package/lib/settingsCopy.ts +178 -4
- package/lib/taskParsing.ts +360 -103
- package/lib/taskTemplateDraft.ts +135 -0
- package/lib/taskTimelineGantt.ts +265 -0
- package/lib/temporalDisplayPlanned.ts +71 -0
- package/lib/userGuideCopy.ts +121 -47
- package/next.config.ts +7 -0
- package/package.json +12 -24
- package/server/actionDispatch.ts +1000 -77
- package/server/actionTaskSession.ts +337 -24
- package/server/db.ts +7 -15
- package/server/dbSchema.ts +24 -0
- package/server/defaultCfg.ts +5 -0
- package/server/gitlabTokenStore.ts +0 -12
- package/server/liveHistorySync.ts +53 -0
- package/server/mainTimerHydrate.ts +38 -2
- package/server/payloadStore.ts +33 -11
- package/server/sessionWallHydrate.ts +66 -3
- package/server/userActionLog.ts +126 -0
- package/sonar-project.properties +11 -0
- package/tsconfig.json +2 -1
- package/components/dashboard/IssuePickerModal.tsx +0 -168
- package/components/dashboard/ThemeToggle.test.tsx +0 -26
- package/lib/backupCsvExport.test.ts +0 -149
- package/lib/dashboardQuickSearchQuery.test.ts +0 -63
- package/lib/dataDir.test.ts +0 -87
- package/lib/formatIsoShort.test.ts +0 -46
- package/lib/kronoFocusRhythm.test.ts +0 -130
- package/lib/kronoFocusTimerUrgency.test.ts +0 -74
- package/lib/legacyKronoFocusStorageKeys.test.ts +0 -29
- package/lib/reportingAggregate.test.ts +0 -325
- package/lib/reportingNonFinalIndicators.test.ts +0 -157
- package/lib/reportingTagWeekBreakdown.test.ts +0 -141
- package/lib/reportingWeekLayout.test.ts +0 -239
- package/lib/sessionAssiduity.test.ts +0 -25
- package/lib/sessionEndWarnings.test.ts +0 -200
- package/lib/sessionListMerge.test.ts +0 -101
- package/lib/sessionTaskSidebarStats.test.ts +0 -24
- package/lib/taskParsing.test.ts +0 -153
- package/lib/usageProfile.test.ts +0 -84
- package/server/actionDispatch.test.ts +0 -723
- package/server/actionTaskSession.test.ts +0 -713
- package/server/kronoFocusHydrate.test.ts +0 -142
- package/server/kronoFocusMigrate.test.ts +0 -53
- package/server/mainTimerHydrate.test.ts +0 -65
- package/server/payloadStore.test.ts +0 -78
- package/server/sessionWallHydrate.test.ts +0 -46
package/lib/settingsCopy.ts
CHANGED
|
@@ -85,6 +85,17 @@ export type SettingsCopy = {
|
|
|
85
85
|
dangerClearHistoryBackupCsvStoreBlobs: string;
|
|
86
86
|
dangerClearHistoryBackupSqlite: string;
|
|
87
87
|
dangerClearHistoryBackupSqliteHint: string;
|
|
88
|
+
dangerBackupRestoreTitle: string;
|
|
89
|
+
dangerBackupRestoreIntro: string;
|
|
90
|
+
dangerRestorePickFile: string;
|
|
91
|
+
dangerRestoreHint: string;
|
|
92
|
+
dangerRestoreButton: string;
|
|
93
|
+
dangerRestoreBusy: string;
|
|
94
|
+
dangerRestoreConfirm: string;
|
|
95
|
+
dangerRestoreNoFile: string;
|
|
96
|
+
dangerRestoreDoneJson: string;
|
|
97
|
+
dangerRestoreDoneSqlite: string;
|
|
98
|
+
dangerRestoreFailed: string;
|
|
88
99
|
sectionArchivedSessions: string;
|
|
89
100
|
archivedSessionsIntro: string;
|
|
90
101
|
archivesPaginationPrev: string;
|
|
@@ -111,6 +122,24 @@ export type SettingsCopy = {
|
|
|
111
122
|
devDataHiddenNotDev: string;
|
|
112
123
|
sectionWorkspaceLoc: string;
|
|
113
124
|
sectionTagsProjects: string;
|
|
125
|
+
sectionTaskTemplates: string;
|
|
126
|
+
taskTemplatesIntro: string;
|
|
127
|
+
taskTemplatesHelpAria: string;
|
|
128
|
+
taskTemplatesHelpBody: string;
|
|
129
|
+
taskTemplatesEmpty: string;
|
|
130
|
+
taskTemplatesDraftPlaceholder: string;
|
|
131
|
+
taskTemplatesAddBtn: string;
|
|
132
|
+
taskTemplatesSavedToast: string;
|
|
133
|
+
taskTemplatesRemovedToast: string;
|
|
134
|
+
taskTemplatesUpdatedToast: string;
|
|
135
|
+
taskTemplatesColDraft: string;
|
|
136
|
+
taskTemplatesColUpdated: string;
|
|
137
|
+
taskTemplatesColActions: string;
|
|
138
|
+
taskTemplatesEditBtn: string;
|
|
139
|
+
taskTemplatesSaveBtn: string;
|
|
140
|
+
taskTemplatesCancelBtn: string;
|
|
141
|
+
taskTemplatesDeleteBtn: string;
|
|
142
|
+
taskTemplatesDeleteConfirm: string;
|
|
114
143
|
tagsProjectsIntro: string;
|
|
115
144
|
tagsProjectsHelpAria: string;
|
|
116
145
|
/** Aide longue : impact masquage / épingle / projets (sauts de ligne possibles). */
|
|
@@ -152,6 +181,10 @@ export type SettingsCopy = {
|
|
|
152
181
|
tagPurgeHiddenConfirm: string;
|
|
153
182
|
/** aria-label : effacer une étiquette masquée et toute sa métadonnée. */
|
|
154
183
|
tagPurgeHiddenAriaLabel: string;
|
|
184
|
+
tagRenameBtn: string;
|
|
185
|
+
tagRenamePrompt: string;
|
|
186
|
+
tagRenameImpactConfirm: string;
|
|
187
|
+
renameImpactDontShowAgain: string;
|
|
155
188
|
tagUnpinConfirm: string;
|
|
156
189
|
tagExcludeConfirm: string;
|
|
157
190
|
projectsHeading: string;
|
|
@@ -160,7 +193,13 @@ export type SettingsCopy = {
|
|
|
160
193
|
/** `aria-label` du (?) à côté de « Projets enregistrés » (intro + suppression). */
|
|
161
194
|
projectsHelpAria: string;
|
|
162
195
|
projectsHelpBody: string;
|
|
196
|
+
projectsAddFieldLabel: string;
|
|
197
|
+
projectsAddPlaceholder: string;
|
|
198
|
+
projectsAddBtn: string;
|
|
163
199
|
projectsTableProjectCol: string;
|
|
200
|
+
projectsRenameBtn: string;
|
|
201
|
+
projectsRenamePrompt: string;
|
|
202
|
+
projectRenameImpactConfirm: string;
|
|
164
203
|
/** aria-label : effacer le projet et les métadonnées associées (étiquettes scoped, etc.). */
|
|
165
204
|
projectsRemoveBtn: string;
|
|
166
205
|
/** Confirmation pour l’effacement complet d’un projet. */
|
|
@@ -182,6 +221,13 @@ export type SettingsCopy = {
|
|
|
182
221
|
tagStartTaskConflictParallelBtn: string;
|
|
183
222
|
/** Case à cocher : mémoriser le choix pour les prochains démarrages. */
|
|
184
223
|
tagStartTaskConflictDontShowAgain: string;
|
|
224
|
+
tagsScopeToolHeading: string;
|
|
225
|
+
tagsScopeToolSourceLabel: string;
|
|
226
|
+
tagsScopeToolTargetProjectLabel: string;
|
|
227
|
+
tagsScopeToolTargetGlobalOption: string;
|
|
228
|
+
tagsScopeToolCopyBtn: string;
|
|
229
|
+
tagsScopeToolMoveBtn: string;
|
|
230
|
+
tagsScopeToolNoTags: string;
|
|
185
231
|
tagsEmptyGlobal: string;
|
|
186
232
|
tagsByProjectSectionEmpty: string;
|
|
187
233
|
tagsByProjectSubEmpty: string;
|
|
@@ -370,6 +416,9 @@ export type SettingsCopy = {
|
|
|
370
416
|
dashboardClockFormatDesc: string;
|
|
371
417
|
dashboardClock24hOption: string;
|
|
372
418
|
dashboardClock12hOption: string;
|
|
419
|
+
/** Gabarit du nom initial des nouvelles sessions (`%%`, `%UUID`, strftime). */
|
|
420
|
+
dashboardDefaultSessionNameTemplate: string;
|
|
421
|
+
dashboardDefaultSessionNameTemplateDesc: string;
|
|
373
422
|
/** Erreur de validation du fuseau (IANA inconnu). */
|
|
374
423
|
invalidDashboardTimeZone: string;
|
|
375
424
|
/** Sommaire : sous-entrée sous « Tableau de bord web ». */
|
|
@@ -390,7 +439,11 @@ export type SettingsCopy = {
|
|
|
390
439
|
tagsProjectsTabGlobal: string;
|
|
391
440
|
/** Onglet 2 : projets enregistrés + étiquettes liées par projet. */
|
|
392
441
|
tagsProjectsTabProjects: string;
|
|
442
|
+
/** Onglet 3 : modèles de tâche enregistrés. */
|
|
443
|
+
tagsProjectsTabTemplates: string;
|
|
393
444
|
tocSubSessionDurationAlert: string;
|
|
445
|
+
/** Sommaire : gabarit du nom de session. */
|
|
446
|
+
tocSubDefaultSessionNameTemplate: string;
|
|
394
447
|
dashboardSessionDurationAlertHours: string;
|
|
395
448
|
dashboardSessionDurationAlertHoursDesc: string;
|
|
396
449
|
dashboardTourBlockTitle: string;
|
|
@@ -455,10 +508,10 @@ const en: SettingsCopy = {
|
|
|
455
508
|
"Shows controls to edit a session start time from the Sessions column for the live session or a historical session.",
|
|
456
509
|
dashboardAllowTaskEndTimeEdit: "Allow task end-time correction in the dashboard",
|
|
457
510
|
dashboardAllowTaskEndTimeEditDesc:
|
|
458
|
-
"Shows controls to edit
|
|
511
|
+
"Shows controls to set or edit task end time in the Tasks column, including while a task is running (the task completes automatically when that planned end is reached).",
|
|
459
512
|
dashboardAllowSessionEndTimeEdit: "Allow session end-time correction in the dashboard",
|
|
460
513
|
dashboardAllowSessionEndTimeEditDesc:
|
|
461
|
-
"Shows controls to edit a session end time in the Sessions column
|
|
514
|
+
"Shows controls to set or edit a session end time in the Sessions column, including while a live session is open (the session closes automatically when that planned end is reached).",
|
|
462
515
|
sectionCollection: "Collection & buffers",
|
|
463
516
|
sectionHistory: "Session history",
|
|
464
517
|
sectionDangerZone: "Danger zone",
|
|
@@ -505,6 +558,22 @@ const en: SettingsCopy = {
|
|
|
505
558
|
dangerClearHistoryBackupCsvStoreBlobs: "Config & snapshots — `cfg`, Git stats, workspace LOC, UI prefs",
|
|
506
559
|
dangerClearHistoryBackupSqlite: "SQLite — database file",
|
|
507
560
|
dangerClearHistoryBackupSqliteHint: "Raw kronosys.sqlite after a WAL checkpoint (restore by replacing the file when the app is stopped).",
|
|
561
|
+
dangerBackupRestoreTitle: "Backups and full restore",
|
|
562
|
+
dangerBackupRestoreIntro:
|
|
563
|
+
"Download a full backup first, then restore from a previous backup file when needed (JSON snapshot or SQLite file).",
|
|
564
|
+
dangerRestorePickFile: "Restore file (`.json` or `.sqlite`)",
|
|
565
|
+
dangerRestoreHint:
|
|
566
|
+
"Restoring replaces the current local store on this machine. Create a backup right before restoring if you are unsure.",
|
|
567
|
+
dangerRestoreButton: "Restore from backup…",
|
|
568
|
+
dangerRestoreBusy: "Restoring…",
|
|
569
|
+
dangerRestoreConfirm:
|
|
570
|
+
"Restore this backup file now? The current local data store will be replaced for this environment.",
|
|
571
|
+
dangerRestoreNoFile: "Choose a backup file before starting restore.",
|
|
572
|
+
dangerRestoreDoneJson:
|
|
573
|
+
"Restore completed from JSON snapshot. The dashboard data has been reloaded.",
|
|
574
|
+
dangerRestoreDoneSqlite:
|
|
575
|
+
"Restore completed from SQLite file. The dashboard data has been reloaded.",
|
|
576
|
+
dangerRestoreFailed: "Restore failed: {detail}",
|
|
508
577
|
sectionArchivedSessions: "Archived sessions",
|
|
509
578
|
archivedSessionsIntro:
|
|
510
579
|
"Sessions hidden from the main dashboard list, newest first. Restore adds them back to the Sessions column.",
|
|
@@ -533,6 +602,26 @@ const en: SettingsCopy = {
|
|
|
533
602
|
devDataHiddenNotDev: "This block is only shown when the dashboard is served in development mode (`next dev`).",
|
|
534
603
|
sectionWorkspaceLoc: "Reporting — workspace code snapshot",
|
|
535
604
|
sectionTagsProjects: "Tags & saved projects",
|
|
605
|
+
sectionTaskTemplates: "Task templates",
|
|
606
|
+
taskTemplatesIntro:
|
|
607
|
+
"Saved lines for the “what are you working on” field (title, optional #tags and @project). You can still save a template from an active or completed task on the dashboard.",
|
|
608
|
+
taskTemplatesHelpAria: "Help: task templates",
|
|
609
|
+
taskTemplatesHelpBody:
|
|
610
|
+
"Templates only prefill the task draft — they do not start a timer or change recorded tasks.\n\nUse the same syntax as on the dashboard: a title, optional #tags, optional @project. Editing or deleting a template does not modify existing sessions or tasks.",
|
|
611
|
+
taskTemplatesEmpty: "No task templates yet. Add one above or save one from the dashboard.",
|
|
612
|
+
taskTemplatesDraftPlaceholder: "e.g. Deep work #focus @acme",
|
|
613
|
+
taskTemplatesAddBtn: "Add template",
|
|
614
|
+
taskTemplatesSavedToast: "Task template saved.",
|
|
615
|
+
taskTemplatesRemovedToast: "Task template removed.",
|
|
616
|
+
taskTemplatesUpdatedToast: "Task template updated.",
|
|
617
|
+
taskTemplatesColDraft: "Template",
|
|
618
|
+
taskTemplatesColUpdated: "Updated",
|
|
619
|
+
taskTemplatesColActions: "Actions",
|
|
620
|
+
taskTemplatesEditBtn: "Edit template",
|
|
621
|
+
taskTemplatesSaveBtn: "Save changes",
|
|
622
|
+
taskTemplatesCancelBtn: "Cancel",
|
|
623
|
+
taskTemplatesDeleteBtn: "Delete template",
|
|
624
|
+
taskTemplatesDeleteConfirm: "Remove this task template from the saved list?",
|
|
536
625
|
tagsProjectsIntro:
|
|
537
626
|
"Manage global tags, saved projects, and project-linked tags separately. The same controls appear in the right column on the main dashboard. Actions here do not bulk-edit tasks or session files.",
|
|
538
627
|
tagsProjectsHelpAria: "Help: impact of tag and project changes",
|
|
@@ -569,6 +658,11 @@ const en: SettingsCopy = {
|
|
|
569
658
|
tagPurgeHiddenConfirm:
|
|
570
659
|
"Remove this tag from the hidden list and clear its description? If tasks still use it, it can show again in shortcuts. Tasks are not modified.",
|
|
571
660
|
tagPurgeHiddenAriaLabel: "Permanently delete this hidden tag’s metadata",
|
|
661
|
+
tagRenameBtn: "Rename tag",
|
|
662
|
+
tagRenamePrompt: "New tag name",
|
|
663
|
+
tagRenameImpactConfirm:
|
|
664
|
+
"Rename this tag everywhere? Reporting and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",
|
|
665
|
+
renameImpactDontShowAgain: "Remember this choice and don’t show again",
|
|
572
666
|
tagUnpinConfirm: "Remove this tag from your pinned list? It may still appear if used on tasks.",
|
|
573
667
|
tagExcludeConfirm:
|
|
574
668
|
"Hide this tag from dashboard shortcuts? Task and session data are not changed; existing tasks keep the tag and reporting can still count it.",
|
|
@@ -577,7 +671,14 @@ const en: SettingsCopy = {
|
|
|
577
671
|
projectsHelpAria: "Help: saved projects",
|
|
578
672
|
projectsHelpBody:
|
|
579
673
|
"Deleting a project (trash icon) removes it from the saved list, clears its description, and purges metadata for tags stored as Project#… for that project. Tasks are not modified; any task that still references @project keeps it.",
|
|
674
|
+
projectsAddFieldLabel: "Add a project",
|
|
675
|
+
projectsAddPlaceholder: "e.g. ClientABC",
|
|
676
|
+
projectsAddBtn: "Add project",
|
|
580
677
|
projectsTableProjectCol: "Project",
|
|
678
|
+
projectsRenameBtn: "Rename project",
|
|
679
|
+
projectsRenamePrompt: "New project name",
|
|
680
|
+
projectRenameImpactConfirm:
|
|
681
|
+
"Rename this project everywhere? Reporting by project and historical task breakdowns will now use the new name. Existing sessions and task entries will be updated.",
|
|
581
682
|
projectsRemoveBtn: "Delete project and related tag metadata",
|
|
582
683
|
projectRemoveConfirm:
|
|
583
684
|
"Permanently delete this project’s metadata? It will be removed from the saved list, its description cleared, and pinned/hidden/description data for tags in the form Project#… under this project will be removed. Tasks are not modified.",
|
|
@@ -596,6 +697,13 @@ const en: SettingsCopy = {
|
|
|
596
697
|
tagStartTaskConflictParallelBtn: "Start in parallel (keep timers running)",
|
|
597
698
|
tagStartTaskConflictDontShowAgain:
|
|
598
699
|
"Remember this choice and don’t show this dialog again (the same action will run automatically next time).",
|
|
700
|
+
tagsScopeToolHeading: "Tag scope migration",
|
|
701
|
+
tagsScopeToolSourceLabel: "Source tag",
|
|
702
|
+
tagsScopeToolTargetProjectLabel: "Target project scope",
|
|
703
|
+
tagsScopeToolTargetGlobalOption: "Global (no project)",
|
|
704
|
+
tagsScopeToolCopyBtn: "Copy to target scope",
|
|
705
|
+
tagsScopeToolMoveBtn: "Move to target scope",
|
|
706
|
+
tagsScopeToolNoTags: "No known tag available to migrate yet.",
|
|
599
707
|
tagsEmptyGlobal: "No global tags in shortcuts yet. Pin one above or add #tags on tasks.",
|
|
600
708
|
tagsByProjectSectionEmpty: "No project-linked tags in shortcuts yet. Use @Project#code on a task or pin one below.",
|
|
601
709
|
tagsByProjectSubEmpty: "No linked tag for this project in shortcuts yet.",
|
|
@@ -621,7 +729,9 @@ const en: SettingsCopy = {
|
|
|
621
729
|
tagsProjectsTabsAriaLabel: "Tags column sections",
|
|
622
730
|
tagsProjectsTabGlobal: "Global tags",
|
|
623
731
|
tagsProjectsTabProjects: "Projects & linked tags",
|
|
732
|
+
tagsProjectsTabTemplates: "Task templates",
|
|
624
733
|
tocSubSessionDurationAlert: "Session duration alert",
|
|
734
|
+
tocSubDefaultSessionNameTemplate: "Default session name",
|
|
625
735
|
dashboardSessionDurationAlertHours: "Session duration alert (hours)",
|
|
626
736
|
dashboardSessionDurationAlertHoursDesc:
|
|
627
737
|
"Wall-clock session duration in the dashboard sidebar: when it reaches this many hours or more, the value is shown in red with a slow blink. Default: 24. Range: 1–8760.",
|
|
@@ -823,6 +933,9 @@ const en: SettingsCopy = {
|
|
|
823
933
|
"How times are shown on the dashboard (task start/end, past-task date preview) and in schedule time previews. Dates are unchanged.",
|
|
824
934
|
dashboardClock24hOption: "24-hour",
|
|
825
935
|
dashboardClock12hOption: "12-hour (AM/PM)",
|
|
936
|
+
dashboardDefaultSessionNameTemplate: "Default new session name template",
|
|
937
|
+
dashboardDefaultSessionNameTemplateDesc:
|
|
938
|
+
"Applied when a brand-new live session is created (dashboard “New session”, or the implicit session when the first task starts with no session yet). Leave empty to leave the name blank. Tokens: `%%` for a literal percent; `%UUID` for the full session id; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` plus `%F` (same as `%Y-%m-%d`) follow POSIX strftime semantics (IEEE / Open Group reference: https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Note: `%m` is the month; `%M` is minutes. Expansion uses the Display time zone chosen above (consistent with dashboard reporting day buckets).",
|
|
826
939
|
invalidDashboardTimeZone: "Unrecognized time zone. Enter a valid IANA name (e.g. America/Toronto).",
|
|
827
940
|
dialogOkBtn: "OK",
|
|
828
941
|
dialogCancelBtn: "Cancel",
|
|
@@ -883,11 +996,11 @@ const fr: SettingsCopy = {
|
|
|
883
996
|
dashboardAllowTaskEndTimeEdit:
|
|
884
997
|
"Autoriser la correction de l’heure de fin des tâches dans le tableau de bord",
|
|
885
998
|
dashboardAllowTaskEndTimeEditDesc:
|
|
886
|
-
"Affiche des contrôles pour modifier l’heure de fin d’une tâche
|
|
999
|
+
"Affiche des contrôles pour définir ou modifier l’heure de fin d’une tâche dans la colonne Tâches, y compris pendant son exécution (la tâche se termine automatiquement à l’heure planifiée).",
|
|
887
1000
|
dashboardAllowSessionEndTimeEdit:
|
|
888
1001
|
"Autoriser la correction de l’heure de fin des sessions dans le tableau de bord",
|
|
889
1002
|
dashboardAllowSessionEndTimeEditDesc:
|
|
890
|
-
"Affiche des contrôles pour modifier l’heure de fin d’une session
|
|
1003
|
+
"Affiche des contrôles pour définir ou modifier l’heure de fin d’une session dans la colonne Sessions, y compris sur une session live (la session se clôt automatiquement à l’heure planifiée).",
|
|
891
1004
|
sectionCollection: "Collecte et tampons",
|
|
892
1005
|
sectionHistory: "Historique des sessions",
|
|
893
1006
|
sectionDangerZone: "Zone de danger",
|
|
@@ -935,6 +1048,23 @@ const fr: SettingsCopy = {
|
|
|
935
1048
|
dangerClearHistoryBackupSqlite: "SQLite — fichier de base de données",
|
|
936
1049
|
dangerClearHistoryBackupSqliteHint:
|
|
937
1050
|
"Fichier kronosys.sqlite après pointage WAL (restauration en remplaçant le fichier à l’arrêt de l’application).",
|
|
1051
|
+
dangerBackupRestoreTitle: "Sauvegardes et restauration complète",
|
|
1052
|
+
dangerBackupRestoreIntro:
|
|
1053
|
+
"Téléchargez d’abord une sauvegarde complète, puis restaurez un fichier de sauvegarde antérieur au besoin (instantané JSON ou fichier SQLite).",
|
|
1054
|
+
dangerRestorePickFile: "Fichier de restauration (`.json` ou `.sqlite`)",
|
|
1055
|
+
dangerRestoreHint:
|
|
1056
|
+
"La restauration remplace le stockage local courant sur cette machine. Faites une sauvegarde juste avant si vous avez un doute.",
|
|
1057
|
+
dangerRestoreButton: "Restaurer depuis une sauvegarde…",
|
|
1058
|
+
dangerRestoreBusy: "Restauration…",
|
|
1059
|
+
dangerRestoreConfirm:
|
|
1060
|
+
"Restaurer ce fichier de sauvegarde maintenant ? Le stockage local courant sera remplacé pour cet environnement.",
|
|
1061
|
+
dangerRestoreNoFile:
|
|
1062
|
+
"Choisissez un fichier de sauvegarde avant de lancer la restauration.",
|
|
1063
|
+
dangerRestoreDoneJson:
|
|
1064
|
+
"Restauration terminée depuis l’instantané JSON. Les données du tableau de bord ont été rechargées.",
|
|
1065
|
+
dangerRestoreDoneSqlite:
|
|
1066
|
+
"Restauration terminée depuis le fichier SQLite. Les données du tableau de bord ont été rechargées.",
|
|
1067
|
+
dangerRestoreFailed: "Échec de la restauration : {detail}",
|
|
938
1068
|
sectionArchivedSessions: "Sessions archivées",
|
|
939
1069
|
archivedSessionsIntro:
|
|
940
1070
|
"Sessions retirées de la liste principale du tableau de bord, triées par enregistrement le plus récent. Restaurer les réintègre dans la colonne Sessions.",
|
|
@@ -964,6 +1094,26 @@ const fr: SettingsCopy = {
|
|
|
964
1094
|
devDataHiddenNotDev: "Ce bloc s’affiche seulement lorsque le tableau de bord est servi en mode développement (`next dev`).",
|
|
965
1095
|
sectionWorkspaceLoc: "Rapports — instantané lignes de code",
|
|
966
1096
|
sectionTagsProjects: "Étiquettes et projets enregistrés",
|
|
1097
|
+
sectionTaskTemplates: "Modèles de tâche",
|
|
1098
|
+
taskTemplatesIntro:
|
|
1099
|
+
"Lignes enregistrées pour le champ « sur quoi travaillez-vous » (titre, #étiquettes et @projet facultatifs). Vous pouvez aussi enregistrer un modèle depuis une tâche en cours ou terminée sur le tableau de bord.",
|
|
1100
|
+
taskTemplatesHelpAria: "Aide : modèles de tâche",
|
|
1101
|
+
taskTemplatesHelpBody:
|
|
1102
|
+
"Les modèles ne font que préremplir le brouillon de tâche — ils ne démarrent pas le minuteur ni ne modifient les enregistrements existants.\n\nMême syntaxe que sur le tableau de bord : un titre, des #étiquettes facultatives, un @projet facultatif. Modifier ou supprimer un modèle ne change pas les sessions ou tâches déjà saisies.",
|
|
1103
|
+
taskTemplatesEmpty: "Aucun modèle de tâche. Ajoutez-en un ci-dessus ou enregistrez-en un depuis le tableau de bord.",
|
|
1104
|
+
taskTemplatesDraftPlaceholder: "ex. Travail profond #focus @acme",
|
|
1105
|
+
taskTemplatesAddBtn: "Ajouter le modèle",
|
|
1106
|
+
taskTemplatesSavedToast: "Modèle de tâche enregistré.",
|
|
1107
|
+
taskTemplatesRemovedToast: "Modèle de tâche supprimé.",
|
|
1108
|
+
taskTemplatesUpdatedToast: "Modèle de tâche mis à jour.",
|
|
1109
|
+
taskTemplatesColDraft: "Modèle",
|
|
1110
|
+
taskTemplatesColUpdated: "Mis à jour",
|
|
1111
|
+
taskTemplatesColActions: "Actions",
|
|
1112
|
+
taskTemplatesEditBtn: "Modifier le modèle",
|
|
1113
|
+
taskTemplatesSaveBtn: "Enregistrer",
|
|
1114
|
+
taskTemplatesCancelBtn: "Annuler",
|
|
1115
|
+
taskTemplatesDeleteBtn: "Supprimer le modèle",
|
|
1116
|
+
taskTemplatesDeleteConfirm: "Retirer ce modèle de la liste enregistrée ?",
|
|
967
1117
|
tagsProjectsIntro:
|
|
968
1118
|
"Gérez à part les étiquettes globales, les projets enregistrés et les étiquettes liées regroupées par projet. Les mêmes contrôles sont disponibles dans la colonne de droite du tableau de bord. Ces actions ne réécrivent pas en masse les tâches ni les fichiers de session.",
|
|
969
1119
|
tagsProjectsHelpAria: "Aide : impact des changements d’étiquettes et de projets",
|
|
@@ -1000,6 +1150,11 @@ const fr: SettingsCopy = {
|
|
|
1000
1150
|
tagPurgeHiddenConfirm:
|
|
1001
1151
|
"Retirer cette étiquette de la liste masquée et effacer sa description ? Si des tâches l’utilisent encore, elle peut réapparaître dans les raccourcis. Les tâches ne sont pas modifiées.",
|
|
1002
1152
|
tagPurgeHiddenAriaLabel: "Supprimer définitivement les métadonnées de cette étiquette masquée",
|
|
1153
|
+
tagRenameBtn: "Renommer l’étiquette",
|
|
1154
|
+
tagRenamePrompt: "Nouveau nom de l’étiquette",
|
|
1155
|
+
tagRenameImpactConfirm:
|
|
1156
|
+
"Renommer cette étiquette partout ? Les rapports et les ventilations historiques des tâches utiliseront désormais le nouveau nom. Les sessions et entrées de tâches existantes seront mises à jour.",
|
|
1157
|
+
renameImpactDontShowAgain: "Mémoriser ce choix et ne plus afficher",
|
|
1003
1158
|
tagUnpinConfirm: "Retirer cette étiquette de la liste épinglée ? Elle peut réapparaître si des tâches l’utilisent encore.",
|
|
1004
1159
|
tagExcludeConfirm:
|
|
1005
1160
|
"Masquer cette étiquette des raccourcis du tableau de bord ? Les données des tâches et sessions ne sont pas modifiées ; les tâches existantes gardent l’étiquette et les bilans peuvent encore la compter.",
|
|
@@ -1008,7 +1163,14 @@ const fr: SettingsCopy = {
|
|
|
1008
1163
|
projectsHelpAria: "Aide : projets enregistrés",
|
|
1009
1164
|
projectsHelpBody:
|
|
1010
1165
|
"La suppression (icône corbeille) retire le projet de la liste enregistrée, efface sa description et purge les métadonnées des étiquettes enregistrées sous la forme Projet#… pour ce projet. Les tâches ne sont pas modifiées.",
|
|
1166
|
+
projectsAddFieldLabel: "Ajouter un projet",
|
|
1167
|
+
projectsAddPlaceholder: "ex. ClientABC",
|
|
1168
|
+
projectsAddBtn: "Ajouter le projet",
|
|
1011
1169
|
projectsTableProjectCol: "Projet",
|
|
1170
|
+
projectsRenameBtn: "Renommer le projet",
|
|
1171
|
+
projectsRenamePrompt: "Nouveau nom du projet",
|
|
1172
|
+
projectRenameImpactConfirm:
|
|
1173
|
+
"Renommer ce projet partout ? Les rapports par projet et les ventilations historiques des tâches utiliseront désormais le nouveau nom. Les sessions et entrées de tâches existantes seront mises à jour.",
|
|
1012
1174
|
projectsRemoveBtn: "Supprimer le projet et les métadonnées d’étiquettes liées",
|
|
1013
1175
|
projectRemoveConfirm:
|
|
1014
1176
|
"Supprimer définitivement les métadonnées de ce projet ? Il sera retiré de la liste enregistrée, sa description effacée, et les données épinglées / masquées / descriptions des étiquettes Projet#… sous ce projet seront supprimées. Les tâches ne sont pas modifiées.",
|
|
@@ -1027,6 +1189,13 @@ const fr: SettingsCopy = {
|
|
|
1027
1189
|
tagStartTaskConflictParallelBtn: "Démarrer en parallèle (garder les minuteurs)",
|
|
1028
1190
|
tagStartTaskConflictDontShowAgain:
|
|
1029
1191
|
"Mémoriser ce choix et ne plus afficher cette boîte (la même action sera appliquée automatiquement la prochaine fois).",
|
|
1192
|
+
tagsScopeToolHeading: "Migration de portée des étiquettes",
|
|
1193
|
+
tagsScopeToolSourceLabel: "Étiquette source",
|
|
1194
|
+
tagsScopeToolTargetProjectLabel: "Portée projet cible",
|
|
1195
|
+
tagsScopeToolTargetGlobalOption: "Globale (sans projet)",
|
|
1196
|
+
tagsScopeToolCopyBtn: "Copier vers la portée cible",
|
|
1197
|
+
tagsScopeToolMoveBtn: "Déplacer vers la portée cible",
|
|
1198
|
+
tagsScopeToolNoTags: "Aucune étiquette connue à migrer pour le moment.",
|
|
1030
1199
|
tagsEmptyGlobal:
|
|
1031
1200
|
"Aucune étiquette globale dans les raccourcis pour l’instant. Épinglez-en une ci-dessus ou utilisez des #tags sur les tâches.",
|
|
1032
1201
|
tagsByProjectSectionEmpty:
|
|
@@ -1055,7 +1224,9 @@ const fr: SettingsCopy = {
|
|
|
1055
1224
|
tagsProjectsTabsAriaLabel: "Sections de la colonne étiquettes",
|
|
1056
1225
|
tagsProjectsTabGlobal: "Étiquettes globales",
|
|
1057
1226
|
tagsProjectsTabProjects: "Projets et étiquettes liées",
|
|
1227
|
+
tagsProjectsTabTemplates: "Modèles de tâche",
|
|
1058
1228
|
tocSubSessionDurationAlert: "Alerte durée de session",
|
|
1229
|
+
tocSubDefaultSessionNameTemplate: "Nom de session par défaut",
|
|
1059
1230
|
dashboardSessionDurationAlertHours: "Seuil d’alerte durée de session (heures)",
|
|
1060
1231
|
dashboardSessionDurationAlertHoursDesc:
|
|
1061
1232
|
"Durée murale de session (panneau latéral du tableau de bord) : dès qu’elle atteint ce nombre d’heures (ou plus), la valeur s’affiche en rouge avec un clignotement lent. Défaut : 24. Plage : 1–8760.",
|
|
@@ -1263,6 +1434,9 @@ const fr: SettingsCopy = {
|
|
|
1263
1434
|
"Affichage des heures sur le tableau de bord (début et fin des tâches, aperçu des dates de tâches passées) et dans les aperçus des sélecteurs d’heure du calendrier. Les dates ne changent pas.",
|
|
1264
1435
|
dashboardClock24hOption: "24 heures",
|
|
1265
1436
|
dashboardClock12hOption: "12 heures (AM/PM)",
|
|
1437
|
+
dashboardDefaultSessionNameTemplate: "Gabarit du nom des nouvelles sessions",
|
|
1438
|
+
dashboardDefaultSessionNameTemplateDesc:
|
|
1439
|
+
"Renseigné lors du démarrage d’une nouvelle session active (commande « Nouvelle session » ou session implicite créée par la première tâche). Laissez vide pour garder le champ vide. Séquences : `%%` pour un pourcentage littéral ; `%UUID` pour l’identifiant complet de session ; `%Y` `%y` `%m` `%d` `%H` `%M` `%S` ainsi que `%F` (équivalent `%Y-%m-%d`) suivent la sémantique de `strftime()` POSIX (référence IEEE / Open Group : https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html). Attention : `%m` est le mois ; `%M` représente les minutes. Les valeurs utilisent le fuseau d’affichage choisi ci-dessus (cohérent avec les regroupements quotidiens des rapports).",
|
|
1266
1440
|
invalidDashboardTimeZone: "Fuseau horaire non reconnu. Saisissez un nom IANA valide (ex. America/Toronto).",
|
|
1267
1441
|
dialogOkBtn: "OK",
|
|
1268
1442
|
dialogCancelBtn: "Annuler",
|