You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
**Feature:** A task that is `blocked_by` one or more still-open tasks shows a clear "⚠ Blocked by N open task(s)" banner in its Linked Tasks panel. Makes AlianHub's blocked-task alert real.
- Backend: `POST /api/v2/tasks/relations` action `openBlockers` → `getOpenBlockers` (`Modules/Tasks/helpers/taskMongo/relations.js`); pure helper `selectOpenBlockers` (`relationRules.js`). A blocker counts only while `statusType !== 'close'` and not soft-deleted.
8
+
9
+
**Legend:** ✅ Pass · ❌ Fail · ⏳ Pending (not yet run in the app)
10
+
11
+
| ID | Title | Precondition | Steps | Expected | Actual | Status |
| BW_001 | Warning shows for an open blocker | Task B is `blocked_by` Task A; A is open | Open Task B → Linked Tasks panel | Amber banner: "⚠ Blocked by 1 open task(s): {A.key}" || ⏳ Pending |
14
+
| BW_002 | Warning clears when the blocker closes | As BW_001 | Move Task A to a Done/closed status; reopen Task B | Banner disappears (0 open blockers) || ⏳ Pending |
15
+
| BW_003 | Only `blocked_by` counts | Task B `blocks` Task A (B blocks, isn't blocked) | Open Task B | No banner on B || ⏳ Pending |
16
+
| BW_004 | Multiple open blockers listed | B `blocked_by` A and C, both open | Open Task B | Banner shows count 2 and both keys || ⏳ Pending |
17
+
| BW_005 | Soft-deleted blocker ignored | B `blocked_by` A; A soft-deleted | Open Task B | A not counted in the banner || ⏳ Pending |
18
+
| BW_006 |`openBlockers` API action | B `blocked_by` A (open) | POST /api/v2/tasks/relations {action:'openBlockers', taskId:B} |`{ status:true, data:[A summary] }`|| ⏳ Pending |
19
+
| BW_007 | duplicates / relates_to never block | B `relates_to`/`duplicates` A | Open Task B | No banner || ⏳ Pending |
# Epic Enhancements (dates / owner / priority / status / progress) — Test Cases
2
+
3
+
**Feature:** Epics gain **start/due dates**, an **owner**, a **priority** (low/medium/high), an **in_progress** status (alongside open/done), and a visible **progress bar with %** — turning the thin v1 into a usable progress layer.
4
+
5
+
**Location:**
6
+
- Frontend: **Epics** panel — `frontend/src/components/molecules/Epics/EpicsPanel.vue` (create form fields, priority badge, status select, owner + dates, % label).
7
+
- Backend: `Modules/Epics/controller.js` (create/update accept the new fields), `helpers/epicRules.js` (`EPIC_PRIORITIES`, `parseEpicDates`, extended `EPIC_STATUSES`), schema `utils/mongo-handler/schema.js` (epics: priority, ownerUserId, startDate, dueDate).
8
+
9
+
**Legend:** ✅ Pass · ❌ Fail · ⏳ Pending (not yet run in the app)
10
+
11
+
| ID | Title | Precondition | Steps | Expected | Actual | Status |
| EE_001 | Create epic with priority + dates | Project open; Epics panel open | Enter name, pick priority **High**, set start + due, click Add | Epic created; owner defaults to creator || ⏳ Pending |
14
+
| EE_002 | Row renders new metadata | EE_001 done | View the epic row | Priority badge (High), owner name, due date all shown || ⏳ Pending |
15
+
| EE_003 | Progress bar + % label | Epic has 4 tasks, 1 closed | View epic row | Bar ≈25%, label "25% · 1/4" || ⏳ Pending |
16
+
| EE_004 | Set status In progress | Epic exists | Pick "In progress" in the row status select | Persists (PUT /epics/:id); chip tinted amber || ⏳ Pending |
17
+
| EE_005 | Set status Done | Epic exists | Pick "Done" | Persists; chip tinted green || ⏳ Pending |
| EE_007 | start-after-due rejected (API) | — | POST /api/v2/epics {startDate:'2026-07-01', dueDate:'2026-06-01', …} |`{ status:false, "startDate must be on or before dueDate." }`|| ⏳ Pending |
20
+
| EE_008 | Owner shows Unassigned when empty | Epic with no ownerUserId | View the row | Owner: "Unassigned" || ⏳ Pending |
21
+
22
+
**Unit coverage:**`validateEpicInput` (priority), `parseEpicDates` (valid / clear / partial / unparseable / start>due), and `EPIC_STATUSES`/`EPIC_PRIORITIES` covered in `tests/epic-rules.test.js`.
23
+
24
+
**Total:** 8 manual cases · pure logic unit-tested (green).
0 commit comments