@burdenoff/microfe-store 2026.703.1 → 2026.704.1
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/components/InstallAppModal.js +305 -140
- package/dist/components/InstallAppModal.js.map +1 -1
- package/dist/generated/global-operations.js +7 -0
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.js.map +1 -1
- package/dist/hooks/useInstallations.js.map +1 -1
- package/dist/hooks/useStoreGraphQL.js +42 -34
- package/dist/hooks/useStoreGraphQL.js.map +1 -1
- package/dist/hooks/useStoreGraphQLWithContext.js +10 -7
- package/dist/hooks/useStoreGraphQLWithContext.js.map +1 -1
- package/dist/pages/AdminDashboardPage.js +451 -378
- package/dist/pages/AdminDashboardPage.js.map +1 -1
- package/dist/pages/AdminReviewModerationPage.js +182 -150
- package/dist/pages/AdminReviewModerationPage.js.map +1 -1
- package/dist/pages/AdminStoresPage.js.map +1 -1
- package/dist/pages/AdminSubmissionsQueuePage.js +642 -305
- package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
- package/dist/pages/AppDetailPage.js +200 -153
- package/dist/pages/AppDetailPage.js.map +1 -1
- package/dist/pages/AppSettingsPage.js.map +1 -1
- package/dist/pages/CartPage.js.map +1 -1
- package/dist/pages/InstalledAppsPage.js +335 -154
- package/dist/pages/InstalledAppsPage.js.map +1 -1
- package/dist/pages/MyLicensesPage.js.map +1 -1
- package/dist/pages/OrdersPage.js +5 -5
- package/dist/pages/ProductDetailPage.js +505 -451
- package/dist/pages/ProductDetailPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,197 +1,244 @@
|
|
|
1
1
|
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
2
|
import { useInstallation as t } from "../hooks/useInstallations.js";
|
|
3
3
|
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
-
import { ArrowLeft as r,
|
|
5
|
-
import { Fragment as
|
|
6
|
-
import { useNavigate as
|
|
7
|
-
import { EmphasisPanel as
|
|
4
|
+
import { ArrowLeft as r, ExternalLink as i, Info as a, Settings as o } from "lucide-react";
|
|
5
|
+
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { useNavigate as u, useParams as d } from "react-router-dom";
|
|
7
|
+
import { EmphasisPanel as f, IllustratedEmptyState as p, NextSteps as m, PagePurpose as h, ShowMore as g } from "@burdenoff/fe-libs/ui";
|
|
8
8
|
//#region src/pages/AppDetailPage.tsx
|
|
9
|
-
var
|
|
10
|
-
let
|
|
11
|
-
return /* @__PURE__ */
|
|
9
|
+
var _ = () => {
|
|
10
|
+
let _ = u(), { basePath: v } = e(), { installationId: y } = d(), { installation: b, loading: x, error: S } = t(y), { t: C } = n();
|
|
11
|
+
return /* @__PURE__ */ l("div", {
|
|
12
12
|
className: "flex h-full flex-col",
|
|
13
|
-
children: [/* @__PURE__ */
|
|
13
|
+
children: [/* @__PURE__ */ c("header", {
|
|
14
14
|
className: "border-b border-border-seam bg-bg-surface px-6 py-4",
|
|
15
|
-
children: /* @__PURE__ */
|
|
15
|
+
children: /* @__PURE__ */ l("div", {
|
|
16
16
|
className: "mx-auto flex max-w-4xl items-center gap-3",
|
|
17
|
-
children: [/* @__PURE__ */
|
|
17
|
+
children: [/* @__PURE__ */ c("button", {
|
|
18
18
|
type: "button",
|
|
19
|
-
onClick: () =>
|
|
19
|
+
onClick: () => _(-1),
|
|
20
20
|
"aria-label": "Go back",
|
|
21
21
|
className: "cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary",
|
|
22
|
-
children: /* @__PURE__ */
|
|
23
|
-
}), /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ c(r, { className: "size-5" })
|
|
23
|
+
}), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
|
|
24
24
|
className: "text-2xl font-bold text-text-primary",
|
|
25
|
-
children:
|
|
26
|
-
}), /* @__PURE__ */
|
|
25
|
+
children: C("pages.appDetail.title", { defaultValue: "Installed App Details" })
|
|
26
|
+
}), /* @__PURE__ */ c("p", {
|
|
27
27
|
className: "text-sm text-text-muted",
|
|
28
|
-
children:
|
|
28
|
+
children: C("pages.appDetail.subtitle", { defaultValue: "Inspect installation status and metadata" })
|
|
29
29
|
})] })]
|
|
30
30
|
})
|
|
31
|
-
}), /* @__PURE__ */
|
|
31
|
+
}), /* @__PURE__ */ c("main", {
|
|
32
32
|
className: "flex-1 overflow-y-auto p-6",
|
|
33
|
-
children: /* @__PURE__ */
|
|
33
|
+
children: /* @__PURE__ */ l("div", {
|
|
34
34
|
className: "mx-auto max-w-4xl",
|
|
35
|
-
children: [/* @__PURE__ */
|
|
35
|
+
children: [/* @__PURE__ */ c(h, {
|
|
36
36
|
className: "mb-4",
|
|
37
37
|
children: "The full record of one app installed into a workspace — its status, version, who installed it and when, plus its runtime metadata. Come here to confirm an app is healthy, dig into a failed install, or jump to its configuration before troubleshooting."
|
|
38
|
-
}),
|
|
38
|
+
}), x ? /* @__PURE__ */ c("p", {
|
|
39
39
|
role: "status",
|
|
40
40
|
className: "text-sm text-text-muted",
|
|
41
41
|
children: "Loading installation…"
|
|
42
|
-
}) :
|
|
42
|
+
}) : S ? /* @__PURE__ */ c("p", {
|
|
43
43
|
role: "alert",
|
|
44
44
|
className: "text-sm text-status-error-text",
|
|
45
|
-
children:
|
|
46
|
-
}) :
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
{
|
|
51
|
-
|
|
52
|
-
label: "Manage configuration",
|
|
53
|
-
description: "Adjust this installation's settings for the workspace.",
|
|
54
|
-
icon: /* @__PURE__ */ o(i, { className: "size-4" }),
|
|
55
|
-
onClick: () => h(`${g}/installed/${v.id}/settings`)
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "view-product",
|
|
59
|
-
label: "Open the product page",
|
|
60
|
-
description: "See the latest version, changelog and reviews.",
|
|
61
|
-
onClick: () => h(`${g}/marketplace/product/${v.productId}`)
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
id: "back",
|
|
65
|
-
label: "Back to installed apps",
|
|
66
|
-
description: "Return to the full list of apps in your workspaces.",
|
|
67
|
-
onClick: () => h(`${g}/installed`)
|
|
68
|
-
}
|
|
69
|
-
]
|
|
70
|
-
}), /* @__PURE__ */ s(u, { children: [
|
|
71
|
-
/* @__PURE__ */ s("div", {
|
|
72
|
-
className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
73
|
-
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h2", {
|
|
74
|
-
className: "text-lg font-semibold text-text-primary",
|
|
75
|
-
children: v.workspaceName ?? v.workspaceId
|
|
76
|
-
}), /* @__PURE__ */ s("p", {
|
|
77
|
-
className: "mt-1 text-sm text-text-muted",
|
|
78
|
-
children: ["Product ", v.productId]
|
|
79
|
-
})] }), /* @__PURE__ */ o("span", {
|
|
80
|
-
className: "inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary",
|
|
81
|
-
children: v.status
|
|
82
|
-
})]
|
|
83
|
-
}),
|
|
84
|
-
/* @__PURE__ */ s("div", {
|
|
85
|
-
className: "mt-4 grid gap-4 md:grid-cols-2",
|
|
86
|
-
children: [/* @__PURE__ */ s("div", {
|
|
87
|
-
className: "rounded-lg bg-bg-sunken p-4 text-sm text-text-muted",
|
|
45
|
+
children: S.message
|
|
46
|
+
}) : b ? /* @__PURE__ */ c(s, { children: (() => {
|
|
47
|
+
let e = b.manifest, t = e?.type, n = t === "INTEGRATION" || t === "API_INTEGRATION", u = e?.installationId, d = e?.name ?? (e?.slug)?.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") ?? b.productId;
|
|
48
|
+
return /* @__PURE__ */ l(s, { children: [n ? /* @__PURE__ */ l("div", {
|
|
49
|
+
className: "mb-4 flex items-start gap-3 rounded-xl border border-border-default bg-bg-surface p-4",
|
|
50
|
+
children: [/* @__PURE__ */ c(a, { className: "mt-0.5 size-5 shrink-0 text-text-muted" }), /* @__PURE__ */ l("div", {
|
|
51
|
+
className: "text-sm",
|
|
88
52
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
children: "Version:"
|
|
93
|
-
}),
|
|
94
|
-
" ",
|
|
95
|
-
v.version ?? "Not provided"
|
|
96
|
-
] }),
|
|
97
|
-
/* @__PURE__ */ s("p", {
|
|
98
|
-
className: "mt-2",
|
|
99
|
-
children: [
|
|
100
|
-
/* @__PURE__ */ o("span", {
|
|
101
|
-
className: "font-medium text-text-primary",
|
|
102
|
-
children: "Installed at:"
|
|
103
|
-
}),
|
|
104
|
-
" ",
|
|
105
|
-
new Date(v.installedAt).toLocaleString()
|
|
106
|
-
]
|
|
53
|
+
/* @__PURE__ */ c("p", {
|
|
54
|
+
className: "font-medium text-text-primary",
|
|
55
|
+
children: "Configuration is managed on the third-party's side"
|
|
107
56
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
className: "mt-
|
|
57
|
+
/* @__PURE__ */ l("p", {
|
|
58
|
+
className: "mt-1 text-text-muted",
|
|
110
59
|
children: [
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
|
|
113
|
-
children: "Updated at:"
|
|
114
|
-
}),
|
|
60
|
+
/* @__PURE__ */ c("strong", { children: d }),
|
|
61
|
+
" is an external integration connected via OAuth. All settings (webhooks, scopes, data mapping) are configured in the third-party's dashboard — not here. To revoke access, use",
|
|
115
62
|
" ",
|
|
116
|
-
|
|
63
|
+
/* @__PURE__ */ c("strong", { children: "Uninstall" }),
|
|
64
|
+
"."
|
|
117
65
|
]
|
|
118
66
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
120
|
-
className: "mt-2",
|
|
67
|
+
u && /* @__PURE__ */ l("p", {
|
|
68
|
+
className: "mt-2 rounded-lg bg-bg-sunken px-3 py-2 font-mono text-xs text-text-muted",
|
|
121
69
|
children: [
|
|
122
|
-
|
|
123
|
-
className: "font-medium text-text-primary",
|
|
124
|
-
children: "Workspace ID:"
|
|
125
|
-
}),
|
|
70
|
+
"Installation ID:",
|
|
126
71
|
" ",
|
|
127
|
-
|
|
72
|
+
/* @__PURE__ */ c("span", {
|
|
73
|
+
className: "select-all text-text-primary",
|
|
74
|
+
children: u
|
|
75
|
+
})
|
|
128
76
|
]
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
})]
|
|
80
|
+
}) : /* @__PURE__ */ c(m, {
|
|
81
|
+
className: "mb-4",
|
|
82
|
+
storageKey: "store-app-detail",
|
|
83
|
+
steps: [
|
|
84
|
+
{
|
|
85
|
+
id: "configure",
|
|
86
|
+
label: "Manage configuration",
|
|
87
|
+
description: "Adjust this installation's settings for the workspace.",
|
|
88
|
+
icon: /* @__PURE__ */ c(o, { className: "size-4" }),
|
|
89
|
+
onClick: () => _(`${v}/installed/${b.id}/settings`)
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: "view-product",
|
|
93
|
+
label: "Open the product page",
|
|
94
|
+
description: "See the latest version, changelog and reviews.",
|
|
95
|
+
onClick: () => _(`${v}/marketplace/product/${b.productId}`)
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "back",
|
|
99
|
+
label: "Back to installed apps",
|
|
100
|
+
description: "Return to the full list of apps in your workspaces.",
|
|
101
|
+
onClick: () => _(`${v}/installed`)
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}), /* @__PURE__ */ l(f, { children: [
|
|
105
|
+
/* @__PURE__ */ l("div", {
|
|
106
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
|
|
107
|
+
children: [/* @__PURE__ */ l("div", { children: [
|
|
108
|
+
/* @__PURE__ */ c("h2", {
|
|
109
|
+
className: "text-lg font-semibold text-text-primary",
|
|
110
|
+
children: d
|
|
129
111
|
}),
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
className: "mt-
|
|
132
|
-
children: [
|
|
133
|
-
/* @__PURE__ */ o("span", {
|
|
134
|
-
className: "font-medium text-text-primary",
|
|
135
|
-
children: "Organization ID:"
|
|
136
|
-
}),
|
|
137
|
-
" ",
|
|
138
|
-
v.organizationId ?? "N/A"
|
|
139
|
-
]
|
|
112
|
+
/* @__PURE__ */ l("p", {
|
|
113
|
+
className: "mt-1 text-sm text-text-muted",
|
|
114
|
+
children: ["Workspace: ", b.workspaceName ?? b.workspaceId]
|
|
140
115
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
142
|
-
className: "mt-2",
|
|
143
|
-
children:
|
|
144
|
-
|
|
116
|
+
t && /* @__PURE__ */ c("span", {
|
|
117
|
+
className: "mt-1 inline-block rounded bg-bg-sunken px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-text-muted",
|
|
118
|
+
children: t
|
|
119
|
+
})
|
|
120
|
+
] }), /* @__PURE__ */ c("span", {
|
|
121
|
+
className: "inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary",
|
|
122
|
+
children: b.status
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ l("div", {
|
|
126
|
+
className: "mt-4 grid gap-4 md:grid-cols-2",
|
|
127
|
+
children: [/* @__PURE__ */ l("div", {
|
|
128
|
+
className: "rounded-lg bg-bg-sunken p-4 text-sm text-text-muted",
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ l("p", { children: [
|
|
131
|
+
/* @__PURE__ */ c("span", {
|
|
145
132
|
className: "font-medium text-text-primary",
|
|
146
|
-
children: "
|
|
133
|
+
children: "Version:"
|
|
147
134
|
}),
|
|
148
135
|
" ",
|
|
149
|
-
|
|
150
|
-
]
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
136
|
+
b.version ?? "Not provided"
|
|
137
|
+
] }),
|
|
138
|
+
/* @__PURE__ */ l("p", {
|
|
139
|
+
className: "mt-2",
|
|
140
|
+
children: [
|
|
141
|
+
/* @__PURE__ */ c("span", {
|
|
142
|
+
className: "font-medium text-text-primary",
|
|
143
|
+
children: "Installed at:"
|
|
144
|
+
}),
|
|
145
|
+
" ",
|
|
146
|
+
new Date(b.installedAt).toLocaleString()
|
|
147
|
+
]
|
|
148
|
+
}),
|
|
149
|
+
/* @__PURE__ */ l("p", {
|
|
150
|
+
className: "mt-2",
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ c("span", {
|
|
153
|
+
className: "font-medium text-text-primary",
|
|
154
|
+
children: "Updated at:"
|
|
155
|
+
}),
|
|
156
|
+
" ",
|
|
157
|
+
new Date(b.updatedAt).toLocaleString()
|
|
158
|
+
]
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ l("p", {
|
|
161
|
+
className: "mt-2",
|
|
162
|
+
children: [
|
|
163
|
+
/* @__PURE__ */ c("span", {
|
|
164
|
+
className: "font-medium text-text-primary",
|
|
165
|
+
children: "Workspace ID:"
|
|
166
|
+
}),
|
|
167
|
+
" ",
|
|
168
|
+
b.workspaceId
|
|
169
|
+
]
|
|
170
|
+
}),
|
|
171
|
+
/* @__PURE__ */ l("p", {
|
|
172
|
+
className: "mt-2",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ c("span", {
|
|
175
|
+
className: "font-medium text-text-primary",
|
|
176
|
+
children: "Organization ID:"
|
|
177
|
+
}),
|
|
178
|
+
" ",
|
|
179
|
+
b.organizationId ?? "N/A"
|
|
180
|
+
]
|
|
181
|
+
}),
|
|
182
|
+
/* @__PURE__ */ l("p", {
|
|
183
|
+
className: "mt-2",
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ c("span", {
|
|
186
|
+
className: "font-medium text-text-primary",
|
|
187
|
+
children: "Installed by:"
|
|
188
|
+
}),
|
|
189
|
+
" ",
|
|
190
|
+
b.installedById
|
|
191
|
+
]
|
|
192
|
+
})
|
|
193
|
+
]
|
|
194
|
+
}), /* @__PURE__ */ l("div", {
|
|
195
|
+
className: "rounded-lg bg-bg-sunken p-4 text-sm text-text-muted",
|
|
196
|
+
children: [/* @__PURE__ */ c("p", {
|
|
197
|
+
className: "font-medium text-text-primary",
|
|
198
|
+
children: "Runtime metadata"
|
|
199
|
+
}), /* @__PURE__ */ c(g, {
|
|
200
|
+
collapsedHeight: 120,
|
|
201
|
+
label: "metadata",
|
|
202
|
+
className: "mt-3",
|
|
203
|
+
children: /* @__PURE__ */ c("pre", {
|
|
204
|
+
className: "overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted",
|
|
205
|
+
children: JSON.stringify({
|
|
206
|
+
metadata: b.metadata,
|
|
207
|
+
context: b.context,
|
|
208
|
+
uninstalledAt: b.uninstalledAt,
|
|
209
|
+
uninstalledById: b.uninstalledById
|
|
210
|
+
}, null, 2)
|
|
211
|
+
})
|
|
212
|
+
})]
|
|
171
213
|
})]
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
214
|
+
}),
|
|
215
|
+
/* @__PURE__ */ l("div", {
|
|
216
|
+
className: "mt-4 flex flex-wrap gap-3",
|
|
217
|
+
children: [n ? /* @__PURE__ */ l("button", {
|
|
218
|
+
type: "button",
|
|
219
|
+
onClick: () => _(`${v}/installed`),
|
|
220
|
+
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
221
|
+
children: [/* @__PURE__ */ c(r, { className: "size-4" }), "Back to Installed Apps"]
|
|
222
|
+
}) : /* @__PURE__ */ l("button", {
|
|
223
|
+
type: "button",
|
|
224
|
+
onClick: () => _(`${v}/installed/${b.id}/settings`),
|
|
225
|
+
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
|
|
226
|
+
children: [/* @__PURE__ */ c(o, { className: "size-4" }), C("pages.appDetail.manageConfig", { defaultValue: "Manage Configuration" })]
|
|
227
|
+
}), /* @__PURE__ */ l("button", {
|
|
228
|
+
type: "button",
|
|
229
|
+
onClick: () => _(`${v}/marketplace/product/${b.productId}`),
|
|
230
|
+
className: "inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
231
|
+
children: [/* @__PURE__ */ c(i, { className: "size-4" }), C("pages.appDetail.viewProduct", { defaultValue: "View Product" })]
|
|
232
|
+
})]
|
|
233
|
+
})
|
|
234
|
+
] })] });
|
|
235
|
+
})() }) : /* @__PURE__ */ c(p, {
|
|
189
236
|
illustration: "empty-generic",
|
|
190
237
|
title: "Installation not found",
|
|
191
238
|
description: "This installation may have been uninstalled or never existed. Head back to your installed apps to find another.",
|
|
192
|
-
action: /* @__PURE__ */
|
|
239
|
+
action: /* @__PURE__ */ c("button", {
|
|
193
240
|
type: "button",
|
|
194
|
-
onClick: () =>
|
|
241
|
+
onClick: () => _(`${v}/installed`),
|
|
195
242
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90",
|
|
196
243
|
children: "Back to installed apps"
|
|
197
244
|
})
|
|
@@ -201,6 +248,6 @@ var h = () => {
|
|
|
201
248
|
});
|
|
202
249
|
};
|
|
203
250
|
//#endregion
|
|
204
|
-
export {
|
|
251
|
+
export { _ as AppDetailPage };
|
|
205
252
|
|
|
206
253
|
//# sourceMappingURL=AppDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppDetailPage.js","names":[],"sources":["../../src/pages/AppDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Settings } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n EmphasisPanel,\n ShowMore,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const AppDetailPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { installationId } = useParams<{ installationId: string }>();\n const { installation, loading, error } = useInstallation(installationId);\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.appDetail.title', { defaultValue: 'Installed App Details' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appDetail.subtitle', {\n defaultValue: 'Inspect installation status and metadata',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n <PagePurpose className=\"mb-4\">\n The full record of one app installed into a workspace — its status, version, who\n installed it and when, plus its runtime metadata. Come here to confirm an app is healthy,\n dig into a failed install, or jump to its configuration before troubleshooting.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading installation…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : !installation ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"Installation not found\"\n description=\"This installation may have been uninstalled or never existed. Head back to your installed apps to find another.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Back to installed apps\n </button>\n }\n />\n ) : (\n <>\n <NextSteps\n className=\"mb-4\"\n storageKey=\"store-app-detail\"\n steps={[\n {\n id: 'configure',\n label: 'Manage configuration',\n description: \"Adjust this installation's settings for the workspace.\",\n icon: <Settings className=\"size-4\" />,\n onClick: () =>\n navigate(`${basePath}/installed/${installation.id}/settings`),\n },\n {\n id: 'view-product',\n label: 'Open the product page',\n description: 'See the latest version, changelog and reviews.',\n onClick: () =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`),\n },\n {\n id: 'back',\n label: 'Back to installed apps',\n description: 'Return to the full list of apps in your workspaces.',\n onClick: () => navigate(`${basePath}/installed`),\n },\n ]}\n />\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {installation.workspaceName ?? installation.workspaceId}\n </h2>\n <p className=\"mt-1 text-sm text-text-muted\">Product {installation.productId}</p>\n </div>\n <span className=\"inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary\">\n {installation.status}\n </span>\n </div>\n\n <div className=\"mt-4 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p>\n <span className=\"font-medium text-text-primary\">Version:</span>{' '}\n {installation.version ?? 'Not provided'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed at:</span>{' '}\n {new Date(installation.installedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Updated at:</span>{' '}\n {new Date(installation.updatedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Workspace ID:</span>{' '}\n {installation.workspaceId}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Organization ID:</span>{' '}\n {installation.organizationId ?? 'N/A'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed by:</span>{' '}\n {installation.installedById}\n </p>\n </div>\n\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p className=\"font-medium text-text-primary\">Runtime metadata</p>\n <ShowMore collapsedHeight={120} label=\"metadata\" className=\"mt-3\">\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata,\n context: installation.context,\n uninstalledAt: installation.uninstalledAt,\n uninstalledById: installation.uninstalledById,\n },\n null,\n 2\n )}\n </pre>\n </ShowMore>\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed/${installation.id}/settings`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <Settings className=\"size-4\" />\n {t('pages.appDetail.manageConfig', { defaultValue: 'Manage Configuration' })}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppDetailPage.js","names":[],"sources":["../../src/pages/AppDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Settings, ExternalLink, Info } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n EmphasisPanel,\n ShowMore,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\n\nexport const AppDetailPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { installationId } = useParams<{ installationId: string }>();\n const { installation, loading, error } = useInstallation(installationId);\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.appDetail.title', { defaultValue: 'Installed App Details' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appDetail.subtitle', {\n defaultValue: 'Inspect installation status and metadata',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n <PagePurpose className=\"mb-4\">\n The full record of one app installed into a workspace — its status, version, who\n installed it and when, plus its runtime metadata. Come here to confirm an app is\n healthy, dig into a failed install, or jump to its configuration before troubleshooting.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading installation…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : !installation ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"Installation not found\"\n description=\"This installation may have been uninstalled or never existed. Head back to your installed apps to find another.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Back to installed apps\n </button>\n }\n />\n ) : (\n <>\n {(() => {\n const manifest = installation.manifest as Record<string, unknown> | null;\n const appType = manifest?.type as string | undefined;\n const isIntegration = appType === 'INTEGRATION' || appType === 'API_INTEGRATION';\n const installationId = manifest?.installationId as string | undefined;\n const appName =\n (manifest?.name as string | undefined) ??\n (manifest?.slug as string | undefined)\n ?.split('-')\n .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ') ??\n installation.productId;\n\n return (\n <>\n {isIntegration ? (\n <div className=\"mb-4 flex items-start gap-3 rounded-xl border border-border-default bg-bg-surface p-4\">\n <Info className=\"mt-0.5 size-5 shrink-0 text-text-muted\" />\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n Configuration is managed on the third-party's side\n </p>\n <p className=\"mt-1 text-text-muted\">\n <strong>{appName}</strong> is an external integration connected via\n OAuth. All settings (webhooks, scopes, data mapping) are configured in\n the third-party's dashboard — not here. To revoke access, use{' '}\n <strong>Uninstall</strong>.\n </p>\n {installationId && (\n <p className=\"mt-2 rounded-lg bg-bg-sunken px-3 py-2 font-mono text-xs text-text-muted\">\n Installation ID:{' '}\n <span className=\"select-all text-text-primary\">{installationId}</span>\n </p>\n )}\n </div>\n </div>\n ) : (\n <NextSteps\n className=\"mb-4\"\n storageKey=\"store-app-detail\"\n steps={[\n {\n id: 'configure',\n label: 'Manage configuration',\n description: \"Adjust this installation's settings for the workspace.\",\n icon: <Settings className=\"size-4\" />,\n onClick: () =>\n navigate(`${basePath}/installed/${installation.id}/settings`),\n },\n {\n id: 'view-product',\n label: 'Open the product page',\n description: 'See the latest version, changelog and reviews.',\n onClick: () =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`),\n },\n {\n id: 'back',\n label: 'Back to installed apps',\n description: 'Return to the full list of apps in your workspaces.',\n onClick: () => navigate(`${basePath}/installed`),\n },\n ]}\n />\n )}\n\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">{appName}</h2>\n <p className=\"mt-1 text-sm text-text-muted\">\n Workspace: {installation.workspaceName ?? installation.workspaceId}\n </p>\n {appType && (\n <span className=\"mt-1 inline-block rounded bg-bg-sunken px-2 py-0.5 text-xs font-medium uppercase tracking-wide text-text-muted\">\n {appType}\n </span>\n )}\n </div>\n <span className=\"inline-flex w-fit rounded-full bg-bg-sunken px-3 py-1 text-xs font-medium text-text-primary\">\n {installation.status}\n </span>\n </div>\n\n <div className=\"mt-4 grid gap-4 md:grid-cols-2\">\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p>\n <span className=\"font-medium text-text-primary\">Version:</span>{' '}\n {installation.version ?? 'Not provided'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed at:</span>{' '}\n {new Date(installation.installedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Updated at:</span>{' '}\n {new Date(installation.updatedAt).toLocaleString()}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Workspace ID:</span>{' '}\n {installation.workspaceId}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Organization ID:</span>{' '}\n {installation.organizationId ?? 'N/A'}\n </p>\n <p className=\"mt-2\">\n <span className=\"font-medium text-text-primary\">Installed by:</span>{' '}\n {installation.installedById}\n </p>\n </div>\n\n <div className=\"rounded-lg bg-bg-sunken p-4 text-sm text-text-muted\">\n <p className=\"font-medium text-text-primary\">Runtime metadata</p>\n <ShowMore collapsedHeight={120} label=\"metadata\" className=\"mt-3\">\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-surface p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata,\n context: installation.context,\n uninstalledAt: installation.uninstalledAt,\n uninstalledById: installation.uninstalledById,\n },\n null,\n 2\n )}\n </pre>\n </ShowMore>\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-wrap gap-3\">\n {isIntegration ? (\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"size-4\" />\n Back to Installed Apps\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/installed/${installation.id}/settings`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <Settings className=\"size-4\" />\n {t('pages.appDetail.manageConfig', {\n defaultValue: 'Manage Configuration',\n })}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n <ExternalLink className=\"size-4\" />\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n </>\n );\n })()}\n </>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSettingsPage.js","names":[],"sources":["../../src/pages/AppSettingsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Settings } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {
|
|
1
|
+
{"version":3,"file":"AppSettingsPage.js","names":[],"sources":["../../src/pages/AppSettingsPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { ArrowLeft, Settings } from 'lucide-react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useInstallation } from '../hooks/useInstallations';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, ShowMore, PagePurpose, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\n\nexport const AppSettingsPage: FC = () => {\n const navigate = useNavigate();\n const { basePath } = useStore();\n const { installationId } = useParams<{ installationId: string }>();\n const { installation, loading, error } = useInstallation(installationId);\n const { t } = useI18n();\n\n return (\n <div className=\"flex h-full flex-col\">\n <header className=\"border-b border-border-seam bg-bg-surface px-6 py-4\">\n <div className=\"mx-auto flex max-w-4xl items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(-1)}\n aria-label=\"Go back\"\n className=\"cursor-pointer rounded-lg p-2 text-text-muted hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"size-5\" />\n </button>\n <div>\n <h1 className=\"text-2xl font-bold text-text-primary\">\n {t('pages.appSettings.title', { defaultValue: 'App Settings' })}\n </h1>\n <p className=\"text-sm text-text-muted\">\n {t('pages.appSettings.subtitle', {\n defaultValue: 'Review current installation configuration',\n })}\n </p>\n </div>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n <PagePurpose className=\"mb-4\">\n A read-only snapshot of how this app is configured in the workspace — its manifest,\n runtime metadata and context. Use it to verify what an installation is actually running\n (handy when an app behaves unexpectedly) before changing anything inside the product\n itself.\n </PagePurpose>\n {loading ? (\n <p role=\"status\" className=\"text-sm text-text-muted\">\n Loading settings…\n </p>\n ) : error ? (\n <p role=\"alert\" className=\"text-sm text-status-error-text\">\n {error.message}\n </p>\n ) : !installation ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"Installation not found\"\n description=\"There's no configuration to show — this installation may have been removed. Return to your installed apps to pick another.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed`)}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:opacity-90\"\n >\n Back to installed apps\n </button>\n }\n />\n ) : (\n <EmphasisPanel className=\"space-y-4\">\n <div className=\"flex items-center gap-2\">\n <Settings className=\"size-5 text-text-primary\" />\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('pages.appSettings.configSnapshot', {\n defaultValue: 'Configuration snapshot',\n })}\n </h2>\n </div>\n\n <p className=\"text-sm text-text-muted\">\n {t('pages.appSettings.configDescription', {\n defaultValue:\n 'Store-level configuration for this installation is read-only here.',\n })}\n </p>\n\n <ShowMore collapsedHeight={140} label=\"configuration details\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <div>\n <p className=\"mb-2 text-sm font-medium text-text-primary\">Manifest</p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(installation.manifest ?? {}, null, 2)}\n </pre>\n </div>\n\n <div>\n <p className=\"mb-2 text-sm font-medium text-text-primary\">\n Metadata & Context\n </p>\n <pre className=\"overflow-x-auto whitespace-pre-wrap rounded-lg border border-border-seam bg-bg-sunken p-3 text-xs text-text-muted\">\n {JSON.stringify(\n {\n metadata: installation.metadata ?? {},\n context: installation.context ?? {},\n version: installation.version,\n status: installation.status,\n },\n null,\n 2\n )}\n </pre>\n </div>\n </div>\n </ShowMore>\n\n <div className=\"flex flex-wrap gap-3\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/installed/${installation.id}`)}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg border border-border-default px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n {t('pages.appSettings.viewInstallation', { defaultValue: 'View Installation' })}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n navigate(`${basePath}/marketplace/product/${installation.productId}`)\n }\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-semibold text-action-primary-text hover:opacity-90\"\n >\n {t('pages.appDetail.viewProduct', { defaultValue: 'View Product' })}\n </button>\n </div>\n </EmphasisPanel>\n )}\n </div>\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
|