chore: clear lint warnings and finalize shared epic chip strip
This commit is contained in:
parent
74871545c7
commit
df4769bf07
5 changed files with 9 additions and 19 deletions
|
|
@ -1,7 +1,7 @@
|
|||
import nextCoreWebVitals from 'eslint-config-next/core-web-vitals';
|
||||
import nextTypeScript from 'eslint-config-next/typescript';
|
||||
|
||||
export default [
|
||||
const eslintConfig = [
|
||||
...nextCoreWebVitals,
|
||||
...nextTypeScript,
|
||||
{
|
||||
|
|
@ -17,3 +17,5 @@ export default [
|
|||
},
|
||||
},
|
||||
];
|
||||
|
||||
export default eslintConfig;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import {
|
|||
import '@xyflow/react/dist/style.css';
|
||||
import dagre from 'dagre';
|
||||
|
||||
import { EpicChipStrip } from './epic-chip-strip';
|
||||
import { EpicChipStrip } from '../shared/epic-chip-strip';
|
||||
import { WorkflowTabs, type WorkflowTab } from './workflow-tabs';
|
||||
import { TaskCardGrid, type BlockerDetail } from './task-card-grid';
|
||||
import { TaskDetailsDrawer } from './task-details-drawer';
|
||||
|
|
@ -25,14 +25,14 @@ import { GraphSection } from './graph-section';
|
|||
import { ProjectScopeControls } from '../shared/project-scope-controls';
|
||||
import { WorkspaceHero } from '../shared/workspace-hero';
|
||||
|
||||
import { buildGraphModel, type GraphNode } from '../../lib/graph';
|
||||
import { buildGraphModel } from '../../lib/graph';
|
||||
import {
|
||||
buildPathWorkspace,
|
||||
type GraphHopDepth,
|
||||
analyzeBlockedChain,
|
||||
detectDependencyCycles,
|
||||
} from '../../lib/graph-view';
|
||||
import { buildBlockedByTree, type BlockedTreeNode } from '../../lib/kanban';
|
||||
import { buildBlockedByTree } from '../../lib/kanban';
|
||||
import { type BeadIssue } from '../../lib/types';
|
||||
import type { ProjectScopeOption } from '../../lib/project-scope';
|
||||
|
||||
|
|
@ -599,8 +599,7 @@ export function DependencyGraphPage({
|
|||
|
||||
const nodeTypes: NodeTypes = useMemo(
|
||||
() => ({
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
flowNode: GraphNodeCard as any,
|
||||
flowNode: GraphNodeCard as NodeTypes['flowNode'],
|
||||
}),
|
||||
[],
|
||||
);
|
||||
|
|
@ -847,7 +846,6 @@ export function DependencyGraphPage({
|
|||
<TaskCardGrid
|
||||
tasks={sortedEpicTasks}
|
||||
selectedId={selectedId}
|
||||
signalById={signalById}
|
||||
blockerDetailsMap={blockerDetailsMap}
|
||||
blocksDetailsMap={blocksDetailsMap}
|
||||
actionableIds={actionableNodeIds}
|
||||
|
|
@ -866,7 +864,6 @@ export function DependencyGraphPage({
|
|||
<TaskCardGrid
|
||||
tasks={sortedEpicTasks}
|
||||
selectedId={selectedId}
|
||||
signalById={signalById}
|
||||
blockerDetailsMap={blockerDetailsMap}
|
||||
blocksDetailsMap={blocksDetailsMap}
|
||||
actionableIds={actionableNodeIds}
|
||||
|
|
|
|||
|
|
@ -18,10 +18,6 @@ interface TaskCardProps {
|
|||
issue: BeadIssue;
|
||||
/** Whether this card is the currently selected task. */
|
||||
selected: boolean;
|
||||
/** Number of issues blocking this task. */
|
||||
blockedBy: number;
|
||||
/** Number of issues this task blocks. */
|
||||
blocks: number;
|
||||
/** List of issues blocking this task. */
|
||||
blockers: BlockerDetail[];
|
||||
/** List of issues this task blocks. */
|
||||
|
|
@ -38,8 +34,6 @@ interface TaskCardGridProps {
|
|||
tasks: BeadIssue[];
|
||||
/** ID of the currently selected task, or null. */
|
||||
selectedId: string | null;
|
||||
/** Map of issue ID to blocker/blocks counts. */
|
||||
signalById: Map<string, { blockedBy: number; blocks: number }>;
|
||||
/** Map of issue ID to detailed blocker info. */
|
||||
blockerDetailsMap: Map<string, BlockerDetail[]>;
|
||||
/** Map of issue ID to detailed downstream blocking info. */
|
||||
|
|
@ -157,7 +151,7 @@ function statusBadge(status: BeadIssue['status'], isActionable: boolean, hasBloc
|
|||
* A single task card displaying the issue ID, title, priority, type, assignee,
|
||||
* and detailed blocker list (interactive).
|
||||
*/
|
||||
function TaskCard({ issue, selected, blockedBy, blocks, blockers, blocking, isActionable, onSelect }: TaskCardProps) {
|
||||
function TaskCard({ issue, selected, blockers, blocking, isActionable, onSelect }: TaskCardProps) {
|
||||
const hasBlockers = blockers.length > 0; // Note: blockers list only contains OPEN blockers (computed in page)
|
||||
const badge = statusBadge(issue.status, isActionable, hasBlockers);
|
||||
const projectName = (issue as BeadIssue & { project?: { name?: string } }).project?.name ?? null;
|
||||
|
|
@ -360,7 +354,7 @@ function TaskCard({ issue, selected, blockedBy, blocks, blockers, blocking, isAc
|
|||
* Renders a responsive grid of task cards.
|
||||
* Uses auto-fill with minmax to prevent cards from being too narrow to read.
|
||||
*/
|
||||
export function TaskCardGrid({ tasks, selectedId, signalById, blockerDetailsMap, blocksDetailsMap, actionableIds, onSelect }: TaskCardGridProps) {
|
||||
export function TaskCardGrid({ tasks, selectedId, blockerDetailsMap, blocksDetailsMap, actionableIds, onSelect }: TaskCardGridProps) {
|
||||
// Show an empty state when no tasks exist in the selected epic
|
||||
if (tasks.length === 0) {
|
||||
return (
|
||||
|
|
@ -377,8 +371,6 @@ export function TaskCardGrid({ tasks, selectedId, signalById, blockerDetailsMap,
|
|||
key={task.id}
|
||||
issue={task}
|
||||
selected={selectedId === task.id}
|
||||
blockedBy={signalById.get(task.id)?.blockedBy ?? 0}
|
||||
blocks={signalById.get(task.id)?.blocks ?? 0}
|
||||
blockers={blockerDetailsMap?.get(task.id) ?? []}
|
||||
blocking={blocksDetailsMap?.get(task.id) ?? []}
|
||||
isActionable={actionableIds?.has(task.id) ?? false}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import {
|
|||
buildBdMutationArgs,
|
||||
validateMutationPayload,
|
||||
executeMutation,
|
||||
type MutationOperation,
|
||||
} from '../../src/lib/mutations';
|
||||
|
||||
const root = 'C:/Users/Zenchant/codex/beadboard';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue