From db63b1b41550bc44afc35f1512cc93e4939402d4 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Sat, 20 Jan 2024 00:08:29 +0000 Subject: [PATCH 1/2] refactor: move dashboard functionality to modules/dashboard/ --- site/src/AppRouter.tsx | 2 +- .../components/RequireAuth/RequireAuth.tsx | 2 +- .../DormantDeletionText.tsx | 2 +- .../WorkspaceStatusBadge.stories.tsx | 6 +- site/src/hooks/index.ts | 1 - .../dashboard}/DashboardLayout.test.tsx | 0 .../dashboard}/DashboardLayout.tsx | 4 +- .../dashboard}/DashboardProvider.tsx | 30 ++---- .../DeploymentBanner/DeploymentBanner.tsx | 0 .../DeploymentBannerView.stories.tsx | 0 .../DeploymentBanner/DeploymentBannerView.tsx | 0 .../LicenseBanner/LicenseBanner.tsx | 2 +- .../LicenseBannerView.stories.tsx | 0 .../LicenseBanner/LicenseBannerView.tsx | 0 .../dashboard}/Navbar/Navbar.test.tsx | 0 .../dashboard}/Navbar/Navbar.tsx | 4 +- .../dashboard}/Navbar/NavbarView.stories.tsx | 0 .../dashboard}/Navbar/NavbarView.test.tsx | 0 .../dashboard}/Navbar/NavbarView.tsx | 0 .../UserDropdown/UserDropdown.stories.tsx | 0 .../Navbar/UserDropdown/UserDropdown.tsx | 0 .../UserDropdown/UserDropdownContent.test.tsx | 0 .../UserDropdown/UserDropdownContent.tsx | 0 .../ServiceBanner/ServiceBanner.tsx | 2 +- .../ServiceBannerView.stories.tsx | 0 .../ServiceBanner/ServiceBannerView.tsx | 0 site/src/modules/dashboard/useDashboard.ts | 14 +++ .../dashboard}/useFeatureVisibility.ts | 2 +- .../dashboard}/useUpdateCheck.test.tsx | 4 +- .../dashboard}/useUpdateCheck.ts | 0 site/src/pages/AuditPage/AuditPage.tsx | 12 +-- .../DuplicateTemplateView.tsx | 2 +- .../ImportStarterTemplateView.tsx | 2 +- .../CreateTemplatePage/UploadTemplateView.tsx | 2 +- .../AppearanceSettingsPage.tsx | 10 +- .../OAuth2AppsSettingsPage.tsx | 6 +- .../ObservabilitySettingsPage.tsx | 2 +- .../SecuritySettingsPage.tsx | 2 +- site/src/pages/GroupsPage/GroupsPage.tsx | 12 +-- .../HealthPage/AccessURLPage.stories.tsx | 4 +- .../src/pages/HealthPage/DERPPage.stories.tsx | 4 +- .../HealthPage/DERPRegionPage.stories.tsx | 4 +- .../pages/HealthPage/DatabasePage.stories.tsx | 4 +- site/src/pages/HealthPage/HealthLayout.tsx | 92 +++++++++++-------- .../ProvisionerDaemonsPage.stories.tsx | 4 +- .../HealthPage/WebsocketPage.stories.tsx | 4 +- .../HealthPage/WorkspaceProxyPage.stories.tsx | 4 +- site/src/pages/HealthPage/storybook.tsx | 4 +- .../TemplateSettingsPage.tsx | 14 +-- .../TemplatePermissionsPage.tsx | 8 +- .../TemplateSchedulePage.tsx | 14 +-- .../AccountPage/AccountPage.tsx | 2 +- site/src/pages/UserSettingsPage/Sidebar.tsx | 2 +- site/src/pages/UsersPage/UsersLayout.tsx | 10 +- site/src/pages/UsersPage/UsersPage.tsx | 14 ++- .../WorkspaceBuildPageView.tsx | 12 +-- .../pages/WorkspacePage/Workspace.stories.tsx | 18 ++-- .../WorkspaceNotifications.tsx | 14 +-- .../src/pages/WorkspacePage/WorkspacePage.tsx | 20 ++-- .../WorkspacePage/WorkspaceReadyPage.tsx | 32 +++---- .../pages/WorkspacePage/WorkspaceTopbar.tsx | 70 +++++++------- .../pages/WorkspacesPage/WorkspacesPage.tsx | 10 +- .../WorkspacesPageView.stories.tsx | 6 +- .../pages/WorkspacesPage/filter/filter.tsx | 14 +-- site/src/testHelpers/renderHelpers.tsx | 2 +- site/src/testHelpers/storybook.tsx | 26 +++--- site/vite.config.ts | 5 +- 67 files changed, 280 insertions(+), 262 deletions(-) rename site/src/{components/Dashboard => modules/dashboard}/DashboardLayout.test.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/DashboardLayout.tsx (95%) rename site/src/{components/Dashboard => modules/dashboard}/DashboardProvider.tsx (81%) rename site/src/{components/Dashboard => modules/dashboard}/DeploymentBanner/DeploymentBanner.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/DeploymentBanner/DeploymentBannerView.stories.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/DeploymentBanner/DeploymentBannerView.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/LicenseBanner/LicenseBanner.tsx (83%) rename site/src/{components/Dashboard => modules/dashboard}/LicenseBanner/LicenseBannerView.stories.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/LicenseBanner/LicenseBannerView.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/Navbar.test.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/Navbar.tsx (89%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/NavbarView.stories.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/NavbarView.test.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/NavbarView.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/UserDropdown/UserDropdown.stories.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/UserDropdown/UserDropdown.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/UserDropdown/UserDropdownContent.test.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/Navbar/UserDropdown/UserDropdownContent.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/ServiceBanner/ServiceBanner.tsx (87%) rename site/src/{components/Dashboard => modules/dashboard}/ServiceBanner/ServiceBannerView.stories.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/ServiceBanner/ServiceBannerView.tsx (100%) create mode 100644 site/src/modules/dashboard/useDashboard.ts rename site/src/{hooks => modules/dashboard}/useFeatureVisibility.ts (79%) rename site/src/{components/Dashboard => modules/dashboard}/useUpdateCheck.test.tsx (100%) rename site/src/{components/Dashboard => modules/dashboard}/useUpdateCheck.ts (100%) diff --git a/site/src/AppRouter.tsx b/site/src/AppRouter.tsx index 8c4584ae34895..9cd8040c5aec5 100644 --- a/site/src/AppRouter.tsx +++ b/site/src/AppRouter.tsx @@ -5,7 +5,7 @@ import { BrowserRouter as Router, Navigate, } from "react-router-dom"; -import { DashboardLayout } from "./components/Dashboard/DashboardLayout"; +import { DashboardLayout } from "./modules/dashboard/DashboardLayout"; import { DeploySettingsLayout } from "./pages/DeploySettingsPage/DeploySettingsLayout"; import { FullScreenLoader } from "./components/Loader/FullScreenLoader"; import { RequireAuth } from "./components/RequireAuth/RequireAuth"; diff --git a/site/src/components/RequireAuth/RequireAuth.tsx b/site/src/components/RequireAuth/RequireAuth.tsx index 7a1eb9c6efc3c..ff748ba1dc58d 100644 --- a/site/src/components/RequireAuth/RequireAuth.tsx +++ b/site/src/components/RequireAuth/RequireAuth.tsx @@ -5,7 +5,7 @@ import { embedRedirect } from "utils/redirect"; import { isApiError } from "api/errors"; import { useAuth } from "contexts/AuthProvider/AuthProvider"; import { ProxyProvider } from "contexts/ProxyContext"; -import { DashboardProvider } from "../Dashboard/DashboardProvider"; +import { DashboardProvider } from "modules/dashboard/DashboardProvider"; import { FullScreenLoader } from "../Loader/FullScreenLoader"; export const RequireAuth: FC = () => { diff --git a/site/src/components/WorkspaceStatusBadge/DormantDeletionText.tsx b/site/src/components/WorkspaceStatusBadge/DormantDeletionText.tsx index 924fc59cb47d9..3d5e5a3ed5bd4 100644 --- a/site/src/components/WorkspaceStatusBadge/DormantDeletionText.tsx +++ b/site/src/components/WorkspaceStatusBadge/DormantDeletionText.tsx @@ -1,7 +1,7 @@ import { type FC } from "react"; import type { Workspace } from "api/typesGenerated"; import { displayDormantDeletion } from "utils/dormant"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; interface DormantDeletionTextProps { workspace: Workspace; diff --git a/site/src/components/WorkspaceStatusBadge/WorkspaceStatusBadge.stories.tsx b/site/src/components/WorkspaceStatusBadge/WorkspaceStatusBadge.stories.tsx index 691532de06849..ec86e1099f7d8 100644 --- a/site/src/components/WorkspaceStatusBadge/WorkspaceStatusBadge.stories.tsx +++ b/site/src/components/WorkspaceStatusBadge/WorkspaceStatusBadge.stories.tsx @@ -15,7 +15,7 @@ import { MockAppearanceConfig, } from "testHelpers/entities"; import { WorkspaceStatusBadge } from "./WorkspaceStatusBadge"; -import { DashboardProviderContext } from "components/Dashboard/DashboardProvider"; +import { DashboardContext } from "modules/dashboard/DashboardProvider"; import type { Meta, StoryObj } from "@storybook/react"; const MockedAppearance = { @@ -29,7 +29,7 @@ const meta: Meta = { component: WorkspaceStatusBadge, decorators: [ (Story) => ( - = { }} > - + ), ], }; diff --git a/site/src/hooks/index.ts b/site/src/hooks/index.ts index 7f0309dc3aefb..01571f37917b8 100644 --- a/site/src/hooks/index.ts +++ b/site/src/hooks/index.ts @@ -1,7 +1,6 @@ export * from "./useClickable"; export * from "./useClickableTableRow"; export * from "./useClipboard"; -export * from "./useFeatureVisibility"; export * from "./useMe"; export * from "./useOrganizationId"; export * from "./usePagination"; diff --git a/site/src/components/Dashboard/DashboardLayout.test.tsx b/site/src/modules/dashboard/DashboardLayout.test.tsx similarity index 100% rename from site/src/components/Dashboard/DashboardLayout.test.tsx rename to site/src/modules/dashboard/DashboardLayout.test.tsx diff --git a/site/src/components/Dashboard/DashboardLayout.tsx b/site/src/modules/dashboard/DashboardLayout.tsx similarity index 95% rename from site/src/components/Dashboard/DashboardLayout.tsx rename to site/src/modules/dashboard/DashboardLayout.tsx index 35cc12611e59d..1a4bdd3aa83e0 100644 --- a/site/src/components/Dashboard/DashboardLayout.tsx +++ b/site/src/modules/dashboard/DashboardLayout.tsx @@ -4,9 +4,9 @@ import Button from "@mui/material/Button"; import InfoOutlined from "@mui/icons-material/InfoOutlined"; import { type FC, type HTMLAttributes, Suspense } from "react"; import { Outlet } from "react-router-dom"; -import { LicenseBanner } from "components/Dashboard/LicenseBanner/LicenseBanner"; import { Loader } from "components/Loader/Loader"; -import { ServiceBanner } from "components/Dashboard/ServiceBanner/ServiceBanner"; +import { LicenseBanner } from "modules/dashboard/LicenseBanner/LicenseBanner"; +import { ServiceBanner } from "modules/dashboard/ServiceBanner/ServiceBanner"; import { usePermissions } from "hooks/usePermissions"; import { dashboardContentBottomPadding } from "theme/constants"; import { docs } from "utils/docs"; diff --git a/site/src/components/Dashboard/DashboardProvider.tsx b/site/src/modules/dashboard/DashboardProvider.tsx similarity index 81% rename from site/src/components/Dashboard/DashboardProvider.tsx rename to site/src/modules/dashboard/DashboardProvider.tsx index 7fcefb173eccf..fcd84f8d2d152 100644 --- a/site/src/components/Dashboard/DashboardProvider.tsx +++ b/site/src/modules/dashboard/DashboardProvider.tsx @@ -14,7 +14,6 @@ import { type PropsWithChildren, createContext, useCallback, - useContext, useState, } from "react"; import { appearance } from "api/queries/appearance"; @@ -27,16 +26,16 @@ interface Appearance { setPreview: (config: AppearanceConfig) => void; } -interface DashboardProviderValue { +export interface DashboardValue { buildInfo: BuildInfoResponse; entitlements: Entitlements; experiments: Experiments; appearance: Appearance; } -export const DashboardProviderContext = createContext< - DashboardProviderValue | undefined ->(undefined); +export const DashboardContext = createContext( + undefined, +); export const DashboardProvider: FC = ({ children }) => { const buildInfoQuery = useQuery(buildInfo()); @@ -83,7 +82,7 @@ export const DashboardProvider: FC = ({ children }) => { } return ( - = ({ children }) => { }} > {children} - + ); }; - -export const useDashboard = (): DashboardProviderValue => { - const context = useContext(DashboardProviderContext); - - if (!context) { - throw new Error( - "useDashboard only can be used inside of DashboardProvider", - ); - } - - return context; -}; - -export const useIsWorkspaceActionsEnabled = (): boolean => { - const { entitlements } = useDashboard(); - return entitlements.features["advanced_template_scheduling"].enabled; -}; diff --git a/site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx similarity index 100% rename from site/src/components/Dashboard/DeploymentBanner/DeploymentBanner.tsx rename to site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx diff --git a/site/src/components/Dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx similarity index 100% rename from site/src/components/Dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx rename to site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx diff --git a/site/src/components/Dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx similarity index 100% rename from site/src/components/Dashboard/DeploymentBanner/DeploymentBannerView.tsx rename to site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx diff --git a/site/src/components/Dashboard/LicenseBanner/LicenseBanner.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBanner.tsx similarity index 83% rename from site/src/components/Dashboard/LicenseBanner/LicenseBanner.tsx rename to site/src/modules/dashboard/LicenseBanner/LicenseBanner.tsx index 6702c3c2bc8d4..1acba81f52043 100644 --- a/site/src/components/Dashboard/LicenseBanner/LicenseBanner.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBanner.tsx @@ -1,5 +1,5 @@ import { type FC } from "react"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { LicenseBannerView } from "./LicenseBannerView"; export const LicenseBanner: FC = () => { diff --git a/site/src/components/Dashboard/LicenseBanner/LicenseBannerView.stories.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx similarity index 100% rename from site/src/components/Dashboard/LicenseBanner/LicenseBannerView.stories.tsx rename to site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx diff --git a/site/src/components/Dashboard/LicenseBanner/LicenseBannerView.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx similarity index 100% rename from site/src/components/Dashboard/LicenseBanner/LicenseBannerView.tsx rename to site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx diff --git a/site/src/components/Dashboard/Navbar/Navbar.test.tsx b/site/src/modules/dashboard/Navbar/Navbar.test.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/Navbar.test.tsx rename to site/src/modules/dashboard/Navbar/Navbar.test.tsx diff --git a/site/src/components/Dashboard/Navbar/Navbar.tsx b/site/src/modules/dashboard/Navbar/Navbar.tsx similarity index 89% rename from site/src/components/Dashboard/Navbar/Navbar.tsx rename to site/src/modules/dashboard/Navbar/Navbar.tsx index 4eeca4825e9fb..81cebff0cafd6 100644 --- a/site/src/components/Dashboard/Navbar/Navbar.tsx +++ b/site/src/modules/dashboard/Navbar/Navbar.tsx @@ -1,8 +1,8 @@ import { type FC } from "react"; import { useAuth } from "contexts/AuthProvider/AuthProvider"; import { useProxy } from "contexts/ProxyContext"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { useDashboard } from "modules/dashboard/useDashboard"; +import { useFeatureVisibility } from "../useFeatureVisibility"; import { useMe } from "hooks/useMe"; import { usePermissions } from "hooks/usePermissions"; import { NavbarView } from "./NavbarView"; diff --git a/site/src/components/Dashboard/Navbar/NavbarView.stories.tsx b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/NavbarView.stories.tsx rename to site/src/modules/dashboard/Navbar/NavbarView.stories.tsx diff --git a/site/src/components/Dashboard/Navbar/NavbarView.test.tsx b/site/src/modules/dashboard/Navbar/NavbarView.test.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/NavbarView.test.tsx rename to site/src/modules/dashboard/Navbar/NavbarView.test.tsx diff --git a/site/src/components/Dashboard/Navbar/NavbarView.tsx b/site/src/modules/dashboard/Navbar/NavbarView.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/NavbarView.tsx rename to site/src/modules/dashboard/Navbar/NavbarView.tsx diff --git a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx rename to site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx diff --git a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/UserDropdown/UserDropdown.tsx rename to site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.tsx diff --git a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx rename to site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx diff --git a/site/src/components/Dashboard/Navbar/UserDropdown/UserDropdownContent.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx similarity index 100% rename from site/src/components/Dashboard/Navbar/UserDropdown/UserDropdownContent.tsx rename to site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx diff --git a/site/src/components/Dashboard/ServiceBanner/ServiceBanner.tsx b/site/src/modules/dashboard/ServiceBanner/ServiceBanner.tsx similarity index 87% rename from site/src/components/Dashboard/ServiceBanner/ServiceBanner.tsx rename to site/src/modules/dashboard/ServiceBanner/ServiceBanner.tsx index 1c03dbd88fcbc..94e350b89eb2c 100644 --- a/site/src/components/Dashboard/ServiceBanner/ServiceBanner.tsx +++ b/site/src/modules/dashboard/ServiceBanner/ServiceBanner.tsx @@ -1,5 +1,5 @@ import { type FC } from "react"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { ServiceBannerView } from "./ServiceBannerView"; export const ServiceBanner: FC = () => { diff --git a/site/src/components/Dashboard/ServiceBanner/ServiceBannerView.stories.tsx b/site/src/modules/dashboard/ServiceBanner/ServiceBannerView.stories.tsx similarity index 100% rename from site/src/components/Dashboard/ServiceBanner/ServiceBannerView.stories.tsx rename to site/src/modules/dashboard/ServiceBanner/ServiceBannerView.stories.tsx diff --git a/site/src/components/Dashboard/ServiceBanner/ServiceBannerView.tsx b/site/src/modules/dashboard/ServiceBanner/ServiceBannerView.tsx similarity index 100% rename from site/src/components/Dashboard/ServiceBanner/ServiceBannerView.tsx rename to site/src/modules/dashboard/ServiceBanner/ServiceBannerView.tsx diff --git a/site/src/modules/dashboard/useDashboard.ts b/site/src/modules/dashboard/useDashboard.ts new file mode 100644 index 0000000000000..9bb71613d2157 --- /dev/null +++ b/site/src/modules/dashboard/useDashboard.ts @@ -0,0 +1,14 @@ +import { useContext } from "react"; +import { DashboardContext, type DashboardValue } from "./DashboardProvider"; + +export const useDashboard = (): DashboardValue => { + const context = useContext(DashboardContext); + + if (!context) { + throw new Error( + "useDashboard only can be used inside of DashboardProvider", + ); + } + + return context; +}; diff --git a/site/src/hooks/useFeatureVisibility.ts b/site/src/modules/dashboard/useFeatureVisibility.ts similarity index 79% rename from site/src/hooks/useFeatureVisibility.ts rename to site/src/modules/dashboard/useFeatureVisibility.ts index 00e491a6e303d..a43111639e0cb 100644 --- a/site/src/hooks/useFeatureVisibility.ts +++ b/site/src/modules/dashboard/useFeatureVisibility.ts @@ -1,5 +1,5 @@ import { FeatureName } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "./useDashboard"; import { selectFeatureVisibility } from "utils/entitlements"; export const useFeatureVisibility = (): Record => { diff --git a/site/src/components/Dashboard/useUpdateCheck.test.tsx b/site/src/modules/dashboard/useUpdateCheck.test.tsx similarity index 100% rename from site/src/components/Dashboard/useUpdateCheck.test.tsx rename to site/src/modules/dashboard/useUpdateCheck.test.tsx index b689f39d4252e..dec292346e57b 100644 --- a/site/src/components/Dashboard/useUpdateCheck.test.tsx +++ b/site/src/modules/dashboard/useUpdateCheck.test.tsx @@ -1,10 +1,10 @@ import { act, renderHook, waitFor } from "@testing-library/react"; -import { useUpdateCheck } from "./useUpdateCheck"; -import { QueryClient, QueryClientProvider } from "react-query"; import { type FC, type PropsWithChildren } from "react"; +import { QueryClient, QueryClientProvider } from "react-query"; import { rest } from "msw"; import { MockUpdateCheck } from "testHelpers/entities"; import { server } from "testHelpers/server"; +import { useUpdateCheck } from "./useUpdateCheck"; const createWrapper = (): FC => { const queryClient = new QueryClient(); diff --git a/site/src/components/Dashboard/useUpdateCheck.ts b/site/src/modules/dashboard/useUpdateCheck.ts similarity index 100% rename from site/src/components/Dashboard/useUpdateCheck.ts rename to site/src/modules/dashboard/useUpdateCheck.ts diff --git a/site/src/pages/AuditPage/AuditPage.tsx b/site/src/pages/AuditPage/AuditPage.tsx index 80f9cce869eb2..f9785379f4451 100644 --- a/site/src/pages/AuditPage/AuditPage.tsx +++ b/site/src/pages/AuditPage/AuditPage.tsx @@ -1,15 +1,15 @@ -import { isNonInitialPage } from "components/PaginationWidget/utils"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; import { useSearchParams } from "react-router-dom"; +import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { pageTitle } from "utils/page"; -import { AuditPageView } from "./AuditPageView"; +import { paginatedAudits } from "api/queries/audits"; +import { usePaginatedQuery } from "hooks/usePaginatedQuery"; import { useUserFilterMenu } from "components/Filter/UserFilter"; +import { isNonInitialPage } from "components/PaginationWidget/utils"; import { useFilter } from "components/Filter/filter"; import { useActionFilterMenu, useResourceTypeFilterMenu } from "./AuditFilter"; -import { usePaginatedQuery } from "hooks/usePaginatedQuery"; -import { paginatedAudits } from "api/queries/audits"; +import { AuditPageView } from "./AuditPageView"; const AuditPage: FC = () => { const { audit_log: isAuditLogVisible } = useFeatureVisibility(); diff --git a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx index 3fcdb594989fb..df0d2ae749427 100644 --- a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx @@ -12,7 +12,7 @@ import { useOrganizationId } from "hooks"; import { useNavigate, useSearchParams } from "react-router-dom"; import { CreateTemplateForm } from "./CreateTemplateForm"; import { Loader } from "components/Loader/Loader"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; export const DuplicateTemplateView = () => { diff --git a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx index 38e596b9081e1..ae327041dd44e 100644 --- a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx @@ -11,7 +11,7 @@ import { useOrganizationId } from "hooks"; import { useNavigate, useSearchParams } from "react-router-dom"; import { CreateTemplateForm } from "./CreateTemplateForm"; import { Loader } from "components/Loader/Loader"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { firstVersionFromExample, getFormPermissions, diff --git a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx index b3eb11a7c1c3c..4c4e0e1146eb9 100644 --- a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx @@ -8,7 +8,7 @@ import { import { useOrganizationId } from "hooks"; import { useNavigate } from "react-router-dom"; import { CreateTemplateForm } from "./CreateTemplateForm"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; import { uploadFile } from "api/queries/files"; diff --git a/site/src/pages/DeploySettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx b/site/src/pages/DeploySettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx index 439dc69f31763..fe5bd57fc42ca 100644 --- a/site/src/pages/DeploySettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx +++ b/site/src/pages/DeploySettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx @@ -1,13 +1,13 @@ -import { UpdateAppearanceConfig } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import { AppearanceSettingsPageView } from "./AppearanceSettingsPageView"; import { useMutation, useQueryClient } from "react-query"; +import type { UpdateAppearanceConfig } from "api/typesGenerated"; +import { useDashboard } from "modules/dashboard/useDashboard"; +import { pageTitle } from "utils/page"; import { updateAppearance } from "api/queries/appearance"; import { getErrorMessage } from "api/errors"; import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; +import { AppearanceSettingsPageView } from "./AppearanceSettingsPageView"; // ServiceBanner is unlike the other Deployment Settings pages because it // implements a form, whereas the others are read-only. We make this diff --git a/site/src/pages/DeploySettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx b/site/src/pages/DeploySettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx index 6e2035f2f9107..5f2aeb2cf3ab3 100644 --- a/site/src/pages/DeploySettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx +++ b/site/src/pages/DeploySettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx @@ -1,8 +1,8 @@ +import { type FC } from "react"; +import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; import { getApps } from "api/queries/oauth2"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { FC } from "react"; -import { Helmet } from "react-helmet-async"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; import OAuth2AppsSettingsPageView from "./OAuth2AppsSettingsPageView"; diff --git a/site/src/pages/DeploySettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx b/site/src/pages/DeploySettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx index ece84c7e685bc..520e8a6b25060 100644 --- a/site/src/pages/DeploySettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx +++ b/site/src/pages/DeploySettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx @@ -1,7 +1,7 @@ import { type FC } from "react"; import { Helmet } from "react-helmet-async"; import { pageTitle } from "utils/page"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { useDeploySettings } from "../DeploySettingsLayout"; import { ObservabilitySettingsPageView } from "./ObservabilitySettingsPageView"; diff --git a/site/src/pages/DeploySettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx b/site/src/pages/DeploySettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx index 020af05f45a4f..e82f00a4b4a2e 100644 --- a/site/src/pages/DeploySettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx +++ b/site/src/pages/DeploySettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx @@ -1,7 +1,7 @@ import { type FC } from "react"; import { Helmet } from "react-helmet-async"; import { pageTitle } from "utils/page"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { SecuritySettingsPageView } from "./SecuritySettingsPageView"; import { useDeploySettings } from "../DeploySettingsLayout"; diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index 37bb1abfc2d89..ba7594a3503c8 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -1,14 +1,14 @@ -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { type FC, useEffect } from "react"; +import { Helmet } from "react-helmet-async"; +import { useQuery } from "react-query"; +import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { useOrganizationId } from "hooks/useOrganizationId"; import { usePermissions } from "hooks/usePermissions"; -import { FC, useEffect } from "react"; -import { Helmet } from "react-helmet-async"; import { pageTitle } from "utils/page"; -import GroupsPageView from "./GroupsPageView"; -import { useQuery } from "react-query"; +import { getErrorMessage } from "api/errors"; import { groups } from "api/queries/groups"; import { displayError } from "components/GlobalSnackbar/utils"; -import { getErrorMessage } from "api/errors"; +import GroupsPageView from "./GroupsPageView"; export const GroupsPage: FC = () => { const organizationId = useOrganizationId(); diff --git a/site/src/pages/HealthPage/AccessURLPage.stories.tsx b/site/src/pages/HealthPage/AccessURLPage.stories.tsx index 31ed1e32a2961..1fddaa03acb5a 100644 --- a/site/src/pages/HealthPage/AccessURLPage.stories.tsx +++ b/site/src/pages/HealthPage/AccessURLPage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as AccessURL }; diff --git a/site/src/pages/HealthPage/DERPPage.stories.tsx b/site/src/pages/HealthPage/DERPPage.stories.tsx index 8e87d3c03b2fb..194552361f568 100644 --- a/site/src/pages/HealthPage/DERPPage.stories.tsx +++ b/site/src/pages/HealthPage/DERPPage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as DERP }; diff --git a/site/src/pages/HealthPage/DERPRegionPage.stories.tsx b/site/src/pages/HealthPage/DERPRegionPage.stories.tsx index 6305c2eecc7b1..d462403be0c26 100644 --- a/site/src/pages/HealthPage/DERPRegionPage.stories.tsx +++ b/site/src/pages/HealthPage/DERPRegionPage.stories.tsx @@ -18,4 +18,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as DERPRegion }; diff --git a/site/src/pages/HealthPage/DatabasePage.stories.tsx b/site/src/pages/HealthPage/DatabasePage.stories.tsx index b250dbce68afe..f2ec5c5d0cf57 100644 --- a/site/src/pages/HealthPage/DatabasePage.stories.tsx +++ b/site/src/pages/HealthPage/DatabasePage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as Database }; diff --git a/site/src/pages/HealthPage/HealthLayout.tsx b/site/src/pages/HealthPage/HealthLayout.tsx index 0aef42e457991..df8b6fa166bca 100644 --- a/site/src/pages/HealthPage/HealthLayout.tsx +++ b/site/src/pages/HealthPage/HealthLayout.tsx @@ -1,24 +1,25 @@ -import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Loader } from "components/Loader/Loader"; -import { Helmet } from "react-helmet-async"; -import { pageTitle } from "utils/page"; -import { createDayString } from "utils/createDayString"; -import { DashboardFullPage } from "components/Dashboard/DashboardLayout"; -import ReplayIcon from "@mui/icons-material/Replay"; -import { health, refreshHealth } from "api/queries/debug"; -import { useTheme } from "@mui/material/styles"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import CircularProgress from "@mui/material/CircularProgress"; +import ReplayIcon from "@mui/icons-material/Replay"; +import NotificationsOffOutlined from "@mui/icons-material/NotificationsOffOutlined"; +import { cx } from "@emotion/css"; +import { useTheme } from "@emotion/react"; +import { type FC, Suspense } from "react"; +import { Helmet } from "react-helmet-async"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { NavLink, Outlet } from "react-router-dom"; -import { css } from "@emotion/css"; import kebabCase from "lodash/fp/kebabCase"; -import { Suspense } from "react"; +import { health, refreshHealth } from "api/queries/debug"; +import type { HealthSeverity } from "api/typesGenerated"; +import { type ClassName, useClassName } from "hooks/useClassName"; +import { pageTitle } from "utils/page"; +import { createDayString } from "utils/createDayString"; +import { DashboardFullPage } from "modules/dashboard/DashboardLayout"; +import { Loader } from "components/Loader/Loader"; import { HealthIcon } from "./Content"; -import { HealthSeverity } from "api/typesGenerated"; -import NotificationsOffOutlined from "@mui/icons-material/NotificationsOffOutlined"; -export function HealthLayout() { +export const HealthLayout: FC = () => { const theme = useTheme(); const queryClient = useQueryClient(); const { data: healthStatus } = useQuery({ @@ -38,6 +39,9 @@ export function HealthLayout() { } as const; const visibleSections = filterVisibleSections(sections); + const link = useClassName(classNames.link, []); + const activeLink = useClassName(classNames.activeLink, []); + return ( <> @@ -162,31 +166,7 @@ export function HealthLayout() { key={key} to={`/health/${kebabCase(key)}`} className={({ isActive }) => - css({ - background: isActive - ? theme.palette.action.hover - : "none", - pointerEvents: isActive ? "none" : "auto", - color: isActive - ? theme.palette.text.primary - : theme.palette.text.secondary, - border: "none", - fontSize: 14, - width: "100%", - display: "flex", - alignItems: "center", - gap: 12, - textAlign: "left", - height: 36, - padding: "0 24px", - cursor: "pointer", - textDecoration: "none", - - "&:hover": { - background: theme.palette.action.hover, - color: theme.palette.text.primary, - }, - }) + cx([link, isActive && activeLink]) } > ); -} +}; const filterVisibleSections = (sections: T) => { return Object.keys(sections).reduce( @@ -240,3 +220,35 @@ const filterVisibleSections = (sections: T) => { {} as Partial, ); }; + +const classNames = { + link: (css, theme) => + css({ + background: "none", + pointerEvents: "auto", + color: theme.palette.text.secondary, + border: "none", + fontSize: 14, + width: "100%", + display: "flex", + alignItems: "center", + gap: 12, + textAlign: "left", + height: 36, + padding: "0 24px", + cursor: "pointer", + textDecoration: "none", + + "&:hover": { + background: theme.palette.action.hover, + color: theme.palette.text.primary, + }, + }), + + activeLink: (css, theme) => + css({ + background: theme.palette.action.hover, + pointerEvents: "none", + color: theme.palette.text.primary, + }), +} satisfies Record; diff --git a/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx b/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx index 7117aa886967e..b80a20c1ed159 100644 --- a/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx +++ b/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as ProvisionerDaemons }; diff --git a/site/src/pages/HealthPage/WebsocketPage.stories.tsx b/site/src/pages/HealthPage/WebsocketPage.stories.tsx index 896bc7126ca95..4eba44bc48b58 100644 --- a/site/src/pages/HealthPage/WebsocketPage.stories.tsx +++ b/site/src/pages/HealthPage/WebsocketPage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as Websocket }; diff --git a/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx b/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx index 446bf1ea6f9f0..92e031014079a 100644 --- a/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx +++ b/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx @@ -13,4 +13,6 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const Default: Story = {}; +const Example: Story = {}; + +export { Example as WorkspaceProxy }; diff --git a/site/src/pages/HealthPage/storybook.tsx b/site/src/pages/HealthPage/storybook.tsx index 886402af3a1bf..776e5f3e8fb03 100644 --- a/site/src/pages/HealthPage/storybook.tsx +++ b/site/src/pages/HealthPage/storybook.tsx @@ -14,7 +14,7 @@ import { MockHealthSettings, } from "testHelpers/entities"; import { HEALTH_QUERY_KEY, HEALTH_QUERY_SETTINGS_KEY } from "api/queries/debug"; -import { DashboardProvider } from "components/Dashboard/DashboardProvider"; +import { DashboardProvider } from "modules/dashboard/DashboardProvider"; import { HealthLayout } from "./HealthLayout"; type MetaOptions = { @@ -25,7 +25,7 @@ type MetaOptions = { export const generateMeta = ({ element, path, params }: MetaOptions): Meta => { return { - render: HealthLayout, + component: HealthLayout, parameters: { chromatic, layout: "fullscreen", diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index e2c3d03c9f941..4156730165786 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -1,16 +1,16 @@ +import { type FC } from "react"; +import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; +import { useNavigate, useParams } from "react-router-dom"; import { updateTemplateMeta } from "api/api"; -import { UpdateTemplateMeta } from "api/typesGenerated"; +import type { UpdateTemplateMeta } from "api/typesGenerated"; +import { templateByNameKey } from "api/queries/templates"; import { displaySuccess } from "components/GlobalSnackbar/utils"; -import { FC } from "react"; -import { Helmet } from "react-helmet-async"; -import { useNavigate, useParams } from "react-router-dom"; +import { useOrganizationId } from "hooks"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; -import { templateByNameKey } from "api/queries/templates"; -import { useOrganizationId } from "hooks"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; export const TemplateSettingsPage: FC = () => { const { template: templateName } = useParams() as { template: string }; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx index 5b4bee3deee2a..6535ba8b8da1c 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx @@ -3,9 +3,9 @@ import Link from "@mui/material/Link"; import ArrowRightAltOutlined from "@mui/icons-material/ArrowRightAltOutlined"; import { Paywall } from "components/Paywall/Paywall"; import { Stack } from "components/Stack/Stack"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; +import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { useOrganizationId } from "hooks/useOrganizationId"; -import { FC } from "react"; +import { type FC } from "react"; import { Helmet } from "react-helmet-async"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; @@ -15,9 +15,7 @@ import { useMutation, useQuery, useQueryClient } from "react-query"; import { setGroupRole, setUserRole, templateACL } from "api/queries/templates"; import { displaySuccess } from "components/GlobalSnackbar/utils"; -export const TemplatePermissionsPage: FC< - React.PropsWithChildren -> = () => { +export const TemplatePermissionsPage: FC = () => { const organizationId = useOrganizationId(); const { template, permissions } = useTemplateSettings(); const { template_rbac: isTemplateRBACEnabled } = useFeatureVisibility(); diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index ba76f413bda6b..ddec8c8ae6257 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -1,16 +1,16 @@ -import { useMutation, useQueryClient } from "react-query"; -import { updateTemplateMeta } from "api/api"; -import { UpdateTemplateMeta } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; import { type FC } from "react"; +import { useMutation, useQueryClient } from "react-query"; import { Helmet } from "react-helmet-async"; import { useNavigate, useParams } from "react-router-dom"; +import { updateTemplateMeta } from "api/api"; +import type { UpdateTemplateMeta } from "api/typesGenerated"; +import { templateByNameKey } from "api/queries/templates"; +import { useOrganizationId } from "hooks"; +import { useDashboard } from "modules/dashboard/useDashboard"; +import { displaySuccess } from "components/GlobalSnackbar/utils"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; -import { useOrganizationId } from "hooks"; -import { templateByNameKey } from "api/queries/templates"; const TemplateSchedulePage: FC = () => { const { template: templateName } = useParams() as { template: string }; diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx index 863027a1c45bb..f29846b1d6960 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.tsx @@ -6,7 +6,7 @@ import { useMe } from "hooks/useMe"; import { usePermissions } from "hooks/usePermissions"; import { groupsForUser } from "api/queries/groups"; import { useAuth } from "contexts/AuthProvider/AuthProvider"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { Section } from "../Section"; import { AccountUserGroups } from "./AccountUserGroups"; import { AccountForm } from "./AccountForm"; diff --git a/site/src/pages/UserSettingsPage/Sidebar.tsx b/site/src/pages/UserSettingsPage/Sidebar.tsx index a67d7b2bed171..ddad8a2ab5468 100644 --- a/site/src/pages/UserSettingsPage/Sidebar.tsx +++ b/site/src/pages/UserSettingsPage/Sidebar.tsx @@ -13,7 +13,7 @@ import { SidebarNavItem, } from "components/Sidebar/Sidebar"; import { GitIcon } from "components/Icons/GitIcon"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; interface SidebarProps { user: User; diff --git a/site/src/pages/UsersPage/UsersLayout.tsx b/site/src/pages/UsersPage/UsersLayout.tsx index 454e48aec4f98..fef686ed1a4e1 100644 --- a/site/src/pages/UsersPage/UsersLayout.tsx +++ b/site/src/pages/UsersPage/UsersLayout.tsx @@ -2,12 +2,12 @@ import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; import GroupAdd from "@mui/icons-material/GroupAddOutlined"; import PersonAdd from "@mui/icons-material/PersonAddOutlined"; -import { USERS_LINK } from "components/Dashboard/Navbar/NavbarView"; -import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; -import { usePermissions } from "hooks/usePermissions"; -import { FC, Suspense } from "react"; +import { type FC, Suspense } from "react"; import { Link as RouterLink, Outlet, useNavigate } from "react-router-dom"; +import { USERS_LINK } from "modules/dashboard/Navbar/NavbarView"; +import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; +import { usePermissions } from "hooks/usePermissions"; +import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader"; import { Margins } from "components/Margins/Margins"; import { TabLink, Tabs } from "components/Tabs/Tabs"; import { Loader } from "components/Loader/Loader"; diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index a7db041bd67ee..7df847e325763 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -1,6 +1,9 @@ import { type FC, type PropsWithChildren, useState } from "react"; +import { Helmet } from "react-helmet-async"; +import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useSearchParams, useNavigate } from "react-router-dom"; -import { type User } from "api/typesGenerated"; +import type { User } from "api/typesGenerated"; import { roles } from "api/queries/roles"; import { groupsByUserId } from "api/queries/groups"; import { getErrorMessage } from "api/errors"; @@ -14,18 +17,12 @@ import { updateRoles, authMethods, } from "api/queries/users"; - -import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useSearchParams, useNavigate } from "react-router-dom"; import { useOrganizationId } from "hooks"; import { useMe } from "hooks/useMe"; import { usePermissions } from "hooks/usePermissions"; -import { useStatusFilterMenu } from "./UsersFilter"; import { useFilter } from "components/Filter/filter"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { generateRandomString } from "utils/random"; - -import { Helmet } from "react-helmet-async"; import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog"; import { isNonInitialPage } from "components/PaginationWidget/utils"; import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"; @@ -34,6 +31,7 @@ import { pageTitle } from "utils/page"; import { UsersPageView } from "./UsersPageView"; import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import { usePaginatedQuery } from "hooks/usePaginatedQuery"; +import { useStatusFilterMenu } from "./UsersFilter"; export const UsersPage: FC = () => { const queryClient = useQueryClient(); diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx index ed61339d7bee4..ec26222a08921 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx @@ -1,7 +1,10 @@ import { type Interpolation, type Theme, useTheme } from "@emotion/react"; -import { BuildAvatar } from "components/BuildAvatar/BuildAvatar"; import { type FC } from "react"; -import { ProvisionerJobLog, WorkspaceBuild } from "api/typesGenerated"; +import type { ProvisionerJobLog, WorkspaceBuild } from "api/typesGenerated"; +import { Link } from "react-router-dom"; +import { displayWorkspaceBuildDuration } from "utils/workspace"; +import { DashboardFullPage } from "modules/dashboard/DashboardLayout"; +import { BuildAvatar } from "components/BuildAvatar/BuildAvatar"; import { Loader } from "components/Loader/Loader"; import { Stack } from "components/Stack/Stack"; import { WorkspaceBuildLogs } from "components/WorkspaceBuildLogs/WorkspaceBuildLogs"; @@ -10,16 +13,13 @@ import { PageHeaderTitle, PageHeaderSubtitle, } from "components/PageHeader/FullWidthPageHeader"; -import { Link } from "react-router-dom"; import { Stats, StatsItem } from "components/Stats/Stats"; -import { displayWorkspaceBuildDuration } from "utils/workspace"; -import { Sidebar, SidebarCaption, SidebarItem } from "./Sidebar"; import { Alert } from "components/Alert/Alert"; -import { DashboardFullPage } from "components/Dashboard/DashboardLayout"; import { WorkspaceBuildData, WorkspaceBuildDataSkeleton, } from "components/WorkspaceBuild/WorkspaceBuildData"; +import { Sidebar, SidebarCaption, SidebarItem } from "./Sidebar"; const sortLogsByCreatedAt = (logs: ProvisionerJobLog[]) => { return [...logs].sort( diff --git a/site/src/pages/WorkspacePage/Workspace.stories.tsx b/site/src/pages/WorkspacePage/Workspace.stories.tsx index 07a320c56c513..9c9b41dbf7416 100644 --- a/site/src/pages/WorkspacePage/Workspace.stories.tsx +++ b/site/src/pages/WorkspacePage/Workspace.stories.tsx @@ -1,14 +1,14 @@ import { action } from "@storybook/addon-actions"; import { Meta, StoryObj } from "@storybook/react"; -import { WatchAgentMetadataContext } from "components/Resources/AgentMetadata"; -import { ProvisionerJobLog } from "api/typesGenerated"; -import * as Mocks from "testHelpers/entities"; -import { Workspace } from "./Workspace"; -import { withReactContext } from "storybook-react-context"; import EventSource from "eventsourcemock"; +import { withReactContext } from "storybook-react-context"; +import type { ProvisionerJobLog } from "api/typesGenerated"; +import * as Mocks from "testHelpers/entities"; import { ProxyContext, getPreferredProxy } from "contexts/ProxyContext"; -import { DashboardProviderContext } from "components/Dashboard/DashboardProvider"; -import { WorkspaceBuildLogsSection } from "pages/WorkspacePage/WorkspaceBuildLogsSection"; +import { DashboardContext } from "modules/dashboard/DashboardProvider"; +import { WatchAgentMetadataContext } from "components/Resources/AgentMetadata"; +import { Workspace } from "./Workspace"; +import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection"; import { WorkspacePermissions } from "./permissions"; const MockedAppearance = { @@ -38,7 +38,7 @@ const meta: Meta = { }, decorators: [ (Story) => ( - = { > - + ), withReactContext({ Context: WatchAgentMetadataContext, diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx index 811ce5214bfff..da5af95863070 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx @@ -1,20 +1,20 @@ import { workspaceResolveAutostart } from "api/queries/workspaceQuota"; import { Template, TemplateVersion, Workspace } from "api/typesGenerated"; -import { FC, useEffect, useState } from "react"; +import { type Interpolation, type Theme } from "@emotion/react"; +import { type FC, useEffect, useState } from "react"; import { useQuery } from "react-query"; -import { WorkspacePermissions } from "../permissions"; import dayjs from "dayjs"; -import { useIsWorkspaceActionsEnabled } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import formatDistanceToNow from "date-fns/formatDistanceToNow"; import InfoOutlined from "@mui/icons-material/InfoOutlined"; import WarningRounded from "@mui/icons-material/WarningRounded"; import { MemoizedInlineMarkdown } from "components/Markdown/Markdown"; +import type { WorkspacePermissions } from "../permissions"; import { NotificationActionButton, NotificationItem, Notifications, } from "./Notifications"; -import { Interpolation, Theme } from "@emotion/react"; type WorkspaceNotificationsProps = { workspace: Workspace; @@ -103,8 +103,10 @@ export const WorkspaceNotifications: FC = ({ } // Dormant - const areActionsEnabled = useIsWorkspaceActionsEnabled(); - if (areActionsEnabled && workspace.dormant_at) { + const { entitlements } = useDashboard(); + const advancedSchedulingEnabled = + entitlements.features["advanced_template_scheduling"].enabled; + if (advancedSchedulingEnabled && workspace.dormant_at) { const formatDate = (dateStr: string, timestamp: boolean): string => { const date = new Date(dateStr); return date.toLocaleDateString(undefined, { diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index e2c3d4b1fea33..4b1c043cf8e13 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -1,20 +1,20 @@ -import { Loader } from "components/Loader/Loader"; -import { FC, useEffect } from "react"; +import { type FC, useEffect } from "react"; import { useParams } from "react-router-dom"; -import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; -import { ErrorAlert } from "components/Alert/ErrorAlert"; -import { useOrganizationId } from "hooks"; -import { Margins } from "components/Margins/Margins"; import { useQuery, useQueryClient } from "react-query"; +import { watchWorkspace } from "api/api"; +import type { Workspace } from "api/typesGenerated"; import { workspaceBuildsKey } from "api/queries/workspaceBuilds"; import { templateByName } from "api/queries/templates"; import { workspaceByOwnerAndName } from "api/queries/workspaces"; import { checkAuthorization } from "api/queries/authCheck"; -import { WorkspacePermissions, workspaceChecks } from "./permissions"; -import { watchWorkspace } from "api/api"; -import { Workspace } from "api/typesGenerated"; +import { useOrganizationId } from "hooks"; import { useEffectEvent } from "hooks/hookPolyfills"; -import { Navbar } from "components/Dashboard/Navbar/Navbar"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; +import { Loader } from "components/Loader/Loader"; +import { Margins } from "components/Margins/Margins"; +import { Navbar } from "modules/dashboard/Navbar/Navbar"; +import { WorkspacePermissions, workspaceChecks } from "./permissions"; +import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; export const WorkspacePage: FC = () => { const queryClient = useQueryClient(); diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index 73ff4b623b508..cbbd720476490 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -1,24 +1,20 @@ -import { useDashboard } from "components/Dashboard/DashboardProvider"; -import { useFeatureVisibility } from "hooks/useFeatureVisibility"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; -import { useNavigate } from "react-router-dom"; -import { Workspace } from "./Workspace"; -import { pageTitle } from "utils/page"; -import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; -import { ChangeVersionDialog } from "./ChangeVersionDialog"; import { useMutation, useQuery, useQueryClient } from "react-query"; +import { useNavigate } from "react-router-dom"; +import dayjs from "dayjs"; import { MissingBuildParameters, restartWorkspace } from "api/api"; +import type * as TypesGen from "api/typesGenerated"; +import { useDashboard } from "modules/dashboard/useDashboard"; +import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; +import { pageTitle } from "utils/page"; import { ConfirmDialog, ConfirmDialogProps, } from "components/Dialogs/ConfirmDialog/ConfirmDialog"; -import * as TypesGen from "api/typesGenerated"; -import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection"; +import { getErrorMessage } from "api/errors"; +import { deploymentConfig, deploymentSSHConfig } from "api/queries/deployment"; import { templateVersion, templateVersions } from "api/queries/templates"; -import { Alert } from "components/Alert/Alert"; -import { Stack } from "components/Stack/Stack"; -import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs"; import { activate, changeVersion, @@ -28,13 +24,17 @@ import { startWorkspace, cancelBuild, } from "api/queries/workspaces"; -import { getErrorMessage } from "api/errors"; +import { Alert } from "components/Alert/Alert"; +import { Stack } from "components/Stack/Stack"; +import { useMe } from "hooks"; +import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs"; import { displayError } from "components/GlobalSnackbar/utils"; -import { deploymentConfig, deploymentSSHConfig } from "api/queries/deployment"; import { WorkspacePermissions } from "./permissions"; +import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; -import dayjs from "dayjs"; -import { useMe } from "hooks"; +import { Workspace } from "./Workspace"; +import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; +import { ChangeVersionDialog } from "./ChangeVersionDialog"; interface WorkspaceReadyPageProps { template: TypesGen.Template; diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 96bf6ada94ab4..88e2634ef4418 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -1,6 +1,15 @@ +import Tooltip from "@mui/material/Tooltip"; +import Link from "@mui/material/Link"; +import MonetizationOnOutlined from "@mui/icons-material/MonetizationOnOutlined"; +import DeleteOutline from "@mui/icons-material/DeleteOutline"; +import PersonOutline from "@mui/icons-material/PersonOutline"; +import ArrowBackOutlined from "@mui/icons-material/ArrowBackOutlined"; +import ScheduleOutlined from "@mui/icons-material/ScheduleOutlined"; +import { useTheme } from "@emotion/react"; +import { type FC } from "react"; +import { useQuery } from "react-query"; import { Link as RouterLink } from "react-router-dom"; import type * as TypesGen from "api/typesGenerated"; -import { WorkspaceActions } from "pages/WorkspacePage/WorkspaceActions/WorkspaceActions"; import { Topbar, TopbarAvatar, @@ -9,27 +18,19 @@ import { TopbarIcon, TopbarIconButton, } from "components/FullPageLayout/Topbar"; -import Tooltip from "@mui/material/Tooltip"; -import ArrowBackOutlined from "@mui/icons-material/ArrowBackOutlined"; -import ScheduleOutlined from "@mui/icons-material/ScheduleOutlined"; import { WorkspaceStatusBadge } from "components/WorkspaceStatusBadge/WorkspaceStatusBadge"; import { WorkspaceScheduleControls, shouldDisplayScheduleControls, } from "./WorkspaceScheduleControls"; import { workspaceQuota } from "api/queries/workspaceQuota"; -import { useQuery } from "react-query"; -import MonetizationOnOutlined from "@mui/icons-material/MonetizationOnOutlined"; -import { useTheme } from "@mui/material/styles"; -import Link from "@mui/material/Link"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { displayDormantDeletion } from "utils/dormant"; -import DeleteOutline from "@mui/icons-material/DeleteOutline"; -import PersonOutline from "@mui/icons-material/PersonOutline"; import { Popover, PopoverTrigger } from "components/Popover/Popover"; import { HelpTooltipContent } from "components/HelpTooltip/HelpTooltip"; import { AvatarData } from "components/AvatarData/AvatarData"; import { ExternalAvatar } from "components/Avatar/Avatar"; +import { WorkspaceActions } from "./WorkspaceActions/WorkspaceActions"; import { WorkspaceNotifications } from "./WorkspaceNotifications/WorkspaceNotifications"; import { WorkspacePermissions } from "./permissions"; @@ -64,30 +65,29 @@ export interface WorkspaceProps { latestVersion?: TypesGen.TemplateVersion; } -export const WorkspaceTopbar = (props: WorkspaceProps) => { - const { - handleStart, - handleStop, - handleRestart, - handleDelete, - handleUpdate, - handleCancel, - handleSettings, - handleChangeVersion, - handleDormantActivate, - workspace, - isUpdating, - isRestarting, - canUpdateWorkspace, - canChangeVersions, - canRetryDebugMode, - handleBuildRetry, - handleBuildRetryDebug, - isOwner, - template, - latestVersion, - permissions, - } = props; +export const WorkspaceTopbar: FC = ({ + handleStart, + handleStop, + handleRestart, + handleDelete, + handleUpdate, + handleCancel, + handleSettings, + handleChangeVersion, + handleDormantActivate, + workspace, + isUpdating, + isRestarting, + canUpdateWorkspace, + canChangeVersions, + canRetryDebugMode, + handleBuildRetry, + handleBuildRetryDebug, + isOwner, + template, + latestVersion, + permissions, +}) => { const theme = useTheme(); // Quota diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 303ead72dfb4d..65a8fb46a289c 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -1,18 +1,18 @@ -import { usePagination } from "hooks/usePagination"; -import { Workspace } from "api/typesGenerated"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; +import { useQuery } from "react-query"; +import { useSearchParams } from "react-router-dom"; +import { usePagination } from "hooks/usePagination"; +import type { Workspace } from "api/typesGenerated"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; import { useWorkspacesData, useWorkspaceUpdate } from "./data"; import { WorkspacesPageView } from "./WorkspacesPageView"; import { useOrganizationId, usePermissions } from "hooks"; import { useTemplateFilterMenu, useStatusFilterMenu } from "./filter/menus"; -import { useSearchParams } from "react-router-dom"; import { useFilter } from "components/Filter/filter"; import { useUserFilterMenu } from "components/Filter/UserFilter"; import { useEffectEvent } from "hooks/hookPolyfills"; -import { useQuery } from "react-query"; import { templates } from "api/queries/templates"; import { useBatchActions } from "./batchActions"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx index 1b0bf8c814ecc..cfff23823889e 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx @@ -19,7 +19,7 @@ import { MockTemplate, } from "testHelpers/entities"; import { WorkspacesPageView } from "./WorkspacesPageView"; -import { DashboardProviderContext } from "components/Dashboard/DashboardProvider"; +import { DashboardContext } from "modules/dashboard/DashboardProvider"; import { ComponentProps } from "react"; import { MockMenu, @@ -141,7 +141,7 @@ const meta: Meta = { }, decorators: [ (Story) => ( - = { }} > - + ), ], }; diff --git a/site/src/pages/WorkspacesPage/filter/filter.tsx b/site/src/pages/WorkspacesPage/filter/filter.tsx index f89e2992c4a6d..112aac6f18e0d 100644 --- a/site/src/pages/WorkspacesPage/filter/filter.tsx +++ b/site/src/pages/WorkspacesPage/filter/filter.tsx @@ -1,9 +1,7 @@ -import { type FC } from "react"; import { useTheme } from "@emotion/react"; -import { useIsWorkspaceActionsEnabled } from "components/Dashboard/DashboardProvider"; +import { type FC } from "react"; +import { useDashboard } from "modules/dashboard/useDashboard"; import { Avatar, type AvatarProps } from "components/Avatar/Avatar"; -import type { TemplateFilterMenu, StatusFilterMenu } from "./menus"; -import type { TemplateOption, StatusOption } from "./options"; import { Filter, FilterMenu, @@ -15,6 +13,8 @@ import { } from "components/Filter/filter"; import { type UserFilterMenu, UserMenu } from "components/Filter/UserFilter"; import { docs } from "utils/docs"; +import type { TemplateFilterMenu, StatusFilterMenu } from "./menus"; +import type { TemplateOption, StatusOption } from "./options"; export const workspaceFilterQuery = { me: "owner:me", @@ -74,8 +74,10 @@ export const WorkspacesFilter: FC = ({ error, menus, }) => { - const actionsEnabled = useIsWorkspaceActionsEnabled(); - const presets = actionsEnabled ? PRESETS_WITH_DORMANT : PRESET_FILTERS; + const { entitlements } = useDashboard(); + const presets = entitlements.features["advanced_template_scheduling"].enabled + ? PRESETS_WITH_DORMANT + : PRESET_FILTERS; return ( { - acc[feature] = { enabled: true, entitlement: "entitled" }; - return acc; - }, - {} as Entitlements["features"], + Object.fromEntries( + features.map((feature) => [ + feature, + { enabled: true, entitlement: "entitled" }, + ]), ), ), }; return ( - - + ); }; diff --git a/site/vite.config.ts b/site/vite.config.ts index 82d32c63a655f..1ca3de51cb292 100644 --- a/site/vite.config.ts +++ b/site/vite.config.ts @@ -84,14 +84,13 @@ export default defineConfig({ alias: { api: path.resolve(__dirname, "./src/api"), components: path.resolve(__dirname, "./src/components"), - hooks: path.resolve(__dirname, "./src/hooks"), contexts: path.resolve(__dirname, "./src/contexts"), - i18n: path.resolve(__dirname, "./src/i18n"), + hooks: path.resolve(__dirname, "./src/hooks"), + modules: path.resolve(__dirname, "./src/modules"), pages: path.resolve(__dirname, "./src/pages"), testHelpers: path.resolve(__dirname, "./src/testHelpers"), theme: path.resolve(__dirname, "./src/theme"), utils: path.resolve(__dirname, "./src/utils"), - xServices: path.resolve(__dirname, "./src/xServices"), }, }, }); From 951de992850af0196f702754b7ac5a3501d07bab Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 22 Jan 2024 18:32:46 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/package.json | 7 +++---- .../TemplateGeneralSettingsPage/TemplateSettingsPage.tsx | 8 +------- .../TemplateSchedulePage/TemplateSchedulePage.tsx | 9 +-------- site/src/pages/UsersPage/UsersPage.tsx | 1 + 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/site/package.json b/site/package.json index 5989e0cae1047..ba14145a284a0 100644 --- a/site/package.json +++ b/site/package.json @@ -170,10 +170,9 @@ "vite-plugin-turbosnap": "1.0.2" }, "browserslist": [ - "chrome 66", - "firefox 63", - "edge 79", - "safari 15.4" + "chrome 110", + "firefox 111", + "safari 16.0" ], "resolutions": { "optionator": "0.9.3", diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index d562372d03be1..572b788aacbab 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -5,15 +5,9 @@ import { useNavigate, useParams } from "react-router-dom"; import { updateTemplateMeta } from "api/api"; import type { UpdateTemplateMeta } from "api/typesGenerated"; import { templateByNameKey } from "api/queries/templates"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; -import { useOrganizationId } from "hooks"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { useDashboard } from "modules/dashboard/useDashboard"; import { pageTitle } from "utils/page"; -import { updateTemplateMeta } from "api/api"; -import type { UpdateTemplateMeta } from "api/typesGenerated"; -import { templateByNameKey } from "api/queries/templates"; -import { useOrganizationId } from "contexts/auth/useOrganizationId"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index b86fc1dbda1f7..5c8cff6184241 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -1,20 +1,13 @@ import { type FC } from "react"; -import { useMutation, useQueryClient } from "react-query"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router-dom"; import { updateTemplateMeta } from "api/api"; import type { UpdateTemplateMeta } from "api/typesGenerated"; import { templateByNameKey } from "api/queries/templates"; -import { useOrganizationId } from "hooks"; +import { useOrganizationId } from "contexts/auth/useOrganizationId"; import { useDashboard } from "modules/dashboard/useDashboard"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; import { pageTitle } from "utils/page"; -import { updateTemplateMeta } from "api/api"; -import type { UpdateTemplateMeta } from "api/typesGenerated"; -import { templateByNameKey } from "api/queries/templates"; -import { useOrganizationId } from "contexts/auth/useOrganizationId"; -import { useDashboard } from "components/Dashboard/DashboardProvider"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index d6d7624b12fc6..e6547824fcc4d 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -23,6 +23,7 @@ import { useDashboard } from "modules/dashboard/useDashboard"; import { useFilter } from "components/Filter/filter"; import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog"; import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"; +import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import { isNonInitialPage } from "components/PaginationWidget/utils"; import { usePaginatedQuery } from "hooks/usePaginatedQuery"; import { pageTitle } from "utils/page"; pFad - Phonifier reborn

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

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


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy