From 8ad3a18b32edd8528f11ba5458b55bdf1de9882e Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 18:18:23 +0000 Subject: [PATCH 01/11] chore: remove global organization id state --- site/src/api/api.ts | 25 +++++++- site/src/api/queries/templates.ts | 33 +++++++--- .../modules/dashboard/DashboardProvider.tsx | 27 +++++--- site/src/modules/navigation.ts | 11 +++- .../pages/CreateUserPage/CreateUserForm.tsx | 5 +- .../pages/CreateUserPage/CreateUserPage.tsx | 3 - .../CreateWorkspacePage.tsx | 26 +++++--- site/src/pages/GroupsPage/GroupsPage.tsx | 4 +- .../GroupsPage/GroupPage.tsx | 2 +- .../GroupsPage/GroupSettingsPage.tsx | 2 +- .../GroupsPage/GroupsPage.tsx | 2 +- .../ManagementSettingsLayout.tsx | 61 ++++++------------- .../TemplateFilesPage/TemplateFilesPage.tsx | 10 ++- .../src/pages/TemplatePage/TemplateLayout.tsx | 9 +-- .../TemplateSchedulePage.tsx | 12 ++-- .../TemplateSettingsLayout.tsx | 5 +- .../TemplateVariablesPage.tsx | 6 +- .../TemplateVersionEditorPage.tsx | 6 +- .../TemplateVersionPage.tsx | 8 ++- .../src/pages/TemplatesPage/TemplatesPage.tsx | 4 +- .../AccountPage/AccountPage.tsx | 5 +- site/src/pages/UsersPage/UsersPage.tsx | 4 +- .../src/pages/WorkspacePage/WorkspacePage.tsx | 13 ++-- .../pages/WorkspacesPage/WorkspacesPage.tsx | 8 +-- .../src/pages/WorkspacesPage/filter/menus.tsx | 10 +-- site/src/testHelpers/storybook.tsx | 8 ++- 26 files changed, 170 insertions(+), 139 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 7aeefe98a444c..2edcf98af2ad3 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -300,7 +300,7 @@ const BASE_CONTENT_TYPE_JSON = { "Content-Type": "application/json", } as const satisfies HeadersInit; -type TemplateOptions = Readonly<{ +export type GetTemplateOptions = Readonly<{ readonly deprecated?: boolean; }>; @@ -625,12 +625,31 @@ class ApiMethods { return response.data; }; + getTemplates = async ( + options?: GetTemplateOptions, + ): Promise => { + const params: Record = {}; + if (options?.deprecated !== undefined) { + // Just want to check if it isn't undefined. If it has + // a boolean value, convert it to a string and include + // it as a param. + params["deprecated"] = String(options.deprecated); + } + + const response = await this.axios.get( + `/api/v2/templates`, + { params }, + ); + + return response.data; + }; + /** * @param organization Can be the organization's ID or name */ - getTemplates = async ( + getTemplatesByOrganization = async ( organization: string, - options?: TemplateOptions, + options?: GetTemplateOptions, ): Promise => { const params: Record = {}; if (options?.deprecated !== undefined) { diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 46d3d03507e08..793147eb456a9 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -1,5 +1,5 @@ import type { MutationOptions, QueryClient, QueryOptions } from "react-query"; -import { API } from "api/api"; +import { API, GetTemplateOptions } from "api/api"; import type { CreateTemplateRequest, CreateTemplateVersionRequest, @@ -38,16 +38,30 @@ export const templateByName = ( }; }; -const getTemplatesQueryKey = (organizationId: string, deprecated?: boolean) => [ - organizationId, +const getTemplatesQueryKey = (options?: GetTemplateOptions) => [ "templates", - deprecated, + options?.deprecated, ]; -export const templates = (organizationId: string, deprecated?: boolean) => { +export const templates = (options?: GetTemplateOptions) => { return { - queryKey: getTemplatesQueryKey(organizationId, deprecated), - queryFn: () => API.getTemplates(organizationId, { deprecated }), + queryKey: getTemplatesQueryKey(options), + queryFn: () => API.getTemplates(options), + }; +}; + +const getTemplatesByOrganizationQueryKey = ( + organization: string, + options?: GetTemplateOptions, +) => [organization, "templates", options?.deprecated]; + +export const templatesByOrganization = ( + organization: string, + options: GetTemplateOptions = {}, +) => { + return { + queryKey: getTemplatesByOrganizationQueryKey(organization, options), + queryFn: () => API.getTemplatesByOrganization(organization, options), }; }; @@ -100,7 +114,10 @@ export const setGroupRole = ( export const templateExamples = (organizationId: string) => { return { - queryKey: [...getTemplatesQueryKey(organizationId), "examples"], + queryKey: [ + ...getTemplatesByOrganizationQueryKey(organizationId), + "examples", + ], queryFn: () => API.getTemplateExamples(organizationId), }; }; diff --git a/site/src/modules/dashboard/DashboardProvider.tsx b/site/src/modules/dashboard/DashboardProvider.tsx index 7cc85e92ebb99..f92bff2c91ba8 100644 --- a/site/src/modules/dashboard/DashboardProvider.tsx +++ b/site/src/modules/dashboard/DashboardProvider.tsx @@ -7,19 +7,18 @@ import type { AppearanceConfig, Entitlements, Experiments, + Organization, } from "api/typesGenerated"; import { Loader } from "components/Loader/Loader"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; +import { organizations } from "api/queries/organizations"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; export interface DashboardValue { - /** - * @deprecated Do not add new usage of this value. It is being removed as part - * of the multi-org work. - */ - organizationId: string; entitlements: Entitlements; experiments: Experiments; appearance: AppearanceConfig; + organizations: Organization[]; } export const DashboardContext = createContext( @@ -31,9 +30,23 @@ export const DashboardProvider: FC = ({ children }) => { const entitlementsQuery = useQuery(entitlements(metadata.entitlements)); const experimentsQuery = useQuery(experiments(metadata.experiments)); const appearanceQuery = useQuery(appearance(metadata.appearance)); + const organizationsQuery = useQuery(organizations()); + + const error = + entitlementsQuery.error || + appearanceQuery.error || + experimentsQuery.error || + organizationsQuery.error; + + if (error) { + return ; + } const isLoading = - !entitlementsQuery.data || !appearanceQuery.data || !experimentsQuery.data; + !entitlementsQuery.data || + !appearanceQuery.data || + !experimentsQuery.data || + !organizationsQuery.data; if (isLoading) { return ; @@ -42,10 +55,10 @@ export const DashboardProvider: FC = ({ children }) => { return ( {children} diff --git a/site/src/modules/navigation.ts b/site/src/modules/navigation.ts index 7e76bdefd1904..d319d5972d1ea 100644 --- a/site/src/modules/navigation.ts +++ b/site/src/modules/navigation.ts @@ -27,8 +27,13 @@ export const linkToUsers = withFilter("/users", "status:active"); export const linkToTemplate = (organizationName: string, templateName: string): LinkThunk => - (dashboard) => - dashboard.experiments.includes("multi-organization") && - selectFeatureVisibility(dashboard.entitlements).multiple_organizations + (dashboard) => { + const hasMultipleOrganizations = dashboard.organizations.length > 1; + const organizationsEnabled = + dashboard.experiments.includes("multi-organization") && + selectFeatureVisibility(dashboard.entitlements).multiple_organizations; + + return hasMultipleOrganizations || organizationsEnabled ? `/templates/${organizationName}/${templateName}` : `/templates/${templateName}`; + }; diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 29f50d95a1b6a..3eab92853161b 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -65,7 +65,6 @@ export interface CreateUserFormProps { onCancel: () => void; error?: unknown; isLoading: boolean; - organizationId: string; authMethods?: TypesGen.AuthMethods; } @@ -86,7 +85,7 @@ const validationSchema = Yup.object({ export const CreateUserForm: FC< React.PropsWithChildren -> = ({ onSubmit, onCancel, error, isLoading, organizationId, authMethods }) => { +> = ({ onSubmit, onCancel, error, isLoading, authMethods }) => { const form: FormikContextType = useFormik({ initialValues: { @@ -94,7 +93,7 @@ export const CreateUserForm: FC< password: "", username: "", name: "", - organization_id: organizationId, + organization_id: "default", disable_login: false, login_type: "", }, diff --git a/site/src/pages/CreateUserPage/CreateUserPage.tsx b/site/src/pages/CreateUserPage/CreateUserPage.tsx index 4e42442649384..d43ace7827ad3 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.tsx @@ -5,7 +5,6 @@ import { useNavigate } from "react-router-dom"; import { authMethods, createUser } from "api/queries/users"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { Margins } from "components/Margins/Margins"; -import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; import { CreateUserForm } from "./CreateUserForm"; @@ -14,7 +13,6 @@ export const Language = { }; export const CreateUserPage: FC = () => { - const { organizationId } = useDashboard(); const navigate = useNavigate(); const queryClient = useQueryClient(); const createUserMutation = useMutation(createUser(queryClient)); @@ -38,7 +36,6 @@ export const CreateUserPage: FC = () => { navigate("..", { relative: "path" }); }} isLoading={createUserMutation.isLoading} - organizationId={organizationId} /> ); diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index fd7416329b4a1..c6812430ccfbe 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -33,13 +33,15 @@ export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number]; export type ExternalAuthPollingState = "idle" | "polling" | "abandoned"; const CreateWorkspacePage: FC = () => { - const { template: templateName } = useParams() as { - template: string; - }; + const { organization: organizationName = "default", template: templateName } = + useParams() as { + organization?: string; + template: string; + }; const { user: me } = useAuthenticated(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); - const { experiments, organizationId } = useDashboard(); + const { experiments } = useDashboard(); const customVersionId = searchParams.get("version") ?? undefined; const defaultName = searchParams.get("name"); @@ -54,15 +56,19 @@ const CreateWorkspacePage: FC = () => { ); const createWorkspaceMutation = useMutation(createWorkspace(queryClient)); - const templateQuery = useQuery(templateByName(organizationId, templateName)); - + const templateQuery = useQuery( + templateByName(organizationName, templateName), + ); const permissionsQuery = useQuery( - checkAuthorization({ - checks: createWorkspaceChecks(organizationId), - }), + templateQuery.data + ? checkAuthorization({ + checks: createWorkspaceChecks(templateQuery.data.organization_id), + }) + : { enabled: false }, ); const realizedVersionId = customVersionId ?? templateQuery.data?.active_version_id; + const organizationId = templateQuery.data?.organization_id; const richParametersQuery = useQuery({ ...richParameters(realizedVersionId ?? ""), enabled: realizedVersionId !== undefined, @@ -110,7 +116,7 @@ const CreateWorkspacePage: FC = () => { const autoCreationStartedRef = useRef(false); const automateWorkspaceCreation = useEffectEvent(async () => { - if (autoCreationStartedRef.current) { + if (autoCreationStartedRef.current || !organizationId) { return; } diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index 41303d533bbbe..d15e41d271b56 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -5,17 +5,15 @@ import { getErrorMessage } from "api/errors"; import { groups } from "api/queries/groups"; import { displayError } from "components/GlobalSnackbar/utils"; import { useAuthenticated } from "contexts/auth/RequireAuth"; -import { useDashboard } from "modules/dashboard/useDashboard"; import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { pageTitle } from "utils/page"; import GroupsPageView from "./GroupsPageView"; export const GroupsPage: FC = () => { const { permissions } = useAuthenticated(); - const { organizationId } = useDashboard(); const { createGroup: canCreateGroup } = permissions; const { template_rbac: isTemplateRBACEnabled } = useFeatureVisibility(); - const groupsQuery = useQuery(groups(organizationId)); + const groupsQuery = useQuery(groups("default")); useEffect(() => { if (groupsQuery.error) { diff --git a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx index b3be7c472d11c..6723140059098 100644 --- a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx +++ b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx @@ -51,7 +51,7 @@ import { pageTitle } from "utils/page"; export const GroupPage: FC = () => { const { organization = "default", groupName } = useParams() as { - organization: string; + organization?: string; groupName: string; }; const queryClient = useQueryClient(); diff --git a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupSettingsPage.tsx b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupSettingsPage.tsx index e07f44aeb99e6..3fa56487d9d02 100644 --- a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupSettingsPage.tsx +++ b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupSettingsPage.tsx @@ -12,7 +12,7 @@ import GroupSettingsPageView from "./GroupSettingsPageView"; export const GroupSettingsPage: FC = () => { const { organization = "default", groupName } = useParams() as { - organization: string; + organization?: string; groupName: string; }; const queryClient = useQueryClient(); diff --git a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupsPage.tsx b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupsPage.tsx index d8c756645363d..9f3ddd507ffaa 100644 --- a/site/src/pages/ManagementSettingsPage/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/ManagementSettingsPage/GroupsPage/GroupsPage.tsx @@ -30,7 +30,7 @@ export const GroupsPage: FC = () => { } = useFeatureVisibility(); const { experiments } = useDashboard(); const location = useLocation(); - const { organization = "default" } = useParams() as { organization: string }; + const { organization = "default" } = useParams() as { organization?: string }; const groupsQuery = useQuery(groups(organization)); const { organizations } = useOrganizationSettings(); diff --git a/site/src/pages/ManagementSettingsPage/ManagementSettingsLayout.tsx b/site/src/pages/ManagementSettingsPage/ManagementSettingsLayout.tsx index 6831fbc6a7db1..10f4896e21cbd 100644 --- a/site/src/pages/ManagementSettingsPage/ManagementSettingsLayout.tsx +++ b/site/src/pages/ManagementSettingsPage/ManagementSettingsLayout.tsx @@ -1,8 +1,7 @@ -import { createContext, type FC, Suspense, useContext } from "react"; +import { type FC, Suspense } from "react"; import { useQuery } from "react-query"; import { Outlet } from "react-router-dom"; import { deploymentConfig } from "api/queries/deployment"; -import { organizations } from "api/queries/organizations"; import type { Organization } from "api/typesGenerated"; import { Loader } from "components/Loader/Loader"; import { Margins } from "components/Margins/Margins"; @@ -14,29 +13,17 @@ import NotFoundPage from "pages/404Page/404Page"; import { DeploySettingsContext } from "../DeploySettingsPage/DeploySettingsLayout"; import { Sidebar } from "./Sidebar"; -type OrganizationSettingsContextValue = { - organizations: Organization[]; -}; - -const OrganizationSettingsContext = createContext< - OrganizationSettingsContextValue | undefined ->(undefined); +type OrganizationSettingsValue = { organizations: Organization[] }; -export const useOrganizationSettings = (): OrganizationSettingsContextValue => { - const context = useContext(OrganizationSettingsContext); - if (!context) { - throw new Error( - "useOrganizationSettings should be used inside of OrganizationSettingsLayout", - ); - } - return context; +export const useOrganizationSettings = (): OrganizationSettingsValue => { + const { organizations } = useDashboard(); + return { organizations }; }; export const ManagementSettingsLayout: FC = () => { const { permissions } = useAuthenticated(); const { experiments } = useDashboard(); const deploymentConfigQuery = useQuery(deploymentConfig()); - const organizationsQuery = useQuery(organizations()); const multiOrgExperimentEnabled = experiments.includes("multi-organization"); @@ -48,30 +35,20 @@ export const ManagementSettingsLayout: FC = () => { - {organizationsQuery.data ? ( - - -
- {deploymentConfigQuery.data ? ( - - }> - - - - ) : ( - - )} -
-
- ) : ( - - )} + +
+ {deploymentConfigQuery.data ? ( + + }> + + + + ) : ( + + )} +
diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx index 2a22129da766b..afb5718b78e52 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx @@ -9,15 +9,19 @@ import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { getTemplatePageTitle } from "../utils"; const TemplateFilesPage: FC = () => { - const { organization: organizationId = "default" } = useParams() as { - organization: string; + const { organization: organizationName = "default" } = useParams() as { + organization?: string; }; const { template, activeVersion } = useTemplateLayoutContext(); const { data: currentFiles } = useQuery( templateFiles(activeVersion.job.file_id), ); const previousVersionQuery = useQuery( - previousTemplateVersion(organizationId, template.name, activeVersion.name), + previousTemplateVersion( + organizationName, + template.name, + activeVersion.name, + ), ); const previousVersion = previousVersionQuery.data; const hasPreviousVersion = diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx index 00e4aeaf9ef1a..5897f438c47ab 100644 --- a/site/src/pages/TemplatePage/TemplateLayout.tsx +++ b/site/src/pages/TemplatePage/TemplateLayout.tsx @@ -71,14 +71,11 @@ export const TemplateLayout: FC = ({ children = , }) => { const navigate = useNavigate(); - const { template: templateName, organization: organizationId = "default" } = - useParams() as { - template: string; - organization: string; - }; + const { organization: organizationName = "default", template: templateName } = + useParams() as { organization?: string; template: string }; const { data, error, isLoading } = useQuery({ queryKey: ["template", templateName], - queryFn: () => fetchTemplate(organizationId, templateName), + queryFn: () => fetchTemplate(organizationName, templateName), }); const location = useLocation(); const paths = location.pathname.split("/"); diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index cf95bf3ba1422..78ed5cd84d969 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -7,19 +7,19 @@ import { templateByNameKey } from "api/queries/templates"; import type { UpdateTemplateMeta } from "api/typesGenerated"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useDashboard } from "modules/dashboard/useDashboard"; +import { linkToTemplate, useLinks } from "modules/navigation"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; const TemplateSchedulePage: FC = () => { - const { template: templateName } = useParams() as { template: string }; + const getLink = useLinks(); const navigate = useNavigate(); const queryClient = useQueryClient(); const { template } = useTemplateSettings(); const { entitlements } = useDashboard(); - const { organization: organizationId = "default" } = useParams() as { - organization: string; - }; + const { organization: organizationName = "default", template: templateName } = + useParams() as { organization?: string; template: string }; const allowAdvancedScheduling = entitlements.features["advanced_template_scheduling"].enabled; @@ -32,7 +32,7 @@ const TemplateSchedulePage: FC = () => { { onSuccess: async () => { await queryClient.invalidateQueries( - templateByNameKey(organizationId, templateName), + templateByNameKey(organizationName, templateName), ); displaySuccess("Template updated successfully"); // clear browser storage of workspaces impending deletion @@ -53,7 +53,7 @@ const TemplateSchedulePage: FC = () => { template={template} submitError={submitError} onCancel={() => { - navigate(`/templates/${organizationId}/${templateName}`); + navigate(getLink(linkToTemplate(organizationName, templateName))); }} onSubmit={(templateScheduleSettings) => { updateTemplate({ diff --git a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx index 57ed629ea0684..cb5fcec30d792 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx @@ -27,10 +27,7 @@ export function useTemplateSettings() { export const TemplateSettingsLayout: FC = () => { const { organization: organizationName = "default", template: templateName } = - useParams() as { - organization: string; - template: string; - }; + useParams() as { organization?: string; template: string }; const templateQuery = useQuery( templateByName(organizationName, templateName), ); diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx index 830186a379d13..67fb217b4ea15 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx @@ -19,10 +19,12 @@ import { Loader } from "components/Loader/Loader"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateVariablesPageView } from "./TemplateVariablesPageView"; +import { linkToTemplate, useLinks } from "modules/navigation"; export const TemplateVariablesPage: FC = () => { + const getLink = useLinks(); const { organization = "default", template: templateName } = useParams() as { - organization: string; + organization?: string; template: string; }; const { template } = useTemplateSettings(); @@ -97,7 +99,7 @@ export const TemplateVariablesPage: FC = () => { publishError, }} onCancel={() => { - navigate(`/templates/${organization}/${templateName}`); + navigate(getLink(linkToTemplate(organization, templateName))); }} onSubmit={async (formData) => { const request = filterEmptySensitiveVariables(formData, variables); diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx index a80afc99a9d50..c52f2f68251b2 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx @@ -35,7 +35,7 @@ export const TemplateVersionEditorPage: FC = () => { template: templateName, version: versionName, } = useParams() as { - organization: string; + organization?: string; template: string; version: string; }; @@ -194,7 +194,9 @@ export const TemplateVersionEditorPage: FC = () => { params.set("version", publishedVersion.id); } navigate( - `/templates/${organizationName}/${templateName}/workspace?${params.toString()}`, + `${getLink( + linkToTemplate(organizationName, templateName), + )}/workspace?${params.toString()}`, ); }} isBuilding={ diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index 5fd027a06476c..dc1f744c5fa3e 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -11,14 +11,16 @@ import { import { useAuthenticated } from "contexts/auth/RequireAuth"; import { pageTitle } from "utils/page"; import TemplateVersionPageView from "./TemplateVersionPageView"; +import { linkToTemplate, useLinks } from "modules/navigation"; export const TemplateVersionPage: FC = () => { + const getLink = useLinks(); const { organization: organizationName = "default", template: templateName, version: versionName, } = useParams() as { - organization: string; + organization?: string; template: string; version: string; }; @@ -51,7 +53,9 @@ export const TemplateVersionPage: FC = () => { const params = new URLSearchParams(); if (versionId) { params.set("version", versionId); - return `/templates/${organizationName}/${templateName}/workspace?${params.toString()}`; + return `${getLink( + linkToTemplate(organizationName, templateName), + )}/workspace?${params.toString()}`; } return undefined; }, [templateName, versionId, organizationName]); diff --git a/site/src/pages/TemplatesPage/TemplatesPage.tsx b/site/src/pages/TemplatesPage/TemplatesPage.tsx index a5bb98dfa44d2..dbeab83c21cd4 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.tsx @@ -3,15 +3,13 @@ import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; import { templateExamples, templates } from "api/queries/templates"; import { useAuthenticated } from "contexts/auth/RequireAuth"; -import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; import { TemplatesPageView } from "./TemplatesPageView"; export const TemplatesPage: FC = () => { const { permissions } = useAuthenticated(); - const { organizationId } = useDashboard(); - const templatesQuery = useQuery(templates(organizationId)); + const templatesQuery = useQuery(templates()); const examplesQuery = useQuery({ ...templateExamples("default"), enabled: permissions.createTemplates, diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx index 55bebfb1b53ec..642c4389ff579 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx @@ -13,11 +13,12 @@ export const AccountPage: FC = () => { const { permissions, user: me } = useAuthenticated(); const { updateProfile, updateProfileError, isUpdatingProfile } = useAuthContext(); - const { entitlements, organizationId } = useDashboard(); + const { entitlements } = useDashboard(); const hasGroupsFeature = entitlements.features.user_role_management.enabled; const groupsQuery = useQuery({ - ...groupsForUser(organizationId, me.id), + // TODO: This should probably list all groups, not just default org groups + ...groupsForUser("default", me.id), enabled: hasGroupsFeature, }); diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index 24880b94d80e3..05dab0f39ee35 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -40,11 +40,11 @@ const UsersPage: FC = () => { const navigate = useNavigate(); const location = useLocation(); const searchParamsResult = useSearchParams(); - const { entitlements, experiments, organizationId } = useDashboard(); + const { entitlements, experiments } = useDashboard(); const [searchParams] = searchParamsResult; const isMultiOrg = experiments.includes("multi-organization"); - const groupsByUserIdQuery = useQuery(groupsByUserId(organizationId)); + const groupsByUserIdQuery = useQuery(groupsByUserId("default")); const authMethodsQuery = useQuery(authMethods()); const { permissions, user: me } = useAuthenticated(); diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index a058d852f056b..41d27a989087b 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -3,7 +3,7 @@ import { useQuery, useQueryClient } from "react-query"; import { useParams } from "react-router-dom"; import { watchWorkspace } from "api/api"; import { checkAuthorization } from "api/queries/authCheck"; -import { templateByName } from "api/queries/templates"; +import { template as templateQueryOptions } from "api/queries/templates"; import { workspaceBuildsKey } from "api/queries/workspaceBuilds"; import { workspaceByOwnerAndName } from "api/queries/workspaces"; import type { Workspace } from "api/typesGenerated"; @@ -13,7 +13,6 @@ import { Margins } from "components/Margins/Margins"; import { useEffectEvent } from "hooks/hookPolyfills"; import { AnnouncementBanners } from "modules/dashboard/AnnouncementBanners/AnnouncementBanners"; import { Navbar } from "modules/dashboard/Navbar/Navbar"; -import { useDashboard } from "modules/dashboard/useDashboard"; import { workspaceChecks, type WorkspacePermissions } from "./permissions"; import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; @@ -25,7 +24,6 @@ export const WorkspacePage: FC = () => { }; const workspaceName = params.workspace; const username = params.username.replace("@", ""); - const { organizationId } = useDashboard(); // Workspace const workspaceQueryOptions = workspaceByOwnerAndName( @@ -36,10 +34,11 @@ export const WorkspacePage: FC = () => { const workspace = workspaceQuery.data; // Template - const templateQuery = useQuery({ - ...templateByName(organizationId, workspace?.template_name ?? ""), - enabled: workspace !== undefined, - }); + const templateQuery = useQuery( + workspace + ? templateQueryOptions(workspace.template_id) + : { enabled: false }, + ); const template = templateQuery.data; // Permissions diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 277716f6a959c..ecd5b4f4ac323 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -39,13 +39,12 @@ const WorkspacesPage: FC = () => { const searchParamsResult = useSafeSearchParams(); const pagination = usePagination({ searchParamsResult }); const { permissions } = useAuthenticated(); - const { entitlements, organizationId } = useDashboard(); + const { entitlements } = useDashboard(); - const templatesQuery = useQuery(templates(organizationId, false)); + const templatesQuery = useQuery(templates()); const filterProps = useWorkspacesFilter({ searchParamsResult, - organizationId, onFilterChange: () => pagination.goToPage(1), }); @@ -142,13 +141,11 @@ export default WorkspacesPage; type UseWorkspacesFilterOptions = { searchParamsResult: ReturnType; onFilterChange: () => void; - organizationId: string; }; const useWorkspacesFilter = ({ searchParamsResult, onFilterChange, - organizationId, }: UseWorkspacesFilterOptions) => { const filter = useFilter({ fallbackFilter: "owner:me", @@ -166,7 +163,6 @@ const useWorkspacesFilter = ({ }); const templateMenu = useTemplateFilterMenu({ - organizationId, value: filter.values.template, onChange: (option) => filter.update({ ...filter.values, template: option?.value }), diff --git a/site/src/pages/WorkspacesPage/filter/menus.tsx b/site/src/pages/WorkspacesPage/filter/menus.tsx index 0316f158e87c9..5502f05e082cb 100644 --- a/site/src/pages/WorkspacesPage/filter/menus.tsx +++ b/site/src/pages/WorkspacesPage/filter/menus.tsx @@ -16,18 +16,14 @@ import { getDisplayWorkspaceStatus } from "utils/workspace"; export const useTemplateFilterMenu = ({ value, onChange, - organizationId, -}: { organizationId: string } & Pick< - UseFilterMenuOptions, - "value" | "onChange" ->) => { +}: Pick, "value" | "onChange">) => { return useFilterMenu({ onChange, value, id: "template", getSelectedOption: async () => { // Show all templates including deprecated - const templates = await API.getTemplates(organizationId); + const templates = await API.getTemplates(); const template = templates.find((template) => template.name === value); if (template) { return { @@ -40,7 +36,7 @@ export const useTemplateFilterMenu = ({ }, getOptions: async (query) => { // Show all templates including deprecated - const templates = await API.getTemplates(organizationId); + const templates = await API.getTemplates(); const filteredTemplates = templates.filter( (template) => template.name.toLowerCase().includes(query.toLowerCase()) || diff --git a/site/src/testHelpers/storybook.tsx b/site/src/testHelpers/storybook.tsx index d795af5f1818d..30fbc28d0fccc 100644 --- a/site/src/testHelpers/storybook.tsx +++ b/site/src/testHelpers/storybook.tsx @@ -3,7 +3,11 @@ import type { FC } from "react"; import { withDefaultFeatures } from "api/api"; import type { Entitlements } from "api/typesGenerated"; import { DashboardContext } from "modules/dashboard/DashboardProvider"; -import { MockAppearanceConfig, MockEntitlements } from "./entities"; +import { + MockAppearanceConfig, + MockDefaultOrganization, + MockEntitlements, +} from "./entities"; export const withDashboardProvider = ( Story: FC, @@ -26,10 +30,10 @@ export const withDashboardProvider = ( return ( From 76a544c12d2497bf878223c89df9fc2bd0c300b4 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 18:44:13 +0000 Subject: [PATCH 02/11] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/src/api/queries/templates.ts | 2 +- site/src/modules/dashboard/DashboardProvider.tsx | 4 ++-- site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx | 5 +---- .../TemplateVariablesPage/TemplateVariablesPage.tsx | 2 +- site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 793147eb456a9..6575a590cb049 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -1,5 +1,5 @@ import type { MutationOptions, QueryClient, QueryOptions } from "react-query"; -import { API, GetTemplateOptions } from "api/api"; +import { API, type GetTemplateOptions } from "api/api"; import type { CreateTemplateRequest, CreateTemplateVersionRequest, diff --git a/site/src/modules/dashboard/DashboardProvider.tsx b/site/src/modules/dashboard/DashboardProvider.tsx index f92bff2c91ba8..f8cf6eca1a1ba 100644 --- a/site/src/modules/dashboard/DashboardProvider.tsx +++ b/site/src/modules/dashboard/DashboardProvider.tsx @@ -3,16 +3,16 @@ import { useQuery } from "react-query"; import { appearance } from "api/queries/appearance"; import { entitlements } from "api/queries/entitlements"; import { experiments } from "api/queries/experiments"; +import { organizations } from "api/queries/organizations"; import type { AppearanceConfig, Entitlements, Experiments, Organization, } from "api/typesGenerated"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; -import { organizations } from "api/queries/organizations"; -import { ErrorAlert } from "components/Alert/ErrorAlert"; export interface DashboardValue { entitlements: Entitlements; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index c6812430ccfbe..10bc47e039d1e 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -34,10 +34,7 @@ export type ExternalAuthPollingState = "idle" | "polling" | "abandoned"; const CreateWorkspacePage: FC = () => { const { organization: organizationName = "default", template: templateName } = - useParams() as { - organization?: string; - template: string; - }; + useParams() as { organization?: string; template: string }; const { user: me } = useAuthenticated(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx index 67fb217b4ea15..6779d3944007b 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx @@ -16,10 +16,10 @@ import type { import { ErrorAlert } from "components/Alert/ErrorAlert"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { Loader } from "components/Loader/Loader"; +import { linkToTemplate, useLinks } from "modules/navigation"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateVariablesPageView } from "./TemplateVariablesPageView"; -import { linkToTemplate, useLinks } from "modules/navigation"; export const TemplateVariablesPage: FC = () => { const getLink = useLinks(); diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index dc1f744c5fa3e..498b043902ffd 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -9,9 +9,9 @@ import { templateVersionByName, } from "api/queries/templates"; import { useAuthenticated } from "contexts/auth/RequireAuth"; +import { linkToTemplate, useLinks } from "modules/navigation"; import { pageTitle } from "utils/page"; import TemplateVersionPageView from "./TemplateVersionPageView"; -import { linkToTemplate, useLinks } from "modules/navigation"; export const TemplateVersionPage: FC = () => { const getLink = useLinks(); From 73088e9350845120cab1a6919e14face8d78b163 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 22:46:41 +0000 Subject: [PATCH 03/11] :^) --- site/src/testHelpers/handlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/testHelpers/handlers.ts b/site/src/testHelpers/handlers.ts index 4624a58f0ce4e..1d53a8e9aa975 100644 --- a/site/src/testHelpers/handlers.ts +++ b/site/src/testHelpers/handlers.ts @@ -42,7 +42,7 @@ export const handlers = [ // organizations http.get("/api/v2/organizations", () => { - return HttpResponse.json([M.MockDefaultOrganization, M.MockOrganization2]); + return HttpResponse.json([M.MockDefaultOrganization]); }), http.get("/api/v2/organizations/:organizationId", () => { return HttpResponse.json(M.MockOrganization); From 6348fd279dd8b383e404b533e9a86d2e14021862 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 23:03:40 +0000 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index 498b043902ffd..7ad0397d4b2d3 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -58,7 +58,7 @@ export const TemplateVersionPage: FC = () => { )}/workspace?${params.toString()}`; } return undefined; - }, [templateName, versionId, organizationName]); + }, [getLink, templateName, versionId, organizationName]); return ( <> From 5e51776e3be185c4e9c71efbbd7ad894dd35c4e0 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 23:15:41 +0000 Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/src/api/api.ts | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 2edcf98af2ad3..bb17fc7604d92 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -300,10 +300,17 @@ const BASE_CONTENT_TYPE_JSON = { "Content-Type": "application/json", } as const satisfies HeadersInit; -export type GetTemplateOptions = Readonly<{ +export type GetTemplatesOptions = Readonly<{ readonly deprecated?: boolean; }>; +function normalizeGetTemplatesOptions( + options: GetTemplatesOptions = {}, +): Record { + const { deprecated = false } = options; + return { deprecated: String(deprecated) }; +} + type SearchParamOptions = TypesGen.Pagination & { q?: string; }; @@ -626,16 +633,9 @@ class ApiMethods { }; getTemplates = async ( - options?: GetTemplateOptions, + options?: GetTemplatesOptions, ): Promise => { - const params: Record = {}; - if (options?.deprecated !== undefined) { - // Just want to check if it isn't undefined. If it has - // a boolean value, convert it to a string and include - // it as a param. - params["deprecated"] = String(options.deprecated); - } - + const params = normalizeGetTemplatesOptions(options); const response = await this.axios.get( `/api/v2/templates`, { params }, @@ -649,16 +649,9 @@ class ApiMethods { */ getTemplatesByOrganization = async ( organization: string, - options?: GetTemplateOptions, + options?: GetTemplatesOptions, ): Promise => { - const params: Record = {}; - if (options?.deprecated !== undefined) { - // Just want to check if it isn't undefined. If it has - // a boolean value, convert it to a string and include - // it as a param. - params["deprecated"] = String(options.deprecated); - } - + const params = normalizeGetTemplatesOptions(options); const response = await this.axios.get( `/api/v2/organizations/${organization}/templates`, { params }, From 8c90cea7aa1176bf02a398c0a23aa6f771340f9d Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 23:23:22 +0000 Subject: [PATCH 06/11] >:( --- site/src/api/queries/templates.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 6575a590cb049..d7a03dd4279ff 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -1,5 +1,5 @@ import type { MutationOptions, QueryClient, QueryOptions } from "react-query"; -import { API, type GetTemplateOptions } from "api/api"; +import { API, type GetTemplatesOptions } from "api/api"; import type { CreateTemplateRequest, CreateTemplateVersionRequest, @@ -38,12 +38,12 @@ export const templateByName = ( }; }; -const getTemplatesQueryKey = (options?: GetTemplateOptions) => [ +const getTemplatesQueryKey = (options?: GetTemplatesOptions) => [ "templates", options?.deprecated, ]; -export const templates = (options?: GetTemplateOptions) => { +export const templates = (options?: GetTemplatesOptions) => { return { queryKey: getTemplatesQueryKey(options), queryFn: () => API.getTemplates(options), @@ -52,12 +52,12 @@ export const templates = (options?: GetTemplateOptions) => { const getTemplatesByOrganizationQueryKey = ( organization: string, - options?: GetTemplateOptions, + options?: GetTemplatesOptions, ) => [organization, "templates", options?.deprecated]; export const templatesByOrganization = ( organization: string, - options: GetTemplateOptions = {}, + options: GetTemplatesOptions = {}, ) => { return { queryKey: getTemplatesByOrganizationQueryKey(organization, options), From e77af27312f6016aaa8e353bd1f7c141e0097358 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 23:24:59 +0000 Subject: [PATCH 07/11] dtt --- site/src/api/api.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index bb17fc7604d92..3b1a60f2ca134 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -307,8 +307,11 @@ export type GetTemplatesOptions = Readonly<{ function normalizeGetTemplatesOptions( options: GetTemplatesOptions = {}, ): Record { - const { deprecated = false } = options; - return { deprecated: String(deprecated) }; + const params: Record = {}; + if (options.deprecated !== undefined) { + params["deprecated"] = String(options.deprecated); + } + return params; } type SearchParamOptions = TypesGen.Pagination & { From dedc2044d23dccd95af14f7119a82b242c0f2e08 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 2 Aug 2024 23:43:02 +0000 Subject: [PATCH 08/11] d u h --- site/src/pages/CreateUserPage/CreateUserForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 3eab92853161b..cd67e87e86caf 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -93,7 +93,7 @@ export const CreateUserForm: FC< password: "", username: "", name: "", - organization_id: "default", + organization_id: "00000000-0000-0000-0000-000000000000", disable_login: false, login_type: "", }, From 5c4460b008e433aabebc53d3bd34e5cbbc8da1c2 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Sat, 3 Aug 2024 00:18:08 +0000 Subject: [PATCH 09/11] fix story --- site/src/pages/TerminalPage/TerminalPage.stories.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/site/src/pages/TerminalPage/TerminalPage.stories.tsx b/site/src/pages/TerminalPage/TerminalPage.stories.tsx index 0bbf993774eb4..310dc4e106917 100644 --- a/site/src/pages/TerminalPage/TerminalPage.stories.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.stories.tsx @@ -13,6 +13,7 @@ import { MockAppearanceConfig, MockAuthMethodsAll, MockBuildInfo, + MockDefaultOrganization, MockEntitlements, MockExperiments, MockUser, @@ -70,6 +71,7 @@ const meta = { { key: ["entitlements"], data: MockEntitlements }, { key: ["experiments"], data: MockExperiments }, { key: ["appearance"], data: MockAppearanceConfig }, + { key: ["organizations"], data: [MockDefaultOrganization] }, { key: getAuthorizationKey({ checks: permissionsToCheck }), data: { editWorkspaceProxies: true }, From da20aee57c54610c5a84f269d3c933e8af64556a Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 5 Aug 2024 16:11:09 +0000 Subject: [PATCH 10/11] use org name for form value --- site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 929c4fc313a0f..6e6d0b9471b91 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -239,7 +239,7 @@ export const CreateTemplateForm: FC = (props) => { value={selectedOrg} onChange={(newValue) => { setSelectedOrg(newValue); - void form.setFieldValue("organization", newValue?.id || ""); + void form.setFieldValue("organization", newValue?.name || ""); }} size="medium" /> From f7879a151bf947f52fc099fd8b95e3602f800376 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 5 Aug 2024 16:14:31 +0000 Subject: [PATCH 11/11] fix form value name --- site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 6e6d0b9471b91..d359530bd6f06 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -233,7 +233,7 @@ export const CreateTemplateForm: FC = (props) => { {showOrganizationPicker && (