@columenlabs/lumen-ui 0.1.170 → 0.1.171
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/notifications.d.ts +6 -1
- package/dist/notifications.js +17 -5
- package/package.json +2 -2
package/dist/notifications.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/** The Settings ▸ Notifications section's body. */
|
|
2
|
-
export declare function NotificationsSettings({ api: base, product, sender, }: {
|
|
2
|
+
export declare function NotificationsSettings({ api: base, product, sender, parts, }: {
|
|
3
3
|
/** The app's Notifications API base, e.g. `/api/notifications`. */
|
|
4
4
|
api: string;
|
|
5
5
|
/** The product's name in the copy ("Get Acme alerts by email"). */
|
|
6
6
|
product: string;
|
|
7
7
|
/** The address email comes from. */
|
|
8
8
|
sender: string;
|
|
9
|
+
/**
|
|
10
|
+
* What to draw: the channels and the events grid (default), only the channels (where messages
|
|
11
|
+
* go) or only the events grid (what goes where), so an app can set them in two sections.
|
|
12
|
+
*/
|
|
13
|
+
parts?: 'all' | 'channels' | 'events';
|
|
9
14
|
}): import("react").JSX.Element;
|
package/dist/notifications.js
CHANGED
|
@@ -147,12 +147,22 @@ function Events({ status, api }) {
|
|
|
147
147
|
...status.webhooks.map((h) => ({ id: h.id, name: h.name })),
|
|
148
148
|
];
|
|
149
149
|
if (!targets.length)
|
|
150
|
-
return (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nothing to send to yet: turn on email or ntfy, or add a webhook,
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
return (_jsx("p", { className: "text-sm text-muted-foreground", children: "Nothing to send to yet: turn on email or ntfy, or add a webhook, first." }));
|
|
151
|
+
// The event column gives way first, so a phone shows the checkboxes; its detail waits in the hover.
|
|
152
|
+
const grid = { gridTemplateColumns: `minmax(7rem, 1fr) repeat(${targets.length}, 5.5rem)` };
|
|
153
|
+
// Groups in the order they first appear; events without one come first, unlabelled.
|
|
154
|
+
const groups = [];
|
|
155
|
+
for (const e of status.events) {
|
|
156
|
+
const g = groups.find((x) => x.label === e.group);
|
|
157
|
+
if (g)
|
|
158
|
+
g.events.push(e);
|
|
159
|
+
else
|
|
160
|
+
groups.push({ label: e.group, events: [e] });
|
|
161
|
+
}
|
|
162
|
+
return (_jsxs("div", { className: "grid grid-cols-1 gap-2", children: [_jsx("div", { className: "overflow-x-auto", children: _jsxs("div", { "aria-label": "Events", className: "grid min-w-max items-center", style: grid, children: [_jsxs("div", { className: "contents", children: [_jsx("span", { className: "pb-1 text-xs font-semibold tracking-wide text-muted-foreground uppercase", children: "Event" }), targets.map((t) => (_jsx("span", { className: "truncate pb-1 text-center text-xs font-semibold tracking-wide text-muted-foreground uppercase", title: t.name, children: t.name }, t.id)))] }), groups.map((g) => (_jsxs("div", { className: "contents", children: [g.label ? (_jsx("span", { className: "border-t pt-3 pb-1 text-xs font-semibold tracking-wide text-muted-foreground uppercase", style: { gridColumn: '1 / -1' }, children: g.label })) : null, g.events.map((e) => (_jsxs("div", { className: "contents", children: [_jsxs("span", { className: "flex min-w-0 items-baseline gap-2 border-t py-2 pr-3", title: `${e.label}: ${e.detail}`, children: [_jsx("span", { className: "truncate text-sm whitespace-nowrap sm:shrink-0", children: e.label }), _jsx("span", { className: "hidden truncate text-xs text-muted-foreground sm:inline", children: e.detail })] }), targets.map((t) => (_jsx("span", { className: "self-stretch border-t py-2", children: _jsx("span", { className: "flex h-full items-center justify-center", children: _jsx(EventCell, { event: e, target: t.id, name: t.name, api: api }) }) }, t.id)))] }, e.key)))] }, g.label ?? '')))] }) }), _jsx("p", { className: "text-xs text-muted-foreground", children: "A new target starts with every event on." })] }));
|
|
153
163
|
}
|
|
154
164
|
/** The Settings ▸ Notifications section's body. */
|
|
155
|
-
export function NotificationsSettings({ api: base, product, sender, }) {
|
|
165
|
+
export function NotificationsSettings({ api: base, product, sender, parts = 'all', }) {
|
|
156
166
|
const api = useNotifications(base, product, sender);
|
|
157
167
|
const [open, setOpen] = useState(null);
|
|
158
168
|
const toggle = (id) => (o) => setOpen(o ? id : null);
|
|
@@ -161,7 +171,9 @@ export function NotificationsSettings({ api: base, product, sender, }) {
|
|
|
161
171
|
if (api.q.isError)
|
|
162
172
|
return _jsx(ErrorLine, { error: api.q.error });
|
|
163
173
|
const s = api.q.data;
|
|
174
|
+
if (parts === 'events')
|
|
175
|
+
return _jsx(Events, { status: s, api: api });
|
|
164
176
|
return (_jsxs("div", { className: "grid grid-cols-1 gap-6", children: [_jsxs("div", { className: "grid grid-cols-1", children: [_jsx(IntegrationRow, { name: "Email", meta: "To your sign-in address", open: open === 'email', onOpenChange: toggle('email'), badge: s.email.connected ? (_jsx(TestBadge, { test: s.email.last_test })) : (_jsx(Badge, { variant: "outline", children: "Off" })), children: _jsx(Email, { status: s.email, api: api }) }), _jsx(IntegrationRow, { name: "ntfy", meta: "Phone notifications through the ntfy app", open: open === 'ntfy', onOpenChange: toggle('ntfy'), badge: s.ntfy.connected ? (_jsx(TestBadge, { test: s.ntfy.last_test })) : (_jsx(Badge, { variant: "outline", children: "Off" })), children: _jsx(Ntfy, { status: s.ntfy, api: api }) }), _jsx(IntegrationRow, { name: "Webhooks", meta: s.webhooks.length
|
|
165
177
|
? s.webhooks.map((h) => h.name).join(' · ')
|
|
166
|
-
: 'Events posted to your own addresses', open: open === 'webhooks', onOpenChange: toggle('webhooks'), badge: s.webhooks.length ? (s.webhooks.some((h) => h.last_test?.ok === false) ? (_jsxs(Badge, { variant: "outline", className: "text-loss", children: [_jsx(AlertTriangleIcon, {}), "Failed"] })) : (_jsxs(Badge, { variant: "outline", children: [s.webhooks.length, " webhook", s.webhooks.length === 1 ? '' : 's'] }))) : (_jsx(Badge, { variant: "outline", children: "None" })), children: _jsx(Webhooks, { hooks: s.webhooks, api: api }) })] }), _jsxs("section", { className: "grid grid-cols-1 gap-2", children: [_jsx("h4", { className: "font-medium", children: "Events" }), _jsx(Events, { status: s, api: api })] })] }));
|
|
178
|
+
: 'Events posted to your own addresses', open: open === 'webhooks', onOpenChange: toggle('webhooks'), badge: s.webhooks.length ? (s.webhooks.some((h) => h.last_test?.ok === false) ? (_jsxs(Badge, { variant: "outline", className: "text-loss", children: [_jsx(AlertTriangleIcon, {}), "Failed"] })) : (_jsxs(Badge, { variant: "outline", children: [s.webhooks.length, " webhook", s.webhooks.length === 1 ? '' : 's'] }))) : (_jsx(Badge, { variant: "outline", children: "None" })), children: _jsx(Webhooks, { hooks: s.webhooks, api: api }) })] }), parts === 'all' ? (_jsxs("section", { className: "grid grid-cols-1 gap-2", children: [_jsx("h4", { className: "font-medium", children: "Events" }), _jsx(Events, { status: s, api: api })] })) : null] }));
|
|
167
179
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@columenlabs/lumen-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.171",
|
|
4
4
|
"description": "Lumen: shared React components (frame, views, widgets, charts, drawers).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@codemirror/lang-javascript": "6.2.5",
|
|
50
50
|
"@codemirror/lang-json": "6.0.2",
|
|
51
51
|
"@codemirror/lang-sql": "6.10.0",
|
|
52
|
-
"@columenlabs/lumen-ui-types": "0.1.
|
|
52
|
+
"@columenlabs/lumen-ui-types": "0.1.171",
|
|
53
53
|
"@dnd-kit/core": "6.3.1",
|
|
54
54
|
"@dnd-kit/sortable": "10.0.0",
|
|
55
55
|
"@dnd-kit/utilities": "3.2.2",
|