Files
Claude-Code-Workflow/ccw/frontend/src/components/issue/hub/IssueHubTabs.tsx
catlog22 6155fcc7b8 feat: add SpecDialog component for editing spec frontmatter
- Implement SpecDialog for managing spec details including title, read mode, priority, and keywords.
- Add validation and keyword management functionality.
- Integrate SpecDialog into SpecsSettingsPage for editing specs.

feat: create index file for specs components

- Export SpecCard, SpecDialog, and related types from a new index file for better organization.

feat: implement SpecsSettingsPage for managing specs and hooks

- Create main settings page with tabs for Project Specs, Personal Specs, Hooks, Injection, and Settings.
- Integrate SpecDialog and HookDialog for editing specs and hooks.
- Add search functionality and mock data for specs and hooks.

feat: add spec management API routes

- Implement API endpoints for listing specs, getting spec details, updating frontmatter, rebuilding indices, and initializing the spec system.
- Handle errors and responses appropriately for each endpoint.
2026-02-26 22:03:13 +08:00

47 lines
1.4 KiB
TypeScript

// ========================================
// Issue Hub Tabs
// ========================================
// Tab navigation for IssueHub
import { useIntl } from 'react-intl';
import { Button } from '@/components/ui/Button';
import { cn } from '@/lib/utils';
// Keep in sync with IssueHubHeader/IssueHubPage
export type IssueTab = 'issues' | 'queue' | 'discovery';
interface IssueHubTabsProps {
currentTab: IssueTab;
onTabChange: (tab: IssueTab) => void;
}
export function IssueHubTabs({ currentTab, onTabChange }: IssueHubTabsProps) {
const { formatMessage } = useIntl();
const tabs: Array<{ value: IssueTab; label: string }> = [
{ value: 'issues', label: formatMessage({ id: 'issues.hub.tabs.issues' }) },
{ value: 'queue', label: formatMessage({ id: 'issues.hub.tabs.queue' }) },
{ value: 'discovery', label: formatMessage({ id: 'issues.hub.tabs.discovery' }) },
];
return (
<div className="flex gap-2 border-b border-border">
{tabs.map((tab) => (
<Button
key={tab.value}
variant="ghost"
className={cn(
"border-b-2 rounded-none h-11 px-4",
currentTab === tab.value
? "border-primary text-primary"
: "border-transparent text-muted-foreground hover:text-foreground"
)}
onClick={() => onTabChange(tab.value)}
>
{tab.label}
</Button>
))}
</div>
);
}