feat: global search and keyboard shortcuts
Ctrl/⌘ K (or /) opens a search over the projects and tickets of all my projects, driven by the keyboard. g plus a letter moves between project pages, c creates a ticket on the board, e edits the open ticket and ? lists every shortcut. My work can now be searched by text through the API. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2041,6 +2041,15 @@
|
||||
"$ref": "#/components/schemas/StatusCategory"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "search",
|
||||
"required": false,
|
||||
"in": "query",
|
||||
"description": "Matches key, title or description",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
|
||||
@@ -900,7 +900,16 @@ type Query {
|
||||
"""
|
||||
Tickets across all my projects: assigned to me (default) or any (e.g. categories [QA])
|
||||
"""
|
||||
myIssues(assignedToMe: Boolean! = true, categories: [StatusCategory!], limit: Int! = 50, offset: Int! = 0, statuses: [String!]): IssuePage!
|
||||
myIssues(
|
||||
assignedToMe: Boolean! = true
|
||||
categories: [StatusCategory!]
|
||||
limit: Int! = 50
|
||||
offset: Int! = 0
|
||||
|
||||
"""Matches key, title or description (global search)"""
|
||||
search: String
|
||||
statuses: [String!]
|
||||
): IssuePage!
|
||||
|
||||
"""My notifications, newest first, and how many are unread"""
|
||||
myNotifications(limit: Int! = 30, unreadOnly: Boolean! = false): MyNotifications!
|
||||
|
||||
@@ -3724,6 +3724,8 @@ export interface operations {
|
||||
status?: string[];
|
||||
/** @description Whatever each project calls its statuses */
|
||||
category?: components["schemas"]["StatusCategory"][];
|
||||
/** @description Matches key, title or description */
|
||||
search?: string;
|
||||
};
|
||||
header?: never;
|
||||
path?: never;
|
||||
|
||||
@@ -11,7 +11,10 @@ import { filter, map } from 'rxjs';
|
||||
import { AuthFacade } from '@task-stream/web/identity/application';
|
||||
import { UserMenuComponent } from '@task-stream/web/identity/presenters';
|
||||
import { AppShellComponent } from '@task-stream/web/shared/ui';
|
||||
import { NotificationsBell } from '@task-stream/web/tracker/presenters';
|
||||
import {
|
||||
CommandPalette,
|
||||
NotificationsBell,
|
||||
} from '@task-stream/web/tracker/presenters';
|
||||
|
||||
@Component({
|
||||
selector: 'ts-root',
|
||||
@@ -23,6 +26,7 @@ import { NotificationsBell } from '@task-stream/web/tracker/presenters';
|
||||
AppShellComponent,
|
||||
UserMenuComponent,
|
||||
NotificationsBell,
|
||||
CommandPalette,
|
||||
],
|
||||
template: `
|
||||
<ts-app-shell>
|
||||
@@ -48,6 +52,7 @@ import { NotificationsBell } from '@task-stream/web/tracker/presenters';
|
||||
@if (auth.isAuthenticated()) {
|
||||
<!-- One projectable node per @if branch, or neither reaches the slot. -->
|
||||
<ng-container shellUser>
|
||||
<ts-command-palette />
|
||||
<ts-notifications-bell />
|
||||
<ts-user-menu />
|
||||
</ng-container>
|
||||
|
||||
Reference in New Issue
Block a user