github-issue-tower-defence-management 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/bin/adapter/entry-points/console/consoleTabNames.js +1 -0
  3. package/bin/adapter/entry-points/console/consoleTabNames.js.map +1 -1
  4. package/bin/adapter/entry-points/console/ui-dist/assets/index-CvJgSVoN.js +88 -0
  5. package/bin/adapter/entry-points/console/ui-dist/index.html +1 -1
  6. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js +14 -0
  7. package/bin/domain/usecases/console/GenerateConsoleListsUseCase.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/adapter/entry-points/console/consoleTabNames.ts +1 -0
  10. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +41 -0
  11. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +52 -2
  12. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +4 -0
  13. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +1 -0
  14. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +5 -1
  15. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +4 -0
  16. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +9 -2
  17. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +37 -1
  18. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +13 -2
  19. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +50 -0
  20. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +98 -0
  21. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +66 -0
  22. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +69 -0
  23. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +101 -0
  24. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +75 -0
  25. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +1 -0
  26. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +71 -0
  27. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +2 -0
  28. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +26 -0
  29. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +6 -0
  30. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +12 -0
  31. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +1 -0
  32. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +11 -1
  33. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +58 -0
  34. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +25 -9
  35. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +14 -0
  36. package/src/adapter/entry-points/console/ui-dist/assets/index-CvJgSVoN.js +88 -0
  37. package/src/adapter/entry-points/console/ui-dist/index.html +1 -1
  38. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +84 -0
  39. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +39 -0
  40. package/types/adapter/entry-points/console/consoleTabNames.d.ts.map +1 -1
  41. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts +13 -1
  42. package/types/domain/usecases/console/GenerateConsoleListsUseCase.d.ts.map +1 -1
  43. package/bin/adapter/entry-points/console/ui-dist/assets/index-BSa2JTna.js +0 -88
  44. package/src/adapter/entry-points/console/ui-dist/assets/index-BSa2JTna.js +0 -88
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>TDPM Console</title>
7
- <script type="module" crossorigin src="/assets/index-BSa2JTna.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-CvJgSVoN.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-CLHvrafO.css">
9
9
  </head>
10
10
  <body>
@@ -58,6 +58,20 @@ class GenerateConsoleListsUseCase {
58
58
  'todo-by-human': buildStatusTab((issue) => issue.status === WorkflowStatus_1.TODO_STATUS_NAME ||
59
59
  issue.status === WorkflowStatus_1.LEGACY_TODO_STATUS_NAME, [WorkflowStatus_1.TODO_STATUS_NAME.toLowerCase(), 'done']),
60
60
  'todo-by-agent': buildStatusTab((issue) => issue.status === WorkflowStatus_1.TODO_BY_AGENT_STATUS_NAME, [WorkflowStatus_1.TODO_BY_AGENT_STATUS_NAME.toLowerCase(), 'done']),
61
+ queued: {
62
+ pjcode,
63
+ generatedAt,
64
+ statusOptions: this.buildFieldOptions(statusOptions, []),
65
+ agentOptions: this.buildFieldOptions(project.agent?.options ?? [], []),
66
+ storyOrder,
67
+ storyColors: this.buildStoryColorsObject(storyOptions),
68
+ items: this.sortByStoryOrder(visibleIssues
69
+ .filter((issue) => !issue.isClosed &&
70
+ (issue.status === WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME ||
71
+ issue.status === WorkflowStatus_1.PREPARATION_STATUS_NAME) &&
72
+ issue.dependedIssueUrls.length === 0)
73
+ .map((issue) => this.projectItem(issue, relatedOpenPullRequestUrlsByIssueUrl.get(issue.url) ?? [])), storyOrder),
74
+ },
61
75
  stories: {
62
76
  pjcode,
63
77
  generatedAt,
@@ -1 +1 @@
1
- {"version":3,"file":"GenerateConsoleListsUseCase.js","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenerateConsoleListsUseCase.js","sourceRoot":"","sources":["../../../../src/domain/usecases/console/GenerateConsoleListsUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -6,6 +6,7 @@ export const CONSOLE_LIST_TAB_NAMES: ConsoleTabName[] = [
6
6
  'failed-preparation',
7
7
  'todo-by-human',
8
8
  'todo-by-agent',
9
+ 'queued',
9
10
  'stories',
10
11
  ];
11
12
 
@@ -533,6 +533,47 @@ test('changes the color of a story row via the color palette in the stories tab'
533
533
  await expect(palette).toHaveCount(0);
534
534
  });
535
535
 
536
+ test('shows queued items grouped by story with colored status badges and navigates to detail on row click', async ({
537
+ page,
538
+ }) => {
539
+ await page.goto(harness.appRootUrl);
540
+
541
+ await tabByLabel(page, 'Queued').click();
542
+ await expect(activeTabLabel(page)).toHaveText('Queued');
543
+ await expect(tabBadge(page, 'Queued')).toHaveText('2');
544
+
545
+ const awaitingRow = itemRowByText(
546
+ page,
547
+ 'Add telemetry to the TDPM cost dashboard',
548
+ );
549
+ const prepRow = itemRowByText(
550
+ page,
551
+ 'Migrate the rate-limit store to a shared Redis backend',
552
+ );
553
+ await expect(awaitingRow).toBeVisible();
554
+ await expect(prepRow).toBeVisible();
555
+
556
+ const awaitingStatusBadge = awaitingRow
557
+ .locator('.console-queued-item-badge')
558
+ .first();
559
+ await expect(awaitingStatusBadge).toHaveText('Awaiting Workspace');
560
+ const awaitingStyle = await awaitingStatusBadge.getAttribute('style');
561
+ expect(awaitingStyle).toContain('rgba(56, 139, 253');
562
+
563
+ const prepStatusBadge = prepRow.locator('.console-queued-item-badge').first();
564
+ await expect(prepStatusBadge).toHaveText('Preparation');
565
+ const prepStyle = await prepStatusBadge.getAttribute('style');
566
+ expect(prepStyle).toContain('rgba(187, 128, 9');
567
+
568
+ const prepAgentBadge = prepRow.locator('.console-queued-item-badge').nth(1);
569
+ await expect(prepAgentBadge).toHaveText('developer');
570
+
571
+ await awaitingRow.click();
572
+ await expect(page).toHaveURL(/PVTI_lADOABCD1234zgQUE00930/, {
573
+ timeout: 3000,
574
+ });
575
+ });
576
+
536
577
  test('posts a comment and moves the item to Awaiting Workspace when the Comment & Awaiting Workspace button is clicked', async ({
537
578
  page,
538
579
  }) => {
@@ -87,8 +87,10 @@ type ConsoleFixtureSnapshot = {
87
87
  pjcode: string;
88
88
  generatedAt: string;
89
89
  statusOptions: ConsoleFixtureFieldOption[];
90
+ agentOptions: ConsoleFixtureFieldOption[];
90
91
  storyOptions: ConsoleFixtureFieldOption[];
91
92
  storyColors: Record<string, { color: string }>;
93
+ storyOrder: string[];
92
94
  items: ConsoleFixtureListItem[];
93
95
  };
94
96
 
@@ -132,6 +134,11 @@ const STATUS_OPTIONS: ConsoleFixtureFieldOption[] = [
132
134
  { id: 'e9f6a726', name: 'In Tmux by agent', color: 'YELLOW' },
133
135
  ];
134
136
 
137
+ const AGENT_OPTIONS: ConsoleFixtureFieldOption[] = [
138
+ { id: 'agt00001', name: 'developer', color: 'BLUE' },
139
+ { id: 'agt00002', name: 'chore', color: 'GRAY' },
140
+ ];
141
+
135
142
  const STORY_OPTIONS: ConsoleFixtureFieldOption[] = [
136
143
  { id: '1491051e', name: 'TDPM Console port', color: 'BLUE' },
137
144
  { id: '28415d6c', name: 'regular / workflow improvement', color: 'GRAY' },
@@ -204,12 +211,16 @@ const pullRequestItem = (
204
211
 
205
212
  const buildSnapshot = (
206
213
  items: ConsoleFixtureListItem[],
214
+ agentOptions: ConsoleFixtureFieldOption[] = [],
215
+ storyOrder: string[] = [],
207
216
  ): ConsoleFixtureSnapshot => ({
208
217
  pjcode: CONSOLE_E2E_PJCODE,
209
218
  generatedAt: '2026-06-18T01:22:09.000Z',
210
219
  statusOptions: STATUS_OPTIONS,
220
+ agentOptions,
211
221
  storyOptions: STORY_OPTIONS,
212
222
  storyColors: STORY_COLORS,
223
+ storyOrder,
213
224
  items,
214
225
  });
215
226
 
@@ -265,6 +276,29 @@ export const CONSOLE_E2E_TAB_ITEMS: Record<string, ConsoleFixtureListItem[]> = {
265
276
  agent: 'developer',
266
277
  },
267
278
  ],
279
+ queued: [
280
+ {
281
+ ...issueItem(
282
+ 930,
283
+ 'Add telemetry to the TDPM cost dashboard',
284
+ 'QUE00930',
285
+ 'TDPM Console port',
286
+ '2026-06-18T02:00:00.000Z',
287
+ ),
288
+ status: 'Awaiting Workspace',
289
+ },
290
+ {
291
+ ...issueItem(
292
+ 931,
293
+ 'Migrate the rate-limit store to a shared Redis backend',
294
+ 'QUE00931',
295
+ 'regular / workflow improvement',
296
+ '2026-06-18T02:30:00.000Z',
297
+ ),
298
+ status: 'Preparation',
299
+ agent: 'developer',
300
+ },
301
+ ],
268
302
  };
269
303
 
270
304
  const CONSOLE_E2E_STORIES_SNAPSHOT = {
@@ -310,13 +344,20 @@ const CONSOLE_E2E_STORIES_SNAPSHOT = {
310
344
  defaultNameWithOwner: REPO_NAME_WITH_OWNER,
311
345
  };
312
346
 
347
+ const QUEUED_STORY_ORDER = [
348
+ 'TDPM Console port',
349
+ 'regular / workflow improvement',
350
+ ];
351
+
313
352
  const writeFixtureData = (consoleDataOutputDir: string): void => {
314
353
  for (const [tab, items] of Object.entries(CONSOLE_E2E_TAB_ITEMS)) {
315
354
  const tabDir = path.join(consoleDataOutputDir, CONSOLE_E2E_PJCODE, tab);
316
355
  fs.mkdirSync(tabDir, { recursive: true });
356
+ const agentOptions = tab === 'queued' ? AGENT_OPTIONS : [];
357
+ const storyOrder = tab === 'queued' ? QUEUED_STORY_ORDER : [];
317
358
  fs.writeFileSync(
318
359
  path.join(tabDir, 'list.json'),
319
- JSON.stringify(buildSnapshot(items)),
360
+ JSON.stringify(buildSnapshot(items, agentOptions, storyOrder)),
320
361
  );
321
362
  }
322
363
  const storiesTabDir = path.join(
@@ -367,7 +408,16 @@ const buildE2eProject = (): Project => ({
367
408
  remainingEstimationMinutes: null,
368
409
  dependedIssueUrlSeparatedByComma: null,
369
410
  completionDate50PercentConfidence: null,
370
- agent: null,
411
+ agent: {
412
+ name: 'Agent',
413
+ fieldId: 'PVTSSF_agent',
414
+ options: AGENT_OPTIONS.map((option) => ({
415
+ id: option.id,
416
+ name: option.name,
417
+ color: option.color as Project['status']['statuses'][number]['color'],
418
+ description: '',
419
+ })),
420
+ },
371
421
  });
372
422
 
373
423
  const buildIssueForUrl = (url: string): Issue => ({
@@ -36,6 +36,7 @@ const counts: Record<ConsoleTabName, number> = {
36
36
  'failed-preparation': 2,
37
37
  'todo-by-human': 66,
38
38
  'todo-by-agent': 24,
39
+ queued: 8,
39
40
  stories: 3,
40
41
  };
41
42
 
@@ -63,6 +64,7 @@ export const ZeroCountTabsHidden: Story = {
63
64
  'failed-preparation': 0,
64
65
  'todo-by-human': 18,
65
66
  'todo-by-agent': 0,
67
+ queued: 0,
66
68
  stories: 0,
67
69
  },
68
70
  },
@@ -77,6 +79,7 @@ export const ZeroCountActiveTabStaysVisible: Story = {
77
79
  'failed-preparation': 0,
78
80
  'todo-by-human': 18,
79
81
  'todo-by-agent': 0,
82
+ queued: 0,
80
83
  stories: 0,
81
84
  },
82
85
  },
@@ -91,6 +94,7 @@ export const AfterAutoAdvanceToNextTab: Story = {
91
94
  'failed-preparation': 2,
92
95
  'todo-by-human': 4,
93
96
  'todo-by-agent': 0,
97
+ queued: 0,
94
98
  stories: 0,
95
99
  },
96
100
  onSelectTab: () => {},
@@ -8,6 +8,7 @@ const counts: Record<ConsoleTabName, number> = {
8
8
  'failed-preparation': 0,
9
9
  'todo-by-human': 2,
10
10
  'todo-by-agent': 3,
11
+ queued: 0,
11
12
  stories: 0,
12
13
  };
13
14
 
@@ -3,6 +3,7 @@ import { buildConsoleListRows } from '../../logic/grouping';
3
3
  import type { ConsoleOverlay } from '../../logic/types';
4
4
  import {
5
5
  consoleListItemsFixture,
6
+ consoleStatusOptionsFixture,
6
7
  consoleStoryColorsFixture,
7
8
  } from '../../testing/fixtures';
8
9
  import { ConsoleItemList } from './ConsoleItemList';
@@ -10,7 +11,10 @@ import { ConsoleItemList } from './ConsoleItemList';
10
11
  const meta: Meta<typeof ConsoleItemList> = {
11
12
  title: 'Console/ConsoleItemList',
12
13
  component: ConsoleItemList,
13
- args: { now: Date.parse('2026-06-19T12:00:00.000Z') },
14
+ args: {
15
+ now: Date.parse('2026-06-19T12:00:00.000Z'),
16
+ statusOptions: consoleStatusOptionsFixture,
17
+ },
14
18
  };
15
19
 
16
20
  export default meta;
@@ -3,6 +3,7 @@ import {
3
3
  resolveStoryColorEnum,
4
4
  } from '../../logic/grouping';
5
5
  import type {
6
+ ConsoleFieldOption,
6
7
  ConsoleListItem,
7
8
  ConsoleStoryColorSource,
8
9
  } from '../../logic/types';
@@ -12,6 +13,7 @@ import { ConsoleStorySummary } from './ConsoleStorySummary';
12
13
  export type ConsoleListViewProps = {
13
14
  rows: ConsoleListRow[];
14
15
  storyColors: ConsoleStoryColorSource;
16
+ statusOptions?: ConsoleFieldOption[];
15
17
  activeItemId: string | null;
16
18
  now: number;
17
19
  isLoading: boolean;
@@ -22,6 +24,7 @@ export type ConsoleListViewProps = {
22
24
  export const ConsoleItemList = ({
23
25
  rows,
24
26
  storyColors,
27
+ statusOptions = [],
25
28
  activeItemId,
26
29
  now,
27
30
  isLoading,
@@ -61,6 +64,7 @@ export const ConsoleItemList = ({
61
64
  item={row.item}
62
65
  isActive={row.item.itemId === activeItemId}
63
66
  now={now}
67
+ statusOptions={statusOptions}
64
68
  onSelect={onSelectItem}
65
69
  />
66
70
  </li>
@@ -1,11 +1,18 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react-vite';
2
- import { consoleListItemsFixture } from '../../testing/fixtures';
2
+ import {
3
+ consoleListItemsFixture,
4
+ consoleStatusOptionsFixture,
5
+ } from '../../testing/fixtures';
3
6
  import { ConsoleItemSummary } from './ConsoleItemSummary';
4
7
 
5
8
  const meta: Meta<typeof ConsoleItemSummary> = {
6
9
  title: 'Console/ConsoleItemSummary',
7
10
  component: ConsoleItemSummary,
8
- args: { onSelect: () => {}, now: Date.parse('2026-06-19T12:00:00.000Z') },
11
+ args: {
12
+ onSelect: () => {},
13
+ now: Date.parse('2026-06-19T12:00:00.000Z'),
14
+ statusOptions: consoleStatusOptionsFixture,
15
+ },
9
16
  };
10
17
 
11
18
  export default meta;
@@ -1,6 +1,9 @@
1
1
  import { fireEvent, render } from '@testing-library/react';
2
2
  import { formatFullTimestamp } from '../../logic/relativeTime';
3
- import { consoleListItemsFixture } from '../../testing/fixtures';
3
+ import {
4
+ consoleListItemsFixture,
5
+ consoleStatusOptionsFixture,
6
+ } from '../../testing/fixtures';
4
7
  import { ConsoleItemSummary } from './ConsoleItemSummary';
5
8
 
6
9
  const now = Date.parse('2026-06-19T12:00:00.000Z');
@@ -174,4 +177,37 @@ describe('ConsoleItemSummary', () => {
174
177
  );
175
178
  expect(queryByText('Agent')).not.toBeInTheDocument();
176
179
  });
180
+
181
+ it('applies the Project V2 status color from statusOptions to the status badge', () => {
182
+ const awaitingWorkspaceItem = {
183
+ ...prItem,
184
+ status: 'Awaiting Workspace',
185
+ };
186
+ const { getByText } = render(
187
+ <ConsoleItemSummary
188
+ item={awaitingWorkspaceItem}
189
+ isActive={false}
190
+ now={now}
191
+ statusOptions={consoleStatusOptionsFixture}
192
+ onSelect={() => {}}
193
+ />,
194
+ );
195
+ const badge = getByText('Awaiting Workspace');
196
+ expect(badge.style.backgroundColor).toBe('rgba(56, 139, 253, 0.1)');
197
+ expect(badge.style.color).toBe('rgb(56, 139, 253)');
198
+ });
199
+
200
+ it('applies gray color to the status badge when statusOptions is empty', () => {
201
+ const { getByText } = render(
202
+ <ConsoleItemSummary
203
+ item={prItem}
204
+ isActive={false}
205
+ now={now}
206
+ statusOptions={[]}
207
+ onSelect={() => {}}
208
+ />,
209
+ );
210
+ const badge = getByText(prItem.status as string);
211
+ expect(badge.style.backgroundColor).toBe('rgba(110, 118, 129, 0.1)');
212
+ });
177
213
  });
@@ -1,14 +1,16 @@
1
+ import { badgeStyle } from '../../logic/colors';
1
2
  import {
2
3
  formatFullTimestamp,
3
4
  formatRelativeTime,
4
5
  } from '../../logic/relativeTime';
5
- import type { ConsoleListItem } from '../../logic/types';
6
+ import type { ConsoleFieldOption, ConsoleListItem } from '../../logic/types';
6
7
  import { ConsoleItemIcon } from '../detail/ConsoleItemIcon';
7
8
 
8
9
  export type ConsoleListItemRowProps = {
9
10
  item: ConsoleListItem;
10
11
  isActive: boolean;
11
12
  now: number;
13
+ statusOptions?: ConsoleFieldOption[];
12
14
  onSelect: (item: ConsoleListItem) => void;
13
15
  };
14
16
 
@@ -16,6 +18,7 @@ export const ConsoleItemSummary = ({
16
18
  item,
17
19
  isActive,
18
20
  now,
21
+ statusOptions = [],
19
22
  onSelect,
20
23
  }: ConsoleListItemRowProps) => (
21
24
  <button
@@ -68,7 +71,15 @@ export const ConsoleItemSummary = ({
68
71
  {item.status !== null && item.status !== '' && (
69
72
  <span className="console-item-field">
70
73
  <span className="console-item-field-label">Status</span>
71
- {item.status}
74
+ <span
75
+ className="console-item-status-badge"
76
+ style={badgeStyle(
77
+ statusOptions.find((o) => o.name === item.status)?.color ??
78
+ null,
79
+ )}
80
+ >
81
+ {item.status}
82
+ </span>
72
83
  </span>
73
84
  )}
74
85
  {item.agent !== null && item.agent !== '' && (
@@ -0,0 +1,50 @@
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import {
3
+ consoleAgentOptionsFixture,
4
+ consoleListItemsFixture,
5
+ consoleStatusOptionsFixture,
6
+ } from '../../testing/fixtures';
7
+ import { ConsoleQueuedItemRow } from './ConsoleQueuedItemRow';
8
+
9
+ const meta: Meta<typeof ConsoleQueuedItemRow> = {
10
+ title: 'Console/ConsoleQueuedItemRow',
11
+ component: ConsoleQueuedItemRow,
12
+ args: {
13
+ onSelect: () => {},
14
+ statusOptions: consoleStatusOptionsFixture,
15
+ agentOptions: consoleAgentOptionsFixture,
16
+ isActive: false,
17
+ },
18
+ };
19
+
20
+ export default meta;
21
+
22
+ type Story = StoryObj<typeof ConsoleQueuedItemRow>;
23
+
24
+ export const AwaitingWorkspaceRow: Story = {
25
+ args: {
26
+ item: {
27
+ ...consoleListItemsFixture[1],
28
+ status: 'Awaiting Workspace',
29
+ agent: null,
30
+ },
31
+ },
32
+ };
33
+
34
+ export const PreparationWithAgent: Story = {
35
+ args: { item: consoleListItemsFixture[5] },
36
+ };
37
+
38
+ export const PreparationNoAgent: Story = {
39
+ args: {
40
+ item: {
41
+ ...consoleListItemsFixture[1],
42
+ status: 'Preparation',
43
+ agent: null,
44
+ },
45
+ },
46
+ };
47
+
48
+ export const ActiveRow: Story = {
49
+ args: { item: consoleListItemsFixture[5], isActive: true },
50
+ };
@@ -0,0 +1,98 @@
1
+ import { fireEvent, render } from '@testing-library/react';
2
+ import {
3
+ consoleAgentOptionsFixture,
4
+ consoleListItemsFixture,
5
+ consoleStatusOptionsFixture,
6
+ } from '../../testing/fixtures';
7
+ import { ConsoleQueuedItemRow } from './ConsoleQueuedItemRow';
8
+
9
+ const awaitingWorkspaceItem = {
10
+ ...consoleListItemsFixture[1],
11
+ status: 'Awaiting Workspace',
12
+ agent: null,
13
+ dependedIssueUrls: [],
14
+ };
15
+ const preparationWithAgentItem = consoleListItemsFixture[5];
16
+
17
+ describe('ConsoleQueuedItemRow', () => {
18
+ it('renders the item title', () => {
19
+ const { getByText } = render(
20
+ <ConsoleQueuedItemRow
21
+ item={awaitingWorkspaceItem}
22
+ isActive={false}
23
+ statusOptions={consoleStatusOptionsFixture}
24
+ agentOptions={consoleAgentOptionsFixture}
25
+ onSelect={() => {}}
26
+ />,
27
+ );
28
+ expect(getByText(awaitingWorkspaceItem.title)).toBeInTheDocument();
29
+ });
30
+
31
+ it('renders the status badge with Project V2 color', () => {
32
+ const { getByText } = render(
33
+ <ConsoleQueuedItemRow
34
+ item={awaitingWorkspaceItem}
35
+ isActive={false}
36
+ statusOptions={consoleStatusOptionsFixture}
37
+ agentOptions={consoleAgentOptionsFixture}
38
+ onSelect={() => {}}
39
+ />,
40
+ );
41
+ const badge = getByText('Awaiting Workspace');
42
+ expect(badge.style.backgroundColor).toBe('rgba(56, 139, 253, 0.1)');
43
+ });
44
+
45
+ it('renders the agent badge when the item has an agent', () => {
46
+ const { getByText } = render(
47
+ <ConsoleQueuedItemRow
48
+ item={preparationWithAgentItem}
49
+ isActive={false}
50
+ statusOptions={consoleStatusOptionsFixture}
51
+ agentOptions={consoleAgentOptionsFixture}
52
+ onSelect={() => {}}
53
+ />,
54
+ );
55
+ expect(getByText('developer')).toBeInTheDocument();
56
+ });
57
+
58
+ it('omits the agent badge when agent is null', () => {
59
+ const { queryByText } = render(
60
+ <ConsoleQueuedItemRow
61
+ item={awaitingWorkspaceItem}
62
+ isActive={false}
63
+ statusOptions={consoleStatusOptionsFixture}
64
+ agentOptions={consoleAgentOptionsFixture}
65
+ onSelect={() => {}}
66
+ />,
67
+ );
68
+ expect(queryByText('developer')).not.toBeInTheDocument();
69
+ });
70
+
71
+ it('calls onSelect with the item on click', () => {
72
+ const onSelect = jest.fn();
73
+ const { getByRole } = render(
74
+ <ConsoleQueuedItemRow
75
+ item={awaitingWorkspaceItem}
76
+ isActive={false}
77
+ statusOptions={consoleStatusOptionsFixture}
78
+ agentOptions={consoleAgentOptionsFixture}
79
+ onSelect={onSelect}
80
+ />,
81
+ );
82
+ fireEvent.click(getByRole('button'));
83
+ expect(onSelect).toHaveBeenCalledWith(awaitingWorkspaceItem);
84
+ });
85
+
86
+ it('marks the active row with data-active', () => {
87
+ const { getByRole } = render(
88
+ <ConsoleQueuedItemRow
89
+ item={awaitingWorkspaceItem}
90
+ isActive
91
+ statusOptions={consoleStatusOptionsFixture}
92
+ agentOptions={consoleAgentOptionsFixture}
93
+ onSelect={() => {}}
94
+ />,
95
+ );
96
+ expect(getByRole('button')).toHaveAttribute('data-active', 'true');
97
+ });
98
+ });
@@ -0,0 +1,66 @@
1
+ import { badgeStyle } from '../../logic/colors';
2
+ import type { ConsoleFieldOption, ConsoleListItem } from '../../logic/types';
3
+ import { ConsoleItemIcon } from '../detail/ConsoleItemIcon';
4
+
5
+ export type ConsoleQueuedItemRowProps = {
6
+ item: ConsoleListItem;
7
+ isActive: boolean;
8
+ statusOptions: ConsoleFieldOption[];
9
+ agentOptions: ConsoleFieldOption[];
10
+ onSelect: (item: ConsoleListItem) => void;
11
+ };
12
+
13
+ const queuedBadgeStyle = (colorEnum: string | null) => ({
14
+ ...badgeStyle(colorEnum),
15
+ fontSize: '12px',
16
+ whiteSpace: 'nowrap' as const,
17
+ flexShrink: 0,
18
+ });
19
+
20
+ export const ConsoleQueuedItemRow = ({
21
+ item,
22
+ isActive,
23
+ statusOptions,
24
+ agentOptions,
25
+ onSelect,
26
+ }: ConsoleQueuedItemRowProps) => {
27
+ const statusOption = statusOptions.find((o) => o.name === item.status);
28
+ const agentOption = agentOptions.find((o) => o.name === item.agent);
29
+
30
+ return (
31
+ <button
32
+ type="button"
33
+ className="console-item-row console-queued-item-row"
34
+ aria-current={isActive ? 'true' : undefined}
35
+ data-active={isActive ? 'true' : undefined}
36
+ onClick={() => onSelect(item)}
37
+ >
38
+ <ConsoleItemIcon
39
+ isPr={item.isPr}
40
+ state="open"
41
+ merged={false}
42
+ isDraft={false}
43
+ stateReason=""
44
+ />
45
+ <span className="console-queued-item-title">{item.title}</span>
46
+ <span className="console-queued-item-badges">
47
+ {item.status !== null && item.status !== '' && (
48
+ <span
49
+ className="console-queued-item-badge"
50
+ style={queuedBadgeStyle(statusOption?.color ?? null)}
51
+ >
52
+ {item.status}
53
+ </span>
54
+ )}
55
+ {item.agent !== null && item.agent !== '' && (
56
+ <span
57
+ className="console-queued-item-badge"
58
+ style={queuedBadgeStyle(agentOption?.color ?? null)}
59
+ >
60
+ {item.agent}
61
+ </span>
62
+ )}
63
+ </span>
64
+ </button>
65
+ );
66
+ };