@burdenoff/microfe-planmagnet 2026.1001.1 → 2026.1001.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.
Files changed (122) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +163 -150
  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 +124 -108
  6. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  7. package/dist/planmagnet/comments/CommentThread.js +36 -36
  8. package/dist/planmagnet/comments/RoadmapComments.js +21 -21
  9. package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
  10. package/dist/planmagnet/controls/FeatureControls.js +60 -60
  11. package/dist/planmagnet/controls/MilestoneControls.d.ts +2 -0
  12. package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -1
  13. package/dist/planmagnet/controls/MilestoneControls.js +89 -72
  14. package/dist/planmagnet/controls/MilestoneControls.js.map +1 -1
  15. package/dist/planmagnet/controls/SyncControls.js +59 -59
  16. package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
  17. package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
  18. package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
  19. package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
  20. package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
  21. package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
  22. package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
  23. package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
  24. package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
  25. package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
  26. package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
  27. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
  28. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
  29. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
  30. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
  31. package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
  32. package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
  33. package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
  34. package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
  35. package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
  36. package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
  37. package/dist/planmagnet/forecast/riskFlags.js +37 -0
  38. package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
  39. package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts +17 -0
  40. package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +1 -0
  41. package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +218 -0
  42. package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +1 -0
  43. package/dist/planmagnet/meetings/MeetingsCard.d.ts +7 -0
  44. package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +1 -0
  45. package/dist/planmagnet/meetings/MeetingsCard.js +108 -0
  46. package/dist/planmagnet/meetings/MeetingsCard.js.map +1 -0
  47. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts +9 -0
  48. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +1 -0
  49. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +232 -0
  50. package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +1 -0
  51. package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts +19 -0
  52. package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +1 -0
  53. package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +226 -0
  54. package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +1 -0
  55. package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts +14 -0
  56. package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +1 -0
  57. package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +81 -0
  58. package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +1 -0
  59. package/dist/planmagnet/meetings/meetingActions.d.ts +57 -0
  60. package/dist/planmagnet/meetings/meetingActions.d.ts.map +1 -0
  61. package/dist/planmagnet/meetings/meetingActions.js +51 -0
  62. package/dist/planmagnet/meetings/meetingActions.js.map +1 -0
  63. package/dist/planmagnet/meetings/meetingGraphql.d.ts +29 -0
  64. package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +1 -0
  65. package/dist/planmagnet/meetings/meetingGraphql.js +166 -0
  66. package/dist/planmagnet/meetings/meetingGraphql.js.map +1 -0
  67. package/dist/planmagnet/meetings/meetingModel.d.ts +74 -0
  68. package/dist/planmagnet/meetings/meetingModel.d.ts.map +1 -0
  69. package/dist/planmagnet/meetings/meetingModel.js +88 -0
  70. package/dist/planmagnet/meetings/meetingModel.js.map +1 -0
  71. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  72. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
  73. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  74. package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
  75. package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
  76. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
  77. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  78. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
  79. package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts +2 -0
  81. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +1 -0
  82. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +197 -0
  83. package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +1 -0
  84. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts +2 -0
  85. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +1 -0
  86. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +173 -0
  87. package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +1 -0
  88. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
  89. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
  90. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
  91. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
  92. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  93. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +73 -52
  94. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  95. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  96. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +205 -190
  97. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  98. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  99. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +211 -182
  100. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  101. package/dist/planmagnet/pages/ReportsReportPagePage.js +22 -22
  102. package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -1
  103. package/dist/planmagnet/pages/ReportsReportsPagePage.js +21 -21
  104. package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
  105. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
  106. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
  107. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
  108. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
  109. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
  110. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
  111. package/dist/planmagnet/product/ProductControls.js +91 -91
  112. package/dist/planmagnet/reports/SchedulesPanel.js +33 -33
  113. package/dist/planmagnet/reports/ShareDialog.js +76 -76
  114. package/dist/planmagnet/reports/ShareDialog.js.map +1 -1
  115. package/dist/planmagnet/reports/sharedReportRoute.d.ts +3 -2
  116. package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -1
  117. package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -1
  118. package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
  119. package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
  120. package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
  121. package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
  122. package/package.json +1 -1
@@ -2,25 +2,26 @@ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
2
  import { LEAVES_PAGE_CONTEXT as t, throwOnError as n } from "../utils/mutationResult.js";
3
3
  import { ConfirmButton as r, ErrorLine as i } from "./ConfirmButton.js";
4
4
  import { enumLabel as a } from "./WorkItemControls.js";
5
- import { useState as o } from "react";
6
- import { Pencil as s, Trash2 as c } from "lucide-react";
7
- import { gql as l } from "@apollo/client";
8
- import { useMutation as u } from "@apollo/client/react";
9
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
- import { Button as p, Input as m, ResponsiveDialog as h, ResponsiveDialogContent as g, ResponsiveDialogDescription as _, ResponsiveDialogFooter as v, ResponsiveDialogHeader as y, ResponsiveDialogTitle as b, ResponsiveDialogTrigger as x } from "@burdenoff/fe-libs/ui";
5
+ import { ScheduleMeetingDialog as o } from "../meetings/ScheduleMeetingDialog.js";
6
+ import { useState as s } from "react";
7
+ import { Pencil as c, Trash2 as l } from "lucide-react";
8
+ import { gql as u } from "@apollo/client";
9
+ import { useMutation as d } from "@apollo/client/react";
10
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
+ import { Button as m, Input as h, ResponsiveDialog as g, ResponsiveDialogContent as _, ResponsiveDialogDescription as v, ResponsiveDialogFooter as y, ResponsiveDialogHeader as b, ResponsiveDialogTitle as x, ResponsiveDialogTrigger as S } from "@burdenoff/fe-libs/ui";
11
12
  //#region src/planmagnet/controls/MilestoneControls.tsx
12
- var S = [
13
+ var C = [
13
14
  "PENDING",
14
15
  "IN_PROGRESS",
15
16
  "COMPLETED",
16
17
  "MISSED",
17
18
  "CANCELLED"
18
- ], C = [
19
+ ], w = [
19
20
  "GetMilestonesForDetail",
20
21
  "GetMilestones",
21
22
  "GetDashboardData",
22
23
  "GetAnalyticsData"
23
- ], w = l`
24
+ ], T = u`
24
25
  mutation MilestoneControlsUpdate($id: ID!, $input: PlanmagnetUpdateMilestoneInput!) {
25
26
  planmagnetUpdateMilestone(id: $id, input: $input) {
26
27
  id
@@ -31,84 +32,100 @@ var S = [
31
32
  completedAt
32
33
  }
33
34
  }
34
- `, T = l`
35
+ `, E = u`
35
36
  mutation MilestoneControlsDelete($id: ID!) {
36
37
  planmagnetDeleteMilestone(id: $id)
37
38
  }
38
39
  `;
39
- function E({ milestone: s }) {
40
- let l = e(), [p, m] = u(w, {
41
- refetchQueries: C,
40
+ function D({ milestone: c }) {
41
+ let u = e(), [m, h] = d(T, {
42
+ refetchQueries: w,
42
43
  awaitRefetchQueries: !0
43
- }), [h, g] = u(T, {
44
- refetchQueries: C.filter((e) => e !== "GetMilestonesForDetail"),
44
+ }), [g, _] = d(E, {
45
+ refetchQueries: w.filter((e) => e !== "GetMilestonesForDetail"),
45
46
  context: t
46
- }), [_, v] = o(null), y = m.loading || g.loading, b = S.includes(s.status) ? S : [s.status, ...S], x = async (e) => {
47
- v(null);
47
+ }), [v, y] = s(null), b = h.loading || _.loading, x = C.includes(c.status) ? C : [c.status, ...C], S = async (e) => {
48
+ y(null);
48
49
  try {
49
- await n(p({ variables: {
50
- id: s.id,
50
+ await n(m({ variables: {
51
+ id: c.id,
51
52
  input: { status: e }
52
53
  } }));
53
54
  } catch (e) {
54
- v(e instanceof Error ? e.message : "The status could not be changed.");
55
+ y(e instanceof Error ? e.message : "The status could not be changed.");
55
56
  }
56
- }, E = async () => {
57
- v(null);
57
+ }, D = async () => {
58
+ y(null);
58
59
  try {
59
- await n(h({ variables: { id: s.id } })), l("/projects/milestones-page");
60
+ await n(g({ variables: { id: c.id } })), u("/projects/milestones-page");
60
61
  } catch (e) {
61
- v(e instanceof Error ? e.message : "The milestone could not be deleted.");
62
+ y(e instanceof Error ? e.message : "The milestone could not be deleted.");
62
63
  }
63
64
  };
64
- return /* @__PURE__ */ f("div", {
65
+ return /* @__PURE__ */ p("div", {
65
66
  className: "flex flex-col items-end gap-2",
66
- children: [/* @__PURE__ */ f("div", {
67
+ children: [/* @__PURE__ */ p("div", {
67
68
  className: "flex flex-wrap items-center justify-end gap-2",
68
69
  children: [
69
- /* @__PURE__ */ d("select", {
70
+ /* @__PURE__ */ f("select", {
70
71
  "aria-label": "Status",
71
72
  "data-testid": "milestone-status",
72
73
  className: "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60",
73
- value: s.status,
74
- disabled: y,
74
+ value: c.status,
75
+ disabled: b,
75
76
  onChange: (e) => {
76
- e.target.value !== s.status && x(e.target.value);
77
+ e.target.value !== c.status && S(e.target.value);
77
78
  },
78
- children: b.map((e) => /* @__PURE__ */ d("option", {
79
+ children: x.map((e) => /* @__PURE__ */ f("option", {
79
80
  value: e,
80
81
  children: a(e)
81
82
  }, e))
82
83
  }),
83
- /* @__PURE__ */ d(O, { milestone: s }),
84
- /* @__PURE__ */ d(r, {
84
+ /* @__PURE__ */ f(o, {
85
+ projectId: c.projectId,
86
+ milestoneId: c.id,
87
+ defaultKind: "MILESTONE_CELEBRATION",
88
+ lockKind: !0,
89
+ defaultTitle: `${c.name} celebration`,
90
+ triggerLabel: "Schedule celebration"
91
+ }),
92
+ /* @__PURE__ */ f(o, {
93
+ projectId: c.projectId,
94
+ milestoneId: c.id,
95
+ defaultKind: "DEMO",
96
+ lockKind: !0,
97
+ defaultTitle: `${c.name} demo`,
98
+ triggerLabel: "Schedule demo"
99
+ }),
100
+ /* @__PURE__ */ f(k, { milestone: c }),
101
+ /* @__PURE__ */ f(r, {
85
102
  label: "Delete",
86
103
  variant: "outline",
87
- icon: /* @__PURE__ */ d(c, { className: "mr-1 h-4 w-4" }),
88
- title: `Delete ${s.name}?`,
104
+ icon: /* @__PURE__ */ f(l, { className: "mr-1 h-4 w-4" }),
105
+ title: `Delete ${c.name}?`,
89
106
  description: "The milestone is deleted. This cannot be undone here.",
90
107
  confirmLabel: "Delete milestone",
91
108
  destructive: !0,
92
- disabled: y,
93
- onConfirm: () => void E()
109
+ disabled: b,
110
+ onConfirm: () => void D()
94
111
  })
95
112
  ]
96
- }), _ && /* @__PURE__ */ d(i, { message: _ })]
113
+ }), v && /* @__PURE__ */ f(i, { message: v })]
97
114
  });
98
115
  }
99
- var D = (e) => e ? e.slice(0, 10) : "";
100
- function O({ milestone: e }) {
116
+ var O = (e) => e ? e.slice(0, 10) : "";
117
+ function k({ milestone: e }) {
101
118
  let t = {
102
119
  name: e.name,
103
120
  description: e.description ?? "",
104
- dueDate: D(e.dueDate)
105
- }, [r, a] = o(!1), [c, l] = o(t), [S, T] = o(null), [E, O] = u(w, {
106
- refetchQueries: C,
121
+ dueDate: O(e.dueDate)
122
+ }, [r, a] = s(!1), [o, l] = s(t), [u, C] = s(null), [E, D] = d(T, {
123
+ refetchQueries: w,
107
124
  awaitRefetchQueries: !0
108
125
  }), k = async () => {
109
- T(null);
126
+ C(null);
110
127
  let r = {};
111
- if (c.name.trim() !== t.name && (r.name = c.name.trim()), c.description.trim() !== t.description.trim() && (r.description = c.description.trim() || null), c.dueDate !== t.dueDate && (r.dueDate = c.dueDate || null), Object.keys(r).length === 0) {
128
+ if (o.name.trim() !== t.name && (r.name = o.name.trim()), o.description.trim() !== t.description.trim() && (r.description = o.description.trim() || null), o.dueDate !== t.dueDate && (r.dueDate = o.dueDate || null), Object.keys(r).length === 0) {
112
129
  a(!1);
113
130
  return;
114
131
  }
@@ -118,86 +135,86 @@ function O({ milestone: e }) {
118
135
  input: r
119
136
  } })), a(!1);
120
137
  } catch (e) {
121
- T(e instanceof Error ? e.message : "The milestone could not be saved.");
138
+ C(e instanceof Error ? e.message : "The milestone could not be saved.");
122
139
  }
123
140
  };
124
- return /* @__PURE__ */ f(h, {
141
+ return /* @__PURE__ */ p(g, {
125
142
  open: r,
126
143
  onOpenChange: (e) => {
127
- a(e), e ? l(t) : T(null);
144
+ a(e), e ? l(t) : C(null);
128
145
  },
129
- children: [/* @__PURE__ */ d(x, {
146
+ children: [/* @__PURE__ */ f(S, {
130
147
  asChild: !0,
131
- children: /* @__PURE__ */ f(p, {
148
+ children: /* @__PURE__ */ p(m, {
132
149
  size: "sm",
133
150
  variant: "outline",
134
151
  "data-testid": "milestone-edit",
135
- children: [/* @__PURE__ */ d(s, { className: "mr-1 h-4 w-4" }), "Edit"]
152
+ children: [/* @__PURE__ */ f(c, { className: "mr-1 h-4 w-4" }), "Edit"]
136
153
  })
137
- }), /* @__PURE__ */ f(g, {
154
+ }), /* @__PURE__ */ p(_, {
138
155
  className: "max-w-lg",
139
156
  children: [
140
- /* @__PURE__ */ f(y, { children: [/* @__PURE__ */ d(b, { children: "Edit milestone" }), /* @__PURE__ */ d(_, { children: "Change the name, description or due date." })] }),
141
- /* @__PURE__ */ f("div", {
157
+ /* @__PURE__ */ p(b, { children: [/* @__PURE__ */ f(x, { children: "Edit milestone" }), /* @__PURE__ */ f(v, { children: "Change the name, description or due date." })] }),
158
+ /* @__PURE__ */ p("div", {
142
159
  className: "space-y-3",
143
160
  children: [
144
- /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("label", {
161
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
145
162
  htmlFor: "milestone-edit-name",
146
163
  className: "text-sm font-medium",
147
164
  children: "Name"
148
- }), /* @__PURE__ */ d(m, {
165
+ }), /* @__PURE__ */ f(h, {
149
166
  id: "milestone-edit-name",
150
167
  className: "mt-1",
151
- value: c.name,
168
+ value: o.name,
152
169
  onChange: (e) => l({
153
- ...c,
170
+ ...o,
154
171
  name: e.target.value
155
172
  })
156
173
  })] }),
157
- /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("label", {
174
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
158
175
  htmlFor: "milestone-edit-due",
159
176
  className: "text-sm font-medium",
160
177
  children: "Due date"
161
- }), /* @__PURE__ */ d(m, {
178
+ }), /* @__PURE__ */ f(h, {
162
179
  id: "milestone-edit-due",
163
180
  type: "date",
164
181
  className: "mt-1",
165
- value: c.dueDate,
182
+ value: o.dueDate,
166
183
  onChange: (e) => l({
167
- ...c,
184
+ ...o,
168
185
  dueDate: e.target.value
169
186
  })
170
187
  })] }),
171
- /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("label", {
188
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
172
189
  htmlFor: "milestone-edit-description",
173
190
  className: "text-sm font-medium",
174
191
  children: "Description"
175
- }), /* @__PURE__ */ d("textarea", {
192
+ }), /* @__PURE__ */ f("textarea", {
176
193
  id: "milestone-edit-description",
177
194
  className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]",
178
- value: c.description,
195
+ value: o.description,
179
196
  onChange: (e) => l({
180
- ...c,
197
+ ...o,
181
198
  description: e.target.value
182
199
  })
183
200
  })] }),
184
- S && /* @__PURE__ */ d(i, { message: S })
201
+ u && /* @__PURE__ */ f(i, { message: u })
185
202
  ]
186
203
  }),
187
- /* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(p, {
204
+ /* @__PURE__ */ p(y, { children: [/* @__PURE__ */ f(m, {
188
205
  variant: "outline",
189
206
  onClick: () => a(!1),
190
207
  children: "Cancel"
191
- }), /* @__PURE__ */ d(p, {
208
+ }), /* @__PURE__ */ f(m, {
192
209
  onClick: () => void k(),
193
- disabled: c.name.trim() === "" || O.loading,
194
- children: O.loading ? "Saving…" : "Save"
210
+ disabled: o.name.trim() === "" || D.loading,
211
+ children: D.loading ? "Saving…" : "Save"
195
212
  })] })
196
213
  ]
197
214
  })]
198
215
  });
199
216
  }
200
217
  //#endregion
201
- export { E as MilestoneHeaderActions };
218
+ export { D as MilestoneHeaderActions };
202
219
 
203
220
  //# sourceMappingURL=MilestoneControls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MilestoneControls.js","names":[],"sources":["../../../src/planmagnet/controls/MilestoneControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Milestone controls (BOFF-7953/7963). A milestone was created Pending and could never move: no status control,\n * no edit, no delete — so the In progress / Completed / Missed / Cancelled tabs could only be empty, and the\n * \"Completed\" date stayed \"—\". Completing now also records the date (service, 2026-09-27).\n */\n\nexport const MILESTONE_STATUSES = [\n 'PENDING',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'MISSED',\n 'CANCELLED',\n] as const;\n\nconst MILESTONE_QUERIES = [\n 'GetMilestonesForDetail',\n 'GetMilestones',\n 'GetDashboardData',\n 'GetAnalyticsData',\n];\n\nconst UPDATE = gql`\n mutation MilestoneControlsUpdate($id: ID!, $input: PlanmagnetUpdateMilestoneInput!) {\n planmagnetUpdateMilestone(id: $id, input: $input) {\n id\n name\n description\n status\n dueDate\n completedAt\n }\n }\n`;\nconst DELETE = gql`\n mutation MilestoneControlsDelete($id: ID!) {\n planmagnetDeleteMilestone(id: $id)\n }\n`;\n\nexport interface MilestoneValues {\n id: string;\n name: string;\n description: string | null;\n status: string;\n dueDate: string | null;\n}\n\nexport function MilestoneHeaderActions({ milestone }: { milestone: MilestoneValues }) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: MILESTONE_QUERIES.filter((q) => q !== 'GetMilestonesForDetail'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (MILESTONE_STATUSES as readonly string[]).includes(milestone.status)\n ? MILESTONE_STATUSES\n : [milestone.status, ...MILESTONE_STATUSES];\n\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: milestone.id, input: { status } } }));\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: milestone.id } }));\n navigate('/projects/milestones-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone 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=\"Status\"\n data-testid=\"milestone-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={milestone.status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== milestone.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 <MilestoneEditDialog milestone={milestone} />\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete ${milestone.name}?`}\n description=\"The milestone is deleted. This cannot be undone here.\"\n confirmLabel=\"Delete milestone\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst day = (iso: string | null) => (iso ? iso.slice(0, 10) : '');\n\n/** Name, description and due date. Only changed fields are sent; an emptied field is cleared. */\nfunction MilestoneEditDialog({ milestone }: { milestone: MilestoneValues }) {\n const initial = {\n name: milestone.name,\n description: milestone.description ?? '',\n dueDate: day(milestone.dueDate),\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.name.trim() !== initial.name) input.name = form.name.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (form.dueDate !== initial.dueDate) input.dueDate = form.dueDate || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: milestone.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone could not be saved.');\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"milestone-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit milestone</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Change the name, description or due date.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"milestone-edit-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"milestone-edit-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-due\" className=\"text-sm font-medium\">\n Due date\n </label>\n <Input\n id=\"milestone-edit-due\"\n type=\"date\"\n className=\"mt-1\"\n value={form.dueDate}\n onChange={(e) => setForm({ ...form, dueDate: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <textarea\n id=\"milestone-edit-description\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={form.name.trim() === '' || state.loading}>\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MilestoneControls.js","names":[],"sources":["../../../src/planmagnet/controls/MilestoneControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\nimport { ScheduleMeetingDialog } from '../meetings/ScheduleMeetingDialog';\n\n/**\n * Milestone controls (BOFF-7953/7963). A milestone was created Pending and could never move: no status control,\n * no edit, no delete — so the In progress / Completed / Missed / Cancelled tabs could only be empty, and the\n * \"Completed\" date stayed \"—\". Completing now also records the date (service, 2026-09-27).\n */\n\nexport const MILESTONE_STATUSES = [\n 'PENDING',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'MISSED',\n 'CANCELLED',\n] as const;\n\nconst MILESTONE_QUERIES = [\n 'GetMilestonesForDetail',\n 'GetMilestones',\n 'GetDashboardData',\n 'GetAnalyticsData',\n];\n\nconst UPDATE = gql`\n mutation MilestoneControlsUpdate($id: ID!, $input: PlanmagnetUpdateMilestoneInput!) {\n planmagnetUpdateMilestone(id: $id, input: $input) {\n id\n name\n description\n status\n dueDate\n completedAt\n }\n }\n`;\nconst DELETE = gql`\n mutation MilestoneControlsDelete($id: ID!) {\n planmagnetDeleteMilestone(id: $id)\n }\n`;\n\nexport interface MilestoneValues {\n id: string;\n name: string;\n description: string | null;\n status: string;\n dueDate: string | null;\n /** Needed to schedule a celebration/demo meeting against this milestone's own project (GAP-06). */\n projectId: string;\n}\n\nexport function MilestoneHeaderActions({ milestone }: { milestone: MilestoneValues }) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: MILESTONE_QUERIES.filter((q) => q !== 'GetMilestonesForDetail'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (MILESTONE_STATUSES as readonly string[]).includes(milestone.status)\n ? MILESTONE_STATUSES\n : [milestone.status, ...MILESTONE_STATUSES];\n\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: milestone.id, input: { status } } }));\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: milestone.id } }));\n navigate('/projects/milestones-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone 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=\"Status\"\n data-testid=\"milestone-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={milestone.status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== milestone.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 <ScheduleMeetingDialog\n projectId={milestone.projectId}\n milestoneId={milestone.id}\n defaultKind=\"MILESTONE_CELEBRATION\"\n lockKind\n defaultTitle={`${milestone.name} celebration`}\n triggerLabel=\"Schedule celebration\"\n />\n <ScheduleMeetingDialog\n projectId={milestone.projectId}\n milestoneId={milestone.id}\n defaultKind=\"DEMO\"\n lockKind\n defaultTitle={`${milestone.name} demo`}\n triggerLabel=\"Schedule demo\"\n />\n <MilestoneEditDialog milestone={milestone} />\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete ${milestone.name}?`}\n description=\"The milestone is deleted. This cannot be undone here.\"\n confirmLabel=\"Delete milestone\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst day = (iso: string | null) => (iso ? iso.slice(0, 10) : '');\n\n/** Name, description and due date. Only changed fields are sent; an emptied field is cleared. */\nfunction MilestoneEditDialog({ milestone }: { milestone: MilestoneValues }) {\n const initial = {\n name: milestone.name,\n description: milestone.description ?? '',\n dueDate: day(milestone.dueDate),\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.name.trim() !== initial.name) input.name = form.name.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (form.dueDate !== initial.dueDate) input.dueDate = form.dueDate || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: milestone.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone could not be saved.');\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"milestone-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit milestone</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Change the name, description or due date.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"milestone-edit-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"milestone-edit-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-due\" className=\"text-sm font-medium\">\n Due date\n </label>\n <Input\n id=\"milestone-edit-due\"\n type=\"date\"\n className=\"mt-1\"\n value={form.dueDate}\n onChange={(e) => setForm({ ...form, dueDate: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <textarea\n id=\"milestone-edit-description\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={form.name.trim() === '' || state.loading}>\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { throwOnError as e } from "../utils/mutationResult.js";
2
- import { ConfirmButton as t, ErrorLine as n } from "./ConfirmButton.js";
3
- import { enumLabel as r } from "./WorkItemControls.js";
4
- import { isForbidden as i, mutationErrorMessage as a } from "../utils/graphqlErrors.js";
1
+ import { isForbidden as e, mutationErrorMessage as t } from "../utils/graphqlErrors.js";
2
+ import { throwOnError as n } from "../utils/mutationResult.js";
3
+ import { ConfirmButton as r, ErrorLine as i } from "./ConfirmButton.js";
4
+ import { enumLabel as a } from "./WorkItemControls.js";
5
5
  import { useSyncProviderCapabilities as o } from "../integrations/useSyncProviderCapabilities.js";
6
6
  import { CONFLICT_RESOLUTIONS as s, GITHUB_FIELD_MAPPING_DEFAULTS as c, SYNC_DIRECTIONS as l, directionLabel as u, directionSupported as d, isValidGithubOwner as f, isValidGithubRepo as p, parseGithubFieldMapping as m } from "../integrations/syncTypes.js";
7
7
  import { useState as h } from "react";
@@ -27,7 +27,7 @@ function F({ status: e }) {
27
27
  return /* @__PURE__ */ D(k, {
28
28
  variant: P[e] ?? "outline",
29
29
  className: "text-xs",
30
- children: r(e)
30
+ children: a(e)
31
31
  });
32
32
  }
33
33
  var I = {
@@ -39,14 +39,14 @@ function L({ status: e }) {
39
39
  return /* @__PURE__ */ D(k, {
40
40
  variant: I[e] ?? "secondary",
41
41
  className: "text-xs",
42
- children: r(e)
42
+ children: a(e)
43
43
  });
44
44
  }
45
45
  function R({ status: e }) {
46
46
  return /* @__PURE__ */ D(k, {
47
47
  variant: e === "OPEN" ? "warning" : "secondary",
48
48
  className: "text-xs",
49
- children: r(e)
49
+ children: a(e)
50
50
  });
51
51
  }
52
52
  function z({ text: e, max: t = 140, className: n = "text-muted-foreground", testId: r }) {
@@ -126,14 +126,14 @@ var V = w`
126
126
  }
127
127
  }
128
128
  `;
129
- function H({ syncId: t, onResult: r, size: o = "sm" }) {
129
+ function H({ syncId: r, onResult: a, size: o = "sm" }) {
130
130
  let [s, c] = T(V, { refetchQueries: [...M, ...N] }), [l, u] = h(null), d = async () => {
131
131
  u(null);
132
132
  try {
133
- let n = await e(s({ variables: { id: t } }));
134
- n.data && r?.(n.data.planmagnetStartSync);
135
- } catch (e) {
136
- u(i(e) ? "Your role can view integrations but not change them." : a(e, "The sync could not be started."));
133
+ let e = await n(s({ variables: { id: r } }));
134
+ e.data && a?.(e.data.planmagnetStartSync);
135
+ } catch (n) {
136
+ u(e(n) ? "Your role can view integrations but not change them." : t(n, "The sync could not be started."));
137
137
  }
138
138
  };
139
139
  return /* @__PURE__ */ O("div", {
@@ -145,7 +145,7 @@ function H({ syncId: t, onResult: r, size: o = "sm" }) {
145
145
  onClick: () => void d(),
146
146
  "data-testid": "sync-run-now",
147
147
  children: [c.loading ? /* @__PURE__ */ D(y, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ D(S, { className: "mr-1 h-4 w-4" }), "Run now"]
148
- }), l && /* @__PURE__ */ D(n, { message: l })]
148
+ }), l && /* @__PURE__ */ D(i, { message: l })]
149
149
  });
150
150
  }
151
151
  function ue({ result: e }) {
@@ -193,13 +193,13 @@ var U = w`
193
193
  }
194
194
  }
195
195
  `;
196
- function W({ syncId: t, status: r }) {
197
- let [o, s] = T(U, { refetchQueries: M }), [c, l] = T(de, { refetchQueries: M }), [u, d] = h(null), f = s.loading || l.loading, p = r === "PAUSED", m = async () => {
196
+ function W({ syncId: r, status: a }) {
197
+ let [o, s] = T(U, { refetchQueries: M }), [c, l] = T(de, { refetchQueries: M }), [u, d] = h(null), f = s.loading || l.loading, p = a === "PAUSED", m = async () => {
198
198
  d(null);
199
199
  try {
200
- p ? await e(c({ variables: { id: t } })) : await e(o({ variables: { id: t } }));
201
- } catch (e) {
202
- d(i(e) ? "Your role can view integrations but not change them." : a(e, `The sync could not be ${p ? "resumed" : "paused"}.`));
200
+ p ? await n(c({ variables: { id: r } })) : await n(o({ variables: { id: r } }));
201
+ } catch (n) {
202
+ d(e(n) ? "Your role can view integrations but not change them." : t(n, `The sync could not be ${p ? "resumed" : "paused"}.`));
203
203
  }
204
204
  };
205
205
  return /* @__PURE__ */ O("div", {
@@ -211,7 +211,7 @@ function W({ syncId: t, status: r }) {
211
211
  onClick: () => void m(),
212
212
  "data-testid": p ? "sync-resume" : "sync-pause",
213
213
  children: [f ? /* @__PURE__ */ D(y, { className: "mr-1 h-4 w-4 animate-spin" }) : D(p ? x : b, { className: "mr-1 h-4 w-4" }), p ? "Resume" : "Pause"]
214
- }), u && /* @__PURE__ */ D(n, { message: u })]
214
+ }), u && /* @__PURE__ */ D(i, { message: u })]
215
215
  });
216
216
  }
217
217
  var G = w`
@@ -223,14 +223,14 @@ var G = w`
223
223
  }
224
224
  }
225
225
  `;
226
- function K({ syncId: t }) {
227
- let [r, o] = T(G), [s, c] = h(null), [l, u] = h(null), d = async () => {
226
+ function K({ syncId: r }) {
227
+ let [a, o] = T(G), [s, c] = h(null), [l, u] = h(null), d = async () => {
228
228
  u(null), c(null);
229
229
  try {
230
- let n = await e(r({ variables: { id: t } }));
231
- n.data && c(n.data.planmagnetTestExternalSync);
232
- } catch (e) {
233
- u(i(e) ? "Your role can view integrations but not change them." : a(e, "The connection could not be tested."));
230
+ let e = await n(a({ variables: { id: r } }));
231
+ e.data && c(e.data.planmagnetTestExternalSync);
232
+ } catch (n) {
233
+ u(e(n) ? "Your role can view integrations but not change them." : t(n, "The connection could not be tested."));
234
234
  }
235
235
  };
236
236
  return /* @__PURE__ */ O("div", {
@@ -253,7 +253,7 @@ function K({ syncId: t }) {
253
253
  s.rateLimitRemaining !== null && ` (${s.rateLimitRemaining} calls remaining)`
254
254
  ]
255
255
  }),
256
- l && /* @__PURE__ */ D(n, { message: l })
256
+ l && /* @__PURE__ */ D(i, { message: l })
257
257
  ]
258
258
  });
259
259
  }
@@ -262,18 +262,18 @@ var q = w`
262
262
  planmagnetDeleteExternalSync(id: $id)
263
263
  }
264
264
  `;
265
- function J({ syncId: r, label: o, onDeleted: s }) {
265
+ function J({ syncId: a, label: o, onDeleted: s }) {
266
266
  let [c, { loading: l }] = T(q, { refetchQueries: M }), [u, d] = h(null), f = async () => {
267
267
  d(null);
268
268
  try {
269
- await e(c({ variables: { id: r } })), s?.();
270
- } catch (e) {
271
- d(i(e) ? "Your role can view integrations but not change them." : a(e, "The sync could not be deleted."));
269
+ await n(c({ variables: { id: a } })), s?.();
270
+ } catch (n) {
271
+ d(e(n) ? "Your role can view integrations but not change them." : t(n, "The sync could not be deleted."));
272
272
  }
273
273
  };
274
274
  return /* @__PURE__ */ O("div", {
275
275
  className: "flex flex-col items-end gap-1",
276
- children: [/* @__PURE__ */ D(t, {
276
+ children: [/* @__PURE__ */ D(r, {
277
277
  label: "Delete",
278
278
  variant: "outline",
279
279
  icon: /* @__PURE__ */ D(C, { className: "mr-1 h-4 w-4" }),
@@ -284,7 +284,7 @@ function J({ syncId: r, label: o, onDeleted: s }) {
284
284
  disabled: l,
285
285
  onConfirm: () => void f(),
286
286
  testId: "sync-delete"
287
- }), u && /* @__PURE__ */ D(n, { message: u })]
287
+ }), u && /* @__PURE__ */ D(i, { message: u })]
288
288
  });
289
289
  }
290
290
  var fe = w`
@@ -298,16 +298,16 @@ var fe = w`
298
298
  }
299
299
  }
300
300
  `;
301
- function Y({ conflictId: t }) {
302
- let [r, o] = T(fe, { refetchQueries: N }), [s, c] = h(null), [l, u] = h(null), d = async (n) => {
303
- c(null), u(n);
301
+ function Y({ conflictId: r }) {
302
+ let [a, o] = T(fe, { refetchQueries: N }), [s, c] = h(null), [l, u] = h(null), d = async (i) => {
303
+ c(null), u(i);
304
304
  try {
305
- await e(r({ variables: {
306
- id: t,
307
- resolution: n
305
+ await n(a({ variables: {
306
+ id: r,
307
+ resolution: i
308
308
  } }));
309
- } catch (e) {
310
- c(i(e) ? "Your role can view integrations but not change them." : a(e, "The conflict could not be resolved."));
309
+ } catch (n) {
310
+ c(e(n) ? "Your role can view integrations but not change them." : t(n, "The conflict could not be resolved."));
311
311
  } finally {
312
312
  u(null);
313
313
  }
@@ -342,7 +342,7 @@ function Y({ conflictId: t }) {
342
342
  children: [l === "MANUAL" && /* @__PURE__ */ D(y, { className: "mr-1 h-4 w-4 animate-spin" }), "Dismiss (manual)"]
343
343
  })
344
344
  ]
345
- }), s && /* @__PURE__ */ D(n, { message: s })]
345
+ }), s && /* @__PURE__ */ D(i, { message: s })]
346
346
  });
347
347
  }
348
348
  var pe = {
@@ -369,23 +369,23 @@ var pe = {
369
369
  }
370
370
  }
371
371
  `;
372
- function X({ sync: t }) {
373
- let [g, _] = h(!1), v = t.provider === "GITHUB", { capabilities: y } = o(), b = y.find((e) => e.provider === t.provider), x = b ? l.filter((e) => d(b, e)) : l, S = m(t.fieldMapping), C = t.syncFilters ? JSON.stringify(t.syncFilters, null, 2) : "", [w, E] = h(t.direction), [k, P] = h(t.conflictStrategy), [F, I] = h(S.priority), [L, R] = h(S.dueDate), [z, B] = h(C), [V, H] = h(null), [ue, U] = h(""), [de, W] = h(""), [G, K] = h(""), [q, J] = h(null), { data: fe } = te(he, {
374
- variables: { id: t.id },
372
+ function X({ sync: r }) {
373
+ let [g, _] = h(!1), v = r.provider === "GITHUB", { capabilities: y } = o(), b = y.find((e) => e.provider === r.provider), x = b ? l.filter((e) => d(b, e)) : l, S = m(r.fieldMapping), C = r.syncFilters ? JSON.stringify(r.syncFilters, null, 2) : "", [w, E] = h(r.direction), [k, P] = h(r.conflictStrategy), [F, I] = h(S.priority), [L, R] = h(S.dueDate), [z, B] = h(C), [V, H] = h(null), [ue, U] = h(""), [de, W] = h(""), [G, K] = h(""), [q, J] = h(null), { data: fe } = te(he, {
374
+ variables: { id: r.id },
375
375
  skip: !g || !v
376
376
  }), Y = fe?.planmagnetExternalSync?.connectionConfig, X = typeof Y?.owner == "string" ? Y.owner : "", _e = typeof Y?.repo == "string" ? Y.repo : "", Z = ue || X, Q = de || _e, ve = () => {
377
- E(t.direction), P(t.conflictStrategy), I(S.priority), R(S.dueDate), B(C), H(null), U(""), W(""), K(""), J(null);
377
+ E(r.direction), P(r.conflictStrategy), I(S.priority), R(S.dueDate), B(C), H(null), U(""), W(""), K(""), J(null);
378
378
  }, [ye, $] = T(ge, { refetchQueries: [...M, ...N] }), be = v && !!Y && (Z !== X || Q !== _e || G.trim() !== ""), xe = F.trim() !== S.priority || L.trim() !== S.dueDate, Se = z.trim() !== C.trim(), Ce = async () => {
379
379
  J(null), H(null);
380
- let n = {};
381
- if (w !== t.direction && (n.direction = w), k !== t.conflictStrategy && (n.conflictStrategy = k), xe && (n.fieldMapping = {
380
+ let i = {};
381
+ if (w !== r.direction && (i.direction = w), k !== r.conflictStrategy && (i.conflictStrategy = k), xe && (i.fieldMapping = {
382
382
  ...F.trim() ? { priority: F.trim() } : {},
383
383
  ...L.trim() ? { dueDate: L.trim() } : {}
384
384
  }), Se) {
385
385
  let e = z.trim();
386
- if (!e) n.syncFilters = null;
386
+ if (!e) i.syncFilters = null;
387
387
  else try {
388
- n.syncFilters = JSON.parse(e);
388
+ i.syncFilters = JSON.parse(e);
389
389
  } catch {
390
390
  H("Sync filters must be valid JSON.");
391
391
  return;
@@ -400,23 +400,23 @@ function X({ sync: t }) {
400
400
  J("Owner and repo must look like real GitHub names (letters, digits, \"-\", \"_\", \".\").");
401
401
  return;
402
402
  }
403
- n.connectionConfig = {
403
+ i.connectionConfig = {
404
404
  token: G.trim(),
405
405
  owner: Z.trim(),
406
406
  repo: Q.trim()
407
407
  };
408
408
  }
409
- if (Object.keys(n).length === 0) {
409
+ if (Object.keys(i).length === 0) {
410
410
  _(!1);
411
411
  return;
412
412
  }
413
413
  try {
414
- await e(ye({ variables: {
415
- id: t.id,
416
- input: n
414
+ await n(ye({ variables: {
415
+ id: r.id,
416
+ input: i
417
417
  } })), _(!1);
418
- } catch (e) {
419
- J(i(e) ? "Your role can view integrations but not change them." : a(e, "The sync could not be saved."));
418
+ } catch (n) {
419
+ J(e(n) ? "Your role can view integrations but not change them." : t(n, "The sync could not be saved."));
420
420
  }
421
421
  };
422
422
  return /* @__PURE__ */ O(ne, {
@@ -469,7 +469,7 @@ function X({ sync: t }) {
469
469
  onChange: (e) => P(e.target.value),
470
470
  children: s.map((e) => /* @__PURE__ */ D("option", {
471
471
  value: e,
472
- children: r(e)
472
+ children: a(e)
473
473
  }, e))
474
474
  }),
475
475
  /* @__PURE__ */ D("p", {
@@ -542,7 +542,7 @@ function X({ sync: t }) {
542
542
  value: z,
543
543
  onChange: (e) => B(e.target.value)
544
544
  }),
545
- V && /* @__PURE__ */ D(n, { message: V })
545
+ V && /* @__PURE__ */ D(i, { message: V })
546
546
  ] }),
547
547
  v && /* @__PURE__ */ O("div", {
548
548
  className: "space-y-2 rounded-md border p-3",
@@ -591,7 +591,7 @@ function X({ sync: t }) {
591
591
  })] })
592
592
  ]
593
593
  }),
594
- q && /* @__PURE__ */ D(n, { message: q })
594
+ q && /* @__PURE__ */ D(i, { message: q })
595
595
  ]
596
596
  }),
597
597
  /* @__PURE__ */ O(ae, { children: [/* @__PURE__ */ D(A, {