@burdenoff/microfe-planmagnet 2026.928.3 → 2026.928.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 (84) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +102 -84
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoutes.js +103 -55
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
  8. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
  9. package/dist/planmagnet/controls/CompetitorControls.js +172 -0
  10. package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
  11. package/dist/planmagnet/controls/FeatureControls.js +29 -29
  12. package/dist/planmagnet/controls/FeatureTriage.js +11 -11
  13. package/dist/planmagnet/controls/ObjectiveControls.js +24 -24
  14. package/dist/planmagnet/controls/Pickers.d.ts +17 -2
  15. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  16. package/dist/planmagnet/controls/Pickers.js +100 -9
  17. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  18. package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
  19. package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
  20. package/dist/planmagnet/controls/PortfolioControls.js +114 -0
  21. package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
  22. package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
  23. package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
  24. package/dist/planmagnet/controls/ProgramControls.js +187 -0
  25. package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
  26. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
  27. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
  28. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
  29. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
  30. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
  31. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
  32. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
  33. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
  34. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
  35. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
  36. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
  37. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
  38. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
  39. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
  40. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
  41. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
  42. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
  43. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
  44. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
  45. package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
  46. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
  49. package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
  53. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
  57. package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
  58. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
  60. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
  62. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
  63. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
  64. package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
  65. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
  66. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
  67. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
  68. package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
  69. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
  70. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
  71. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
  72. package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
  73. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
  74. package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
  75. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
  76. package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
  77. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  78. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
  79. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  81. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +156 -136
  82. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  83. package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
  84. package/package.json +1 -1
@@ -0,0 +1,178 @@
1
+ import { PersonName as e } from "../people/People.js";
2
+ import { enumLabel as t } from "../controls/WorkItemControls.js";
3
+ import { ProgramHeaderActions as n, ProgramProjectsCard as r } from "../controls/ProgramControls.js";
4
+ import { Calendar as i, FolderKanban as a, Loader2 as o } from "lucide-react";
5
+ import { useParams as s } from "react-router";
6
+ import { gql as c } from "@apollo/client";
7
+ import { useQuery as l } from "@apollo/client/react";
8
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
+ import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
10
+ //#region src/planmagnet/pages/ProgramsProgramDetailPagePage.tsx
11
+ var _ = c`
12
+ query GetProgram($id: ID!) {
13
+ planmagnetProgram(id: $id) {
14
+ id
15
+ workspaceId
16
+ name
17
+ description
18
+ status
19
+ startDate
20
+ endDate
21
+ ownerId
22
+ budgetTotal
23
+ currency
24
+ tags
25
+ createdAt
26
+ updatedAt
27
+ projects {
28
+ id
29
+ name
30
+ status
31
+ }
32
+ }
33
+ }
34
+ `;
35
+ function v() {
36
+ let c = s().id ?? "", { data: v, loading: y, error: b } = l(_, {
37
+ variables: { id: c },
38
+ skip: !c
39
+ });
40
+ if (y && !v) return /* @__PURE__ */ u("div", {
41
+ className: "flex items-center justify-center p-12",
42
+ children: /* @__PURE__ */ u(o, { className: "h-8 w-8 animate-spin text-muted-foreground" })
43
+ });
44
+ if (b) return /* @__PURE__ */ d("div", {
45
+ className: "p-6 text-destructive",
46
+ children: ["Failed to load program: ", b.message]
47
+ });
48
+ let x = v?.planmagnetProgram;
49
+ return x ? /* @__PURE__ */ d("div", {
50
+ className: "space-y-6 p-6",
51
+ children: [/* @__PURE__ */ d("div", {
52
+ className: "flex items-center justify-between",
53
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("div", {
54
+ className: "flex items-center gap-2",
55
+ children: [
56
+ /* @__PURE__ */ u(a, { className: "h-5 w-5 text-primary" }),
57
+ /* @__PURE__ */ u("h1", {
58
+ className: "text-2xl font-semibold",
59
+ children: x.name
60
+ }),
61
+ /* @__PURE__ */ u(f, {
62
+ variant: "outline",
63
+ className: "text-xs",
64
+ children: t(x.status)
65
+ })
66
+ ]
67
+ }), /* @__PURE__ */ d("p", {
68
+ className: "text-sm text-muted-foreground mt-1",
69
+ children: [
70
+ x.projects.length,
71
+ " project",
72
+ x.projects.length === 1 ? "" : "s"
73
+ ]
74
+ })] }), /* @__PURE__ */ u(n, {
75
+ programId: x.id,
76
+ name: x.name,
77
+ status: x.status
78
+ })]
79
+ }), /* @__PURE__ */ d("div", {
80
+ className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
81
+ children: [/* @__PURE__ */ d("div", {
82
+ className: "lg:col-span-2 space-y-6",
83
+ children: [/* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Overview" }) }), /* @__PURE__ */ u(m, { children: /* @__PURE__ */ u("p", {
84
+ className: "text-sm",
85
+ children: x.description ?? "No description provided."
86
+ }) })] }), /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Projects" }) }), /* @__PURE__ */ u(m, { children: /* @__PURE__ */ u(r, {
87
+ programId: x.id,
88
+ projects: x.projects
89
+ }) })] })]
90
+ }), /* @__PURE__ */ d("div", {
91
+ className: "space-y-6",
92
+ children: [
93
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Timeline" }) }), /* @__PURE__ */ d(m, {
94
+ className: "space-y-3 text-sm",
95
+ children: [/* @__PURE__ */ d("div", {
96
+ className: "flex items-center gap-2",
97
+ children: [
98
+ /* @__PURE__ */ u(i, { className: "h-4 w-4 text-muted-foreground" }),
99
+ /* @__PURE__ */ u("span", {
100
+ className: "text-muted-foreground",
101
+ children: "Start:"
102
+ }),
103
+ /* @__PURE__ */ u("span", {
104
+ className: "font-medium",
105
+ children: x.startDate ? new Date(x.startDate).toLocaleDateString() : "Not set"
106
+ })
107
+ ]
108
+ }), /* @__PURE__ */ d("div", {
109
+ className: "flex items-center gap-2",
110
+ children: [
111
+ /* @__PURE__ */ u(i, { className: "h-4 w-4 text-muted-foreground" }),
112
+ /* @__PURE__ */ u("span", {
113
+ className: "text-muted-foreground",
114
+ children: "End:"
115
+ }),
116
+ /* @__PURE__ */ u("span", {
117
+ className: "font-medium",
118
+ children: x.endDate ? new Date(x.endDate).toLocaleDateString() : "Not set"
119
+ })
120
+ ]
121
+ })]
122
+ })] }),
123
+ /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Details" }) }), /* @__PURE__ */ d(m, {
124
+ className: "space-y-2 text-sm",
125
+ children: [
126
+ /* @__PURE__ */ d("div", {
127
+ className: "flex justify-between",
128
+ children: [/* @__PURE__ */ u("span", {
129
+ className: "text-muted-foreground",
130
+ children: "Owner"
131
+ }), /* @__PURE__ */ u(e, { id: x.ownerId })]
132
+ }),
133
+ /* @__PURE__ */ d("div", {
134
+ className: "flex justify-between",
135
+ children: [/* @__PURE__ */ u("span", {
136
+ className: "text-muted-foreground",
137
+ children: "Budget"
138
+ }), /* @__PURE__ */ u("span", {
139
+ className: "font-medium",
140
+ children: x.budgetTotal == null ? "Not set" : `${x.currency ?? ""} ${x.budgetTotal.toLocaleString()}`.trim()
141
+ })]
142
+ }),
143
+ /* @__PURE__ */ d("div", {
144
+ className: "flex justify-between",
145
+ children: [/* @__PURE__ */ u("span", {
146
+ className: "text-muted-foreground",
147
+ children: "Created"
148
+ }), /* @__PURE__ */ u("span", { children: new Date(x.createdAt).toLocaleDateString() })]
149
+ }),
150
+ /* @__PURE__ */ d("div", {
151
+ className: "flex justify-between",
152
+ children: [/* @__PURE__ */ u("span", {
153
+ className: "text-muted-foreground",
154
+ children: "Updated"
155
+ }), /* @__PURE__ */ u("span", { children: new Date(x.updatedAt).toLocaleDateString() })]
156
+ })
157
+ ]
158
+ })] }),
159
+ x.tags.length > 0 && /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, { children: /* @__PURE__ */ u(g, { children: "Tags" }) }), /* @__PURE__ */ u(m, {
160
+ className: "flex flex-wrap gap-1",
161
+ children: x.tags.map((e) => /* @__PURE__ */ u(f, {
162
+ variant: "outline",
163
+ className: "text-xs",
164
+ children: e
165
+ }, e))
166
+ })] })
167
+ ]
168
+ })]
169
+ })]
170
+ }) : /* @__PURE__ */ u("div", {
171
+ className: "p-6 text-muted-foreground",
172
+ children: "Program not found."
173
+ });
174
+ }
175
+ //#endregion
176
+ export { v as ProgramsProgramDetailPagePage };
177
+
178
+ //# sourceMappingURL=ProgramsProgramDetailPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramsProgramDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProgramsProgramDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, Calendar, Loader2 } from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { PersonName } from '../people/People';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { ProgramHeaderActions, ProgramProjectsCard } from '../controls/ProgramControls';\n\nconst GET_PROGRAM = gql`\n query GetProgram($id: ID!) {\n planmagnetProgram(id: $id) {\n id\n workspaceId\n name\n description\n status\n startDate\n endDate\n ownerId\n budgetTotal\n currency\n tags\n createdAt\n updatedAt\n projects {\n id\n name\n status\n }\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n status: string;\n}\n\nexport function ProgramsProgramDetailPagePage() {\n const params = useParams<{ id: string }>();\n const programId = params.id ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetProgram: {\n id: string;\n name: string;\n description: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n ownerId: string;\n budgetTotal: number | null;\n currency: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n projects: ProjectNode[];\n } | null;\n }>(GET_PROGRAM, { variables: { id: programId }, skip: !programId });\n\n // Only before the first load: a refetch must not blank the page (it unmounts every component on it and\n // loses their state).\n if (loading && !data) {\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 (error) {\n return <div className=\"p-6 text-destructive\">Failed to load program: {error.message}</div>;\n }\n\n const program = data?.planmagnetProgram;\n if (!program) return <div className=\"p-6 text-muted-foreground\">Program not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{program.name}</h1>\n <Badge variant=\"outline\" className=\"text-xs\">\n {enumLabel(program.status)}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {program.projects.length} project{program.projects.length === 1 ? '' : 's'}\n </p>\n </div>\n <ProgramHeaderActions programId={program.id} name={program.name} status={program.status} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{program.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Projects</CardTitle>\n </CardHeader>\n <CardContent>\n <ProgramProjectsCard programId={program.id} projects={program.projects} />\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Start:</span>\n <span className=\"font-medium\">\n {program.startDate ? new Date(program.startDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">End:</span>\n <span className=\"font-medium\">\n {program.endDate ? new Date(program.endDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <PersonName id={program.ownerId} />\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Budget</span>\n <span className=\"font-medium\">\n {program.budgetTotal != null\n ? `${program.currency ?? ''} ${program.budgetTotal.toLocaleString()}`.trim()\n : 'Not set'}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{new Date(program.createdAt).toLocaleDateString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{new Date(program.updatedAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </Card>\n\n {program.tags.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1\">\n {program.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProgramsProgramsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProgramsProgramsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramsProgramsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProgramsProgramsPagePage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,wBAAwB,4CAsIvC"}
@@ -0,0 +1,157 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as n } from "../people/People.js";
3
+ import { detailPath as r, rowLinkProps as i } from "../utils/rowNavigation.js";
4
+ import { enumLabel as a } from "../controls/WorkItemControls.js";
5
+ import { PROGRAM_STATUSES as o } from "../controls/ProgramControls.js";
6
+ import { useState as s } from "react";
7
+ import { FolderKanban as c, Loader2 as l, Plus as u } from "lucide-react";
8
+ import { gql as d } from "@apollo/client";
9
+ import { useQuery as f } from "@apollo/client/react";
10
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
+ import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, Input as x } from "@burdenoff/fe-libs/ui";
12
+ //#region src/planmagnet/pages/ProgramsProgramsPagePage.tsx
13
+ var S = d`
14
+ query ListPrograms(
15
+ $workspaceId: ID!
16
+ $filter: PlanmagnetProgramFilter
17
+ $pagination: PlanmagnetPaginationInput
18
+ ) {
19
+ planmagnetPrograms(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
20
+ items {
21
+ id
22
+ name
23
+ description
24
+ status
25
+ startDate
26
+ endDate
27
+ ownerId
28
+ budgetTotal
29
+ currency
30
+ tags
31
+ updatedAt
32
+ projects {
33
+ id
34
+ }
35
+ }
36
+ totalCount
37
+ }
38
+ }
39
+ `;
40
+ function C() {
41
+ let d = t(), { workspaceId: C } = e(), [w, T] = s("all"), [E, D] = s(""), { data: O, loading: k, error: A } = f(S, {
42
+ variables: {
43
+ workspaceId: C,
44
+ pagination: { first: 50 },
45
+ filter: {
46
+ ...w === "all" ? {} : { status: w },
47
+ ...E.trim() ? { search: E.trim() } : {}
48
+ }
49
+ },
50
+ skip: !C
51
+ });
52
+ if (k && !O) return /* @__PURE__ */ p("div", {
53
+ className: "flex items-center justify-center p-12",
54
+ children: /* @__PURE__ */ p(l, { className: "h-8 w-8 animate-spin text-muted-foreground" })
55
+ });
56
+ if (A) return /* @__PURE__ */ m("div", {
57
+ className: "p-6 text-destructive",
58
+ children: ["Failed to load programs: ", A.message]
59
+ });
60
+ let j = O?.planmagnetPrograms.items ?? [], M = O?.planmagnetPrograms.totalCount ?? 0, N = ["all", ...o];
61
+ return /* @__PURE__ */ m("div", {
62
+ className: "space-y-6 p-6",
63
+ children: [
64
+ /* @__PURE__ */ m("div", {
65
+ className: "flex items-center justify-between",
66
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h1", {
67
+ className: "text-2xl font-semibold",
68
+ children: "Programs"
69
+ }), /* @__PURE__ */ m("p", {
70
+ className: "text-sm text-muted-foreground",
71
+ children: [
72
+ M,
73
+ " program",
74
+ M === 1 ? "" : "s",
75
+ " across the workspace"
76
+ ]
77
+ })] }), /* @__PURE__ */ m(g, {
78
+ size: "sm",
79
+ onClick: () => d("/products/create-program-page"),
80
+ children: [/* @__PURE__ */ p(u, { className: "mr-1 h-4 w-4" }), "New Program"]
81
+ })]
82
+ }),
83
+ /* @__PURE__ */ m("div", {
84
+ className: "flex flex-wrap items-center gap-4",
85
+ children: [/* @__PURE__ */ p(x, {
86
+ "aria-label": "Search programs",
87
+ placeholder: "Search by name…",
88
+ value: E,
89
+ onChange: (e) => D(e.target.value),
90
+ className: "max-w-xs"
91
+ }), /* @__PURE__ */ p("div", {
92
+ className: "flex items-center gap-2 flex-wrap",
93
+ children: N.map((e) => /* @__PURE__ */ p("button", {
94
+ type: "button",
95
+ "aria-pressed": w === e,
96
+ onClick: () => T(e),
97
+ className: `px-2 py-1 text-xs rounded-md capitalize ${w === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
98
+ children: e === "all" ? "All" : a(e)
99
+ }, e))
100
+ })]
101
+ }),
102
+ /* @__PURE__ */ p("div", {
103
+ className: "grid grid-cols-1 md:grid-cols-2 gap-4",
104
+ children: j.map((e) => /* @__PURE__ */ m(_, {
105
+ ...i(() => d(r("/products/program-detail-page", e.id)), e.name),
106
+ children: [/* @__PURE__ */ p(y, {
107
+ className: "pb-2",
108
+ children: /* @__PURE__ */ m("div", {
109
+ className: "flex items-center justify-between gap-2",
110
+ children: [/* @__PURE__ */ m(b, {
111
+ className: "text-base flex items-center gap-2",
112
+ children: [/* @__PURE__ */ p(c, { className: "h-4 w-4 text-primary" }), e.name]
113
+ }), /* @__PURE__ */ p(h, {
114
+ variant: "outline",
115
+ className: "text-xs",
116
+ children: a(e.status)
117
+ })]
118
+ })
119
+ }), /* @__PURE__ */ m(v, {
120
+ className: "space-y-3",
121
+ children: [
122
+ /* @__PURE__ */ p("p", {
123
+ className: "text-sm text-muted-foreground",
124
+ children: e.description ?? "No description"
125
+ }),
126
+ /* @__PURE__ */ m("div", {
127
+ className: "flex items-center gap-4 text-xs text-muted-foreground",
128
+ children: [/* @__PURE__ */ m("span", { children: [
129
+ e.projects.length,
130
+ " project",
131
+ e.projects.length === 1 ? "" : "s"
132
+ ] }), e.startDate && e.endDate && /* @__PURE__ */ m("span", { children: [
133
+ new Date(e.startDate).toLocaleDateString(),
134
+ " -",
135
+ " ",
136
+ new Date(e.endDate).toLocaleDateString()
137
+ ] })]
138
+ }),
139
+ /* @__PURE__ */ m("div", {
140
+ className: "flex items-center justify-between text-xs text-muted-foreground border-t pt-2",
141
+ children: [/* @__PURE__ */ m("span", { children: ["Owner: ", /* @__PURE__ */ p(n, { id: e.ownerId })] }), /* @__PURE__ */ p("span", { children: e.budgetTotal == null ? "No budget set" : `${e.currency ?? ""} ${e.budgetTotal.toLocaleString()}`.trim() })]
142
+ })
143
+ ]
144
+ })]
145
+ }, e.id))
146
+ }),
147
+ j.length === 0 && /* @__PURE__ */ p("p", {
148
+ className: "text-center text-muted-foreground py-8",
149
+ children: w !== "all" || E ? "No programs match the selected filters." : "No programs yet. Create one to group related projects together."
150
+ })
151
+ ]
152
+ });
153
+ }
154
+ //#endregion
155
+ export { C as ProgramsProgramsPagePage };
156
+
157
+ //# sourceMappingURL=ProgramsProgramsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgramsProgramsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProgramsProgramsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, Plus, Loader2 } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { PROGRAM_STATUSES } from '../controls/ProgramControls';\n\nconst LIST_PROGRAMS = gql`\n query ListPrograms(\n $workspaceId: ID!\n $filter: PlanmagnetProgramFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetPrograms(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n name\n description\n status\n startDate\n endDate\n ownerId\n budgetTotal\n currency\n tags\n updatedAt\n projects {\n id\n }\n }\n totalCount\n }\n }\n`;\n\ninterface ProgramNode {\n id: string;\n name: string;\n description: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n ownerId: string;\n budgetTotal: number | null;\n currency: string | null;\n tags: string[];\n projects: { id: string }[];\n}\n\nexport function ProgramsProgramsPagePage() {\n const navigate = usePlanMagnetNavigate();\n const { workspaceId } = usePlanMagnet();\n const [statusFilter, setStatusFilter] = useState<string>('all');\n const [search, setSearch] = useState('');\n\n const { data, loading, error } = useQuery<{\n planmagnetPrograms: { items: ProgramNode[]; totalCount: number };\n }>(LIST_PROGRAMS, {\n variables: {\n workspaceId,\n pagination: { first: 50 },\n filter: {\n ...(statusFilter !== 'all' ? { status: statusFilter } : {}),\n ...(search.trim() ? { search: search.trim() } : {}),\n },\n },\n skip: !workspaceId,\n });\n\n // Only before the first load: a refetch must not blank the page (it unmounts every component on it and\n // loses their state).\n if (loading && !data) {\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 (error) {\n return <div className=\"p-6 text-destructive\">Failed to load programs: {error.message}</div>;\n }\n\n const programs = data?.planmagnetPrograms.items ?? [];\n const totalCount = data?.planmagnetPrograms.totalCount ?? 0;\n const statuses = ['all', ...PROGRAM_STATUSES];\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\">Programs</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalCount} program{totalCount === 1 ? '' : 's'} across the workspace\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/products/create-program-page')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Program\n </Button>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-4\">\n <Input\n aria-label=\"Search programs\"\n placeholder=\"Search by name…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"max-w-xs\"\n />\n <div className=\"flex items-center gap-2 flex-wrap\">\n {statuses.map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={statusFilter === s}\n onClick={() => setStatusFilter(s)}\n className={`px-2 py-1 text-xs rounded-md capitalize ${statusFilter === s ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {s === 'all' ? 'All' : enumLabel(s)}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {programs.map((program) => (\n <Card\n key={program.id}\n {...rowLinkProps(\n () => navigate(detailPath('/products/program-detail-page', program.id)),\n program.name\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-primary\" />\n {program.name}\n </CardTitle>\n <Badge variant=\"outline\" className=\"text-xs\">\n {enumLabel(program.status)}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {program.description ?? 'No description'}\n </p>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span>\n {program.projects.length} project{program.projects.length === 1 ? '' : 's'}\n </span>\n {program.startDate && program.endDate && (\n <span>\n {new Date(program.startDate).toLocaleDateString()} -{' '}\n {new Date(program.endDate).toLocaleDateString()}\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground border-t pt-2\">\n <span>\n Owner: <PersonName id={program.ownerId} />\n </span>\n <span>\n {program.budgetTotal != null\n ? `${program.currency ?? ''} ${program.budgetTotal.toLocaleString()}`.trim()\n : 'No budget set'}\n </span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n {programs.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">\n {statusFilter !== 'all' || search\n ? 'No programs match the selected filters.'\n : 'No programs yet. Create one to group related projects together.'}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsEditProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsEditProjectPagePage.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,2BAA2B,4CAoO1C"}
1
+ {"version":3,"file":"ProjectsEditProjectPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsEditProjectPagePage.tsx"],"names":[],"mappings":"AAwDA,wBAAgB,2BAA2B,4CA0P1C"}