@burdenoff/microfe-planmagnet 2026.925.17 → 2026.926.1
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 +76 -2
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/node_modules/@apollo/client/errors/ServerError.js +17 -0
- package/dist/node_modules/@apollo/client/errors/ServerError.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +128 -127
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +93 -98
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +72 -79
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +112 -123
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +92 -98
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +88 -96
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +102 -122
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +116 -114
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -88
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +79 -79
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +150 -154
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +120 -109
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +75 -31
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +1 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.js +90 -89
- package/dist/planmagnet/releases/ReleaseReadinessCard.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.d.ts +13 -0
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.d.ts.map +1 -0
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.js +189 -0
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.js.map +1 -0
- package/dist/planmagnet/roadmaps/planningFocus.d.ts +23 -0
- package/dist/planmagnet/roadmaps/planningFocus.d.ts.map +1 -0
- package/dist/planmagnet/roadmaps/planningFocus.js +76 -0
- package/dist/planmagnet/roadmaps/planningFocus.js.map +1 -0
- package/dist/planmagnet/sprints/SprintDates.d.ts +37 -0
- package/dist/planmagnet/sprints/SprintDates.d.ts.map +1 -0
- package/dist/planmagnet/sprints/SprintDates.js +114 -0
- package/dist/planmagnet/sprints/SprintDates.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SprintDates.js","names":[],"sources":["../../../src/planmagnet/sprints/SprintDates.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { CalendarClock, CheckCircle2, AlertTriangle, History } from 'lucide-react';\nimport { PersonName } from '../people/People';\n\n/**\n * A sprint's PLANNED dates next to what actually happened (BOFF-7918).\n *\n * Until 2026-09-26 Start and Complete overwrote the planned start/end with the\n * moment they were clicked, so the plan was lost. The service now keeps the\n * plan, records `startedAt`/`completedAt`, snapshots the plan in force at Start\n * as the baseline (the commitment), and appends every later plan change to a\n * history. Sprints started before the fix have no recorded actual times: they\n * read \"not recorded\", never a guessed date.\n */\n\nexport interface SprintPlanChange {\n field: string;\n fromValue: string | null;\n toValue: string | null;\n sprintStatus: string;\n changedBy: string;\n changedAt: string;\n}\n\nexport interface SprintDateFields {\n status: string;\n startDate: string | null;\n endDate: string | null;\n startedAt?: string | null;\n completedAt?: string | null;\n baselineStartDate?: string | null;\n baselineEndDate?: string | null;\n planChanges?: SprintPlanChange[];\n}\n\n/** Planned dates are calendar days (UTC midnight); show them without a time-zone shift. */\nconst day = (iso: string | null | undefined) =>\n iso\n ? new Date(iso).toLocaleDateString(undefined, {\n timeZone: 'UTC',\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })\n : '—';\n/** Actual times are moments; show them in the viewer's zone. */\nconst moment = (iso: string) =>\n new Date(iso).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Whole calendar days between the committed end and the actual completion.\n * Positive = late, negative = early, 0 = on the day.\n */\nexport function daysAgainstCommitment(completedAt: string, committedEnd: string): number {\n const done = new Date(completedAt);\n const doneDay = Date.UTC(done.getUTCFullYear(), done.getUTCMonth(), done.getUTCDate());\n const end = new Date(committedEnd);\n const endDay = Date.UTC(end.getUTCFullYear(), end.getUTCMonth(), end.getUTCDate());\n return Math.round((doneDay - endDay) / DAY_MS);\n}\n\nfunction Outcome({\n completedAt,\n committedEnd,\n}: {\n completedAt: string;\n committedEnd: string | null;\n}) {\n if (!committedEnd) {\n return <span className=\"text-xs text-muted-foreground\">No committed end to compare with.</span>;\n }\n const delta = daysAgainstCommitment(completedAt, committedEnd);\n if (delta <= 0) {\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-status-success-text\"\n data-testid=\"sprint-outcome\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {delta === 0\n ? 'Finished on the committed day'\n : `Finished ${-delta} day${delta === -1 ? '' : 's'} early`}\n </span>\n );\n }\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-status-warning-text\"\n data-testid=\"sprint-outcome\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n Finished {delta} day{delta === 1 ? '' : 's'} after the committed end\n </span>\n );\n}\n\nexport function SprintDates({ sprint }: { sprint: SprintDateFields }) {\n const [showHistory, setShowHistory] = useState(false);\n const started = sprint.status !== 'PLANNING';\n const finished = sprint.status === 'COMPLETED';\n const changes = sprint.planChanges ?? [];\n // The commitment is the plan in force at Start; without one (never started,\n // or started before it was recorded) fall back to the current plan only for\n // display, never for the on-time verdict.\n const committedEnd = sprint.baselineEndDate ?? null;\n const replannedAfterStart = changes.filter((c) => c.sprintStatus !== 'PLANNING').length;\n // Sprints started / completed before 2026-09-26: the old Start wrote the\n // moment of Start into startDate, and the old Complete wrote the moment of\n // Complete into endDate (measured in prod: all 30 such sprints carry a time\n // of day). Their planned dates were overwritten and cannot be recovered\n // (outside the backup window), so they read \"not recorded\", and the stored\n // values are shown for what they are — the recorded start/completion.\n const legacyStart = started && !sprint.startedAt && Boolean(sprint.startDate);\n const legacyEnd = finished && !sprint.completedAt && Boolean(sprint.endDate);\n\n return (\n <div className=\"space-y-1 text-xs text-muted-foreground\" data-testid=\"sprint-dates\">\n <p className=\"flex items-center gap-1\">\n <CalendarClock className=\"h-3 w-3\" />\n <span>\n Planned {legacyStart ? 'start not recorded' : day(sprint.startDate)} –{' '}\n {legacyEnd ? 'end not recorded' : day(sprint.endDate)}\n </span>\n {committedEnd && sprint.endDate && committedEnd !== sprint.endDate && (\n <span>(committed end {day(committedEnd)})</span>\n )}\n </p>\n {started && (\n <p data-testid=\"sprint-actuals\">\n {sprint.startedAt\n ? `Started ${moment(sprint.startedAt)}`\n : legacyStart && sprint.startDate\n ? `Started ${moment(sprint.startDate)}`\n : 'Actual start not recorded'}\n {finished &&\n (sprint.completedAt\n ? ` · Completed ${moment(sprint.completedAt)}`\n : legacyEnd && sprint.endDate\n ? ` · Completed ${moment(sprint.endDate)}`\n : ' · Actual completion not recorded')}\n {(legacyStart || legacyEnd) && ' (recorded before planned dates were kept)'}\n </p>\n )}\n {finished && sprint.completedAt && (\n <Outcome completedAt={sprint.completedAt} committedEnd={committedEnd} />\n )}\n {changes.length > 0 && (\n <div>\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 hover:underline\"\n aria-expanded={showHistory}\n onClick={() => setShowHistory(!showHistory)}\n data-testid=\"sprint-plan-history-toggle\"\n >\n <History className=\"h-3 w-3\" />\n Plan changed {changes.length}×\n {replannedAfterStart > 0 ? ` (${replannedAfterStart} after start)` : ''}\n </button>\n {showHistory && (\n <ol className=\"mt-1 space-y-0.5 pl-4\" data-testid=\"sprint-plan-history\">\n {changes.map((c, i) => (\n <li key={`${c.changedAt}-${c.field}-${i}`}>\n {c.field === 'startDate' ? 'Start' : 'End'}: {day(c.fromValue)} → {day(c.toValue)}\n {c.sprintStatus !== 'PLANNING' ? ' (after start)' : ''} ·{' '}\n <PersonName id={c.changedBy} /> · {moment(c.changedAt)}\n </li>\n ))}\n </ol>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|