feat: add workspace filter for shared workspaces (#21310)

resolves coder/internal#1129

<img width="361" height="462" alt="Screenshot 2025-12-17 at 20 49 07"
src="https://github.com/user-attachments/assets/e06843f0-15e4-41fc-b736-ccfaa303ee74"
/>
This commit is contained in:
Jaayden Halko
2025-12-18 14:46:19 -05:00
committed by GitHub
parent ca971dda29
commit 2de2cd5513
2 changed files with 86 additions and 0 deletions
@@ -0,0 +1,81 @@
import { mockApiError } from "testHelpers/entities";
import { withDashboardProvider } from "testHelpers/storybook";
import type { Meta, StoryObj } from "@storybook/react-vite";
import {
getDefaultFilterProps,
MockMenu,
} from "components/Filter/storyHelpers";
import type { WorkspaceFilterState } from "./WorkspacesFilter";
import { WorkspacesFilter } from "./WorkspacesFilter";
const defaultFilterProps = getDefaultFilterProps<WorkspaceFilterState>({
query: "owner:me",
menus: {
user: MockMenu,
template: MockMenu,
status: MockMenu,
organizations: MockMenu,
},
values: {
owner: "me",
template: undefined,
status: undefined,
},
});
const meta: Meta<typeof WorkspacesFilter> = {
title: "pages/WorkspacesPage/WorkspacesFilter",
component: WorkspacesFilter,
args: {
filter: defaultFilterProps.filter,
error: undefined,
templateMenu: MockMenu,
statusMenu: MockMenu,
},
decorators: [withDashboardProvider],
};
export default meta;
type Story = StoryObj<typeof WorkspacesFilter>;
export const Default: Story = {};
export const WithUserMenu: Story = {
args: {
userMenu: MockMenu,
},
};
export const WithOrganizations: Story = {
args: {
userMenu: MockMenu,
organizationsMenu: MockMenu,
},
parameters: {
showOrganizations: true,
},
};
export const Loading: Story = {
args: {
statusMenu: {
...MockMenu,
isInitializing: true,
},
},
};
export const WithError: Story = {
args: {
error: mockApiError({
message: "Invalid filter query",
validations: [{ field: "filter", detail: "Invalid filter syntax" }],
}),
},
};
export const WithDormantPreset: Story = {
parameters: {
features: ["advanced_template_scheduling"],
},
};
@@ -29,6 +29,7 @@ const workspaceFilterQuery = {
failed: "status:failed",
dormant: "dormant:true",
outdated: "outdated:true",
shared: "shared:true",
};
type FilterPreset = {
@@ -59,6 +60,10 @@ const PRESET_FILTERS: FilterPreset[] = [
query: workspaceFilterQuery.outdated,
name: "Outdated workspaces",
},
{
query: workspaceFilterQuery.shared,
name: "Shared workspaces",
},
];
// Defined outside component so that the array doesn't get reconstructed each render