diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 939a225a18b64..dd56860e368b1 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -1,16 +1,23 @@ -import { useMachine } from "@xstate/react" -import React from "react" +import { useMachine , useActor } from "@xstate/react" +import React, { useContext } from "react" import { workspacesMachine } from "../../xServices/workspaces/workspacesXService" import { WorkspacesPageView } from "./WorkspacesPageView" +import { XServiceContext } from "../../xServices/StateContext" const WorkspacesPage: React.FC = () => { + const xServices = useContext(XServiceContext) + const [authState] = useActor(xServices.authXService) + const { me } = authState.context + const [workspacesState] = useMachine(workspacesMachine) + return ( <> diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx index bdf72223b998a..6627ac6d88bac 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx @@ -6,21 +6,23 @@ import TableBody from "@material-ui/core/TableBody" import TableCell from "@material-ui/core/TableCell" import TableHead from "@material-ui/core/TableHead" import TableRow from "@material-ui/core/TableRow" +import TextField from "@material-ui/core/TextField/TextField" import AddCircleOutline from "@material-ui/icons/AddCircleOutline" import useTheme from "@material-ui/styles/useTheme" import dayjs from "dayjs" import relativeTime from "dayjs/plugin/relativeTime" -import React from "react" import { Link as RouterLink } from "react-router-dom" import * as TypesGen from "../../api/typesGenerated" import { AvatarData } from "../../components/AvatarData/AvatarData" import { Margins } from "../../components/Margins/Margins" import { Stack } from "../../components/Stack/Stack" import { getDisplayStatus } from "../../util/workspace" +import React, { useCallback, useState } from "react" dayjs.extend(relativeTime) export const Language = { + filterLabel: "Filter", createButton: "Create workspace", emptyView: "so you can check out your repositories, edit your source code, and build and test your software.", } @@ -28,16 +30,58 @@ export const Language = { export interface WorkspacesPageViewProps { loading?: boolean workspaces?: TypesGen.Workspace[] + me?: TypesGen.User error?: unknown } export const WorkspacesPageView: React.FC = (props) => { const styles = useStyles() const theme: Theme = useTheme() + const [filteredWorkspaces, setFilteredWorkspaces] = useState(props.workspaces) + const [query, setQuery] = useState("owner:me") + const updateQuery = (e: React.ChangeEvent) => { + const input = e.target.value + setQuery(input) + + if (input.length && props.workspaces?.length) { + const owners: string[] = [] + const newWorkspaces: TypesGen.Workspace[] = [] + const phrases = input.split(" ") + for (const p of phrases) { + if (p.startsWith("owner:")) { + let v = p.slice("owner:".length) + if (v === "me" && props.me) { + v = props.me.username + } + owners.push(v) + } + } + + for (const w of props.workspaces) { + for (const o of owners) { + if (o === w.owner_name) { + newWorkspaces.push(w) + } + } + } + setFilteredWorkspaces(newWorkspaces) + } + } + const handleQueryChange = useCallback(updateQuery, [props.workspaces, props.me]) + return (
+
+ + @@ -53,7 +97,7 @@ export const WorkspacesPageView: React.FC = (props) => - {!props.loading && !props.workspaces?.length && ( + {!props.loading && !filteredWorkspaces?.length && (
@@ -67,7 +111,7 @@ export const WorkspacesPageView: React.FC = (props) => )} - {props.workspaces?.map((workspace) => { + {filteredWorkspaces?.map((workspace) => { const status = getDisplayStatus(theme, workspace.latest_build) return ( pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy