mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: make the template docs view the default (#17606)
This commit is contained in:
@@ -20,6 +20,7 @@ import {
|
||||
import { useQuery } from "react-query";
|
||||
import { Outlet, useLocation, useNavigate, useParams } from "react-router-dom";
|
||||
import { TemplatePageHeader } from "./TemplatePageHeader";
|
||||
import { TemplateStats } from "./TemplateStats";
|
||||
|
||||
const templatePermissions = (
|
||||
templateId: string,
|
||||
@@ -132,9 +133,6 @@ export const TemplateLayout: FC<PropsWithChildren> = ({
|
||||
<Tabs active={activeTab} className="mb-10 -mt-3">
|
||||
<Margins>
|
||||
<TabsList>
|
||||
<TabLink to="" value="summary">
|
||||
Summary
|
||||
</TabLink>
|
||||
<TabLink to="docs" value="docs">
|
||||
Docs
|
||||
</TabLink>
|
||||
@@ -143,6 +141,9 @@ export const TemplateLayout: FC<PropsWithChildren> = ({
|
||||
Source Code
|
||||
</TabLink>
|
||||
)}
|
||||
<TabLink to="resources" value="resources">
|
||||
Resources
|
||||
</TabLink>
|
||||
<TabLink to="versions" value="versions">
|
||||
Versions
|
||||
</TabLink>
|
||||
|
||||
@@ -35,6 +35,7 @@ import type { WorkspacePermissions } from "modules/permissions/workspaces";
|
||||
import type { FC } from "react";
|
||||
import { useQuery } from "react-query";
|
||||
import { Link as RouterLink, useNavigate } from "react-router-dom";
|
||||
import { TemplateStats } from "./TemplateStats";
|
||||
import { useDeletionDialogState } from "./useDeletionDialogState";
|
||||
|
||||
type TemplateMenuProps = {
|
||||
@@ -238,6 +239,9 @@ export const TemplatePageHeader: FC<TemplatePageHeaderProps> = ({
|
||||
</div>
|
||||
</Stack>
|
||||
</PageHeader>
|
||||
<div className="pb-8">
|
||||
<TemplateStats template={template} activeVersion={activeVersion} />
|
||||
</div>
|
||||
</Margins>
|
||||
);
|
||||
};
|
||||
|
||||
+4
-8
@@ -4,9 +4,9 @@ import type { FC } from "react";
|
||||
import { Helmet } from "react-helmet-async";
|
||||
import { useQuery } from "react-query";
|
||||
import { getTemplatePageTitle } from "../utils";
|
||||
import { TemplateSummaryPageView } from "./TemplateSummaryPageView";
|
||||
import { TemplateResourcesPageView } from "./TemplateResourcesPageView";
|
||||
|
||||
export const TemplateSummaryPage: FC = () => {
|
||||
export const TemplateResourcesPage: FC = () => {
|
||||
const { template, activeVersion } = useTemplateLayoutContext();
|
||||
const { data: resources } = useQuery({
|
||||
queryKey: ["templates", template.id, "resources"],
|
||||
@@ -18,13 +18,9 @@ export const TemplateSummaryPage: FC = () => {
|
||||
<Helmet>
|
||||
<title>{getTemplatePageTitle("Template", template)}</title>
|
||||
</Helmet>
|
||||
<TemplateSummaryPageView
|
||||
resources={resources}
|
||||
template={template}
|
||||
activeVersion={activeVersion}
|
||||
/>
|
||||
<TemplateResourcesPageView resources={resources} template={template} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default TemplateSummaryPage;
|
||||
export default TemplateResourcesPage;
|
||||
+5
-8
@@ -1,24 +1,22 @@
|
||||
import type { Meta, StoryObj } from "@storybook/react";
|
||||
import {
|
||||
MockTemplate,
|
||||
MockTemplateVersion,
|
||||
MockWorkspaceResource,
|
||||
MockWorkspaceVolumeResource,
|
||||
} from "testHelpers/entities";
|
||||
import { TemplateSummaryPageView } from "./TemplateSummaryPageView";
|
||||
import { TemplateResourcesPageView } from "./TemplateResourcesPageView";
|
||||
|
||||
const meta: Meta<typeof TemplateSummaryPageView> = {
|
||||
title: "pages/TemplatePage/TemplateSummaryPageView",
|
||||
component: TemplateSummaryPageView,
|
||||
const meta: Meta<typeof TemplateResourcesPageView> = {
|
||||
title: "pages/TemplatePage/TemplateResourcesPageView",
|
||||
component: TemplateResourcesPageView,
|
||||
};
|
||||
|
||||
export default meta;
|
||||
type Story = StoryObj<typeof TemplateSummaryPageView>;
|
||||
type Story = StoryObj<typeof TemplateResourcesPageView>;
|
||||
|
||||
export const Example: Story = {
|
||||
args: {
|
||||
template: MockTemplate,
|
||||
activeVersion: MockTemplateVersion,
|
||||
resources: [MockWorkspaceResource, MockWorkspaceVolumeResource],
|
||||
},
|
||||
};
|
||||
@@ -26,7 +24,6 @@ export const Example: Story = {
|
||||
export const NoIcon: Story = {
|
||||
args: {
|
||||
template: { ...MockTemplate, icon: "" },
|
||||
activeVersion: MockTemplateVersion,
|
||||
resources: [MockWorkspaceResource, MockWorkspaceVolumeResource],
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,32 @@
|
||||
import type { Template, WorkspaceResource } from "api/typesGenerated";
|
||||
import { Loader } from "components/Loader/Loader";
|
||||
import { TemplateResourcesTable } from "modules/templates/TemplateResourcesTable/TemplateResourcesTable";
|
||||
import type { FC } from "react";
|
||||
import { Navigate, useLocation } from "react-router-dom";
|
||||
|
||||
export interface TemplateResourcesPageViewProps {
|
||||
resources?: WorkspaceResource[];
|
||||
template: Template;
|
||||
}
|
||||
|
||||
export const TemplateResourcesPageView: FC<TemplateResourcesPageViewProps> = ({
|
||||
resources,
|
||||
}) => {
|
||||
const location = useLocation();
|
||||
|
||||
if (location.hash === "#readme") {
|
||||
return <Navigate to="docs" replace />;
|
||||
}
|
||||
|
||||
if (!resources) {
|
||||
return <Loader />;
|
||||
}
|
||||
|
||||
const getStartedResources = (resources: WorkspaceResource[]) => {
|
||||
return resources.filter(
|
||||
(resource) => resource.workspace_transition === "start",
|
||||
);
|
||||
};
|
||||
|
||||
return <TemplateResourcesTable resources={getStartedResources(resources)} />;
|
||||
};
|
||||
@@ -1,52 +0,0 @@
|
||||
import type {
|
||||
Template,
|
||||
TemplateVersion,
|
||||
WorkspaceResource,
|
||||
} from "api/typesGenerated";
|
||||
import { Loader } from "components/Loader/Loader";
|
||||
import { Stack } from "components/Stack/Stack";
|
||||
import { TemplateResourcesTable } from "modules/templates/TemplateResourcesTable/TemplateResourcesTable";
|
||||
import { type FC, useEffect } from "react";
|
||||
import { useLocation, useNavigate } from "react-router-dom";
|
||||
import { TemplateStats } from "./TemplateStats";
|
||||
|
||||
export interface TemplateSummaryPageViewProps {
|
||||
resources?: WorkspaceResource[];
|
||||
template: Template;
|
||||
activeVersion: TemplateVersion;
|
||||
}
|
||||
|
||||
export const TemplateSummaryPageView: FC<TemplateSummaryPageViewProps> = ({
|
||||
resources,
|
||||
template,
|
||||
activeVersion,
|
||||
}) => {
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
|
||||
// biome-ignore lint/correctness/useExhaustiveDependencies: consider refactoring
|
||||
useEffect(() => {
|
||||
if (location.hash === "#readme") {
|
||||
// We moved the readme to the docs page, but we known that some users
|
||||
// have bookmarked the readme or linked it elsewhere. Redirect them to the docs page.
|
||||
navigate("docs", { replace: true });
|
||||
}
|
||||
}, [template, navigate, location]);
|
||||
|
||||
if (!resources) {
|
||||
return <Loader />;
|
||||
}
|
||||
|
||||
const getStartedResources = (resources: WorkspaceResource[]) => {
|
||||
return resources.filter(
|
||||
(resource) => resource.workspace_transition === "start",
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<Stack spacing={4}>
|
||||
<TemplateStats template={template} activeVersion={activeVersion} />
|
||||
<TemplateResourcesTable resources={getStartedResources(resources)} />
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
+5
-3
@@ -92,8 +92,9 @@ const TemplatePermissionsPage = lazy(
|
||||
"./pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage"
|
||||
),
|
||||
);
|
||||
const TemplateSummaryPage = lazy(
|
||||
() => import("./pages/TemplatePage/TemplateSummaryPage/TemplateSummaryPage"),
|
||||
const TemplateResourcesPage = lazy(
|
||||
() =>
|
||||
import("./pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPage"),
|
||||
);
|
||||
const CreateWorkspaceExperimentRouter = lazy(
|
||||
() => import("./pages/CreateWorkspacePage/CreateWorkspaceExperimentRouter"),
|
||||
@@ -329,9 +330,10 @@ const templateRouter = () => {
|
||||
<Route path=":template">
|
||||
<Route element={<TemplateRedirectController />}>
|
||||
<Route element={<TemplateLayout />}>
|
||||
<Route index element={<TemplateSummaryPage />} />
|
||||
<Route index element={<Navigate to="docs" replace />} />
|
||||
<Route path="docs" element={<TemplateDocsPage />} />
|
||||
<Route path="files" element={<TemplateFilesPage />} />
|
||||
<Route path="resources" element={<TemplateResourcesPage />} />
|
||||
<Route path="versions" element={<TemplateVersionsPage />} />
|
||||
<Route path="embed" element={<TemplateEmbedPage />} />
|
||||
<Route path="insights" element={<TemplateInsightsPage />} />
|
||||
|
||||
Reference in New Issue
Block a user