@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.
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +163 -150
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +124 -108
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/comments/CommentThread.js +36 -36
- package/dist/planmagnet/comments/RoadmapComments.js +21 -21
- package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
- package/dist/planmagnet/controls/FeatureControls.js +60 -60
- package/dist/planmagnet/controls/MilestoneControls.d.ts +2 -0
- package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/MilestoneControls.js +89 -72
- package/dist/planmagnet/controls/MilestoneControls.js.map +1 -1
- package/dist/planmagnet/controls/SyncControls.js +59 -59
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
- package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
- package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.js +37 -0
- package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts +17 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +218 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts +7 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.js +108 -0
- package/dist/planmagnet/meetings/MeetingsCard.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts +9 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +232 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts +19 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +226 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts +14 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +81 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts +57 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.js +51 -0
- package/dist/planmagnet/meetings/meetingActions.js.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts +29 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.js +166 -0
- package/dist/planmagnet/meetings/meetingGraphql.js.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts +74 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.js +88 -0
- package/dist/planmagnet/meetings/meetingModel.js.map +1 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +197 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +173 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +73 -52
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +205 -190
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +211 -182
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportPagePage.js +22 -22
- package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +21 -21
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
- package/dist/planmagnet/product/ProductControls.js +91 -91
- package/dist/planmagnet/reports/SchedulesPanel.js +33 -33
- package/dist/planmagnet/reports/ShareDialog.js +76 -76
- package/dist/planmagnet/reports/ShareDialog.js.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.d.ts +3 -2
- package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
- 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 {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
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
|
|
13
|
+
var C = [
|
|
13
14
|
"PENDING",
|
|
14
15
|
"IN_PROGRESS",
|
|
15
16
|
"COMPLETED",
|
|
16
17
|
"MISSED",
|
|
17
18
|
"CANCELLED"
|
|
18
|
-
],
|
|
19
|
+
], w = [
|
|
19
20
|
"GetMilestonesForDetail",
|
|
20
21
|
"GetMilestones",
|
|
21
22
|
"GetDashboardData",
|
|
22
23
|
"GetAnalyticsData"
|
|
23
|
-
],
|
|
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
|
-
`,
|
|
35
|
+
`, E = u`
|
|
35
36
|
mutation MilestoneControlsDelete($id: ID!) {
|
|
36
37
|
planmagnetDeleteMilestone(id: $id)
|
|
37
38
|
}
|
|
38
39
|
`;
|
|
39
|
-
function
|
|
40
|
-
let
|
|
41
|
-
refetchQueries:
|
|
40
|
+
function D({ milestone: c }) {
|
|
41
|
+
let u = e(), [m, h] = d(T, {
|
|
42
|
+
refetchQueries: w,
|
|
42
43
|
awaitRefetchQueries: !0
|
|
43
|
-
}), [
|
|
44
|
-
refetchQueries:
|
|
44
|
+
}), [g, _] = d(E, {
|
|
45
|
+
refetchQueries: w.filter((e) => e !== "GetMilestonesForDetail"),
|
|
45
46
|
context: t
|
|
46
|
-
}), [
|
|
47
|
-
|
|
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(
|
|
50
|
-
id:
|
|
50
|
+
await n(m({ variables: {
|
|
51
|
+
id: c.id,
|
|
51
52
|
input: { status: e }
|
|
52
53
|
} }));
|
|
53
54
|
} catch (e) {
|
|
54
|
-
|
|
55
|
+
y(e instanceof Error ? e.message : "The status could not be changed.");
|
|
55
56
|
}
|
|
56
|
-
},
|
|
57
|
-
|
|
57
|
+
}, D = async () => {
|
|
58
|
+
y(null);
|
|
58
59
|
try {
|
|
59
|
-
await n(
|
|
60
|
+
await n(g({ variables: { id: c.id } })), u("/projects/milestones-page");
|
|
60
61
|
} catch (e) {
|
|
61
|
-
|
|
62
|
+
y(e instanceof Error ? e.message : "The milestone could not be deleted.");
|
|
62
63
|
}
|
|
63
64
|
};
|
|
64
|
-
return /* @__PURE__ */
|
|
65
|
+
return /* @__PURE__ */ p("div", {
|
|
65
66
|
className: "flex flex-col items-end gap-2",
|
|
66
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ p("div", {
|
|
67
68
|
className: "flex flex-wrap items-center justify-end gap-2",
|
|
68
69
|
children: [
|
|
69
|
-
/* @__PURE__ */
|
|
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:
|
|
74
|
-
disabled:
|
|
74
|
+
value: c.status,
|
|
75
|
+
disabled: b,
|
|
75
76
|
onChange: (e) => {
|
|
76
|
-
e.target.value !==
|
|
77
|
+
e.target.value !== c.status && S(e.target.value);
|
|
77
78
|
},
|
|
78
|
-
children:
|
|
79
|
+
children: x.map((e) => /* @__PURE__ */ f("option", {
|
|
79
80
|
value: e,
|
|
80
81
|
children: a(e)
|
|
81
82
|
}, e))
|
|
82
83
|
}),
|
|
83
|
-
/* @__PURE__ */
|
|
84
|
-
|
|
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__ */
|
|
88
|
-
title: `Delete ${
|
|
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:
|
|
93
|
-
onConfirm: () => void
|
|
109
|
+
disabled: b,
|
|
110
|
+
onConfirm: () => void D()
|
|
94
111
|
})
|
|
95
112
|
]
|
|
96
|
-
}),
|
|
113
|
+
}), v && /* @__PURE__ */ f(i, { message: v })]
|
|
97
114
|
});
|
|
98
115
|
}
|
|
99
|
-
var
|
|
100
|
-
function
|
|
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:
|
|
105
|
-
}, [r, a] =
|
|
106
|
-
refetchQueries:
|
|
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
|
-
|
|
126
|
+
C(null);
|
|
110
127
|
let r = {};
|
|
111
|
-
if (
|
|
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
|
-
|
|
138
|
+
C(e instanceof Error ? e.message : "The milestone could not be saved.");
|
|
122
139
|
}
|
|
123
140
|
};
|
|
124
|
-
return /* @__PURE__ */
|
|
141
|
+
return /* @__PURE__ */ p(g, {
|
|
125
142
|
open: r,
|
|
126
143
|
onOpenChange: (e) => {
|
|
127
|
-
a(e), e ? l(t) :
|
|
144
|
+
a(e), e ? l(t) : C(null);
|
|
128
145
|
},
|
|
129
|
-
children: [/* @__PURE__ */
|
|
146
|
+
children: [/* @__PURE__ */ f(S, {
|
|
130
147
|
asChild: !0,
|
|
131
|
-
children: /* @__PURE__ */
|
|
148
|
+
children: /* @__PURE__ */ p(m, {
|
|
132
149
|
size: "sm",
|
|
133
150
|
variant: "outline",
|
|
134
151
|
"data-testid": "milestone-edit",
|
|
135
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ f(c, { className: "mr-1 h-4 w-4" }), "Edit"]
|
|
136
153
|
})
|
|
137
|
-
}), /* @__PURE__ */
|
|
154
|
+
}), /* @__PURE__ */ p(_, {
|
|
138
155
|
className: "max-w-lg",
|
|
139
156
|
children: [
|
|
140
|
-
/* @__PURE__ */
|
|
141
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
165
|
+
}), /* @__PURE__ */ f(h, {
|
|
149
166
|
id: "milestone-edit-name",
|
|
150
167
|
className: "mt-1",
|
|
151
|
-
value:
|
|
168
|
+
value: o.name,
|
|
152
169
|
onChange: (e) => l({
|
|
153
|
-
...
|
|
170
|
+
...o,
|
|
154
171
|
name: e.target.value
|
|
155
172
|
})
|
|
156
173
|
})] }),
|
|
157
|
-
/* @__PURE__ */
|
|
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__ */
|
|
178
|
+
}), /* @__PURE__ */ f(h, {
|
|
162
179
|
id: "milestone-edit-due",
|
|
163
180
|
type: "date",
|
|
164
181
|
className: "mt-1",
|
|
165
|
-
value:
|
|
182
|
+
value: o.dueDate,
|
|
166
183
|
onChange: (e) => l({
|
|
167
|
-
...
|
|
184
|
+
...o,
|
|
168
185
|
dueDate: e.target.value
|
|
169
186
|
})
|
|
170
187
|
})] }),
|
|
171
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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:
|
|
195
|
+
value: o.description,
|
|
179
196
|
onChange: (e) => l({
|
|
180
|
-
...
|
|
197
|
+
...o,
|
|
181
198
|
description: e.target.value
|
|
182
199
|
})
|
|
183
200
|
})] }),
|
|
184
|
-
|
|
201
|
+
u && /* @__PURE__ */ f(i, { message: u })
|
|
185
202
|
]
|
|
186
203
|
}),
|
|
187
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ p(y, { children: [/* @__PURE__ */ f(m, {
|
|
188
205
|
variant: "outline",
|
|
189
206
|
onClick: () => a(!1),
|
|
190
207
|
children: "Cancel"
|
|
191
|
-
}), /* @__PURE__ */
|
|
208
|
+
}), /* @__PURE__ */ f(m, {
|
|
192
209
|
onClick: () => void k(),
|
|
193
|
-
disabled:
|
|
194
|
-
children:
|
|
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 {
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
134
|
-
|
|
135
|
-
} catch (
|
|
136
|
-
u(
|
|
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(
|
|
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:
|
|
197
|
-
let [o, s] = T(U, { refetchQueries: M }), [c, l] = T(de, { refetchQueries: M }), [u, d] = h(null), f = s.loading || l.loading, p =
|
|
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
|
|
201
|
-
} catch (
|
|
202
|
-
d(
|
|
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(
|
|
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:
|
|
227
|
-
let [
|
|
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
|
|
231
|
-
|
|
232
|
-
} catch (
|
|
233
|
-
u(
|
|
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(
|
|
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:
|
|
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
|
|
270
|
-
} catch (
|
|
271
|
-
d(
|
|
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(
|
|
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(
|
|
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:
|
|
302
|
-
let [
|
|
303
|
-
c(null), u(
|
|
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
|
|
306
|
-
id:
|
|
307
|
-
resolution:
|
|
305
|
+
await n(a({ variables: {
|
|
306
|
+
id: r,
|
|
307
|
+
resolution: i
|
|
308
308
|
} }));
|
|
309
|
-
} catch (
|
|
310
|
-
c(
|
|
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(
|
|
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:
|
|
373
|
-
let [g, _] = h(!1), v =
|
|
374
|
-
variables: { 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(
|
|
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
|
|
381
|
-
if (w !==
|
|
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)
|
|
386
|
+
if (!e) i.syncFilters = null;
|
|
387
387
|
else try {
|
|
388
|
-
|
|
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
|
-
|
|
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(
|
|
409
|
+
if (Object.keys(i).length === 0) {
|
|
410
410
|
_(!1);
|
|
411
411
|
return;
|
|
412
412
|
}
|
|
413
413
|
try {
|
|
414
|
-
await
|
|
415
|
-
id:
|
|
416
|
-
input:
|
|
414
|
+
await n(ye({ variables: {
|
|
415
|
+
id: r.id,
|
|
416
|
+
input: i
|
|
417
417
|
} })), _(!1);
|
|
418
|
-
} catch (
|
|
419
|
-
J(
|
|
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:
|
|
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(
|
|
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(
|
|
594
|
+
q && /* @__PURE__ */ D(i, { message: q })
|
|
595
595
|
]
|
|
596
596
|
}),
|
|
597
597
|
/* @__PURE__ */ O(ae, { children: [/* @__PURE__ */ D(A, {
|