5.3 KiB
5.3 KiB
spec, created, status
| spec | created | status |
|---|---|---|
| docs/specs/integrations/requirements/gitlab-integration.md | 2026-07-22 | approved |
Implementation Plan: GitLab Task Link Menu
Overview
Align GitLab task linking with the existing GitHub interaction: unlinked tasks
do not reserve top-bar space, and linking starts from the task's contextual
Link submenu. Reuse the existing GitLab MR dialog and task-menu plumbing, then
update desktop and mobile E2E coverage to prove the new entry points.
Frontend
Top-bar behavior
- Update
apps/web/components/gitlab/mr-topbar-button.tsxso an unlinked task renders no generic link action. - Preserve the linked-MR status/dropdown control, including
Link another merge request, open, and unlink behavior.
Shared task link menu
- Extend
apps/web/components/kanban-card-menu-items.tsxandapps/web/components/task/task-switcher-context-menu.tsxwith aGitLab Merge Requestlink action. - Wire the existing
TaskMRLinkDialogthrough kanban-card and sidebar/mobile task-switcher link state. Surface the action only while GitLab is configured for the active workspace. - Reuse the task's repository associations and the existing workspace repository list; do not add a new API or duplicate link submission logic.
Mobile design contract
- Desktop outcome: right-clicking a task opens
Link>GitLab Merge Request; submitting the existing dialog links the MR and reveals its status control in the task top bar. - Mobile entry point: the visible
Task actionsellipsis in the existing task-switcher drawer opens the same contextual menu; no long press is needed. - Nearest exemplar:
apps/web/components/task/mobile/session-task-switcher-sheet.tsxandapps/web/components/task/task-item.tsxprovide the discoverable ellipsis, responsive menu treatment, and touch geometry. - Hierarchy and presentation: task row > actions menu >
Linksubmenu >GitLab Merge Request> existing link dialog. This is a short secondary action, so the responsive context-menu bottom sheet plus existing dialog is preferable to a new route or full-height surface. - Scrolling and geometry: retain the menu primitive's safe-area-aware, internally scrolling mobile surface and 44px menu rows. The task-switcher drawer remains the outer list scroll owner while the portalled menu is open.
- Shared logic: desktop and mobile use the same availability hook, menu
callbacks, target state, repository resolution, and
TaskMRLinkDialog.
Tests
- What: the shared link-menu model includes
GitLab Merge Requestonly when its callback is present. File:apps/web/components/kanban-card-menu-items.test.tsx. How: extend the existing menu-entry unit tests and assert ordering and omission. - What: a task-switcher link selection closes the menu and targets the
selected task.
File:
apps/web/components/task/task-switcher.test.tsxor a focused colocated test if the existing helper coverage is sufficient. How: exercise the existing provider-neutral selection helper with the new callback plumbing. - What: the GitLab top bar renders no generic action without linked MRs and
keeps the linked-MR control behavior.
File:
apps/web/components/gitlab/mr-topbar-button.test.tsor a focused component test where practical. How: prefer testing extracted render-policy logic; do not add broad React component tests solely for markup.
E2E Tests
- Desktop scenario: update
apps/web/e2e/tests/gitlab/gitlab-parity.spec.tsso an unlinked task has noLink MRtop-bar button, then right-click the task row, chooseLink>GitLab Merge Request, submit the dialog, and verify the linked-MR status control appears and survives reload. - Mobile scenario: extend
apps/web/e2e/tests/gitlab/mobile-gitlab-parity.spec.tsor the focused mobile task-link menu spec so the visibleTask actionsellipsis opens the menu, the nested GitLab action is touch reachable and viewport-contained, and the dialog opens without right-click or long press.
Implementation Waves
Wave 1:
Wave 2:
Verification
cd apps && pnpm --filter @kandev/web test -- --run components/kanban-card-menu-items.test.tsx components/task/task-switcher.test.tsx components/gitlab/mr-topbar-button.test.ts
cd apps/web && pnpm run typecheck
cd apps/web && pnpm e2e:run tests/gitlab/gitlab-parity.spec.ts tests/gitlab/mobile-gitlab-parity.spec.ts
make fmt
make typecheck test lint
Verification Status
- Targeted desktop and mobile GitLab Playwright coverage passes (6/6), including validated screenshots, mobile touch targets, and viewport containment.
- Aggregate format, typecheck, unit, and lint checks pass. Aggregate tests pass
with
TMPDIR=/tmp.
Risks
- Task menu props cross kanban, desktop sidebar, and mobile task-switcher surfaces; missing one caller would make the action viewport-dependent.
- GitLab availability is workspace-scoped. The action must disappear when the active workspace has no configured GitLab connection.
- Removing the generic top-bar entry invalidates the existing manual-link E2E steps; those must be changed rather than deleted.