Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/workbench/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,6 @@ export type {
ProjectArtifact,
ProjectFeedItem,
ProjectRunStatus,
ProjectFilter,
ProjectTab,
SettingsPageProps,
SettingsPaneId,
Expand Down
2 changes: 0 additions & 2 deletions app/workbench/src/pages/ProjectsPage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ function baseProps(overrides: Partial<ProjectsPageProps> = {}): ProjectsPageProp
projects: [],
activeProjectId: null,
onProjectSelect: () => undefined,
activeFilter: 'all',
onFilterChange: () => undefined,
activeTab: 'overview',
onTabChange: () => undefined,
...overrides,
Expand Down
7 changes: 0 additions & 7 deletions app/workbench/src/pages/ProjectsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ export type {
ProjectFeedItem,
ProjectInfo,
ProjectDraft,
ProjectFilter,
ProjectTab,
ProjectsPageProps,
} from './projects';
Expand All @@ -43,9 +42,6 @@ export function ProjectsPage({
onProjectSelect,
searchQuery = '',
onSearchChange,
activeFilter,
onFilterChange,
availableFilters,
activeTab,
onTabChange,
onNewProject,
Expand Down Expand Up @@ -102,9 +98,6 @@ export function ProjectsPage({
onProjectSelect={onProjectSelect}
searchQuery={searchQuery}
onSearchChange={onSearchChange}
activeFilter={activeFilter}
onFilterChange={onFilterChange}
{...(availableFilters ? { availableFilters } : {})}
canCreateProject={canCreateProject}
onStartCreate={startProjectCreate}
/>
Expand Down
1 change: 0 additions & 1 deletion app/workbench/src/pages/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ export type {
ProjectArtifact,
ProjectFeedItem,
ProjectRunStatus,
ProjectFilter,
ProjectTab,
} from './ProjectsPage';

Expand Down
49 changes: 1 addition & 48 deletions app/workbench/src/pages/projects/ProjectChromeViews.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,10 @@ import {
import styles from '../ProjectsPage.module.css';
import type {
ProjectDraft,
ProjectFilter,
ProjectInfo,
ProjectTab,
} from './types';
import { FILTER_ITEMS, TAB_ITEMS } from './types';
import { TAB_ITEMS } from './types';

export function ProjectNavRow({
project,
Expand Down Expand Up @@ -51,52 +50,6 @@ export function ProjectNavRow({
);
}

export function FilterList({
activeFilter,
onFilterChange,
availableFilters,
}: {
activeFilter: ProjectFilter;
onFilterChange: (filter: ProjectFilter) => void;
/** Filters the current data source can satisfy; absent = all available. */
availableFilters?: readonly ProjectFilter[] | undefined;
}) {
const { t } = useTranslation(SHARED_WORKBENCH_I18N_NAMESPACE);
return (
<div className={styles.filterList}>
{FILTER_ITEMS.map((item) => {
// #2154 P2-3: `all` never filters anything out, so it stays clickable.
// A lifecycle chip is clickable only when at least one loaded project
// classifies into that bucket — an enabled chip whose click can only
// yield an empty list would replace the old decorative chip with a
// fresh false fact about the user's data. Hub exposes no project
// lifecycle field today (the web projection labels every project
// 'Hub'/'Hub group'), so on real web data all three render disabled
// with the reason in the title.
const available = item.id === 'all'
|| availableFilters === undefined
|| availableFilters.includes(item.id);
return (
<button
key={item.id}
type="button"
data-filter-id={item.id}
className={`${styles.filterBtn} ${activeFilter === item.id ? styles.filterBtnActive : ''}`}
disabled={!available}
title={available ? undefined : t('projects.nav.filterUnavailable')}
onClick={() => onFilterChange(item.id)}
>
<span className={styles.filterBtnIcon}>
<DesignNavIcon name={item.icon} size={15} />
</span>
{t(item.labelKey)}
</button>
);
})}
</div>
);
}

export function ProjectTabs({
activeTab,
onTabChange,
Expand Down
187 changes: 0 additions & 187 deletions app/workbench/src/pages/projects/ProjectFilterAvailability.test.tsx

This file was deleted.

45 changes: 45 additions & 0 deletions app/workbench/src/pages/projects/ProjectNav.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// #2274 B-6 (Option A): the project lifecycle filter (Running/Completed/Archived
// chips) is removed because Hub exposes no authoritative project lifecycle. Pin
// the behavior: Hub-style status labels are never classified/filtered, and the
// Projects nav renders no lifecycle filter controls.
import { render, screen } from "../../__tests__/setup";
import { describe, expect, it } from "vitest";
import type { ProjectInfo } from "./types";
import { ProjectNav } from "./ProjectNav";

function project(id: string, status: string): ProjectInfo {
return {
id,
name: `Proj ${id}`,
description: `${id} description`,
status,
meta: "Hub",
members: [],
announcement: "",
runs: [],
artifacts: [],
feed: [],
};
}

describe("ProjectNav lifecycle filter removal (#2274 B-6)", () => {
it("shows Hub-style projects as rows and renders no Running/Completed/Archived filter controls", () => {
render(
<ProjectNav
projects={[project("a", "Hub"), project("b", "Active")]}
activeProjectId={null}
onProjectSelect={() => undefined}
canCreateProject={false}
onStartCreate={() => undefined}
/>,
);

expect(screen.getByText("Proj a")).toBeInTheDocument();
expect(screen.getByText("Hub")).toBeInTheDocument();
expect(screen.getByText("Proj b")).toBeInTheDocument();

// No lifecycle filter chips remain in the nav.
expect(document.querySelectorAll("[data-filter-id]")).toHaveLength(0);
expect(screen.queryByRole("button", { name: /Running|Completed|Archived/ })).toBeNull();
});
});
17 changes: 2 additions & 15 deletions app/workbench/src/pages/projects/ProjectNav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import { SHARED_WORKBENCH_I18N_NAMESPACE } from '@shared/i18n';
import { StatusNotice } from '@shared/ui';
import { DesignNavIcon } from '../../designIcons';
import styles from '../ProjectsPage.module.css';
import { FilterList, ProjectNavRow } from './ProjectChromeViews';
import type { ProjectFilter, ProjectInfo } from './types';
import { ProjectNavRow } from './ProjectChromeViews';
import type { ProjectInfo } from './types';

export type ProjectNavProps = {
projects: ProjectInfo[];
Expand All @@ -22,10 +22,6 @@ export type ProjectNavProps = {
onProjectSelect: (projectId: string) => void;
searchQuery?: string | undefined;
onSearchChange?: ((query: string) => void) | undefined;
activeFilter: ProjectFilter;
onFilterChange: (filter: ProjectFilter) => void;
/** Filters the loaded projects can satisfy; others render disabled (#2154 P2-3). */
availableFilters?: readonly ProjectFilter[] | undefined;
canCreateProject: boolean;
onStartCreate: () => void;
};
Expand All @@ -38,9 +34,6 @@ export function ProjectNav({
onProjectSelect,
searchQuery = '',
onSearchChange,
activeFilter,
onFilterChange,
availableFilters,
canCreateProject,
onStartCreate,
}: ProjectNavProps): React.ReactElement {
Expand Down Expand Up @@ -97,12 +90,6 @@ export function ProjectNav({
onSelect={onProjectSelect}
/>
))}
<div className={styles.navCaption}>{t('projects.view')}</div>
<FilterList
activeFilter={activeFilter}
onFilterChange={onFilterChange}
{...(availableFilters ? { availableFilters } : {})}
/>
</aside>
);
}
Loading
Loading