@burdenoff/microfe-planmagnet 2026.927.3 → 2026.927.4

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.
Files changed (66) hide show
  1. package/dist/planmagnet/controls/FeatureControls.d.ts +26 -0
  2. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -0
  3. package/dist/planmagnet/controls/FeatureControls.js +318 -0
  4. package/dist/planmagnet/controls/FeatureControls.js.map +1 -0
  5. package/dist/planmagnet/controls/MilestoneControls.d.ts +17 -0
  6. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -0
  7. package/dist/planmagnet/controls/MilestoneControls.js +200 -0
  8. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -0
  9. package/dist/planmagnet/controls/ObjectiveControls.d.ts +31 -0
  10. package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +1 -0
  11. package/dist/planmagnet/controls/ObjectiveControls.js +296 -0
  12. package/dist/planmagnet/controls/ObjectiveControls.js.map +1 -0
  13. package/dist/planmagnet/controls/Pickers.d.ts +26 -0
  14. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -0
  15. package/dist/planmagnet/controls/Pickers.js +171 -0
  16. package/dist/planmagnet/controls/Pickers.js.map +1 -0
  17. package/dist/planmagnet/controls/ProjectControls.js +7 -7
  18. package/dist/planmagnet/controls/ReleaseControls.d.ts +14 -0
  19. package/dist/planmagnet/controls/ReleaseControls.d.ts.map +1 -0
  20. package/dist/planmagnet/controls/ReleaseControls.js +108 -0
  21. package/dist/planmagnet/controls/ReleaseControls.js.map +1 -0
  22. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +186 -152
  24. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +63 -56
  27. package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +229 -214
  30. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +142 -114
  33. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +134 -105
  36. package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -108
  39. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +119 -94
  42. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +107 -106
  45. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +2 -0
  48. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +6 -6
  50. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  51. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +55 -63
  52. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +4 -4
  54. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +123 -128
  55. package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
  56. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  57. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +139 -107
  58. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  59. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  60. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +173 -126
  61. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  62. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  63. package/dist/planmagnet/pages/TasksTasksPagePage.js +1 -0
  64. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  65. package/dist/planmagnet/roadmaps/RoadmapControls.js +23 -23
  66. package/package.json +1 -1
@@ -0,0 +1,108 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { throwOnError as t } from "../utils/mutationResult.js";
3
+ import { ConfirmButton as n, ErrorLine as r } from "./ConfirmButton.js";
4
+ import { enumLabel as i } from "./WorkItemControls.js";
5
+ import { detailPath as a } from "../utils/rowNavigation.js";
6
+ import { useState as o } from "react";
7
+ import { Pencil as s, Trash2 as c } from "lucide-react";
8
+ import { gql as l } from "@apollo/client";
9
+ import { useMutation as u } from "@apollo/client/react";
10
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
11
+ import { Button as p } from "@burdenoff/fe-libs/ui";
12
+ //#region src/planmagnet/controls/ReleaseControls.tsx
13
+ var m = [
14
+ "DRAFT",
15
+ "PLANNING",
16
+ "IN_PROGRESS",
17
+ "READY",
18
+ "STAGING",
19
+ "RELEASED",
20
+ "ROLLED_BACK",
21
+ "CANCELLED"
22
+ ], h = [
23
+ "GetRelease",
24
+ "ListReleases",
25
+ "ListReleasesForProduct",
26
+ "ListReleasesForProducts",
27
+ "ReleaseReadiness",
28
+ "GetReleaseForEdit"
29
+ ], g = l`
30
+ mutation ReleaseControlsStatus($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {
31
+ planmagnetUpdateRelease(id: $id, input: $input) {
32
+ id
33
+ status
34
+ releasedAt
35
+ }
36
+ }
37
+ `, _ = l`
38
+ mutation ReleaseControlsDelete($id: ID!) {
39
+ planmagnetDeleteRelease(id: $id)
40
+ }
41
+ `;
42
+ function v({ releaseId: l, version: v, status: y }) {
43
+ let b = e(), [x, S] = u(g, {
44
+ refetchQueries: h,
45
+ awaitRefetchQueries: !0
46
+ }), [C, w] = u(_, { refetchQueries: h.filter((e) => e !== "GetRelease" && e !== "ReleaseReadiness") }), [T, E] = o(null), D = S.loading || w.loading, O = m.includes(y) ? m : [y, ...m], k = async (e) => {
47
+ E(null);
48
+ try {
49
+ await t(x({ variables: {
50
+ id: l,
51
+ input: { status: e }
52
+ } }));
53
+ } catch (e) {
54
+ E(e instanceof Error ? e.message : "The status could not be changed.");
55
+ }
56
+ }, A = async () => {
57
+ E(null);
58
+ try {
59
+ await t(C({ variables: { id: l } })), b("/products/releases-page");
60
+ } catch (e) {
61
+ E(e instanceof Error ? e.message : "The release could not be deleted.");
62
+ }
63
+ };
64
+ return /* @__PURE__ */ f("div", {
65
+ className: "flex flex-col items-end gap-2",
66
+ children: [/* @__PURE__ */ f("div", {
67
+ className: "flex flex-wrap items-center justify-end gap-2",
68
+ children: [
69
+ /* @__PURE__ */ d("select", {
70
+ "aria-label": "Release status",
71
+ "data-testid": "release-status",
72
+ className: "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60",
73
+ value: y,
74
+ disabled: D,
75
+ onChange: (e) => {
76
+ e.target.value !== y && k(e.target.value);
77
+ },
78
+ children: O.map((e) => /* @__PURE__ */ d("option", {
79
+ value: e,
80
+ children: i(e)
81
+ }, e))
82
+ }),
83
+ /* @__PURE__ */ f(p, {
84
+ size: "sm",
85
+ variant: "outline",
86
+ "data-testid": "release-edit",
87
+ onClick: () => b(a("/products/edit-release-page", l)),
88
+ children: [/* @__PURE__ */ d(s, { className: "mr-1 h-4 w-4" }), "Edit"]
89
+ }),
90
+ /* @__PURE__ */ d(n, {
91
+ label: "Delete",
92
+ variant: "outline",
93
+ icon: /* @__PURE__ */ d(c, { className: "mr-1 h-4 w-4" }),
94
+ title: `Delete release ${v}?`,
95
+ description: "The release is deleted; its work items stay. This cannot be undone here.",
96
+ confirmLabel: "Delete release",
97
+ destructive: !0,
98
+ disabled: D,
99
+ onConfirm: () => void A()
100
+ })
101
+ ]
102
+ }), T && /* @__PURE__ */ d(r, { message: T })]
103
+ });
104
+ }
105
+ //#endregion
106
+ export { m as RELEASE_STATUSES, v as ReleaseHeaderActions };
107
+
108
+ //# sourceMappingURL=ReleaseControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleaseControls.js","names":[],"sources":["../../../src/planmagnet/controls/ReleaseControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Release controls (BOFF-7952). A release started in Planning and could never be released: status showed only as\n * badges, the Edit Release page was linked from nowhere, and nothing deleted a release. The Quality Gates card even\n * said the release \"cannot be released until the gates pass\" — with nothing to click once they had. The service\n * refuses RELEASED while a gate is open; that reason is shown here.\n */\n\n/** Every ReleaseStatus value (the Edit page's list omitted STAGING — BOFF-7985). */\nexport const RELEASE_STATUSES = [\n 'DRAFT',\n 'PLANNING',\n 'IN_PROGRESS',\n 'READY',\n 'STAGING',\n 'RELEASED',\n 'ROLLED_BACK',\n 'CANCELLED',\n] as const;\n\nconst RELEASE_QUERIES = [\n 'GetRelease',\n 'ListReleases',\n 'ListReleasesForProduct',\n 'ListReleasesForProducts',\n 'ReleaseReadiness',\n 'GetReleaseForEdit',\n];\n\nconst UPDATE = gql`\n mutation ReleaseControlsStatus($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {\n planmagnetUpdateRelease(id: $id, input: $input) {\n id\n status\n releasedAt\n }\n }\n`;\nconst DELETE = gql`\n mutation ReleaseControlsDelete($id: ID!) {\n planmagnetDeleteRelease(id: $id)\n }\n`;\n\nexport function ReleaseHeaderActions({\n releaseId,\n version,\n status,\n}: {\n releaseId: string;\n version: string;\n status: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, {\n refetchQueries: RELEASE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: RELEASE_QUERIES.filter((q) => q !== 'GetRelease' && q !== 'ReleaseReadiness'),\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (RELEASE_STATUSES as readonly string[]).includes(status)\n ? RELEASE_STATUSES\n : [status, ...RELEASE_STATUSES];\n\n const onStatus = async (next: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: releaseId, input: { status: next } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: releaseId } }));\n navigate('/products/releases-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The release could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Release status\"\n data-testid=\"release-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"release-edit\"\n onClick={() => navigate(detailPath('/products/edit-release-page', releaseId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete release ${version}?`}\n description=\"The release is deleted; its work items stay. This cannot be undone here.\"\n confirmLabel=\"Delete release\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAmBA,IAAa,IAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAS,CAAG;;;;;;;;GASZ,IAAS,CAAG;;;;;AAMlB,SAAgB,EAAqB,EACnC,cACA,YACA,aAKC;CACD,IAAM,IAAW,GAAuB,EAClC,CAAC,GAAQ,KAAe,EAAY,GAAQ;EAChD,gBAAgB;EAChB,qBAAqB;EACtB,CAAC,EACI,CAAC,GAAQ,KAAe,EAAY,GAAQ,EAChD,gBAAgB,EAAgB,QAAQ,MAAM,MAAM,gBAAgB,MAAM,mBAAmB,EAC9F,CAAC,EACI,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,IAAO,EAAY,WAAW,EAAY,SAC1C,IAAY,EAAuC,SAAS,EAAO,GACrE,IACA,CAAC,GAAQ,GAAG,EAAiB,EAE3B,IAAW,OAAO,MAAiB;AACvC,IAAS,KAAK;AACd,MAAI;AACF,SAAM,EAAa,EAAO,EAAE,WAAW;IAAE,IAAI;IAAW,OAAO,EAAE,QAAQ,GAAM;IAAE,EAAE,CAAC,CAAC;WAC9E,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,mCAAmC;;IAG3E,IAAW,YAAY;AAC3B,IAAS,KAAK;AACd,MAAI;AAEF,GADA,MAAM,EAAa,EAAO,EAAE,WAAW,EAAE,IAAI,GAAW,EAAE,CAAC,CAAC,EAC5D,EAAS,0BAA0B;WAC5B,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,oCAAoC;;;AAIlF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KACE,cAAW;KACX,eAAY;KACZ,WAAU;KACV,OAAO;KACP,UAAU;KACV,WAAW,MAAM;AACf,MAAI,EAAE,OAAO,UAAU,KAAa,EAAS,EAAE,OAAO,MAAM;;eAG7D,EAAS,KAAK,MACb,kBAAC,UAAD;MAAgB,OAAO;gBACpB,EAAU,EAAE;MACN,EAFI,EAEJ,CACT;KACK,CAAA;IACT,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,+BAA+B,EAAU,CAAC;eAJ/E,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;;IACT,kBAAC,GAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAM,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA;KACzC,OAAO,kBAAkB,EAAQ;KACjC,aAAY;KACZ,cAAa;KACb,aAAA;KACA,UAAU;KACV,iBAAiB,KAAK,GAAU;KAChC,CAAA;IACE;MACL,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA,CACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocsDocDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/DocsDocDetailPagePage.tsx"],"names":[],"mappings":"AA4HA,wBAAgB,qBAAqB,4CAyZpC"}
1
+ {"version":3,"file":"DocsDocDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/DocsDocDetailPagePage.tsx"],"names":[],"mappings":"AAqIA,wBAAgB,qBAAqB,4CAsbpC"}