From 4fab372bdc20344c31d772fc4ec507f0365d4da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kayla=20=E3=81=AF=E3=81=AA?= Date: Thu, 26 Mar 2026 16:20:25 -0600 Subject: [PATCH] chore: modernize utils/ imports (#23698) --- site/e2e/api.ts | 2 +- site/e2e/helpers.ts | 2 +- site/src/api/queries/groups.ts | 2 +- site/src/api/queries/templates.ts | 4 +- site/src/api/queries/users.ts | 2 +- site/src/components/Abbr/Abbr.tsx | 2 +- .../ActiveUserChart/ActiveUserChart.tsx | 2 +- site/src/components/Alert/Alert.tsx | 2 +- site/src/components/AnimatedIcons/Check.tsx | 2 +- .../components/AnimatedIcons/ChevronDown.tsx | 2 +- .../components/Autocomplete/Autocomplete.tsx | 2 +- site/src/components/Avatar/Avatar.tsx | 2 +- site/src/components/Badge/Badge.tsx | 2 +- site/src/components/Breadcrumb/Breadcrumb.tsx | 2 +- site/src/components/Button/Button.tsx | 2 +- site/src/components/Chart/Chart.tsx | 2 +- .../ChatMessageInput/ChatMessageInput.tsx | 2 +- .../ChatMessageInput/FileReferenceNode.tsx | 2 +- site/src/components/Checkbox/Checkbox.tsx | 2 +- .../CollapsibleSummary/CollapsibleSummary.tsx | 2 +- site/src/components/Combobox/Combobox.tsx | 2 +- site/src/components/Command/Command.tsx | 2 +- .../CopyableValue/CopyableValue.tsx | 2 +- site/src/components/CustomLogo/CustomLogo.tsx | 2 +- site/src/components/Dialog/Dialog.tsx | 2 +- .../components/DropdownMenu/DropdownMenu.tsx | 2 +- .../DurationField/DurationField.tsx | 2 +- site/src/components/EmptyState/EmptyState.tsx | 2 +- .../FeatureStageBadge/FeatureStageBadge.tsx | 4 +- site/src/components/Filter/SelectFilter.tsx | 2 +- site/src/components/Filter/UsersFilter.tsx | 2 +- site/src/components/Form/Form.tsx | 2 +- site/src/components/FormField/FormField.tsx | 4 +- .../src/components/FullPageLayout/Sidebar.tsx | 2 +- site/src/components/FullPageLayout/Topbar.tsx | 2 +- .../components/HelpTooltip/HelpTooltip.tsx | 2 +- site/src/components/Icons/CoderIcon.tsx | 2 +- .../components/InfoTooltip/InfoTooltip.tsx | 2 +- site/src/components/Input/Input.tsx | 2 +- site/src/components/InputGroup/InputGroup.tsx | 2 +- site/src/components/Kbd/Kbd.tsx | 2 +- site/src/components/Label/Label.tsx | 2 +- site/src/components/LastSeen/LastSeen.tsx | 4 +- site/src/components/Latency/Latency.tsx | 4 +- site/src/components/Link/Link.tsx | 2 +- site/src/components/Loader/Loader.tsx | 2 +- site/src/components/Markdown/Markdown.tsx | 2 +- .../MultiSelectCombobox.tsx | 2 +- .../MultiUserSelect/MultiUserSelect.tsx | 4 +- site/src/components/PageHeader/PageHeader.tsx | 2 +- site/src/components/Paywall/Paywall.tsx | 2 +- .../Paywall/PaywallAIGovernance.tsx | 2 +- .../src/components/Paywall/PaywallPremium.tsx | 2 +- site/src/components/Popover/Popover.tsx | 2 +- site/src/components/RadioGroup/RadioGroup.tsx | 2 +- .../RichParameterInput/RichParameterInput.tsx | 8 +-- site/src/components/ScrollArea/ScrollArea.tsx | 2 +- site/src/components/Search/Search.tsx | 2 +- site/src/components/Select/Select.tsx | 2 +- site/src/components/SelectMenu/SelectMenu.tsx | 2 +- site/src/components/Separator/Separator.tsx | 2 +- .../SettingsHeader/SettingsHeader.stories.tsx | 2 +- .../SettingsHeader/SettingsHeader.tsx | 2 +- site/src/components/Sidebar/Sidebar.tsx | 2 +- site/src/components/Skeleton/Skeleton.tsx | 2 +- site/src/components/Slider/Slider.tsx | 2 +- site/src/components/Spinner/Spinner.tsx | 2 +- site/src/components/StackLabel/StackLabel.tsx | 2 +- site/src/components/Stats/Stats.tsx | 2 +- .../StatusIndicator/StatusIndicator.tsx | 2 +- site/src/components/StatusPill/StatusPill.tsx | 2 +- site/src/components/Switch/Switch.tsx | 2 +- site/src/components/Table/Table.tsx | 2 +- site/src/components/Tabs/Tabs.tsx | 2 +- site/src/components/Textarea/Textarea.tsx | 2 +- .../components/Timeline/TimelineDateRow.tsx | 2 +- .../src/components/Timeline/TimelineEntry.tsx | 2 +- site/src/components/Timeline/utils.ts | 2 +- site/src/components/Toaster/Toaster.tsx | 2 +- site/src/components/Tooltip/Tooltip.tsx | 2 +- .../UserAutocomplete/UserAutocomplete.tsx | 4 +- .../components/ai-elements/conversation.tsx | 2 +- site/src/components/ai-elements/message.tsx | 2 +- .../components/ai-elements/model-selector.tsx | 2 +- site/src/components/ai-elements/response.tsx | 2 +- site/src/components/ai-elements/shimmer.tsx | 2 +- site/src/components/ai-elements/thinking.tsx | 2 +- .../ai-elements/tool/ChatSummarizedTool.tsx | 2 +- .../ai-elements/tool/ComputerTool.tsx | 2 +- .../ai-elements/tool/CreateWorkspaceTool.tsx | 2 +- .../ai-elements/tool/EditFilesTool.tsx | 2 +- .../ai-elements/tool/ExecuteTool.tsx | 2 +- .../ai-elements/tool/ListTemplatesTool.tsx | 2 +- .../ai-elements/tool/ProcessOutputTool.tsx | 2 +- .../ai-elements/tool/ProposePlanTool.tsx | 2 +- .../ai-elements/tool/ReadFileTool.tsx | 2 +- .../ai-elements/tool/ReadTemplateTool.tsx | 2 +- .../ai-elements/tool/SubagentTool.tsx | 2 +- site/src/components/ai-elements/tool/Tool.tsx | 2 +- .../ai-elements/tool/ToolCollapsible.tsx | 2 +- .../components/ai-elements/tool/ToolIcon.tsx | 2 +- .../ai-elements/tool/WebSearchSources.tsx | 2 +- .../ai-elements/tool/WriteFileTool.tsx | 2 +- site/src/contexts/auth/RequireAuth.tsx | 2 +- site/src/contexts/useProxyLatency.ts | 2 +- site/src/hooks/useClickableTableRow.ts | 2 +- site/src/modules/apps/AppStatusStateIcon.tsx | 2 +- .../builds/BuildAvatar/BuildAvatar.tsx | 2 +- .../AnnouncementBannerView.tsx | 2 +- .../src/modules/dashboard/DashboardLayout.tsx | 4 +- .../DeploymentBanner/DeploymentBannerView.tsx | 2 +- .../LicenseBanner/LicenseBannerView.tsx | 4 +- .../modules/dashboard/Navbar/MobileMenu.tsx | 2 +- .../modules/dashboard/Navbar/NavbarView.tsx | 4 +- .../management/DeploymentSidebarView.tsx | 2 +- .../NotificationsInbox/InboxButton.tsx | 2 +- .../NotificationsInbox/InboxItem.stories.tsx | 2 +- .../NotificationsInbox/InboxItem.tsx | 2 +- .../NotificationsInbox/InboxPopover.tsx | 2 +- .../NotificationsInbox/UnreadBadge.tsx | 2 +- site/src/modules/provisioners/Provisioner.tsx | 2 +- .../modules/provisioners/ProvisionerAlert.tsx | 2 +- .../modules/provisioners/ProvisionerTags.tsx | 2 +- .../resources/AgentDevcontainerCard.tsx | 4 +- site/src/modules/resources/AgentLatency.tsx | 4 +- .../modules/resources/AgentLogs/AgentLogs.tsx | 2 +- site/src/modules/resources/AgentMetadata.tsx | 4 +- site/src/modules/resources/AgentRow.tsx | 2 +- site/src/modules/resources/AgentVersion.tsx | 2 +- .../src/modules/resources/AppLink/AppLink.tsx | 2 +- .../modules/resources/PortForwardButton.tsx | 14 ++-- site/src/modules/resources/ResourceAvatar.tsx | 2 +- .../modules/resources/SSHButton/SSHButton.tsx | 2 +- .../resources/WildcardHostnameWarning.tsx | 2 +- .../resources/useAgentContainers.jest.tsx | 2 +- .../modules/resources/useAgentLogs.jest.ts | 2 +- .../tasks/TaskPrompt/PromptSelectTrigger.tsx | 2 +- .../modules/tasks/TaskPrompt/TaskPrompt.tsx | 4 +- .../TemplateVersionSelect.stories.tsx | 2 +- .../tasks/TasksSidebar/TasksSidebar.tsx | 2 +- .../tasks/TasksSidebar/UserCombobox.tsx | 2 +- .../TemplateFileTree.stories.tsx | 2 +- .../TemplateFiles/TemplateFileTree.tsx | 70 +++++++++---------- .../templates/TemplateFiles/TemplateFiles.tsx | 6 +- ...ClassicParameterFlowDeprecationWarning.tsx | 2 +- .../DynamicParameter/DynamicParameter.tsx | 4 +- .../WorkspaceBuildData/WorkspaceBuildData.tsx | 14 ++-- .../WorkspaceBuildLogs/WorkspaceBuildLogs.tsx | 2 +- .../WorkspaceDormantBadge.tsx | 10 +-- .../ChangeWorkspaceVersionDialog.tsx | 2 +- .../UpdateBuildParametersDialog.tsx | 10 +-- .../WorkspaceDeleteDialog.stories.tsx | 2 +- .../WorkspaceDeleteDialog.tsx | 2 +- .../WorkspaceStatus/WorkspaceStatus.tsx | 2 +- .../WorkspaceStatusIndicator.tsx | 8 +-- .../AIBridgePage/AIBridgeHelpTooltip.tsx | 2 +- .../AIBridgePage/AIBridgeSessionsLayout.tsx | 2 +- .../ListSessionsPage/ListSessionsPage.tsx | 2 +- .../ListSessionsPage/ListSessionsPageView.tsx | 4 +- .../ListSessionsPage/ListSessionsRow.tsx | 2 +- .../RequestLogsPage/RequestLogsPage.tsx | 2 +- .../RequestLogsPage/RequestLogsPageView.tsx | 2 +- .../RequestLogsRow/RequestLogsRow.tsx | 4 +- .../icons/AIBridgeClientIcon.tsx | 2 +- .../icons/AIBridgeModelIcon.tsx | 2 +- .../icons/AIBridgeProviderIcon.tsx | 2 +- .../SessionSummaryTable.tsx | 2 +- .../SessionTimeline/AgenticLoopTable.tsx | 2 +- .../SessionTimeline/PromptTable.tsx | 4 +- .../SessionTimeline/ToolCallTable.tsx | 4 +- site/src/pages/AgentsPage/AgentDetail.tsx | 6 +- .../AgentsPage/AgentSettingsPageView.tsx | 8 +-- site/src/pages/AgentsPage/AgentsPage.tsx | 2 +- site/src/pages/AgentsPage/AgentsPageView.tsx | 4 +- .../AgentsPage/components/AgentCreateForm.tsx | 2 +- .../AgentDetail/ChatContext.test.tsx | 2 +- .../components/AgentDetail/ChatContext.ts | 4 +- .../AgentDetail/ConversationTimeline.tsx | 2 +- .../components/AgentDetail/TopBar.tsx | 2 +- .../components/AgentDetail/types.ts | 2 +- .../AgentsPage/components/AgentDetailView.tsx | 4 +- .../AgentsPage/components/AgentPageHeader.tsx | 2 +- .../AgentsPage/components/AgentsSkeletons.tsx | 2 +- .../components/Calendar/Calendar.tsx | 2 +- .../components/ChatCostSummaryView.tsx | 4 +- .../ChatModelAdminPanel.tsx | 2 +- .../ChatModelAdminPanel/ModelConfigFields.tsx | 2 +- .../ChatModelAdminPanel/ModelForm.tsx | 4 +- .../ChatModelAdminPanel/ModelsSection.tsx | 2 +- .../ChatModelAdminPanel/ProviderIcon.tsx | 2 +- .../ChatModelAdminPanel/ProvidersSection.tsx | 2 +- .../DateRangePicker/DateRangePicker.tsx | 2 +- .../components/DiffViewer/DiffViewer.tsx | 2 +- .../components/DiffViewer/RemoteDiffPanel.tsx | 2 +- .../components/GitPanel/GitPanel.tsx | 2 +- .../LimitsTab/GroupLimitsSection.tsx | 5 +- .../components/LimitsTab/LimitsTab.tsx | 10 +-- .../LimitsTab/UserOverridesSection.tsx | 5 +- .../components/MCPServerAdminPanel.tsx | 2 +- .../AgentsPage/components/MCPServerPicker.tsx | 2 +- .../AgentsPage/components/PRInsightsView.tsx | 4 +- .../components/QueuedMessagesList.tsx | 2 +- .../components/RightPanel/RightPanel.tsx | 2 +- .../components/Sidebar/AgentsSidebar.tsx | 4 +- .../components/Sidebar/SidebarTabView.tsx | 2 +- .../AgentsPage/components/UsageIndicator.tsx | 2 +- .../AgentsPage/utils/usageLimitMessage.ts | 2 +- site/src/pages/AuditPage/AuditFilter.tsx | 2 +- site/src/pages/AuditPage/AuditHelpTooltip.tsx | 2 +- .../BuildAuditDescription.tsx | 2 +- .../AuditPage/AuditLogRow/AuditLogRow.tsx | 4 +- site/src/pages/AuditPage/AuditPage.test.tsx | 2 +- site/src/pages/AuditPage/AuditPage.tsx | 2 +- site/src/pages/AuditPage/AuditPageView.tsx | 2 +- site/src/pages/CliAuthPage/CliAuthPage.tsx | 2 +- .../pages/CliInstallPage/CliInstallPage.tsx | 2 +- .../ConnectionLogPage/ConnectionLogFilter.tsx | 4 +- .../ConnectionLogHelpTooltip.tsx | 2 +- .../ConnectionLogPage.test.tsx | 2 +- .../ConnectionLogPage/ConnectionLogPage.tsx | 2 +- .../ConnectionLogPageView.tsx | 2 +- .../ConnectionLogDescription.tsx | 2 +- .../ConnectionLogRow/ConnectionLogRow.tsx | 2 +- .../CreateTemplateGalleryPage.tsx | 4 +- .../CreateTemplateGalleryPageView.stories.tsx | 2 +- .../CreateTemplateGalleryPageView.tsx | 2 +- .../StarterTemplates.tsx | 2 +- .../CreateTemplatePage/CreateTemplateForm.tsx | 24 +++---- .../CreateTemplatePage/CreateTemplatePage.tsx | 2 +- site/src/pages/CreateTemplatePage/utils.ts | 2 +- .../pages/CreateTokenPage/CreateTokenForm.tsx | 2 +- .../pages/CreateTokenPage/CreateTokenPage.tsx | 2 +- .../pages/CreateUserPage/CreateUserForm.tsx | 14 ++-- .../pages/CreateUserPage/CreateUserPage.tsx | 2 +- .../AutoCreateConsentDialog.tsx | 2 +- .../CreateWorkspacePage.tsx | 4 +- .../CreateWorkspacePageView.tsx | 6 +- .../AIGovernanceSettingsPage.tsx | 2 +- .../AIGovernanceSettingsPageView.tsx | 4 +- .../AnnouncementBannerDialog.tsx | 2 +- .../AppearanceSettingsPage.tsx | 2 +- .../AppearanceSettingsPageView.tsx | 4 +- .../ExternalAuthSettingsPage.tsx | 2 +- .../ExternalAuthSettingsPageView.tsx | 2 +- .../IdpOrgSyncPage/IdpOrgSyncPage.tsx | 4 +- .../IdpOrgSyncPage/IdpOrgSyncPageView.tsx | 4 +- .../IdpOrgSyncPage/OrganizationPills.tsx | 4 +- .../AddNewLicensePage.tsx | 2 +- .../LicensesSettingsPage/LicenseCard.tsx | 2 +- .../LicenseSeatConsumptionChart.tsx | 4 +- .../LicensesSettingsPage.tsx | 2 +- .../ManagedAgentsConsumption.tsx | 4 +- .../LicensesSettingsPage/SeatUsageBarCard.tsx | 2 +- .../NetworkSettingsPage.tsx | 2 +- .../NetworkSettingsPageView.tsx | 10 +-- .../NotificationsPage/NotificationEvents.tsx | 2 +- .../NotificationsPage/NotificationsPage.tsx | 6 +- .../CreateOAuth2AppPage.tsx | 2 +- .../EditOAuth2AppPage.tsx | 2 +- .../EditOAuth2AppPageView.tsx | 2 +- .../OAuth2AppsSettingsPage.tsx | 2 +- .../ObservabilitySettingsPage.tsx | 2 +- .../ObservabilitySettingsPageView.tsx | 4 +- .../OverviewPage/OverviewPage.tsx | 2 +- .../OverviewPage/OverviewPageView.tsx | 4 +- .../OverviewPage/UserEngagementChart.tsx | 2 +- .../PremiumPage/PremiumPage.tsx | 2 +- .../PremiumPage/PremiumPageView.tsx | 2 +- .../SecuritySettingsPage.tsx | 2 +- .../SecuritySettingsPageView.tsx | 10 +-- .../UserAuthSettingsPage.tsx | 2 +- .../UserAuthSettingsPageView.tsx | 10 +-- .../DeploymentSettingsPage/optionValue.ts | 2 +- site/src/pages/EditUserPage/EditUserForm.tsx | 12 ++-- site/src/pages/EditUserPage/EditUserPage.tsx | 4 +- site/src/pages/GroupsPage/CreateGroupPage.tsx | 2 +- .../pages/GroupsPage/CreateGroupPageView.tsx | 10 +-- site/src/pages/GroupsPage/GroupPage.tsx | 2 +- .../GroupsPage/GroupSettingsPageView.tsx | 10 +-- site/src/pages/GroupsPage/GroupsPage.tsx | 2 +- site/src/pages/GroupsPage/GroupsPageView.tsx | 2 +- site/src/pages/HealthPage/AccessURLPage.tsx | 2 +- site/src/pages/HealthPage/Content.tsx | 2 +- site/src/pages/HealthPage/DERPPage.tsx | 2 +- site/src/pages/HealthPage/DERPRegionPage.tsx | 6 +- site/src/pages/HealthPage/DatabasePage.tsx | 2 +- site/src/pages/HealthPage/HealthLayout.tsx | 6 +- .../HealthPage/ProvisionerDaemonsPage.tsx | 2 +- site/src/pages/HealthPage/WebsocketPage.tsx | 2 +- .../pages/HealthPage/WorkspaceProxyPage.tsx | 4 +- site/src/pages/IconsPage/IconsPage.tsx | 2 +- site/src/pages/LoginPage/LoginPage.tsx | 6 +- .../pages/LoginPage/PasswordSignInForm.tsx | 2 +- site/src/pages/LoginPage/SignInForm.tsx | 2 +- .../CreateOrganizationPageView.tsx | 14 ++-- .../CustomRolesPage/CreateEditRolePage.tsx | 2 +- .../CreateEditRolePageView.tsx | 2 +- .../CustomRolesPage/CustomRolesPage.tsx | 2 +- .../CustomRolesPage/CustomRolesPageView.tsx | 2 +- .../IdpSyncPage/IdpGroupSyncForm.tsx | 4 +- .../IdpSyncPage/IdpMappingTable.tsx | 2 +- .../IdpSyncPage/IdpPillList.tsx | 2 +- .../IdpSyncPage/IdpSyncPage.tsx | 4 +- .../OrganizationMembersPage.tsx | 2 +- .../JobRow.stories.tsx | 2 +- .../JobRow.tsx | 4 +- ...izationProvisionerJobsPageView.stories.tsx | 2 +- .../OrganizationProvisionerJobsPageView.tsx | 4 +- .../OrganizationProvisionerKeysPage.tsx | 2 +- .../OrganizationProvisionerKeysPageView.tsx | 2 +- .../ProvisionerKeyRow.tsx | 4 +- .../OrganizationProvisionersPage.tsx | 2 +- .../OrganizationProvisionersPageView.tsx | 2 +- .../ProvisionerRow.tsx | 4 +- .../OrganizationSettingsPage.tsx | 2 +- .../OrganizationSettingsPageView.tsx | 12 ++-- .../UserTable/TableColumnHelpTooltip.tsx | 2 +- .../ResetPasswordPage/ChangePasswordPage.tsx | 6 +- .../ResetPasswordPage/RequestOTPPage.tsx | 6 +- site/src/pages/SetupPage/SetupPage.tsx | 4 +- site/src/pages/SetupPage/SetupPageView.tsx | 10 +-- .../StarterTemplatePage.tsx | 2 +- site/src/pages/TaskPage/TaskAppIframe.tsx | 2 +- site/src/pages/TaskPage/TaskApps.tsx | 4 +- site/src/pages/TaskPage/TaskPage.tsx | 6 +- .../TaskPage/TaskStartupWarningButton.tsx | 2 +- .../pages/TaskPage/TaskWildcardWarning.tsx | 2 +- site/src/pages/TasksPage/TasksPage.tsx | 4 +- site/src/pages/TasksPage/TasksTable.tsx | 2 +- site/src/pages/TasksPage/UsersCombobox.tsx | 2 +- .../TemplateDocsPage/TemplateDocsPage.tsx | 2 +- .../TemplateEmbedPage/TemplateEmbedPage.tsx | 8 +-- .../TemplateEmbedPageExperimental.tsx | 2 +- .../TemplateInsightsPage.tsx | 18 ++--- .../TemplateInsightsPage/utils.ts | 2 +- .../TemplatePrebuildsPage.tsx | 2 +- site/src/pages/TemplatePage/TemplateStats.tsx | 8 +-- site/src/pages/TemplatePage/utils.ts | 2 +- .../TemplateSettingsForm.tsx | 16 ++--- .../TemplateSettingsPage.tsx | 2 +- .../TemplatePermissionsPage.tsx | 4 +- .../UserOrGroupAutocomplete.tsx | 2 +- .../AutostopRequirementHelperText.tsx | 2 +- .../TemplateSchedulePage/TTLHelperText.tsx | 2 +- .../TemplateScheduleAutostart.stories.tsx | 2 +- .../TemplateScheduleAutostart.tsx | 6 +- .../TemplateScheduleForm.tsx | 10 +-- .../TemplateSchedulePage.tsx | 2 +- .../TemplateSchedulePage/formHelpers.tsx | 6 +- .../TemplateSettingsLayout.tsx | 2 +- .../TemplateVariablesForm.tsx | 2 +- .../TemplateVariablesPage.tsx | 2 +- .../TemplateVersionEditorPage/FileDialog.tsx | 2 +- .../ProvisionerTagsPopover.tsx | 2 +- .../PublishTemplateVersionDialog.tsx | 2 +- .../TemplateVersionEditor.tsx | 22 +++--- .../TemplateVersionEditorPage.test.tsx | 2 +- .../TemplateVersionEditorPage.tsx | 8 +-- .../TemplateVersionStatusBadge.tsx | 2 +- .../TemplateVersionPage.jest.tsx | 4 +- .../TemplateVersionPage.tsx | 2 +- .../TemplateVersionPageView.tsx | 4 +- .../pages/TemplatesPage/EmptyTemplates.tsx | 2 +- .../src/pages/TemplatesPage/TemplatesPage.tsx | 2 +- .../pages/TemplatesPage/TemplatesPageView.tsx | 12 ++-- .../src/pages/TerminalPage/TerminalAlerts.tsx | 4 +- site/src/pages/TerminalPage/TerminalPage.tsx | 8 +-- .../AccountPage/AccountForm.tsx | 10 +-- .../AppearancePage/AppearanceForm.tsx | 2 +- site/src/pages/UserSettingsPage/Layout.tsx | 2 +- .../NotificationsPage/NotificationsPage.tsx | 2 +- .../SchedulePage/ScheduleForm.tsx | 6 +- .../SecurityPage/SecurityForm.tsx | 2 +- .../SecurityPage/SingleSignOnSection.tsx | 2 +- site/src/pages/UserSettingsPage/Sidebar.tsx | 2 +- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 4 +- site/src/pages/UsersPage/UsersPage.tsx | 4 +- .../UsersPage/UsersTable/UserGroupsCell.tsx | 2 +- .../WorkspaceBuildPage/WorkspaceBuildPage.tsx | 2 +- .../WorkspaceBuildPageView.tsx | 6 +- site/src/pages/WorkspacePage/AppStatuses.tsx | 4 +- .../pages/WorkspacePage/ResourcesSidebar.tsx | 2 +- .../BuildParametersPopover.tsx | 12 ++-- .../WorkspaceActions/WorkspaceActions.tsx | 2 +- .../WorkspaceNotifications.tsx | 2 +- .../WorkspacePage/WorkspaceReadyPage.tsx | 2 +- .../WorkspaceScheduleControls.tsx | 18 ++--- .../pages/WorkspacePage/WorkspaceTopbar.tsx | 4 +- .../WorkspaceParametersForm.tsx | 12 ++-- .../WorkspaceParametersPage.tsx | 4 +- .../WorkspaceParametersPageExperimental.tsx | 6 +- ...orkspaceParametersPageViewExperimental.tsx | 6 +- .../WorkspaceScheduleForm.test.tsx | 2 +- .../WorkspaceScheduleForm.tsx | 6 +- .../WorkspaceSchedulePage.tsx | 4 +- .../WorkspaceSchedulePage/schedule.ts | 2 +- .../WorkspaceSettingsForm.tsx | 10 +-- .../WorkspaceSettingsLayout.tsx | 2 +- .../WorkspaceSettingsPage.tsx | 2 +- .../WorkspaceSharingPage.tsx | 4 +- .../BatchDeleteConfirmation.tsx | 2 +- .../WorkspacesPage/BatchUpdateModalForm.tsx | 2 +- .../WorkspacesPage/WorkspaceHelpTooltip.tsx | 2 +- .../WorkspacesPage/WorkspacesPage.test.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesPage.tsx | 2 +- .../WorkspacesPage/WorkspacesPageView.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesTable.tsx | 4 +- .../filter/WorkspacesFilter.tsx | 2 +- .../src/pages/WorkspacesPage/filter/menus.tsx | 2 +- site/src/testHelpers/entities.ts | 4 +- site/src/testHelpers/websockets.ts | 2 +- 411 files changed, 710 insertions(+), 704 deletions(-) diff --git a/site/e2e/api.ts b/site/e2e/api.ts index 04e54dc18d..e72534a4fe 100644 --- a/site/e2e/api.ts +++ b/site/e2e/api.ts @@ -9,7 +9,7 @@ import type { SerpentOption } from "#/api/typesGenerated"; dayjs.extend(duration); dayjs.extend(relativeTime); -import { humanDuration } from "utils/time"; +import { humanDuration } from "#/utils/time"; import { coderPort, defaultPassword } from "./constants"; import { findSessionToken, type LoginOptions, randomName } from "./helpers"; diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 2e14620597..238b3a76b0 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -7,12 +7,12 @@ import { type BrowserContext, expect, type Page, test } from "@playwright/test"; import express from "express"; import capitalize from "lodash/capitalize"; import * as ssh from "ssh2"; -import { TarWriter } from "utils/tar"; import { API } from "#/api/api"; import type { UpdateTemplateMeta, WorkspaceBuildParameter, } from "#/api/typesGenerated"; +import { TarWriter } from "#/utils/tar"; import { agentPProfPort, coderBinary, diff --git a/site/src/api/queries/groups.ts b/site/src/api/queries/groups.ts index ca946ca398..0c29d4b5e1 100644 --- a/site/src/api/queries/groups.ts +++ b/site/src/api/queries/groups.ts @@ -1,5 +1,4 @@ import type { QueryClient, UseQueryOptions } from "react-query"; -import { prepareQuery } from "utils/filters"; import { API } from "#/api/api"; import type { CreateGroupRequest, @@ -10,6 +9,7 @@ import type { UsersRequest, } from "#/api/typesGenerated"; import type { UsePaginatedQueryOptions } from "#/hooks/usePaginatedQuery"; +import { prepareQuery } from "#/utils/filters"; type GroupSortOrder = "asc" | "desc"; diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 92137e1552..9d1f6740f8 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -1,6 +1,4 @@ import type { MutationOptions, QueryClient, QueryOptions } from "react-query"; -import { delay } from "utils/delay"; -import { getTemplateVersionFiles } from "utils/templateVersion"; import { API, type GetTemplatesOptions, @@ -16,6 +14,8 @@ import type { TemplateVersion, UsersRequest, } from "#/api/typesGenerated"; +import { delay } from "#/utils/delay"; +import { getTemplateVersionFiles } from "#/utils/templateVersion"; const templateKey = (templateId: string) => ["template", templateId]; diff --git a/site/src/api/queries/users.ts b/site/src/api/queries/users.ts index a3c592be07..c16fef0206 100644 --- a/site/src/api/queries/users.ts +++ b/site/src/api/queries/users.ts @@ -4,7 +4,6 @@ import type { UseMutationOptions, UseQueryOptions, } from "react-query"; -import { prepareQuery } from "utils/filters"; import { API } from "#/api/api"; import type { AuthorizationRequest, @@ -26,6 +25,7 @@ import { type MetadataState, } from "#/hooks/useEmbeddedMetadata"; import type { UsePaginatedQueryOptions } from "#/hooks/usePaginatedQuery"; +import { prepareQuery } from "#/utils/filters"; import { getAuthorizationKey } from "./authCheck"; import { cachedQuery } from "./util"; diff --git a/site/src/components/Abbr/Abbr.tsx b/site/src/components/Abbr/Abbr.tsx index 0c08c33e11..579bfb1f56 100644 --- a/site/src/components/Abbr/Abbr.tsx +++ b/site/src/components/Abbr/Abbr.tsx @@ -1,5 +1,5 @@ import type { FC, HTMLAttributes } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type Pronunciation = "shorthand" | "acronym" | "initialism"; diff --git a/site/src/components/ActiveUserChart/ActiveUserChart.tsx b/site/src/components/ActiveUserChart/ActiveUserChart.tsx index 9f60bf791f..d35b647ba5 100644 --- a/site/src/components/ActiveUserChart/ActiveUserChart.tsx +++ b/site/src/components/ActiveUserChart/ActiveUserChart.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; -import { formatDate } from "utils/time"; import { type ChartConfig, ChartContainer, @@ -14,6 +13,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { formatDate } from "#/utils/time"; const chartConfig = { amount: { diff --git a/site/src/components/Alert/Alert.tsx b/site/src/components/Alert/Alert.tsx index 5961e7f981..d28f755765 100644 --- a/site/src/components/Alert/Alert.tsx +++ b/site/src/components/Alert/Alert.tsx @@ -7,8 +7,8 @@ import { XIcon, } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; const alertVariants = cva( "relative w-full rounded-lg border border-solid p-4 text-left", diff --git a/site/src/components/AnimatedIcons/Check.tsx b/site/src/components/AnimatedIcons/Check.tsx index beeaedcd0a..50d71519ae 100644 --- a/site/src/components/AnimatedIcons/Check.tsx +++ b/site/src/components/AnimatedIcons/Check.tsx @@ -1,5 +1,5 @@ import { CheckIcon as LucideCheckIcon } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type CheckIconProps = React.ComponentProps; diff --git a/site/src/components/AnimatedIcons/ChevronDown.tsx b/site/src/components/AnimatedIcons/ChevronDown.tsx index b795d94d5f..969fd13543 100644 --- a/site/src/components/AnimatedIcons/ChevronDown.tsx +++ b/site/src/components/AnimatedIcons/ChevronDown.tsx @@ -1,5 +1,5 @@ import { ChevronDown as LucideChevronDown } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface ChevronDownIconProps extends React.ComponentProps { diff --git a/site/src/components/Autocomplete/Autocomplete.tsx b/site/src/components/Autocomplete/Autocomplete.tsx index f9fdc2758c..e2bfbd71ec 100644 --- a/site/src/components/Autocomplete/Autocomplete.tsx +++ b/site/src/components/Autocomplete/Autocomplete.tsx @@ -5,7 +5,6 @@ import { useCallback, useState, } from "react"; -import { cn } from "utils/cn"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Command, @@ -21,6 +20,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; interface AutocompleteProps { value: TOption | null; diff --git a/site/src/components/Avatar/Avatar.tsx b/site/src/components/Avatar/Avatar.tsx index 1313627622..6e976d5db6 100644 --- a/site/src/components/Avatar/Avatar.tsx +++ b/site/src/components/Avatar/Avatar.tsx @@ -13,8 +13,8 @@ import { useTheme } from "@emotion/react"; import * as AvatarPrimitive from "@radix-ui/react-avatar"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; import { getExternalImageStylesFromUrl } from "#/theme/externalImages"; +import { cn } from "#/utils/cn"; const avatarVariants = cva( "relative flex shrink-0 overflow-hidden rounded border border-solid bg-surface-secondary text-content-secondary", diff --git a/site/src/components/Badge/Badge.tsx b/site/src/components/Badge/Badge.tsx index c7a991d675..295c0b848e 100644 --- a/site/src/components/Badge/Badge.tsx +++ b/site/src/components/Badge/Badge.tsx @@ -4,7 +4,7 @@ */ import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const badgeVariants = cva( ` diff --git a/site/src/components/Breadcrumb/Breadcrumb.tsx b/site/src/components/Breadcrumb/Breadcrumb.tsx index 16b9a1068f..2d25e517ae 100644 --- a/site/src/components/Breadcrumb/Breadcrumb.tsx +++ b/site/src/components/Breadcrumb/Breadcrumb.tsx @@ -4,7 +4,7 @@ */ import { Slot } from "@radix-ui/react-slot"; import { MoreHorizontal } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type BreadcrumbProps = React.ComponentPropsWithRef<"nav"> & { separator?: React.ReactNode; diff --git a/site/src/components/Button/Button.tsx b/site/src/components/Button/Button.tsx index 6196511775..553893dafe 100644 --- a/site/src/components/Button/Button.tsx +++ b/site/src/components/Button/Button.tsx @@ -4,7 +4,7 @@ */ import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; // Be careful when changing the child styles from the button such as images // because they can override the styles from other components like Avatar. diff --git a/site/src/components/Chart/Chart.tsx b/site/src/components/Chart/Chart.tsx index 6eb36a56c1..e4975dcf00 100644 --- a/site/src/components/Chart/Chart.tsx +++ b/site/src/components/Chart/Chart.tsx @@ -11,7 +11,7 @@ import { useMemo, } from "react"; import * as RechartsPrimitive from "recharts"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; // Format: { THEME_NAME: CSS_SELECTOR } const THEMES = { light: "", dark: ".dark" } as const; diff --git a/site/src/components/ChatMessageInput/ChatMessageInput.tsx b/site/src/components/ChatMessageInput/ChatMessageInput.tsx index e23e6ba978..e7b43265bd 100644 --- a/site/src/components/ChatMessageInput/ChatMessageInput.tsx +++ b/site/src/components/ChatMessageInput/ChatMessageInput.tsx @@ -32,7 +32,7 @@ import { useMemo, useRef, } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; import { $createFileReferenceNode, FileReferenceNode, diff --git a/site/src/components/ChatMessageInput/FileReferenceNode.tsx b/site/src/components/ChatMessageInput/FileReferenceNode.tsx index 944ffed145..1abdcda3c8 100644 --- a/site/src/components/ChatMessageInput/FileReferenceNode.tsx +++ b/site/src/components/ChatMessageInput/FileReferenceNode.tsx @@ -10,8 +10,8 @@ import { } from "lexical"; import { XIcon } from "lucide-react"; import { type FC, memo, type ReactNode } from "react"; -import { cn } from "utils/cn"; import { FileIcon } from "#/components/FileIcon/FileIcon"; +import { cn } from "#/utils/cn"; type SerializedFileReferenceNode = Spread< { diff --git a/site/src/components/Checkbox/Checkbox.tsx b/site/src/components/Checkbox/Checkbox.tsx index 6e0092e615..89b3f07c70 100644 --- a/site/src/components/Checkbox/Checkbox.tsx +++ b/site/src/components/Checkbox/Checkbox.tsx @@ -4,7 +4,7 @@ */ import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; import { Check, Minus } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; /** * To allow for an indeterminate state the checkbox must be controlled, otherwise the checked prop would remain undefined diff --git a/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx b/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx index 9cf45dc9d4..37631efd60 100644 --- a/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx +++ b/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx @@ -1,7 +1,7 @@ import { cva, type VariantProps } from "class-variance-authority"; import { ChevronRightIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const collapsibleSummaryVariants = cva( `flex items-center gap-1 p-0 bg-transparent border-0 text-inherit cursor-pointer diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index 3752f6f2e9..20fb0ecf82 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -1,7 +1,6 @@ import { CheckIcon } from "lucide-react"; import type React from "react"; import { createContext, useContext, useState } from "react"; -import { cn } from "utils/cn"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button } from "#/components/Button/Button"; import { @@ -17,6 +16,7 @@ import { PopoverContent, PopoverTrigger, } from "#/components/Popover/Popover"; +import { cn } from "#/utils/cn"; type ComboboxContextProps = { open: boolean; diff --git a/site/src/components/Command/Command.tsx b/site/src/components/Command/Command.tsx index a573896c4b..4e09961c6a 100644 --- a/site/src/components/Command/Command.tsx +++ b/site/src/components/Command/Command.tsx @@ -1,6 +1,6 @@ import { Command as CommandPrimitive } from "cmdk"; import { Search } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Command: React.FC< React.ComponentPropsWithRef diff --git a/site/src/components/CopyableValue/CopyableValue.tsx b/site/src/components/CopyableValue/CopyableValue.tsx index 665073f979..63b0838dbb 100644 --- a/site/src/components/CopyableValue/CopyableValue.tsx +++ b/site/src/components/CopyableValue/CopyableValue.tsx @@ -1,5 +1,4 @@ import { type FC, type HTMLAttributes, useState } from "react"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, @@ -7,6 +6,7 @@ import { } from "#/components/Tooltip/Tooltip"; import { useClickable } from "#/hooks/useClickable"; import { useClipboard } from "#/hooks/useClipboard"; +import { cn } from "#/utils/cn"; type TooltipSide = "top" | "right" | "bottom" | "left"; diff --git a/site/src/components/CustomLogo/CustomLogo.tsx b/site/src/components/CustomLogo/CustomLogo.tsx index d8e9765c10..af01b30ba8 100644 --- a/site/src/components/CustomLogo/CustomLogo.tsx +++ b/site/src/components/CustomLogo/CustomLogo.tsx @@ -1,7 +1,7 @@ import type { Interpolation, Theme } from "@emotion/react"; import type { FC } from "react"; -import { getApplicationName, getLogoURL } from "utils/appearance"; import { CoderIcon } from "#/components/Icons/CoderIcon"; +import { getApplicationName, getLogoURL } from "#/utils/appearance"; /** * Enterprise customers can set a custom logo for their Coder application. Use diff --git a/site/src/components/Dialog/Dialog.tsx b/site/src/components/Dialog/Dialog.tsx index 76e6abb305..58ed660d7e 100644 --- a/site/src/components/Dialog/Dialog.tsx +++ b/site/src/components/Dialog/Dialog.tsx @@ -4,7 +4,7 @@ */ import * as DialogPrimitive from "@radix-ui/react-dialog"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Dialog = DialogPrimitive.Root; diff --git a/site/src/components/DropdownMenu/DropdownMenu.tsx b/site/src/components/DropdownMenu/DropdownMenu.tsx index ea753745f1..2682c467b0 100644 --- a/site/src/components/DropdownMenu/DropdownMenu.tsx +++ b/site/src/components/DropdownMenu/DropdownMenu.tsx @@ -8,7 +8,7 @@ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import { Check } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const DropdownMenu = DropdownMenuPrimitive.Root; diff --git a/site/src/components/DurationField/DurationField.tsx b/site/src/components/DurationField/DurationField.tsx index 9a2cb602fb..3563f44136 100644 --- a/site/src/components/DurationField/DurationField.tsx +++ b/site/src/components/DurationField/DurationField.tsx @@ -9,7 +9,7 @@ import { durationInHours, suggestedTimeUnit, type TimeUnit, -} from "utils/time"; +} from "#/utils/time"; type DurationFieldProps = Omit & { valueMs: number; diff --git a/site/src/components/EmptyState/EmptyState.tsx b/site/src/components/EmptyState/EmptyState.tsx index 3faede44dd..a2391e52ac 100644 --- a/site/src/components/EmptyState/EmptyState.tsx +++ b/site/src/components/EmptyState/EmptyState.tsx @@ -1,5 +1,5 @@ import type { FC, HTMLAttributes, ReactNode } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export interface EmptyStateProps extends HTMLAttributes { /** Text Message to display, placed inside Typography component */ diff --git a/site/src/components/FeatureStageBadge/FeatureStageBadge.tsx b/site/src/components/FeatureStageBadge/FeatureStageBadge.tsx index 53fbcaf2df..908efbfc52 100644 --- a/site/src/components/FeatureStageBadge/FeatureStageBadge.tsx +++ b/site/src/components/FeatureStageBadge/FeatureStageBadge.tsx @@ -1,12 +1,12 @@ import type { FC, HTMLAttributes, ReactNode } from "react"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import { Link } from "#/components/Link/Link"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; /** * All types of feature that we are currently supporting. Defined as record to diff --git a/site/src/components/Filter/SelectFilter.tsx b/site/src/components/Filter/SelectFilter.tsx index 5da26bacdf..fbf8d78b5b 100644 --- a/site/src/components/Filter/SelectFilter.tsx +++ b/site/src/components/Filter/SelectFilter.tsx @@ -1,5 +1,4 @@ import type { FC, ReactNode } from "react"; -import { cn } from "utils/cn"; import { Combobox, ComboboxButton, @@ -10,6 +9,7 @@ import { ComboboxTrigger, } from "#/components/Combobox/Combobox"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; const BASE_WIDTH = 200; diff --git a/site/src/components/Filter/UsersFilter.tsx b/site/src/components/Filter/UsersFilter.tsx index cb1ea26e65..c6352dca11 100644 --- a/site/src/components/Filter/UsersFilter.tsx +++ b/site/src/components/Filter/UsersFilter.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { Filter, MenuSkeleton, @@ -14,6 +13,7 @@ import { type SelectFilterOption, } from "#/components/Filter/SelectFilter"; import { StatusIndicatorDot } from "#/components/StatusIndicator/StatusIndicator"; +import { docs } from "#/utils/docs"; const userFilterQuery = { active: "status:active", diff --git a/site/src/components/Form/Form.tsx b/site/src/components/Form/Form.tsx index c33cabe5ee..4cde05a8d5 100644 --- a/site/src/components/Form/Form.tsx +++ b/site/src/components/Form/Form.tsx @@ -7,9 +7,9 @@ import { type ReactNode, useContext, } from "react"; -import { cn } from "utils/cn"; import { AlphaBadge, DeprecatedBadge } from "#/components/Badges/Badges"; import { Stack } from "#/components/Stack/Stack"; +import { cn } from "#/utils/cn"; type FormContextValue = { direction?: "horizontal" | "vertical" }; diff --git a/site/src/components/FormField/FormField.tsx b/site/src/components/FormField/FormField.tsx index 92257899fd..209bcb5e8e 100644 --- a/site/src/components/FormField/FormField.tsx +++ b/site/src/components/FormField/FormField.tsx @@ -1,8 +1,8 @@ import { type FC, type ReactNode, useId } from "react"; -import { cn } from "utils/cn"; -import type { FormHelpers } from "utils/formUtils"; import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; +import { cn } from "#/utils/cn"; +import type { FormHelpers } from "#/utils/formUtils"; type FormFieldProps = React.ComponentPropsWithRef<"input"> & { field: FormHelpers; diff --git a/site/src/components/FullPageLayout/Sidebar.tsx b/site/src/components/FullPageLayout/Sidebar.tsx index f58e97ac60..4ebc14a480 100644 --- a/site/src/components/FullPageLayout/Sidebar.tsx +++ b/site/src/components/FullPageLayout/Sidebar.tsx @@ -1,6 +1,6 @@ import type { ComponentProps, FC, HTMLAttributes } from "react"; import { Link, type LinkProps } from "react-router"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; import { TopbarIconButton } from "./Topbar"; export const Sidebar: FC> = (props) => { diff --git a/site/src/components/FullPageLayout/Topbar.tsx b/site/src/components/FullPageLayout/Topbar.tsx index 07643e6f59..b73d2133ff 100644 --- a/site/src/components/FullPageLayout/Topbar.tsx +++ b/site/src/components/FullPageLayout/Topbar.tsx @@ -7,9 +7,9 @@ import { type ReactElement, type Ref, } from "react"; -import { cn } from "utils/cn"; import { Avatar, type AvatarProps } from "#/components/Avatar/Avatar"; import { Button, type ButtonProps } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; export const Topbar: FC> = ({ className, diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index ddd3b8ba1b..0b72421bd0 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -1,6 +1,5 @@ import { CircleHelpIcon, ExternalLinkIcon } from "lucide-react"; import type { FC, HTMLAttributes, PropsWithChildren, ReactNode } from "react"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, @@ -8,6 +7,7 @@ import { type TooltipProps, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; type Icon = typeof CircleHelpIcon; diff --git a/site/src/components/Icons/CoderIcon.tsx b/site/src/components/Icons/CoderIcon.tsx index 7053ffe8d2..ff9dcf403d 100644 --- a/site/src/components/Icons/CoderIcon.tsx +++ b/site/src/components/Icons/CoderIcon.tsx @@ -1,6 +1,6 @@ import type { SvgIconProps } from "@mui/material/SvgIcon"; import type { FC } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; /** * CoderIcon represents the cloud with brackets Coder brand icon. It does not diff --git a/site/src/components/InfoTooltip/InfoTooltip.tsx b/site/src/components/InfoTooltip/InfoTooltip.tsx index d727240df6..e9953b290e 100644 --- a/site/src/components/InfoTooltip/InfoTooltip.tsx +++ b/site/src/components/InfoTooltip/InfoTooltip.tsx @@ -1,5 +1,4 @@ import type { FC, ReactNode } from "react"; -import { cn } from "utils/cn"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; import type { ThemeRole } from "#/theme/roles"; +import { cn } from "#/utils/cn"; interface InfoTooltipProps { type?: ThemeRole; diff --git a/site/src/components/Input/Input.tsx b/site/src/components/Input/Input.tsx index f5fe40400b..3d96c564b2 100644 --- a/site/src/components/Input/Input.tsx +++ b/site/src/components/Input/Input.tsx @@ -2,7 +2,7 @@ * Copied from shadc/ui on 11/13/2024 * @see {@link https://ui.shadcn.com/docs/components/input} */ -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Input: React.FC> = ({ className, diff --git a/site/src/components/InputGroup/InputGroup.tsx b/site/src/components/InputGroup/InputGroup.tsx index 549442bddd..f23969afc1 100644 --- a/site/src/components/InputGroup/InputGroup.tsx +++ b/site/src/components/InputGroup/InputGroup.tsx @@ -1,7 +1,7 @@ import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; import { Button, type ButtonProps } from "#/components/Button/Button"; import { Input } from "#/components/Input/Input"; +import { cn } from "#/utils/cn"; export const InputGroup: React.FC> = ({ className, diff --git a/site/src/components/Kbd/Kbd.tsx b/site/src/components/Kbd/Kbd.tsx index d08b0d8dd9..ead6055542 100644 --- a/site/src/components/Kbd/Kbd.tsx +++ b/site/src/components/Kbd/Kbd.tsx @@ -1,4 +1,4 @@ -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; function Kbd({ className, ...props }: React.ComponentProps<"kbd">) { return ( diff --git a/site/src/components/Label/Label.tsx b/site/src/components/Label/Label.tsx index fca12bb3ce..a814f1de9a 100644 --- a/site/src/components/Label/Label.tsx +++ b/site/src/components/Label/Label.tsx @@ -4,7 +4,7 @@ */ import * as LabelPrimitive from "@radix-ui/react-label"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const labelVariants = cva( "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", diff --git a/site/src/components/LastSeen/LastSeen.tsx b/site/src/components/LastSeen/LastSeen.tsx index 1dd8444df4..2823052466 100644 --- a/site/src/components/LastSeen/LastSeen.tsx +++ b/site/src/components/LastSeen/LastSeen.tsx @@ -1,8 +1,8 @@ import { useTheme } from "@emotion/react"; import dayjs from "dayjs"; import type { FC, HTMLAttributes } from "react"; -import { cn } from "utils/cn"; -import { isAfter, relativeTime, subtractTime } from "utils/time"; +import { cn } from "#/utils/cn"; +import { isAfter, relativeTime, subtractTime } from "#/utils/time"; interface LastSeenProps extends Omit, "children"> { diff --git a/site/src/components/Latency/Latency.tsx b/site/src/components/Latency/Latency.tsx index fbfbf6eddb..0e26a08f23 100644 --- a/site/src/components/Latency/Latency.tsx +++ b/site/src/components/Latency/Latency.tsx @@ -1,14 +1,14 @@ import CircularProgress from "@mui/material/CircularProgress"; import { CircleHelpIcon } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { getLatencyColor } from "utils/latency"; import { Abbr } from "#/components/Abbr/Abbr"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; interface LatencyProps { latency?: number; diff --git a/site/src/components/Link/Link.tsx b/site/src/components/Link/Link.tsx index 717d489c5d..7621cf85ca 100644 --- a/site/src/components/Link/Link.tsx +++ b/site/src/components/Link/Link.tsx @@ -1,7 +1,7 @@ import { Slot, Slottable } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import { SquareArrowOutUpRightIcon } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const linkVariants = cva( `relative inline-flex items-center no-underline font-medium text-content-link hover:cursor-pointer diff --git a/site/src/components/Loader/Loader.tsx b/site/src/components/Loader/Loader.tsx index 7e463ef1f4..b771b5fec6 100644 --- a/site/src/components/Loader/Loader.tsx +++ b/site/src/components/Loader/Loader.tsx @@ -1,6 +1,6 @@ import type { FC, HTMLAttributes } from "react"; -import { cn } from "utils/cn"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; interface LoaderProps extends HTMLAttributes { fullscreen?: boolean; diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 1ca6943afe..a88b611562 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -13,7 +13,6 @@ import ReactMarkdown, { type Options } from "react-markdown"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { dracula } from "react-syntax-highlighter/dist/cjs/styles/prism"; import gfm from "remark-gfm"; -import { cn } from "utils/cn"; import { Table, TableBody, @@ -22,6 +21,7 @@ import { TableRow, } from "#/components/Table/Table"; import colors from "#/theme/tailwindColors"; +import { cn } from "#/utils/cn"; interface MarkdownProps { /** diff --git a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx index 947cc7db88..f1725acd12 100644 --- a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx +++ b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx @@ -16,7 +16,6 @@ import { useRef, useState, } from "react"; -import { cn } from "utils/cn"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Avatar } from "#/components/Avatar/Avatar"; import { Badge } from "#/components/Badge/Badge"; @@ -32,6 +31,7 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { useDebouncedValue } from "#/hooks/debounce"; +import { cn } from "#/utils/cn"; export interface Option { value: string; diff --git a/site/src/components/MultiUserSelect/MultiUserSelect.tsx b/site/src/components/MultiUserSelect/MultiUserSelect.tsx index 7dc7b87c45..1d200d5f2a 100644 --- a/site/src/components/MultiUserSelect/MultiUserSelect.tsx +++ b/site/src/components/MultiUserSelect/MultiUserSelect.tsx @@ -20,8 +20,8 @@ import { useDebouncedFunction } from "hooks/debounce"; import { useClickableTableRow } from "hooks/useClickableTableRow"; import { type FC, type ReactNode, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { cn } from "utils/cn"; -import { prepareQuery } from "utils/filters"; +import { cn } from "#/utils/cn"; +import { prepareQuery } from "#/utils/filters"; const DEBOUNCE_MS = 750; diff --git a/site/src/components/PageHeader/PageHeader.tsx b/site/src/components/PageHeader/PageHeader.tsx index 29930cdc41..0e7852889e 100644 --- a/site/src/components/PageHeader/PageHeader.tsx +++ b/site/src/components/PageHeader/PageHeader.tsx @@ -1,5 +1,5 @@ import type { FC, PropsWithChildren, ReactNode } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface PageHeaderProps { actions?: ReactNode; diff --git a/site/src/components/Paywall/Paywall.tsx b/site/src/components/Paywall/Paywall.tsx index 74a26ad1b6..713a0fafa1 100644 --- a/site/src/components/Paywall/Paywall.tsx +++ b/site/src/components/Paywall/Paywall.tsx @@ -1,8 +1,8 @@ import { CircleCheckBigIcon } from "lucide-react"; import type React from "react"; import type { FC } from "react"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; export const Paywall = ({ className, diff --git a/site/src/components/Paywall/PaywallAIGovernance.tsx b/site/src/components/Paywall/PaywallAIGovernance.tsx index 107b6ee44a..0b8b7f9bec 100644 --- a/site/src/components/Paywall/PaywallAIGovernance.tsx +++ b/site/src/components/Paywall/PaywallAIGovernance.tsx @@ -1,5 +1,5 @@ -import { docs } from "utils/docs"; import { PremiumBadge } from "#/components/Badges/Badges"; +import { docs } from "#/utils/docs"; import { Paywall, PaywallContent, diff --git a/site/src/components/Paywall/PaywallPremium.tsx b/site/src/components/Paywall/PaywallPremium.tsx index 22e0c295d0..d86b12ba69 100644 --- a/site/src/components/Paywall/PaywallPremium.tsx +++ b/site/src/components/Paywall/PaywallPremium.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from "react"; -import { cn } from "utils/cn"; import { PremiumBadge } from "#/components/Badges/Badges"; +import { cn } from "#/utils/cn"; import { Paywall, PaywallContent, diff --git a/site/src/components/Popover/Popover.tsx b/site/src/components/Popover/Popover.tsx index 4e5d84771d..398da34fa3 100644 --- a/site/src/components/Popover/Popover.tsx +++ b/site/src/components/Popover/Popover.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/popover} */ import * as PopoverPrimitive from "@radix-ui/react-popover"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export type PopoverContentProps = PopoverPrimitive.PopoverContentProps; diff --git a/site/src/components/RadioGroup/RadioGroup.tsx b/site/src/components/RadioGroup/RadioGroup.tsx index 0f430d94dd..af769ab484 100644 --- a/site/src/components/RadioGroup/RadioGroup.tsx +++ b/site/src/components/RadioGroup/RadioGroup.tsx @@ -4,7 +4,7 @@ */ import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"; import { Circle } from "lucide-react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const RadioGroup: React.FC< React.ComponentPropsWithRef diff --git a/site/src/components/RichParameterInput/RichParameterInput.tsx b/site/src/components/RichParameterInput/RichParameterInput.tsx index f564d0f399..f39f881ecb 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.tsx @@ -7,10 +7,6 @@ import RadioGroup from "@mui/material/RadioGroup"; import TextField, { type TextFieldProps } from "@mui/material/TextField"; import { CircleAlertIcon, SettingsIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; -import type { - AutofillBuildParameter, - AutofillSource, -} from "utils/richParameters"; import type { TemplateVersionParameter } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; @@ -22,6 +18,10 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import type { + AutofillBuildParameter, + AutofillSource, +} from "#/utils/richParameters"; import { TagInput } from "../TagInput/TagInput"; const isBoolean = (parameter: TemplateVersionParameter) => { diff --git a/site/src/components/ScrollArea/ScrollArea.tsx b/site/src/components/ScrollArea/ScrollArea.tsx index d42e9c2eef..4557d588d9 100644 --- a/site/src/components/ScrollArea/ScrollArea.tsx +++ b/site/src/components/ScrollArea/ScrollArea.tsx @@ -4,7 +4,7 @@ */ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; import { useCallback, useRef } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface ScrollAreaProps extends React.ComponentPropsWithRef { diff --git a/site/src/components/Search/Search.tsx b/site/src/components/Search/Search.tsx index 66a9be7ffa..33e1e4f392 100644 --- a/site/src/components/Search/Search.tsx +++ b/site/src/components/Search/Search.tsx @@ -1,6 +1,6 @@ import { SearchIcon } from "lucide-react"; import type { FC, HTMLAttributes, InputHTMLAttributes, Ref } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface SearchProps extends HTMLAttributes { ref?: Ref; diff --git a/site/src/components/Select/Select.tsx b/site/src/components/Select/Select.tsx index c1d554c0e7..29acf76b6f 100644 --- a/site/src/components/Select/Select.tsx +++ b/site/src/components/Select/Select.tsx @@ -8,8 +8,8 @@ import { ChevronUp, ChevronDown as LucideChevronDown, } from "lucide-react"; -import { cn } from "utils/cn"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; +import { cn } from "#/utils/cn"; export const Select = SelectPrimitive.Root; diff --git a/site/src/components/SelectMenu/SelectMenu.tsx b/site/src/components/SelectMenu/SelectMenu.tsx index 5c817d5334..4b03a9a709 100644 --- a/site/src/components/SelectMenu/SelectMenu.tsx +++ b/site/src/components/SelectMenu/SelectMenu.tsx @@ -9,7 +9,6 @@ import { type ReactElement, useMemo, } from "react"; -import { cn } from "utils/cn"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button, type ButtonProps } from "#/components/Button/Button"; import { @@ -23,6 +22,7 @@ import { SearchField, type SearchFieldProps, } from "#/components/SearchField/SearchField"; +import { cn } from "#/utils/cn"; export const SelectMenu = Popover; diff --git a/site/src/components/Separator/Separator.tsx b/site/src/components/Separator/Separator.tsx index b43f0f32ae..232b0fa404 100644 --- a/site/src/components/Separator/Separator.tsx +++ b/site/src/components/Separator/Separator.tsx @@ -4,7 +4,7 @@ import * as SeparatorPrimitive from "@radix-ui/react-separator"; * @see {@link https://ui.shadcn.com/docs/components/separator} */ import type * as React from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; function Separator({ className, diff --git a/site/src/components/SettingsHeader/SettingsHeader.stories.tsx b/site/src/components/SettingsHeader/SettingsHeader.stories.tsx index c5e90e1fbd..1e810c6d84 100644 --- a/site/src/components/SettingsHeader/SettingsHeader.stories.tsx +++ b/site/src/components/SettingsHeader/SettingsHeader.stories.tsx @@ -1,5 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { docs } from "utils/docs"; +import { docs } from "#/utils/docs"; import { SettingsHeader, SettingsHeaderDescription, diff --git a/site/src/components/SettingsHeader/SettingsHeader.tsx b/site/src/components/SettingsHeader/SettingsHeader.tsx index d40be46f12..2d056832bf 100644 --- a/site/src/components/SettingsHeader/SettingsHeader.tsx +++ b/site/src/components/SettingsHeader/SettingsHeader.tsx @@ -1,8 +1,8 @@ import { cva, type VariantProps } from "class-variance-authority"; import { SquareArrowOutUpRightIcon } from "lucide-react"; import type { FC, PropsWithChildren, ReactNode } from "react"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; type SettingsHeaderProps = Readonly< PropsWithChildren<{ diff --git a/site/src/components/Sidebar/Sidebar.tsx b/site/src/components/Sidebar/Sidebar.tsx index 6ab890e6b1..1026791275 100644 --- a/site/src/components/Sidebar/Sidebar.tsx +++ b/site/src/components/Sidebar/Sidebar.tsx @@ -1,7 +1,7 @@ import type { ElementType, FC, ReactNode } from "react"; import { Link, NavLink } from "react-router"; -import { cn } from "utils/cn"; import { Stack } from "#/components/Stack/Stack"; +import { cn } from "#/utils/cn"; interface SidebarProps { children?: ReactNode; diff --git a/site/src/components/Skeleton/Skeleton.tsx b/site/src/components/Skeleton/Skeleton.tsx index da5d5a7f1d..e4c983ff5e 100644 --- a/site/src/components/Skeleton/Skeleton.tsx +++ b/site/src/components/Skeleton/Skeleton.tsx @@ -2,7 +2,7 @@ * Copied from shadc/ui on 06/20/2025 * @see {@link https://ui.shadcn.com/docs/components/skeleton} */ -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; function Skeleton({ className, ...props }: React.ComponentProps<"div">) { return ( diff --git a/site/src/components/Slider/Slider.tsx b/site/src/components/Slider/Slider.tsx index 8dc2fdc48f..6c313853f8 100644 --- a/site/src/components/Slider/Slider.tsx +++ b/site/src/components/Slider/Slider.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/slider} */ import * as SliderPrimitive from "@radix-ui/react-slider"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Slider: React.FC< React.ComponentPropsWithRef diff --git a/site/src/components/Spinner/Spinner.tsx b/site/src/components/Spinner/Spinner.tsx index b612f87155..b8abc7f9e5 100644 --- a/site/src/components/Spinner/Spinner.tsx +++ b/site/src/components/Spinner/Spinner.tsx @@ -7,7 +7,7 @@ import isChromatic from "chromatic/isChromatic"; import { cva, type VariantProps } from "class-variance-authority"; import type { ReactNode } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const leaves = Array.from({ length: 8 }).map((_, i) => i); diff --git a/site/src/components/StackLabel/StackLabel.tsx b/site/src/components/StackLabel/StackLabel.tsx index ae5b24ff51..239a506011 100644 --- a/site/src/components/StackLabel/StackLabel.tsx +++ b/site/src/components/StackLabel/StackLabel.tsx @@ -2,8 +2,8 @@ import FormHelperText, { type FormHelperTextProps, } from "@mui/material/FormHelperText"; import type { ComponentProps, FC } from "react"; -import { cn } from "utils/cn"; import { Stack } from "#/components/Stack/Stack"; +import { cn } from "#/utils/cn"; /** * Use these components as the label in FormControlLabel when implementing radio diff --git a/site/src/components/Stats/Stats.tsx b/site/src/components/Stats/Stats.tsx index 8ae5f154f1..556262418d 100644 --- a/site/src/components/Stats/Stats.tsx +++ b/site/src/components/Stats/Stats.tsx @@ -1,5 +1,5 @@ import type { FC, HTMLAttributes, ReactNode } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Stats: FC> = ({ children, diff --git a/site/src/components/StatusIndicator/StatusIndicator.tsx b/site/src/components/StatusIndicator/StatusIndicator.tsx index ec9d3794c6..218ed7986c 100644 --- a/site/src/components/StatusIndicator/StatusIndicator.tsx +++ b/site/src/components/StatusIndicator/StatusIndicator.tsx @@ -1,11 +1,11 @@ import { cva, type VariantProps } from "class-variance-authority"; import { createContext, type FC, useContext } from "react"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; const statusIndicatorVariants = cva( "font-medium inline-flex items-center gap-2", diff --git a/site/src/components/StatusPill/StatusPill.tsx b/site/src/components/StatusPill/StatusPill.tsx index ce15d2de2e..18c853e3f4 100644 --- a/site/src/components/StatusPill/StatusPill.tsx +++ b/site/src/components/StatusPill/StatusPill.tsx @@ -1,11 +1,11 @@ import type { FC } from "react"; -import { httpStatusColor } from "utils/http"; import { Pill } from "#/components/Pill/Pill"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { httpStatusColor } from "#/utils/http"; interface StatusPillProps { code: number; diff --git a/site/src/components/Switch/Switch.tsx b/site/src/components/Switch/Switch.tsx index 11ef06cb6f..031cfb1fa5 100644 --- a/site/src/components/Switch/Switch.tsx +++ b/site/src/components/Switch/Switch.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/switch} */ import * as SwitchPrimitives from "@radix-ui/react-switch"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Switch: React.FC< React.ComponentPropsWithRef diff --git a/site/src/components/Table/Table.tsx b/site/src/components/Table/Table.tsx index a1f38b0a4c..7ce1dcf203 100644 --- a/site/src/components/Table/Table.tsx +++ b/site/src/components/Table/Table.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/table} */ import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Table: React.FC> = ({ className, diff --git a/site/src/components/Tabs/Tabs.tsx b/site/src/components/Tabs/Tabs.tsx index de4a1d3581..4886f2c6ef 100644 --- a/site/src/components/Tabs/Tabs.tsx +++ b/site/src/components/Tabs/Tabs.tsx @@ -9,7 +9,7 @@ import { useRef, } from "react"; import { Link, type LinkProps } from "react-router"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; // Keeping this for now because of a workaround in WorkspaceBUildPageView export const TAB_PADDING_X = 16; diff --git a/site/src/components/Textarea/Textarea.tsx b/site/src/components/Textarea/Textarea.tsx index 0fd9551014..51a248e5ad 100644 --- a/site/src/components/Textarea/Textarea.tsx +++ b/site/src/components/Textarea/Textarea.tsx @@ -2,7 +2,7 @@ * Copied from shadc/ui on 11/13/2024 * @see {@link https://ui.shadcn.com/docs/components/textarea} */ -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const Textarea: React.FC> = ({ className, diff --git a/site/src/components/Timeline/TimelineDateRow.tsx b/site/src/components/Timeline/TimelineDateRow.tsx index 80dda0cbfc..04376b73f4 100644 --- a/site/src/components/Timeline/TimelineDateRow.tsx +++ b/site/src/components/Timeline/TimelineDateRow.tsx @@ -1,7 +1,7 @@ import { css, useTheme } from "@emotion/react"; import type { FC } from "react"; -import { formatDate } from "utils/time"; import { TableCell, TableRow } from "#/components/Table/Table"; +import { formatDate } from "#/utils/time"; import { createDisplayDate } from "./utils"; export interface TimelineDateRow { diff --git a/site/src/components/Timeline/TimelineEntry.tsx b/site/src/components/Timeline/TimelineEntry.tsx index 27affd0bd6..d4fb938650 100644 --- a/site/src/components/Timeline/TimelineEntry.tsx +++ b/site/src/components/Timeline/TimelineEntry.tsx @@ -1,5 +1,5 @@ -import { cn } from "utils/cn"; import { TableRow, type TableRowProps } from "#/components/Table/Table"; +import { cn } from "#/utils/cn"; interface TimelineEntryProps extends TableRowProps { ref?: React.Ref; diff --git a/site/src/components/Timeline/utils.ts b/site/src/components/Timeline/utils.ts index 235f945330..9af462a583 100644 --- a/site/src/components/Timeline/utils.ts +++ b/site/src/components/Timeline/utils.ts @@ -1,6 +1,6 @@ import dayjs from "dayjs"; import calendar from "dayjs/plugin/calendar"; -import { formatDate } from "utils/time"; +import { formatDate } from "#/utils/time"; dayjs.extend(calendar); diff --git a/site/src/components/Toaster/Toaster.tsx b/site/src/components/Toaster/Toaster.tsx index 918c5f03d9..618ec7b099 100644 --- a/site/src/components/Toaster/Toaster.tsx +++ b/site/src/components/Toaster/Toaster.tsx @@ -6,8 +6,8 @@ import { XIcon, } from "lucide-react"; import { Toaster as Sonner, type ToasterProps as SonnerProps } from "sonner"; -import { cn } from "utils/cn"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; export const Toaster = ({ ...props }: SonnerProps) => { return ( diff --git a/site/src/components/Tooltip/Tooltip.tsx b/site/src/components/Tooltip/Tooltip.tsx index 103aca1b3f..b4a3a2e359 100644 --- a/site/src/components/Tooltip/Tooltip.tsx +++ b/site/src/components/Tooltip/Tooltip.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/tooltip} */ import * as TooltipPrimitive from "@radix-ui/react-tooltip"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; export const TooltipProvider = TooltipPrimitive.Provider; diff --git a/site/src/components/UserAutocomplete/UserAutocomplete.tsx b/site/src/components/UserAutocomplete/UserAutocomplete.tsx index 59fb730037..c8365316ad 100644 --- a/site/src/components/UserAutocomplete/UserAutocomplete.tsx +++ b/site/src/components/UserAutocomplete/UserAutocomplete.tsx @@ -1,7 +1,5 @@ import { type FC, useId, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { cn } from "utils/cn"; -import { prepareQuery } from "utils/filters"; import { getErrorMessage } from "#/api/errors"; import { organizationMembers } from "#/api/queries/organizations"; import { users, workspaceAvailableUsers } from "#/api/queries/users"; @@ -26,6 +24,8 @@ import { import { Label } from "#/components/Label/Label"; import { Spinner } from "#/components/Spinner/Spinner"; import { useDebouncedFunction, useDebouncedValue } from "#/hooks/debounce"; +import { cn } from "#/utils/cn"; +import { prepareQuery } from "#/utils/filters"; // The common properties between users and org members that we need. type SelectedUser = { diff --git a/site/src/components/ai-elements/conversation.tsx b/site/src/components/ai-elements/conversation.tsx index 561f8e8df3..f50e396d6e 100644 --- a/site/src/components/ai-elements/conversation.tsx +++ b/site/src/components/ai-elements/conversation.tsx @@ -1,5 +1,5 @@ import type { ComponentPropsWithRef } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type ConversationProps = ComponentPropsWithRef<"div">; diff --git a/site/src/components/ai-elements/message.tsx b/site/src/components/ai-elements/message.tsx index 5a50ca7ae2..2f56aaa975 100644 --- a/site/src/components/ai-elements/message.tsx +++ b/site/src/components/ai-elements/message.tsx @@ -1,5 +1,5 @@ import type { ComponentPropsWithRef } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type MessageProps = ComponentPropsWithRef<"div">; diff --git a/site/src/components/ai-elements/model-selector.tsx b/site/src/components/ai-elements/model-selector.tsx index 2fc096c6bd..b0a00bd6b6 100644 --- a/site/src/components/ai-elements/model-selector.tsx +++ b/site/src/components/ai-elements/model-selector.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { Select, SelectContent, @@ -14,6 +13,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; export interface ModelSelectorOption { id: string; diff --git a/site/src/components/ai-elements/response.tsx b/site/src/components/ai-elements/response.tsx index 7a8fd2f22e..f9b337b301 100644 --- a/site/src/components/ai-elements/response.tsx +++ b/site/src/components/ai-elements/response.tsx @@ -10,7 +10,7 @@ import { Streamdown, type UrlTransform, } from "streamdown"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface ResponseProps extends Omit, "children"> { children: string; diff --git a/site/src/components/ai-elements/shimmer.tsx b/site/src/components/ai-elements/shimmer.tsx index 645e4ce2a6..d40087ad0a 100644 --- a/site/src/components/ai-elements/shimmer.tsx +++ b/site/src/components/ai-elements/shimmer.tsx @@ -2,7 +2,7 @@ import type { MotionProps } from "motion/react"; import { MotionConfig, motion } from "motion/react"; import type { CSSProperties, ElementType, JSX } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type MotionHTMLProps = MotionProps & Record; diff --git a/site/src/components/ai-elements/thinking.tsx b/site/src/components/ai-elements/thinking.tsx index fb506ef282..f049c02183 100644 --- a/site/src/components/ai-elements/thinking.tsx +++ b/site/src/components/ai-elements/thinking.tsx @@ -1,5 +1,5 @@ import type { ComponentPropsWithRef } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type ThinkingProps = ComponentPropsWithRef<"div">; diff --git a/site/src/components/ai-elements/tool/ChatSummarizedTool.tsx b/site/src/components/ai-elements/tool/ChatSummarizedTool.tsx index a80ad90178..3717744899 100644 --- a/site/src/components/ai-elements/tool/ChatSummarizedTool.tsx +++ b/site/src/components/ai-elements/tool/ChatSummarizedTool.tsx @@ -1,12 +1,12 @@ import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; -import { cn } from "utils/cn"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { Response } from "../response"; import { ToolCollapsible } from "./ToolCollapsible"; import type { ToolStatus } from "./utils"; diff --git a/site/src/components/ai-elements/tool/ComputerTool.tsx b/site/src/components/ai-elements/tool/ComputerTool.tsx index e0f685886d..861df494e3 100644 --- a/site/src/components/ai-elements/tool/ComputerTool.tsx +++ b/site/src/components/ai-elements/tool/ComputerTool.tsx @@ -1,13 +1,13 @@ import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; import { useState } from "react"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { ImageLightbox } from "#/pages/AgentsPage/components/ImageLightbox"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; import type { ToolStatus } from "./utils"; diff --git a/site/src/components/ai-elements/tool/CreateWorkspaceTool.tsx b/site/src/components/ai-elements/tool/CreateWorkspaceTool.tsx index fdcca82ce5..c8321d9b93 100644 --- a/site/src/components/ai-elements/tool/CreateWorkspaceTool.tsx +++ b/site/src/components/ai-elements/tool/CreateWorkspaceTool.tsx @@ -1,12 +1,12 @@ import { ExternalLinkIcon, LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; import { Link } from "react-router"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { asRecord, asString, type ToolStatus } from "./utils"; /** diff --git a/site/src/components/ai-elements/tool/EditFilesTool.tsx b/site/src/components/ai-elements/tool/EditFilesTool.tsx index 5ef291977a..de0f3aff28 100644 --- a/site/src/components/ai-elements/tool/EditFilesTool.tsx +++ b/site/src/components/ai-elements/tool/EditFilesTool.tsx @@ -3,13 +3,13 @@ import type { FileDiffMetadata } from "@pierre/diffs"; import { FileDiff } from "@pierre/diffs/react"; import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; -import { cn } from "utils/cn"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; import { DIFFS_FONT_STYLE, diff --git a/site/src/components/ai-elements/tool/ExecuteTool.tsx b/site/src/components/ai-elements/tool/ExecuteTool.tsx index 8a68277ea6..50958ea80f 100644 --- a/site/src/components/ai-elements/tool/ExecuteTool.tsx +++ b/site/src/components/ai-elements/tool/ExecuteTool.tsx @@ -9,7 +9,6 @@ import { } from "lucide-react"; import type React from "react"; import { useRef, useState } from "react"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; import { CopyButton } from "#/components/CopyButton/CopyButton"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; @@ -18,6 +17,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { BORDER_BG_STYLE, COLLAPSED_OUTPUT_HEIGHT, diff --git a/site/src/components/ai-elements/tool/ListTemplatesTool.tsx b/site/src/components/ai-elements/tool/ListTemplatesTool.tsx index 9dcb2e9f56..c18623123a 100644 --- a/site/src/components/ai-elements/tool/ListTemplatesTool.tsx +++ b/site/src/components/ai-elements/tool/ListTemplatesTool.tsx @@ -1,12 +1,12 @@ import { ExternalLinkIcon, LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; import { Link } from "react-router"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; import { asRecord, asString, type ToolStatus } from "./utils"; diff --git a/site/src/components/ai-elements/tool/ProcessOutputTool.tsx b/site/src/components/ai-elements/tool/ProcessOutputTool.tsx index 68e7c8847a..265f274f27 100644 --- a/site/src/components/ai-elements/tool/ProcessOutputTool.tsx +++ b/site/src/components/ai-elements/tool/ProcessOutputTool.tsx @@ -1,9 +1,9 @@ import { ChevronDownIcon, LoaderIcon } from "lucide-react"; import type React from "react"; import { useRef, useState } from "react"; -import { cn } from "utils/cn"; import { CopyButton } from "#/components/CopyButton/CopyButton"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; +import { cn } from "#/utils/cn"; import { COLLAPSED_OUTPUT_HEIGHT } from "./utils"; /** diff --git a/site/src/components/ai-elements/tool/ProposePlanTool.tsx b/site/src/components/ai-elements/tool/ProposePlanTool.tsx index 0380d392a5..fa690b4ae9 100644 --- a/site/src/components/ai-elements/tool/ProposePlanTool.tsx +++ b/site/src/components/ai-elements/tool/ProposePlanTool.tsx @@ -1,13 +1,13 @@ import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; import { useQuery } from "react-query"; -import { cn } from "utils/cn"; import { API } from "#/api/api"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { Response } from "../response"; import type { ToolStatus } from "./utils"; diff --git a/site/src/components/ai-elements/tool/ReadFileTool.tsx b/site/src/components/ai-elements/tool/ReadFileTool.tsx index 805e17d887..9ef4ecdf27 100644 --- a/site/src/components/ai-elements/tool/ReadFileTool.tsx +++ b/site/src/components/ai-elements/tool/ReadFileTool.tsx @@ -2,13 +2,13 @@ import { useTheme } from "@emotion/react"; import { File as FileViewer } from "@pierre/diffs/react"; import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; -import { cn } from "utils/cn"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; import { DIFFS_FONT_STYLE, diff --git a/site/src/components/ai-elements/tool/ReadTemplateTool.tsx b/site/src/components/ai-elements/tool/ReadTemplateTool.tsx index 2e231aaf14..abeb09b275 100644 --- a/site/src/components/ai-elements/tool/ReadTemplateTool.tsx +++ b/site/src/components/ai-elements/tool/ReadTemplateTool.tsx @@ -1,11 +1,11 @@ import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; -import { cn } from "utils/cn"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import type { ToolStatus } from "./utils"; /** diff --git a/site/src/components/ai-elements/tool/SubagentTool.tsx b/site/src/components/ai-elements/tool/SubagentTool.tsx index 0a13528527..53f523a3c9 100644 --- a/site/src/components/ai-elements/tool/SubagentTool.tsx +++ b/site/src/components/ai-elements/tool/SubagentTool.tsx @@ -10,8 +10,8 @@ import { import type React from "react"; import { useState } from "react"; import { Link } from "react-router"; -import { cn } from "utils/cn"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; +import { cn } from "#/utils/cn"; import { Response } from "../response"; import { useDesktopPanel } from "./DesktopPanelContext"; import { InlineDesktopPreview } from "./InlineDesktopPreview"; diff --git a/site/src/components/ai-elements/tool/Tool.tsx b/site/src/components/ai-elements/tool/Tool.tsx index 82c372312a..b9b1182dd1 100644 --- a/site/src/components/ai-elements/tool/Tool.tsx +++ b/site/src/components/ai-elements/tool/Tool.tsx @@ -2,7 +2,6 @@ import { useTheme } from "@emotion/react"; import { FileDiff, File as FileViewer } from "@pierre/diffs/react"; import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import { type ComponentPropsWithRef, type FC, memo } from "react"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { @@ -10,6 +9,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ChatSummarizedTool } from "./ChatSummarizedTool"; import { ComputerTool } from "./ComputerTool"; import { CreateWorkspaceTool } from "./CreateWorkspaceTool"; diff --git a/site/src/components/ai-elements/tool/ToolCollapsible.tsx b/site/src/components/ai-elements/tool/ToolCollapsible.tsx index 3186a9bdf0..ca41330ea6 100644 --- a/site/src/components/ai-elements/tool/ToolCollapsible.tsx +++ b/site/src/components/ai-elements/tool/ToolCollapsible.tsx @@ -1,7 +1,7 @@ import { ChevronDownIcon } from "lucide-react"; import type { FC, ReactNode } from "react"; import { useState } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; interface ToolCollapsibleProps { children: ReactNode; diff --git a/site/src/components/ai-elements/tool/ToolIcon.tsx b/site/src/components/ai-elements/tool/ToolIcon.tsx index a3c5cb954c..5af37b8e97 100644 --- a/site/src/components/ai-elements/tool/ToolIcon.tsx +++ b/site/src/components/ai-elements/tool/ToolIcon.tsx @@ -10,13 +10,13 @@ import { } from "lucide-react"; import type React from "react"; import { useState } from "react"; -import { cn } from "utils/cn"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; export const ToolIcon: React.FC<{ name: string; diff --git a/site/src/components/ai-elements/tool/WebSearchSources.tsx b/site/src/components/ai-elements/tool/WebSearchSources.tsx index 672fa88edd..c6c5e39e1a 100644 --- a/site/src/components/ai-elements/tool/WebSearchSources.tsx +++ b/site/src/components/ai-elements/tool/WebSearchSources.tsx @@ -1,6 +1,6 @@ import { ExternalLinkIcon, GlobeIcon } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; interface WebSearchSourcesProps { diff --git a/site/src/components/ai-elements/tool/WriteFileTool.tsx b/site/src/components/ai-elements/tool/WriteFileTool.tsx index 4ea34d4b68..f1ba6cac92 100644 --- a/site/src/components/ai-elements/tool/WriteFileTool.tsx +++ b/site/src/components/ai-elements/tool/WriteFileTool.tsx @@ -3,13 +3,13 @@ import type { FileDiffMetadata } from "@pierre/diffs"; import { FileDiff } from "@pierre/diffs/react"; import { LoaderIcon, TriangleAlertIcon } from "lucide-react"; import type React from "react"; -import { cn } from "utils/cn"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ToolCollapsible } from "./ToolCollapsible"; import { DIFFS_FONT_STYLE, diff --git a/site/src/contexts/auth/RequireAuth.tsx b/site/src/contexts/auth/RequireAuth.tsx index bda80655bd..246c6e98be 100644 --- a/site/src/contexts/auth/RequireAuth.tsx +++ b/site/src/contexts/auth/RequireAuth.tsx @@ -1,11 +1,11 @@ import { ProxyProvider as ProductionProxyProvider } from "contexts/ProxyContext"; import { type FC, useEffect } from "react"; import { Navigate, Outlet, useLocation } from "react-router"; -import { embedRedirect } from "utils/redirect"; import { API } from "#/api/api"; import { isApiError } from "#/api/errors"; import { Loader } from "#/components/Loader/Loader"; import { DashboardProvider as ProductionDashboardProvider } from "#/modules/dashboard/DashboardProvider"; +import { embedRedirect } from "#/utils/redirect"; import { useAuthContext } from "./AuthProvider"; type RequireAuthProps = Readonly<{ diff --git a/site/src/contexts/useProxyLatency.ts b/site/src/contexts/useProxyLatency.ts index 4399edb787..a3f63f2130 100644 --- a/site/src/contexts/useProxyLatency.ts +++ b/site/src/contexts/useProxyLatency.ts @@ -1,7 +1,7 @@ import { useEffect, useReducer, useState } from "react"; -import { generateRandomString } from "utils/random"; import { API } from "#/api/api"; import type { Region } from "#/api/typesGenerated"; +import { generateRandomString } from "#/utils/random"; const proxyIntervalSeconds = 30; // seconds diff --git a/site/src/hooks/useClickableTableRow.ts b/site/src/hooks/useClickableTableRow.ts index c67f75bbc3..5f1e1d7692 100644 --- a/site/src/hooks/useClickableTableRow.ts +++ b/site/src/hooks/useClickableTableRow.ts @@ -15,7 +15,7 @@ */ import type { TableRowProps } from "@mui/material/TableRow"; import type { MouseEventHandler } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; import { type ClickableAriaRole, type UseClickableResult, diff --git a/site/src/modules/apps/AppStatusStateIcon.tsx b/site/src/modules/apps/AppStatusStateIcon.tsx index 96a9c981cb..c54a80b704 100644 --- a/site/src/modules/apps/AppStatusStateIcon.tsx +++ b/site/src/modules/apps/AppStatusStateIcon.tsx @@ -7,9 +7,9 @@ import { TriangleAlertIcon, } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; import type { WorkspaceAppStatusState } from "#/api/typesGenerated"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; type AppStatusStateIconProps = { state: WorkspaceAppStatusState; diff --git a/site/src/modules/builds/BuildAvatar/BuildAvatar.tsx b/site/src/modules/builds/BuildAvatar/BuildAvatar.tsx index 4205a90235..64a681e7c2 100644 --- a/site/src/modules/builds/BuildAvatar/BuildAvatar.tsx +++ b/site/src/modules/builds/BuildAvatar/BuildAvatar.tsx @@ -1,10 +1,10 @@ import { useTheme } from "@emotion/react"; import type { FC } from "react"; -import { getDisplayWorkspaceBuildStatus } from "utils/workspace"; import type { WorkspaceBuild } from "#/api/typesGenerated"; import { Avatar, type AvatarProps } from "#/components/Avatar/Avatar"; import { BuildIcon } from "#/components/BuildIcon/BuildIcon"; import { useClassName } from "#/hooks/useClassName"; +import { getDisplayWorkspaceBuildStatus } from "#/utils/workspace"; interface BuildAvatarProps { build: WorkspaceBuild; diff --git a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx index 0c4ffba70c..6dd3b93137 100644 --- a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx +++ b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { readableForegroundColor } from "utils/colors"; import { InlineMarkdown } from "#/components/Markdown/Markdown"; +import { readableForegroundColor } from "#/utils/colors"; interface AnnouncementBannerViewProps { message: string; diff --git a/site/src/modules/dashboard/DashboardLayout.tsx b/site/src/modules/dashboard/DashboardLayout.tsx index 08fe663d42..046decfff2 100644 --- a/site/src/modules/dashboard/DashboardLayout.tsx +++ b/site/src/modules/dashboard/DashboardLayout.tsx @@ -4,12 +4,12 @@ import { useAuthenticated } from "hooks"; import { InfoIcon } from "lucide-react"; import { type FC, type HTMLAttributes, Suspense } from "react"; import { Outlet } from "react-router"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import { Button } from "#/components/Button/Button"; import { Loader } from "#/components/Loader/Loader"; import { AnnouncementBanners } from "#/modules/dashboard/AnnouncementBanners/AnnouncementBanners"; import { LicenseBanner } from "#/modules/dashboard/LicenseBanner/LicenseBanner"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; import { DeploymentBanner } from "./DeploymentBanner/DeploymentBanner"; import { Navbar } from "./Navbar/Navbar"; import { useUpdateCheck } from "./useUpdateCheck"; diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx index 885845528b..8c6129eede 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx @@ -18,7 +18,6 @@ import { useState, } from "react"; import { Link as RouterLink } from "react-router"; -import { getDisplayWorkspaceStatus } from "utils/workspace"; import type { DeploymentStats, HealthcheckReport, @@ -37,6 +36,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { getDisplayWorkspaceStatus } from "#/utils/workspace"; interface DeploymentBannerViewProps { health?: HealthcheckReport; diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx index 9b055e1f15..fc8c2e39b5 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx @@ -1,6 +1,4 @@ import { useState } from "react"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import { LicenseManagedAgentLimitExceededWarningText, LicenseTelemetryRequiredErrorText, @@ -8,6 +6,8 @@ import { import { Expander } from "#/components/Expander/Expander"; import { Link } from "#/components/Link/Link"; import { Pill } from "#/components/Pill/Pill"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; const formatMessage = (message: string) => { // If the message ends with an alphanumeric character, add a period. diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.tsx index ac9b5ae116..9d6ea94767 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.tsx @@ -8,7 +8,6 @@ import { import { type FC, useState } from "react"; import { Link } from "react-router"; import { toast } from "sonner"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { Button } from "#/components/Button/Button"; @@ -25,6 +24,7 @@ import { DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; import { Latency } from "#/components/Latency/Latency"; +import { cn } from "#/utils/cn"; import { sortProxiesByLatency } from "./proxyUtils"; const itemStyles = { diff --git a/site/src/modules/dashboard/Navbar/NavbarView.tsx b/site/src/modules/dashboard/Navbar/NavbarView.tsx index eddca0b322..2ebae8d985 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.tsx @@ -2,8 +2,6 @@ import type { ProxyContextValue } from "contexts/ProxyContext"; import type { FC } from "react"; import { useQuery } from "react-query"; import { NavLink, useLocation } from "react-router"; -import { isDevBuild } from "utils/buildInfo"; -import { cn } from "utils/cn"; import { API } from "#/api/api"; import type * as TypesGen from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; @@ -18,6 +16,8 @@ import { import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { NotificationsInbox } from "#/modules/notifications/NotificationsInbox/NotificationsInbox"; +import { isDevBuild } from "#/utils/buildInfo"; +import { cn } from "#/utils/cn"; import { DeploymentDropdown } from "./DeploymentDropdown"; import { MobileMenu } from "./MobileMenu"; import { ProxyMenu } from "./ProxyMenu"; diff --git a/site/src/modules/management/DeploymentSidebarView.tsx b/site/src/modules/management/DeploymentSidebarView.tsx index 016f7c0b59..2577402296 100644 --- a/site/src/modules/management/DeploymentSidebarView.tsx +++ b/site/src/modules/management/DeploymentSidebarView.tsx @@ -1,6 +1,5 @@ import { ArrowUpRight } from "lucide-react"; import type { FC } from "react"; -import { isDevBuild } from "utils/buildInfo"; import type { BuildInfoResponse, Experiment } from "#/api/typesGenerated"; import { Sidebar as BaseSidebar, @@ -8,6 +7,7 @@ import { } from "#/components/Sidebar/Sidebar"; import { Stack } from "#/components/Stack/Stack"; import type { Permissions } from "#/modules/permissions"; +import { isDevBuild } from "#/utils/buildInfo"; interface DeploymentSidebarViewProps { /** Site-wide permissions. */ diff --git a/site/src/modules/notifications/NotificationsInbox/InboxButton.tsx b/site/src/modules/notifications/NotificationsInbox/InboxButton.tsx index 6f7f0f45b5..387c66160d 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxButton.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxButton.tsx @@ -1,6 +1,6 @@ import { BellIcon } from "lucide-react"; -import { cn } from "utils/cn"; import { Button, type ButtonProps } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; import { UnreadBadge } from "./UnreadBadge"; type InboxButtonProps = ButtonProps & { diff --git a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx index cef5f6e6f7..5867b7c01a 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, fn, userEvent, within } from "storybook/test"; -import { daysAgo } from "utils/time"; import { MockNotification } from "#/testHelpers/entities"; +import { daysAgo } from "#/utils/time"; import { InboxItem } from "./InboxItem"; const meta: Meta = { diff --git a/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx b/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx index 4df4013c48..1807efa410 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx @@ -2,10 +2,10 @@ import { SquareCheckBig } from "lucide-react"; import type { FC } from "react"; import Markdown from "react-markdown"; import { Link as RouterLink } from "react-router"; -import { relativeTime } from "utils/time"; import type { InboxNotification } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { Link } from "#/components/Link/Link"; +import { relativeTime } from "#/utils/time"; import { InboxAvatar } from "./InboxAvatar"; type InboxItemProps = { diff --git a/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx b/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx index 5d90d95ace..7af34a1a1e 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx @@ -1,7 +1,6 @@ import { RefreshCwIcon, SettingsIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; import type { InboxNotification } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { @@ -11,6 +10,7 @@ import { } from "#/components/Popover/Popover"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; import { InboxButton } from "./InboxButton"; import { InboxItem } from "./InboxItem"; import { UnreadBadge } from "./UnreadBadge"; diff --git a/site/src/modules/notifications/NotificationsInbox/UnreadBadge.tsx b/site/src/modules/notifications/NotificationsInbox/UnreadBadge.tsx index af6f5f1b13..8236825b47 100644 --- a/site/src/modules/notifications/NotificationsInbox/UnreadBadge.tsx +++ b/site/src/modules/notifications/NotificationsInbox/UnreadBadge.tsx @@ -1,5 +1,5 @@ import type { FC, HTMLProps } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; type UnreadBadgeProps = { count: number; diff --git a/site/src/modules/provisioners/Provisioner.tsx b/site/src/modules/provisioners/Provisioner.tsx index 0bdbf565ed..403c508ea4 100644 --- a/site/src/modules/provisioners/Provisioner.tsx +++ b/site/src/modules/provisioners/Provisioner.tsx @@ -1,7 +1,6 @@ import { useTheme } from "@emotion/react"; import { Building2Icon, UserIcon } from "lucide-react"; import type { FC } from "react"; -import { createDayString } from "utils/createDayString"; import type { HealthMessage, ProvisionerDaemon } from "#/api/typesGenerated"; import { Pill } from "#/components/Pill/Pill"; import { @@ -9,6 +8,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { createDayString } from "#/utils/createDayString"; import { ProvisionerTag } from "./ProvisionerTag"; interface ProvisionerProps { diff --git a/site/src/modules/provisioners/ProvisionerAlert.tsx b/site/src/modules/provisioners/ProvisionerAlert.tsx index 400815f1e6..27104a223d 100644 --- a/site/src/modules/provisioners/ProvisionerAlert.tsx +++ b/site/src/modules/provisioners/ProvisionerAlert.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { Alert, type AlertColor, @@ -7,6 +6,7 @@ import { AlertTitle, } from "#/components/Alert/Alert"; import { ProvisionerTag } from "#/modules/provisioners/ProvisionerTag"; +import { cn } from "#/utils/cn"; export enum AlertVariant { // Alerts are usually styled with a full rounded border and meant to use as a visually distinct element of the page. diff --git a/site/src/modules/provisioners/ProvisionerTags.tsx b/site/src/modules/provisioners/ProvisionerTags.tsx index 8a8fd774c7..07fc70b9eb 100644 --- a/site/src/modules/provisioners/ProvisionerTags.tsx +++ b/site/src/modules/provisioners/ProvisionerTags.tsx @@ -1,6 +1,6 @@ import type { FC, HTMLProps } from "react"; -import { cn } from "utils/cn"; import { Badge } from "#/components/Badge/Badge"; +import { cn } from "#/utils/cn"; export const ProvisionerTags: FC> = ({ className, diff --git a/site/src/modules/resources/AgentDevcontainerCard.tsx b/site/src/modules/resources/AgentDevcontainerCard.tsx index 08b77c5e7d..78b00a2315 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.tsx @@ -5,8 +5,6 @@ import { AppStatuses } from "pages/WorkspacePage/AppStatuses"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { cn } from "utils/cn"; -import { portForwardURL } from "utils/portForward"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { @@ -37,6 +35,8 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { cn } from "#/utils/cn"; +import { portForwardURL } from "#/utils/portForward"; import { AgentApps, organizeAgentApps } from "./AgentApps/AgentApps"; import { AgentButton } from "./AgentButton"; import { AgentDevcontainerMoreActions } from "./AgentDevcontainerMoreActions"; diff --git a/site/src/modules/resources/AgentLatency.tsx b/site/src/modules/resources/AgentLatency.tsx index c5e5a1b205..0081d83ff1 100644 --- a/site/src/modules/resources/AgentLatency.tsx +++ b/site/src/modules/resources/AgentLatency.tsx @@ -1,6 +1,4 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; -import { getLatencyColor } from "utils/latency"; import type { DERPRegion, WorkspaceAgent } from "#/api/typesGenerated"; import { HelpTooltip, @@ -9,6 +7,8 @@ import { HelpTooltipTitle, HelpTooltipTrigger, } from "#/components/HelpTooltip/HelpTooltip"; +import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; const getDisplayLatency = (agent: WorkspaceAgent) => { // Find the right latency to display diff --git a/site/src/modules/resources/AgentLogs/AgentLogs.tsx b/site/src/modules/resources/AgentLogs/AgentLogs.tsx index 0f3f76b77b..b3d36a0ffc 100644 --- a/site/src/modules/resources/AgentLogs/AgentLogs.tsx +++ b/site/src/modules/resources/AgentLogs/AgentLogs.tsx @@ -1,6 +1,5 @@ import type { JSX } from "react"; import { FixedSizeList as List } from "react-window"; -import { cn } from "utils/cn"; import type { WorkspaceAgentLogSource } from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; import type { Line } from "#/components/Logs/LogLine"; @@ -9,6 +8,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { AGENT_LOG_LINE_HEIGHT, AgentLogLine } from "./AgentLogLine"; // Fallback log used in places where we must always have a valid log source. diff --git a/site/src/modules/resources/AgentMetadata.tsx b/site/src/modules/resources/AgentMetadata.tsx index c001b66827..c753915b06 100644 --- a/site/src/modules/resources/AgentMetadata.tsx +++ b/site/src/modules/resources/AgentMetadata.tsx @@ -9,8 +9,6 @@ import { useState, } from "react"; import { toast } from "sonner"; -import { cn } from "utils/cn"; -import type { OneWayWebSocket } from "utils/OneWayWebSocket"; import { watchAgentMetadata } from "#/api/api"; import type { ServerSentEvent, @@ -23,6 +21,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import type { OneWayWebSocket } from "#/utils/OneWayWebSocket"; type ItemStatus = "stale" | "valid" | "loading"; diff --git a/site/src/modules/resources/AgentRow.tsx b/site/src/modules/resources/AgentRow.tsx index 30e1c54e09..108951ccd3 100644 --- a/site/src/modules/resources/AgentRow.tsx +++ b/site/src/modules/resources/AgentRow.tsx @@ -15,7 +15,6 @@ import { import { Link as RouterLink } from "react-router"; import AutoSizer from "react-virtualized-auto-sizer"; import type { FixedSizeList as List, ListOnScrollProps } from "react-window"; -import { cn } from "utils/cn"; import type { Template, Workspace, @@ -25,6 +24,7 @@ import type { import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button } from "#/components/Button/Button"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { cn } from "#/utils/cn"; import { AgentApps, organizeAgentApps } from "./AgentApps/AgentApps"; import { AgentDevcontainerCard } from "./AgentDevcontainerCard"; import { AgentExternal } from "./AgentExternal"; diff --git a/site/src/modules/resources/AgentVersion.tsx b/site/src/modules/resources/AgentVersion.tsx index 530132bca4..870cb6f430 100644 --- a/site/src/modules/resources/AgentVersion.tsx +++ b/site/src/modules/resources/AgentVersion.tsx @@ -1,9 +1,9 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { agentVersionStatus, getDisplayVersionStatus } from "utils/workspace"; import { buildInfo } from "#/api/queries/buildInfo"; import type { WorkspaceAgent } from "#/api/typesGenerated"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; +import { agentVersionStatus, getDisplayVersionStatus } from "#/utils/workspace"; import { AgentOutdatedTooltip } from "./AgentOutdatedTooltip"; interface AgentVersionProps { diff --git a/site/src/modules/resources/AppLink/AppLink.tsx b/site/src/modules/resources/AppLink/AppLink.tsx index d587dd5c1c..0ab2376ace 100644 --- a/site/src/modules/resources/AppLink/AppLink.tsx +++ b/site/src/modules/resources/AppLink/AppLink.tsx @@ -8,7 +8,6 @@ import { UsersIcon, } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; -import { docs } from "utils/docs"; import type * as TypesGen from "#/api/typesGenerated"; import { DropdownMenuItem } from "#/components/DropdownMenu/DropdownMenu"; import { Link } from "#/components/Link/Link"; @@ -21,6 +20,7 @@ import { } from "#/components/Tooltip/Tooltip"; import { isExternalApp, needsSessionToken } from "#/modules/apps/apps"; import { useAppLink } from "#/modules/apps/useAppLink"; +import { docs } from "#/utils/docs"; import { AgentButton } from "../AgentButton"; import { BaseIcon } from "./BaseIcon"; diff --git a/site/src/modules/resources/PortForwardButton.tsx b/site/src/modules/resources/PortForwardButton.tsx index d7a61d27b4..e6423a6d72 100644 --- a/site/src/modules/resources/PortForwardButton.tsx +++ b/site/src/modules/resources/PortForwardButton.tsx @@ -17,13 +17,6 @@ import { } from "lucide-react"; import { type FC, useState } from "react"; import { useMutation, useQuery } from "react-query"; -import { docs } from "utils/docs"; -import { getFormHelpers } from "utils/formUtils"; -import { - getWorkspaceListeningPortsProtocol, - portForwardURL, - saveWorkspaceListeningPortsProtocol, -} from "utils/portForward"; import * as Yup from "yup"; import { API } from "#/api/api"; import { @@ -60,6 +53,13 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { docs } from "#/utils/docs"; +import { getFormHelpers } from "#/utils/formUtils"; +import { + getWorkspaceListeningPortsProtocol, + portForwardURL, + saveWorkspaceListeningPortsProtocol, +} from "#/utils/portForward"; interface PortForwardButtonProps { host: string; diff --git a/site/src/modules/resources/ResourceAvatar.tsx b/site/src/modules/resources/ResourceAvatar.tsx index 167707b8c6..8a7794ecc7 100644 --- a/site/src/modules/resources/ResourceAvatar.tsx +++ b/site/src/modules/resources/ResourceAvatar.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; -import { getResourceIconPath } from "utils/workspace"; import type { WorkspaceResource } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; +import { getResourceIconPath } from "#/utils/workspace"; type ResourceAvatarProps = { resource: WorkspaceResource }; diff --git a/site/src/modules/resources/SSHButton/SSHButton.tsx b/site/src/modules/resources/SSHButton/SSHButton.tsx index d0e6241340..d4e53e7110 100644 --- a/site/src/modules/resources/SSHButton/SSHButton.tsx +++ b/site/src/modules/resources/SSHButton/SSHButton.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { docs } from "utils/docs"; import { deploymentSSHConfig } from "#/api/queries/deployment"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Button } from "#/components/Button/Button"; @@ -16,6 +15,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { Stack } from "#/components/Stack/Stack"; +import { docs } from "#/utils/docs"; interface AgentSSHButtonProps { workspaceName: string; diff --git a/site/src/modules/resources/WildcardHostnameWarning.tsx b/site/src/modules/resources/WildcardHostnameWarning.tsx index 5081aaf710..99546e730c 100644 --- a/site/src/modules/resources/WildcardHostnameWarning.tsx +++ b/site/src/modules/resources/WildcardHostnameWarning.tsx @@ -1,10 +1,10 @@ import { useProxy } from "contexts/ProxyContext"; import type { FC } from "react"; -import { docs } from "utils/docs"; import type { WorkspaceResource } from "#/api/typesGenerated"; import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; import { Link } from "#/components/Link/Link"; import { useAuthenticated } from "#/hooks/useAuthenticated"; +import { docs } from "#/utils/docs"; interface WildcardHostnameWarningProps { // If resources are provided, show template-focused warning diff --git a/site/src/modules/resources/useAgentContainers.jest.tsx b/site/src/modules/resources/useAgentContainers.jest.tsx index 3e9c7f610d..a96066bacc 100644 --- a/site/src/modules/resources/useAgentContainers.jest.tsx +++ b/site/src/modules/resources/useAgentContainers.jest.tsx @@ -4,7 +4,6 @@ import type { FC, PropsWithChildren } from "react"; import { act } from "react"; import { QueryClientProvider } from "react-query"; import { toast } from "sonner"; -import type { OneWayWebSocket } from "utils/OneWayWebSocket"; import * as API from "#/api/api"; import type { WorkspaceAgentListContainersResponse } from "#/api/typesGenerated"; import { @@ -13,6 +12,7 @@ import { } from "#/testHelpers/entities"; import { createTestQueryClient } from "#/testHelpers/renderHelpers"; import { server } from "#/testHelpers/server"; +import type { OneWayWebSocket } from "#/utils/OneWayWebSocket"; import { useAgentContainers } from "./useAgentContainers"; const createWrapper = (): FC => { diff --git a/site/src/modules/resources/useAgentLogs.jest.ts b/site/src/modules/resources/useAgentLogs.jest.ts index f2f1c51b46..3a3a2f0ba2 100644 --- a/site/src/modules/resources/useAgentLogs.jest.ts +++ b/site/src/modules/resources/useAgentLogs.jest.ts @@ -1,7 +1,6 @@ import { renderHook, waitFor } from "@testing-library/react"; import { act } from "react"; import { toast } from "sonner"; -import { OneWayWebSocket } from "utils/OneWayWebSocket"; import * as apiModule from "#/api/api"; import type { WorkspaceAgentLog } from "#/api/typesGenerated"; import { MockWorkspaceAgent } from "#/testHelpers/entities"; @@ -9,6 +8,7 @@ import { createMockWebSocket, type MockWebSocketServer, } from "#/testHelpers/websockets"; +import { OneWayWebSocket } from "#/utils/OneWayWebSocket"; import { useAgentLogs } from "./useAgentLogs"; const millisecondsInOneMinute = 60_000; diff --git a/site/src/modules/tasks/TaskPrompt/PromptSelectTrigger.tsx b/site/src/modules/tasks/TaskPrompt/PromptSelectTrigger.tsx index fa4c89723e..deac0b406f 100644 --- a/site/src/modules/tasks/TaskPrompt/PromptSelectTrigger.tsx +++ b/site/src/modules/tasks/TaskPrompt/PromptSelectTrigger.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { SelectTrigger, type SelectTriggerProps, @@ -10,6 +9,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; type PromptSelectTriggerProps = SelectTriggerProps & { tooltip: string; diff --git a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx index 60c1bc0333..8468f75581 100644 --- a/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx +++ b/site/src/modules/tasks/TaskPrompt/TaskPrompt.tsx @@ -6,8 +6,6 @@ import TextareaAutosize, { type TextareaAutosizeProps, } from "react-textarea-autosize"; import { toast } from "sonner"; -import { docs } from "utils/docs"; -import { getOSKey } from "utils/platform"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { templateVersionPresets } from "#/api/queries/templates"; @@ -38,6 +36,8 @@ import { } from "#/components/Tooltip/Tooltip"; import { useAuthenticated } from "#/hooks/useAuthenticated"; import { useExternalAuth } from "#/hooks/useExternalAuth"; +import { docs } from "#/utils/docs"; +import { getOSKey } from "#/utils/platform"; import { PromptSelectTrigger } from "./PromptSelectTrigger"; import { TemplateVersionSelect } from "./TemplateVersionSelect"; diff --git a/site/src/modules/tasks/TaskPrompt/TemplateVersionSelect.stories.tsx b/site/src/modules/tasks/TaskPrompt/TemplateVersionSelect.stories.tsx index 35aca658de..3df8198dc6 100644 --- a/site/src/modules/tasks/TaskPrompt/TemplateVersionSelect.stories.tsx +++ b/site/src/modules/tasks/TaskPrompt/TemplateVersionSelect.stories.tsx @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; import { spyOn, userEvent, within } from "storybook/test"; -import { daysAgo } from "utils/time"; import { API } from "#/api/api"; import { MockTemplate, MockTemplateVersion } from "#/testHelpers/entities"; +import { daysAgo } from "#/utils/time"; import { TemplateVersionSelect } from "./TemplateVersionSelect"; const meta: Meta = { diff --git a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx index f37c983ec1..96df66f009 100644 --- a/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx +++ b/site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx @@ -11,7 +11,6 @@ import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { Link as RouterLink, useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { cn } from "utils/cn"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { pauseTask, resumeTask } from "#/api/queries/tasks"; @@ -37,6 +36,7 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { useSearchParamsKey } from "#/hooks/useSearchParamsKey"; +import { cn } from "#/utils/cn"; import { TaskDeleteDialog } from "../TaskDeleteDialog/TaskDeleteDialog"; import { taskStatusToStatusIndicatorVariant } from "../TaskStatus/TaskStatus"; import { canPauseTask, canResumeTask, isPauseDisabled } from "../taskActions"; diff --git a/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx b/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx index 08139fdaf2..98d088da0a 100644 --- a/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx +++ b/site/src/modules/tasks/TasksSidebar/UserCombobox.tsx @@ -2,7 +2,6 @@ import { useAuthenticated } from "hooks"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { cn } from "utils/cn"; import { users } from "#/api/queries/users"; import type { User } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -21,6 +20,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { useDebouncedValue } from "#/hooks/debounce"; +import { cn } from "#/utils/cn"; type UserOption = { label: string; diff --git a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx index bc01f89e75..ce210ab3a4 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx @@ -1,7 +1,7 @@ import { useTheme } from "@emotion/react"; import type { Meta, StoryObj } from "@storybook/react-vite"; -import type { FileTree } from "utils/filetree"; import { chromatic } from "#/testHelpers/chromatic"; +import type { FileTree } from "#/utils/filetree"; import { TemplateFileTree } from "./TemplateFileTree"; const fileTree: FileTree = { diff --git a/site/src/modules/templates/TemplateFiles/TemplateFileTree.tsx b/site/src/modules/templates/TemplateFiles/TemplateFileTree.tsx index ba6692bbf0..25a8f36584 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFileTree.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFileTree.tsx @@ -4,7 +4,7 @@ import MenuItem from "@mui/material/MenuItem"; import { SimpleTreeView, TreeItem } from "@mui/x-tree-view"; import { ChevronDownIcon, ChevronRightIcon } from "lucide-react"; import { type CSSProperties, type FC, type JSX, useState } from "react"; -import type { FileTree } from "utils/filetree"; +import type { FileTree } from "#/utils/filetree"; import { getTemplateFileIcon } from "./TemplateFileIcon"; const isFolder = (content?: FileTree | string): content is FileTree => @@ -100,52 +100,52 @@ export const TemplateFileTree: FC = ({ ) } css={(theme) => css` - overflow: hidden; - user-select: none; + overflow: hidden; + user-select: none; - & > .MuiTreeItem-content { + & > .MuiTreeItem-content { border-radius: 0; - padding: 2px 16px; - color: ${ + padding: 2px 16px; + color: ${ isHiddenFile ? theme.palette.text.disabled : theme.palette.text.secondary }; - height: 32px; + height: 32px; - & svg { - width: 12px; - height: 12px; - color: currentColor; - } + & svg { + width: 12px; + height: 12px; + color: currentColor; + } - & > .MuiTreeItem-label { - margin-left: 4px; - font-size: 13px; - color: inherit; - white-space: nowrap; - } + & > .MuiTreeItem-label { + margin-left: 4px; + font-size: 13px; + color: inherit; + white-space: nowrap; + } - &.Mui-selected { - color: ${theme.roles.active.text}; - background: ${theme.roles.active.background}; - } + &.Mui-selected { + color: ${theme.roles.active.text}; + background: ${theme.roles.active.background}; + } - &.Mui-focused { - box-shadow: inset 0 0 0 1px ${theme.palette.primary.main}; - } - } + &.Mui-focused { + box-shadow: inset 0 0 0 1px ${theme.palette.primary.main}; + } + } - & .MuiTreeItem-group { - margin-left: 0; - position: relative; + & .MuiTreeItem-group { + margin-left: 0; + position: relative; - // We need to find a better way to recursive padding here - & .MuiTreeItem-content { - padding-left: calc(8px + (var(--level) + 1) * 8px); - } - } - `} + // We need to find a better way to recursive padding here + & .MuiTreeItem-content { + padding-left: calc(8px + (var(--level) + 1) * 8px); + } + } + `} onClick={() => { onSelect(currentPath); }} diff --git a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx index 1a70b02a60..fd59e16b18 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx @@ -2,11 +2,11 @@ import set from "lodash/set"; import { EditIcon } from "lucide-react"; import { type FC, useCallback, useMemo } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; -import type { FileTree } from "utils/filetree"; -import type { TemplateVersionFiles } from "utils/templateVersion"; import { SyntaxHighlighter } from "#/components/SyntaxHighlighter/SyntaxHighlighter"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import { cn } from "#/utils/cn"; +import type { FileTree } from "#/utils/filetree"; +import type { TemplateVersionFiles } from "#/utils/templateVersion"; import { getTemplateFileIcon } from "./TemplateFileIcon"; import { TemplateFileTree } from "./TemplateFileTree"; diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx index af7cc47a0c..c2c0a97bb5 100644 --- a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx +++ b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { Alert } from "#/components/Alert/Alert"; import { Link } from "#/components/Link/Link"; +import { docs } from "#/utils/docs"; interface ClassicParameterFlowDeprecationWarningProps { templateSettingsLink: string; diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx index 939ba6fc50..c31587cf4c 100644 --- a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx +++ b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.tsx @@ -9,8 +9,6 @@ import { TriangleAlert, } from "lucide-react"; import { type FC, useId, useRef, useState } from "react"; -import { cn } from "utils/cn"; -import type { AutofillBuildParameter } from "utils/richParameters"; import * as Yup from "yup"; import type { NullHCLString, @@ -48,6 +46,8 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; interface DynamicParameterProps { parameter: PreviewParameter; diff --git a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx index ae6bd5a119..6160c2b719 100644 --- a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.tsx @@ -1,13 +1,6 @@ import { type Interpolation, type Theme, useTheme } from "@emotion/react"; import Skeleton from "@mui/material/Skeleton"; import { InfoIcon } from "lucide-react"; -import { createDayString } from "utils/createDayString"; -import { - buildReasonLabels, - getDisplayWorkspaceBuildInitiatedBy, - getDisplayWorkspaceBuildStatus, - systemBuildReasons, -} from "utils/workspace"; import type { WorkspaceBuild } from "#/api/typesGenerated"; import { BuildIcon } from "#/components/BuildIcon/BuildIcon"; import { @@ -15,6 +8,13 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { createDayString } from "#/utils/createDayString"; +import { + buildReasonLabels, + getDisplayWorkspaceBuildInitiatedBy, + getDisplayWorkspaceBuildStatus, + systemBuildReasons, +} from "#/utils/workspace"; export const WorkspaceBuildData = ({ build }: { build: WorkspaceBuild }) => { const theme = useTheme(); diff --git a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx index 58e390b420..097d3c0131 100644 --- a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx @@ -7,11 +7,11 @@ import { useLayoutEffect, useRef, } from "react"; -import { cn } from "utils/cn"; import type { ProvisionerJobLog, WorkspaceBuild } from "#/api/typesGenerated"; import type { Line } from "#/components/Logs/LogLine"; import { DEFAULT_LOG_LINE_SIDE_PADDING, Logs } from "#/components/Logs/Logs"; import { BODY_FONT_FAMILY } from "#/theme/constants"; +import { cn } from "#/utils/cn"; const Language = { seconds: "seconds", diff --git a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.tsx b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.tsx index 081c056c67..91e41ef6e9 100644 --- a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.tsx +++ b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.tsx @@ -1,9 +1,4 @@ import type { FC } from "react"; -import { - DATE_FORMAT, - formatDateTime, - relativeTimeWithoutSuffix, -} from "utils/time"; import type { Workspace } from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; import { @@ -11,6 +6,11 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { + DATE_FORMAT, + formatDateTime, + relativeTimeWithoutSuffix, +} from "#/utils/time"; type WorkspaceDormantBadgeProps = { workspace: Workspace; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.tsx index 8a208c96cf..97921ac819 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.tsx @@ -5,7 +5,6 @@ import TextField from "@mui/material/TextField"; import { InfoIcon } from "lucide-react"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; -import { createDayString } from "utils/createDayString"; import { templateVersions } from "#/api/queries/templates"; import type { TemplateVersion, Workspace } from "#/api/typesGenerated"; import { Alert, AlertTitle } from "#/components/Alert/Alert"; @@ -18,6 +17,7 @@ import { Loader } from "#/components/Loader/Loader"; import { Pill } from "#/components/Pill/Pill"; import { Stack } from "#/components/Stack/Stack"; import { TemplateUpdateMessage } from "#/modules/templates/TemplateUpdateMessage"; +import { createDayString } from "#/utils/createDayString"; type ChangeWorkspaceVersionDialogProps = DialogProps & { workspace: Workspace; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx index 64f9cee8da..a8794854b1 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialog.tsx @@ -7,11 +7,6 @@ import DialogContentText from "@mui/material/DialogContentText"; import DialogTitle from "@mui/material/DialogTitle"; import { useFormik } from "formik"; import type { FC } from "react"; -import { getFormHelpers } from "utils/formUtils"; -import { - getInitialRichParameterValues, - useValidationSchemaForRichParameters, -} from "utils/richParameters"; import * as Yup from "yup"; import type { TemplateVersionParameter, @@ -21,6 +16,11 @@ import { Button } from "#/components/Button/Button"; import type { DialogProps } from "#/components/Dialogs/Dialog"; import { FormFields, VerticalForm } from "#/components/Form/Form"; import { RichParameterInput } from "#/components/RichParameterInput/RichParameterInput"; +import { getFormHelpers } from "#/utils/formUtils"; +import { + getInitialRichParameterValues, + useValidationSchemaForRichParameters, +} from "#/utils/richParameters"; type UpdateBuildParametersDialogProps = DialogProps & { onClose: () => void; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx index e8fbc9d6ab..000d738b46 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx @@ -1,10 +1,10 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { daysAgo } from "utils/time"; import { MockFailedWorkspace, MockTaskWorkspace, MockWorkspace, } from "#/testHelpers/entities"; +import { daysAgo } from "#/utils/time"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx index 0cca493f58..3bf4312e7a 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.tsx @@ -4,12 +4,12 @@ import Link from "@mui/material/Link"; import TextField from "@mui/material/TextField"; import dayjs from "dayjs"; import { type FC, type FormEvent, useId, useState } from "react"; -import { docs } from "utils/docs"; import type { CreateWorkspaceBuildRequest, Workspace, } from "#/api/typesGenerated"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; +import { docs } from "#/utils/docs"; interface WorkspaceDeleteDialogProps { workspace: Workspace; diff --git a/site/src/modules/workspaces/WorkspaceStatus/WorkspaceStatus.tsx b/site/src/modules/workspaces/WorkspaceStatus/WorkspaceStatus.tsx index 6e551acfe2..0e841725ac 100644 --- a/site/src/modules/workspaces/WorkspaceStatus/WorkspaceStatus.tsx +++ b/site/src/modules/workspaces/WorkspaceStatus/WorkspaceStatus.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { lastUsedMessage } from "utils/workspace"; import type { Workspace } from "#/api/typesGenerated"; +import { lastUsedMessage } from "#/utils/workspace"; import { WorkspaceDormantBadge } from "../WorkspaceDormantBadge/WorkspaceDormantBadge"; import { WorkspaceStatusIndicator } from "../WorkspaceStatusIndicator/WorkspaceStatusIndicator"; diff --git a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx index dbb933cdba..0885253833 100644 --- a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx +++ b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx @@ -1,9 +1,5 @@ import type React from "react"; import type { FC } from "react"; -import { - type DisplayWorkspaceStatusType, - getDisplayWorkspaceStatus, -} from "utils/workspace"; import type { Workspace } from "#/api/typesGenerated"; import { StatusIndicator, @@ -16,6 +12,10 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { getAgentHealthIssue } from "#/modules/workspaces/health"; +import { + type DisplayWorkspaceStatusType, + getDisplayWorkspaceStatus, +} from "#/utils/workspace"; const variantByStatusType: Record< DisplayWorkspaceStatusType, diff --git a/site/src/pages/AIBridgePage/AIBridgeHelpTooltip.tsx b/site/src/pages/AIBridgePage/AIBridgeHelpTooltip.tsx index e25cc03c8d..ba768b9cb9 100644 --- a/site/src/pages/AIBridgePage/AIBridgeHelpTooltip.tsx +++ b/site/src/pages/AIBridgePage/AIBridgeHelpTooltip.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { docs } from "#/utils/docs"; export const AIBridgeHelpTooltip: FC = () => { return ( diff --git a/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx b/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx index f74f42b7b5..b6551dbea0 100644 --- a/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx +++ b/site/src/pages/AIBridgePage/AIBridgeSessionsLayout.tsx @@ -7,7 +7,7 @@ import { } from "components/PageHeader/PageHeader"; import type { FC, PropsWithChildren } from "react"; import { Outlet } from "react-router"; -import { docs } from "utils/docs"; +import { docs } from "#/utils/docs"; const AIBridgeSessionsLayout: FC = () => { return ( diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx index e98767e7d6..8ecb443991 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPage.tsx @@ -3,11 +3,11 @@ import { useUserFilterMenu } from "components/Filter/UserFilter"; import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useNavigate, useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { paginatedSessions } from "#/api/queries/aiBridge"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { useProviderFilterMenu } from "../RequestLogsPage/RequestLogsFilter/ProviderFilter"; import { ListSessionsPageView } from "./ListSessionsPageView"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx index 95630c6e88..c3df60cd1f 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsPageView.tsx @@ -22,9 +22,9 @@ import { } from "components/Tooltip/Tooltip"; import { InfoIcon } from "lucide-react"; import type { ComponentProps, FC, PropsWithChildren } from "react"; -import { docs } from "utils/docs"; -import { DATE_FORMAT, formatDateTime } from "utils/time"; import type { AIBridgeSession } from "#/api/typesGenerated"; +import { docs } from "#/utils/docs"; +import { DATE_FORMAT, formatDateTime } from "#/utils/time"; import { ListSessionsFilter } from "./ListSessionsFilter"; import { ListSessionsRow } from "./ListSessionsRow"; diff --git a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx index eecaa707d0..35d613dba4 100644 --- a/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx +++ b/site/src/pages/AIBridgePage/ListSessionsPage/ListSessionsRow.tsx @@ -11,8 +11,8 @@ import { ChevronRightIcon } from "lucide-react"; import { AIBridgeClientIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; import { AIBridgeProviderIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; import type { FC } from "react"; -import { DATE_FORMAT, formatDateTime } from "utils/time"; import type { AIBridgeSession } from "#/api/typesGenerated"; +import { DATE_FORMAT, formatDateTime } from "#/utils/time"; import { TokenBadges } from "../TokenBadges"; import { getProviderDisplayName, getProviderIconName } from "../utils"; diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx index 4becbf3563..e29d54f3e9 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPage.tsx @@ -1,13 +1,13 @@ import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { paginatedInterceptions } from "#/api/queries/aiBridge"; import { useFilter } from "#/components/Filter/Filter"; import { useUserFilterMenu } from "#/components/Filter/UserFilter"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { useModelFilterMenu } from "./RequestLogsFilter/ModelFilter"; import { useProviderFilterMenu } from "./RequestLogsFilter/ProviderFilter"; import { RequestLogsPageView } from "./RequestLogsPageView"; diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPageView.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPageView.tsx index 45527112c1..8ac7cce7e1 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPageView.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsPageView.tsx @@ -1,5 +1,4 @@ import type { ComponentProps, FC } from "react"; -import { docs } from "utils/docs"; import type { AIBridgeInterception } from "#/api/typesGenerated"; import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; import { Link } from "#/components/Link/Link"; @@ -17,6 +16,7 @@ import { } from "#/components/Table/Table"; import { TableEmpty } from "#/components/TableEmpty/TableEmpty"; import { TableLoader } from "#/components/TableLoader/TableLoader"; +import { docs } from "#/utils/docs"; import { RequestLogsFilter } from "./RequestLogsFilter/RequestLogsFilter"; import { RequestLogsRow } from "./RequestLogsRow/RequestLogsRow"; diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsRow/RequestLogsRow.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsRow/RequestLogsRow.tsx index 32391c99a6..ca8b7199b5 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsRow/RequestLogsRow.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/RequestLogsRow/RequestLogsRow.tsx @@ -1,7 +1,5 @@ import { ArrowDownIcon, ArrowUpIcon, ChevronRightIcon } from "lucide-react"; import { type FC, Fragment, useState } from "react"; -import { cn } from "utils/cn"; -import { formatDate, humanDuration } from "utils/time"; import type { AIBridgeInterception } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { Badge } from "#/components/Badge/Badge"; @@ -12,6 +10,8 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { formatDate, humanDuration } from "#/utils/time"; import { AIBridgeClientIcon } from "../icons/AIBridgeClientIcon"; import { AIBridgeModelIcon } from "../icons/AIBridgeModelIcon"; diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon.tsx index 836007009a..11a09fcce0 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon.tsx @@ -1,7 +1,7 @@ import { CircleQuestionMarkIcon } from "lucide-react"; -import { cn } from "utils/cn"; import type { AIBridgeInterception } from "#/api/typesGenerated"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; +import { cn } from "#/utils/cn"; export const AIBridgeClientIcon = ({ client, diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon.tsx index 4639b297a5..ea17396309 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon.tsx @@ -1,6 +1,6 @@ import { CircleQuestionMarkIcon } from "lucide-react"; -import { cn } from "utils/cn"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; +import { cn } from "#/utils/cn"; // Infers the model family from a model name string. // See official model naming docs: diff --git a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon.tsx b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon.tsx index dc929538bd..7af1b4593d 100644 --- a/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon.tsx +++ b/site/src/pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon.tsx @@ -1,7 +1,7 @@ import { CircleQuestionMarkIcon } from "lucide-react"; -import { cn } from "utils/cn"; import type { AIBridgeInterception } from "#/api/typesGenerated"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; +import { cn } from "#/utils/cn"; export const AIBridgeProviderIcon = ({ provider, diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx index 7c11ae5b2b..6180847604 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionSummaryTable.tsx @@ -2,8 +2,8 @@ import { Avatar } from "components/Avatar/Avatar"; import { Badge } from "components/Badge/Badge"; import { AIBridgeClientIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeClientIcon"; import { AIBridgeProviderIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeProviderIcon"; -import { formatDateTime } from "utils/time"; import type { MinimalUser } from "#/api/typesGenerated"; +import { formatDateTime } from "#/utils/time"; import { TokenBadges } from "../TokenBadges"; import { getProviderDisplayName, getProviderIconName } from "../utils"; diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/AgenticLoopTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/AgenticLoopTable.tsx index 7f5d1839b4..56f896ec41 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/AgenticLoopTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/AgenticLoopTable.tsx @@ -1,5 +1,5 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; import { TokenBadges } from "../../TokenBadges"; import { roundDurationDisplay } from "../../utils"; diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx index 5c05f0bbfb..620a256dbd 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/PromptTable.tsx @@ -7,8 +7,8 @@ import { } from "components/Tooltip/Tooltip"; import { AIBridgeModelIcon } from "pages/AIBridgePage/RequestLogsPage/icons/AIBridgeModelIcon"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { formatDate } from "utils/time"; +import { cn } from "#/utils/cn"; +import { formatDate } from "#/utils/time"; import { TokenBadges } from "../../TokenBadges"; interface PromptTableProps { diff --git a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx index 21430b23ec..c52b37ce56 100644 --- a/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx +++ b/site/src/pages/AIBridgePage/SessionThreadsPage/SessionTimeline/ToolCallTable.tsx @@ -1,7 +1,7 @@ import { CopyButton } from "components/CopyButton/CopyButton"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { formatDate } from "utils/time"; +import { cn } from "#/utils/cn"; +import { formatDate } from "#/utils/time"; import { TokenBadges } from "../../TokenBadges"; interface ToolCallTableProps { diff --git a/site/src/pages/AgentsPage/AgentDetail.tsx b/site/src/pages/AgentsPage/AgentDetail.tsx index 8d7e3d408b..2d64c73cfd 100644 --- a/site/src/pages/AgentsPage/AgentDetail.tsx +++ b/site/src/pages/AgentsPage/AgentDetail.tsx @@ -9,9 +9,6 @@ import { import { useOutletContext, useParams } from "react-router"; import { toast } from "sonner"; import type { UrlTransform } from "streamdown"; -import { isMobileViewport } from "utils/mobile"; -import { pageTitle } from "utils/page"; -import { rewriteLocalhostURL } from "utils/portForward"; import { API, watchWorkspace } from "#/api/api"; import { isApiError } from "#/api/errors"; import { @@ -37,6 +34,9 @@ import { getVSCodeHref, openAppInNewWindow, } from "#/modules/apps/apps"; +import { isMobileViewport } from "#/utils/mobile"; +import { pageTitle } from "#/utils/page"; +import { rewriteLocalhostURL } from "#/utils/portForward"; import type { AgentsOutletContext } from "./AgentsPage"; import type { ChatMessageInputRef } from "./components/AgentChatInput"; import { diff --git a/site/src/pages/AgentsPage/AgentSettingsPageView.tsx b/site/src/pages/AgentsPage/AgentSettingsPageView.tsx index 1b0ea61661..cbfba8d2b2 100644 --- a/site/src/pages/AgentsPage/AgentSettingsPageView.tsx +++ b/site/src/pages/AgentsPage/AgentSettingsPageView.tsx @@ -9,10 +9,6 @@ import { } from "react-query"; import { useSearchParams } from "react-router"; import TextareaAutosize from "react-textarea-autosize"; -import { formatTokenCount } from "utils/analytics"; -import { cn } from "utils/cn"; -import { formatCostMicros } from "utils/currency"; -import { countInvisibleCharacters } from "utils/invisibleUnicode"; import { getErrorMessage } from "#/api/errors"; import { chatCostSummary, @@ -61,6 +57,10 @@ import { } from "#/components/Tooltip/Tooltip"; import { useDebouncedValue } from "#/hooks/debounce"; import { useClickableTableRow } from "#/hooks/useClickableTableRow"; +import { formatTokenCount } from "#/utils/analytics"; +import { cn } from "#/utils/cn"; +import { formatCostMicros } from "#/utils/currency"; +import { countInvisibleCharacters } from "#/utils/invisibleUnicode"; import { ChatCostSummaryView } from "./components/ChatCostSummaryView"; import { ChatModelAdminPanel } from "./components/ChatModelAdminPanel/ChatModelAdminPanel"; import { diff --git a/site/src/pages/AgentsPage/AgentsPage.tsx b/site/src/pages/AgentsPage/AgentsPage.tsx index b27c9d203f..bcd47ce600 100644 --- a/site/src/pages/AgentsPage/AgentsPage.tsx +++ b/site/src/pages/AgentsPage/AgentsPage.tsx @@ -8,7 +8,6 @@ import { } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { createReconnectingWebSocket } from "utils/reconnectingWebSocket"; import { API, watchChats } from "#/api/api"; import { getErrorMessage } from "#/api/errors"; import { @@ -32,6 +31,7 @@ import { workspaceById } from "#/api/queries/workspaces"; import type * as TypesGen from "#/api/typesGenerated"; import { DeleteDialog } from "#/components/Dialogs/DeleteDialog/DeleteDialog"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { createReconnectingWebSocket } from "#/utils/reconnectingWebSocket"; import { AgentsPageView } from "./AgentsPageView"; import { emptyInputStorageKey } from "./components/AgentCreateForm"; import { maybePlayChime } from "./components/AgentDetail/useAgentChime"; diff --git a/site/src/pages/AgentsPage/AgentsPageView.tsx b/site/src/pages/AgentsPage/AgentsPageView.tsx index 5e9dc87cd8..f598f4bcbc 100644 --- a/site/src/pages/AgentsPage/AgentsPageView.tsx +++ b/site/src/pages/AgentsPage/AgentsPageView.tsx @@ -1,9 +1,9 @@ import { type FC, type RefObject, useRef } from "react"; import { Outlet, useLocation } from "react-router"; -import { cn } from "utils/cn"; -import { pageTitle } from "utils/page"; import type * as TypesGen from "#/api/typesGenerated"; import type { ModelSelectorOption } from "#/components/ai-elements"; +import { cn } from "#/utils/cn"; +import { pageTitle } from "#/utils/page"; import { AgentsSidebar, sidebarViewFromPath, diff --git a/site/src/pages/AgentsPage/components/AgentCreateForm.tsx b/site/src/pages/AgentsPage/components/AgentCreateForm.tsx index a641bd9662..4dce65bddb 100644 --- a/site/src/pages/AgentsPage/components/AgentCreateForm.tsx +++ b/site/src/pages/AgentsPage/components/AgentCreateForm.tsx @@ -2,7 +2,6 @@ import { type FC, useEffect, useRef, useState } from "react"; import { useQuery } from "react-query"; import { Link } from "react-router"; import { toast } from "sonner"; -import { docs } from "utils/docs"; import { isApiError } from "#/api/errors"; import { workspaces } from "#/api/queries/workspaces"; import type * as TypesGen from "#/api/typesGenerated"; @@ -11,6 +10,7 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import type { ModelSelectorOption } from "#/components/ai-elements"; import { Button } from "#/components/Button/Button"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { docs } from "#/utils/docs"; import { useFileAttachments } from "../hooks/useFileAttachments"; import { getModelSelectorPlaceholder, diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx index 4e2337d580..dda57cba27 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.test.tsx @@ -32,9 +32,9 @@ const readInfiniteChats = ( import type { FC, PropsWithChildren } from "react"; import { QueryClient, QueryClientProvider } from "react-query"; -import type { OneWayMessageEvent } from "utils/OneWayWebSocket"; import { afterEach, describe, expect, it, vi } from "vitest"; import type * as TypesGen from "#/api/typesGenerated"; +import type { OneWayMessageEvent } from "#/utils/OneWayWebSocket"; import { selectChatStatus, selectOrderedMessageIDs, diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts index 0dfbe31316..74c8df5485 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts +++ b/site/src/pages/AgentsPage/components/AgentDetail/ChatContext.ts @@ -1,11 +1,11 @@ import { asNumber, asString } from "components/ai-elements/runtimeTypeUtils"; import { useEffect, useRef, useState, useSyncExternalStore } from "react"; import { type InfiniteData, useQueryClient } from "react-query"; -import type { OneWayMessageEvent } from "utils/OneWayWebSocket"; -import { createReconnectingWebSocket } from "utils/reconnectingWebSocket"; import { watchChat } from "#/api/api"; import { chatMessagesKey, updateInfiniteChatsCache } from "#/api/queries/chats"; import type * as TypesGen from "#/api/typesGenerated"; +import type { OneWayMessageEvent } from "#/utils/OneWayWebSocket"; +import { createReconnectingWebSocket } from "#/utils/reconnectingWebSocket"; import { type ChatDetailError, chatDetailErrorsEqual, diff --git a/site/src/pages/AgentsPage/components/AgentDetail/ConversationTimeline.tsx b/site/src/pages/AgentsPage/components/AgentDetail/ConversationTimeline.tsx index 11ebdab030..7db618dc4c 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/ConversationTimeline.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/ConversationTimeline.tsx @@ -9,7 +9,6 @@ import { useState, } from "react"; import type { UrlTransform } from "streamdown"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import { ConversationItem, @@ -27,6 +26,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { decodeInlineTextAttachment, fetchTextAttachmentContent, diff --git a/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx b/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx index 43c896b050..4f55f59d98 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetail/TopBar.tsx @@ -16,7 +16,6 @@ import { import type { FC } from "react"; import { Link } from "react-router"; import { toast } from "sonner"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import type { ChatDiffStatus } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -27,6 +26,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; +import { cn } from "#/utils/cn"; import { parsePullRequestUrl } from "../../utils/pullRequest"; import { useEmbedContext } from "../EmbedContext"; import { PrStateIcon } from "../GitPanel/GitPanel"; diff --git a/site/src/pages/AgentsPage/components/AgentDetail/types.ts b/site/src/pages/AgentsPage/components/AgentDetail/types.ts index c3c89af9bb..57a1510670 100644 --- a/site/src/pages/AgentsPage/components/AgentDetail/types.ts +++ b/site/src/pages/AgentsPage/components/AgentDetail/types.ts @@ -1,5 +1,5 @@ -import type { ReconnectSchedule } from "utils/reconnectingWebSocket"; import type * as TypesGen from "#/api/typesGenerated"; +import type { ReconnectSchedule } from "#/utils/reconnectingWebSocket"; import type { ChatProviderFailureKind } from "../../utils/usageLimitMessage"; export type ParsedToolCall = { diff --git a/site/src/pages/AgentsPage/components/AgentDetailView.tsx b/site/src/pages/AgentsPage/components/AgentDetailView.tsx index b4d7a35c74..2db8dec466 100644 --- a/site/src/pages/AgentsPage/components/AgentDetailView.tsx +++ b/site/src/pages/AgentsPage/components/AgentDetailView.tsx @@ -1,13 +1,13 @@ import { ArchiveIcon, ArrowDownIcon } from "lucide-react"; import { type FC, type RefObject, useEffect, useRef, useState } from "react"; import type { UrlTransform } from "streamdown"; -import { cn } from "utils/cn"; -import { pageTitle } from "utils/page"; import type * as TypesGen from "#/api/typesGenerated"; import type { ChatDiffStatus, ChatMessagePart } from "#/api/typesGenerated"; import type { ModelSelectorOption } from "#/components/ai-elements"; import { DesktopPanelContext } from "#/components/ai-elements/tool/DesktopPanelContext"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; +import { pageTitle } from "#/utils/page"; import type { ChatDetailError } from "../utils/usageLimitMessage"; import { AgentChatInput, type ChatMessageInputRef } from "./AgentChatInput"; import type { useChatStore } from "./AgentDetail/ChatContext"; diff --git a/site/src/pages/AgentsPage/components/AgentPageHeader.tsx b/site/src/pages/AgentsPage/components/AgentPageHeader.tsx index efdf69ea17..85fbd9f918 100644 --- a/site/src/pages/AgentsPage/components/AgentPageHeader.tsx +++ b/site/src/pages/AgentsPage/components/AgentPageHeader.tsx @@ -6,11 +6,11 @@ import { } from "lucide-react"; import type { FC, ReactNode } from "react"; import { Link, NavLink, useLocation, useOutletContext } from "react-router"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; import { CoderIcon } from "#/components/Icons/CoderIcon"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { cn } from "#/utils/cn"; import type { AgentsOutletContext } from "../AgentsPageView"; import { sidebarViewFromPath } from "./Sidebar/AgentsSidebar"; diff --git a/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx b/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx index 0a465132f4..7ac1a0d1c4 100644 --- a/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx +++ b/site/src/pages/AgentsPage/components/AgentsSkeletons.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { Skeleton } from "#/components/Skeleton/Skeleton"; +import { cn } from "#/utils/cn"; /** localStorage keys shared with the agents panel components. */ const RIGHT_PANEL_OPEN_KEY = "agents.right-panel-open"; diff --git a/site/src/pages/AgentsPage/components/Calendar/Calendar.tsx b/site/src/pages/AgentsPage/components/Calendar/Calendar.tsx index fa5d910252..9f83155aad 100644 --- a/site/src/pages/AgentsPage/components/Calendar/Calendar.tsx +++ b/site/src/pages/AgentsPage/components/Calendar/Calendar.tsx @@ -14,8 +14,8 @@ import { DayPicker, getDefaultClassNames, } from "react-day-picker"; -import { cn } from "utils/cn"; import { Button, type ButtonProps } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; function Calendar({ className, diff --git a/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx b/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx index 29c0952b66..d5c9b1b959 100644 --- a/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx +++ b/site/src/pages/AgentsPage/components/ChatCostSummaryView.tsx @@ -1,8 +1,6 @@ import dayjs from "dayjs"; import { TriangleAlertIcon } from "lucide-react"; import type { FC } from "react"; -import { formatTokenCount } from "utils/analytics"; -import { formatCostMicros } from "utils/currency"; import { getErrorMessage } from "#/api/errors"; import type * as TypesGen from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -15,6 +13,8 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { formatTokenCount } from "#/utils/analytics"; +import { formatCostMicros } from "#/utils/currency"; interface ChatCostSummaryViewProps { summary: TypesGen.ChatCostSummary | undefined; diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx index 9aba99756c..03026ca6da 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ChatModelAdminPanel.tsx @@ -1,6 +1,5 @@ import { type FC, type ReactNode, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { cn } from "utils/cn"; import { chatModelConfigs, chatModels, @@ -16,6 +15,7 @@ import type * as TypesGen from "#/api/typesGenerated"; import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; import { formatProviderLabel } from "../../utils/modelOptions"; import { normalizeProvider, readOptionalString } from "./helpers"; import { ModelsSection } from "./ModelsSection"; diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx index c9ca687971..0f492447eb 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelConfigFields.tsx @@ -1,6 +1,5 @@ import { type FormikContextType, getIn } from "formik"; import type { FC } from "react"; -import { cn } from "utils/cn"; import { type FieldSchema, getVisibleGeneralFields, @@ -19,6 +18,7 @@ import { SelectValue, } from "#/components/Select/Select"; import { Textarea } from "#/components/Textarea/Textarea"; +import { cn } from "#/utils/cn"; import { normalizeProvider } from "./helpers"; import type { ModelConfigFormBuildResult, diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx index 006ad72510..1ec52feef8 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelForm.tsx @@ -5,8 +5,6 @@ import { ChevronRightIcon, } from "lucide-react"; import { type FC, useState } from "react"; -import { cn } from "utils/cn"; -import { getFormHelpers } from "utils/formUtils"; import * as Yup from "yup"; import type * as TypesGen from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -26,6 +24,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { getFormHelpers } from "#/utils/formUtils"; import type { ProviderState } from "./ChatModelAdminPanel"; import { GeneralModelConfigFields, diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.tsx index 629b0d5980..cc4ce45ff2 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ModelsSection.tsx @@ -7,7 +7,6 @@ import { } from "lucide-react"; import type { FC, ReactNode } from "react"; import { useLocation, useNavigate, useSearchParams } from "react-router"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; import { Button } from "#/components/Button/Button"; @@ -22,6 +21,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { SectionHeader } from "../SectionHeader"; import type { ProviderState } from "./ChatModelAdminPanel"; import { ModelForm } from "./ModelForm"; diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderIcon.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderIcon.tsx index 23a778ff88..9ee14dac47 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderIcon.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProviderIcon.tsx @@ -1,7 +1,7 @@ import { ServerIcon } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; +import { cn } from "#/utils/cn"; import { formatProviderLabel } from "../../utils/modelOptions"; import { normalizeProvider } from "./helpers"; diff --git a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx index 448841f2ae..df513c9197 100644 --- a/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx +++ b/site/src/pages/AgentsPage/components/ChatModelAdminPanel/ProvidersSection.tsx @@ -1,8 +1,8 @@ import { CheckCircleIcon, ChevronRightIcon, CircleIcon } from "lucide-react"; import type { FC, ReactNode } from "react"; import { useLocation, useNavigate, useSearchParams } from "react-router"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; +import { cn } from "#/utils/cn"; import { SectionHeader } from "../SectionHeader"; import type { ProviderState } from "./ChatModelAdminPanel"; import { ProviderForm } from "./ProviderForm"; diff --git a/site/src/pages/AgentsPage/components/DateRangePicker/DateRangePicker.tsx b/site/src/pages/AgentsPage/components/DateRangePicker/DateRangePicker.tsx index 2f7e6bd0d3..5159c49569 100644 --- a/site/src/pages/AgentsPage/components/DateRangePicker/DateRangePicker.tsx +++ b/site/src/pages/AgentsPage/components/DateRangePicker/DateRangePicker.tsx @@ -8,13 +8,13 @@ import dayjs from "dayjs"; import { CalendarIcon, MoveRightIcon } from "lucide-react"; import { type FC, useState } from "react"; import type { DateRange as DayPickerDateRange } from "react-day-picker"; -import { cn } from "utils/cn"; import { Button, type ButtonProps } from "#/components/Button/Button"; import { Popover, PopoverContent, PopoverTrigger, } from "#/components/Popover/Popover"; +import { cn } from "#/utils/cn"; import { Calendar } from "../Calendar/Calendar"; export type DateRangeValue = { diff --git a/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx b/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx index 1d00f05c1c..dbb56c1ddc 100644 --- a/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx +++ b/site/src/pages/AgentsPage/components/DiffViewer/DiffViewer.tsx @@ -17,7 +17,6 @@ import { useRef, useState, } from "react"; -import { cn } from "utils/cn"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { DIFFS_FONT_STYLE, @@ -26,6 +25,7 @@ import { import { FileIcon } from "#/components/FileIcon/FileIcon"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; import { Skeleton } from "#/components/Skeleton/Skeleton"; +import { cn } from "#/utils/cn"; import { changeColor, changeLabel } from "../../utils/diffColors"; // ------------------------------------------------------------------- diff --git a/site/src/pages/AgentsPage/components/DiffViewer/RemoteDiffPanel.tsx b/site/src/pages/AgentsPage/components/DiffViewer/RemoteDiffPanel.tsx index 09b0254c4e..4e564b8cfd 100644 --- a/site/src/pages/AgentsPage/components/DiffViewer/RemoteDiffPanel.tsx +++ b/site/src/pages/AgentsPage/components/DiffViewer/RemoteDiffPanel.tsx @@ -11,9 +11,9 @@ import { } from "lucide-react"; import { type FC, type RefObject, useEffect, useState } from "react"; import { useQuery } from "react-query"; -import { cn } from "utils/cn"; import { chatDiffContents } from "#/api/queries/chats"; import type * as TypesGen from "#/api/typesGenerated"; +import { cn } from "#/utils/cn"; import { parsePullRequestUrl } from "../../utils/pullRequest"; import type { ChatMessageInputRef } from "../AgentChatInput"; import { CommentableDiffViewer } from "../DiffViewer/CommentableDiffViewer"; diff --git a/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx b/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx index f23c20f95f..976e4fa749 100644 --- a/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx +++ b/site/src/pages/AgentsPage/components/GitPanel/GitPanel.tsx @@ -12,13 +12,13 @@ import { RowsIcon, } from "lucide-react"; import { type FC, type RefObject, useEffect, useRef, useState } from "react"; -import { cn } from "utils/cn"; import type { ChatDiffStatus, WorkspaceAgentRepoChanges, } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { ScrollArea } from "#/components/ScrollArea/ScrollArea"; +import { cn } from "#/utils/cn"; import type { ChatMessageInputRef } from "../AgentChatInput"; import { DiffStatBadge } from "../DiffViewer/DiffStats"; import { diff --git a/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx b/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx index 728b913b7b..24c770566f 100644 --- a/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx +++ b/site/src/pages/AgentsPage/components/LimitsTab/GroupLimitsSection.tsx @@ -1,6 +1,5 @@ import { Check } from "lucide-react"; import { type FC, useId } from "react"; -import { formatCostMicros, isPositiveFiniteDollarAmount } from "utils/currency"; import { getErrorMessage } from "#/api/errors"; import type { Group } from "#/api/typesGenerated"; import { Autocomplete } from "#/components/Autocomplete/Autocomplete"; @@ -18,6 +17,10 @@ import { TableRow, } from "#/components/Table/Table"; import { getGroupSubtitle } from "#/modules/groups"; +import { + formatCostMicros, + isPositiveFiniteDollarAmount, +} from "#/utils/currency"; import { SectionHeader } from "../SectionHeader"; interface GroupLimitsSectionProps { diff --git a/site/src/pages/AgentsPage/components/LimitsTab/LimitsTab.tsx b/site/src/pages/AgentsPage/components/LimitsTab/LimitsTab.tsx index 97d3f71d72..e11d7736de 100644 --- a/site/src/pages/AgentsPage/components/LimitsTab/LimitsTab.tsx +++ b/site/src/pages/AgentsPage/components/LimitsTab/LimitsTab.tsx @@ -1,11 +1,6 @@ import { ShieldIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { - dollarsToMicros, - isPositiveFiniteDollarAmount, - microsToDollars, -} from "utils/currency"; import { getErrorMessage } from "#/api/errors"; import { chatUsageLimitConfig, @@ -25,6 +20,11 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { + dollarsToMicros, + isPositiveFiniteDollarAmount, + microsToDollars, +} from "#/utils/currency"; import { DefaultLimitSection } from "./DefaultLimitSection"; import { GroupLimitsSection } from "./GroupLimitsSection"; import { normalizeChatUsageLimitPeriod } from "./limitsFormLogic"; diff --git a/site/src/pages/AgentsPage/components/LimitsTab/UserOverridesSection.tsx b/site/src/pages/AgentsPage/components/LimitsTab/UserOverridesSection.tsx index 323e186f9d..23428989d6 100644 --- a/site/src/pages/AgentsPage/components/LimitsTab/UserOverridesSection.tsx +++ b/site/src/pages/AgentsPage/components/LimitsTab/UserOverridesSection.tsx @@ -1,5 +1,4 @@ import { type FC, useId } from "react"; -import { formatCostMicros, isPositiveFiniteDollarAmount } from "utils/currency"; import { getErrorMessage } from "#/api/errors"; import type { User } from "#/api/typesGenerated"; import { AvatarData } from "#/components/Avatar/AvatarData"; @@ -16,6 +15,10 @@ import { TableRow, } from "#/components/Table/Table"; import { UserAutocomplete } from "#/components/UserAutocomplete/UserAutocomplete"; +import { + formatCostMicros, + isPositiveFiniteDollarAmount, +} from "#/utils/currency"; import { SectionHeader } from "../SectionHeader"; interface UserOverridesSectionProps { diff --git a/site/src/pages/AgentsPage/components/MCPServerAdminPanel.tsx b/site/src/pages/AgentsPage/components/MCPServerAdminPanel.tsx index 9a9386b0ea..e2ab9fb172 100644 --- a/site/src/pages/AgentsPage/components/MCPServerAdminPanel.tsx +++ b/site/src/pages/AgentsPage/components/MCPServerAdminPanel.tsx @@ -11,7 +11,6 @@ import { import { type FC, type ReactNode, useId, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useSearchParams } from "react-router"; -import { cn } from "utils/cn"; import { createMCPServerConfig as createMCPServerConfigMutation, deleteMCPServerConfig as deleteMCPServerConfigMutation, @@ -38,6 +37,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; import { ProviderField as Field } from "./ChatModelAdminPanel/ProviderForm"; import { SectionHeader } from "./SectionHeader"; diff --git a/site/src/pages/AgentsPage/components/MCPServerPicker.tsx b/site/src/pages/AgentsPage/components/MCPServerPicker.tsx index 4d4090bebe..a9783cc547 100644 --- a/site/src/pages/AgentsPage/components/MCPServerPicker.tsx +++ b/site/src/pages/AgentsPage/components/MCPServerPicker.tsx @@ -1,6 +1,5 @@ import { ChevronDownIcon, LockIcon, ServerIcon } from "lucide-react"; import { type FC, useEffect, useRef, useState } from "react"; -import { cn } from "utils/cn"; import type * as TypesGen from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; @@ -17,6 +16,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; // ── Types ────────────────────────────────────────────────────── diff --git a/site/src/pages/AgentsPage/components/PRInsightsView.tsx b/site/src/pages/AgentsPage/components/PRInsightsView.tsx index aaaef1dedb..75fd81cf04 100644 --- a/site/src/pages/AgentsPage/components/PRInsightsView.tsx +++ b/site/src/pages/AgentsPage/components/PRInsightsView.tsx @@ -3,8 +3,6 @@ import relativeTime from "dayjs/plugin/relativeTime"; import { CodeIcon, ExternalLinkIcon } from "lucide-react"; import type { FC } from "react"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; -import { cn } from "utils/cn"; -import { formatCostMicros } from "utils/currency"; import type * as TypesGen from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { @@ -21,6 +19,8 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { cn } from "#/utils/cn"; +import { formatCostMicros } from "#/utils/currency"; import { PrStateIcon } from "./GitPanel/GitPanel"; dayjs.extend(relativeTime); diff --git a/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx b/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx index 37eb319db7..43557bd109 100644 --- a/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx +++ b/site/src/pages/AgentsPage/components/QueuedMessagesList.tsx @@ -6,7 +6,6 @@ import { Trash2Icon, } from "lucide-react"; import { type FC, useEffect, useState } from "react"; -import { cn } from "utils/cn"; import type { ChatMessagePart, ChatQueuedMessage } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { Spinner } from "#/components/Spinner/Spinner"; @@ -15,6 +14,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; interface QueuedMessagesListProps { messages: readonly ChatQueuedMessage[]; diff --git a/site/src/pages/AgentsPage/components/RightPanel/RightPanel.tsx b/site/src/pages/AgentsPage/components/RightPanel/RightPanel.tsx index 94b409d6ed..526e2868f3 100644 --- a/site/src/pages/AgentsPage/components/RightPanel/RightPanel.tsx +++ b/site/src/pages/AgentsPage/components/RightPanel/RightPanel.tsx @@ -5,7 +5,7 @@ import { useRef, useState, } from "react"; -import { cn } from "utils/cn"; +import { cn } from "#/utils/cn"; const STORAGE_KEY = "agents.right-panel-width"; const MIN_WIDTH = 360; diff --git a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx index 78f53d0df0..4e8331fe54 100644 --- a/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx +++ b/site/src/pages/AgentsPage/components/Sidebar/AgentsSidebar.tsx @@ -57,8 +57,6 @@ import { useState, } from "react"; import { Link, NavLink, useLocation, useParams } from "react-router"; -import { cn } from "utils/cn"; -import { shortRelativeTime } from "utils/time"; import type { Chat, ChatDiffStatus, @@ -88,6 +86,8 @@ import { } from "#/components/Tooltip/Tooltip"; import { UserDropdownContent } from "#/modules/dashboard/Navbar/UserDropdown/UserDropdownContent"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { cn } from "#/utils/cn"; +import { shortRelativeTime } from "#/utils/time"; import { getNormalizedModelRef } from "../../utils/modelOptions"; import { getTimeGroup, TIME_GROUPS } from "../../utils/timeGroups"; import { UsageIndicator } from "../UsageIndicator"; diff --git a/site/src/pages/AgentsPage/components/Sidebar/SidebarTabView.tsx b/site/src/pages/AgentsPage/components/Sidebar/SidebarTabView.tsx index c080e097ae..01826478bb 100644 --- a/site/src/pages/AgentsPage/components/Sidebar/SidebarTabView.tsx +++ b/site/src/pages/AgentsPage/components/Sidebar/SidebarTabView.tsx @@ -8,8 +8,8 @@ import { } from "lucide-react"; import type { ReactNode } from "react"; import { type FC, useEffect, useId, useRef, useState } from "react"; -import { cn } from "utils/cn"; import { Button } from "#/components/Button/Button"; +import { cn } from "#/utils/cn"; import { DesktopPanel } from "../RightPanel/DesktopPanel"; /** A single tab definition for the sidebar panel. */ diff --git a/site/src/pages/AgentsPage/components/UsageIndicator.tsx b/site/src/pages/AgentsPage/components/UsageIndicator.tsx index 988ba1b828..cd008af336 100644 --- a/site/src/pages/AgentsPage/components/UsageIndicator.tsx +++ b/site/src/pages/AgentsPage/components/UsageIndicator.tsx @@ -2,7 +2,6 @@ import dayjs from "dayjs"; import type { FC } from "react"; import { useQuery } from "react-query"; import { Link } from "react-router"; -import { formatCostMicros } from "utils/currency"; import { chatUsageLimitStatus } from "#/api/queries/chats"; import { DropdownMenu, @@ -11,6 +10,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; +import { formatCostMicros } from "#/utils/currency"; import { getUsageLimitPeriodLabel } from "./ChatCostSummaryView"; export const UsageIndicator: FC = () => { diff --git a/site/src/pages/AgentsPage/utils/usageLimitMessage.ts b/site/src/pages/AgentsPage/utils/usageLimitMessage.ts index 8f1fe27315..2826e3ee9e 100644 --- a/site/src/pages/AgentsPage/utils/usageLimitMessage.ts +++ b/site/src/pages/AgentsPage/utils/usageLimitMessage.ts @@ -1,4 +1,4 @@ -import { formatCostMicros } from "utils/currency"; +import { formatCostMicros } from "#/utils/currency"; /** * Shape of structured usage-limit fields added to 409 responses diff --git a/site/src/pages/AuditPage/AuditFilter.tsx b/site/src/pages/AuditPage/AuditFilter.tsx index ff7e43641c..0bc9b677ec 100644 --- a/site/src/pages/AuditPage/AuditFilter.tsx +++ b/site/src/pages/AuditPage/AuditFilter.tsx @@ -1,6 +1,5 @@ import capitalize from "lodash/capitalize"; import type { FC } from "react"; -import { docs } from "utils/docs"; import { AuditActions, ResourceTypes } from "#/api/typesGenerated"; import { Filter, @@ -24,6 +23,7 @@ import { type OrganizationsFilterMenu, OrganizationsMenu, } from "#/modules/tableFiltering/options"; +import { docs } from "#/utils/docs"; const PRESET_FILTERS = [ { diff --git a/site/src/pages/AuditPage/AuditHelpTooltip.tsx b/site/src/pages/AuditPage/AuditHelpTooltip.tsx index 500f160749..f753ed4029 100644 --- a/site/src/pages/AuditPage/AuditHelpTooltip.tsx +++ b/site/src/pages/AuditPage/AuditHelpTooltip.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { docs } from "#/utils/docs"; const Language = { title: "What is an audit log?", diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx index c995fc3686..d2e72318f3 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx @@ -1,8 +1,8 @@ import { type FC, useMemo } from "react"; import { Link as RouterLink } from "react-router"; -import { systemBuildReasons } from "utils/workspace"; import type { AuditLog } from "#/api/typesGenerated"; import { Link } from "#/components/Link/Link"; +import { systemBuildReasons } from "#/utils/workspace"; interface BuildAuditDescriptionProps { auditLog: AuditLog; diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx index 2b98cd9b68..a696769f48 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx @@ -2,8 +2,6 @@ import { InfoIcon, NetworkIcon } from "lucide-react"; import { type FC, type KeyboardEvent, useState } from "react"; import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; -import { cn } from "utils/cn"; -import { buildReasonLabels } from "utils/workspace"; import type { AuditLog, BuildReason } from "#/api/typesGenerated"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -20,6 +18,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { buildReasonLabels } from "#/utils/workspace"; import { AuditLogDescription } from "./AuditLogDescription/AuditLogDescription"; import { AuditLogDiff } from "./AuditLogDiff/AuditLogDiff"; import { diff --git a/site/src/pages/AuditPage/AuditPage.test.tsx b/site/src/pages/AuditPage/AuditPage.test.tsx index d59dc9f50b..75d91e7acb 100644 --- a/site/src/pages/AuditPage/AuditPage.test.tsx +++ b/site/src/pages/AuditPage/AuditPage.test.tsx @@ -7,7 +7,6 @@ import { } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { HttpResponse, http } from "msw"; -import * as CreateDayString from "utils/createDayString"; import { API } from "#/api/api"; import type { AuditLogsRequest } from "#/api/typesGenerated"; import { DEFAULT_RECORDS_PER_PAGE } from "#/components/PaginationWidget/utils"; @@ -21,6 +20,7 @@ import { waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; import { server } from "#/testHelpers/server"; +import * as CreateDayString from "#/utils/createDayString"; import AuditPage from "./AuditPage"; interface RenderPageOptions { diff --git a/site/src/pages/AuditPage/AuditPage.tsx b/site/src/pages/AuditPage/AuditPage.tsx index e32c85aded..077d5f7d96 100644 --- a/site/src/pages/AuditPage/AuditPage.tsx +++ b/site/src/pages/AuditPage/AuditPage.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; import { useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { paginatedAudits } from "#/api/queries/audits"; import { useFilter } from "#/components/Filter/Filter"; import { useUserFilterMenu } from "#/components/Filter/UserFilter"; @@ -9,6 +8,7 @@ import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { useOrganizationsFilterMenu } from "#/modules/tableFiltering/options"; +import { pageTitle } from "#/utils/page"; import { useActionFilterMenu, useResourceTypeFilterMenu } from "./AuditFilter"; import { AuditPageView } from "./AuditPageView"; diff --git a/site/src/pages/AuditPage/AuditPageView.tsx b/site/src/pages/AuditPage/AuditPageView.tsx index b82c1f2485..b1f17e5759 100644 --- a/site/src/pages/AuditPage/AuditPageView.tsx +++ b/site/src/pages/AuditPage/AuditPageView.tsx @@ -1,5 +1,4 @@ import type { ComponentProps, FC } from "react"; -import { docs } from "utils/docs"; import type { AuditLog } from "#/api/typesGenerated"; import { ChooseOne, Cond } from "#/components/Conditionals/ChooseOne"; import { EmptyState } from "#/components/EmptyState/EmptyState"; @@ -23,6 +22,7 @@ import { } from "#/components/Table/Table"; import { TableLoader } from "#/components/TableLoader/TableLoader"; import { Timeline } from "#/components/Timeline/Timeline"; +import { docs } from "#/utils/docs"; import { AuditFilter } from "./AuditFilter"; import { AuditHelpTooltip } from "./AuditHelpTooltip"; import { AuditLogRow } from "./AuditLogRow/AuditLogRow"; diff --git a/site/src/pages/CliAuthPage/CliAuthPage.tsx b/site/src/pages/CliAuthPage/CliAuthPage.tsx index c22c151ce0..b3c33a7b29 100644 --- a/site/src/pages/CliAuthPage/CliAuthPage.tsx +++ b/site/src/pages/CliAuthPage/CliAuthPage.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { pageTitle } from "utils/page"; import { apiKey } from "#/api/queries/users"; +import { pageTitle } from "#/utils/page"; import { CliAuthPageView } from "./CliAuthPageView"; const CliAuthenticationPage: FC = () => { diff --git a/site/src/pages/CliInstallPage/CliInstallPage.tsx b/site/src/pages/CliInstallPage/CliInstallPage.tsx index 540c7e4bcf..a62bd8ae9c 100644 --- a/site/src/pages/CliInstallPage/CliInstallPage.tsx +++ b/site/src/pages/CliInstallPage/CliInstallPage.tsx @@ -1,6 +1,6 @@ import isChromatic from "chromatic/isChromatic"; import type { FC } from "react"; -import { pageTitle } from "utils/page"; +import { pageTitle } from "#/utils/page"; import { CliInstallPageView } from "./CliInstallPageView"; const CliInstallPage: FC = () => { diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx index 3953bc6a39..42fbbd359f 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx @@ -1,7 +1,5 @@ import capitalize from "lodash/capitalize"; import type { FC } from "react"; -import { connectionTypeToFriendlyName } from "utils/connection"; -import { docs } from "utils/docs"; import { type ConnectionLogStatus, ConnectionLogStatuses, @@ -30,6 +28,8 @@ import { type OrganizationsFilterMenu, OrganizationsMenu, } from "#/modules/tableFiltering/options"; +import { connectionTypeToFriendlyName } from "#/utils/connection"; +import { docs } from "#/utils/docs"; type ConnectionLogFilterValues = { status?: ConnectionLogStatus; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogHelpTooltip.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogHelpTooltip.tsx index d3c2ae17e0..fa0331bdc4 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogHelpTooltip.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogHelpTooltip.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { docs } from "#/utils/docs"; const Language = { title: "Why are some events missing?", diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx index 3e718dba21..c555839ab9 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx @@ -1,7 +1,6 @@ import { screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { HttpResponse, http } from "msw"; -import * as CreateDayString from "utils/createDayString"; import { API } from "#/api/api"; import { DEFAULT_RECORDS_PER_PAGE } from "#/components/PaginationWidget/utils"; import { @@ -14,6 +13,7 @@ import { waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; import { server } from "#/testHelpers/server"; +import * as CreateDayString from "#/utils/createDayString"; import ConnectionLogPage from "./ConnectionLogPage"; interface RenderPageOptions { diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx index 454a1ccc7d..39216c1146 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; import { useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { paginatedConnectionLogs } from "#/api/queries/connectionlog"; import { useFilter } from "#/components/Filter/Filter"; import { useUserFilterMenu } from "#/components/Filter/UserFilter"; @@ -9,6 +8,7 @@ import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { useOrganizationsFilterMenu } from "#/modules/tableFiltering/options"; +import { pageTitle } from "#/utils/page"; import { useStatusFilterMenu, useTypeFilterMenu } from "./ConnectionLogFilter"; import { ConnectionLogPageView } from "./ConnectionLogPageView"; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.tsx index e9baaf3d83..b6bf1e0208 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.tsx @@ -1,5 +1,4 @@ import type { ComponentProps, FC } from "react"; -import { docs } from "utils/docs"; import type { ConnectionLog } from "#/api/typesGenerated"; import { ChooseOne, Cond } from "#/components/Conditionals/ChooseOne"; import { EmptyState } from "#/components/EmptyState/EmptyState"; @@ -23,6 +22,7 @@ import { } from "#/components/Table/Table"; import { TableLoader } from "#/components/TableLoader/TableLoader"; import { Timeline } from "#/components/Timeline/Timeline"; +import { docs } from "#/utils/docs"; import { ConnectionLogFilter } from "./ConnectionLogFilter"; import { ConnectionLogHelpTooltip } from "./ConnectionLogHelpTooltip"; import { ConnectionLogRow } from "./ConnectionLogRow/ConnectionLogRow"; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx index 1a25e778d3..1e85a8cd29 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx @@ -1,8 +1,8 @@ import type { FC, ReactNode } from "react"; import { Link as RouterLink } from "react-router"; -import { connectionTypeToFriendlyName } from "utils/connection"; import type { ConnectionLog } from "#/api/typesGenerated"; import { Link } from "#/components/Link/Link"; +import { connectionTypeToFriendlyName } from "#/utils/connection"; interface ConnectionLogDescriptionProps { connectionLog: ConnectionLog; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx index 59236510a4..06e8fedeb3 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx @@ -2,7 +2,6 @@ import { InfoIcon, NetworkIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; -import { connectionTypeIsWeb } from "utils/connection"; import type { ConnectionLog } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { Link } from "#/components/Link/Link"; @@ -14,6 +13,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { connectionTypeIsWeb } from "#/utils/connection"; import { ConnectionLogDescription } from "./ConnectionLogDescription/ConnectionLogDescription"; interface ConnectionLogRowProps { diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.tsx index df5e6ca15c..57d389c527 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.tsx @@ -1,8 +1,8 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { pageTitle } from "utils/page"; -import { getTemplatesByTag } from "utils/starterTemplates"; import { templateExamples } from "#/api/queries/templates"; +import { pageTitle } from "#/utils/page"; +import { getTemplatesByTag } from "#/utils/starterTemplates"; import { CreateTemplateGalleryPageView } from "./CreateTemplateGalleryPageView"; const CreateTemplatesGalleryPage: FC = () => { diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx index db92ac1b0d..b45b510115 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx @@ -1,11 +1,11 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getTemplatesByTag } from "utils/starterTemplates"; import { chromatic } from "#/testHelpers/chromatic"; import { MockTemplateExample, MockTemplateExample2, mockApiError, } from "#/testHelpers/entities"; +import { getTemplatesByTag } from "#/utils/starterTemplates"; import { CreateTemplateGalleryPageView } from "./CreateTemplateGalleryPageView"; const meta: Meta = { diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx index 30124506d3..a5bad4b34d 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx @@ -6,7 +6,6 @@ import Stack from "@mui/material/Stack"; import { ExternalLinkIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; -import type { StarterTemplatesByTag } from "utils/starterTemplates"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; @@ -16,6 +15,7 @@ import { PageHeader, PageHeaderTitle, } from "#/components/PageHeader/PageHeader"; +import type { StarterTemplatesByTag } from "#/utils/starterTemplates"; import { StarterTemplates } from "./StarterTemplates"; interface CreateTemplateGalleryPageViewProps { diff --git a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx index 28aced760c..6a7171f896 100644 --- a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx @@ -1,10 +1,10 @@ import type { Interpolation, Theme } from "@emotion/react"; import type { FC } from "react"; import { Link, useSearchParams } from "react-router"; -import type { StarterTemplatesByTag } from "utils/starterTemplates"; import type { TemplateExample } from "#/api/typesGenerated"; import { Stack } from "#/components/Stack/Stack"; import { TemplateExampleCard } from "#/modules/templates/TemplateExampleCard/TemplateExampleCard"; +import type { StarterTemplatesByTag } from "#/utils/starterTemplates"; const getTagLabel = (tag: string) => { const labelByTag: Record = { diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 4f663bbd4c..df253aaaa2 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -7,18 +7,6 @@ import { SelectedTemplate } from "pages/CreateWorkspacePage/SelectedTemplate"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; import { useSearchParams } from "react-router"; -import { docs } from "utils/docs"; -import { - displayNameValidator, - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; -import { - sortedDays, - type TemplateAutostartRequirementDaysValue, - type TemplateAutostopRequirementDaysValue, -} from "utils/schedule"; import * as Yup from "yup"; import { provisionerDaemons } from "#/api/queries/organizations"; import type { @@ -44,6 +32,18 @@ import { Label } from "#/components/Label/Label"; import { OrganizationAutocomplete } from "#/components/OrganizationAutocomplete/OrganizationAutocomplete"; import { Spinner } from "#/components/Spinner/Spinner"; import { ProvisionerTagsField } from "#/modules/provisioners/ProvisionerTagsField"; +import { docs } from "#/utils/docs"; +import { + displayNameValidator, + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; +import { + sortedDays, + type TemplateAutostartRequirementDaysValue, + type TemplateAutostopRequirementDaysValue, +} from "#/utils/schedule"; import { TemplateUpload, type TemplateUploadProps } from "./TemplateUpload"; import { VariableInput } from "./VariableInput"; diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index f8f10d3736..1a1b3056a4 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -1,11 +1,11 @@ import { type FC, useRef, useState } from "react"; import { useMutation } from "react-query"; import { useNavigate, useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { createTemplate } from "#/api/queries/templates"; import type { TemplateVersion } from "#/api/typesGenerated"; import { FullPageHorizontalForm } from "#/components/FullPageForm/FullPageHorizontalForm"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import { pageTitle } from "#/utils/page"; import { BuildLogsDrawer } from "./BuildLogsDrawer"; import { DuplicateTemplateView } from "./DuplicateTemplateView"; import { ImportStarterTemplateView } from "./ImportStarterTemplateView"; diff --git a/site/src/pages/CreateTemplatePage/utils.ts b/site/src/pages/CreateTemplatePage/utils.ts index bb3cee0ed4..1ddeee6d71 100644 --- a/site/src/pages/CreateTemplatePage/utils.ts +++ b/site/src/pages/CreateTemplatePage/utils.ts @@ -1,4 +1,3 @@ -import { calculateAutostopRequirementDaysValue } from "utils/schedule"; import type { CreateTemplateOptions } from "#/api/queries/templates"; import type { CreateTemplateVersionRequest, @@ -7,6 +6,7 @@ import type { TemplateExample, VariableValue, } from "#/api/typesGenerated"; +import { calculateAutostopRequirementDaysValue } from "#/utils/schedule"; import type { CreateTemplateFormData } from "./CreateTemplateForm"; export const newTemplate = ( diff --git a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx index cd2a5f14b4..152ebe2390 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx @@ -6,7 +6,6 @@ import utc from "dayjs/plugin/utc"; import type { FormikContextType } from "formik"; import { type FC, useEffect, useState } from "react"; import { useNavigate } from "react-router"; -import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; import { Button } from "#/components/Button/Button"; import { FormFields, @@ -16,6 +15,7 @@ import { } from "#/components/Form/Form"; import { Spinner } from "#/components/Spinner/Spinner"; import { Stack } from "#/components/Stack/Stack"; +import { getFormHelpers, onChangeTrimmed } from "#/utils/formUtils"; import { type CreateTokenData, customLifetimeDay, diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx index f058e170df..b2ecc31c62 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx @@ -3,7 +3,6 @@ import { type FC, useState } from "react"; import { useMutation, useQuery } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { getErrorDetail } from "#/api/errors"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -11,6 +10,7 @@ import { CodeExample } from "#/components/CodeExample/CodeExample"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import { FullPageHorizontalForm } from "#/components/FullPageForm/FullPageHorizontalForm"; import { Loader } from "#/components/Loader/Loader"; +import { pageTitle } from "#/utils/page"; import { CreateTokenForm } from "./CreateTokenForm"; import { type CreateTokenData, NANO_HOUR } from "./utils"; diff --git a/site/src/pages/CreateUserPage/CreateUserForm.tsx b/site/src/pages/CreateUserPage/CreateUserForm.tsx index 716f9da4bc..2fbca3ce7f 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.tsx @@ -2,13 +2,6 @@ import * as SelectPrimitive from "@radix-ui/react-select"; import { useFormik } from "formik"; import { Check } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { - displayNameValidator, - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { hasApiFieldErrors, isApiError } from "#/api/errors"; import type * as TypesGen from "#/api/typesGenerated"; @@ -26,6 +19,13 @@ import { SelectValue, } from "#/components/Select/Select"; import { Spinner } from "#/components/Spinner/Spinner"; +import { cn } from "#/utils/cn"; +import { + displayNameValidator, + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; const loginTypeOptions = { password: { diff --git a/site/src/pages/CreateUserPage/CreateUserPage.tsx b/site/src/pages/CreateUserPage/CreateUserPage.tsx index e94c1408c6..ba92e1a033 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.tsx @@ -2,11 +2,11 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { authMethods, createUser } from "#/api/queries/users"; import { Margins } from "#/components/Margins/Margins"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { pageTitle } from "#/utils/page"; import { CreateUserForm } from "./CreateUserForm"; const CreateUserPage: FC = () => { diff --git a/site/src/pages/CreateWorkspacePage/AutoCreateConsentDialog.tsx b/site/src/pages/CreateWorkspacePage/AutoCreateConsentDialog.tsx index e048d15d80..58c3e552fc 100644 --- a/site/src/pages/CreateWorkspacePage/AutoCreateConsentDialog.tsx +++ b/site/src/pages/CreateWorkspacePage/AutoCreateConsentDialog.tsx @@ -1,6 +1,5 @@ import { TriangleAlertIcon } from "lucide-react"; import type { FC } from "react"; -import type { AutofillBuildParameter } from "utils/richParameters"; import { Button } from "#/components/Button/Button"; import { Dialog, @@ -10,6 +9,7 @@ import { DialogHeader, DialogTitle, } from "#/components/Dialog/Dialog"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; interface AutoCreateConsentDialogProps { open: boolean; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index d9b66d260f..cf0c3bd1bf 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -9,8 +9,6 @@ import { } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams, useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; -import type { AutofillBuildParameter } from "utils/richParameters"; import { API } from "#/api/api"; import { type ApiErrorResponse, DetailedError } from "#/api/errors"; import { checkAuthorization } from "#/api/queries/authCheck"; @@ -32,6 +30,8 @@ import { Loader } from "#/components/Loader/Loader"; import { useEffectEvent } from "#/hooks/hookPolyfills"; import { getInitialParameterValues } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; import { generateWorkspaceName } from "#/modules/workspaces/generateWorkspaceName"; +import { pageTitle } from "#/utils/page"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; import { AutoCreateConsentDialog } from "./AutoCreateConsentDialog"; import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; import { diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index a4eabbd6f0..fc73bc45b5 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -9,9 +9,6 @@ import { useState, } from "react"; import { Link as RouterLink } from "react-router"; -import { docs } from "utils/docs"; -import { nameValidator } from "utils/formUtils"; -import type { AutofillBuildParameter } from "utils/richParameters"; import * as Yup from "yup"; import type * as TypesGen from "#/api/typesGenerated"; import type { @@ -51,6 +48,9 @@ import { useValidationSchemaForDynamicParameters, } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; import { generateWorkspaceName } from "#/modules/workspaces/generateWorkspaceName"; +import { docs } from "#/utils/docs"; +import { nameValidator } from "#/utils/formUtils"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; import type { CreateWorkspaceMode } from "./CreateWorkspacePage"; import { ExternalAuthButton } from "./ExternalAuthButton"; import type { CreateWorkspacePermissions } from "./permissions"; diff --git a/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPage.tsx index c914b80276..5af8354774 100644 --- a/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPage.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { AIGovernanceSettingsPageView } from "./AIGovernanceSettingsPageView"; const AIGovernanceSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPageView.tsx index 5f153fb52a..09666e8a82 100644 --- a/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/AIGovernanceSettingsPage/AIGovernanceSettingsPageView.tsx @@ -1,6 +1,4 @@ import type { FC } from "react"; -import { deploymentGroupHasParent } from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { SerpentOption } from "#/api/typesGenerated"; import { Alert, AlertDescription, AlertTitle } from "#/components/Alert/Alert"; import { Link } from "#/components/Link/Link"; @@ -12,6 +10,8 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Stack } from "#/components/Stack/Stack"; +import { deploymentGroupHasParent } from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import OptionsTable from "../OptionsTable"; type AIGovernanceSettingsPageViewProps = { diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx index bde49fca64..e57a87a5d9 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.tsx @@ -4,12 +4,12 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { type FC, useState } from "react"; import { SliderPicker, TwitterPicker } from "react-color"; -import { getFormHelpers } from "utils/formUtils"; import type { BannerConfig } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { Dialog, DialogActionButtons } from "#/components/Dialogs/Dialog"; import { Stack } from "#/components/Stack/Stack"; import { AnnouncementBannerView } from "#/modules/dashboard/AnnouncementBanners/AnnouncementBannerView"; +import { getFormHelpers } from "#/utils/formUtils"; interface AnnouncementBannerDialogProps { banner: BannerConfig; diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx index a4ac83d324..725d0e8410 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPage.tsx @@ -2,7 +2,6 @@ import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { appearanceConfigKey, @@ -12,6 +11,7 @@ import type { UpdateAppearanceConfig } from "#/api/typesGenerated"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { AppearanceSettingsPageView } from "./AppearanceSettingsPageView"; // ServiceBanner is unlike the other Deployment Settings pages because it diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx index 32bb69757b..95d67163b1 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx @@ -1,7 +1,5 @@ import { useFormik } from "formik"; import type { FC } from "react"; -import { docs } from "utils/docs"; -import { getFormHelpers } from "utils/formUtils"; import type { UpdateAppearanceConfig } from "#/api/typesGenerated"; import { Badges, @@ -26,6 +24,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; +import { getFormHelpers } from "#/utils/formUtils"; import { Fieldset } from "../Fieldset"; import { AnnouncementBannerSettings } from "./AnnouncementBannerSettings"; diff --git a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPage.tsx index 8ae3211b9b..6ac6a49f2a 100644 --- a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPage.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { ExternalAuthSettingsPageView } from "./ExternalAuthSettingsPageView"; const ExternalAuthSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.tsx index ea32fec28c..0c559a0f21 100644 --- a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.tsx @@ -1,6 +1,5 @@ import { css } from "@emotion/react"; import type { FC } from "react"; -import { docs } from "utils/docs"; import type { DeploymentValues, ExternalAuthConfig, @@ -21,6 +20,7 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { docs } from "#/utils/docs"; type ExternalAuthSettingsPageViewProps = { config: DeploymentValues; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx index 21218f7801..bf33be470f 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx @@ -1,8 +1,6 @@ import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { deploymentIdpSyncFieldValues } from "#/api/queries/deployment"; import { @@ -15,6 +13,8 @@ import { Loader } from "#/components/Loader/Loader"; import { PaywallPremium } from "#/components/Paywall/PaywallPremium"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { ExportPolicyButton } from "./ExportPolicyButton"; import { IdpOrgSyncPageView } from "./IdpOrgSyncPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx index 9b3dc7034c..23a7b4032f 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx @@ -1,8 +1,6 @@ import { useFormik } from "formik"; import { Plus, Trash, TriangleAlert } from "lucide-react"; import { type FC, type KeyboardEventHandler, useId, useState } from "react"; -import { docs } from "utils/docs"; -import { isUUID } from "utils/uuid"; import * as Yup from "yup"; import type { Organization, @@ -57,6 +55,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; +import { isUUID } from "#/utils/uuid"; import { OrganizationPills } from "./OrganizationPills"; interface IdpSyncPageViewProps { diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx index 6ed4df5709..741a895ac8 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx @@ -1,12 +1,12 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; -import { isUUID } from "utils/uuid"; import { Pill } from "#/components/Pill/Pill"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { isUUID } from "#/utils/uuid"; interface OrganizationPillsProps { organizations: readonly string[]; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx index 0a18f15454..b4606f99ef 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx @@ -2,9 +2,9 @@ import type { FC } from "react"; import { useMutation } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { getErrorDetail } from "#/api/errors"; +import { pageTitle } from "#/utils/page"; import { AddNewLicensePageView } from "./AddNewLicensePageView"; const AddNewLicensePage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.tsx index 06ff243977..0a09f189e7 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.tsx @@ -1,7 +1,6 @@ import dayjs from "dayjs"; import { ChevronDownIcon, EllipsisVerticalIcon, TrashIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { cn } from "utils/cn"; import type { GetLicensesResponse } from "#/api/api"; import type { Feature } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -17,6 +16,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "#/components/DropdownMenu/DropdownMenu"; +import { cn } from "#/utils/cn"; import { AIGovernanceAddOnCard } from "./AIGovernanceAddOnCard"; import { isLicenseApplicableForAiGovernanceOverage, diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx index dd7d1ff5ce..98fc78acee 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx @@ -9,8 +9,6 @@ import { XAxis, YAxis, } from "recharts"; -import { docs } from "utils/docs"; -import { formatDate } from "utils/time"; import { Button } from "#/components/Button/Button"; import { type ChartConfig, @@ -25,6 +23,8 @@ import { } from "#/components/Collapsible/Collapsible"; import { Link } from "#/components/Link/Link"; import { Spinner } from "#/components/Spinner/Spinner"; +import { docs } from "#/utils/docs"; +import { formatDate } from "#/utils/time"; const chartConfig = { users: { diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx index 750633bddd..9e0735314e 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx @@ -2,12 +2,12 @@ import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { entitlements, refreshEntitlements } from "#/api/queries/entitlements"; import { insightsUserStatusCounts } from "#/api/queries/insights"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; +import { pageTitle } from "#/utils/page"; import LicensesSettingsPageView from "./LicensesSettingsPageView"; const LicensesSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx index 0ccb656a74..106a476f3c 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx @@ -1,8 +1,6 @@ import dayjs from "dayjs"; import { ChevronRightIcon } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import type { Feature } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; @@ -12,6 +10,8 @@ import { CollapsibleTrigger, } from "#/components/Collapsible/Collapsible"; import { Link } from "#/components/Link/Link"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; interface ManagedAgentsConsumptionProps { managedAgentFeature?: Feature; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/SeatUsageBarCard.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/SeatUsageBarCard.tsx index 09f19577e5..587b9ef43b 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/SeatUsageBarCard.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/SeatUsageBarCard.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; +import { cn } from "#/utils/cn"; type SeatUsageBarCardProps = { title: string; diff --git a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPage.tsx index c28cccad66..1c5d0efa9f 100644 --- a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPage.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { NetworkSettingsPageView } from "./NetworkSettingsPageView"; const NetworkSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.tsx index e64a70da55..d3495fce6d 100644 --- a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.tsx @@ -1,9 +1,4 @@ import type { FC } from "react"; -import { - deploymentGroupHasParent, - useDeploymentOptions, -} from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { SerpentOption } from "#/api/typesGenerated"; import { Badges, @@ -17,6 +12,11 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Stack } from "#/components/Stack/Stack"; +import { + deploymentGroupHasParent, + useDeploymentOptions, +} from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import OptionsTable from "../OptionsTable"; type NetworkSettingsPageViewProps = { diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.tsx index 71871fae40..e23196b5bb 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.tsx @@ -9,7 +9,6 @@ import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; import { type FC, Fragment } from "react"; import { useMutation, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { docs } from "utils/docs"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { type selectTemplatesByGroup, @@ -30,6 +29,7 @@ import { methodLabels, type NotificationMethod, } from "#/modules/notifications/utils"; +import { docs } from "#/utils/docs"; type NotificationEventsProps = { defaultMethod: NotificationMethod; diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx index 542d0372e3..b717ad59e1 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -1,9 +1,6 @@ import type { Interpolation, Theme } from "@emotion/react"; import type { FC } from "react"; import { useQueries } from "react-query"; -import { deploymentGroupHasParent } from "utils/deployOptions"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { customNotificationTemplates, notificationDispatchMethods, @@ -21,6 +18,9 @@ import { TabLink, Tabs, TabsList } from "#/components/Tabs/Tabs"; import { useSearchParamsKey } from "#/hooks/useSearchParamsKey"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; import { castNotificationMethod } from "#/modules/notifications/utils"; +import { deploymentGroupHasParent } from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import OptionsTable from "../OptionsTable"; import { NotificationEvents } from "./NotificationEvents"; import { Troubleshooting } from "./Troubleshooting"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx index 0e783067be..2ab4733cad 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx @@ -3,9 +3,9 @@ import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail } from "#/api/errors"; import { postApp } from "#/api/queries/oauth2"; +import { pageTitle } from "#/utils/page"; import { CreateOAuth2AppPageView } from "./CreateOAuth2AppPageView"; const CreateOAuth2AppPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx index 5ce8876573..e2fb79f612 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx @@ -3,10 +3,10 @@ import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail } from "#/api/errors"; import * as oauth2 from "#/api/queries/oauth2"; import type * as TypesGen from "#/api/typesGenerated"; +import { pageTitle } from "#/utils/page"; import { EditOAuth2AppPageView } from "./EditOAuth2AppPageView"; const EditOAuth2AppPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx index fad9748f69..dda3fa2fda 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx @@ -3,7 +3,6 @@ import Divider from "@mui/material/Divider"; import { ChevronLeftIcon, CopyIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink, useSearchParams } from "react-router"; -import { createDayString } from "utils/createDayString"; import type * as TypesGen from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -29,6 +28,7 @@ import { TableRow, } from "#/components/Table/Table"; import { TableLoader } from "#/components/TableLoader/TableLoader"; +import { createDayString } from "#/utils/createDayString"; import { OAuth2AppForm } from "./OAuth2AppForm"; type MutatingResource = { diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx index 413faddd49..bbe5e071c9 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPage.tsx @@ -1,8 +1,8 @@ import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { pageTitle } from "utils/page"; import { getApps } from "#/api/queries/oauth2"; +import { pageTitle } from "#/utils/page"; import OAuth2AppsSettingsPageView from "./OAuth2AppsSettingsPageView"; const OAuth2AppsSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx index 0569363dc6..43a0985954 100644 --- a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPage.tsx @@ -1,8 +1,8 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { ObservabilitySettingsPageView } from "./ObservabilitySettingsPageView"; const ObservabilitySettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.tsx index c19745ddf1..2e0d7c3fbc 100644 --- a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.tsx @@ -1,6 +1,4 @@ import type { FC } from "react"; -import { deploymentGroupHasParent } from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { SerpentOption } from "#/api/typesGenerated"; import { Badges, @@ -20,6 +18,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { deploymentGroupHasParent } from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import OptionsTable from "../OptionsTable"; type ObservabilitySettingsPageViewProps = { diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPage.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPage.tsx index d8b563b041..5ae4907a85 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPage.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { pageTitle } from "utils/page"; import { deploymentDAUs } from "#/api/queries/deployment"; import { availableExperiments, @@ -9,6 +8,7 @@ import { } from "#/api/queries/experiments"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { OverviewPageView } from "./OverviewPageView"; const OverviewPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.tsx index a19707cc85..b2363b60d0 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.tsx @@ -1,6 +1,4 @@ import type { FC } from "react"; -import { useDeploymentOptions } from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { DAUsResponse, Experiment, @@ -14,6 +12,8 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Stack } from "#/components/Stack/Stack"; +import { useDeploymentOptions } from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import { Alert, AlertTitle } from "../../../components/Alert/Alert"; import OptionsTable from "../OptionsTable"; import { UserEngagementChart } from "./UserEngagementChart"; diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx index e96eaa9bac..853188dd87 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx @@ -2,7 +2,6 @@ import { ChevronRightIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; -import { formatDate } from "utils/time"; import { Button } from "#/components/Button/Button"; import { type ChartConfig, @@ -17,6 +16,7 @@ import { } from "#/components/Collapsible/Collapsible"; import { Link } from "#/components/Link/Link"; import { Spinner } from "#/components/Spinner/Spinner"; +import { formatDate } from "#/utils/time"; const chartConfig = { users: { diff --git a/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPage.tsx b/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPage.tsx index 70579b70c7..235de88102 100644 --- a/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPage.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { pageTitle } from "#/utils/page"; import { PremiumPageView } from "./PremiumPageView"; const PremiumPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPageView.tsx b/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPageView.tsx index 8f6083aa3d..c517cdf13c 100644 --- a/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/PremiumPage/PremiumPageView.tsx @@ -1,8 +1,8 @@ import { Activity, Coins, Expand, SquareArrowOutUpRight } from "lucide-react"; import type { FC } from "react"; -import { docs } from "utils/docs"; import { Button } from "#/components/Button/Button"; import { Link } from "#/components/Link/Link"; +import { docs } from "#/utils/docs"; type PremiumPageViewProps = { isEnterprise: boolean }; diff --git a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx index ef2516d7e2..5c1a9bf575 100644 --- a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPage.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { SecuritySettingsPageView } from "./SecuritySettingsPageView"; const SecuritySettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.tsx index a0131e6bda..4714601f1e 100644 --- a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.tsx @@ -1,9 +1,4 @@ import type { FC } from "react"; -import { - deploymentGroupHasParent, - useDeploymentOptions, -} from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { SerpentOption } from "#/api/typesGenerated"; import { Badges, @@ -18,6 +13,11 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Stack } from "#/components/Stack/Stack"; +import { + deploymentGroupHasParent, + useDeploymentOptions, +} from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import OptionsTable from "../OptionsTable"; type SecuritySettingsPageViewProps = { diff --git a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPage.tsx index abe05367a6..3b314e3995 100644 --- a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPage.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { pageTitle } from "utils/page"; import { useDeploymentConfig } from "#/modules/management/DeploymentConfigProvider"; +import { pageTitle } from "#/utils/page"; import { UserAuthSettingsPageView } from "./UserAuthSettingsPageView"; const UserAuthSettingsPage: FC = () => { diff --git a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.tsx index a74a73e370..b7ab659571 100644 --- a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.tsx @@ -1,9 +1,4 @@ import type { JSX } from "react"; -import { - deploymentGroupHasParent, - useDeploymentOptions, -} from "utils/deployOptions"; -import { docs } from "utils/docs"; import type { SerpentOption } from "#/api/typesGenerated"; import { Badges, @@ -17,6 +12,11 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Stack } from "#/components/Stack/Stack"; +import { + deploymentGroupHasParent, + useDeploymentOptions, +} from "#/utils/deployOptions"; +import { docs } from "#/utils/docs"; import OptionsTable from "../OptionsTable"; type UserAuthSettingsPageViewProps = { diff --git a/site/src/pages/DeploymentSettingsPage/optionValue.ts b/site/src/pages/DeploymentSettingsPage/optionValue.ts index f93f82800e..b0ff0ea793 100644 --- a/site/src/pages/DeploymentSettingsPage/optionValue.ts +++ b/site/src/pages/DeploymentSettingsPage/optionValue.ts @@ -1,5 +1,5 @@ -import { humanDuration } from "utils/time"; import type { SerpentOption } from "#/api/typesGenerated"; +import { humanDuration } from "#/utils/time"; // optionValue is a helper function to format the value of a specific deployment options export function optionValue( diff --git a/site/src/pages/EditUserPage/EditUserForm.tsx b/site/src/pages/EditUserPage/EditUserForm.tsx index 239f8f8ffc..c79db6205d 100644 --- a/site/src/pages/EditUserPage/EditUserForm.tsx +++ b/site/src/pages/EditUserPage/EditUserForm.tsx @@ -1,11 +1,5 @@ import { useFormik } from "formik"; import type { FC } from "react"; -import { - displayNameValidator, - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { hasApiFieldErrors, isApiError } from "#/api/errors"; import type { UpdateUserProfileRequest } from "#/api/typesGenerated"; @@ -15,6 +9,12 @@ import { FormFooter } from "#/components/Form/Form"; import { FormField } from "#/components/FormField/FormField"; import { FullPageForm } from "#/components/FullPageForm/FullPageForm"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + displayNameValidator, + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; const validationSchema = Yup.object({ username: nameValidator("Username"), diff --git a/site/src/pages/EditUserPage/EditUserPage.tsx b/site/src/pages/EditUserPage/EditUserPage.tsx index 3ff7ca9bab..5642e87176 100644 --- a/site/src/pages/EditUserPage/EditUserPage.tsx +++ b/site/src/pages/EditUserPage/EditUserPage.tsx @@ -2,13 +2,13 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; -import { isUUID } from "utils/uuid"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { updateProfile, user } from "#/api/queries/users"; import type { UpdateUserProfileRequest } from "#/api/typesGenerated"; import { Loader } from "#/components/Loader/Loader"; import { Margins } from "#/components/Margins/Margins"; +import { pageTitle } from "#/utils/page"; +import { isUUID } from "#/utils/uuid"; import { EditUserForm } from "./EditUserForm"; const EditUserPage: FC = () => { diff --git a/site/src/pages/GroupsPage/CreateGroupPage.tsx b/site/src/pages/GroupsPage/CreateGroupPage.tsx index c6f4d53803..703cc5e2c4 100644 --- a/site/src/pages/GroupsPage/CreateGroupPage.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPage.tsx @@ -1,8 +1,8 @@ import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { createGroup } from "#/api/queries/groups"; +import { pageTitle } from "#/utils/page"; import { CreateGroupPageView } from "./CreateGroupPageView"; const CreateGroupPage: FC = () => { diff --git a/site/src/pages/GroupsPage/CreateGroupPageView.tsx b/site/src/pages/GroupsPage/CreateGroupPageView.tsx index 694b5a62f9..d06300472e 100644 --- a/site/src/pages/GroupsPage/CreateGroupPageView.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPageView.tsx @@ -1,11 +1,6 @@ import { useFormik } from "formik"; import type { FC } from "react"; import { useNavigate } from "react-router"; -import { - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { isApiValidationError } from "#/api/errors"; import type { CreateGroupRequest } from "#/api/typesGenerated"; @@ -15,6 +10,11 @@ import { IconField } from "#/components/IconField/IconField"; import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; const validationSchema = Yup.object({ name: nameValidator("Name"), diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx index d812a96954..fb180787c8 100644 --- a/site/src/pages/GroupsPage/GroupPage.tsx +++ b/site/src/pages/GroupsPage/GroupPage.tsx @@ -9,7 +9,6 @@ import { useSearchParams, } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { deleteGroup, @@ -32,6 +31,7 @@ import { } from "#/components/SettingsHeader/SettingsHeader"; import { TabLink, Tabs, TabsList } from "#/components/Tabs/Tabs"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; +import { pageTitle } from "#/utils/page"; export type GroupPageOutletContext = { group: Group; diff --git a/site/src/pages/GroupsPage/GroupSettingsPageView.tsx b/site/src/pages/GroupsPage/GroupSettingsPageView.tsx index ebe7b2c34b..675a54004e 100644 --- a/site/src/pages/GroupsPage/GroupSettingsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupSettingsPageView.tsx @@ -1,10 +1,5 @@ import { useFormik } from "formik"; import type { FC } from "react"; -import { - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import type { Group } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -13,6 +8,11 @@ import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; import { Spinner } from "#/components/Spinner/Spinner"; import { isEveryoneGroup } from "#/modules/groups"; +import { + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; type FormData = { name: string; diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index e2f237310d..c98e9e5e8a 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -3,7 +3,6 @@ import { type FC, useEffect } from "react"; import { useQuery } from "react-query"; import { Link as RouterLink } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { groupsByOrganization } from "#/api/queries/groups"; import { organizationsPermissions } from "#/api/queries/organizations"; @@ -17,6 +16,7 @@ import { } from "#/components/SettingsHeader/SettingsHeader"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { useGroupsSettings } from "./GroupsPageProvider"; import { GroupsPageView } from "./GroupsPageView"; diff --git a/site/src/pages/GroupsPage/GroupsPageView.tsx b/site/src/pages/GroupsPage/GroupsPageView.tsx index 0a2dedc14b..9da7c37e2e 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.tsx @@ -4,7 +4,6 @@ import { useClickableTableRow } from "hooks"; import { ChevronRightIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink, useNavigate } from "react-router"; -import { docs } from "utils/docs"; import type { Group } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { AvatarData } from "#/components/Avatar/AvatarData"; @@ -26,6 +25,7 @@ import { TableLoaderSkeleton, TableRowSkeleton, } from "#/components/TableLoader/TableLoader"; +import { docs } from "#/utils/docs"; type GroupsPageViewProps = { groups: Group[] | undefined; diff --git a/site/src/pages/HealthPage/AccessURLPage.tsx b/site/src/pages/HealthPage/AccessURLPage.tsx index ac28e3fe9a..5cb885c534 100644 --- a/site/src/pages/HealthPage/AccessURLPage.tsx +++ b/site/src/pages/HealthPage/AccessURLPage.tsx @@ -1,7 +1,7 @@ import { useOutletContext } from "react-router"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; +import { pageTitle } from "#/utils/page"; import { GridData, GridDataLabel, diff --git a/site/src/pages/HealthPage/Content.tsx b/site/src/pages/HealthPage/Content.tsx index 23616be52d..c7d67d0401 100644 --- a/site/src/pages/HealthPage/Content.tsx +++ b/site/src/pages/HealthPage/Content.tsx @@ -13,8 +13,8 @@ import { type HTMLAttributes, type ReactElement, } from "react"; -import { docs } from "utils/docs"; import type { HealthCode, HealthSeverity } from "#/api/typesGenerated"; +import { docs } from "#/utils/docs"; import { healthyColor } from "./healthyColor"; const CONTENT_PADDING = 36; diff --git a/site/src/pages/HealthPage/DERPPage.tsx b/site/src/pages/HealthPage/DERPPage.tsx index 3a7fbf6c0a..153110d590 100644 --- a/site/src/pages/HealthPage/DERPPage.tsx +++ b/site/src/pages/HealthPage/DERPPage.tsx @@ -2,7 +2,6 @@ import { useTheme } from "@emotion/react"; import { MapPinIcon } from "lucide-react"; import type { FC } from "react"; import { Link, useOutletContext } from "react-router"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport, HealthSeverity, @@ -16,6 +15,7 @@ import { TableCell, TableRow, } from "#/components/Table/Table"; +import { pageTitle } from "#/utils/page"; import { Header, HeaderTitle, diff --git a/site/src/pages/HealthPage/DERPRegionPage.tsx b/site/src/pages/HealthPage/DERPRegionPage.tsx index 9b7a40ea34..4f3e8e9299 100644 --- a/site/src/pages/HealthPage/DERPRegionPage.tsx +++ b/site/src/pages/HealthPage/DERPRegionPage.tsx @@ -1,9 +1,6 @@ import { ChevronLeftIcon, CodeIcon, HashIcon } from "lucide-react"; import type { FC } from "react"; import { Link, useOutletContext, useParams } from "react-router"; -import { cn } from "utils/cn"; -import { getLatencyColor } from "utils/latency"; -import { pageTitle } from "utils/page"; import type { DERPNodeReport, DERPRegionReport, @@ -22,6 +19,9 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; +import { pageTitle } from "#/utils/page"; import { BooleanPill, Header, diff --git a/site/src/pages/HealthPage/DatabasePage.tsx b/site/src/pages/HealthPage/DatabasePage.tsx index 489e013d36..b892f924a1 100644 --- a/site/src/pages/HealthPage/DatabasePage.tsx +++ b/site/src/pages/HealthPage/DatabasePage.tsx @@ -1,7 +1,7 @@ import { useOutletContext } from "react-router"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; +import { pageTitle } from "#/utils/page"; import { GridData, GridDataLabel, diff --git a/site/src/pages/HealthPage/HealthLayout.tsx b/site/src/pages/HealthPage/HealthLayout.tsx index 09f60af9bb..5ab4363cc2 100644 --- a/site/src/pages/HealthPage/HealthLayout.tsx +++ b/site/src/pages/HealthPage/HealthLayout.tsx @@ -5,9 +5,6 @@ import { BellOffIcon, RotateCcwIcon } from "lucide-react"; import { type FC, Suspense } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { NavLink, Outlet } from "react-router"; -import { cn } from "utils/cn"; -import { createDayString } from "utils/createDayString"; -import { pageTitle } from "utils/page"; import { health, refreshHealth } from "#/api/queries/debug"; import type { HealthSeverity } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -18,6 +15,9 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { DashboardFullPage } from "#/modules/dashboard/DashboardLayout"; +import { cn } from "#/utils/cn"; +import { createDayString } from "#/utils/createDayString"; +import { pageTitle } from "#/utils/page"; import { HealthIcon } from "./Content"; const linkStyles = { diff --git a/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx b/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx index db74f182a3..71b2d6a319 100644 --- a/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx +++ b/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx @@ -1,9 +1,9 @@ import type { FC } from "react"; import { useOutletContext } from "react-router"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; import { Provisioner } from "#/modules/provisioners/Provisioner"; +import { pageTitle } from "#/utils/page"; import { Header, HeaderTitle, diff --git a/site/src/pages/HealthPage/WebsocketPage.tsx b/site/src/pages/HealthPage/WebsocketPage.tsx index 8b3d6e83e8..46c4cba4c7 100644 --- a/site/src/pages/HealthPage/WebsocketPage.tsx +++ b/site/src/pages/HealthPage/WebsocketPage.tsx @@ -1,7 +1,6 @@ import { useTheme } from "@emotion/react"; import { CodeIcon } from "lucide-react"; import { useOutletContext } from "react-router"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; import { @@ -10,6 +9,7 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { MONOSPACE_FONT_FAMILY } from "#/theme/constants"; +import { pageTitle } from "#/utils/page"; import { Header, HeaderTitle, diff --git a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx index b6b1677706..25dc530412 100644 --- a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx +++ b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx @@ -2,8 +2,6 @@ import { useTheme } from "@emotion/react"; import { GlobeIcon, HashIcon } from "lucide-react"; import type { FC } from "react"; import { useOutletContext } from "react-router"; -import { createDayString } from "utils/createDayString"; -import { pageTitle } from "utils/page"; import type { HealthcheckReport } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; import { @@ -11,6 +9,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { createDayString } from "#/utils/createDayString"; +import { pageTitle } from "#/utils/page"; import { BooleanPill, Header, diff --git a/site/src/pages/IconsPage/IconsPage.tsx b/site/src/pages/IconsPage/IconsPage.tsx index 68f6186d68..a3f9259da6 100644 --- a/site/src/pages/IconsPage/IconsPage.tsx +++ b/site/src/pages/IconsPage/IconsPage.tsx @@ -6,7 +6,6 @@ import TextField from "@mui/material/TextField"; import { SearchIcon, XIcon } from "lucide-react"; import { type FC, type ReactNode, useMemo, useState } from "react"; import uFuzzy from "ufuzzy"; -import { pageTitle } from "utils/page"; import { CopyableValue } from "#/components/CopyableValue/CopyableValue"; import { EmptyState } from "#/components/EmptyState/EmptyState"; import { Margins } from "#/components/Margins/Margins"; @@ -26,6 +25,7 @@ import { parseImageParameters, } from "#/theme/externalImages"; import icons from "#/theme/icons.json"; +import { pageTitle } from "#/utils/page"; const filteredIcons = icons.filter((icon) => !DEPRECATED_ICONS.includes(icon)); const iconsWithoutSuffix = filteredIcons.map((icon) => { diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 243b6cc1e1..1503105572 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -2,12 +2,12 @@ import { useAuthContext } from "contexts/auth/AuthProvider"; import { type FC, useEffect } from "react"; import { useQuery } from "react-query"; import { Navigate, useLocation, useNavigate } from "react-router"; -import { getApplicationName } from "utils/appearance"; -import { retrieveRedirect } from "utils/redirect"; -import { sendDeploymentEvent } from "utils/telemetry"; import { buildInfo } from "#/api/queries/buildInfo"; import { authMethods } from "#/api/queries/users"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; +import { getApplicationName } from "#/utils/appearance"; +import { retrieveRedirect } from "#/utils/redirect"; +import { sendDeploymentEvent } from "#/utils/telemetry"; import { LoginPageView } from "./LoginPageView"; const LoginPage: FC = () => { diff --git a/site/src/pages/LoginPage/PasswordSignInForm.tsx b/site/src/pages/LoginPage/PasswordSignInForm.tsx index 26a21555b6..b6783b6a0b 100644 --- a/site/src/pages/LoginPage/PasswordSignInForm.tsx +++ b/site/src/pages/LoginPage/PasswordSignInForm.tsx @@ -1,13 +1,13 @@ import { useFormik } from "formik"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; -import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; import * as Yup from "yup"; import { Button } from "#/components/Button/Button"; import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; import { Link } from "#/components/Link/Link"; import { Spinner } from "#/components/Spinner/Spinner"; +import { getFormHelpers, onChangeTrimmed } from "#/utils/formUtils"; import { Language } from "./Language"; type PasswordSignInFormProps = { diff --git a/site/src/pages/LoginPage/SignInForm.tsx b/site/src/pages/LoginPage/SignInForm.tsx index d7d881a899..557c2c5b59 100644 --- a/site/src/pages/LoginPage/SignInForm.tsx +++ b/site/src/pages/LoginPage/SignInForm.tsx @@ -1,8 +1,8 @@ import type { FC, ReactNode } from "react"; -import { getApplicationName } from "utils/appearance"; import type { AuthMethods } from "#/api/typesGenerated"; import { Alert } from "#/components/Alert/Alert"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; +import { getApplicationName } from "#/utils/appearance"; import { OAuthSignInForm } from "./OAuthSignInForm"; import { PasswordSignInForm } from "./PasswordSignInForm"; diff --git a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx index 3b1368c322..c9c0e957fd 100644 --- a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx @@ -3,13 +3,6 @@ import { useFormik } from "formik"; import { ArrowLeft } from "lucide-react"; import type { FC } from "react"; import { Link, useNavigate } from "react-router"; -import { docs } from "utils/docs"; -import { - displayNameValidator, - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { isApiValidationError } from "#/api/errors"; import type { CreateOrganizationRequest } from "#/api/typesGenerated"; @@ -26,6 +19,13 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; +import { + displayNameValidator, + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; const MAX_DESCRIPTION_CHAR_LIMIT = 128; const MAX_DESCRIPTION_MESSAGE = `Please enter a description that is no longer than ${MAX_DESCRIPTION_CHAR_LIMIT} characters.`; diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx index 93371f277a..9e4e85413e 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx @@ -2,7 +2,6 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { createOrganizationRole, @@ -14,6 +13,7 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Loader } from "#/components/Loader/Loader"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import CreateEditRolePageView from "./CreateEditRolePageView"; const CreateEditRolePage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx index c8d591c75f..becfebd777 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx @@ -6,7 +6,6 @@ import { useFormik } from "formik"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { type ChangeEvent, type FC, useState } from "react"; import { useNavigate } from "react-router"; -import { getFormHelpers, nameValidator } from "utils/formUtils"; import * as Yup from "yup"; import { isApiValidationError } from "#/api/errors"; import { RBACResourceActions } from "#/api/rbacresourcesGenerated"; @@ -37,6 +36,7 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { getFormHelpers, nameValidator } from "#/utils/formUtils"; const validationSchema = Yup.object({ name: nameValidator("Name"), diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx index c568cca813..7ce28007cd 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx @@ -2,7 +2,6 @@ import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { deleteOrganizationRole, organizationRoles } from "#/api/queries/roles"; import type { Role } from "#/api/typesGenerated"; @@ -17,6 +16,7 @@ import { Stack } from "#/components/Stack/Stack"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { CustomRolesPageView } from "./CustomRolesPageView"; const CustomRolesPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx index c1d263ca66..24209e2a3a 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx @@ -3,7 +3,6 @@ import Skeleton from "@mui/material/Skeleton"; import { EllipsisVertical, PlusIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink, useNavigate } from "react-router"; -import { docs } from "utils/docs"; import type { AssignableRoles, Role } from "#/api/typesGenerated"; import { Button, Button as ShadcnButton } from "#/components/Button/Button"; import { ChooseOne, Cond } from "#/components/Conditionals/ChooseOne"; @@ -28,6 +27,7 @@ import { TableLoaderSkeleton, TableRowSkeleton, } from "#/components/TableLoader/TableLoader"; +import { docs } from "#/utils/docs"; import { PermissionPillsList } from "./PermissionPillsList"; interface CustomRolesPageViewProps { diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx index f40a682e38..2bea295b5f 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx @@ -1,8 +1,6 @@ import { useFormik } from "formik"; import { Plus, Trash, TriangleAlert } from "lucide-react"; import { type FC, type KeyboardEventHandler, useId, useState } from "react"; -import { docs } from "utils/docs"; -import { isUUID } from "utils/uuid"; import * as Yup from "yup"; import type { Group, @@ -42,6 +40,8 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { isEveryoneGroup } from "#/modules/groups"; +import { docs } from "#/utils/docs"; +import { isUUID } from "#/utils/uuid"; import { ExportPolicyButton } from "./ExportPolicyButton"; import { IdpMappingTable } from "./IdpMappingTable"; import { IdpPillList } from "./IdpPillList"; diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpMappingTable.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpMappingTable.tsx index fdcab9e1f2..4b63c07073 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpMappingTable.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpMappingTable.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { ChooseOne, Cond } from "#/components/Conditionals/ChooseOne"; import { EmptyState } from "#/components/EmptyState/EmptyState"; import { Link } from "#/components/Link/Link"; @@ -10,6 +9,7 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { docs } from "#/utils/docs"; interface IdpMappingTableProps { type: "Role" | "Group"; diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpPillList.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpPillList.tsx index 7668646eaf..8bb6fb5f83 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpPillList.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpPillList.tsx @@ -1,13 +1,13 @@ import type { Interpolation, Theme } from "@emotion/react"; import Stack from "@mui/material/Stack"; import type { FC } from "react"; -import { isUUID } from "utils/uuid"; import { Pill } from "#/components/Pill/Pill"; import { Tooltip, TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { isUUID } from "#/utils/uuid"; interface PillListProps { roles: readonly string[]; diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx index 3ba8fdcad8..058ea6c7a9 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx @@ -2,8 +2,6 @@ import { type FC, useEffect, useState } from "react"; import { useMutation, useQueries, useQuery, useQueryClient } from "react-query"; import { useParams, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { groupsByOrganization } from "#/api/queries/groups"; import { @@ -21,6 +19,8 @@ import { PaywallPremium } from "#/components/Paywall/PaywallPremium"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import IdpSyncPageView from "./IdpSyncPageView"; const IdpSyncPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx index 739965f982..a82da42200 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx @@ -2,7 +2,6 @@ import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useParams, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorMessage } from "#/api/errors"; import { groupsByUserIdInOrganization } from "#/api/queries/groups"; import { @@ -25,6 +24,7 @@ import { shouldShowAISeatColumn } from "#/modules/dashboard/entitlements"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { OrganizationMembersPageView } from "./OrganizationMembersPageView"; const OrganizationMembersPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx index df1b4c24a7..a76a89467a 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx @@ -1,8 +1,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, userEvent, within } from "storybook/test"; -import { daysAgo } from "utils/time"; import { Table, TableBody } from "#/components/Table/Table"; import { MockProvisionerJob } from "#/testHelpers/entities"; +import { daysAgo } from "#/utils/time"; import { JobRow } from "./JobRow"; const meta: Meta = { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx index f3acfa8d2f..91efd394e1 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx @@ -1,8 +1,6 @@ import { ChevronRightIcon, TriangleAlertIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; -import { relativeTime } from "utils/time"; import type { ProvisionerJob } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { Badge } from "#/components/Badge/Badge"; @@ -14,6 +12,8 @@ import { ProvisionerTags, ProvisionerTruncateTags, } from "#/modules/provisioners/ProvisionerTags"; +import { cn } from "#/utils/cn"; +import { relativeTime } from "#/utils/time"; import { CancelJobButton } from "./CancelJobButton"; type JobRowProps = { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx index a99d672fe3..49c647ad9a 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; import { expect, fn, userEvent, waitFor, within } from "storybook/test"; -import { daysAgo } from "utils/time"; import type { ProvisionerJob } from "#/api/typesGenerated"; import { MockOrganization, MockProvisionerJob } from "#/testHelpers/entities"; +import { daysAgo } from "#/utils/time"; import OrganizationProvisionerJobsPageView from "./OrganizationProvisionerJobsPageView"; const MockProvisionerJobs: ProvisionerJob[] = Array.from( diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.tsx index 0898781d7c..3e6deb8b9e 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.tsx @@ -1,7 +1,5 @@ import { XIcon } from "lucide-react"; import type { FC } from "react"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import type { Organization, ProvisionerJob, @@ -43,6 +41,8 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { JobRow } from "./JobRow"; const variantByStatus: Record< diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx index 207effb139..a0c01a2f0b 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx @@ -1,12 +1,12 @@ import type { FC } from "react"; import { useQuery } from "react-query"; import { useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { provisionerDaemonGroups } from "#/api/queries/organizations"; import { EmptyState } from "#/components/EmptyState/EmptyState"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { OrganizationProvisionerKeysPageView } from "./OrganizationProvisionerKeysPageView"; const OrganizationProvisionerKeysPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.tsx index 188d3996b3..104b9ffdf2 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { type ProvisionerKeyDaemons, ProvisionerKeyIDBuiltIn, @@ -24,6 +23,7 @@ import { TableHeader, TableRow, } from "#/components/Table/Table"; +import { docs } from "#/utils/docs"; import { ProvisionerKeyRow } from "./ProvisionerKeyRow"; // If the user using provisioner keys for external provisioners you're unlikely to diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx index fd59e45571..b52633e1c4 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx @@ -1,8 +1,6 @@ import { ChevronRightIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; -import { relativeTime } from "utils/time"; import type { ProvisionerDaemon, ProvisionerKey } from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; import { Button } from "#/components/Button/Button"; @@ -12,6 +10,8 @@ import { ProvisionerTags, ProvisionerTruncateTags, } from "#/modules/provisioners/ProvisionerTags"; +import { cn } from "#/utils/cn"; +import { relativeTime } from "#/utils/time"; type ProvisionerKeyRowProps = { readonly provisionerKey: ProvisionerKey; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx index 744b359c24..f164008797 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx @@ -1,7 +1,6 @@ import type { FC } from "react"; import { useQuery } from "react-query"; import { useParams, useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { buildInfo } from "#/api/queries/buildInfo"; import { provisionerDaemons } from "#/api/queries/organizations"; import { EmptyState } from "#/components/EmptyState/EmptyState"; @@ -9,6 +8,7 @@ import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { OrganizationProvisionersPageView } from "./OrganizationProvisionersPageView"; const OrganizationProvisionersPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx index a3cfb693a8..dce453dbda 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx @@ -1,6 +1,5 @@ import { XIcon } from "lucide-react"; import type { FC } from "react"; -import { docs } from "utils/docs"; import type { ProvisionerDaemon } from "#/api/typesGenerated"; import { Badge } from "#/components/Badge/Badge"; import { Button } from "#/components/Button/Button"; @@ -27,6 +26,7 @@ import { TooltipContent, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; import { LastConnectionHead } from "./LastConnectionHead"; import { ProvisionerRow } from "./ProvisionerRow"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx index 5f6cd9bb84..850d8554c1 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx @@ -2,8 +2,6 @@ import { ChevronRightIcon } from "lucide-react"; import { ProvisionerKey } from "pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; -import { relativeTime } from "utils/time"; import type { ProvisionerDaemon, ProvisionerDaemonStatus, @@ -21,6 +19,8 @@ import { ProvisionerTags, ProvisionerTruncateTags, } from "#/modules/provisioners/ProvisionerTags"; +import { cn } from "#/utils/cn"; +import { relativeTime } from "#/utils/time"; import { ProvisionerVersion } from "./ProvisionerVersion"; const variantByStatus: Record< diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx index cef0ca031b..3663d7e926 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx @@ -2,7 +2,6 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { deleteOrganization, @@ -14,6 +13,7 @@ import type { ShareableWorkspaceOwners } from "#/api/typesGenerated"; import { EmptyState } from "#/components/EmptyState/EmptyState"; import { useOrganizationSettings } from "#/modules/management/OrganizationSettingsLayout"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { pageTitle } from "#/utils/page"; import { OrganizationSettingsPageView } from "./OrganizationSettingsPageView"; const sharingUpdatedToastLabels: Record = { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx index 9eb87aa8a9..15e54014bd 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.tsx @@ -1,12 +1,6 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { type FC, useState } from "react"; -import { - displayNameValidator, - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { isApiValidationError } from "#/api/errors"; import type { @@ -33,6 +27,12 @@ import { SettingsHeaderTitle, } from "#/components/SettingsHeader/SettingsHeader"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + displayNameValidator, + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; import { DisableWorkspaceSharingDialog } from "./DisableWorkspaceSharingDialog"; import { HorizontalContainer, HorizontalSection } from "./Horizontal"; diff --git a/site/src/pages/OrganizationSettingsPage/UserTable/TableColumnHelpTooltip.tsx b/site/src/pages/OrganizationSettingsPage/UserTable/TableColumnHelpTooltip.tsx index 8b73dd01b9..52ba6b2fce 100644 --- a/site/src/pages/OrganizationSettingsPage/UserTable/TableColumnHelpTooltip.tsx +++ b/site/src/pages/OrganizationSettingsPage/UserTable/TableColumnHelpTooltip.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { docs } from "#/utils/docs"; type ColumnHeader = "roles" | "groups" | "ai_addon"; diff --git a/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx b/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx index ad6150380c..cd0e6aceeb 100644 --- a/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx +++ b/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx @@ -3,9 +3,6 @@ import type { FC } from "react"; import { useMutation } from "react-query"; import { Link as RouterLink, useNavigate, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { getApplicationName } from "utils/appearance"; -import { getFormHelpers } from "utils/formUtils"; -import { pageTitle } from "utils/page"; import * as yup from "yup"; import { isApiValidationError } from "#/api/errors"; import { changePasswordWithOTP } from "#/api/queries/users"; @@ -15,6 +12,9 @@ import { CustomLogo } from "#/components/CustomLogo/CustomLogo"; import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; import { Spinner } from "#/components/Spinner/Spinner"; +import { getApplicationName } from "#/utils/appearance"; +import { getFormHelpers } from "#/utils/formUtils"; +import { pageTitle } from "#/utils/page"; const validationSchema = yup.object({ password: yup.string().required("Password is required"), diff --git a/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx b/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx index dc97661d8b..d54ddfcb0b 100644 --- a/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx +++ b/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx @@ -2,9 +2,6 @@ import { useFormik } from "formik"; import type { FC } from "react"; import { useMutation } from "react-query"; import { Link as RouterLink, useSearchParams } from "react-router"; -import { getApplicationName } from "utils/appearance"; -import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; -import { pageTitle } from "utils/page"; import * as Yup from "yup"; import { requestOneTimePassword } from "#/api/queries/users"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -13,6 +10,9 @@ import { CustomLogo } from "#/components/CustomLogo/CustomLogo"; import { Input } from "#/components/Input/Input"; import { Label } from "#/components/Label/Label"; import { Spinner } from "#/components/Spinner/Spinner"; +import { getApplicationName } from "#/utils/appearance"; +import { getFormHelpers, onChangeTrimmed } from "#/utils/formUtils"; +import { pageTitle } from "#/utils/page"; const RequestOTPPage: FC = () => { const applicationName = getApplicationName(); diff --git a/site/src/pages/SetupPage/SetupPage.tsx b/site/src/pages/SetupPage/SetupPage.tsx index 23919c75da..9b4b812f10 100644 --- a/site/src/pages/SetupPage/SetupPage.tsx +++ b/site/src/pages/SetupPage/SetupPage.tsx @@ -2,12 +2,12 @@ import { useAuthContext } from "contexts/auth/AuthProvider"; import { type FC, useEffect, useRef } from "react"; import { useMutation, useQuery } from "react-query"; import { Navigate } from "react-router"; -import { pageTitle } from "utils/page"; -import { sendDeploymentEvent } from "utils/telemetry"; import { buildInfo } from "#/api/queries/buildInfo"; import { authMethods, createFirstUser } from "#/api/queries/users"; import { Loader } from "#/components/Loader/Loader"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; +import { pageTitle } from "#/utils/page"; +import { sendDeploymentEvent } from "#/utils/telemetry"; import { SetupPageView } from "./SetupPageView"; export const SetupPage: FC = () => { diff --git a/site/src/pages/SetupPage/SetupPageView.tsx b/site/src/pages/SetupPage/SetupPageView.tsx index e6f8ded129..58866ffedb 100644 --- a/site/src/pages/SetupPage/SetupPageView.tsx +++ b/site/src/pages/SetupPage/SetupPageView.tsx @@ -6,11 +6,6 @@ import TextField from "@mui/material/TextField"; import { isAxiosError } from "axios"; import { type FormikContextType, useFormik } from "formik"; import type { ChangeEvent, FC } from "react"; -import { - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { countries } from "#/api/countriesGenerated"; import type * as TypesGen from "#/api/typesGenerated"; @@ -23,6 +18,11 @@ import { PasswordField } from "#/components/PasswordField/PasswordField"; import { SignInLayout } from "#/components/SignInLayout/SignInLayout"; import { Spinner } from "#/components/Spinner/Spinner"; import { Stack } from "#/components/Stack/Stack"; +import { + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; export const Language = { emailLabel: "Email", diff --git a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx index 0a16ac1d7f..a15ddb8d93 100644 --- a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx +++ b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx @@ -1,8 +1,8 @@ import type { FC } from "react"; import { useQuery } from "react-query"; import { useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { templateExamples } from "#/api/queries/templates"; +import { pageTitle } from "#/utils/page"; import { StarterTemplatePageView } from "./StarterTemplatePageView"; const StarterTemplatePage: FC = () => { diff --git a/site/src/pages/TaskPage/TaskAppIframe.tsx b/site/src/pages/TaskPage/TaskAppIframe.tsx index 4e7123fcf8..4b6a8f34c8 100644 --- a/site/src/pages/TaskPage/TaskAppIframe.tsx +++ b/site/src/pages/TaskPage/TaskAppIframe.tsx @@ -2,7 +2,6 @@ import { useProxy } from "contexts/ProxyContext"; import { EllipsisVertical, ExternalLinkIcon, HouseIcon } from "lucide-react"; import { type FC, type HTMLProps, useRef } from "react"; import { Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; import type { Workspace } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { @@ -14,6 +13,7 @@ import { import { Spinner } from "#/components/Spinner/Spinner"; import { useAppLink } from "#/modules/apps/useAppLink"; import type { WorkspaceAppWithAgent } from "#/modules/tasks/apps"; +import { cn } from "#/utils/cn"; import { TaskWildcardWarning } from "./TaskWildcardWarning"; type TaskAppIFrameProps = { diff --git a/site/src/pages/TaskPage/TaskApps.tsx b/site/src/pages/TaskPage/TaskApps.tsx index 946e8d386c..8dd41bb0e3 100644 --- a/site/src/pages/TaskPage/TaskApps.tsx +++ b/site/src/pages/TaskPage/TaskApps.tsx @@ -1,8 +1,6 @@ import { ChevronDownIcon, LayoutGridIcon, TerminalIcon } from "lucide-react"; import { type FC, useState } from "react"; import { type LinkProps, Link as RouterLink } from "react-router"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import type { Task, Workspace } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { @@ -21,6 +19,8 @@ import { getAllAppsWithAgent, type WorkspaceAppWithAgent, } from "#/modules/tasks/apps"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; import { TaskAppIFrame, TaskIframe } from "./TaskAppIframe"; type TaskAppsProps = { diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index 01d7ed1035..e07e239bf7 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -20,9 +20,6 @@ import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; import { Link as RouterLink, useParams } from "react-router"; import type { FixedSizeList } from "react-window"; import { toast } from "sonner"; -import { cn } from "utils/cn"; -import { pageTitle } from "utils/page"; -import { relativeTime } from "utils/time"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage, isApiError } from "#/api/errors"; import { pauseTask, resumeTask, taskLogs } from "#/api/queries/tasks"; @@ -54,6 +51,9 @@ import { isPauseDisabled } from "#/modules/tasks/taskActions"; import { WorkspaceErrorDialog } from "#/modules/workspaces/ErrorDialog/WorkspaceErrorDialog"; import { WorkspaceBuildLogs } from "#/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs"; import { WorkspaceOutdatedTooltip } from "#/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip"; +import { cn } from "#/utils/cn"; +import { pageTitle } from "#/utils/page"; +import { relativeTime } from "#/utils/time"; import { getActiveTransitionStats, WorkspaceBuildProgress, diff --git a/site/src/pages/TaskPage/TaskStartupWarningButton.tsx b/site/src/pages/TaskPage/TaskStartupWarningButton.tsx index c8de6f141b..38cd6fd34f 100644 --- a/site/src/pages/TaskPage/TaskStartupWarningButton.tsx +++ b/site/src/pages/TaskPage/TaskStartupWarningButton.tsx @@ -1,6 +1,5 @@ import { TriangleAlertIcon } from "lucide-react"; import type { FC } from "react"; -import { docs } from "utils/docs"; import type { WorkspaceAgentLifecycle } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { Link } from "#/components/Link/Link"; @@ -10,6 +9,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { docs } from "#/utils/docs"; type TaskStartupWarningButtonProps = { lifecycleState?: WorkspaceAgentLifecycle | null; diff --git a/site/src/pages/TaskPage/TaskWildcardWarning.tsx b/site/src/pages/TaskPage/TaskWildcardWarning.tsx index b41c974342..04095e8a9d 100644 --- a/site/src/pages/TaskPage/TaskWildcardWarning.tsx +++ b/site/src/pages/TaskPage/TaskWildcardWarning.tsx @@ -1,8 +1,8 @@ import { SquareArrowOutUpRightIcon } from "lucide-react"; import { Link as RouterLink } from "react-router"; -import { docs } from "utils/docs"; import { Button } from "#/components/Button/Button"; import { useAuthenticated } from "#/hooks/useAuthenticated"; +import { docs } from "#/utils/docs"; export const TaskWildcardWarning = () => { const { permissions } = useAuthenticated(); diff --git a/site/src/pages/TasksPage/TasksPage.tsx b/site/src/pages/TasksPage/TasksPage.tsx index 671fae47ee..4f9d1347b3 100644 --- a/site/src/pages/TasksPage/TasksPage.tsx +++ b/site/src/pages/TasksPage/TasksPage.tsx @@ -2,8 +2,6 @@ import { useAuthenticated } from "hooks"; import { ChevronDownIcon, TrashIcon } from "lucide-react"; import { type FC, useState } from "react"; import { useMutation, useQueries, useQuery, useQueryClient } from "react-query"; -import { cn } from "utils/cn"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { systemNotificationTemplates, @@ -41,6 +39,8 @@ import { selectDisabledPreferences, } from "#/modules/notifications/utils"; import { TaskPrompt } from "#/modules/tasks/TaskPrompt/TaskPrompt"; +import { cn } from "#/utils/cn"; +import { pageTitle } from "#/utils/page"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; import { useBatchTaskActions } from "./batchActions"; import { TasksTable } from "./TasksTable"; diff --git a/site/src/pages/TasksPage/TasksTable.tsx b/site/src/pages/TasksPage/TasksTable.tsx index 4096c24317..308ead37ad 100644 --- a/site/src/pages/TasksPage/TasksTable.tsx +++ b/site/src/pages/TasksPage/TasksTable.tsx @@ -4,7 +4,6 @@ import { type FC, type ReactNode, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate } from "react-router"; import { toast } from "sonner"; -import { relativeTime } from "utils/time"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { pauseTask, resumeTask } from "#/api/queries/tasks"; import type { Task } from "#/api/typesGenerated"; @@ -40,6 +39,7 @@ import { canResumeTask, isPauseDisabled, } from "#/modules/tasks/taskActions"; +import { relativeTime } from "#/utils/time"; type TasksTableProps = { tasks: readonly Task[] | undefined; diff --git a/site/src/pages/TasksPage/UsersCombobox.tsx b/site/src/pages/TasksPage/UsersCombobox.tsx index 89f9525a9f..db5e8ce23e 100644 --- a/site/src/pages/TasksPage/UsersCombobox.tsx +++ b/site/src/pages/TasksPage/UsersCombobox.tsx @@ -3,7 +3,6 @@ import { useAuthenticated } from "hooks"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { cn } from "utils/cn"; import { users } from "#/api/queries/users"; import type { User } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -22,6 +21,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { useDebouncedValue } from "#/hooks/debounce"; +import { cn } from "#/utils/cn"; type UserOption = { label: string; diff --git a/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx b/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx index 4f3982830b..4070165b1f 100644 --- a/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateDocsPage/TemplateDocsPage.tsx @@ -1,8 +1,8 @@ import { useTheme } from "@emotion/react"; import frontMatter from "front-matter"; import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; -import { pageTitle } from "utils/page"; import { MemoizedMarkdown } from "#/components/Markdown/Markdown"; +import { pageTitle } from "#/utils/page"; export default function TemplateDocsPage() { const { template, activeVersion } = useTemplateLayoutContext(); diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx index 794c304163..6da89c3a2f 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx @@ -5,10 +5,6 @@ import { CheckIcon, CopyIcon } from "lucide-react"; import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, useEffect, useId, useState } from "react"; import { useQuery } from "react-query"; -import { nameValidator } from "utils/formUtils"; -import { pageTitle } from "utils/page"; -import { getInitialRichParameterValues } from "utils/richParameters"; -import { paramsUsedToCreateWorkspace } from "utils/workspace"; import { ValidationError } from "yup"; import { API } from "#/api/api"; import type { Template, TemplateVersionParameter } from "#/api/typesGenerated"; @@ -20,6 +16,10 @@ import { Loader } from "#/components/Loader/Loader"; import { RichParameterInput } from "#/components/RichParameterInput/RichParameterInput"; import { useDebouncedFunction } from "#/hooks/debounce"; import { useClipboard } from "#/hooks/useClipboard"; +import { nameValidator } from "#/utils/formUtils"; +import { pageTitle } from "#/utils/page"; +import { getInitialRichParameterValues } from "#/utils/richParameters"; +import { paramsUsedToCreateWorkspace } from "#/utils/workspace"; type ButtonValues = Record; diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx index 30c6e17292..3b144ca640 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageExperimental.tsx @@ -2,7 +2,6 @@ import { useAuthenticated } from "hooks"; import { CheckIcon, CopyIcon } from "lucide-react"; import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import { type FC, useEffect, useMemo, useRef, useState } from "react"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { DetailedError } from "#/api/errors"; import type { @@ -24,6 +23,7 @@ import { Diagnostics, DynamicParameter, } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; +import { pageTitle } from "#/utils/page"; type ButtonValues = Record; diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx index c86eddde93..588ddbfbc9 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx @@ -19,15 +19,6 @@ import { } from "react"; import { useQuery } from "react-query"; import { type SetURLSearchParams, useSearchParams } from "react-router"; -import { cn } from "utils/cn"; -import { getLatencyColor } from "utils/latency"; -import { - addTime, - formatDateTime, - startOfDay, - startOfHour, - subtractTime, -} from "utils/time"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { insightsTemplate, @@ -65,6 +56,15 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { RequirePermission } from "#/modules/permissions/RequirePermission"; +import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; +import { + addTime, + formatDateTime, + startOfDay, + startOfHour, + subtractTime, +} from "#/utils/time"; import { getTemplatePageTitle } from "../utils"; import { type InsightsInterval, IntervalMenu } from "./IntervalMenu"; import { lastWeeks } from "./utils"; diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/utils.ts b/site/src/pages/TemplatePage/TemplateInsightsPage/utils.ts index 965d6c03d3..28f1289eec 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/utils.ts +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/utils.ts @@ -1,4 +1,4 @@ -import { startOfDay, subtractTime } from "utils/time"; +import { startOfDay, subtractTime } from "#/utils/time"; export const lastWeeks = (numberOfWeeks: number) => { const now = new Date(); diff --git a/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx b/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx index f55f881dd1..0a3adf5f07 100644 --- a/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx +++ b/site/src/pages/TemplatePage/TemplatePrebuildsPage/TemplatePrebuildsPage.tsx @@ -3,11 +3,11 @@ import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import type { FC } from "react"; import { useMutation } from "react-query"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import type { InvalidatePresetsResponse } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; +import { pageTitle } from "#/utils/page"; const TemplatePrebuildsPage: FC = () => { const { template } = useTemplateLayoutContext(); diff --git a/site/src/pages/TemplatePage/TemplateStats.tsx b/site/src/pages/TemplatePage/TemplateStats.tsx index c99109e965..d8f8441961 100644 --- a/site/src/pages/TemplatePage/TemplateStats.tsx +++ b/site/src/pages/TemplatePage/TemplateStats.tsx @@ -1,12 +1,12 @@ import type { FC } from "react"; import { Link } from "react-router"; -import { createDayString } from "utils/createDayString"; +import type { Template, TemplateVersion } from "#/api/typesGenerated"; +import { Stats, StatsItem } from "#/components/Stats/Stats"; +import { createDayString } from "#/utils/createDayString"; import { formatTemplateActiveDevelopers, formatTemplateBuildTime, -} from "utils/templates"; -import type { Template, TemplateVersion } from "#/api/typesGenerated"; -import { Stats, StatsItem } from "#/components/Stats/Stats"; +} from "#/utils/templates"; const Language = { usedByLabel: "Used by", diff --git a/site/src/pages/TemplatePage/utils.ts b/site/src/pages/TemplatePage/utils.ts index 770e214dcc..0579c68489 100644 --- a/site/src/pages/TemplatePage/utils.ts +++ b/site/src/pages/TemplatePage/utils.ts @@ -1,5 +1,5 @@ -import { pageTitle } from "utils/page"; import type { Template } from "#/api/typesGenerated"; +import { pageTitle } from "#/utils/page"; export const getTemplatePageTitle = (title: string, template: Template) => { return pageTitle( diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx index 87bece58ac..881ffde3b6 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx @@ -5,14 +5,6 @@ import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { type FormikTouched, useFormik } from "formik"; import type { FC } from "react"; -import { docs } from "utils/docs"; -import { - displayNameValidator, - getFormHelpers, - iconValidator, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { CORSBehaviors, @@ -36,6 +28,14 @@ import { StackLabel, StackLabelHelperText, } from "#/components/StackLabel/StackLabel"; +import { docs } from "#/utils/docs"; +import { + displayNameValidator, + getFormHelpers, + iconValidator, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; const MAX_DESCRIPTION_CHAR_LIMIT = 128; const MAX_DESCRIPTION_MESSAGE = `Please enter a description that is no longer than ${MAX_DESCRIPTION_CHAR_LIMIT} characters.`; diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index b899a690e6..baeacbeac6 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -2,13 +2,13 @@ import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { templateByNameKey } from "#/api/queries/templates"; import type { UpdateTemplateMeta } from "#/api/typesGenerated"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import { pageTitle } from "#/utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx index e902c7c97b..d51dc43d3d 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx @@ -1,8 +1,6 @@ import type { FC } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { setGroupRole, @@ -11,6 +9,8 @@ import { } from "#/api/queries/templates"; import { PaywallPremium } from "#/components/Paywall/PaywallPremium"; import { useFeatureVisibility } from "#/modules/dashboard/useFeatureVisibility"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplatePermissionsPageView } from "./TemplatePermissionsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/UserOrGroupAutocomplete.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/UserOrGroupAutocomplete.tsx index b576d2ba14..00927318e0 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/UserOrGroupAutocomplete.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/UserOrGroupAutocomplete.tsx @@ -1,12 +1,12 @@ import { Check } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { prepareQuery } from "utils/filters"; import { templaceACLAvailable } from "#/api/queries/templates"; import type { Group, ReducedUser } from "#/api/typesGenerated"; import { Autocomplete } from "#/components/Autocomplete/Autocomplete"; import { AvatarData } from "#/components/Avatar/AvatarData"; import { getGroupSubtitle, isGroup } from "#/modules/groups"; +import { prepareQuery } from "#/utils/filters"; export type UserOrGroupAutocompleteValue = ReducedUser | Group | null; type AutocompleteOption = Exclude; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/AutostopRequirementHelperText.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/AutostopRequirementHelperText.tsx index 5abecc436d..54c615ad48 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/AutostopRequirementHelperText.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/AutostopRequirementHelperText.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import type { TemplateAutostopRequirementDaysValue } from "utils/schedule"; import type { Template } from "#/api/typesGenerated"; +import type { TemplateAutostopRequirementDaysValue } from "#/utils/schedule"; const autostopRequirementDescriptions = { off: "Workspaces are not required to stop periodically.", diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TTLHelperText.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TTLHelperText.tsx index d2c4aff778..90a1606d35 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TTLHelperText.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TTLHelperText.tsx @@ -1,4 +1,4 @@ -import { humanDuration } from "utils/time"; +import { humanDuration } from "#/utils/time"; const hours = (h: number) => (h === 1 ? "hour" : "hours"); diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx index 89e55b3fb5..ae1bae332a 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; import { userEvent, within } from "storybook/test"; -import type { TemplateAutostartRequirementDaysValue } from "utils/schedule"; +import type { TemplateAutostartRequirementDaysValue } from "#/utils/schedule"; import { TemplateScheduleAutostart } from "./TemplateScheduleAutostart"; const meta: Meta = { diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx index c1d1719af7..731f903354 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.tsx @@ -1,11 +1,11 @@ import FormHelperText from "@mui/material/FormHelperText"; import type { FC } from "react"; +import { Button } from "#/components/Button/Button"; +import { Stack } from "#/components/Stack/Stack"; import { sortedDays, type TemplateAutostartRequirementDaysValue, -} from "utils/schedule"; -import { Button } from "#/components/Button/Button"; -import { Stack } from "#/components/Stack/Stack"; +} from "#/utils/schedule"; interface TemplateScheduleAutostartProps { enabled: boolean; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleForm.tsx index a0637e595b..7e2b34d2bd 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleForm.tsx @@ -2,11 +2,6 @@ import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { type FormikTouched, useFormik } from "formik"; import { type FC, useEffect, useState } from "react"; -import { getFormHelpers } from "utils/formUtils"; -import { - calculateAutostopRequirementDaysValue, - type TemplateAutostartRequirementDaysValue, -} from "utils/schedule"; import type { Template, UpdateTemplateMeta } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { Checkbox } from "#/components/Checkbox/Checkbox"; @@ -24,6 +19,11 @@ import { StackLabelHelperText, } from "#/components/StackLabel/StackLabel"; import { Switch } from "#/components/Switch/Switch"; +import { getFormHelpers } from "#/utils/formUtils"; +import { + calculateAutostopRequirementDaysValue, + type TemplateAutostartRequirementDaysValue, +} from "#/utils/schedule"; import { AutostopRequirementDaysHelperText, AutostopRequirementWeeksHelperText, diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index 495fa41331..f2f10bc794 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -2,12 +2,12 @@ import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { templateByNameKey } from "#/api/queries/templates"; import type { UpdateTemplateMeta } from "#/api/typesGenerated"; 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"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/formHelpers.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/formHelpers.tsx index 99d97da2ec..f948e1dd1d 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/formHelpers.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/formHelpers.tsx @@ -1,9 +1,9 @@ +import * as Yup from "yup"; +import type { UpdateTemplateMeta } from "#/api/typesGenerated"; import type { TemplateAutostartRequirementDaysValue, TemplateAutostopRequirementDaysValue, -} from "utils/schedule"; -import * as Yup from "yup"; -import type { UpdateTemplateMeta } from "#/api/typesGenerated"; +} from "#/utils/schedule"; export interface TemplateScheduleFormValues extends Omit< diff --git a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx index 8d613cded1..8a8fac6e11 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx @@ -1,7 +1,6 @@ import { createContext, type FC, Suspense, useContext } from "react"; import { useQuery } from "react-query"; import { Outlet, useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { checkAuthorization } from "#/api/queries/authCheck"; import { templateByName } from "#/api/queries/templates"; import type { AuthorizationResponse, Template } from "#/api/typesGenerated"; @@ -9,6 +8,7 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Loader } from "#/components/Loader/Loader"; import { Margins } from "#/components/Margins/Margins"; import { Stack } from "#/components/Stack/Stack"; +import { pageTitle } from "#/utils/page"; import { Sidebar } from "./Sidebar"; const TemplateSettings = createContext< diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesForm.tsx index 5551a11d9f..6cd0bef4e3 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesForm.tsx @@ -1,6 +1,5 @@ import { type FormikContextType, type FormikTouched, useFormik } from "formik"; import type { FC } from "react"; -import { type FormHelpers, getFormHelpers } from "utils/formUtils"; import * as Yup from "yup"; import type { CreateTemplateVersionRequest, @@ -16,6 +15,7 @@ import { HorizontalForm, } from "#/components/Form/Form"; import { Spinner } from "#/components/Spinner/Spinner"; +import { type FormHelpers, getFormHelpers } from "#/utils/formUtils"; import { SensitiveVariableHelperText, TemplateVariableField, diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx index 9544e618e2..2970c5bb83 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx @@ -7,7 +7,6 @@ import { } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { createAndBuildTemplateVersion, templateVersion, @@ -22,6 +21,7 @@ import type { import { ErrorAlert } from "#/components/Alert/ErrorAlert"; 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"; diff --git a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx index 5cfe68e670..05a0461306 100644 --- a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx +++ b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx @@ -1,8 +1,8 @@ import TextField from "@mui/material/TextField"; import { type ChangeEvent, type FC, useState } from "react"; -import { type FileTree, isFolder, validatePath } from "utils/filetree"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import { Stack } from "#/components/Stack/Stack"; +import { type FileTree, isFolder, validatePath } from "#/utils/filetree"; interface CreateFileDialogProps { onClose: () => void; diff --git a/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.tsx b/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.tsx index 8d8616a13a..5979ac62b0 100644 --- a/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.tsx +++ b/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.tsx @@ -1,7 +1,6 @@ import Link from "@mui/material/Link"; import useTheme from "@mui/system/useTheme"; import type { FC } from "react"; -import { docs } from "utils/docs"; import type { ProvisionerDaemon } from "#/api/typesGenerated"; import { ChevronDownIcon } from "#/components/AnimatedIcons/ChevronDown"; import { FormSection } from "#/components/Form/Form"; @@ -12,6 +11,7 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { ProvisionerTagsField } from "#/modules/provisioners/ProvisionerTagsField"; +import { docs } from "#/utils/docs"; interface ProvisionerTagsPopoverProps { tags: ProvisionerDaemon["tags"]; diff --git a/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx b/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx index a5f33cfc74..8fa81c3f4f 100644 --- a/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx +++ b/site/src/pages/TemplateVersionEditorPage/PublishTemplateVersionDialog.tsx @@ -4,12 +4,12 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import type { PublishVersionData } from "pages/TemplateVersionEditorPage/types"; import type { FC } from "react"; -import { getFormHelpers } from "utils/formUtils"; import * as Yup from "yup"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import type { DialogProps } from "#/components/Dialogs/Dialog"; import { FormFields } from "#/components/Form/Form"; import { Stack } from "#/components/Stack/Stack"; +import { getFormHelpers } from "#/utils/formUtils"; import { HelpTooltip, HelpTooltipContent, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index 676e14b15c..eb45d6eb45 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -15,17 +15,6 @@ import { unstable_usePrompt as usePrompt, } from "react-router"; import { toast } from "sonner"; -import { cn } from "utils/cn"; -import { - createFile, - existsFile, - type FileTree, - getFileText, - isFolder, - moveFile, - removeFile, - updateFile, -} from "utils/filetree"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import type { ProvisionerJobLog, @@ -63,6 +52,17 @@ import { isBinaryData } from "#/modules/templates/TemplateFiles/isBinaryData"; import { TemplateFileTree } from "#/modules/templates/TemplateFiles/TemplateFileTree"; import { TemplateResourcesTable } from "#/modules/templates/TemplateResourcesTable/TemplateResourcesTable"; import { WorkspaceBuildLogs } from "#/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs"; +import { cn } from "#/utils/cn"; +import { + createFile, + existsFile, + type FileTree, + getFileText, + isFolder, + moveFile, + removeFile, + updateFile, +} from "#/utils/filetree"; import { CreateFileDialog, DeleteFileDialog, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index 4d18068dea..7ca72eef3f 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -6,7 +6,6 @@ import WS from "jest-websocket-mock"; import { HttpResponse, http } from "msw"; import { QueryClient } from "react-query"; import { createMemoryRouter, RouterProvider } from "react-router"; -import type { FileTree } from "utils/filetree"; import * as apiModule from "#/api/api"; import { templateVersionVariablesKey } from "#/api/queries/templates"; import type { TemplateVersion } from "#/api/typesGenerated"; @@ -23,6 +22,7 @@ import { waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; import { server } from "#/testHelpers/server"; +import type { FileTree } from "#/utils/filetree"; import type { MonacoEditorProps } from "./MonacoEditor"; import { Language } from "./PublishTemplateVersionDialog"; import TemplateVersionEditorPage, { diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx index 487bd697cf..2f52826332 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx @@ -7,10 +7,6 @@ import { } from "react-query"; import { useNavigate, useParams, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { existsFile, type FileTree, traverse } from "utils/filetree"; -import { pageTitle } from "utils/page"; -import { TarReader, TarWriter } from "utils/tar"; -import { createTemplateVersionFileTree } from "utils/templateVersion"; import { API } from "#/api/api"; import { getErrorDetail } from "#/api/errors"; import { file, uploadFile } from "#/api/queries/files"; @@ -29,6 +25,10 @@ import type { import { Loader } from "#/components/Loader/Loader"; import { linkToTemplate, useLinks } from "#/modules/navigation"; import { useWatchVersionLogs } from "#/modules/templates/useWatchVersionLogs"; +import { existsFile, type FileTree, traverse } from "#/utils/filetree"; +import { pageTitle } from "#/utils/page"; +import { TarReader, TarWriter } from "#/utils/tar"; +import { createTemplateVersionFileTree } from "#/utils/templateVersion"; import { TemplateVersionEditor } from "./TemplateVersionEditor"; const TemplateVersionEditorPage: FC = () => { diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx index d73d233216..743c7c0d90 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx @@ -1,9 +1,9 @@ import { CheckIcon, CircleAlertIcon, HourglassIcon } from "lucide-react"; import type { FC, ReactNode } from "react"; -import { getPendingStatusLabel } from "utils/provisionerJob"; import type { TemplateVersion } from "#/api/typesGenerated"; import { Pill, PillSpinner } from "#/components/Pill/Pill"; import type { ThemeRole } from "#/theme/roles"; +import { getPendingStatusLabel } from "#/utils/provisionerJob"; interface TemplateVersionStatusBadgeProps { version: TemplateVersion; diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx index e9bd91d1e4..a5e3c7c9e0 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.jest.tsx @@ -1,10 +1,10 @@ import { screen, within } from "@testing-library/react"; -import * as CreateDayString from "utils/createDayString"; -import * as templateVersionUtils from "utils/templateVersion"; import { renderWithAuth, waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; +import * as CreateDayString from "#/utils/createDayString"; +import * as templateVersionUtils from "#/utils/templateVersion"; import TemplateVersionPage from "./TemplateVersionPage"; const TEMPLATE_NAME = "coder-ts"; diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index e102c06e55..6e9cdb2b69 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -2,7 +2,6 @@ import { useAuthenticated } from "hooks"; import { type FC, useMemo } from "react"; import { useQuery } from "react-query"; import { useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { templateByName, templateFiles, @@ -10,6 +9,7 @@ import { templateVersionByName, } from "#/api/queries/templates"; import { linkToTemplate, useLinks } from "#/modules/navigation"; +import { pageTitle } from "#/utils/page"; import { TemplateVersionPageView } from "./TemplateVersionPageView"; const TemplateVersionPage: FC = () => { diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx index 7edce8c955..41a265cf16 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx @@ -1,8 +1,6 @@ import { EditIcon, ExternalLinkIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; -import { createDayString } from "utils/createDayString"; -import type { TemplateVersionFiles } from "utils/templateVersion"; import type { TemplateVersion } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; @@ -18,6 +16,8 @@ import { Stats, StatsItem } from "#/components/Stats/Stats"; import { linkToTemplate, useLinks } from "#/modules/navigation"; import { TemplateFiles } from "#/modules/templates/TemplateFiles/TemplateFiles"; import { TemplateUpdateMessage } from "#/modules/templates/TemplateUpdateMessage"; +import { createDayString } from "#/utils/createDayString"; +import type { TemplateVersionFiles } from "#/utils/templateVersion"; export interface TemplateVersionPageViewProps { organizationName: string; diff --git a/site/src/pages/TemplatesPage/EmptyTemplates.tsx b/site/src/pages/TemplatesPage/EmptyTemplates.tsx index fc4e44b544..8d19056ca6 100644 --- a/site/src/pages/TemplatesPage/EmptyTemplates.tsx +++ b/site/src/pages/TemplatesPage/EmptyTemplates.tsx @@ -1,13 +1,13 @@ import Link from "@mui/material/Link"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; -import { docs } from "utils/docs"; import type { TemplateExample } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; import { CodeExample } from "#/components/CodeExample/CodeExample"; import { Stack } from "#/components/Stack/Stack"; import { TableEmpty } from "#/components/TableEmpty/TableEmpty"; import { TemplateExampleCard } from "#/modules/templates/TemplateExampleCard/TemplateExampleCard"; +import { docs } from "#/utils/docs"; // Those are from https://github.com/coder/coder/tree/main/examples/templates const featuredExampleIds = [ diff --git a/site/src/pages/TemplatesPage/TemplatesPage.tsx b/site/src/pages/TemplatesPage/TemplatesPage.tsx index 880316b4aa..3f3887066f 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.tsx @@ -2,12 +2,12 @@ import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; import { useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; import { workspacePermissionsByOrganization } from "#/api/queries/organizations"; import { templateExamples, templates } from "#/api/queries/templates"; import { type UseFilterResult, useFilter } from "#/components/Filter/Filter"; import { useUserFilterMenu } from "#/components/Filter/UserFilter"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { pageTitle } from "#/utils/page"; import { TemplatesPageView } from "./TemplatesPageView"; const TemplatesPage: FC = () => { diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 84e65b7916..2a7ff8fb5e 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -3,12 +3,6 @@ import Skeleton from "@mui/material/Skeleton"; import { ArrowRightIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink, useNavigate } from "react-router"; -import { createDayString } from "utils/createDayString"; -import { docs } from "utils/docs"; -import { - formatTemplateActiveDevelopers, - formatTemplateBuildTime, -} from "utils/templates"; import { hasError, isApiValidationError } from "#/api/errors"; import type { Template, TemplateExample } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -48,6 +42,12 @@ import { import { useClickableTableRow } from "#/hooks/useClickableTableRow"; import { linkToTemplate, useLinks } from "#/modules/navigation"; import type { WorkspacePermissions } from "#/modules/permissions/workspaces"; +import { createDayString } from "#/utils/createDayString"; +import { docs } from "#/utils/docs"; +import { + formatTemplateActiveDevelopers, + formatTemplateBuildTime, +} from "#/utils/templates"; import { EmptyTemplates } from "./EmptyTemplates"; import { TemplatesFilter } from "./TemplatesFilter"; import type { TemplateFilterState } from "./TemplatesPage"; diff --git a/site/src/pages/TerminalPage/TerminalAlerts.tsx b/site/src/pages/TerminalPage/TerminalAlerts.tsx index c77631ae6f..74e12f7d40 100644 --- a/site/src/pages/TerminalPage/TerminalAlerts.tsx +++ b/site/src/pages/TerminalPage/TerminalAlerts.tsx @@ -1,7 +1,5 @@ import { RefreshCwIcon } from "lucide-react"; import { type FC, useEffect, useRef, useState } from "react"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; import type { WorkspaceAgent } from "#/api/typesGenerated"; import { Alert, @@ -10,6 +8,8 @@ import { } from "#/components/Alert/Alert"; import { Button } from "#/components/Button/Button"; import { Link } from "#/components/Link/Link"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; import type { ConnectionStatus } from "./types"; type TerminalAlertsProps = { diff --git a/site/src/pages/TerminalPage/TerminalPage.tsx b/site/src/pages/TerminalPage/TerminalPage.tsx index 53cd05454b..2cb9a852a9 100644 --- a/site/src/pages/TerminalPage/TerminalPage.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.tsx @@ -11,10 +11,6 @@ import { ThemeOverride } from "contexts/ThemeProvider"; import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { useQuery } from "react-query"; import { useNavigate, useParams, useSearchParams } from "react-router"; -import { pageTitle } from "utils/page"; -import { openMaybePortForwardedURL } from "utils/portForward"; -import { terminalWebsocketUrl } from "utils/terminal"; -import { getMatchingAgentOrFirst } from "utils/workspace"; import { v4 as uuidv4 } from "uuid"; // Use websocket-ts for better WebSocket handling and auto-reconnection. import { @@ -33,6 +29,10 @@ import { useClipboard } from "#/hooks/useClipboard"; import { useEmbeddedMetadata } from "#/hooks/useEmbeddedMetadata"; import themes from "#/theme"; import { DEFAULT_TERMINAL_FONT, terminalFonts } from "#/theme/constants"; +import { pageTitle } from "#/utils/page"; +import { openMaybePortForwardedURL } from "#/utils/portForward"; +import { terminalWebsocketUrl } from "#/utils/terminal"; +import { getMatchingAgentOrFirst } from "#/utils/workspace"; import { TerminalAlerts } from "./TerminalAlerts"; import type { ConnectionStatus } from "./types"; diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountForm.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountForm.tsx index bb8e867f3e..2660563c92 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountForm.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountForm.tsx @@ -1,17 +1,17 @@ import TextField from "@mui/material/TextField"; import { type FormikTouched, useFormik } from "formik"; import type { FC } from "react"; -import { - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import type { UpdateUserProfileRequest } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; import { Form, FormFields } from "#/components/Form/Form"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; export const Language = { usernameLabel: "Username", diff --git a/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.tsx b/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.tsx index 0b9b3ef13a..10ff71ab3d 100644 --- a/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.tsx +++ b/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { cn } from "utils/cn"; import { type TerminalFontName, TerminalFontNames, @@ -16,6 +15,7 @@ import { terminalFontLabels, terminalFonts, } from "#/theme/constants"; +import { cn } from "#/utils/cn"; import { Section } from "../Section"; // Display Geist Mono (the default monospace font) first, then the rest diff --git a/site/src/pages/UserSettingsPage/Layout.tsx b/site/src/pages/UserSettingsPage/Layout.tsx index 62c04865c6..b9cb113966 100644 --- a/site/src/pages/UserSettingsPage/Layout.tsx +++ b/site/src/pages/UserSettingsPage/Layout.tsx @@ -1,9 +1,9 @@ import { useAuthenticated } from "hooks"; import { type FC, Suspense } from "react"; import { Outlet } from "react-router"; -import { pageTitle } from "utils/page"; import { Loader } from "#/components/Loader/Loader"; import { Margins } from "#/components/Margins/Margins"; +import { pageTitle } from "#/utils/page"; import { Sidebar } from "./Sidebar"; const Layout: FC = () => { diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx index e43c31749d..d1f3b6e298 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -3,7 +3,6 @@ import { type FC, Fragment, useEffect } from "react"; import { useMutation, useQueries, useQuery, useQueryClient } from "react-query"; import { useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail } from "#/api/errors"; import { customNotificationTemplates, @@ -35,6 +34,7 @@ import { selectDisabledPreferences, } from "#/modules/notifications/utils"; import type { Permissions } from "#/modules/permissions"; +import { pageTitle } from "#/utils/page"; import { Section } from "../Section"; const NotificationsPage: FC = () => { diff --git a/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.tsx b/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.tsx index 0d61e88d71..e464f0b815 100644 --- a/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.tsx +++ b/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.tsx @@ -2,9 +2,6 @@ import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { type FormikContextType, useFormik } from "formik"; import { type FC, useEffect, useState } from "react"; -import { getFormHelpers } from "utils/formUtils"; -import { quietHoursDisplay, timeToCron, validTime } from "utils/schedule"; -import { getPreferredTimezone, timeZones } from "utils/timeZones"; import * as Yup from "yup"; import type { UpdateUserQuietHoursScheduleRequest, @@ -16,6 +13,9 @@ import { Button } from "#/components/Button/Button"; import { Form, FormFields } from "#/components/Form/Form"; import { Spinner } from "#/components/Spinner/Spinner"; import { Stack } from "#/components/Stack/Stack"; +import { getFormHelpers } from "#/utils/formUtils"; +import { quietHoursDisplay, timeToCron, validTime } from "#/utils/schedule"; +import { getPreferredTimezone, timeZones } from "#/utils/timeZones"; interface ScheduleFormValues { time: string; diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.tsx index f245133985..c7ac0d1610 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.tsx @@ -1,7 +1,6 @@ import TextField from "@mui/material/TextField"; import { type FormikContextType, useFormik } from "formik"; import type { FC } from "react"; -import { getFormHelpers } from "utils/formUtils"; import * as Yup from "yup"; import { Alert } from "#/components/Alert/Alert"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -9,6 +8,7 @@ import { Button } from "#/components/Button/Button"; import { Form, FormFields } from "#/components/Form/Form"; import { PasswordField } from "#/components/PasswordField/PasswordField"; import { Spinner } from "#/components/Spinner/Spinner"; +import { getFormHelpers } from "#/utils/formUtils"; interface SecurityFormValues { old_password: string; diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx index 4056123770..0a01148541 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SingleSignOnSection.tsx @@ -3,7 +3,6 @@ import TextField from "@mui/material/TextField"; import { CircleCheck as CircleCheckIcon, KeyIcon } from "lucide-react"; import { type FC, useState } from "react"; import { useMutation } from "react-query"; -import { docs } from "utils/docs"; import { API } from "#/api/api"; import { getErrorMessage } from "#/api/errors"; import type { @@ -17,6 +16,7 @@ import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog" import { EmptyState } from "#/components/EmptyState/EmptyState"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; import { Stack } from "#/components/Stack/Stack"; +import { docs } from "#/utils/docs"; import { Section } from "../Section"; type LoginTypeConfirmation = diff --git a/site/src/pages/UserSettingsPage/Sidebar.tsx b/site/src/pages/UserSettingsPage/Sidebar.tsx index 7fb448ce3c..5b1a23a944 100644 --- a/site/src/pages/UserSettingsPage/Sidebar.tsx +++ b/site/src/pages/UserSettingsPage/Sidebar.tsx @@ -9,7 +9,6 @@ import { UserIcon, } from "lucide-react"; import type { FC } from "react"; -import { isDevBuild } from "utils/buildInfo"; import type { User } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { GitIcon } from "#/components/Icons/GitIcon"; @@ -19,6 +18,7 @@ import { SidebarNavItem, } from "#/components/Sidebar/Sidebar"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { isDevBuild } from "#/utils/buildInfo"; interface SidebarProps { user: User; diff --git a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx index edcd9b11fa..ea303993a1 100644 --- a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx +++ b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyRow.tsx @@ -1,7 +1,5 @@ import type { ProxyLatencyReport } from "contexts/useProxyLatency"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { getLatencyColor } from "utils/latency"; import type { Region, WorkspaceProxy } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { AvatarData } from "#/components/Avatar/AvatarData"; @@ -12,6 +10,8 @@ import { StatusNotRegisteredIndicator, } from "#/components/StatusIndicator/StatusIndicator"; import { TableCell, TableRow } from "#/components/Table/Table"; +import { cn } from "#/utils/cn"; +import { getLatencyColor } from "#/utils/latency"; interface ProxyRowProps { latency?: ProxyLatencyReport; diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index f79374e7fc..5772f378ad 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -2,8 +2,6 @@ import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; -import { generateRandomString } from "utils/random"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { deploymentConfig } from "#/api/queries/deployment"; import { groupsByUserId } from "#/api/queries/groups"; @@ -27,6 +25,8 @@ import { useAuthenticated } from "#/hooks/useAuthenticated"; import { usePaginatedQuery } from "#/hooks/usePaginatedQuery"; import { shouldShowAISeatColumn } from "#/modules/dashboard/entitlements"; import { useDashboard } from "#/modules/dashboard/useDashboard"; +import { pageTitle } from "#/utils/page"; +import { generateRandomString } from "#/utils/random"; import { ResetPasswordDialog } from "./ResetPasswordDialog"; import { UsersPageView } from "./UsersPageView"; diff --git a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx index 1fba1a4f99..9381611acb 100644 --- a/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx +++ b/site/src/pages/UsersPage/UsersTable/UserGroupsCell.tsx @@ -3,7 +3,6 @@ import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import { UsersIcon } from "lucide-react"; import type { FC } from "react"; -import { cn } from "utils/cn"; import type { Group } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; import { OverflowY } from "#/components/OverflowY/OverflowY"; @@ -14,6 +13,7 @@ import { TooltipProvider, TooltipTrigger, } from "#/components/Tooltip/Tooltip"; +import { cn } from "#/utils/cn"; type GroupsCellProps = { userGroups: readonly Group[] | undefined; diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx index d2560f89b2..52a69e88f4 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx @@ -2,10 +2,10 @@ import dayjs from "dayjs"; import type { FC } from "react"; import { keepPreviousData, useQuery } from "react-query"; import { useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { workspaceBuildByNumber } from "#/api/queries/workspaceBuilds"; import { useWorkspaceBuildLogs } from "#/hooks/useWorkspaceBuildLogs"; +import { pageTitle } from "#/utils/page"; import { WorkspaceBuildPageView } from "./WorkspaceBuildPageView"; const WorkspaceBuildPage: FC = () => { diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx index 8b76c15a74..98868b7bd5 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx @@ -7,9 +7,6 @@ import { useRef, } from "react"; import { Link } from "react-router"; -import { cn } from "utils/cn"; -import { formatDate } from "utils/time"; -import { displayWorkspaceBuildDuration } from "utils/workspace"; import type { ProvisionerJobLog, WorkspaceAgent, @@ -37,6 +34,9 @@ import { WorkspaceBuildDataSkeleton, } from "#/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData"; import { WorkspaceBuildLogs } from "#/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs"; +import { cn } from "#/utils/cn"; +import { formatDate } from "#/utils/time"; +import { displayWorkspaceBuildDuration } from "#/utils/workspace"; import { Sidebar, SidebarCaption, SidebarItem } from "./Sidebar"; export const LOGS_TAB_KEY = "logs"; diff --git a/site/src/pages/WorkspacePage/AppStatuses.tsx b/site/src/pages/WorkspacePage/AppStatuses.tsx index fb500094d8..a8b35665e7 100644 --- a/site/src/pages/WorkspacePage/AppStatuses.tsx +++ b/site/src/pages/WorkspacePage/AppStatuses.tsx @@ -1,8 +1,6 @@ import capitalize from "lodash/capitalize"; import { ExternalLinkIcon, FileIcon, LayoutGridIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { timeFrom } from "utils/time"; -import { truncateURI } from "utils/uri"; import type { WorkspaceAppStatus as APIWorkspaceAppStatus, Workspace, @@ -20,6 +18,8 @@ import { } from "#/components/Tooltip/Tooltip"; import { AppStatusStateIcon } from "#/modules/apps/AppStatusStateIcon"; import { useAppLink } from "#/modules/apps/useAppLink"; +import { timeFrom } from "#/utils/time"; +import { truncateURI } from "#/utils/uri"; interface AppStatusesProps { workspace: Workspace; diff --git a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx index ea0701d72e..eb380dad86 100644 --- a/site/src/pages/WorkspacePage/ResourcesSidebar.tsx +++ b/site/src/pages/WorkspacePage/ResourcesSidebar.tsx @@ -1,13 +1,13 @@ import { type Interpolation, type Theme, useTheme } from "@emotion/react"; import Skeleton from "@mui/material/Skeleton"; import type { FC } from "react"; -import { getResourceIconPath } from "utils/workspace"; import type { WorkspaceResource } from "#/api/typesGenerated"; import { Sidebar, SidebarCaption, SidebarItem, } from "#/components/FullPageLayout/Sidebar"; +import { getResourceIconPath } from "#/utils/workspace"; type ResourcesSidebarProps = { failed: boolean; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx index 72549d7872..31a1327c16 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx @@ -1,12 +1,6 @@ import { useFormik } from "formik"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; -import { docs } from "utils/docs"; -import { getFormHelpers } from "utils/formUtils"; -import { - type AutofillBuildParameter, - getInitialRichParameterValues, -} from "utils/richParameters"; import { richParameters } from "#/api/queries/templates"; import { workspaceBuildParameters } from "#/api/queries/workspaceBuilds"; import type { @@ -32,6 +26,12 @@ import { PopoverTrigger, } from "#/components/Popover/Popover"; import { RichParameterInput } from "#/components/RichParameterInput/RichParameterInput"; +import { docs } from "#/utils/docs"; +import { getFormHelpers } from "#/utils/formUtils"; +import { + type AutofillBuildParameter, + getInitialRichParameterValues, +} from "#/utils/richParameters"; interface BuildParametersPopoverProps { workspace: Workspace; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx index 2fe202a5b4..8013507b49 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx @@ -1,6 +1,5 @@ import { type FC, Fragment, type ReactNode } from "react"; import { useQuery } from "react-query"; -import { mustUpdateWorkspace } from "utils/workspace"; import { deploymentConfig } from "#/api/queries/deployment"; import type { Workspace, WorkspaceBuildParameter } from "#/api/typesGenerated"; import { useAuthenticated } from "#/hooks/useAuthenticated"; @@ -10,6 +9,7 @@ import { } from "#/modules/workspaces/actions"; import type { WorkspacePermissions } from "#/modules/workspaces/permissions"; import { WorkspaceMoreActions } from "#/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions"; +import { mustUpdateWorkspace } from "#/utils/workspace"; import { ActivateButton, CancelButton, diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx index 25c01eac00..a1eeaa94c8 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.tsx @@ -18,7 +18,7 @@ import { getAgentHealthIssue } from "#/modules/workspaces/health"; dayjs.extend(relativeTime); import { useQuery } from "react-query"; -import { formatDate } from "utils/time"; +import { formatDate } from "#/utils/time"; import type { WorkspacePermissions } from "../../../modules/workspaces/permissions"; import { NotificationActionButton, diff --git a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx index cd9e0fe7c5..605bf9f7ae 100644 --- a/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx @@ -1,7 +1,6 @@ import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { type ApiError, @@ -33,6 +32,7 @@ import { useWorkspaceUpdate, WorkspaceUpdateDialogs, } from "#/modules/workspaces/WorkspaceUpdateDialogs"; +import { pageTitle } from "#/utils/page"; import { Workspace } from "./Workspace"; interface WorkspaceReadyPageProps { diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx index 22001f6626..fc7192a78e 100644 --- a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx @@ -6,15 +6,6 @@ import { type FC, type ReactNode, useRef, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; import { Link as RouterLink } from "react-router"; import { toast } from "sonner"; -import { - autostartDisplay, - autostopDisplay, - getDeadline, - getMaxDeadline, - getMaxDeadlineChange, - getMinDeadline, -} from "utils/schedule"; -import { isWorkspaceOn } from "utils/workspace"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { updateDeadline, @@ -30,6 +21,15 @@ import { } from "#/components/Tooltip/Tooltip"; import { useTime } from "#/hooks/useTime"; import { getWorkspaceActivityStatus } from "#/modules/workspaces/activity"; +import { + autostartDisplay, + autostopDisplay, + getDeadline, + getMaxDeadline, + getMaxDeadlineChange, + getMinDeadline, +} from "#/utils/schedule"; +import { isWorkspaceOn } from "#/utils/workspace"; interface WorkspaceScheduleContainerProps { children?: ReactNode; diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 38355431ce..698c4f0969 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -4,8 +4,6 @@ import { ChevronLeftIcon, CircleDollarSign, TrashIcon } from "lucide-react"; import type { FC } from "react"; import { useQuery } from "react-query"; import { Link as RouterLink } from "react-router"; -import { displayDormantDeletion } from "utils/dormant"; -import { formatDate } from "utils/time"; import { workspaceQuota } from "#/api/queries/workspaceQuota"; import type * as TypesGen from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -32,6 +30,8 @@ import { import { useDashboard } from "#/modules/dashboard/useDashboard"; import { linkToTemplate, useLinks } from "#/modules/navigation"; import { WorkspaceStatusIndicator } from "#/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator"; +import { displayDormantDeletion } from "#/utils/dormant"; +import { formatDate } from "#/utils/time"; import type { WorkspacePermissions } from "../../modules/workspaces/permissions"; import { WorkspaceActions } from "./WorkspaceActions/WorkspaceActions"; import { WorkspaceNotifications } from "./WorkspaceNotifications/WorkspaceNotifications"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx index 6acb0e6fc7..a82731d1fc 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx @@ -1,11 +1,5 @@ import { useFormik } from "formik"; import type { FC } from "react"; -import { getFormHelpers } from "utils/formUtils"; -import { - type AutofillBuildParameter, - getInitialRichParameterValues, - useValidationSchemaForRichParameters, -} from "utils/richParameters"; import * as Yup from "yup"; import type { TemplateVersionParameter, @@ -23,6 +17,12 @@ import { import { RichParameterInput } from "#/components/RichParameterInput/RichParameterInput"; import { Spinner } from "#/components/Spinner/Spinner"; import { ClassicParameterFlowDeprecationWarning } from "#/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning"; +import { getFormHelpers } from "#/utils/formUtils"; +import { + type AutofillBuildParameter, + getInitialRichParameterValues, + useValidationSchemaForRichParameters, +} from "#/utils/richParameters"; export type WorkspaceParametersFormValues = { rich_parameter_values: WorkspaceBuildParameter[]; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx index f491f25bae..04581530a2 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx @@ -2,8 +2,6 @@ import { ExternalLinkIcon } from "lucide-react"; import type { FC } from "react"; import { useMutation, useQuery } from "react-query"; import { useNavigate } from "react-router"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { isApiValidationError } from "#/api/errors"; import { checkAuthorization } from "#/api/queries/authCheck"; @@ -18,6 +16,8 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Button } from "#/components/Button/Button"; import { EmptyState } from "#/components/EmptyState/EmptyState"; import { Loader } from "#/components/Loader/Loader"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { type WorkspacePermissions, workspaceChecks, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx index 0e12d9ccdc..284fef5579 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx @@ -3,9 +3,6 @@ import type { FC } from "react"; import { useEffect, useMemo, useRef, useState } from "react"; import { useMutation, useQuery } from "react-query"; import { useNavigate, useSearchParams } from "react-router"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; -import type { AutofillBuildParameter } from "utils/richParameters"; import { API } from "#/api/api"; import { DetailedError } from "#/api/errors"; import { checkAuthorization } from "#/api/queries/authCheck"; @@ -25,6 +22,9 @@ import { TooltipTrigger, } from "#/components/Tooltip/Tooltip"; import { useEffectEvent } from "#/hooks/hookPolyfills"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; import { type WorkspacePermissions, workspaceChecks, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx index 200d77fe40..62d4a4b549 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx @@ -1,8 +1,5 @@ import { useFormik } from "formik"; import type { FC } from "react"; -import { cn } from "utils/cn"; -import { docs } from "utils/docs"; -import type { AutofillBuildParameter } from "utils/richParameters"; import type { PreviewParameter, Workspace, @@ -20,6 +17,9 @@ import { getInitialParameterValues, useValidationSchemaForDynamicParameters, } from "#/modules/workspaces/DynamicParameter/DynamicParameter"; +import { cn } from "#/utils/cn"; +import { docs } from "#/utils/docs"; +import type { AutofillBuildParameter } from "#/utils/richParameters"; type WorkspaceParametersPageViewExperimentalProps = { workspace: Workspace; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx index 6036039a2f..a27728d966 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx @@ -1,9 +1,9 @@ import { screen } from "@testing-library/react"; import { defaultSchedule } from "pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule"; -import { timeZones } from "utils/timeZones"; import { API } from "#/api/api"; import { MockTemplate } from "#/testHelpers/entities"; import { render } from "#/testHelpers/renderHelpers"; +import { timeZones } from "#/utils/timeZones"; import { Language, ttlShutdownAt, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx index ea7e482a93..66b70e1aa6 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx @@ -6,9 +6,6 @@ import { emptySchedule, } from "pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule"; import type { FC } from "react"; -import { getFormHelpers } from "utils/formUtils"; -import { humanDuration } from "utils/time"; -import { timeZones } from "utils/timeZones"; import * as Yup from "yup"; import type { Template } from "#/api/typesGenerated"; import { Button } from "#/components/Button/Button"; @@ -30,6 +27,9 @@ import { } from "#/components/Select/Select"; import { Spinner } from "#/components/Spinner/Spinner"; import { Switch } from "#/components/Switch/Switch"; +import { getFormHelpers } from "#/utils/formUtils"; +import { humanDuration } from "#/utils/time"; +import { timeZones } from "#/utils/timeZones"; // Need dayjs.tz functions for timezone validation dayjs.extend(timezone); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index 4b2e88f77e..c107496757 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -8,8 +8,6 @@ import { type FC, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; import { getErrorDetail } from "#/api/errors"; import { templateByName } from "#/api/queries/templates"; @@ -24,6 +22,8 @@ import { PageHeader, PageHeaderTitle, } from "#/components/PageHeader/PageHeader"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { useWorkspaceSettings } from "../useWorkspaceSettings"; import { formValuesToAutostartRequest, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule.ts b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule.ts index edaf480aee..58ba19d3e7 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule.ts +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule.ts @@ -4,7 +4,7 @@ import timezone from "dayjs/plugin/timezone"; import utc from "dayjs/plugin/utc"; import map from "lodash/map"; import some from "lodash/some"; -import { extractTimezone, stripTimezone } from "utils/schedule"; +import { extractTimezone, stripTimezone } from "#/utils/schedule"; import type { Autostop } from "./ttl"; import type { WorkspaceScheduleFormValues } from "./WorkspaceScheduleForm"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx index a82237ba77..f0706ccc4a 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx @@ -4,11 +4,6 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import upperFirst from "lodash/upperFirst"; import type { FC } from "react"; -import { - getFormHelpers, - nameValidator, - onChangeTrimmed, -} from "utils/formUtils"; import * as Yup from "yup"; import { type AutomaticUpdates, @@ -23,6 +18,11 @@ import { HorizontalForm, } from "#/components/Form/Form"; import { Spinner } from "#/components/Spinner/Spinner"; +import { + getFormHelpers, + nameValidator, + onChangeTrimmed, +} from "#/utils/formUtils"; export type WorkspaceSettingsFormValues = { name: string; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx index 59907df4aa..43cabfc676 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx @@ -1,7 +1,6 @@ import { type FC, Suspense } from "react"; import { useQuery } from "react-query"; import { Outlet, useParams } from "react-router"; -import { pageTitle } from "utils/page"; import { workspaceByOwnerAndName, workspacePermissions, @@ -10,6 +9,7 @@ import { ErrorAlert } from "#/components/Alert/ErrorAlert"; import { Loader } from "#/components/Loader/Loader"; import { Margins } from "#/components/Margins/Margins"; import { Stack } from "#/components/Stack/Stack"; +import { pageTitle } from "#/utils/page"; import { Sidebar } from "./Sidebar"; import { WorkspaceSettings } from "./useWorkspaceSettings"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx index 3c8b6f4b5a..9627ff9e7f 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx @@ -2,8 +2,8 @@ import type { FC } from "react"; import { useMutation } from "react-query"; import { useNavigate, useParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { API } from "#/api/api"; +import { pageTitle } from "#/utils/page"; import { useWorkspaceSettings } from "./useWorkspaceSettings"; import type { WorkspaceSettingsFormValues } from "./WorkspaceSettingsForm"; import { WorkspaceSettingsPageView } from "./WorkspaceSettingsPageView"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSharingPage/WorkspaceSharingPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSharingPage/WorkspaceSharingPage.tsx index e3adfe4058..a2ea892477 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSharingPage/WorkspaceSharingPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSharingPage/WorkspaceSharingPage.tsx @@ -1,12 +1,12 @@ import type { FC } from "react"; import { useQuery } from "react-query"; -import { docs } from "utils/docs"; -import { pageTitle } from "utils/page"; import { checkAuthorization } from "#/api/queries/authCheck"; import { Link } from "#/components/Link/Link"; import type { WorkspacePermissions } from "#/modules/workspaces/permissions"; import { workspaceChecks } from "#/modules/workspaces/permissions"; import { useWorkspaceSharing } from "#/modules/workspaces/WorkspaceSharingForm/useWorkspaceSharing"; +import { docs } from "#/utils/docs"; +import { pageTitle } from "#/utils/page"; import { useWorkspaceSettings } from "../useWorkspaceSettings"; import { WorkspaceSharingPageView } from "./WorkspaceSharingPageView"; diff --git a/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.tsx b/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.tsx index 8797b7a739..16beacf1b3 100644 --- a/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.tsx +++ b/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.tsx @@ -2,10 +2,10 @@ import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import { ClockIcon, UserIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; -import { getResourceIconPath } from "utils/workspace"; import type { Workspace } from "#/api/typesGenerated"; import { ConfirmDialog } from "#/components/Dialogs/ConfirmDialog/ConfirmDialog"; import { ExternalImage } from "#/components/ExternalImage/ExternalImage"; +import { getResourceIconPath } from "#/utils/workspace"; dayjs.extend(relativeTime); diff --git a/site/src/pages/WorkspacesPage/BatchUpdateModalForm.tsx b/site/src/pages/WorkspacesPage/BatchUpdateModalForm.tsx index 7fb02c0e80..aacac02685 100644 --- a/site/src/pages/WorkspacesPage/BatchUpdateModalForm.tsx +++ b/site/src/pages/WorkspacesPage/BatchUpdateModalForm.tsx @@ -10,7 +10,6 @@ import { useState, } from "react"; import { useQueries } from "react-query"; -import { cn } from "utils/cn"; import { templateVersion } from "#/api/queries/templates"; import type { Workspace } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -26,6 +25,7 @@ import { } from "#/components/Dialog/Dialog"; import { Spinner } from "#/components/Spinner/Spinner"; import { ACTIVE_BUILD_STATUSES } from "#/modules/workspaces/status"; +import { cn } from "#/utils/cn"; export const BatchUpdateModalForm: FC = ({ open, diff --git a/site/src/pages/WorkspacesPage/WorkspaceHelpTooltip.tsx b/site/src/pages/WorkspacesPage/WorkspaceHelpTooltip.tsx index 51725d5508..6127a8b6ba 100644 --- a/site/src/pages/WorkspacesPage/WorkspaceHelpTooltip.tsx +++ b/site/src/pages/WorkspacesPage/WorkspaceHelpTooltip.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { HelpTooltip, HelpTooltipContent, @@ -9,6 +8,7 @@ import { HelpTooltipText, HelpTooltipTitle, } from "#/components/HelpTooltip/HelpTooltip"; +import { docs } from "#/utils/docs"; const Language = { workspaceTooltipTitle: "What is a workspace?", diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx index 1326b18119..3a4742c9b7 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.test.tsx @@ -1,7 +1,6 @@ import { screen, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { HttpResponse, http } from "msw"; -import * as CreateDayString from "utils/createDayString"; import { API } from "#/api/api"; import type { Workspace, @@ -25,6 +24,7 @@ import { waitForLoaderToBeRemoved, } from "#/testHelpers/renderHelpers"; import { server } from "#/testHelpers/server"; +import * as CreateDayString from "#/utils/createDayString"; import WorkspacesPage from "./WorkspacesPage"; describe("WorkspacesPage", () => { diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index 1d6dd2c052..3086f05bf8 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -3,7 +3,6 @@ import { type FC, useMemo, useState } from "react"; import { useQuery, useQueryClient } from "react-query"; import { useSearchParams } from "react-router"; import { toast } from "sonner"; -import { pageTitle } from "utils/page"; import { getErrorDetail, getErrorMessage } from "#/api/errors"; import { chatsByWorkspace } from "#/api/queries/chats"; import { workspacePermissionsByOrganization } from "#/api/queries/organizations"; @@ -16,6 +15,7 @@ import { usePagination } from "#/hooks/usePagination"; import { useDashboard } from "#/modules/dashboard/useDashboard"; import { useOrganizationsFilterMenu } from "#/modules/tableFiltering/options"; import { ACTIVE_BUILD_STATUSES } from "#/modules/workspaces/status"; +import { pageTitle } from "#/utils/page"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; import { BatchUpdateModalForm } from "./BatchUpdateModalForm"; import { useBatchActions } from "./batchActions"; diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx index 564e327c4c..9d5513e9a8 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.tsx @@ -2,7 +2,6 @@ import { CloudIcon, PlayIcon, SquareIcon, TrashIcon } from "lucide-react"; import { WorkspacesTable } from "pages/WorkspacesPage/WorkspacesTable"; import type { FC } from "react"; import type { UseQueryResult } from "react-query"; -import { mustUpdateWorkspace } from "utils/workspace"; import { hasError, isApiValidationError } from "#/api/errors"; import type { Template, Workspace } from "#/api/typesGenerated"; import { ErrorAlert } from "#/components/Alert/ErrorAlert"; @@ -26,6 +25,7 @@ import { PaginationWidgetBase } from "#/components/PaginationWidget/PaginationWi import { Spinner } from "#/components/Spinner/Spinner"; import { Stack } from "#/components/Stack/Stack"; import { TableToolbar } from "#/components/TableToolbar/TableToolbar"; +import { mustUpdateWorkspace } from "#/utils/workspace"; import { type WorkspaceFilterState, WorkspacesFilter, diff --git a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx index b56019c288..12b5cb1ce0 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx @@ -20,8 +20,6 @@ import { } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { Link, useNavigate } from "react-router"; -import { cn } from "utils/cn"; -import { getDisplayWorkspaceTemplateName } from "utils/workspace"; import { API } from "#/api/api"; import { templateVersion } from "#/api/queries/templates"; import { @@ -83,6 +81,8 @@ import { useWorkspaceUpdate, WorkspaceUpdateDialogs, } from "#/modules/workspaces/WorkspaceUpdateDialogs"; +import { cn } from "#/utils/cn"; +import { getDisplayWorkspaceTemplateName } from "#/utils/workspace"; import { WorkspaceSharingIndicator } from "./WorkspaceSharingIndicator"; import { WorkspacesEmpty } from "./WorkspacesEmpty"; diff --git a/site/src/pages/WorkspacesPage/filter/WorkspacesFilter.tsx b/site/src/pages/WorkspacesPage/filter/WorkspacesFilter.tsx index b419d27969..6721717aaf 100644 --- a/site/src/pages/WorkspacesPage/filter/WorkspacesFilter.tsx +++ b/site/src/pages/WorkspacesPage/filter/WorkspacesFilter.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { docs } from "utils/docs"; import { Filter, MenuSkeleton, @@ -15,6 +14,7 @@ import { type OrganizationsFilterMenu, OrganizationsMenu, } from "#/modules/tableFiltering/options"; +import { docs } from "#/utils/docs"; import { type StatusFilterMenu, StatusMenu, diff --git a/site/src/pages/WorkspacesPage/filter/menus.tsx b/site/src/pages/WorkspacesPage/filter/menus.tsx index 89d9380a33..5a20202fa2 100644 --- a/site/src/pages/WorkspacesPage/filter/menus.tsx +++ b/site/src/pages/WorkspacesPage/filter/menus.tsx @@ -1,5 +1,4 @@ import type { FC } from "react"; -import { getDisplayWorkspaceStatus } from "utils/workspace"; import { API } from "#/api/api"; import type { Template, WorkspaceStatus } from "#/api/typesGenerated"; import { Avatar } from "#/components/Avatar/Avatar"; @@ -16,6 +15,7 @@ import { StatusIndicatorDot, type StatusIndicatorDotProps, } from "#/components/StatusIndicator/StatusIndicator"; +import { getDisplayWorkspaceStatus } from "#/utils/workspace"; export const useTemplateFilterMenu = ({ value, diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 1d65ca9e10..3d21231d46 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -1,7 +1,5 @@ import type { ProxyLatencyReport } from "contexts/useProxyLatency"; import range from "lodash/range"; -import type { FileTree } from "utils/filetree"; -import type { TemplateVersionFiles } from "utils/templateVersion"; import { type DeploymentConfig, type GetLicensesResponse, @@ -11,6 +9,8 @@ import type { FieldError } from "#/api/errors"; import type * as TypesGen from "#/api/typesGenerated"; import type { Permissions } from "#/modules/permissions"; import type { OrganizationPermissions } from "#/modules/permissions/organizations"; +import type { FileTree } from "#/utils/filetree"; +import type { TemplateVersionFiles } from "#/utils/templateVersion"; export const MockOrganization: TypesGen.Organization = { id: "my-organization-id", diff --git a/site/src/testHelpers/websockets.ts b/site/src/testHelpers/websockets.ts index 57584cd55e..cc1f6023a1 100644 --- a/site/src/testHelpers/websockets.ts +++ b/site/src/testHelpers/websockets.ts @@ -1,4 +1,4 @@ -import type { WebSocketEventType } from "utils/OneWayWebSocket"; +import type { WebSocketEventType } from "#/utils/OneWayWebSocket"; type SocketSendData = Parameters[0];