GIT-004B: Issues Panel - Read & Display
Overview
Create a new sidebar panel in the Nodegex editor that displays GitHub issues for the connected repository. This is the first user-facing feature of the GitHub integration, providing teams with visibility into their project's issue tracker without leaving the editor.
Phase: 3 (Dashboard UX & Collaboration)
Priority: HIGH (core value proposition)
Effort: 10-14 hours
Risk: Low (read-only, well-documented APIs)
Depends on: GIT-004A (OAuth & GitHubClient)
Goals
- New GitHub Panel in editor sidebar with tabbed interface
- Issues List with filtering and search
- Issue Detail view with markdown rendering
- Comments Display for full context
- Seamless Integration with existing sidebar patterns
User Experience
Panel Location
┌─────────────────────────────────────────────────────────────┐
│ Nodegex Editor │
├─────────────┬───────────────────────────────────────────────┤
│ Sidebar │ │
│ ───────── │ │
│ Components │ │
│ ───────── │ │
│ Properties │ │
│ ───────── │ │
│ Version │ │
│ Control │ │
│ ───────── │ │
│ ┌────────┐ │ │
│ │ GitHub │◄── NEW PANEL │
│ │ │ │ │
│ └────────┘ │ │
└─────────────┴───────────────────────────────────────────────┘
Issues Tab Layout
┌─────────────────────────────────────────┐
│ GitHub [⚙️] │
├─────────────────────────────────────────┤
│ [Issues] [PRs] [Deployments] │
├─────────────────────────────────────────┤
│ ┌─────────────────────────────────────┐ │
│ │ 🔍 Search issues... │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ ● Open (12) ○ Closed │ │
│ │ Labels: [bug ▼] Assignee: [Any ▼] │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────┤
│ #42 🐛 Login form validation broken │
│ @johndoe • 2 hours ago │
├─────────────────────────────────────────┤
│ #41 ✨ Add password strength meter │
│ @janedoe • 1 day ago │
├─────────────────────────────────────────┤
│ #38 📝 Update documentation │
│ @contributor • 3 days ago │
├─────────────────────────────────────────┤
│ [Load more...] │
└─────────────────────────────────────────┘
Issue Detail View
┌─────────────────────────────────────────┐
│ ← Back [Open in GH] │
├─────────────────────────────────────────┤
│ #42 Login form validation broken │
│ ─────────────────────────────────────── │
│ 🟢 Open 🐛 bug 🔥 priority-high │
│ Assigned: @johndoe │
├─────────────────────────────────────────┤
│ ## Description │
│ │
│ When entering an invalid email, the │
│ form doesn't show the error message... │
│ │
│ ### Steps to reproduce │
│ 1. Go to login page │
│ 2. Enter "notanemail" │
│ 3. Click submit │
├─────────────────────────────────────────┤
│ 💬 Comments (3) │
├─────────────────────────────────────────┤
│ @janedoe • 1 hour ago │
│ I can reproduce this on Chrome... │
├─────────────────────────────────────────┤
│ @johndoe • 30 min ago │
│ Found the issue, working on fix... │
└─────────────────────────────────────────┘
Architecture
Component Structure
packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/
├── GitHubPanel.tsx # Main panel container
├── GitHubPanel.module.scss # Panel styles
├── components/
│ ├── TabNavigation.tsx # Issues/PRs/Deployments tabs
│ ├── IssuesTab/
│ │ ├── IssuesTab.tsx # Tab container
│ │ ├── IssuesList.tsx # List of issues
│ │ ├── IssueItem.tsx # Single issue row
│ │ ├── IssueDetail.tsx # Full issue view
│ │ ├── IssueFilters.tsx # Filter controls
│ │ ├── IssueLabels.tsx # Label badges
│ │ └── IssueComments.tsx # Comments list
│ └── common/
│ ├── MarkdownRenderer.tsx # GitHub-flavored markdown
│ ├── UserAvatar.tsx # User avatar display
│ ├── TimeAgo.tsx # Relative time display
│ └── EmptyState.tsx # No issues state
├── hooks/
│ ├── useGitHubPanel.ts # Panel state management
│ ├── useIssues.ts # Issues data fetching
│ └── useIssueDetail.ts # Single issue fetching
├── types.ts # TypeScript interfaces
└── index.ts # Exports
Data Flow
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ GitHubPanel │────►│ useIssues() │────►│ GitHubClient │
│ (Component) │ │ (Hook) │ │ .issues.list() │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Local State │ │
│ │ - issues[] │◄────────────┘
│ │ - loading │
│ │ - error │
│ │ - filters │
│ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ IssuesList │────►│ IssueItem │
│ (Component) │ │ (Component) │
└─────────────────┘ └─────────────────┘
Implementation Phases
Phase 1: Panel Structure (2-3 hours)
Create the basic panel shell and register it with the sidebar.
Files to Create:
GitHubPanel.tsxGitHubPanel.module.scsscomponents/TabNavigation.tsxtypes.tsindex.ts
Tasks:
- Create GitHubPanel component shell
- Implement tab navigation (Issues active, PRs/Deployments placeholder)
- Register panel with SidebarModel
- Add GitHub icon to sidebar
- Handle "not connected" state
Success Criteria:
- Panel appears in sidebar
- Tab navigation renders
- Shows "Connect GitHub" if not authenticated
- No console errors
Phase 2: Issues List (3-4 hours)
Fetch and display the list of issues.
Files to Create:
components/IssuesTab/IssuesTab.tsxcomponents/IssuesTab/IssuesList.tsxcomponents/IssuesTab/IssueItem.tsxcomponents/IssuesTab/IssueLabels.tsxhooks/useIssues.ts
Tasks:
- Create
useIssueshook with GitHubClient - Implement issues list fetching
- Create IssueItem component with status, title, labels
- Add loading state
- Add error state
- Implement pagination ("Load more")
Success Criteria:
- Issues load on panel open
- Each issue shows title, number, status
- Labels display with colors
- Loading spinner shows during fetch
- Error message on failure
- Pagination loads more issues
Phase 3: Issue Filters (2-3 hours)
Add filtering and search capabilities.
Files to Create:
components/IssuesTab/IssueFilters.tsx
Tasks:
- Implement open/closed toggle
- Implement label filter dropdown
- Implement assignee filter dropdown
- Implement search input
- Persist filter state in session
Success Criteria:
- Open/Closed toggle works
- Label filter shows repo labels
- Assignee filter shows repo contributors
- Search filters by title/body
- Filters persist during session
- Clear filters button works
Phase 4: Issue Detail (2-3 hours)
Show full issue details with markdown rendering.
Files to Create:
components/IssuesTab/IssueDetail.tsxcomponents/IssuesTab/IssueComments.tsxcomponents/common/MarkdownRenderer.tsxcomponents/common/UserAvatar.tsxcomponents/common/TimeAgo.tsxhooks/useIssueDetail.ts
Tasks:
- Create IssueDetail component
- Implement markdown rendering with react-markdown
- Support GitHub Flavored Markdown (tables, task lists, etc.)
- Display issue metadata (assignees, labels, milestone)
- Fetch and display comments
- Add "Open in GitHub" link
- Implement back navigation
Success Criteria:
- Clicking issue opens detail view
- Markdown renders correctly
- Code blocks have syntax highlighting
- Comments display with user avatars
- "Open in GitHub" opens browser
- Back button returns to list
Phase 5: Polish (1-2 hours)
Final refinements and edge cases.
Tasks:
- Add empty state for no issues
- Handle rate limiting gracefully
- Add refresh button
- Optimize re-renders
- Add keyboard navigation (optional)
- Test with large issue lists (100+)
Success Criteria:
- Empty state looks good
- Rate limit shows friendly message
- Refresh updates list
- Performance acceptable with 100+ issues
Files Summary
Create (New)
packages/noodl-editor/src/editor/src/views/panels/GitHubPanel/
├── GitHubPanel.tsx
├── GitHubPanel.module.scss
├── components/
│ ├── TabNavigation.tsx
│ ├── IssuesTab/
│ │ ├── IssuesTab.tsx
│ │ ├── IssuesList.tsx
│ │ ├── IssueItem.tsx
│ │ ├── IssueDetail.tsx
│ │ ├── IssueFilters.tsx
│ │ ├── IssueLabels.tsx
│ │ └── IssueComments.tsx
│ └── common/
│ ├── MarkdownRenderer.tsx
│ ├── UserAvatar.tsx
│ ├── TimeAgo.tsx
│ └── EmptyState.tsx
├── hooks/
│ ├── useGitHubPanel.ts
│ ├── useIssues.ts
│ └── useIssueDetail.ts
├── types.ts
└── index.ts
Modify
packages/noodl-editor/src/editor/src/router.setup.ts
- Register GitHubPanel with SidebarModel
packages/noodl-editor/src/editor/src/models/sidebar/sidebarmodel.tsx
- May need adjustment for new panel type
Dependencies
NPM Packages
{
"react-markdown": "^9.0.0",
"remark-gfm": "^4.0.0",
"rehype-highlight": "^7.0.0"
}
Testing Checklist
- Panel appears for GitHub-connected repos
- Panel hidden for non-GitHub repos
- Issues list loads correctly
- Open/Closed filter works
- Label filter works
- Assignee filter works
- Search works
- Issue detail shows all info
- Markdown renders correctly
- Comments load and display
- "Open in GitHub" works
- Empty state displays
- Error states display
- Loading states display
- Pagination works
- Rate limiting handled
References
- GitHub Issues API
- react-markdown
- remark-gfm
- Existing:
SearchPanel.tsx- Sidebar panel pattern - Existing:
VersionControlPanel/- Panel with tabs pattern