Thanks to visit codestin.com
Credit goes to github.com

Skip to content

refactor: Remove template UI from experimental #5555

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 3, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from "components/PageHeader/PageHeader"
import { FC } from "react"
import { StarterTemplateContext } from "xServices/starterTemplates/starterTemplateXService"
import EyeIcon from "@material-ui/icons/VisibilityOutlined"
import ViewCodeIcon from "@material-ui/icons/OpenInNewOutlined"
import PlusIcon from "@material-ui/icons/AddOutlined"
import { AlertBanner } from "components/AlertBanner/AlertBanner"
import { useTranslation } from "react-i18next"
Expand Down Expand Up @@ -50,7 +50,7 @@ export const StarterTemplatePageView: FC<StarterTemplatePageViewProps> = ({
target="_blank"
href={starterTemplate.url}
rel="noreferrer"
startIcon={<EyeIcon />}
startIcon={<ViewCodeIcon />}
>
{t("actions.viewSourceCode")}
</Button>
Expand Down
49 changes: 16 additions & 33 deletions site/src/pages/TemplatesPage/EmptyTemplates.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Button from "@material-ui/core/Button"
import Link from "@material-ui/core/Link"
import { makeStyles } from "@material-ui/core/styles"
import { Entitlements, TemplateExample } from "api/typesGenerated"
import { TemplateExample } from "api/typesGenerated"
import { CodeExample } from "components/CodeExample/CodeExample"
import { Stack } from "components/Stack/Stack"
import { TableEmpty } from "components/TableEmpty/TableEmpty"
Expand All @@ -12,7 +12,7 @@ import { Link as RouterLink } from "react-router-dom"
import { Permissions } from "xServices/auth/authXService"

// Those are from https://github.com/coder/coder/tree/main/examples/templates
const featuredExamples = [
const featuredExampleIds = [
"docker",
"kubernetes",
"aws-linux",
Expand All @@ -22,19 +22,29 @@ const featuredExamples = [
]

const findFeaturedExamples = (examples: TemplateExample[]) => {
return examples.filter((example) => featuredExamples.includes(example.id))
const featuredExamples: TemplateExample[] = []

// We loop the featuredExampleIds first to keep the order
featuredExampleIds.forEach((exampleId) => {
examples.forEach((example) => {
if (exampleId === example.id) {
featuredExamples.push(example)
}
})
})

return featuredExamples
}

export const EmptyTemplates: FC<{
permissions: Permissions
examples: TemplateExample[]
entitlements: Entitlements
}> = ({ permissions, examples, entitlements }) => {
}> = ({ permissions, examples }) => {
const styles = useStyles()
const { t } = useTranslation("templatesPage")
const featuredExamples = findFeaturedExamples(examples)

if (permissions.createTemplates && entitlements.experimental) {
if (permissions.createTemplates) {
return (
<TableEmpty
message={t("empty.message")}
Expand Down Expand Up @@ -81,33 +91,6 @@ export const EmptyTemplates: FC<{
)
}

if (permissions.createTemplates) {
return (
<TableEmpty
className={styles.withImage}
message={t("empty.message")}
description={
<>
To create a workspace you need to have a template. You can{" "}
<Link
target="_blank"
href="https://coder.com/docs/coder-oss/latest/templates"
>
create one from scratch
</Link>{" "}
or use a built-in template using the following Coder CLI command:
</>
}
cta={<CodeExample code="coder templates init" />}
image={
<div className={styles.emptyImage}>
<img src="/featured/templates.webp" alt="" />
</div>
}
/>
)
}

return (
<TableEmpty
className={styles.withImage}
Expand Down
7 changes: 1 addition & 6 deletions site/src/pages/TemplatesPage/TemplatesPage.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { useMachine } from "@xstate/react"
import { useEntitlements } from "hooks/useEntitlements"
import { useOrganizationId } from "hooks/useOrganizationId"
import { usePermissions } from "hooks/usePermissions"
import React from "react"
Expand All @@ -11,7 +10,6 @@ import { TemplatesPageView } from "./TemplatesPageView"
export const TemplatesPage: React.FC = () => {
const organizationId = useOrganizationId()
const permissions = usePermissions()
const entitlements = useEntitlements()
const [templatesState] = useMachine(templatesMachine, {
context: {
organizationId,
Expand All @@ -24,10 +22,7 @@ export const TemplatesPage: React.FC = () => {
<Helmet>
<title>{pageTitle("Templates")}</title>
</Helmet>
<TemplatesPageView
context={templatesState.context}
entitlements={entitlements}
/>
<TemplatesPageView context={templatesState.context} />
</>
)
}
Expand Down
20 changes: 0 additions & 20 deletions site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { ComponentMeta, Story } from "@storybook/react"
import {
makeMockApiError,
MockEntitlements,
MockOrganization,
MockPermissions,
MockTemplate,
Expand All @@ -21,7 +20,6 @@ const Template: Story<TemplatesPageViewProps> = (args) => (

export const WithTemplates = Template.bind({})
WithTemplates.args = {
entitlements: MockEntitlements,
context: {
organizationId: MockOrganization.id,
permissions: MockPermissions,
Expand Down Expand Up @@ -60,22 +58,6 @@ WithTemplatesSmallViewPort.parameters = {

export const EmptyCanCreate = Template.bind({})
EmptyCanCreate.args = {
entitlements: MockEntitlements,
context: {
organizationId: MockOrganization.id,
permissions: MockPermissions,
error: undefined,
templates: [],
examples: [MockTemplateExample, MockTemplateExample2],
},
}

export const EmptyCanCreateExperimental = Template.bind({})
EmptyCanCreateExperimental.args = {
entitlements: {
...MockEntitlements,
experimental: true,
},
context: {
organizationId: MockOrganization.id,
permissions: MockPermissions,
Expand All @@ -87,7 +69,6 @@ EmptyCanCreateExperimental.args = {

export const EmptyCannotCreate = Template.bind({})
EmptyCannotCreate.args = {
entitlements: MockEntitlements,
context: {
organizationId: MockOrganization.id,
permissions: {
Expand All @@ -102,7 +83,6 @@ EmptyCannotCreate.args = {

export const Error = Template.bind({})
Error.args = {
entitlements: MockEntitlements,
context: {
organizationId: MockOrganization.id,
permissions: {
Expand Down
9 changes: 2 additions & 7 deletions site/src/pages/TemplatesPage/TemplatesPageView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import {
} from "../../components/Tooltips/HelpTooltip/HelpTooltip"
import { EmptyTemplates } from "./EmptyTemplates"
import { TemplatesContext } from "xServices/templates/templatesXService"
import { Entitlements } from "api/typesGenerated"

export const Language = {
developerCount: (activeCount: number): string => {
Expand Down Expand Up @@ -74,12 +73,11 @@ const TemplateHelpTooltip: React.FC = () => {

export interface TemplatesPageViewProps {
context: TemplatesContext
entitlements: Entitlements
}

export const TemplatesPageView: FC<
React.PropsWithChildren<TemplatesPageViewProps>
> = ({ context, entitlements }) => {
> = ({ context }) => {
const styles = useStyles()
const navigate = useNavigate()
const theme: Theme = useTheme()
Expand All @@ -91,9 +89,7 @@ export const TemplatesPageView: FC<
<Margins>
<PageHeader
actions={
<Maybe
condition={entitlements.experimental && permissions.createTemplates}
>
<Maybe condition={permissions.createTemplates}>
<Button component={RouterLink} to="/starter-templates">
Starter templates
</Button>
Expand Down Expand Up @@ -158,7 +154,6 @@ export const TemplatesPageView: FC<
<EmptyTemplates
permissions={permissions}
examples={examples ?? []}
entitlements={entitlements}
/>
</Cond>

Expand Down
8 changes: 1 addition & 7 deletions site/src/testHelpers/entities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1077,14 +1077,8 @@ export const MockTemplateExample: TypesGen.TemplateExample = {
}

export const MockTemplateExample2: TypesGen.TemplateExample = {
...MockTemplateExample,
id: "aws-linux",
url: "https://github.com/coder/coder/tree/main/examples/templates/aws-linux",
name: "Develop in Linux on AWS EC2",
description: "Get started with Linux development on AWS EC2.",
markdown:
'\n# aws-linux\n\nTo get started, run `coder templates init`. When prompted, select this template.\nFollow the on-screen instructions to proceed.\n\n## Authentication\n\nThis template assumes that coderd is run in an environment that is authenticated\nwith AWS. For example, run `aws configure import` to import credentials on the\nsystem and user running coderd. For other ways to authenticate [consult the\nTerraform docs](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication-and-configuration).\n\n## Required permissions / policy\n\nThe following sample policy allows Coder to create EC2 instances and modify\ninstances provisioned by Coder:\n\n```json\n{\n "Version": "2012-10-17",\n "Statement": [\n {\n "Sid": "VisualEditor0",\n "Effect": "Allow",\n "Action": [\n "ec2:GetDefaultCreditSpecification",\n "ec2:DescribeIamInstanceProfileAssociations",\n "ec2:DescribeTags",\n "ec2:CreateTags",\n "ec2:RunInstances",\n "ec2:DescribeInstanceCreditSpecifications",\n "ec2:DescribeImages",\n "ec2:ModifyDefaultCreditSpecification",\n "ec2:DescribeVolumes"\n ],\n "Resource": "*"\n },\n {\n "Sid": "CoderResources",\n "Effect": "Allow",\n "Action": [\n "ec2:DescribeInstances",\n "ec2:DescribeInstanceAttribute",\n "ec2:UnmonitorInstances",\n "ec2:TerminateInstances",\n "ec2:StartInstances",\n "ec2:StopInstances",\n "ec2:DeleteTags",\n "ec2:MonitorInstances",\n "ec2:CreateTags",\n "ec2:RunInstances",\n "ec2:ModifyInstanceAttribute",\n "ec2:ModifyInstanceCreditSpecification"\n ],\n "Resource": "arn:aws:ec2:*:*:instance/*",\n "Condition": {\n "StringEquals": {\n "aws:ResourceTag/Coder_Provisioned": "true"\n }\n }\n }\n ]\n}\n```\n\n## code-server\n\n`code-server` is installed via the `startup_script` argument in the `coder_agent`\nresource block. The `coder_app` resource is defined to access `code-server` through\nthe dashboard UI over `localhost:13337`.\n',
icon: "/icon/aws.png",
tags: ["aws", "cloud"],
}

export const MockPermissions: Permissions = {
Expand Down