From fa600a50bc807a8c9e38b22d0fb6ae7a79ea015d Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 11 Apr 2022 17:00:46 +0000 Subject: [PATCH 01/23] Start users --- site/src/api/index.ts | 5 ++ site/src/test_helpers/entities.ts | 7 +++ site/src/test_helpers/handlers.ts | 3 + site/src/xServices/users/usersXService.ts | 76 +++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 site/src/xServices/users/usersXService.ts diff --git a/site/src/api/index.ts b/site/src/api/index.ts index 764e32489f438..73c94acbd7acd 100644 --- a/site/src/api/index.ts +++ b/site/src/api/index.ts @@ -69,6 +69,11 @@ export const getApiKey = async (): Promise => { return response.data } +export const getUsers = async (): Promise => { + const response = await axios.get("/api/v2/users") + return response.data +} + export const getBuildInfo = async (): Promise => { const response = await axios.get("/api/v2/buildinfo") return response.data diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index b3f6614e63ba3..5a1be7491832c 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -24,6 +24,13 @@ export const MockUser: UserResponse = { created_at: "", } +export const MockUser2: UserResponse = { + id: "test-user-2", + username: "TestUser2", + email: "test2@coder.com", + created_at: "", +} + export const MockOrganization: Organization = { id: "test-org", name: "Test Organization", diff --git a/site/src/test_helpers/handlers.ts b/site/src/test_helpers/handlers.ts index a7de1446ba9d6..662b5a8dcf14b 100644 --- a/site/src/test_helpers/handlers.ts +++ b/site/src/test_helpers/handlers.ts @@ -21,6 +21,9 @@ export const handlers = [ }), // users + rest.get("/api/v2/users", async (req, res, ctx) => { + return res(ctx.status(200), ctx.json([M.MockUser, M.MockUser2])) + }), rest.post("/api/v2/users/me/workspaces", async (req, res, ctx) => { return res(ctx.status(200), ctx.json(M.MockWorkspace)) }), diff --git a/site/src/xServices/users/usersXService.ts b/site/src/xServices/users/usersXService.ts new file mode 100644 index 0000000000000..dbadc9a8e899c --- /dev/null +++ b/site/src/xServices/users/usersXService.ts @@ -0,0 +1,76 @@ +import { assign, createMachine } from "xstate" +import * as API from "../../api" +import * as Types from "../../api/types" + +export interface UsersContext { +} + +export type UsersEvent = { type: 'GET_USERS' } + +export const usersMachine = + createMachine( + { + tsTypes: {} as import("./usersXService.typegen").Typegen0, + schema: { + context: {} as UsersContext, + events: {} as UsersEvent, + services: {} as { + getUsers: { + data: Types.UserResponse[] + } + }, + }, + context: { + }, + id: "usersState", + initial: "gettingUsers", + states: { + gettingUsers: { + invoke: { + src: "getUsers", + id: "getUsers", + onDone: [ + { + target: "#usersState.ready", + actions: ["assignUsers", "clearGetUsersError"] + }, + ], + onError: [ + { + actions: "assignGetUsersError", + target: "#usersState.error", + }, + ], + }, + tags: "loading", + }, + ready: { + on: { + GET_USERS: "gettingUsers" + } + }, + error: { + on: { + GET_USERS: "gettingUsers" + } + } + }, + }, + { + services: { + getUsers: API.getUsers + }, + actions: { + assignUsers: assign({ + me: (_, event) => event.data, + }), + assignGetUsersError: assign({ + getUsersError: (_, event) => event.data, + }), + clearGetUsersError: assign((context: UsersContext) => ({ + ...context, + getUsersError: undefined, + })), + }, + }, + ) From 665e21768fde7190e00c3415c376b6ed34b91f1f Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 11 Apr 2022 17:39:04 +0000 Subject: [PATCH 02/23] Set up fake response --- site/src/api/index.ts | 11 ++++++++--- site/src/api/types.ts | 20 ++++++++++++++++++++ site/src/test_helpers/entities.ts | 13 +++++++++++++ site/src/xServices/users/usersXService.ts | 10 ++++++---- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/site/src/api/index.ts b/site/src/api/index.ts index 73c94acbd7acd..b7e595c98f632 100644 --- a/site/src/api/index.ts +++ b/site/src/api/index.ts @@ -1,5 +1,6 @@ import axios, { AxiosRequestHeaders } from "axios" import { mutate } from "swr" +import { MockPager, MockUser, MockUser2 } from "../test_helpers" import * as Types from "./types" const CONTENT_TYPE_JSON: AxiosRequestHeaders = { @@ -69,9 +70,13 @@ export const getApiKey = async (): Promise => { return response.data } -export const getUsers = async (): Promise => { - const response = await axios.get("/api/v2/users") - return response.data +export const getUsers = async (): Promise => { + // const response = await axios.get("/api/v2/users") + // return response.data + return Promise.resolve({ + page: [MockUser, MockUser2], + pager: MockPager + }) } export const getBuildInfo = async (): Promise => { diff --git a/site/src/api/types.ts b/site/src/api/types.ts index 04f5192fd5279..15c6d04cf571a 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -1,3 +1,5 @@ +import internal from "stream"; + /** * `BuildInfoResponse` must be kept in sync with the go struct in buildinfo.go. */ @@ -74,3 +76,21 @@ export interface UserAgent { readonly ip_address: string readonly os: string } + +export interface Cursor { + after: string + before: string + limit: number + total: number +} +export interface Pager { + cursor: Cursor + next: string + previous: string + total: number +} + +export interface PagedUsers { + page: UserResponse[] + pager: Pager +} diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index 5a1be7491832c..fb1b77e6ace38 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -6,6 +6,7 @@ import { UserAgent, UserResponse, Workspace, + Pager } from "../api/types" export const MockSessionToken = { session_token: "my-session-token" } @@ -31,6 +32,18 @@ export const MockUser2: UserResponse = { created_at: "", } +export const MockPager: Pager = { + cursor: { + after: "", + before: "", + limit: 10, + total: 25 + }, + next: "", + previous: "", + total: 25 +} + export const MockOrganization: Organization = { id: "test-org", name: "Test Organization", diff --git a/site/src/xServices/users/usersXService.ts b/site/src/xServices/users/usersXService.ts index dbadc9a8e899c..786adeb85d44a 100644 --- a/site/src/xServices/users/usersXService.ts +++ b/site/src/xServices/users/usersXService.ts @@ -3,6 +3,9 @@ import * as API from "../../api" import * as Types from "../../api/types" export interface UsersContext { + users: Types.UserResponse[] + pager: Types.Pager + getUsersError: Error | unknown } export type UsersEvent = { type: 'GET_USERS' } @@ -16,12 +19,10 @@ export const usersMachine = events: {} as UsersEvent, services: {} as { getUsers: { - data: Types.UserResponse[] + data: Types.PagedUsers } }, }, - context: { - }, id: "usersState", initial: "gettingUsers", states: { @@ -62,7 +63,8 @@ export const usersMachine = }, actions: { assignUsers: assign({ - me: (_, event) => event.data, + users: (_, event) => event.data.page, + pager: (_, event) => event.data.pager }), assignGetUsersError: assign({ getUsersError: (_, event) => event.data, From 934e0600e095ee5c486cadc17e2adb0477fbed4d Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 11 Apr 2022 17:39:54 +0000 Subject: [PATCH 03/23] Update handler --- site/src/test_helpers/handlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/test_helpers/handlers.ts b/site/src/test_helpers/handlers.ts index 662b5a8dcf14b..51574c7833c83 100644 --- a/site/src/test_helpers/handlers.ts +++ b/site/src/test_helpers/handlers.ts @@ -22,7 +22,7 @@ export const handlers = [ // users rest.get("/api/v2/users", async (req, res, ctx) => { - return res(ctx.status(200), ctx.json([M.MockUser, M.MockUser2])) + return res(ctx.status(200), ctx.json({ page: [M.MockUser, M.MockUser2], pager: M.MockPager })) }), rest.post("/api/v2/users/me/workspaces", async (req, res, ctx) => { return res(ctx.status(200), ctx.json(M.MockWorkspace)) From a2a1a047855bb32aa2b039f6c21a5cdd512186a1 Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 11 Apr 2022 17:52:22 +0000 Subject: [PATCH 04/23] Update types --- site/package.json | 2 ++ site/src/api/types.ts | 10 +--------- site/src/test_helpers/entities.ts | 14 +++++--------- site/yarn.lock | 5 +++++ 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/site/package.json b/site/package.json index 7afb17240910a..a1525d560fe90 100644 --- a/site/package.json +++ b/site/package.json @@ -38,6 +38,7 @@ "react-dom": "17.0.2", "react-router-dom": "6.3.0", "swr": "1.2.2", + "uuid": "^8.3.2", "xstate": "4.30.6", "yup": "0.32.11" }, @@ -57,6 +58,7 @@ "@types/react": "17.0.43", "@types/react-dom": "17.0.14", "@types/superagent": "4.1.15", + "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "5.18.0", "@typescript-eslint/parser": "5.18.0", "@xstate/cli": "0.1.6", diff --git a/site/src/api/types.ts b/site/src/api/types.ts index 15c6d04cf571a..436653ca6684b 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -1,5 +1,3 @@ -import internal from "stream"; - /** * `BuildInfoResponse` must be kept in sync with the go struct in buildinfo.go. */ @@ -77,18 +75,12 @@ export interface UserAgent { readonly os: string } -export interface Cursor { +export interface Pager { after: string before: string limit: number total: number } -export interface Pager { - cursor: Cursor - next: string - previous: string - total: number -} export interface PagedUsers { page: UserResponse[] diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index fb1b77e6ace38..940b51889f563 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -8,6 +8,7 @@ import { Workspace, Pager } from "../api/types" +import { v4 as uuidv4 } from 'uuid'; export const MockSessionToken = { session_token: "my-session-token" } @@ -33,15 +34,10 @@ export const MockUser2: UserResponse = { } export const MockPager: Pager = { - cursor: { - after: "", - before: "", - limit: 10, - total: 25 - }, - next: "", - previous: "", - total: 25 + after: uuidv4(), + before: uuidv4(), + limit: 10, + total: 25 } export const MockOrganization: Organization = { diff --git a/site/yarn.lock b/site/yarn.lock index 5fb7275ecf8a4..ce5a09c965aa0 100644 --- a/site/yarn.lock +++ b/site/yarn.lock @@ -3751,6 +3751,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/webpack-env@^1.16.0": version "1.16.3" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" From 201b34a1aa2a0f06175683cbaac0946b1bee23eb Mon Sep 17 00:00:00 2001 From: Presley Date: Mon, 11 Apr 2022 20:42:59 +0000 Subject: [PATCH 05/23] Set up page --- site/src/AppRouter.tsx | 2 +- site/src/components/ErrorSummary/index.tsx | 4 ++-- site/src/pages/UsersPage/UsersPage.tsx | 25 ++++++++++++++++++++++ site/src/pages/users.tsx | 5 ----- site/src/xServices/StateContext.tsx | 7 ++++-- site/src/xServices/users/usersXService.ts | 7 ++++-- 6 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 site/src/pages/UsersPage/UsersPage.tsx delete mode 100644 site/src/pages/users.tsx diff --git a/site/src/AppRouter.tsx b/site/src/AppRouter.tsx index b15e06fb710e0..79d3d1b580c21 100644 --- a/site/src/AppRouter.tsx +++ b/site/src/AppRouter.tsx @@ -16,7 +16,7 @@ import { SettingsPage } from "./pages/settings" import { TemplatesPage } from "./pages/templates" import { TemplatePage } from "./pages/templates/[organization]/[template]" import { CreateWorkspacePage } from "./pages/templates/[organization]/[template]/create" -import { UsersPage } from "./pages/users" +import { UsersPage } from "./pages/UsersPage/UsersPage" import { WorkspacePage } from "./pages/workspaces/[workspace]" export const AppRouter: React.FC = () => ( diff --git a/site/src/components/ErrorSummary/index.tsx b/site/src/components/ErrorSummary/index.tsx index 13555dcd996dd..892291d2c0eee 100644 --- a/site/src/components/ErrorSummary/index.tsx +++ b/site/src/components/ErrorSummary/index.tsx @@ -1,13 +1,13 @@ import React from "react" export interface ErrorSummaryProps { - error: Error | undefined + error: Error | unknown } export const ErrorSummary: React.FC = ({ error }) => { // TODO: More interesting error page - if (typeof error === "undefined") { + if (!(error instanceof Error)) { return
{"Unknown error"}
} diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx new file mode 100644 index 0000000000000..a6747428bf49d --- /dev/null +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -0,0 +1,25 @@ +import { useActor } from "@xstate/react" +import React, { useContext } from "react" +import { ErrorSummary } from "../../components/ErrorSummary" +import { UsersTable } from "../../components/UsersTable/UsersTable" +import { XServiceContext } from "../../xServices/StateContext" + +export type Role = "Admin" | "Member" + +export interface User { + username: string + email: string + siteRole: Role +} + +export const UsersPage: React.FC = () => { + const xServices = useContext(XServiceContext) + const [usersState] = useActor(xServices.usersXService) + const { users, getUsersError } = usersState.context + + if (usersState.matches("error")) { + return + } else { + return + } +} diff --git a/site/src/pages/users.tsx b/site/src/pages/users.tsx deleted file mode 100644 index a04e1ab5b4646..0000000000000 --- a/site/src/pages/users.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from "react" - -export const UsersPage: React.FC = () => { - return
Coming soon!
-} diff --git a/site/src/xServices/StateContext.tsx b/site/src/xServices/StateContext.tsx index 211f1991bb14c..aa0fad0dc07e9 100644 --- a/site/src/xServices/StateContext.tsx +++ b/site/src/xServices/StateContext.tsx @@ -3,10 +3,12 @@ import React, { createContext } from "react" import { ActorRefFrom } from "xstate" import { authMachine } from "./auth/authXService" import { buildInfoMachine } from "./buildInfo/buildInfoXService" +import { usersMachine } from "./users/usersXService" interface XServiceContextType { - buildInfoXService: ActorRefFrom authXService: ActorRefFrom + buildInfoXService: ActorRefFrom + usersXService: ActorRefFrom } /** @@ -23,8 +25,9 @@ export const XServiceProvider: React.FC = ({ children }) => { return ( {children} diff --git a/site/src/xServices/users/usersXService.ts b/site/src/xServices/users/usersXService.ts index 786adeb85d44a..cc8b161149e44 100644 --- a/site/src/xServices/users/usersXService.ts +++ b/site/src/xServices/users/usersXService.ts @@ -4,8 +4,8 @@ import * as Types from "../../api/types" export interface UsersContext { users: Types.UserResponse[] - pager: Types.Pager - getUsersError: Error | unknown + pager?: Types.Pager + getUsersError?: Error | unknown } export type UsersEvent = { type: 'GET_USERS' } @@ -24,6 +24,9 @@ export const usersMachine = }, }, id: "usersState", + context: { + users: [], + }, initial: "gettingUsers", states: { gettingUsers: { From b45ddaf913e51b1e1ebf6cad5b4c61b3b71bc028 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 02:57:46 +0000 Subject: [PATCH 06/23] Start adding table --- site/src/api/types.ts | 1 + .../UsersTable/UsersTable.stories.tsx | 19 ++++++++ site/src/components/UsersTable/UsersTable.tsx | 48 +++++++++++++++++++ site/src/pages/UsersPage/UsersPage.tsx | 12 +---- site/src/test_helpers/entities.ts | 2 + 5 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 site/src/components/UsersTable/UsersTable.stories.tsx create mode 100644 site/src/components/UsersTable/UsersTable.tsx diff --git a/site/src/api/types.ts b/site/src/api/types.ts index 436653ca6684b..c20a6bf8b9422 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -15,6 +15,7 @@ export interface UserResponse { readonly username: string readonly email: string readonly created_at: string + siteRole?: "Admin" | "Member" } /** diff --git a/site/src/components/UsersTable/UsersTable.stories.tsx b/site/src/components/UsersTable/UsersTable.stories.tsx new file mode 100644 index 0000000000000..269e5098ae316 --- /dev/null +++ b/site/src/components/UsersTable/UsersTable.stories.tsx @@ -0,0 +1,19 @@ +import { ComponentMeta, Story } from "@storybook/react" +import React from "react" +import { MockUser, MockUser2 } from "../../test_helpers" +import { UsersTable, UsersTableProps } from "./UsersTable" + +export default { + title: "Components/UsersTable", + component: UsersTable, +} as ComponentMeta + +const Template: Story = (args) => + +export const Example = Template.bind({}) +Example.args = { + users: [ + MockUser, + MockUser2 + ] +} diff --git a/site/src/components/UsersTable/UsersTable.tsx b/site/src/components/UsersTable/UsersTable.tsx new file mode 100644 index 0000000000000..a08b103586279 --- /dev/null +++ b/site/src/components/UsersTable/UsersTable.tsx @@ -0,0 +1,48 @@ +import React from "react" +import { Pager, UserResponse } from "../../api/types" +import { Column, Table } from "../../components/Table" +import { EmptyState } from "../EmptyState" +import { UserCell } from "../Table/Cells/UserCell" + +const Language = { + usersTitle: "All users", + emptyMessage: "No users found", + usernameLabel: "User", + siteRoleLabel: "Site Role" +} + +const emptyState = ( + +) + +const columns: Column[] = [ + { + key: "email", + name: Language.usernameLabel, + renderer: (field, data) => { + return + }, + }, + { + key: "siteRole", + name: Language.siteRoleLabel + } +] + +export interface UsersTableProps { + users: UserResponse[] + pager?: Pager +} + +export const UsersTable: React.FC = ({ users, pager }) => { + return ( + + ) +} diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index a6747428bf49d..cac4690fafe1e 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -4,22 +4,14 @@ import { ErrorSummary } from "../../components/ErrorSummary" import { UsersTable } from "../../components/UsersTable/UsersTable" import { XServiceContext } from "../../xServices/StateContext" -export type Role = "Admin" | "Member" - -export interface User { - username: string - email: string - siteRole: Role -} - export const UsersPage: React.FC = () => { const xServices = useContext(XServiceContext) const [usersState] = useActor(xServices.usersXService) - const { users, getUsersError } = usersState.context + const { users, pager, getUsersError } = usersState.context if (usersState.matches("error")) { return } else { - return + return } } diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index 940b51889f563..120d71bff445e 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -24,6 +24,7 @@ export const MockUser: UserResponse = { username: "TestUser", email: "test@coder.com", created_at: "", + siteRole: "Admin" } export const MockUser2: UserResponse = { @@ -31,6 +32,7 @@ export const MockUser2: UserResponse = { username: "TestUser2", email: "test2@coder.com", created_at: "", + siteRole: "Member" } export const MockPager: Pager = { From 0c341edbff8f1c5becf5a8f7927371d3e9c7dcd0 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 03:25:58 +0000 Subject: [PATCH 07/23] Add header --- site/src/components/UsersTable/UsersTable.tsx | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/site/src/components/UsersTable/UsersTable.tsx b/site/src/components/UsersTable/UsersTable.tsx index a08b103586279..e37ecb0364f64 100644 --- a/site/src/components/UsersTable/UsersTable.tsx +++ b/site/src/components/UsersTable/UsersTable.tsx @@ -1,7 +1,9 @@ +import { makeStyles } from "@material-ui/styles" import React from "react" import { Pager, UserResponse } from "../../api/types" import { Column, Table } from "../../components/Table" import { EmptyState } from "../EmptyState" +import { Header } from "../Header" import { UserCell } from "../Table/Cells/UserCell" const Language = { @@ -37,12 +39,23 @@ export interface UsersTableProps { } export const UsersTable: React.FC = ({ users, pager }) => { + const styles = useStyles() return ( -
+
+
+
+ ) } + +const useStyles = makeStyles(() => ({ + flexColumn: { + display: "flex", + flexDirection: "column" + } +})) From aac1aee9add012850756e99034df4cd445dbdbc9 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 15:42:41 +0000 Subject: [PATCH 08/23] Add Header --- site/src/components/UsersTable/UsersTable.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/site/src/components/UsersTable/UsersTable.tsx b/site/src/components/UsersTable/UsersTable.tsx index e37ecb0364f64..8cc2a2972979e 100644 --- a/site/src/components/UsersTable/UsersTable.tsx +++ b/site/src/components/UsersTable/UsersTable.tsx @@ -7,6 +7,7 @@ import { Header } from "../Header" import { UserCell } from "../Table/Cells/UserCell" const Language = { + pageTitle: "Users", usersTitle: "All users", emptyMessage: "No users found", usernameLabel: "User", @@ -42,7 +43,10 @@ export const UsersTable: React.FC = ({ users, pager }) => { const styles = useStyles() return (
-
+
Date: Tue, 12 Apr 2022 15:56:40 +0000 Subject: [PATCH 09/23] Remove roles --- site/src/api/types.ts | 1 - site/src/test_helpers/entities.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/site/src/api/types.ts b/site/src/api/types.ts index c20a6bf8b9422..436653ca6684b 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -15,7 +15,6 @@ export interface UserResponse { readonly username: string readonly email: string readonly created_at: string - siteRole?: "Admin" | "Member" } /** diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index 120d71bff445e..940b51889f563 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -24,7 +24,6 @@ export const MockUser: UserResponse = { username: "TestUser", email: "test@coder.com", created_at: "", - siteRole: "Admin" } export const MockUser2: UserResponse = { @@ -32,7 +31,6 @@ export const MockUser2: UserResponse = { username: "TestUser2", email: "test2@coder.com", created_at: "", - siteRole: "Member" } export const MockPager: Pager = { From ca729e90a6dbd9cbe7edb471d7fa119b8647cee9 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 15:56:53 +0000 Subject: [PATCH 10/23] Add UsersPageView --- site/src/components/UsersTable/UsersTable.tsx | 38 ++++--------------- site/src/pages/UsersPage/UsersPage.tsx | 3 +- .../pages/UsersPage/UsersPageView.stories.tsx | 30 +++++++++++++++ site/src/pages/UsersPage/UsersPageView.tsx | 34 +++++++++++++++++ 4 files changed, 74 insertions(+), 31 deletions(-) create mode 100644 site/src/pages/UsersPage/UsersPageView.stories.tsx create mode 100644 site/src/pages/UsersPage/UsersPageView.tsx diff --git a/site/src/components/UsersTable/UsersTable.tsx b/site/src/components/UsersTable/UsersTable.tsx index 8cc2a2972979e..f412952755dc1 100644 --- a/site/src/components/UsersTable/UsersTable.tsx +++ b/site/src/components/UsersTable/UsersTable.tsx @@ -1,9 +1,7 @@ -import { makeStyles } from "@material-ui/styles" import React from "react" -import { Pager, UserResponse } from "../../api/types" +import { UserResponse } from "../../api/types" import { Column, Table } from "../../components/Table" import { EmptyState } from "../EmptyState" -import { Header } from "../Header" import { UserCell } from "../Table/Cells/UserCell" const Language = { @@ -11,7 +9,6 @@ const Language = { usersTitle: "All users", emptyMessage: "No users found", usernameLabel: "User", - siteRoleLabel: "Site Role" } const emptyState = ( @@ -28,38 +25,19 @@ const columns: Column[] = [ return }, }, - { - key: "siteRole", - name: Language.siteRoleLabel - } ] export interface UsersTableProps { users: UserResponse[] - pager?: Pager } -export const UsersTable: React.FC = ({ users, pager }) => { - const styles = useStyles() +export const UsersTable: React.FC = ({ users }) => { return ( -
-
-
- +
) } - -const useStyles = makeStyles(() => ({ - flexColumn: { - display: "flex", - flexDirection: "column" - } -})) diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index cac4690fafe1e..30cc567dd1e9a 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -3,6 +3,7 @@ import React, { useContext } from "react" import { ErrorSummary } from "../../components/ErrorSummary" import { UsersTable } from "../../components/UsersTable/UsersTable" import { XServiceContext } from "../../xServices/StateContext" +import { UsersPageView } from "./UsersPageView" export const UsersPage: React.FC = () => { const xServices = useContext(XServiceContext) @@ -12,6 +13,6 @@ export const UsersPage: React.FC = () => { if (usersState.matches("error")) { return } else { - return + return } } diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx new file mode 100644 index 0000000000000..a00c551df8502 --- /dev/null +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -0,0 +1,30 @@ +import { ComponentMeta, Story } from "@storybook/react" +import React from "react" +import { MockUser, MockUser2 } from "../../test_helpers" +import { UsersPageView, UsersPageViewProps } from "./UsersPageView" + +export default { + title: "pages/UsersPageView", + component: UsersPageView, +} as ComponentMeta + +const Template: Story = (args) => + +export const Ready = Template.bind({}) +Ready.args = { + users: [ + MockUser, + MockUser2 + ], + pager: { + total: 2, + after: "123", + before: "456", + limit: 10 + } +} +export const Loading = Template.bind({}) +Loading.args = { + users: [ + ] +} diff --git a/site/src/pages/UsersPage/UsersPageView.tsx b/site/src/pages/UsersPage/UsersPageView.tsx new file mode 100644 index 0000000000000..5d06581e226ff --- /dev/null +++ b/site/src/pages/UsersPage/UsersPageView.tsx @@ -0,0 +1,34 @@ +import { makeStyles } from "@material-ui/styles" +import React from "react" +import { UserResponse, Pager } from "../../api/types" +import { Header } from "../../components/Header" +import { UsersTable } from "../../components/UsersTable/UsersTable" + +const Language = { + pageTitle: "Users", +} + +export interface UsersPageViewProps { + users: UserResponse[] + pager?: Pager +} + +export const UsersPageView: React.FC = ({ users, pager }) => { + const styles = useStyles() + return ( +
+
+ +
+ ) +} + +const useStyles = makeStyles(() => ({ + flexColumn: { + display: "flex", + flexDirection: "column" + } +})) From 3fce4f025dbe2afe2c858791cb545c83376735ff Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 17:27:41 +0000 Subject: [PATCH 11/23] Add test --- site/src/pages/UsersPage/UsersPage.test.tsx | 17 +++++++++++++++++ site/src/test_helpers/entities.ts | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 site/src/pages/UsersPage/UsersPage.test.tsx diff --git a/site/src/pages/UsersPage/UsersPage.test.tsx b/site/src/pages/UsersPage/UsersPage.test.tsx new file mode 100644 index 0000000000000..9d5e61f05b9a0 --- /dev/null +++ b/site/src/pages/UsersPage/UsersPage.test.tsx @@ -0,0 +1,17 @@ +import { screen } from "@testing-library/react" +import React from "react" +import { render } from "../../test_helpers" +import { UsersPage } from "./UsersPage" + +describe("Users Page", () => { + it("has a header with the total number of users", async () => { + render() + const total = await screen.findByText(/\d+ total/) + expect(total.innerHTML).toEqual("2 total") + }) + it("shows users", async () => { + render() + const users = await screen.findAllByText(/.*@coder.com/) + expect(users.length).toEqual(2) + }) +}) diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index 940b51889f563..4610d5d3cc2a0 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -1,14 +1,14 @@ +import { v4 as uuidv4 } from "uuid" import { BuildInfoResponse, Organization, + Pager, Provisioner, Template, UserAgent, UserResponse, Workspace, - Pager } from "../api/types" -import { v4 as uuidv4 } from 'uuid'; export const MockSessionToken = { session_token: "my-session-token" } @@ -37,7 +37,7 @@ export const MockPager: Pager = { after: uuidv4(), before: uuidv4(), limit: 10, - total: 25 + total: 2, } export const MockOrganization: Organization = { From 96d3a723d65d3b803ab3635b3ada160930839ef0 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 17:36:21 +0000 Subject: [PATCH 12/23] Lint --- site/src/api/index.ts | 2 +- .../UsersTable/UsersTable.stories.tsx | 5 +- site/src/components/UsersTable/UsersTable.tsx | 19 +-- site/src/pages/UsersPage/UsersPage.tsx | 1 - .../pages/UsersPage/UsersPageView.stories.tsx | 12 +- site/src/pages/UsersPage/UsersPageView.tsx | 13 +- site/src/xServices/StateContext.tsx | 2 +- site/src/xServices/users/usersXService.ts | 125 +++++++++--------- 8 files changed, 78 insertions(+), 101 deletions(-) diff --git a/site/src/api/index.ts b/site/src/api/index.ts index b7e595c98f632..9540e90285213 100644 --- a/site/src/api/index.ts +++ b/site/src/api/index.ts @@ -75,7 +75,7 @@ export const getUsers = async (): Promise => { // return response.data return Promise.resolve({ page: [MockUser, MockUser2], - pager: MockPager + pager: MockPager, }) } diff --git a/site/src/components/UsersTable/UsersTable.stories.tsx b/site/src/components/UsersTable/UsersTable.stories.tsx index 269e5098ae316..4fa08f612f197 100644 --- a/site/src/components/UsersTable/UsersTable.stories.tsx +++ b/site/src/components/UsersTable/UsersTable.stories.tsx @@ -12,8 +12,5 @@ const Template: Story = (args) => export const Example = Template.bind({}) Example.args = { - users: [ - MockUser, - MockUser2 - ] + users: [MockUser, MockUser2], } diff --git a/site/src/components/UsersTable/UsersTable.tsx b/site/src/components/UsersTable/UsersTable.tsx index f412952755dc1..7fd1bfe8b6a41 100644 --- a/site/src/components/UsersTable/UsersTable.tsx +++ b/site/src/components/UsersTable/UsersTable.tsx @@ -11,18 +11,14 @@ const Language = { usernameLabel: "User", } -const emptyState = ( - -) +const emptyState = const columns: Column[] = [ { - key: "email", + key: "username", name: Language.usernameLabel, renderer: (field, data) => { - return + return }, }, ] @@ -32,12 +28,5 @@ export interface UsersTableProps { } export const UsersTable: React.FC = ({ users }) => { - return ( -
- ) + return
} diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index 30cc567dd1e9a..ca0c4bd71fed8 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -1,7 +1,6 @@ import { useActor } from "@xstate/react" import React, { useContext } from "react" import { ErrorSummary } from "../../components/ErrorSummary" -import { UsersTable } from "../../components/UsersTable/UsersTable" import { XServiceContext } from "../../xServices/StateContext" import { UsersPageView } from "./UsersPageView" diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx index a00c551df8502..94baf4e6fced2 100644 --- a/site/src/pages/UsersPage/UsersPageView.stories.tsx +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -12,19 +12,15 @@ const Template: Story = (args) => = ({ users, pager }) => const styles = useStyles() return (
-
+
) @@ -29,6 +26,6 @@ export const UsersPageView: React.FC = ({ users, pager }) => const useStyles = makeStyles(() => ({ flexColumn: { display: "flex", - flexDirection: "column" - } + flexDirection: "column", + }, })) diff --git a/site/src/xServices/StateContext.tsx b/site/src/xServices/StateContext.tsx index aa0fad0dc07e9..ecd16739224f8 100644 --- a/site/src/xServices/StateContext.tsx +++ b/site/src/xServices/StateContext.tsx @@ -27,7 +27,7 @@ export const XServiceProvider: React.FC = ({ children }) => { value={{ authXService: useInterpret(authMachine), buildInfoXService: useInterpret(buildInfoMachine), - usersXService: useInterpret(usersMachine) + usersXService: useInterpret(usersMachine), }} > {children} diff --git a/site/src/xServices/users/usersXService.ts b/site/src/xServices/users/usersXService.ts index cc8b161149e44..d02c98b84bd35 100644 --- a/site/src/xServices/users/usersXService.ts +++ b/site/src/xServices/users/usersXService.ts @@ -8,74 +8,73 @@ export interface UsersContext { getUsersError?: Error | unknown } -export type UsersEvent = { type: 'GET_USERS' } +export type UsersEvent = { type: "GET_USERS" } -export const usersMachine = - createMachine( - { - tsTypes: {} as import("./usersXService.typegen").Typegen0, - schema: { - context: {} as UsersContext, - events: {} as UsersEvent, - services: {} as { - getUsers: { - data: Types.PagedUsers - } - }, +export const usersMachine = createMachine( + { + tsTypes: {} as import("./usersXService.typegen").Typegen0, + schema: { + context: {} as UsersContext, + events: {} as UsersEvent, + services: {} as { + getUsers: { + data: Types.PagedUsers + } }, - id: "usersState", - context: { - users: [], + }, + id: "usersState", + context: { + users: [], + }, + initial: "gettingUsers", + states: { + gettingUsers: { + invoke: { + src: "getUsers", + id: "getUsers", + onDone: [ + { + target: "#usersState.ready", + actions: ["assignUsers", "clearGetUsersError"], + }, + ], + onError: [ + { + actions: "assignGetUsersError", + target: "#usersState.error", + }, + ], + }, + tags: "loading", }, - initial: "gettingUsers", - states: { - gettingUsers: { - invoke: { - src: "getUsers", - id: "getUsers", - onDone: [ - { - target: "#usersState.ready", - actions: ["assignUsers", "clearGetUsersError"] - }, - ], - onError: [ - { - actions: "assignGetUsersError", - target: "#usersState.error", - }, - ], - }, - tags: "loading", + ready: { + on: { + GET_USERS: "gettingUsers", }, - ready: { - on: { - GET_USERS: "gettingUsers" - } + }, + error: { + on: { + GET_USERS: "gettingUsers", }, - error: { - on: { - GET_USERS: "gettingUsers" - } - } }, }, - { - services: { - getUsers: API.getUsers - }, - actions: { - assignUsers: assign({ - users: (_, event) => event.data.page, - pager: (_, event) => event.data.pager - }), - assignGetUsersError: assign({ - getUsersError: (_, event) => event.data, - }), - clearGetUsersError: assign((context: UsersContext) => ({ - ...context, - getUsersError: undefined, - })), - }, + }, + { + services: { + getUsers: API.getUsers, + }, + actions: { + assignUsers: assign({ + users: (_, event) => event.data.page, + pager: (_, event) => event.data.pager, + }), + assignGetUsersError: assign({ + getUsersError: (_, event) => event.data, + }), + clearGetUsersError: assign((context: UsersContext) => ({ + ...context, + getUsersError: undefined, + })), }, - ) + }, +) From 67573809ad16afb49dd9b2d3838ce77f6ef2abd0 Mon Sep 17 00:00:00 2001 From: Presley Date: Tue, 12 Apr 2022 17:50:18 +0000 Subject: [PATCH 13/23] Storybook error summary --- .../ErrorSummary/ErrorSummary.stories.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 site/src/components/ErrorSummary/ErrorSummary.stories.tsx diff --git a/site/src/components/ErrorSummary/ErrorSummary.stories.tsx b/site/src/components/ErrorSummary/ErrorSummary.stories.tsx new file mode 100644 index 0000000000000..1e9f6dd6898b0 --- /dev/null +++ b/site/src/components/ErrorSummary/ErrorSummary.stories.tsx @@ -0,0 +1,17 @@ +import { ComponentMeta, Story } from "@storybook/react" +import React from "react" +import { ErrorSummary, ErrorSummaryProps } from "." + +export default { + title: "components/ErrorSummary", + component: ErrorSummary, +} as ComponentMeta + +const Template: Story = (args) => + +export const WithError = Template.bind({}) +WithError.args = { + error: new Error("Something went wrong!") +} + +export const WithUndefined = Template.bind({}) From b5fd9c88146a558f4c9e92e6b0c2fd43ad8c21ac Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 13 Apr 2022 19:49:50 +0000 Subject: [PATCH 14/23] Strip Pager to just what's currently needed --- site/package.json | 2 -- site/src/api/types.ts | 3 --- site/src/pages/UsersPage/UsersPageView.stories.tsx | 9 ++------- site/src/test_helpers/entities.ts | 3 --- site/yarn.lock | 5 ----- 5 files changed, 2 insertions(+), 20 deletions(-) diff --git a/site/package.json b/site/package.json index a1525d560fe90..7afb17240910a 100644 --- a/site/package.json +++ b/site/package.json @@ -38,7 +38,6 @@ "react-dom": "17.0.2", "react-router-dom": "6.3.0", "swr": "1.2.2", - "uuid": "^8.3.2", "xstate": "4.30.6", "yup": "0.32.11" }, @@ -58,7 +57,6 @@ "@types/react": "17.0.43", "@types/react-dom": "17.0.14", "@types/superagent": "4.1.15", - "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "5.18.0", "@typescript-eslint/parser": "5.18.0", "@xstate/cli": "0.1.6", diff --git a/site/src/api/types.ts b/site/src/api/types.ts index 436653ca6684b..9990851a74f4e 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -76,9 +76,6 @@ export interface UserAgent { } export interface Pager { - after: string - before: string - limit: number total: number } diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx index 94baf4e6fced2..fdf880206abaf 100644 --- a/site/src/pages/UsersPage/UsersPageView.stories.tsx +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -1,6 +1,6 @@ import { ComponentMeta, Story } from "@storybook/react" import React from "react" -import { MockUser, MockUser2 } from "../../test_helpers" +import { MockPager, MockUser, MockUser2 } from "../../test_helpers" import { UsersPageView, UsersPageViewProps } from "./UsersPageView" export default { @@ -13,12 +13,7 @@ const Template: Story = (args) => Date: Wed, 13 Apr 2022 19:55:10 +0000 Subject: [PATCH 15/23] Clean up ErrorSummary while I'm here --- site/src/components/ErrorSummary/index.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/site/src/components/ErrorSummary/index.tsx b/site/src/components/ErrorSummary/index.tsx index 892291d2c0eee..27b825fb33b27 100644 --- a/site/src/components/ErrorSummary/index.tsx +++ b/site/src/components/ErrorSummary/index.tsx @@ -1,5 +1,9 @@ import React from "react" +const Language = { + unknownErrorMessage: "Unknown error" +} + export interface ErrorSummaryProps { error: Error | unknown } @@ -8,8 +12,8 @@ export const ErrorSummary: React.FC = ({ error }) => { // TODO: More interesting error page if (!(error instanceof Error)) { - return
{"Unknown error"}
+ return
{Language.unknownErrorMessage}
+ } else { + return
{error.toString()}
} - - return
{error.toString()}
} From 272633b3731d81852cd6a001e9913c4627a31c5c Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 13 Apr 2022 20:00:57 +0000 Subject: [PATCH 16/23] Storybook tweaks --- site/src/components/UsersTable/UsersTable.stories.tsx | 5 +++++ site/src/pages/UsersPage/UsersPageView.stories.tsx | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/site/src/components/UsersTable/UsersTable.stories.tsx b/site/src/components/UsersTable/UsersTable.stories.tsx index 4fa08f612f197..394f31e662680 100644 --- a/site/src/components/UsersTable/UsersTable.stories.tsx +++ b/site/src/components/UsersTable/UsersTable.stories.tsx @@ -14,3 +14,8 @@ export const Example = Template.bind({}) Example.args = { users: [MockUser, MockUser2], } + +export const Empty = Template.bind({}) +Empty.args = { + users: [], +} diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx index fdf880206abaf..6d9fab53ac586 100644 --- a/site/src/pages/UsersPage/UsersPageView.stories.tsx +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -15,7 +15,7 @@ Ready.args = { users: [MockUser, MockUser2], pager: MockPager } -export const Loading = Template.bind({}) -Loading.args = { +export const Empty = Template.bind({}) +Empty.args = { users: [], } From 1dda810ba138162a6f556647d464f62299c4125a Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 13 Apr 2022 20:12:02 +0000 Subject: [PATCH 17/23] Extract language --- site/src/pages/UsersPage/UsersPage.test.tsx | 5 +++-- site/src/pages/UsersPage/UsersPageView.tsx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/site/src/pages/UsersPage/UsersPage.test.tsx b/site/src/pages/UsersPage/UsersPage.test.tsx index 9d5e61f05b9a0..51cd844f83378 100644 --- a/site/src/pages/UsersPage/UsersPage.test.tsx +++ b/site/src/pages/UsersPage/UsersPage.test.tsx @@ -1,13 +1,14 @@ import { screen } from "@testing-library/react" import React from "react" -import { render } from "../../test_helpers" +import { MockPager, render } from "../../test_helpers" import { UsersPage } from "./UsersPage" +import { Language } from "./UsersPageView" describe("Users Page", () => { it("has a header with the total number of users", async () => { render() const total = await screen.findByText(/\d+ total/) - expect(total.innerHTML).toEqual("2 total") + expect(total.innerHTML).toEqual(Language.pageSubtitle(MockPager)) }) it("shows users", async () => { render() diff --git a/site/src/pages/UsersPage/UsersPageView.tsx b/site/src/pages/UsersPage/UsersPageView.tsx index 5d6a42ed99086..a1512162e8ff1 100644 --- a/site/src/pages/UsersPage/UsersPageView.tsx +++ b/site/src/pages/UsersPage/UsersPageView.tsx @@ -4,8 +4,9 @@ import { Pager, UserResponse } from "../../api/types" import { Header } from "../../components/Header" import { UsersTable } from "../../components/UsersTable/UsersTable" -const Language = { +export const Language = { pageTitle: "Users", + pageSubtitle: (pager: Pager | undefined) => (pager ? `{pager.total} total` : ""), } export interface UsersPageViewProps { @@ -17,7 +18,7 @@ export const UsersPageView: React.FC = ({ users, pager }) => const styles = useStyles() return (
-
+
) From be60aa8634b84d829a9eb52104a630c6c5521a09 Mon Sep 17 00:00:00 2001 From: Presley Date: Wed, 13 Apr 2022 20:13:13 +0000 Subject: [PATCH 18/23] Lint --- site/src/components/ErrorSummary/ErrorSummary.stories.tsx | 2 +- site/src/components/ErrorSummary/index.tsx | 2 +- site/src/pages/UsersPage/UsersPageView.stories.tsx | 2 +- site/src/pages/UsersPage/UsersPageView.tsx | 2 +- site/src/test_helpers/entities.ts | 1 - 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/site/src/components/ErrorSummary/ErrorSummary.stories.tsx b/site/src/components/ErrorSummary/ErrorSummary.stories.tsx index 1e9f6dd6898b0..33b13106f25e3 100644 --- a/site/src/components/ErrorSummary/ErrorSummary.stories.tsx +++ b/site/src/components/ErrorSummary/ErrorSummary.stories.tsx @@ -11,7 +11,7 @@ const Template: Story = (args) => export const WithError = Template.bind({}) WithError.args = { - error: new Error("Something went wrong!") + error: new Error("Something went wrong!"), } export const WithUndefined = Template.bind({}) diff --git a/site/src/components/ErrorSummary/index.tsx b/site/src/components/ErrorSummary/index.tsx index 27b825fb33b27..9c528273f5571 100644 --- a/site/src/components/ErrorSummary/index.tsx +++ b/site/src/components/ErrorSummary/index.tsx @@ -1,7 +1,7 @@ import React from "react" const Language = { - unknownErrorMessage: "Unknown error" + unknownErrorMessage: "Unknown error", } export interface ErrorSummaryProps { diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx index 6d9fab53ac586..afb51b9ea0b41 100644 --- a/site/src/pages/UsersPage/UsersPageView.stories.tsx +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -13,7 +13,7 @@ const Template: Story = (args) => (pager ? `{pager.total} total` : ""), + pageSubtitle: (pager: Pager | undefined): string => (pager ? `{pager.total} total` : ""), } export interface UsersPageViewProps { diff --git a/site/src/test_helpers/entities.ts b/site/src/test_helpers/entities.ts index 1c07f3dd05036..39f254a95d3d9 100644 --- a/site/src/test_helpers/entities.ts +++ b/site/src/test_helpers/entities.ts @@ -1,4 +1,3 @@ -import { v4 as uuidv4 } from "uuid" import { BuildInfoResponse, Organization, From 8d2258444bdfb253be55c2d555bc62bc42da1943 Mon Sep 17 00:00:00 2001 From: Presley Pizzo <1290996+presleyp@users.noreply.github.com> Date: Thu, 14 Apr 2022 09:48:05 -0400 Subject: [PATCH 19/23] Add missing $ Co-authored-by: G r e y --- site/src/pages/UsersPage/UsersPageView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/UsersPage/UsersPageView.tsx b/site/src/pages/UsersPage/UsersPageView.tsx index 3c7e80c860a9a..082a9c9403650 100644 --- a/site/src/pages/UsersPage/UsersPageView.tsx +++ b/site/src/pages/UsersPage/UsersPageView.tsx @@ -6,7 +6,7 @@ import { UsersTable } from "../../components/UsersTable/UsersTable" export const Language = { pageTitle: "Users", - pageSubtitle: (pager: Pager | undefined): string => (pager ? `{pager.total} total` : ""), + pageSubtitle: (pager: Pager | undefined): string => (pager ? `${pager.total} total` : ""), } export interface UsersPageViewProps { From a50ea8ac47395db170a683495141ae076fee9c0c Mon Sep 17 00:00:00 2001 From: Presley Date: Thu, 14 Apr 2022 16:58:23 +0000 Subject: [PATCH 20/23] Lint --- site/src/pages/login.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/src/pages/login.test.tsx b/site/src/pages/login.test.tsx index c770c4ce0b991..5bb813da20c6b 100644 --- a/site/src/pages/login.test.tsx +++ b/site/src/pages/login.test.tsx @@ -40,8 +40,8 @@ describe("SignInPage", () => { // Set email / password const email = screen.getByLabelText(Language.emailLabel) const password = screen.getByLabelText(Language.passwordLabel) - userEvent.type(email, "test@coder.com") - userEvent.type(password, "password") + await userEvent.type(email, "test@coder.com") + await userEvent.type(password, "password") // Click sign-in const signInButton = await screen.findByText(Language.signIn) act(() => signInButton.click()) From 34eb66b125fb3160232148ebeaad58dfc8882f36 Mon Sep 17 00:00:00 2001 From: Presley Date: Thu, 14 Apr 2022 17:05:33 +0000 Subject: [PATCH 21/23] Lint --- site/src/pages/login.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/login.test.tsx b/site/src/pages/login.test.tsx index e32bf3fac10ec..f54379f7490fb 100644 --- a/site/src/pages/login.test.tsx +++ b/site/src/pages/login.test.tsx @@ -39,7 +39,7 @@ describe("SignInPage", () => { render() const email = screen.getByLabelText(Language.emailLabel) const password = screen.getByLabelText(Language.passwordLabel) - await userEvent.type(email, "test@coder.com") + await userEvent.type(email, "test@coder.com") await userEvent.type(password, "password") // Click sign-in const signInButton = await screen.findByText(Language.signIn) From 8c03bbc876f11a59ebe35607bc84c382fdcd931f Mon Sep 17 00:00:00 2001 From: Presley Date: Thu, 14 Apr 2022 17:16:03 +0000 Subject: [PATCH 22/23] Fix syntax error --- site/src/api/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/site/src/api/types.ts b/site/src/api/types.ts index bdd68ae14122e..b847771929797 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -86,6 +86,7 @@ export interface Pager { export interface PagedUsers { page: UserResponse[] pager: Pager +} export interface WorkspaceAutostartRequest { schedule: string From 1cbc8854dd6ca62784d7bb1b8dc368c2d0cdcb0e Mon Sep 17 00:00:00 2001 From: Presley Date: Thu, 14 Apr 2022 17:27:30 +0000 Subject: [PATCH 23/23] Lint --- site/src/api/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/api/types.ts b/site/src/api/types.ts index b847771929797..05c3a5cf07355 100644 --- a/site/src/api/types.ts +++ b/site/src/api/types.ts @@ -86,7 +86,7 @@ export interface Pager { export interface PagedUsers { page: UserResponse[] pager: Pager -} +} export interface WorkspaceAutostartRequest { schedule: string