@burdenoff/microfe-planmagnet 2026.925.15 → 2026.925.17
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.
- package/dist/generated/wspace-types.d.ts +50 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +67 -59
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/docs/DocStatusBadge.d.ts +8 -0
- package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +1 -0
- package/dist/planmagnet/docs/DocStatusBadge.js +28 -0
- package/dist/planmagnet/docs/DocStatusBadge.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +414 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts +3 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js +224 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +105 -98
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +130 -128
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts +7 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.js +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts +7 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +1 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.js +390 -0
- package/dist/planmagnet/releases/ReleaseReadinessCard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReleaseReadinessCard.js","names":[],"sources":["../../../src/planmagnet/releases/ReleaseReadinessCard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { CombinedGraphQLErrors } from '@apollo/client/errors';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport {\n AlertTriangle,\n CheckCircle2,\n Link2,\n Wallet,\n Users,\n ShieldAlert,\n Clock,\n} from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { RELEASE_GATES } from './ReleaseGatesCard';\n\n/**\n * Release overview (P1.4): what stands between this release and shipping, in\n * one place: unfinished and dependency-blocked work, gates not yet passed,\n * the budget position of its project, its open risks, and the customer\n * requests that ride on its unfinished work.\n *\n * Each part is read through its OWN gated query. Budgets, risks and feature\n * requests are separate RBAC resources (a product manager can read releases\n * but not budgets), so a part the viewer may not see says so, instead of the\n * release leaking it or the whole card failing.\n */\n\nconst READINESS = gql`\n query ReleaseReadiness($releaseId: ID!) {\n planmagnetReleaseReadiness(releaseId: $releaseId) {\n scope\n totalItems\n doneItems\n openWorkItemIds\n blockers {\n workItem {\n id\n key\n title\n status\n }\n waitingOn {\n id\n key\n title\n status\n projectId\n }\n }\n }\n }\n`;\nconst BUDGETS = gql`\n query ReleaseBudgets($workspaceId: ID!, $projectId: String!) {\n planmagnetBudgets(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 50 }\n ) {\n items {\n id\n name\n status\n currency\n plannedAmount\n spentAmount\n remainingAmount\n approvedAt\n }\n }\n }\n`;\nconst RISKS = gql`\n query ReleaseRisks($workspaceId: ID!, $projectId: String!) {\n planmagnetRisks(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 100 }\n ) {\n items {\n id\n title\n severity\n status\n riskScore\n }\n }\n }\n`;\nconst REQUESTS = gql`\n query ReleaseCustomerRequests($workspaceId: ID!, $projectId: String!) {\n planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 100 }\n ) {\n items {\n id\n title\n status\n voteCount\n workItemId\n }\n }\n }\n`;\n\ninterface ItemRef {\n id: string;\n key: string;\n title: string;\n status: string;\n projectId?: string;\n}\ninterface Readiness {\n scope: 'WORK_ITEMS' | 'PROJECTS' | 'NONE';\n totalItems: number;\n doneItems: number;\n openWorkItemIds: string[];\n blockers: { workItem: ItemRef; waitingOn: ItemRef[] }[];\n}\ninterface Budget {\n id: string;\n name: string;\n status: string;\n currency: string;\n plannedAmount: number;\n spentAmount: number;\n remainingAmount: number;\n approvedAt: string | null;\n}\ninterface Risk {\n id: string;\n title: string;\n severity: string;\n status: string;\n riskScore: number;\n}\ninterface Request {\n id: string;\n title: string;\n status: string;\n voteCount: number;\n workItemId: string | null;\n}\n\nconst CLOSED_RISK = new Set(['RESOLVED', 'ACCEPTED', 'CLOSED']);\nconst CLOSED_REQUEST = new Set(['COMPLETED', 'DECLINED', 'DUPLICATE']);\nconst DAY = 24 * 60 * 60 * 1000;\n\nfunction denied(error: unknown): boolean {\n return (\n CombinedGraphQLErrors.is(error) && error.errors.some((e) => e.extensions?.code === 'FORBIDDEN')\n );\n}\n\n/** One part of the overview: its own title, and its own loading/denied/error state. */\nfunction Part({\n icon,\n title,\n testId,\n loading,\n error,\n children,\n}: {\n icon: ReactNode;\n title: string;\n testId: string;\n loading: boolean;\n error: unknown;\n children: ReactNode;\n}) {\n let body = children;\n if (error) {\n body = (\n <p className=\"text-sm text-muted-foreground\">\n {denied(error)\n ? 'Your role cannot see this.'\n : `Could not be loaded: ${error instanceof Error ? error.message : 'unknown error'}`}\n </p>\n );\n } else if (loading) {\n body = <p className=\"text-sm text-muted-foreground\">Loading…</p>;\n }\n return (\n <section className=\"space-y-1.5\" data-testid={testId}>\n <h3 className=\"flex items-center gap-2 text-sm font-medium\">\n {icon}\n {title}\n </h3>\n {body}\n </section>\n );\n}\n\nconst money = (amount: number, currency: string) => {\n try {\n return new Intl.NumberFormat(undefined, { style: 'currency', currency }).format(amount);\n } catch {\n return `${amount.toFixed(2)} ${currency}`;\n }\n};\n\nexport function ReleaseReadinessCard({\n releaseId,\n projectId,\n releaseStatus,\n plannedDate,\n}: {\n releaseId: string;\n projectId: string | null;\n releaseStatus: string;\n plannedDate: string | null;\n}) {\n const { workspaceId } = usePlanMagnet();\n // Read once: lateness is a property of the page view, not of each render.\n const [now] = useState(() => Date.now());\n const navigate = usePlanMagnetNavigate();\n const byProject = { variables: { workspaceId, projectId }, skip: !workspaceId || !projectId };\n\n const readiness = useQuery<{ planmagnetReleaseReadiness: Readiness }>(READINESS, {\n variables: { releaseId },\n });\n const gates = useQuery<{\n planmagnetRelease: { qualityGates: { id: string; name: string; status: string }[] } | null;\n }>(RELEASE_GATES, { variables: { id: releaseId } });\n const budgets = useQuery<{ planmagnetBudgets: { items: Budget[] } }>(BUDGETS, byProject);\n const risks = useQuery<{ planmagnetRisks: { items: Risk[] } }>(RISKS, byProject);\n const requests = useQuery<{ planmagnetFeatureRequests: { items: Request[] } }>(\n REQUESTS,\n byProject\n );\n\n const shipped = releaseStatus === 'RELEASED';\n const r = readiness.data?.planmagnetReleaseReadiness;\n const openGates = (gates.data?.planmagnetRelease?.qualityGates ?? []).filter(\n (g) => g.status !== 'PASSED' && g.status !== 'WAIVED'\n );\n const budgetRows = budgets.data?.planmagnetBudgets.items ?? [];\n const openRisks = (risks.data?.planmagnetRisks.items ?? [])\n .filter((risk) => !CLOSED_RISK.has(risk.status))\n .sort((a, b) => b.riskScore - a.riskScore);\n const openIds = new Set(r?.openWorkItemIds ?? []);\n const blockedIds = new Set((r?.blockers ?? []).map((b) => b.workItem.id));\n const riding = (requests.data?.planmagnetFeatureRequests.items ?? []).filter(\n (req) => req.workItemId && openIds.has(req.workItemId) && !CLOSED_REQUEST.has(req.status)\n );\n\n const daysLate =\n plannedDate && !shipped ? Math.floor((now - new Date(plannedDate).getTime()) / DAY) : null;\n\n // The headline lists every reason, not just the first one found.\n const reasons: string[] = [];\n if (daysLate !== null && daysLate > 0)\n reasons.push(`${daysLate} day${daysLate === 1 ? '' : 's'} past its planned date`);\n if (r && r.blockers.length > 0)\n reasons.push(`${r.blockers.length} blocked item${r.blockers.length === 1 ? '' : 's'}`);\n if (r && r.openWorkItemIds.length > 0)\n reasons.push(\n `${r.openWorkItemIds.length} unfinished item${r.openWorkItemIds.length === 1 ? '' : 's'}`\n );\n if (openGates.length > 0)\n reasons.push(`${openGates.length} gate${openGates.length === 1 ? '' : 's'} not passed`);\n const overBudget = budgetRows.filter((b) => b.remainingAmount < 0 || b.status === 'EXCEEDED');\n if (overBudget.length > 0) reasons.push('over budget');\n const settled = !readiness.loading && !gates.loading;\n\n return (\n <Card data-testid=\"release-readiness\">\n <CardHeader>\n <CardTitle>What stands between this release and shipping</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n {shipped ? (\n <p className=\"flex items-center gap-2 text-sm text-status-success-text\">\n <CheckCircle2 className=\"h-4 w-4\" /> Released.\n </p>\n ) : settled && reasons.length === 0 && r && r.scope !== 'NONE' ? (\n <p\n className=\"flex items-center gap-2 text-sm text-status-success-text\"\n data-testid=\"readiness-headline\"\n >\n <CheckCircle2 className=\"h-4 w-4\" /> Nothing is holding this release.\n </p>\n ) : settled && reasons.length > 0 ? (\n <p\n className=\"flex items-center gap-2 text-sm text-status-warning-text\"\n data-testid=\"readiness-headline\"\n >\n <AlertTriangle className=\"h-4 w-4 shrink-0\" /> Held by: {reasons.join(', ')}.\n </p>\n ) : null}\n\n <Part\n icon={<Link2 className=\"h-4 w-4\" />}\n title=\"Work and blockers\"\n testId=\"readiness-work\"\n loading={readiness.loading && !readiness.data}\n error={readiness.error}\n >\n {r && (\n <div className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">\n {r.scope === 'NONE'\n ? 'This release has no work items and no project, so there is nothing to track.'\n : r.scope === 'PROJECTS'\n ? `No work items are assigned to this release, so everything open in its project counts: ${r.totalItems} open.`\n : `${r.doneItems} of ${r.totalItems} work items done.`}\n </p>\n {r.blockers.length === 0 && r.scope !== 'NONE' && (\n <p className=\"text-sm text-muted-foreground\">\n No item is waiting on unfinished work.\n </p>\n )}\n <ul className=\"space-y-1.5\">\n {r.blockers.map((b) => (\n <li\n key={b.workItem.id}\n className=\"rounded-md border p-2 text-sm\"\n data-testid=\"readiness-blocker\"\n >\n <button\n type=\"button\"\n className=\"font-medium hover:underline text-left\"\n onClick={() =>\n navigate(\n `/tasks/task-detail-page?taskId=${encodeURIComponent(b.workItem.id)}`\n )\n }\n >\n {b.workItem.key} {b.workItem.title}\n </button>\n <span className=\"text-muted-foreground\"> waits on </span>\n {b.waitingOn.map((w, i) => (\n <span key={w.id}>\n {i > 0 && ', '}\n <button\n type=\"button\"\n className=\"hover:underline\"\n onClick={() =>\n navigate(`/tasks/task-detail-page?taskId=${encodeURIComponent(w.id)}`)\n }\n >\n {w.key} {w.title}\n </button>{' '}\n <span className=\"text-xs text-muted-foreground\">\n ({w.status.toLowerCase().replace('_', ' ')}\n {projectId && w.projectId && w.projectId !== projectId\n ? ', another project'\n : ''}\n )\n </span>\n </span>\n ))}\n </li>\n ))}\n </ul>\n </div>\n )}\n </Part>\n\n <Part\n icon={<ShieldAlert className=\"h-4 w-4\" />}\n title=\"Approvals\"\n testId=\"readiness-approvals\"\n loading={gates.loading && !gates.data}\n error={gates.error}\n >\n <p className=\"text-sm text-muted-foreground\">\n {openGates.length === 0\n ? 'No quality gate is waiting for a decision.'\n : `Waiting on: ${openGates.map((g) => `${g.name} (${g.status.toLowerCase().replace('_', ' ')})`).join(', ')}.`}\n </p>\n </Part>\n\n {projectId ? (\n <>\n <Part\n icon={<Wallet className=\"h-4 w-4\" />}\n title=\"Budget\"\n testId=\"readiness-budget\"\n loading={budgets.loading && !budgets.data}\n error={budgets.error}\n >\n {budgetRows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n This release's project has no budget.\n </p>\n ) : (\n <ul className=\"space-y-1\">\n {budgetRows.map((b) => {\n const over = b.remainingAmount < 0;\n return (\n <li key={b.id} className=\"text-sm\" data-testid=\"readiness-budget-row\">\n <span className=\"font-medium\">{b.name}</span>:{' '}\n {money(b.spentAmount, b.currency)} of {money(b.plannedAmount, b.currency)}{' '}\n spent\n {over ? (\n <span className=\"text-status-error-text\">\n {' '}\n — over by {money(-b.remainingAmount, b.currency)}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">\n {' '}\n — {money(b.remainingAmount, b.currency)} left\n </span>\n )}\n {!b.approvedAt && (\n <span className=\"text-status-warning-text\"> · not approved</span>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </Part>\n\n <Part\n icon={<AlertTriangle className=\"h-4 w-4\" />}\n title=\"Open risks\"\n testId=\"readiness-risks\"\n loading={risks.loading && !risks.data}\n error={risks.error}\n >\n {openRisks.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No open risks on this release's project.\n </p>\n ) : (\n <ul className=\"space-y-1\">\n {openRisks.slice(0, 5).map((risk) => (\n <li key={risk.id} className=\"text-sm\">\n <span className=\"font-medium\">{risk.title}</span>{' '}\n <span className=\"text-xs text-muted-foreground\">\n ({risk.severity.toLowerCase()}, score {risk.riskScore},{' '}\n {risk.status.toLowerCase()})\n </span>\n </li>\n ))}\n {openRisks.length > 5 && (\n <li className=\"text-xs text-muted-foreground\">\n and {openRisks.length - 5} more\n </li>\n )}\n </ul>\n )}\n </Part>\n\n <Part\n icon={<Users className=\"h-4 w-4\" />}\n title=\"Customer requests riding on unfinished work\"\n testId=\"readiness-requests\"\n loading={requests.loading && !requests.data}\n error={requests.error}\n >\n {riding.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n No open customer request is tied to unfinished work in this release.\n </p>\n ) : (\n <ul className=\"space-y-1\">\n {riding.map((req) => (\n <li key={req.id} className=\"text-sm\" data-testid=\"readiness-request\">\n <span className=\"font-medium\">{req.title}</span>{' '}\n <span className=\"text-xs text-muted-foreground\">\n ({req.voteCount} vote{req.voteCount === 1 ? '' : 's'})\n </span>\n {req.workItemId && blockedIds.has(req.workItemId) && (\n <span className=\"text-status-error-text\"> — its work is blocked</span>\n )}\n </li>\n ))}\n </ul>\n )}\n </Part>\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This release has no project, so budget, risks and customer requests cannot be shown.\n </p>\n )}\n\n {plannedDate && daysLate !== null && (\n <p className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Clock className=\"h-3.5 w-3.5\" />\n Planned for {new Date(plannedDate).toLocaleDateString()}\n {daysLate > 0 ? ` (${daysLate} day${daysLate === 1 ? '' : 's'} ago)` : ''}.\n </p>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|