@burdenoff/microfe-planmagnet 2026.923.2 → 2026.923.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -102,6 +102,7 @@ function T() {
|
|
|
102
102
|
children: E("planmagnet.products.subtitle", "Manage your product portfolio and track feature development")
|
|
103
103
|
})] }), /* @__PURE__ */ m(_, {
|
|
104
104
|
size: "sm",
|
|
105
|
+
onClick: () => T("/products/create-product-page"),
|
|
105
106
|
children: [/* @__PURE__ */ p(u, { className: "h-4 w-4 mr-1" }), E("planmagnet.products.actions.newProduct", "New Product")]
|
|
106
107
|
})]
|
|
107
108
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProductsProductsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Package, Plus, TrendingUp, Calendar, GitBranch, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\n\nconst LIST_ROADMAPS = gql`\n query ListRoadmaps($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetRoadmaps(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n items {\n id\n status\n }\n }\n totalCount\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS = gql`\n query ListFeatureRequestsForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES = gql`\n query ListReleasesForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\ninterface RoadmapNode {\n id: string;\n name: string;\n description: string | null;\n type: string;\n isPublic: boolean;\n ownerId: string;\n createdAt: string;\n updatedAt: string;\n items: { id: string; status: string }[];\n}\n\nexport function ProductsProductsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { t } = useI18n();\n const [view, setView] = useState<'grid' | 'list'>('grid');\n\n const {\n data: roadmapsData,\n loading: roadmapsLoading,\n error: roadmapsError,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = useQuery<Record<string, any>>(LIST_ROADMAPS, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const {\n data: featuresData,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_FEATURE_REQUESTS, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_RELEASES, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n if (roadmapsLoading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (roadmapsError) {\n return (\n <div className=\"p-6 text-destructive\">\n {t('planmagnet.products.errorLoading', 'Failed to load products')}: {roadmapsError.message}\n </div>\n );\n }\n\n const roadmaps: RoadmapNode[] = roadmapsData?.planmagnetRoadmaps?.items ?? [];\n const totalRoadmaps = roadmapsData?.planmagnetRoadmaps?.totalCount ?? 0;\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeLabel = (t: string) => {\n switch (t) {\n case 'TIMELINE':\n return 'default';\n case 'GANTT':\n return 'secondary';\n case 'SWIMLANE':\n return 'outline';\n default:\n return 'outline';\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <Package className=\"h-6 w-6\" /> {t('planmagnet.products.title', 'Products')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t(\n 'planmagnet.products.subtitle',\n 'Manage your product portfolio and track feature development'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('planmagnet.products.actions.newProduct', 'New Product')}\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n label: t('planmagnet.products.metrics.totalProducts', 'Total Products'),\n val: totalRoadmaps,\n icon: Package,\n color: 'text-blue-500',\n },\n {\n label: t('planmagnet.products.metrics.activeFeatures', 'Active Features'),\n val: totalFeatures,\n icon: GitBranch,\n color: 'text-green-500',\n },\n {\n label: t('planmagnet.products.metrics.releases', 'Releases'),\n val: totalReleases,\n icon: Calendar,\n color: 'text-purple-500',\n },\n {\n label: t('planmagnet.products.metrics.roadmaps', 'Roadmaps'),\n val: totalRoadmaps,\n icon: Map,\n color: 'text-orange-500',\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">{s.label}</p>\n <p className=\"text-2xl font-bold\">{s.val}</p>\n </div>\n <s.icon className={`h-8 w-8 ${s.color} opacity-60`} />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-2\">\n {roadmaps.map((roadmap) => (\n <Card\n key={roadmap.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/product-detail-page', roadmap.id)),\n roadmap.name\n )}\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{roadmap.name}</CardTitle>\n <Badge variant={typeLabel(roadmap.type)}>{roadmap.type.toLowerCase()}</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ??\n t('planmagnet.products.shared.noDescription', 'No description')}\n </p>\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.items?.length ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.items', 'Items')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">\n {roadmap.isPublic\n ? t('planmagnet.products.shared.public', 'Public')\n : t('planmagnet.products.shared.private', 'Private')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.visibility', 'Visibility')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.type.toLowerCase()}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.type', 'Type')}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {t('planmagnet.products.shared.owner', 'Owner')}: {roadmap.ownerId}\n </span>\n <span>\n {t('planmagnet.products.shared.updated', 'Updated')}{' '}\n {new Date(roadmap.updatedAt).toLocaleDateString()}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,IAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;GA0BnB,IAAwB,CAAG;;;;;;GAQ3B,IAAgB,CAAG;;;;;;;AAoBzB,SAAgB,IAA2B;CACzC,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,EAAE,SAAM,GAAS,EACjB,CAAC,GAAM,KAAW,EAA0B,OAAO,EAEnD,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MAEL,EAA8B,GAAe;EAE/C,WAAW;GAAE;GAAa,YAAY,EAAE,OAAO,IAAI;GAAE;EACrD,MAAM,CAAC;EACR,CAAC,EAEI,EACJ,MAAM,MAGN,EAA8B,GAAuB;EACnD,WAAW;GAAE;GAAa,YAAY,EAAE,OAAO,GAAG;GAAE;EACpD,MAAM,CAAC;EACR,CAAC,EAEE,EACJ,MAAM,MAGN,EAA8B,GAAe;EAC3C,WAAW;GAAE;GAAa,YAAY,EAAE,OAAO,GAAG;GAAE;EACpD,MAAM,CAAC;EACR,CAAC;AAEJ,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAS,WAAU,8CAA+C,CAAA;EAC9D,CAAA;AAIV,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACG,EAAE,oCAAoC,0BAA0B;GAAC;GAAG,EAAc;GAC/E;;CAIV,IAAM,IAA0B,GAAc,oBAAoB,SAAS,EAAE,EACvE,IAAgB,GAAc,oBAAoB,cAAc,GAChE,IAAgB,GAAc,2BAA2B,cAAc,GACvE,IAAgB,GAAc,oBAAoB,cAAc,GAEhE,KAAa,MAAc;AAC/B,UAAQ,GAAR;GACE,KAAK,WACH,QAAO;GACT,KAAK,QACH,QAAO;GACT,KAAK,WACH,QAAO;GACT,QACE,QAAO;;;AAIb,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd;MACE,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA;;MAAE,EAAE,6BAA6B,WAAW;MACxE;QACL,kBAAC,KAAD;KAAG,WAAU;eACV,EACC,gCACA,8DACD;KACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAChC,EAAE,0CAA0C,cAAc,CACpD;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MACE,OAAO,EAAE,6CAA6C,iBAAiB;MACvE,KAAK;MACL,MAAM;MACN,OAAO;MACR;KACD;MACE,OAAO,EAAE,8CAA8C,kBAAkB;MACzE,KAAK;MACL,MAAM;MACN,OAAO;MACR;KACD;MACE,OAAO,EAAE,wCAAwC,WAAW;MAC5D,KAAK;MACL,MAAM;MACN,OAAO;MACR;KACD;MACE,OAAO,EAAE,wCAAwC,WAAW;MAC5D,KAAK;MACL,MAAM;MACN,OAAO;MACR;KACF,CAAC,KAAK,MACL,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eACrB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAE;OAAU,CAAA,EAC1D,kBAAC,KAAD;OAAG,WAAU;iBAAsB,EAAE;OAAQ,CAAA,CACzC,EAAA,CAAA,EACN,kBAAC,EAAE,MAAH,EAAQ,WAAW,WAAW,EAAE,MAAM,cAAgB,CAAA,CAClD;;KACM,CAAA,EACT,EAVI,EAAE,MAUN,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,KAAK,MACb,kBAAC,GAAD;KAEE,GAAI,QACI,EAAS,EAAW,iCAAiC,EAAQ,GAAG,CAAC,EACvE,EAAQ,KACT;eALH,CAOE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,WAAU;iBAAa,EAAQ;OAAiB,CAAA,EAC3D,kBAAC,GAAD;OAAO,SAAS,EAAU,EAAQ,KAAK;iBAAG,EAAQ,KAAK,aAAa;OAAS,CAAA,CACzE;SACK,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ,eACP,EAAE,4CAA4C,iBAAiB;QAC/D,CAAA;OACJ,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAqB,EAAQ,OAAO,UAAU;WAAM,CAAA,EACjE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAE,oCAAoC,QAAQ;WAC7C,CAAA,CACA;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAQ,WACL,EAAE,qCAAqC,SAAS,GAChD,EAAE,sCAAsC,UAAU;WACpD,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAE,yCAAyC,aAAa;WACvD,CAAA,CACA;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAqB,EAAQ,KAAK,aAAa;WAAK,CAAA,EACjE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAE,mCAAmC,OAAO;WAC3C,CAAA,CACA;;SACF;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD,EAAA,UAAA;SACG,EAAE,oCAAoC,QAAQ;SAAC;SAAG,EAAQ;SACtD,EAAA,CAAA,EACP,kBAAC,QAAD,EAAA,UAAA;SACG,EAAE,sCAAsC,UAAU;SAAE;SACpD,IAAI,KAAK,EAAQ,UAAU,CAAC,oBAAoB;SAC5C,EAAA,CAAA,CACH;;OACM;QACT;OAnDA,EAAQ,GAmDR,CACP;IACE,CAAA;GACF"}
|
|
1
|
+
{"version":3,"file":"ProductsProductsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProductsProductsPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Package, Plus, TrendingUp, Calendar, GitBranch, Map, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\n\nconst LIST_ROADMAPS = gql`\n query ListRoadmaps($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetRoadmaps(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n workspaceId\n name\n description\n type\n isPublic\n ownerId\n metadata\n createdBy\n createdAt\n updatedAt\n updatedBy\n items {\n id\n status\n }\n }\n totalCount\n }\n }\n`;\n\nconst LIST_FEATURE_REQUESTS = gql`\n query ListFeatureRequestsForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\nconst LIST_RELEASES = gql`\n query ListReleasesForProducts($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n }\n }\n`;\n\ninterface RoadmapNode {\n id: string;\n name: string;\n description: string | null;\n type: string;\n isPublic: boolean;\n ownerId: string;\n createdAt: string;\n updatedAt: string;\n items: { id: string; status: string }[];\n}\n\nexport function ProductsProductsPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { t } = useI18n();\n const [view, setView] = useState<'grid' | 'list'>('grid');\n\n const {\n data: roadmapsData,\n loading: roadmapsLoading,\n error: roadmapsError,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = useQuery<Record<string, any>>(LIST_ROADMAPS, {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const {\n data: featuresData,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_FEATURE_REQUESTS, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n const {\n data: releasesData,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(LIST_RELEASES, {\n variables: { workspaceId, pagination: { first: 1 } },\n skip: !workspaceId,\n });\n\n if (roadmapsLoading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n if (roadmapsError) {\n return (\n <div className=\"p-6 text-destructive\">\n {t('planmagnet.products.errorLoading', 'Failed to load products')}: {roadmapsError.message}\n </div>\n );\n }\n\n const roadmaps: RoadmapNode[] = roadmapsData?.planmagnetRoadmaps?.items ?? [];\n const totalRoadmaps = roadmapsData?.planmagnetRoadmaps?.totalCount ?? 0;\n const totalFeatures = featuresData?.planmagnetFeatureRequests?.totalCount ?? 0;\n const totalReleases = releasesData?.planmagnetReleases?.totalCount ?? 0;\n\n const typeLabel = (t: string) => {\n switch (t) {\n case 'TIMELINE':\n return 'default';\n case 'GANTT':\n return 'secondary';\n case 'SWIMLANE':\n return 'outline';\n default:\n return 'outline';\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <Package className=\"h-6 w-6\" /> {t('planmagnet.products.title', 'Products')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t(\n 'planmagnet.products.subtitle',\n 'Manage your product portfolio and track feature development'\n )}\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/products/create-product-page')}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('planmagnet.products.actions.newProduct', 'New Product')}\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n label: t('planmagnet.products.metrics.totalProducts', 'Total Products'),\n val: totalRoadmaps,\n icon: Package,\n color: 'text-blue-500',\n },\n {\n label: t('planmagnet.products.metrics.activeFeatures', 'Active Features'),\n val: totalFeatures,\n icon: GitBranch,\n color: 'text-green-500',\n },\n {\n label: t('planmagnet.products.metrics.releases', 'Releases'),\n val: totalReleases,\n icon: Calendar,\n color: 'text-purple-500',\n },\n {\n label: t('planmagnet.products.metrics.roadmaps', 'Roadmaps'),\n val: totalRoadmaps,\n icon: Map,\n color: 'text-orange-500',\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm text-muted-foreground\">{s.label}</p>\n <p className=\"text-2xl font-bold\">{s.val}</p>\n </div>\n <s.icon className={`h-8 w-8 ${s.color} opacity-60`} />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-2\">\n {roadmaps.map((roadmap) => (\n <Card\n key={roadmap.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/product-detail-page', roadmap.id)),\n roadmap.name\n )}\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{roadmap.name}</CardTitle>\n <Badge variant={typeLabel(roadmap.type)}>{roadmap.type.toLowerCase()}</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {roadmap.description ??\n t('planmagnet.products.shared.noDescription', 'No description')}\n </p>\n <div className=\"grid grid-cols-3 gap-2 text-center\">\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.items?.length ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.items', 'Items')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">\n {roadmap.isPublic\n ? t('planmagnet.products.shared.public', 'Public')\n : t('planmagnet.products.shared.private', 'Private')}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.visibility', 'Visibility')}\n </p>\n </div>\n <div className=\"rounded border p-2\">\n <p className=\"text-lg font-bold\">{roadmap.type.toLowerCase()}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.products.shared.type', 'Type')}\n </p>\n </div>\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {t('planmagnet.products.shared.owner', 'Owner')}: {roadmap.ownerId}\n </span>\n <span>\n {t('planmagnet.products.shared.updated', 'Updated')}{' '}\n {new Date(roadmap.updatedAt).toLocaleDateString()}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|