mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix(site): fix provider link on models page pointing to stale path (#26011)
Fixes https://linear.app/codercom/issue/CODAGT-547 The "Connect a provider" link shown on `/agents/settings/models` when no providers are configured was pointing to `/agents/settings/providers` (a stale duplicate view) instead of `/ai/settings` (the canonical provider configuration page). Audited all frontend source files for references to the stale path. This was the only link; other references to `/ai/settings` already point to the correct page. <details><summary>Generated by Coder Agents</summary> This PR was generated by Coder Agents on behalf of @tracyjohnsonux. </details> --------- Co-authored-by: Jaayden Halko <jaayden@coder.com>
This commit is contained in:
@@ -1,101 +0,0 @@
|
||||
import type { FC } from "react";
|
||||
import { useMutation, useQuery, useQueryClient } from "react-query";
|
||||
import {
|
||||
chatModelConfigs,
|
||||
chatModels,
|
||||
chatProviderConfigs,
|
||||
createChatModelConfig,
|
||||
createChatProviderConfig,
|
||||
deleteChatModelConfig,
|
||||
deleteChatProviderConfig,
|
||||
updateChatModelConfig,
|
||||
updateChatProviderConfig,
|
||||
} from "#/api/queries/chats";
|
||||
import { useAuthenticated } from "#/hooks/useAuthenticated";
|
||||
import { RequirePermission } from "#/modules/permissions/RequirePermission";
|
||||
import { ChatModelAdminPanel } from "./components/ChatModelAdminPanel/ChatModelAdminPanel";
|
||||
|
||||
const AgentSettingsProvidersPage: FC = () => {
|
||||
const { permissions } = useAuthenticated();
|
||||
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
// Queries.
|
||||
const providerConfigsQuery = useQuery({
|
||||
...chatProviderConfigs(),
|
||||
enabled: permissions.editDeploymentConfig,
|
||||
});
|
||||
const modelConfigsQuery = useQuery(chatModelConfigs());
|
||||
const modelCatalogQuery = useQuery(chatModels());
|
||||
|
||||
// Mutations.
|
||||
const createProviderMutation = useMutation(
|
||||
createChatProviderConfig(queryClient),
|
||||
);
|
||||
const updateProviderMutation = useMutation(
|
||||
updateChatProviderConfig(queryClient),
|
||||
);
|
||||
const deleteProviderMutation = useMutation(
|
||||
deleteChatProviderConfig(queryClient),
|
||||
);
|
||||
const createModelMutation = useMutation(createChatModelConfig(queryClient));
|
||||
const updateModelMutation = useMutation(updateChatModelConfig(queryClient));
|
||||
const deleteModelMutation = useMutation(deleteChatModelConfig(queryClient));
|
||||
|
||||
return (
|
||||
<RequirePermission isFeatureVisible={permissions.editDeploymentConfig}>
|
||||
<ChatModelAdminPanel
|
||||
section="providers"
|
||||
sectionLabel="Providers"
|
||||
sectionDescription="Connect third-party LLM services like OpenAI, Anthropic, or Google. Each provider supplies models that users can select for their conversations."
|
||||
providerConfigsData={providerConfigsQuery.data}
|
||||
modelConfigsData={modelConfigsQuery.data}
|
||||
modelCatalogData={modelCatalogQuery.data}
|
||||
isLoading={
|
||||
providerConfigsQuery.isLoading ||
|
||||
modelConfigsQuery.isLoading ||
|
||||
modelCatalogQuery.isLoading
|
||||
}
|
||||
providerConfigsError={
|
||||
providerConfigsQuery.isError ? providerConfigsQuery.error : null
|
||||
}
|
||||
modelConfigsError={
|
||||
modelConfigsQuery.isError ? modelConfigsQuery.error : null
|
||||
}
|
||||
modelCatalogError={
|
||||
modelCatalogQuery.isError ? modelCatalogQuery.error : null
|
||||
}
|
||||
onCreateProvider={(req) => createProviderMutation.mutateAsync(req)}
|
||||
onUpdateProvider={(providerConfigId, req) =>
|
||||
updateProviderMutation.mutateAsync({ providerConfigId, req })
|
||||
}
|
||||
onDeleteProvider={(id) => deleteProviderMutation.mutateAsync(id)}
|
||||
isProviderMutationPending={
|
||||
createProviderMutation.isPending ||
|
||||
updateProviderMutation.isPending ||
|
||||
deleteProviderMutation.isPending
|
||||
}
|
||||
providerMutationError={
|
||||
createProviderMutation.error ??
|
||||
updateProviderMutation.error ??
|
||||
deleteProviderMutation.error
|
||||
}
|
||||
onCreateModel={(req) => createModelMutation.mutateAsync(req)}
|
||||
onUpdateModel={(modelConfigId, req) =>
|
||||
updateModelMutation.mutateAsync({ modelConfigId, req })
|
||||
}
|
||||
onDeleteModel={(id) => deleteModelMutation.mutateAsync(id)}
|
||||
isCreatingModel={createModelMutation.isPending}
|
||||
isUpdatingModel={updateModelMutation.isPending}
|
||||
isDeletingModel={deleteModelMutation.isPending}
|
||||
modelMutationError={
|
||||
createModelMutation.error ??
|
||||
updateModelMutation.error ??
|
||||
deleteModelMutation.error
|
||||
}
|
||||
/>
|
||||
</RequirePermission>
|
||||
);
|
||||
};
|
||||
|
||||
export default AgentSettingsProvidersPage;
|
||||
@@ -164,7 +164,7 @@ export const LinksToProvidersFromEmptyState: Story = {
|
||||
|
||||
await expect(canvas.getByText("No models configured yet.")).toBeVisible();
|
||||
await expect(providerLink).toBeVisible();
|
||||
expect(providerLink).toHaveAttribute("href", "/agents/settings/providers");
|
||||
expect(providerLink).toHaveAttribute("href", "/ai/settings");
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -311,7 +311,7 @@ export const ModelsSection: FC<ModelsSectionProps> = ({
|
||||
<p className="m-0 text-xs text-content-secondary">
|
||||
Connect a{" "}
|
||||
<Link
|
||||
to="/agents/settings/providers"
|
||||
to="/ai/settings"
|
||||
className="underline transition-colors hover:text-content-primary"
|
||||
>
|
||||
provider
|
||||
|
||||
@@ -53,13 +53,6 @@ describe("sidebarViewFromPath", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("returns the providers admin settings section", () => {
|
||||
expect(sidebarViewFromPath("/agents/settings/providers")).toEqual({
|
||||
panel: "settings-admin",
|
||||
section: "providers",
|
||||
});
|
||||
});
|
||||
|
||||
it("normalizes the admin index route to an undefined section", () => {
|
||||
expect(sidebarViewFromPath("/agents/settings/admin")).toEqual({
|
||||
panel: "settings-admin",
|
||||
|
||||
@@ -7,7 +7,6 @@ type SidebarView =
|
||||
const ADMIN_SETTINGS_SECTIONS = new Set([
|
||||
"agents",
|
||||
"templates",
|
||||
"providers",
|
||||
"models",
|
||||
"mcp-servers",
|
||||
"spend",
|
||||
|
||||
+4
-4
@@ -384,9 +384,6 @@ const AgentSettingsUserAgentsPage = lazy(
|
||||
const AgentSettingsPersonalSkillsPage = lazy(
|
||||
() => import("./pages/AgentsPage/AgentSettingsPersonalSkillsPage"),
|
||||
);
|
||||
const AgentSettingsProvidersPage = lazy(
|
||||
() => import("./pages/AgentsPage/AgentSettingsProvidersPage"),
|
||||
);
|
||||
const AgentSettingsAPIKeysPage = lazy(
|
||||
() => import("./pages/AgentsPage/AgentSettingsAPIKeysPage"),
|
||||
);
|
||||
@@ -791,7 +788,10 @@ export const router = createBrowserRouter(
|
||||
<Route path="admin" element={<AgentSettingsAgentsPage />} />
|
||||
<Route path="agents" element={<AgentSettingsAgentsPage />} />
|
||||
<Route path="api-keys" element={<AgentSettingsAPIKeysPage />} />
|
||||
<Route path="providers" element={<AgentSettingsProvidersPage />} />
|
||||
<Route
|
||||
path="providers"
|
||||
element={<Navigate to="/ai/settings" replace />}
|
||||
/>
|
||||
<Route path="models" element={<AgentSettingsModelsPage />} />
|
||||
<Route
|
||||
path="mcp-servers"
|
||||
|
||||
Reference in New Issue
Block a user