diff --git a/src/components/site/ComponentCatalogBrowser.tsx b/src/components/site/ComponentCatalogBrowser.tsx index 219fbbe7..ae62bb2d 100644 --- a/src/components/site/ComponentCatalogBrowser.tsx +++ b/src/components/site/ComponentCatalogBrowser.tsx @@ -35,6 +35,17 @@ function countByCategory(items: { category: string }[]) { return counts } +function componentRequestUrl(repoUrl: string, component: UpcomingComponent) { + const params = new URLSearchParams({ + area: 'New component', + proposal: `Ship ${component.title} (${component.slug}) as a Payload Components post component.`, + template: 'feature_request.yml', + title: `[feature] ${component.slug}`, + }) + + return `${repoUrl}/issues/new?${params.toString()}` +} + export function ComponentCatalogBrowser({ categories, families, @@ -273,7 +284,11 @@ export function ComponentCatalogBrowser({ ) : null}
{postsCards.map((component) => ( - + ))}
diff --git a/src/components/site/ComponentGrid.tsx b/src/components/site/ComponentGrid.tsx index b99d2530..7ea57d0d 100644 --- a/src/components/site/ComponentGrid.tsx +++ b/src/components/site/ComponentGrid.tsx @@ -138,7 +138,13 @@ function ComponentThumb({ muted = false, slug }: { muted?: boolean; slug: string /* Cards */ /* ------------------------------------------------------------------ */ -export function UpcomingComponentCard({ component }: { component: UpcomingComponent }) { +export function UpcomingComponentCard({ + component, + requestHref, +}: { + component: UpcomingComponent + requestHref?: string +}) { return (
@@ -154,9 +160,21 @@ export function UpcomingComponentCard({ component }: { component: UpcomingCompon

{component.description}

- - {component.target} - +
+ + {component.target} + + {requestHref ? ( + + Request + + ) : null} +
) diff --git a/tests/e2e/frontend.e2e.spec.ts b/tests/e2e/frontend.e2e.spec.ts index e5a07e0a..2a5eef87 100644 --- a/tests/e2e/frontend.e2e.spec.ts +++ b/tests/e2e/frontend.e2e.spec.ts @@ -7,6 +7,7 @@ import { landingSections, primaryInstallCommand, terminalDemoLines, + upcomingComponents, } from '../../src/lib/site' const baseURL = `http://localhost:${process.env.E2E_PORT ?? '3100'}` @@ -273,6 +274,27 @@ test.describe('Light shadcn frontend', () => { await expect(page.locator('#hero-basic')).toBeHidden() }) + test('links upcoming components to prefilled request issues', async ({ page }) => { + const component = upcomingComponents.find((entry) => entry.slug === 'post-card')! + + await page.goto(`${baseURL}/components?type=posts`) + + const requestLink = page.getByRole('link', { name: 'Request' }).first() + await expect(requestLink).toBeVisible() + await expect(requestLink).toHaveAttribute( + 'href', + new RegExp( + `/issues/new\\?${[ + 'area=New\\+component', + 'proposal=Ship\\+Post\\+Card\\+%28post-card%29\\+as\\+a\\+Payload\\+Components\\+post\\+component\\.', + 'template=feature_request\\.yml', + 'title=%5Bfeature%5D\\+post-card', + ].join('.*')}`, + ), + ) + await expect(page.getByText(component.title).first()).toBeVisible() + }) + test('exposes every landing section, the catalog teaser, and the footer', async ({ page }) => { await page.goto(baseURL)