From bcef49f372a856fb6c8166856f6d54406fddd853 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 19 Aug 2024 20:33:37 -0400 Subject: [PATCH 1/3] chore: sign the windows installer (#14353) (cherry picked from commit 6f9b3c1592bca6412ef01fb98758c068902757b8) --- scripts/build_windows_installer.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/build_windows_installer.sh b/scripts/build_windows_installer.sh index 3b4d15a3cee9c..1a20a2cca3fb3 100755 --- a/scripts/build_windows_installer.sh +++ b/scripts/build_windows_installer.sh @@ -19,6 +19,7 @@ source "$(dirname "${BASH_SOURCE[0]}")/lib.sh" agpl="${CODER_BUILD_AGPL:-0}" output_path="" version="" +sign_windows="${CODER_SIGN_WINDOWS:-0}" args="$(getopt -o "" -l agpl,output:,version: -- "$@")" eval set -- "$args" @@ -51,6 +52,11 @@ if [[ "$output_path" == "" ]]; then error "--output is a required parameter" fi +if [[ "$sign_windows" == 1 ]]; then + dependencies java + requiredenvs JSIGN_PATH EV_KEYSTORE EV_KEY EV_CERTIFICATE_PATH EV_TSA_URL GCLOUD_ACCESS_TOKEN +fi + if [[ "$#" != 1 ]]; then error "Exactly one argument must be provided to this script, $# were supplied" fi @@ -125,3 +131,7 @@ popd cp "$temp_dir/installer.exe" "$output_path" rm -rf "$temp_dir" + +if [[ "$sign_windows" == 1 ]]; then + execrelative ./sign_windows.sh "$output_path" 1>&2 +fi From 6b80b33dd3cda021104e54a6887a46bc201b5a82 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Fri, 16 Aug 2024 17:16:13 -0400 Subject: [PATCH 2/3] chore: handle merge conflicts --- .../CreateTemplateButton.stories.tsx | 22 +++ .../TemplatesPage/CreateTemplateButton.tsx | 56 +++++++ .../TemplatesPage/TemplatesPage.test.tsx | 63 ++++---- .../pages/TemplatesPage/TemplatesPageView.tsx | 137 ++++++++++-------- 4 files changed, 184 insertions(+), 94 deletions(-) create mode 100644 site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx create mode 100644 site/src/pages/TemplatesPage/CreateTemplateButton.tsx diff --git a/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx b/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx new file mode 100644 index 0000000000000..e6146d48162f9 --- /dev/null +++ b/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx @@ -0,0 +1,22 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { screen, userEvent } from "@storybook/test"; +import { CreateTemplateButton } from "./CreateTemplateButton"; + +const meta: Meta = { + title: "pages/TemplatesPage/CreateTemplateButton", + component: CreateTemplateButton, +}; + +export default meta; +type Story = StoryObj; + +export const Close: Story = {}; + +export const Open: Story = { + play: async ({ step }) => { + const user = userEvent.setup(); + await step("click on trigger", async () => { + await user.click(screen.getByRole("button")); + }); + }, +}; diff --git a/site/src/pages/TemplatesPage/CreateTemplateButton.tsx b/site/src/pages/TemplatesPage/CreateTemplateButton.tsx new file mode 100644 index 0000000000000..c0ba5e2734643 --- /dev/null +++ b/site/src/pages/TemplatesPage/CreateTemplateButton.tsx @@ -0,0 +1,56 @@ +import AddIcon from "@mui/icons-material/AddOutlined"; +import Inventory2 from "@mui/icons-material/Inventory2"; +import NoteAddOutlined from "@mui/icons-material/NoteAddOutlined"; +import UploadOutlined from "@mui/icons-material/UploadOutlined"; +import Button from "@mui/material/Button"; +import { + MoreMenu, + MoreMenuContent, + MoreMenuItem, + MoreMenuTrigger, +} from "components/MoreMenu/MoreMenu"; +import type { FC } from "react"; + +type CreateTemplateButtonProps = { + onNavigate: (path: string) => void; +}; + +export const CreateTemplateButton: FC = ({ + onNavigate, +}) => { + return ( + + + + + + { + onNavigate("/templates/new?exampleId=scratch"); + }} + > + + From scratch + + { + onNavigate("/templates/new"); + }} + > + + Upload template + + { + onNavigate("/starter-templates"); + }} + > + + Choose a starter template + + + + ); +}; diff --git a/site/src/pages/TemplatesPage/TemplatesPage.test.tsx b/site/src/pages/TemplatesPage/TemplatesPage.test.tsx index 535949b6d9dee..b6967f9e54e9b 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.test.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.test.tsx @@ -6,34 +6,37 @@ import { RequireAuth } from "contexts/auth/RequireAuth"; import TemplatesPage from "./TemplatesPage"; test("create template from scratch", async () => { - const user = userEvent.setup(); - const router = createMemoryRouter( - [ - { - element: , - children: [ - { - path: "/templates", - element: , - }, - { - path: "/starter-templates", - element:
, - }, - ], - }, - ], - { initialEntries: ["/templates"] }, - ); - render( - - - , - ); - const createTemplateButton = await screen.findByRole("button", { - name: "Create Template", - }); - await user.click(createTemplateButton); - await screen.findByTestId("new-template-page"); - expect(router.state.location.pathname).toBe("/starter-templates"); + const user = userEvent.setup(); + const router = createMemoryRouter( + [ + { + element: , + children: [ + { + path: "/templates", + element: , + }, + { + path: "/templates/new", + element:
, + }, + ], + }, + ], + { initialEntries: ["/templates"] }, + ); + render( + + + , + ); + const createTemplateButton = await screen.findByRole("button", { + name: "Create Template", + }); + await user.click(createTemplateButton); + const fromScratchMenuItem = await screen.findByText("From scratch"); + await user.click(fromScratchMenuItem); + await screen.findByTestId("new-template-page"); + expect(router.state.location.pathname).toBe("/templates/new"); + expect(router.state.location.search).toBe("?exampleId=scratch"); }); diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 17092e2705ee7..1e06b2e147ccd 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -38,6 +38,7 @@ import { TableRowSkeleton, } from "components/TableLoader/TableLoader"; import { useClickableTableRow } from "hooks/useClickableTableRow"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { linkToTemplate, useLinks } from "modules/navigation"; import { createDayString } from "utils/createDayString"; import { docs } from "utils/docs"; @@ -45,6 +46,7 @@ import { formatTemplateBuildTime, formatTemplateActiveDevelopers, } from "utils/templates"; +import { CreateTemplateButton } from "./CreateTemplateButton"; import { EmptyTemplates } from "./EmptyTemplates"; export const Language = { @@ -167,73 +169,80 @@ export const TemplatesPageView: FC = ({ examples, canCreateTemplates, }) => { - const isLoading = !templates; - const isEmpty = templates && templates.length === 0; - const navigate = useNavigate(); + const { experiments } = useDashboard(); + const isLoading = !templates; + const isEmpty = templates && templates.length === 0; + const navigate = useNavigate(); + const multiOrgExperimentEnabled = experiments.includes("multi-organization"); - return ( - - } - variant="contained" - onClick={() => { - navigate("/starter-templates"); - }} - > - Create Template - - ) - } - > - - - Templates - - - - {templates && templates.length > 0 && ( - - Select a template to create a workspace. - - )} - + const createTemplateAction = () => { + return multiOrgExperimentEnabled ? ( + + ) : ( + + ); + }; - {error ? ( - - ) : ( - - - - - {Language.nameLabel} - {Language.usedByLabel} - {Language.buildTimeLabel} - {Language.lastUpdatedLabel} - - - - - {isLoading && } + return ( + + + + + Templates + + + + + Select a template to create a workspace. + + - {isEmpty ? ( - - ) : ( - templates?.map((template) => ( - - )) - )} - -
-
- )} -
- ); + {error ? ( + + ) : ( + + + + + {Language.nameLabel} + + {Language.usedByLabel} + + {Language.buildTimeLabel} + {Language.lastUpdatedLabel} + + + + + {isLoading && } + + {isEmpty ? ( + + ) : ( + templates?.map((template) => ( + + )) + )} + +
+
+ )} + + ); }; const TableLoader: FC = () => { From fd7f68d4bbd8d6b4bf51e756e93c52f10d7da4ed Mon Sep 17 00:00:00 2001 From: Stephen Kirby Date: Tue, 20 Aug 2024 20:34:07 +0000 Subject: [PATCH 3/3] make fmt patch --- .../CreateTemplateButton.stories.tsx | 16 +-- .../TemplatesPage/CreateTemplateButton.tsx | 84 +++++------ .../TemplatesPage/TemplatesPage.test.tsx | 66 ++++----- .../pages/TemplatesPage/TemplatesPageView.tsx | 135 +++++++++--------- 4 files changed, 148 insertions(+), 153 deletions(-) diff --git a/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx b/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx index e6146d48162f9..f79e3e398b586 100644 --- a/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx +++ b/site/src/pages/TemplatesPage/CreateTemplateButton.stories.tsx @@ -3,8 +3,8 @@ import { screen, userEvent } from "@storybook/test"; import { CreateTemplateButton } from "./CreateTemplateButton"; const meta: Meta = { - title: "pages/TemplatesPage/CreateTemplateButton", - component: CreateTemplateButton, + title: "pages/TemplatesPage/CreateTemplateButton", + component: CreateTemplateButton, }; export default meta; @@ -13,10 +13,10 @@ type Story = StoryObj; export const Close: Story = {}; export const Open: Story = { - play: async ({ step }) => { - const user = userEvent.setup(); - await step("click on trigger", async () => { - await user.click(screen.getByRole("button")); - }); - }, + play: async ({ step }) => { + const user = userEvent.setup(); + await step("click on trigger", async () => { + await user.click(screen.getByRole("button")); + }); + }, }; diff --git a/site/src/pages/TemplatesPage/CreateTemplateButton.tsx b/site/src/pages/TemplatesPage/CreateTemplateButton.tsx index c0ba5e2734643..d3e2dc5ef2d64 100644 --- a/site/src/pages/TemplatesPage/CreateTemplateButton.tsx +++ b/site/src/pages/TemplatesPage/CreateTemplateButton.tsx @@ -3,54 +3,54 @@ import Inventory2 from "@mui/icons-material/Inventory2"; import NoteAddOutlined from "@mui/icons-material/NoteAddOutlined"; import UploadOutlined from "@mui/icons-material/UploadOutlined"; import Button from "@mui/material/Button"; +import type { FC } from "react"; import { - MoreMenu, - MoreMenuContent, - MoreMenuItem, - MoreMenuTrigger, + MoreMenu, + MoreMenuContent, + MoreMenuItem, + MoreMenuTrigger, } from "components/MoreMenu/MoreMenu"; -import type { FC } from "react"; type CreateTemplateButtonProps = { - onNavigate: (path: string) => void; + onNavigate: (path: string) => void; }; export const CreateTemplateButton: FC = ({ - onNavigate, + onNavigate, }) => { - return ( - - - - - - { - onNavigate("/templates/new?exampleId=scratch"); - }} - > - - From scratch - - { - onNavigate("/templates/new"); - }} - > - - Upload template - - { - onNavigate("/starter-templates"); - }} - > - - Choose a starter template - - - - ); + return ( + + + + + + { + onNavigate("/templates/new?exampleId=scratch"); + }} + > + + From scratch + + { + onNavigate("/templates/new"); + }} + > + + Upload template + + { + onNavigate("/starter-templates"); + }} + > + + Choose a starter template + + + + ); }; diff --git a/site/src/pages/TemplatesPage/TemplatesPage.test.tsx b/site/src/pages/TemplatesPage/TemplatesPage.test.tsx index b6967f9e54e9b..670362416338b 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.test.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.test.tsx @@ -6,37 +6,37 @@ import { RequireAuth } from "contexts/auth/RequireAuth"; import TemplatesPage from "./TemplatesPage"; test("create template from scratch", async () => { - const user = userEvent.setup(); - const router = createMemoryRouter( - [ - { - element: , - children: [ - { - path: "/templates", - element: , - }, - { - path: "/templates/new", - element:
, - }, - ], - }, - ], - { initialEntries: ["/templates"] }, - ); - render( - - - , - ); - const createTemplateButton = await screen.findByRole("button", { - name: "Create Template", - }); - await user.click(createTemplateButton); - const fromScratchMenuItem = await screen.findByText("From scratch"); - await user.click(fromScratchMenuItem); - await screen.findByTestId("new-template-page"); - expect(router.state.location.pathname).toBe("/templates/new"); - expect(router.state.location.search).toBe("?exampleId=scratch"); + const user = userEvent.setup(); + const router = createMemoryRouter( + [ + { + element: , + children: [ + { + path: "/templates", + element: , + }, + { + path: "/templates/new", + element:
, + }, + ], + }, + ], + { initialEntries: ["/templates"] }, + ); + render( + + + , + ); + const createTemplateButton = await screen.findByRole("button", { + name: "Create Template", + }); + await user.click(createTemplateButton); + const fromScratchMenuItem = await screen.findByText("From scratch"); + await user.click(fromScratchMenuItem); + await screen.findByTestId("new-template-page"); + expect(router.state.location.pathname).toBe("/templates/new"); + expect(router.state.location.search).toBe("?exampleId=scratch"); }); diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 1e06b2e147ccd..e7134ac65f9a6 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -169,80 +169,75 @@ export const TemplatesPageView: FC = ({ examples, canCreateTemplates, }) => { - const { experiments } = useDashboard(); - const isLoading = !templates; - const isEmpty = templates && templates.length === 0; - const navigate = useNavigate(); - const multiOrgExperimentEnabled = experiments.includes("multi-organization"); + const { experiments } = useDashboard(); + const isLoading = !templates; + const isEmpty = templates && templates.length === 0; + const navigate = useNavigate(); + const multiOrgExperimentEnabled = experiments.includes("multi-organization"); - const createTemplateAction = () => { - return multiOrgExperimentEnabled ? ( - - ) : ( - - ); - }; + const createTemplateAction = () => { + return multiOrgExperimentEnabled ? ( + + ) : ( + + ); + }; - return ( - - - - - Templates - - - - - Select a template to create a workspace. - - + return ( + + + + + Templates + + + + + Select a template to create a workspace. + + - {error ? ( - - ) : ( - - - - - {Language.nameLabel} - - {Language.usedByLabel} - - {Language.buildTimeLabel} - {Language.lastUpdatedLabel} - - - - - {isLoading && } + {error ? ( + + ) : ( + +
+ + + {Language.nameLabel} + {Language.usedByLabel} + {Language.buildTimeLabel} + {Language.lastUpdatedLabel} + + + + + {isLoading && } - {isEmpty ? ( - - ) : ( - templates?.map((template) => ( - - )) - )} - -
-
- )} -
- ); + {isEmpty ? ( + + ) : ( + templates?.map((template) => ( + + )) + )} + + + + )} +
+ ); }; const TableLoader: FC = () => {