mirror of
https://github.com/johannesjo/super-productivity.git
synced 2026-07-18 17:05:48 +00:00
6 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
eff41c041d
|
feat(project): project completion experience (#8036)
* feat(project): add project completion with celebration + trophy view
Completing a project marks it done and archives it, with a celebration
dialog (confetti + live stats) and a prompt to resolve unfinished tasks
(move to Inbox / mark done). Completed projects show a trophy badge and
a Reopen action on the archived-projects page.
isDone stays distinct from isArchived; selectArchivedProjects is left
intact so completed projects' tasks stay filtered out of Today/Overdue.
Append/merge deferred to #8032. Plan: docs/plans/2026-06-05-project-completion.md
* refactor(project): drop Archive menu item; Complete is the retire path
Archive and Complete produced near-identical end states; collapse to one
user-facing action. Removes the 'Archive project' menu item and handler so
Complete is the single way to retire a project. The archiveProject action,
reducer and ProjectService.archive() stay (needed for op-log replay of
historical archive ops and the legacy unarchive/restore path). Wiki updated;
menu specs cover the Complete flow.
* fix(project): keep completion dialog open for the active project
MatDialog closeOnNavigation (default true) dismissed the celebration the
moment completing the currently-active project navigated to '/'. Navigate
first, then open the dialog.
* test(project): e2e for completion flow (complete, celebrate, reopen)
Covers the resolve-unfinished-tasks prompt, the celebration dialog with
stats, the trophy badge on the archived page, and reopening. Adds an
openProjectContextMenu page-object helper.
* feat(project): confirm project completion
* feat(project): show completion celebration fullscreen
* fix(project): harden completion celebration flow
* style(project): use spacing tokens in completion dialog
* fix(project): align completion screen with project context
* style(project): soften completion screen coloring
* style(project): reuse completion screen surfaces
* fix: refine project completion dialog actions
* fix: complete projects with atomic task resolution
* fix: restore archive path in project completion UI
* refactor(project): remove dead completion code
The project-level completeProject action (OpType.Update) was never
dispatched — completion goes exclusively through the atomic
TaskSharedActions.completeProject (OpType.Batch) meta-reducer. Drop the
dead action, its reducer case, the PROJECT_COMPLETE enum member and the
immutable 'PCO' op-log code (which would otherwise be permanently
reserved for an op that can never be produced); enum count 147->146.
Also remove the unused selectCompletedProjects / selectPlainArchivedProjects
selectors (no consumers) and the misspelled, unused 'angel' confetti
field, keeping the regression tests that guard selectArchivedProjects.
* fix(project): make project completion non-reversible
Completion resolves a project's open tasks (move-to-inbox / mark-done),
which reopen cannot truly restore, so the "Reopen"/"Undo" affordances on
the completion path were misleading. Drop the celebration dialog's Reopen
button and the post-complete undo snack; the fullscreen celebration is
the feedback and deliberate reactivation still lives on the
archived-projects page (Project.reopen kept for it).
Also restore the project title param on the archive confirm dialog (it
was rendering a raw {{title}} placeholder), remove the now-unused
moveTasksToInbox / markTasksDone resolution helpers (the meta-reducer
resolves tasks atomically), and drop the orphaned UNDO / S.COMPLETED
i18n keys. Updates the completion e2e to the close flow and asserts the
resolution props are forwarded to the atomic action.
* fix(tasks): cancel native reminders for project-completed tasks
Completing a project marks its unfinished tasks done inside the
meta-reducer (no per-task updateTask), so unscheduleDoneTask$'s
native-reminder cancellation is bypassed and an OS-scheduled Android
notification could still fire for a now-done task. Add a local-only
effect that cancels native reminders for the force-completed task ids.
Local-only by design: it dispatches no actions (the persistent
dismissReminderOnly/clearDeadlineReminder would each be an extra synced
op), and done tasks are already filtered from reminders$ on all
platforms — only the native Android notification needs explicit removal.
* test(project): drop TaskService spies orphaned by helper removal
getByIdWithSubTaskData$/moveToProject/setDone/setUnDone were only used
by the removed moveTasksToInbox/markTasksDone helpers and their deleted
tests.
* feat(sync): affectedEntities multi-entity conflict detection for atomic completion
WIP checkpoint of the atomic completeProject approach. The Batch op declares
every touched entity (PROJECT, INBOX, TASKs, TODAY_TAG) via a new
affectedEntities field threaded through op-log capture, conflict detection,
the sync server (+Prisma migration) and shared-schema. Per-effect
completeProject handlers (issue two-way-sync, time-block, repeat-cfg)
re-derive the task changes the atomic op bypasses.
* revert(sync): remove affectedEntities multi-entity conflict detection
Reverts
|
||
|
|
315c900391
|
fix(boards): show tasks from sidebar-hidden projects (#8021)
* fix(boards): show tasks from sidebar-hidden projects * docs(projects): clarify sidebar hidden wording * fix(nav): restore project visibility affordance |
||
|
|
34af7b1036 |
feat(projects): polish archive flow per #7748
- Confirm dialog for archive (replaces snack+UNDO); navigation in work-context-menu now awaits confirmation. - Archived-projects rows link to /project/<id>/tasks; project view shows an inline restore notice when the active project is archived. - Unarchive snack split: when the project is still hidden from the menu, offer a "Show in menu" action; otherwise keep UNDO. - Terminology: snack now reads "Project restored" to match the button. - Tests: spec for archived-projects-page and project-task-page; defensive archive-filter coverage on selectAllTasksWithReminder / selectAllTasksWithDeadlineReminder / selectOverdueTasks; service spec covers confirm/cancel paths and the hidden-from-menu branch. |
||
|
|
b945091b83
|
Archive project - Continuation of #7162 (#7639)
* feat(project): add archive project UI Allow users to archive completed projects via the project context menu. Archived projects are hidden from the sidebar and visibility menu, but retained with all their tasks. They can be unarchived at any time from the visibility menu (eye icon), where they appear below a divider with an unarchive icon. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test(project): add unit tests for archive/unarchive project feature - projectReducer: verify archiveProject sets isArchived=true, unarchiveProject sets it back to false, and that other projects are not affected - WorkContextMenuComponent: verify archiveProject() calls the service, shows a snack, navigates away when the archived project is currently active, and does not navigate otherwise Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(project): document archive/unarchive project feature Add "Archiving Projects" section to the Project View wiki page explaining how to archive a completed project and how to restore it via the visibility menu. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(project): new archived projects page * feat(project): improve archive UX with undo snack and hidden-menu warning - Replace plain archive notification with icon + undo action so accidental archiving is recoverable without a confirmation dialog - Add snack on unarchive; warn when project is still hidden from menu (isHiddenFromMenu=true) so users know why it won't appear in sidebar * feat(reminder): suppress reminders for archived project tasks * feat(tasks): hide archived project tasks from tags, today, and boards * feat(tasks): hide archived project tasks from overdue tasks list * fix(repeatTasks): exclude TaskRepeatCfg of archived projects when generating the next instance * fix(tasks): hide Task and TaskRepeatCfg of archived project from the /scheduled-list page This effectively hides the "Overlaps with another scheduled task" message if the other task belongs to an archived project. * feat(docs): Add documentation for archived projects * fix: revert changes to the it.json file * feat: hide all task-repeat-cfg from planners and introduce a new task-repeat-cfg selector selectActiveTaskRepeatCfgs * feat(tasks): add base selector for filtering tasks from active projects * feat(ui): add count of archived project in project visibility menu and hide the archived projects page link when none exist * feat(ui): improve accessibility for archived projects page by adding aria-labels and aria-hidden attributes * perf(projects): use a sorted selector in archived projects page to avoid sorting during user's search * refactor(tasks): derive selectAllUndoneTasksWithDueDay from the common shared selector * refactor(tasks): introduced shared selectors to centralize active projects filtering * fix: add mock selector for selectUndoneOverdueDeadlineTasks in plan view tests * refactor(planner): use selectAllTasksInActiveProjects to exclude archived project tasks Replaces direct task state access with the shared selectAllTasksInActiveProjects selector, which already filters archived project tasks. Fixes archived project tasks appearing in planner view. Test mock stores updated to include tasks+projects slices (required by new selector chain). Removed "missing entity references" test: that guard now lives upstream in selectAllTasks. * refactor(work-context): exclude archived project tasks from TAG/TODAY and SCHEDULE selectActiveWorkContext and selectTodayTaskIds were using raw taskState.entities, causing archived-project tasks to appear in tag boards and Today. Fix by filtering entities in the selectors using selectArchivedProjectIds before calling computeOrderedTaskIdsForToday / computeOrderedTaskIdsForTag. Apply the same logic to selectTimelineTasks and remove the combineLatest workaround added in 9d6fe5e. * fix(work-context): exclude archived project's tasks when selecting tasks in schedule page * fix(tasks): exclude archived project tasks from unplanned deadline banner * fix: fix tests after rebase onto master * fix: stabilize selectArchivedProjectIds Set instance Derive selectArchivedProjectIds from a base selectArrayOfArchivedProjectIds selector to avoid recreating the Set whenever unrelated project properties change * perf(selectors): avoid unnecessary recomputations from archived project selectors selectArchivedProjectIds was creating a new Set on every project-state update, causing unnecessary recomputation across downstream selectors even when archived projects did not change. - Add selectArrayOfArchivedProjectIds as a stable intermediate selector - Rebuild selectArchivedProjectIds only when archived IDs change - Memoize active-project task entities instead of filtering inline - Remove unused selectTaskFeatureState dependency from selectActiveWorkContext * fix(project): prevent inbox project to be archived * fix(task): add filters for non-archived projects and comment explaining why filter was not added in selectors * fix: always call archive service before navigateByUrl when triggering archive action * feat(ui): add undo action on project restored from archive snack * fix: add guards against empty projectId in tasks * fix(tasks): keep orphaned subtasks scheduled in selectLaterTodayTasksWithSubTasks Restored selector to its original form, but reading tasks from selectAllTasksInActiveProjects instead of selectTaskFeatureState. While categorizing tasks, group subtasks by their parentId in a single pass to avoid calling mapSubTasksToTask that requires TaskState. * refactor(tasks): compose selectAllTasksWithoutHiddenProjects from selectAllTasksInActiveProjects + new selector for hidden projects * test(tasks): restore coverage gaps from selector refactors - selectAllUndoneTasksWithDueDay: add "should include subtasks with dueDay" (dropped when selectAllTasksWithDueDay was removed in |
||
|
|
5f1dd7ef7f | docs(wiki): normalize tables and rework ToC | ||
|
|
8118f7cada
|
docs/wiki content v0.3 (#6231)
* docs(wiki): add "views" * docs(wiki): fix MD compliance (inline HTML) * docs(wiki): local style linting |