From b46685c88765b6d7948ebfe55ac56482688cfbc5 Mon Sep 17 00:00:00 2001 From: fonodi Date: Tue, 5 May 2026 01:59:59 +0200 Subject: [PATCH 1/7] feat(ui): init dynamic grid components --- apps/strapi/.env.example | 6 ++ .../api/page/content-types/page/schema.json | 8 +- .../sections/dynamic-case-studies-grid.json | 14 ++++ .../sections/dynamic-features-grid.json | 14 ++++ .../sections/dynamic-case-studies-grid.ts | 1 + .../sections/dynamic-features-grid.ts | 1 + apps/strapi/types/generated/components.d.ts | 22 +++++ apps/strapi/types/generated/contentTypes.d.ts | 2 + .../ui/src/app/[locale]/user-stories/page.tsx | 82 ------------------- .../src/components/layouts/StrapiPageView.tsx | 2 - .../StrapiDynamicCaseStudiesGrid.tsx | 27 ++++++ .../StrapiDynamicFeaturesGrid.tsx | 27 ++++++ apps/ui/src/components/page-builder/index.tsx | 4 + 13 files changed, 123 insertions(+), 87 deletions(-) create mode 100644 apps/strapi/src/components/sections/dynamic-case-studies-grid.json create mode 100644 apps/strapi/src/components/sections/dynamic-features-grid.json create mode 100644 apps/strapi/src/populateDynamicZone/sections/dynamic-case-studies-grid.ts create mode 100644 apps/strapi/src/populateDynamicZone/sections/dynamic-features-grid.ts delete mode 100644 apps/ui/src/app/[locale]/user-stories/page.tsx create mode 100644 apps/ui/src/components/page-builder/components/sections/strapi-dynamic-grid/StrapiDynamicCaseStudiesGrid.tsx create mode 100644 apps/ui/src/components/page-builder/components/sections/strapi-dynamic-grid/StrapiDynamicFeaturesGrid.tsx diff --git a/apps/strapi/.env.example b/apps/strapi/.env.example index e68aeaf4..36dc5dd3 100644 --- a/apps/strapi/.env.example +++ b/apps/strapi/.env.example @@ -69,3 +69,9 @@ STRAPI_PREVIEW_SECRET=your-secret-key # Shared secret with the Next.js app for triggering on-demand revalidation. # Must match `STRAPI_REVALIDATE_SECRET` in apps/ui/.env.local. STRAPI_REVALIDATE_SECRET=your-revalidate-secret + +# ------- Meilisearch ------- + +# DANGER: Should be false while developing, to not populate production with test data. +# DANGER: If you are not sure always leave false +MEILISEARCH_PRODUCTION=false \ No newline at end of file diff --git a/apps/strapi/src/api/page/content-types/page/schema.json b/apps/strapi/src/api/page/content-types/page/schema.json index 721446b8..ee3e4f55 100644 --- a/apps/strapi/src/api/page/content-types/page/schema.json +++ b/apps/strapi/src/api/page/content-types/page/schema.json @@ -92,7 +92,9 @@ "sections.community-banner", "sections.comparator-grid", "sections.disclaimer", - "sections.richtext" + "sections.richtext", + "sections.dynamic-case-studies-grid", + "sections.dynamic-features-grid" ] }, "children": { @@ -109,12 +111,12 @@ }, "minimalLayout": { "type": "boolean", - "default": false, "pluginOptions": { "i18n": { "localized": false } - } + }, + "default": false }, "seo": { "type": "component", diff --git a/apps/strapi/src/components/sections/dynamic-case-studies-grid.json b/apps/strapi/src/components/sections/dynamic-case-studies-grid.json new file mode 100644 index 00000000..055ef2c5 --- /dev/null +++ b/apps/strapi/src/components/sections/dynamic-case-studies-grid.json @@ -0,0 +1,14 @@ +{ + "collectionName": "components_sections_dynamic_case_studies_grids", + "info": { + "displayName": "DynamicCaseStudiesGrid" + }, + "options": {}, + "attributes": { + "isHidden": { + "type": "boolean", + "default": false + } + }, + "config": {} +} diff --git a/apps/strapi/src/components/sections/dynamic-features-grid.json b/apps/strapi/src/components/sections/dynamic-features-grid.json new file mode 100644 index 00000000..f842453a --- /dev/null +++ b/apps/strapi/src/components/sections/dynamic-features-grid.json @@ -0,0 +1,14 @@ +{ + "collectionName": "components_sections_dynamic_features_grids", + "info": { + "displayName": "DynamicFeaturesGrid" + }, + "options": {}, + "attributes": { + "isHidden": { + "type": "boolean", + "default": false + } + }, + "config": {} +} diff --git a/apps/strapi/src/populateDynamicZone/sections/dynamic-case-studies-grid.ts b/apps/strapi/src/populateDynamicZone/sections/dynamic-case-studies-grid.ts new file mode 100644 index 00000000..186b1207 --- /dev/null +++ b/apps/strapi/src/populateDynamicZone/sections/dynamic-case-studies-grid.ts @@ -0,0 +1 @@ +export default true diff --git a/apps/strapi/src/populateDynamicZone/sections/dynamic-features-grid.ts b/apps/strapi/src/populateDynamicZone/sections/dynamic-features-grid.ts new file mode 100644 index 00000000..186b1207 --- /dev/null +++ b/apps/strapi/src/populateDynamicZone/sections/dynamic-features-grid.ts @@ -0,0 +1 @@ +export default true diff --git a/apps/strapi/types/generated/components.d.ts b/apps/strapi/types/generated/components.d.ts index 9570a439..ef9e994c 100644 --- a/apps/strapi/types/generated/components.d.ts +++ b/apps/strapi/types/generated/components.d.ts @@ -1009,6 +1009,26 @@ export interface SectionsDisclaimer extends Struct.ComponentSchema { } } +export interface SectionsDynamicCaseStudiesGrid extends Struct.ComponentSchema { + collectionName: "components_sections_dynamic_case_studies_grids" + info: { + displayName: "DynamicCaseStudiesGrid" + } + attributes: { + isHidden: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo + } +} + +export interface SectionsDynamicFeaturesGrid extends Struct.ComponentSchema { + collectionName: "components_sections_dynamic_features_grids" + info: { + displayName: "DynamicFeaturesGrid" + } + attributes: { + isHidden: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo + } +} + export interface SectionsFaqSection extends Struct.ComponentSchema { collectionName: "components_sections_faq_section" info: { @@ -1557,6 +1577,8 @@ declare module "@strapi/strapi" { "sections.comparator-grid": SectionsComparatorGrid "sections.cta-banner": SectionsCtaBanner "sections.disclaimer": SectionsDisclaimer + "sections.dynamic-case-studies-grid": SectionsDynamicCaseStudiesGrid + "sections.dynamic-features-grid": SectionsDynamicFeaturesGrid "sections.faq-section": SectionsFaqSection "sections.feature-card-grid": SectionsFeatureCardGrid "sections.hero": SectionsHero diff --git a/apps/strapi/types/generated/contentTypes.d.ts b/apps/strapi/types/generated/contentTypes.d.ts index 719bc05e..d5740d46 100644 --- a/apps/strapi/types/generated/contentTypes.d.ts +++ b/apps/strapi/types/generated/contentTypes.d.ts @@ -1271,6 +1271,8 @@ export interface ApiPagePage extends Struct.CollectionTypeSchema { "sections.comparator-grid", "sections.disclaimer", "sections.richtext", + "sections.dynamic-case-studies-grid", + "sections.dynamic-features-grid", ] > & Schema.Attribute.SetPluginOptions<{ diff --git a/apps/ui/src/app/[locale]/user-stories/page.tsx b/apps/ui/src/app/[locale]/user-stories/page.tsx deleted file mode 100644 index 9fe3c0dd..00000000 --- a/apps/ui/src/app/[locale]/user-stories/page.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { Metadata } from "next" -import type { Locale } from "next-intl" -import { getTranslations, setRequestLocale } from "next-intl/server" - -import { CaseStudiesGrid } from "@/components/case-study/CaseStudiesGrid" -import { Container } from "@/components/elementary/Container" -import { - HeroContainer, - HeroContainerBorder, - HeroContainerContent, -} from "@/components/elementary/HeroContainer" -import { - SectionDescription, - SectionHeader, - SectionHeaderContainer, - SectionLabel, - SectionTitle, -} from "@/components/elementary/section-header" -import { fetchCaseStudiesList } from "@/lib/strapi-api/content/server" - -export const dynamic = "force-static" - -interface RouteProps { - params: Promise<{ locale: string }> -} - -export async function generateMetadata(props: RouteProps): Promise { - const { locale } = await props.params - const t = await getTranslations({ - locale: locale as Locale, - namespace: "caseStudies", - }) - - return { - title: t("title"), - description: t("description"), - } -} - -export default async function UserStoriesIndexPage(props: RouteProps) { - const { locale: localeParam } = await props.params - const locale = localeParam as Locale - - setRequestLocale(locale) - - const [t, listRes] = await Promise.all([ - getTranslations({ locale, namespace: "caseStudies" }), - fetchCaseStudiesList(locale), - ]) - - const items = listRes?.data ?? [] - - return ( - <> - - - - - - - - {t("sectionLabel")} - - - {t("title")} - - - {t("intro")} - - - - - - - - - - - - - ) -} diff --git a/apps/ui/src/components/layouts/StrapiPageView.tsx b/apps/ui/src/components/layouts/StrapiPageView.tsx index 43387b15..82fd2aad 100644 --- a/apps/ui/src/components/layouts/StrapiPageView.tsx +++ b/apps/ui/src/components/layouts/StrapiPageView.tsx @@ -60,9 +60,7 @@ export function StrapiPageView({ params, searchParams }: Props) {
{minimalLayout &&