@burdenoff/microfe-planmagnet 2026.1001.5 → 2026.1001.7

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 (126) hide show
  1. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoutes.js +10 -6
  3. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  4. package/dist/planmagnet/automation/automationRuleTypes.d.ts +31 -19
  5. package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -1
  6. package/dist/planmagnet/automation/automationRuleTypes.js +4 -8
  7. package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -1
  8. package/dist/planmagnet/controls/CompetitorControls.d.ts +71 -0
  9. package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -1
  10. package/dist/planmagnet/controls/CompetitorControls.js +346 -12
  11. package/dist/planmagnet/controls/CompetitorControls.js.map +1 -1
  12. package/dist/planmagnet/controls/FeatureControls.d.ts +23 -1
  13. package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -1
  14. package/dist/planmagnet/controls/FeatureControls.js +431 -229
  15. package/dist/planmagnet/controls/FeatureControls.js.map +1 -1
  16. package/dist/planmagnet/controls/FeedbackControls.d.ts +70 -0
  17. package/dist/planmagnet/controls/FeedbackControls.d.ts.map +1 -0
  18. package/dist/planmagnet/controls/FeedbackControls.js +153 -0
  19. package/dist/planmagnet/controls/FeedbackControls.js.map +1 -0
  20. package/dist/planmagnet/controls/Pickers.d.ts +15 -0
  21. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  22. package/dist/planmagnet/controls/Pickers.js +61 -1
  23. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  24. package/dist/planmagnet/controls/PrioritizationControls.d.ts +36 -0
  25. package/dist/planmagnet/controls/PrioritizationControls.d.ts.map +1 -1
  26. package/dist/planmagnet/controls/PrioritizationControls.js +118 -1
  27. package/dist/planmagnet/controls/PrioritizationControls.js.map +1 -1
  28. package/dist/planmagnet/controls/SyncControls.d.ts.map +1 -1
  29. package/dist/planmagnet/controls/SyncControls.js +1 -0
  30. package/dist/planmagnet/controls/SyncControls.js.map +1 -1
  31. package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts +47 -0
  32. package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts.map +1 -0
  33. package/dist/planmagnet/controls/WebhookSubscriptionControls.js +542 -0
  34. package/dist/planmagnet/controls/WebhookSubscriptionControls.js.map +1 -0
  35. package/dist/planmagnet/dashboards/DashboardUI.js +8 -8
  36. package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js +4 -4
  37. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.d.ts.map +1 -1
  38. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js +67 -59
  39. package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js.map +1 -1
  40. package/dist/planmagnet/forecast/DeliveryForecastCard.js +8 -8
  41. package/dist/planmagnet/forecast/ProjectOutlookCard.js +10 -10
  42. package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +9 -9
  43. package/dist/planmagnet/forecast/ResourceForecastCard.js +6 -6
  44. package/dist/planmagnet/integrations/syncTypes.d.ts +2 -1
  45. package/dist/planmagnet/integrations/syncTypes.d.ts.map +1 -1
  46. package/dist/planmagnet/integrations/syncTypes.js +19 -9
  47. package/dist/planmagnet/integrations/syncTypes.js.map +1 -1
  48. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  49. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +290 -283
  50. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  51. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -1
  52. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +126 -63
  53. package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -1
  54. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -1
  55. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +14 -0
  56. package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -1
  57. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -1
  58. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +93 -57
  59. package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -1
  60. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -1
  61. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +125 -83
  62. package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -1
  63. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +23 -23
  64. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +340 -248
  66. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.d.ts.map +1 -1
  68. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js +172 -167
  69. package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js.map +1 -1
  70. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.d.ts.map +1 -1
  71. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js +92 -83
  72. package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js.map +1 -1
  73. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts +2 -0
  74. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts.map +1 -0
  75. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js +175 -0
  76. package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js.map +1 -0
  77. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -1
  78. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +226 -126
  79. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -1
  80. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  81. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +151 -126
  82. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  83. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  84. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +169 -122
  85. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  86. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
  87. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +165 -109
  88. package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
  89. package/dist/planmagnet/pages/ProductsProductsPagePage.js +13 -13
  90. package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +9 -9
  91. package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +8 -8
  92. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  93. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +15 -3
  94. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  95. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +12 -12
  96. package/dist/planmagnet/pages/ReportsReportsPagePage.js +23 -23
  97. package/dist/planmagnet/pages/TasksMyDashboardPagePage.js +18 -18
  98. package/dist/planmagnet/pages/TasksMyWorkPagePage.js +10 -10
  99. package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +5 -5
  100. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  101. package/dist/planmagnet/pages/TeamTeamPagePage.js +59 -53
  102. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  103. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +8 -8
  104. package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +6 -6
  105. package/dist/planmagnet/pages/analytics/MetricsCard.d.ts +8 -0
  106. package/dist/planmagnet/pages/analytics/MetricsCard.d.ts.map +1 -0
  107. package/dist/planmagnet/pages/analytics/MetricsCard.js +164 -0
  108. package/dist/planmagnet/pages/analytics/MetricsCard.js.map +1 -0
  109. package/dist/planmagnet/pages/analytics/QualityMetricsCard.js +6 -6
  110. package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +8 -8
  111. package/dist/planmagnet/pages/analytics/StatusFlowCard.js +7 -7
  112. package/dist/planmagnet/pages/analytics/ThroughputCard.js +7 -7
  113. package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +7 -7
  114. package/dist/planmagnet/people/People.d.ts +14 -0
  115. package/dist/planmagnet/people/People.d.ts.map +1 -1
  116. package/dist/planmagnet/people/People.js +36 -22
  117. package/dist/planmagnet/people/People.js.map +1 -1
  118. package/dist/planmagnet/team/UnmatchedCrewIdentities.d.ts +2 -0
  119. package/dist/planmagnet/team/UnmatchedCrewIdentities.d.ts.map +1 -0
  120. package/dist/planmagnet/team/UnmatchedCrewIdentities.js +155 -0
  121. package/dist/planmagnet/team/UnmatchedCrewIdentities.js.map +1 -0
  122. package/dist/planmagnet/webhooks/webhookTypes.d.ts +54 -0
  123. package/dist/planmagnet/webhooks/webhookTypes.d.ts.map +1 -0
  124. package/dist/planmagnet/webhooks/webhookTypes.js +17 -0
  125. package/dist/planmagnet/webhooks/webhookTypes.js.map +1 -0
  126. package/package.json +1 -1
@@ -0,0 +1,175 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { TruncatedText as n } from "../controls/SyncControls.js";
3
+ import { CreateWebhookSubscriptionDialog as r, DeleteWebhookSubscriptionButton as i, RotateWebhookSecretButton as a, WebhookDeliveryLog as o, WebhookDeliveryStatusBadge as s, WebhookEventBadges as c, WebhookStatusActions as l, WebhookStatusBadge as u } from "../controls/WebhookSubscriptionControls.js";
4
+ import { useState as d } from "react";
5
+ import { ArrowLeft as f, ChevronDown as p, ChevronUp as m, Webhook as h } from "lucide-react";
6
+ import { gql as g } from "@apollo/client";
7
+ import { useQuery as _ } from "@apollo/client/react";
8
+ import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
9
+ import { Button as x, EmptyState as S } from "@burdenoff/fe-libs/ui";
10
+ //#region src/planmagnet/pages/IntegrationsWebhooksPagePage.tsx
11
+ var C = 20, w = g`
12
+ query WebhookSubscriptionsList($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
13
+ planmagnetWebhookSubscriptions(workspaceId: $workspaceId, pagination: $pagination) {
14
+ totalCount
15
+ pageInfo {
16
+ hasNextPage
17
+ endCursor
18
+ }
19
+ items {
20
+ id
21
+ url
22
+ events
23
+ status
24
+ consecutiveFailures
25
+ lastDeliveryAt
26
+ lastDeliveryStatus
27
+ createdAt
28
+ createdBy
29
+ updatedAt
30
+ updatedBy
31
+ disabledAt
32
+ }
33
+ }
34
+ }
35
+ `;
36
+ function T({ subscription: e }) {
37
+ let [t, r] = d(!1);
38
+ return /* @__PURE__ */ b("li", {
39
+ className: "space-y-3 rounded-md border p-4",
40
+ "data-testid": "webhook-subscription-row",
41
+ children: [
42
+ /* @__PURE__ */ b("div", {
43
+ className: "flex flex-wrap items-start justify-between gap-3",
44
+ children: [/* @__PURE__ */ b("div", {
45
+ className: "min-w-0 space-y-1.5",
46
+ children: [
47
+ /* @__PURE__ */ b("div", {
48
+ className: "flex flex-wrap items-center gap-2",
49
+ children: [/* @__PURE__ */ y(n, {
50
+ text: e.url,
51
+ max: 70,
52
+ className: "font-mono text-sm"
53
+ }), /* @__PURE__ */ y(u, { status: e.status })]
54
+ }),
55
+ /* @__PURE__ */ y(c, { events: e.events }),
56
+ /* @__PURE__ */ b("p", {
57
+ className: "text-xs text-muted-foreground",
58
+ children: [e.lastDeliveryAt ? /* @__PURE__ */ b(v, { children: [
59
+ "Last delivery ",
60
+ new Date(e.lastDeliveryAt).toLocaleString(),
61
+ e.lastDeliveryStatus && /* @__PURE__ */ b(v, { children: [" ", /* @__PURE__ */ y(s, { status: e.lastDeliveryStatus })] })
62
+ ] }) : "No deliveries yet", e.consecutiveFailures > 0 && /* @__PURE__ */ b("span", {
63
+ className: "ml-2 font-medium text-status-error-text",
64
+ "data-testid": "webhook-consecutive-failures",
65
+ children: [
66
+ e.consecutiveFailures,
67
+ " consecutive failure",
68
+ e.consecutiveFailures === 1 ? "" : "s"
69
+ ]
70
+ })]
71
+ })
72
+ ]
73
+ }), /* @__PURE__ */ b("div", {
74
+ className: "flex shrink-0 flex-wrap items-center gap-2",
75
+ children: [
76
+ /* @__PURE__ */ y(l, { subscription: e }),
77
+ /* @__PURE__ */ y(a, { subscriptionId: e.id }),
78
+ /* @__PURE__ */ y(i, { subscriptionId: e.id })
79
+ ]
80
+ })]
81
+ }),
82
+ /* @__PURE__ */ y(x, {
83
+ size: "sm",
84
+ variant: "ghost",
85
+ className: "h-7 text-xs",
86
+ "aria-expanded": t,
87
+ onClick: () => r((e) => !e),
88
+ "data-testid": "webhook-toggle-deliveries",
89
+ children: t ? /* @__PURE__ */ b(v, { children: ["Hide delivery log ", /* @__PURE__ */ y(m, { className: "ml-1 h-3.5 w-3.5" })] }) : /* @__PURE__ */ b(v, { children: ["View delivery log ", /* @__PURE__ */ y(p, { className: "ml-1 h-3.5 w-3.5" })] })
90
+ }),
91
+ t && /* @__PURE__ */ y(o, { subscriptionId: e.id })
92
+ ]
93
+ });
94
+ }
95
+ function E() {
96
+ let { workspaceId: n } = e(), i = t(), [a, o] = d(!1), { data: s, loading: c, error: l, fetchMore: u } = _(w, {
97
+ variables: {
98
+ workspaceId: n ?? "",
99
+ pagination: { first: C }
100
+ },
101
+ skip: !n,
102
+ fetchPolicy: "cache-and-network"
103
+ }), p = s?.planmagnetWebhookSubscriptions, m = p?.items ?? [], g = async () => {
104
+ let e = p?.pageInfo.endCursor;
105
+ if (e) {
106
+ o(!0);
107
+ try {
108
+ await u({
109
+ variables: { pagination: {
110
+ first: C,
111
+ after: e
112
+ } },
113
+ updateQuery: (e, { fetchMoreResult: t }) => ({ planmagnetWebhookSubscriptions: {
114
+ ...t.planmagnetWebhookSubscriptions,
115
+ items: [...e.planmagnetWebhookSubscriptions.items, ...t.planmagnetWebhookSubscriptions.items]
116
+ } })
117
+ });
118
+ } finally {
119
+ o(!1);
120
+ }
121
+ }
122
+ };
123
+ return /* @__PURE__ */ b("div", {
124
+ className: "space-y-6 p-6",
125
+ "data-testid": "webhook-subscriptions-list",
126
+ children: [
127
+ /* @__PURE__ */ b(x, {
128
+ size: "sm",
129
+ variant: "ghost",
130
+ onClick: () => i("/integrations/syncs-page"),
131
+ children: [/* @__PURE__ */ y(f, { className: "mr-1 h-4 w-4" }), "Integrations"]
132
+ }),
133
+ /* @__PURE__ */ b("div", {
134
+ className: "flex flex-wrap items-center justify-between gap-3",
135
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("h1", {
136
+ className: "text-2xl font-semibold flex items-center gap-2",
137
+ children: [/* @__PURE__ */ y(h, { className: "h-5 w-5 text-primary" }), "Webhook subscriptions"]
138
+ }), /* @__PURE__ */ y("p", {
139
+ className: "text-sm text-muted-foreground",
140
+ children: p ? `${p.totalCount} subscription${p.totalCount === 1 ? "" : "s"}` : "Get a signed POST when things happen in this workspace"
141
+ })] }), /* @__PURE__ */ y(r, {})]
142
+ }),
143
+ l && /* @__PURE__ */ b("p", {
144
+ role: "alert",
145
+ className: "text-sm text-destructive",
146
+ children: ["Webhook subscriptions could not be loaded: ", l.message]
147
+ }),
148
+ c && !s && /* @__PURE__ */ y("p", {
149
+ className: "text-sm text-muted-foreground",
150
+ children: "Loading webhook subscriptions…"
151
+ }),
152
+ p && m.length === 0 && /* @__PURE__ */ y(S, {
153
+ icon: /* @__PURE__ */ y(h, { className: "h-8 w-8 text-muted-foreground" }),
154
+ title: "No webhook subscriptions yet",
155
+ description: "Subscribe a URL to get a signed POST whenever an event you choose happens in this workspace — a work item changes, a sprint starts, a release ships, and more."
156
+ }),
157
+ /* @__PURE__ */ y("ul", {
158
+ className: "space-y-3",
159
+ children: m.map((e) => /* @__PURE__ */ y(T, { subscription: e }, e.id))
160
+ }),
161
+ p?.pageInfo.hasNextPage && /* @__PURE__ */ y(x, {
162
+ size: "sm",
163
+ variant: "outline",
164
+ onClick: () => void g(),
165
+ disabled: a,
166
+ "data-testid": "webhook-list-more",
167
+ children: a ? "Loading…" : `Show more (${m.length} of ${p.totalCount})`
168
+ })
169
+ ]
170
+ });
171
+ }
172
+ //#endregion
173
+ export { E as IntegrationsWebhooksPagePage };
174
+
175
+ //# sourceMappingURL=IntegrationsWebhooksPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntegrationsWebhooksPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/IntegrationsWebhooksPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Button, EmptyState } from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, ChevronDown, ChevronUp, Webhook } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { TruncatedText } from '../controls/SyncControls';\nimport {\n CreateWebhookSubscriptionDialog,\n DeleteWebhookSubscriptionButton,\n RotateWebhookSecretButton,\n WebhookDeliveryLog,\n WebhookDeliveryStatusBadge,\n WebhookEventBadges,\n WebhookStatusActions,\n WebhookStatusBadge,\n} from '../controls/WebhookSubscriptionControls';\nimport type { WebhookSubscriptionRow } from '../webhooks/webhookTypes';\n\n/**\n * Outbound webhook subscriptions (AUT-33): list, create (secret shown once), rotate (secret shown once), pause /\n * resume / disable / re-enable, delete, and a per-subscription delivery log. Reachable from the Integrations\n * syncs page rather than the host sidebar — see PlanMagnetRoutes.tsx's comment on this route.\n */\n\nconst PAGE = 20;\n\nconst WEBHOOK_SUBSCRIPTIONS_LIST = gql`\n query WebhookSubscriptionsList($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetWebhookSubscriptions(workspaceId: $workspaceId, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n url\n events\n status\n consecutiveFailures\n lastDeliveryAt\n lastDeliveryStatus\n createdAt\n createdBy\n updatedAt\n updatedBy\n disabledAt\n }\n }\n }\n`;\n\nfunction SubscriptionRow({ subscription }: { subscription: WebhookSubscriptionRow }) {\n const [showDeliveries, setShowDeliveries] = useState(false);\n return (\n <li className=\"space-y-3 rounded-md border p-4\" data-testid=\"webhook-subscription-row\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1.5\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <TruncatedText text={subscription.url} max={70} className=\"font-mono text-sm\" />\n <WebhookStatusBadge status={subscription.status} />\n </div>\n <WebhookEventBadges events={subscription.events} />\n <p className=\"text-xs text-muted-foreground\">\n {subscription.lastDeliveryAt ? (\n <>\n Last delivery {new Date(subscription.lastDeliveryAt).toLocaleString()}\n {subscription.lastDeliveryStatus && (\n <>\n {' '}\n <WebhookDeliveryStatusBadge status={subscription.lastDeliveryStatus} />\n </>\n )}\n </>\n ) : (\n 'No deliveries yet'\n )}\n {subscription.consecutiveFailures > 0 && (\n <span\n className=\"ml-2 font-medium text-status-error-text\"\n data-testid=\"webhook-consecutive-failures\"\n >\n {subscription.consecutiveFailures} consecutive failure\n {subscription.consecutiveFailures === 1 ? '' : 's'}\n </span>\n )}\n </p>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n <WebhookStatusActions subscription={subscription} />\n <RotateWebhookSecretButton subscriptionId={subscription.id} />\n <DeleteWebhookSubscriptionButton subscriptionId={subscription.id} />\n </div>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n aria-expanded={showDeliveries}\n onClick={() => setShowDeliveries((v) => !v)}\n data-testid=\"webhook-toggle-deliveries\"\n >\n {showDeliveries ? (\n <>\n Hide delivery log <ChevronUp className=\"ml-1 h-3.5 w-3.5\" />\n </>\n ) : (\n <>\n View delivery log <ChevronDown className=\"ml-1 h-3.5 w-3.5\" />\n </>\n )}\n </Button>\n {showDeliveries && <WebhookDeliveryLog subscriptionId={subscription.id} />}\n </li>\n );\n}\n\nexport function IntegrationsWebhooksPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const [loadingMore, setLoadingMore] = useState(false);\n\n const { data, loading, error, fetchMore } = useQuery<{\n planmagnetWebhookSubscriptions: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: WebhookSubscriptionRow[];\n };\n }>(WEBHOOK_SUBSCRIPTIONS_LIST, {\n variables: { workspaceId: workspaceId ?? '', pagination: { first: PAGE } },\n skip: !workspaceId,\n fetchPolicy: 'cache-and-network',\n });\n\n const list = data?.planmagnetWebhookSubscriptions;\n const subscriptions = list?.items ?? [];\n\n const loadMore = async () => {\n const after = list?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n planmagnetWebhookSubscriptions: {\n ...fetchMoreResult.planmagnetWebhookSubscriptions,\n items: [\n ...prev.planmagnetWebhookSubscriptions.items,\n ...fetchMoreResult.planmagnetWebhookSubscriptions.items,\n ],\n },\n }),\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\" data-testid=\"webhook-subscriptions-list\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/integrations/syncs-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n Integrations\n </Button>\n\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <Webhook className=\"h-5 w-5 text-primary\" />\n Webhook subscriptions\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {list\n ? `${list.totalCount} subscription${list.totalCount === 1 ? '' : 's'}`\n : 'Get a signed POST when things happen in this workspace'}\n </p>\n </div>\n <CreateWebhookSubscriptionDialog />\n </div>\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n Webhook subscriptions could not be loaded: {error.message}\n </p>\n )}\n {/* Only before the first load: a refetch after an action must not blank the page. */}\n {loading && !data && (\n <p className=\"text-sm text-muted-foreground\">Loading webhook subscriptions…</p>\n )}\n {list && subscriptions.length === 0 && (\n <EmptyState\n icon={<Webhook className=\"h-8 w-8 text-muted-foreground\" />}\n title=\"No webhook subscriptions yet\"\n description=\"Subscribe a URL to get a signed POST whenever an event you choose happens in this workspace — a work item changes, a sprint starts, a release ships, and more.\"\n />\n )}\n\n <ul className=\"space-y-3\">\n {subscriptions.map((subscription) => (\n <SubscriptionRow key={subscription.id} subscription={subscription} />\n ))}\n </ul>\n\n {list?.pageInfo.hasNextPage && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void loadMore()}\n disabled={loadingMore}\n data-testid=\"webhook-list-more\"\n >\n {loadingMore ? 'Loading…' : `Show more (${subscriptions.length} of ${list.totalCount})`}\n </Button>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PortfoliosPortfolioDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/PortfoliosPortfolioDetailPagePage.tsx"],"names":[],"mappings":"AA6EA,wBAAgB,iCAAiC,4CAmRhD"}
1
+ {"version":3,"file":"PortfoliosPortfolioDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/PortfoliosPortfolioDetailPagePage.tsx"],"names":[],"mappings":"AAkIA,wBAAgB,iCAAiC,4CAsXhD"}