@burdenoff/fe-libs 2026.601.11 → 2026.601.13
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/shared/actors/index.js +1 -1
- package/dist/shared/config/shellRoutes.d.ts.map +1 -1
- package/dist/shared/config/shellRoutes.js +7 -0
- package/dist/shared/tours/toursContext/useTourMutations.d.ts.map +1 -1
- package/dist/shared/tours/toursContext/useTourMutations.js +1 -10
- package/dist/shared.js +77 -77
- package/dist/sharing/AcceptSharePage.d.ts +28 -0
- package/dist/sharing/AcceptSharePage.d.ts.map +1 -0
- package/dist/sharing/AcceptSharePage.js +270 -0
- package/dist/sharing/MemberPicker.d.ts +26 -0
- package/dist/sharing/MemberPicker.d.ts.map +1 -0
- package/dist/sharing/MemberPicker.js +110 -0
- package/dist/sharing/PermissionSelect.d.ts +19 -0
- package/dist/sharing/PermissionSelect.d.ts.map +1 -0
- package/dist/sharing/PermissionSelect.js +30 -0
- package/dist/sharing/ShareDialog.d.ts +26 -0
- package/dist/sharing/ShareDialog.d.ts.map +1 -0
- package/dist/sharing/ShareDialog.js +318 -0
- package/dist/sharing/SharedWithList.d.ts +18 -0
- package/dist/sharing/SharedWithList.d.ts.map +1 -0
- package/dist/sharing/SharedWithList.js +184 -0
- package/dist/sharing/index.d.ts +9 -0
- package/dist/sharing/index.d.ts.map +1 -0
- package/dist/sharing/shareUrl.d.ts +20 -0
- package/dist/sharing/shareUrl.d.ts.map +1 -0
- package/dist/sharing/shareUrl.js +39 -0
- package/dist/sharing/types.d.ts +94 -0
- package/dist/sharing/types.d.ts.map +1 -0
- package/dist/sharing/types.js +25 -0
- package/dist/sharing/useWorkspaceDirectory.d.ts +43 -0
- package/dist/sharing/useWorkspaceDirectory.d.ts.map +1 -0
- package/dist/sharing/useWorkspaceDirectory.js +117 -0
- package/dist/sharing.d.ts +2 -0
- package/dist/sharing.js +9 -0
- package/package.json +5 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { cn as e } from "../lib/utils.js";
|
|
2
|
+
import { Command as t, CommandEmpty as n, CommandGroup as r, CommandInput as i, CommandItem as a, CommandList as o } from "../ui/command.js";
|
|
3
|
+
import { ActorIdentity as s } from "../shared/actors/ActorIdentity.js";
|
|
4
|
+
import { useWorkspaceDirectory as c } from "./useWorkspaceDirectory.js";
|
|
5
|
+
import { useMemo as l, useState as u } from "react";
|
|
6
|
+
import { Mail as d, UserPlus as f, X as p } from "lucide-react";
|
|
7
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
8
|
+
//#region src/sharing/MemberPicker.tsx
|
|
9
|
+
var g = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
10
|
+
function _(e) {
|
|
11
|
+
return {
|
|
12
|
+
actorId: e.id,
|
|
13
|
+
actorType: "user",
|
|
14
|
+
displayName: e.name,
|
|
15
|
+
secondaryLabel: e.email || e.id,
|
|
16
|
+
email: e.email || void 0,
|
|
17
|
+
avatarUrl: e.avatar,
|
|
18
|
+
resolved: !0
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
var v = ({ workspaceId: v, onSelect: y, multiple: b = !1, excludeIds: x = [], authToken: S, apiGatewayUrl: C, className: w }) => {
|
|
22
|
+
let { members: T, search: E, loading: D } = c({
|
|
23
|
+
workspaceId: v,
|
|
24
|
+
authToken: S,
|
|
25
|
+
apiGatewayUrl: C
|
|
26
|
+
}), [O, k] = u(""), [A, j] = u([]), M = l(() => new Set(x), [x]), N = l(() => new Set(A.map((e) => e.userId).filter((e) => !!e)), [A]), P = l(() => new Set(A.map((e) => e.email.toLowerCase())), [A]), F = T.filter((e) => !M.has(e.id) && !N.has(e.id)), I = O.trim(), L = g.test(I), R = T.some((e) => e.email.toLowerCase() === I.toLowerCase()), z = L && !R && !P.has(I.toLowerCase()), B = (e) => {
|
|
27
|
+
b && j((t) => t.some((t) => e.userId && t.userId === e.userId || t.email.toLowerCase() === e.email.toLowerCase()) ? t : [...t, e]), k(""), E(""), y(e);
|
|
28
|
+
}, V = (e) => {
|
|
29
|
+
j((t) => t.filter((t) => !(e.userId && t.userId === e.userId || t.email.toLowerCase() === e.email.toLowerCase())));
|
|
30
|
+
};
|
|
31
|
+
return /* @__PURE__ */ h("div", {
|
|
32
|
+
className: e("space-y-2", w),
|
|
33
|
+
children: [b && A.length > 0 ? /* @__PURE__ */ m("div", {
|
|
34
|
+
className: "flex flex-wrap gap-2",
|
|
35
|
+
"data-testid": "share-member-chips",
|
|
36
|
+
children: A.map((e) => /* @__PURE__ */ h("span", {
|
|
37
|
+
className: "inline-flex items-center gap-1.5 rounded-full border border-border-subtle bg-bg-sunken px-2 py-1 text-xs text-text-primary",
|
|
38
|
+
"data-testid": "share-member-chip",
|
|
39
|
+
children: [e.displayName, /* @__PURE__ */ m("button", {
|
|
40
|
+
type: "button",
|
|
41
|
+
onClick: () => V(e),
|
|
42
|
+
"aria-label": `Remove ${e.displayName}`,
|
|
43
|
+
className: "text-text-tertiary transition-colors hover:text-text-primary",
|
|
44
|
+
children: /* @__PURE__ */ m(p, { className: "size-3" })
|
|
45
|
+
})]
|
|
46
|
+
}, e.userId ?? e.email))
|
|
47
|
+
}) : null, /* @__PURE__ */ h(t, {
|
|
48
|
+
className: "rounded-md border border-border-default bg-bg-surface",
|
|
49
|
+
shouldFilter: !1,
|
|
50
|
+
children: [/* @__PURE__ */ m(i, {
|
|
51
|
+
"data-testid": "share-member-picker-input",
|
|
52
|
+
placeholder: "Search members or type an email…",
|
|
53
|
+
value: O,
|
|
54
|
+
onValueChange: (e) => {
|
|
55
|
+
k(e), E(e);
|
|
56
|
+
}
|
|
57
|
+
}), /* @__PURE__ */ h(o, { children: [
|
|
58
|
+
D && F.length === 0 ? /* @__PURE__ */ m("div", {
|
|
59
|
+
className: "py-6 text-center text-sm text-text-secondary",
|
|
60
|
+
children: "Loading members…"
|
|
61
|
+
}) : null,
|
|
62
|
+
!D && F.length === 0 && !z ? /* @__PURE__ */ m(n, { children: "No members found." }) : null,
|
|
63
|
+
z ? /* @__PURE__ */ m(r, {
|
|
64
|
+
heading: "Invite by email",
|
|
65
|
+
children: /* @__PURE__ */ h(a, {
|
|
66
|
+
value: `invite:${I}`,
|
|
67
|
+
"data-testid": "share-member-invite-email",
|
|
68
|
+
onSelect: () => B({
|
|
69
|
+
email: I,
|
|
70
|
+
displayName: I
|
|
71
|
+
}),
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ m(d, { className: "size-4 text-text-secondary" }),
|
|
74
|
+
/* @__PURE__ */ h("span", {
|
|
75
|
+
className: "flex flex-col",
|
|
76
|
+
children: [/* @__PURE__ */ m("span", {
|
|
77
|
+
className: "text-sm text-text-primary",
|
|
78
|
+
children: I
|
|
79
|
+
}), /* @__PURE__ */ m("span", {
|
|
80
|
+
className: "text-xs text-text-secondary",
|
|
81
|
+
children: "Will be invited by email"
|
|
82
|
+
})]
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ m(f, { className: "ml-auto size-4 text-text-secondary" })
|
|
85
|
+
]
|
|
86
|
+
})
|
|
87
|
+
}) : null,
|
|
88
|
+
F.length > 0 ? /* @__PURE__ */ m(r, {
|
|
89
|
+
heading: "Members",
|
|
90
|
+
children: F.map((e) => /* @__PURE__ */ m(a, {
|
|
91
|
+
value: `${e.name} ${e.email} ${e.id}`,
|
|
92
|
+
"data-testid": "share-member-row",
|
|
93
|
+
onSelect: () => B({
|
|
94
|
+
userId: e.id,
|
|
95
|
+
email: e.email,
|
|
96
|
+
displayName: e.name
|
|
97
|
+
}),
|
|
98
|
+
children: /* @__PURE__ */ m(s, {
|
|
99
|
+
profile: _(e),
|
|
100
|
+
variant: "inline",
|
|
101
|
+
hideIdDrilldown: !0
|
|
102
|
+
})
|
|
103
|
+
}, e.id))
|
|
104
|
+
}) : null
|
|
105
|
+
] })]
|
|
106
|
+
})]
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
//#endregion
|
|
110
|
+
export { v as MemberPicker };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { ShareRole } from './types';
|
|
3
|
+
export interface PermissionSelectProps {
|
|
4
|
+
value: ShareRole;
|
|
5
|
+
/** Subset of canonical roles to offer (order preserved). */
|
|
6
|
+
roles: ShareRole[];
|
|
7
|
+
onChange: (role: ShareRole) => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Test id applied to the trigger (defaults to `share-permission-select`). */
|
|
11
|
+
testId?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Role selector built on the shared `Select` primitive. Each option shows the
|
|
15
|
+
* role label plus a one-line description so the grantee's effective access is
|
|
16
|
+
* obvious without leaving the dialog.
|
|
17
|
+
*/
|
|
18
|
+
export declare const PermissionSelect: FC<PermissionSelectProps>;
|
|
19
|
+
//# sourceMappingURL=PermissionSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionSelect.d.ts","sourceRoot":"","sources":["../../src/sharing/PermissionSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,4DAA4D;IAC5D,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAyBtD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Select as e, SelectContent as t, SelectItem as n, SelectTrigger as r, SelectValue as i } from "../ui/select.js";
|
|
2
|
+
import { roleDescription as a, roleLabel as o } from "./types.js";
|
|
3
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
4
|
+
//#region src/sharing/PermissionSelect.tsx
|
|
5
|
+
var l = ({ value: l, roles: u, onChange: d, disabled: f, className: p, testId: m = "share-permission-select" }) => /* @__PURE__ */ c(e, {
|
|
6
|
+
value: l,
|
|
7
|
+
onValueChange: (e) => d(e),
|
|
8
|
+
disabled: f,
|
|
9
|
+
children: [/* @__PURE__ */ s(r, {
|
|
10
|
+
className: p,
|
|
11
|
+
"data-testid": m,
|
|
12
|
+
"aria-label": "Permission",
|
|
13
|
+
children: /* @__PURE__ */ s(i, {})
|
|
14
|
+
}), /* @__PURE__ */ s(t, { children: u.map((e) => /* @__PURE__ */ s(n, {
|
|
15
|
+
value: e,
|
|
16
|
+
"data-testid": `share-permission-option-${e}`,
|
|
17
|
+
children: /* @__PURE__ */ c("span", {
|
|
18
|
+
className: "flex flex-col",
|
|
19
|
+
children: [/* @__PURE__ */ s("span", {
|
|
20
|
+
className: "text-sm font-medium text-text-primary",
|
|
21
|
+
children: o(e)
|
|
22
|
+
}), /* @__PURE__ */ s("span", {
|
|
23
|
+
className: "text-xs text-text-secondary",
|
|
24
|
+
children: a(e)
|
|
25
|
+
})]
|
|
26
|
+
})
|
|
27
|
+
}, e)) })]
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
export { l as PermissionSelect };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { ShareController, ShareResourceRef } from './types';
|
|
3
|
+
export interface ShareDialogProps {
|
|
4
|
+
resource: ShareResourceRef;
|
|
5
|
+
controller: ShareController;
|
|
6
|
+
open: boolean;
|
|
7
|
+
onOpenChange: (open: boolean) => void;
|
|
8
|
+
/** Workspace scope used by the member picker + identity resolution. */
|
|
9
|
+
workspaceId?: string;
|
|
10
|
+
authToken?: string;
|
|
11
|
+
apiGatewayUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generic, controller-driven share dialog. Visibility-mode tabs are derived
|
|
15
|
+
* from {@link ShareController.capabilities} and the resource's `vibeId`:
|
|
16
|
+
*
|
|
17
|
+
* - **Private** — sets visibility to PRIVATE.
|
|
18
|
+
* - **Specific people** — member picker + permission + optional message/expiry
|
|
19
|
+
* → `createUserShare`.
|
|
20
|
+
* - **Everyone with Vibe** — only when `resource.vibeId` and
|
|
21
|
+
* `capabilities.supportsVibeShare` → sets visibility to SHARED_WITH_VIBE.
|
|
22
|
+
* - **Public link** — only when `capabilities.supportsLink` → role + expiry →
|
|
23
|
+
* `createLinkShare` + copy URL.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ShareDialog: FC<ShareDialogProps>;
|
|
26
|
+
//# sourceMappingURL=ShareDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShareDialog.d.ts","sourceRoot":"","sources":["../../src/sharing/ShareDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAkB9D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAa,MAAM,SAAS,CAAC;AAI5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA0BD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmU5C,CAAC"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { cn as e } from "../lib/utils.js";
|
|
2
|
+
import { ResponsiveDialog as t, ResponsiveDialogContent as n, ResponsiveDialogHeader as r, ResponsiveDialogTitle as i } from "../ui/responsive-dialog.js";
|
|
3
|
+
import { Button as a } from "../ui/button.js";
|
|
4
|
+
import { Input as o } from "../ui/input.js";
|
|
5
|
+
import { Label as s } from "../ui/label.js";
|
|
6
|
+
import { Textarea as ee } from "../ui/textarea.js";
|
|
7
|
+
import { MemberPicker as te } from "./MemberPicker.js";
|
|
8
|
+
import { PermissionSelect as c } from "./PermissionSelect.js";
|
|
9
|
+
import { copyTextToClipboard as l, normalizeShareUrl as u } from "./shareUrl.js";
|
|
10
|
+
import { SharedWithList as ne } from "./SharedWithList.js";
|
|
11
|
+
import { useEffect as re, useMemo as d, useState as f } from "react";
|
|
12
|
+
import { Check as p, Copy as m, Globe as ie, Link2 as h, Lock as g, Users as _ } from "lucide-react";
|
|
13
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
14
|
+
//#region src/sharing/ShareDialog.tsx
|
|
15
|
+
var b = [
|
|
16
|
+
{
|
|
17
|
+
value: "never",
|
|
18
|
+
label: "No expiry",
|
|
19
|
+
hours: null
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
value: "24",
|
|
23
|
+
label: "24 hours",
|
|
24
|
+
hours: 24
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
value: "72",
|
|
28
|
+
label: "3 days",
|
|
29
|
+
hours: 72
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
value: "168",
|
|
33
|
+
label: "7 days",
|
|
34
|
+
hours: 168
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
value: "720",
|
|
38
|
+
label: "30 days",
|
|
39
|
+
hours: 720
|
|
40
|
+
}
|
|
41
|
+
];
|
|
42
|
+
function x(e) {
|
|
43
|
+
if (e != null) return new Date(Date.now() + e * 60 * 60 * 1e3).toISOString();
|
|
44
|
+
}
|
|
45
|
+
function S(e) {
|
|
46
|
+
return e[0] ?? "VIEWER";
|
|
47
|
+
}
|
|
48
|
+
var C = ({ resource: C, controller: w, open: T, onOpenChange: ae, workspaceId: E, authToken: D, apiGatewayUrl: O }) => {
|
|
49
|
+
let { capabilities: k } = w, A = !!C.vibeId && k.supportsVibeShare, j = d(() => {
|
|
50
|
+
let e = ["private"];
|
|
51
|
+
return k.supportsUsers && e.push("users"), A && e.push("vibe"), k.supportsLink && e.push("link"), e;
|
|
52
|
+
}, [
|
|
53
|
+
k.supportsUsers,
|
|
54
|
+
k.supportsLink,
|
|
55
|
+
A
|
|
56
|
+
]), M = d(() => k.supportsUsers ? "users" : j[0] ?? "private", [j, k.supportsUsers]), [N, P] = f(M), [F, I] = f(null), [L, R] = f(S(k.roles)), [z, B] = f(""), [V, H] = f("never"), [U, W] = f(!1), [G, K] = f(S(k.roles)), [q, oe] = f("never"), [J, Y] = f(null), [X, Z] = f(!1), [Q, $] = f(!1);
|
|
57
|
+
re(() => {
|
|
58
|
+
T ? (P(M), w.refetch()) : (I(null), B(""), Y(null), Z(!1));
|
|
59
|
+
}, [T, M]);
|
|
60
|
+
let se = (e) => {
|
|
61
|
+
P(e), e === "private" ? w.setVisibility?.("PRIVATE") : e === "vibe" && w.setVisibility?.("SHARED_WITH_VIBE");
|
|
62
|
+
}, ce = async () => {
|
|
63
|
+
if (F?.email) {
|
|
64
|
+
W(!0);
|
|
65
|
+
try {
|
|
66
|
+
await w.createUserShare({
|
|
67
|
+
email: F.email,
|
|
68
|
+
role: L,
|
|
69
|
+
message: z.trim() || void 0,
|
|
70
|
+
expiresAt: k.supportsExpiry ? x(b.find((e) => e.value === V)?.hours ?? null) : void 0
|
|
71
|
+
}), I(null), B(""), w.refetch();
|
|
72
|
+
} finally {
|
|
73
|
+
W(!1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, le = async () => {
|
|
77
|
+
if (w.createLinkShare) {
|
|
78
|
+
$(!0);
|
|
79
|
+
try {
|
|
80
|
+
Y(u((await w.createLinkShare({
|
|
81
|
+
role: G,
|
|
82
|
+
expiresAt: k.supportsExpiry ? x(b.find((e) => e.value === q)?.hours ?? null) ?? null : null
|
|
83
|
+
})).shareUrl)), w.refetch();
|
|
84
|
+
} finally {
|
|
85
|
+
$(!1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}, ue = async () => {
|
|
89
|
+
J && await l(J).then(() => !0, () => !1) && (Z(!0), setTimeout(() => Z(!1), 2e3));
|
|
90
|
+
}, de = {
|
|
91
|
+
private: {
|
|
92
|
+
label: "Private",
|
|
93
|
+
icon: g,
|
|
94
|
+
testId: "share-tab-private"
|
|
95
|
+
},
|
|
96
|
+
users: {
|
|
97
|
+
label: "Specific people",
|
|
98
|
+
icon: _,
|
|
99
|
+
testId: "share-tab-users"
|
|
100
|
+
},
|
|
101
|
+
vibe: {
|
|
102
|
+
label: "Everyone with Vibe",
|
|
103
|
+
icon: _,
|
|
104
|
+
testId: "share-tab-vibe"
|
|
105
|
+
},
|
|
106
|
+
link: {
|
|
107
|
+
label: "Public link",
|
|
108
|
+
icon: h,
|
|
109
|
+
testId: "share-tab-link"
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return /* @__PURE__ */ v(t, {
|
|
113
|
+
open: T,
|
|
114
|
+
onOpenChange: ae,
|
|
115
|
+
children: /* @__PURE__ */ y(n, {
|
|
116
|
+
className: "sm:max-w-xl",
|
|
117
|
+
"data-testid": "share-dialog",
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ v(r, { children: /* @__PURE__ */ y(i, { children: [
|
|
120
|
+
"Share “",
|
|
121
|
+
C.name,
|
|
122
|
+
"”"
|
|
123
|
+
] }) }),
|
|
124
|
+
/* @__PURE__ */ v("div", {
|
|
125
|
+
className: "flex flex-wrap gap-1 rounded-lg bg-bg-sunken p-1",
|
|
126
|
+
role: "tablist",
|
|
127
|
+
"aria-label": "Sharing visibility",
|
|
128
|
+
children: j.map((t) => {
|
|
129
|
+
let n = de[t], r = n.icon, i = N === t;
|
|
130
|
+
return /* @__PURE__ */ y("button", {
|
|
131
|
+
type: "button",
|
|
132
|
+
role: "tab",
|
|
133
|
+
"aria-selected": i,
|
|
134
|
+
"data-testid": n.testId,
|
|
135
|
+
onClick: () => se(t),
|
|
136
|
+
className: e("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium transition-colors", i ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"),
|
|
137
|
+
children: [/* @__PURE__ */ v(r, { className: "size-4" }), n.label]
|
|
138
|
+
}, t);
|
|
139
|
+
})
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ y("div", {
|
|
142
|
+
className: "space-y-4 py-2",
|
|
143
|
+
children: [
|
|
144
|
+
N === "private" ? /* @__PURE__ */ y("div", {
|
|
145
|
+
className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
|
|
146
|
+
children: [/* @__PURE__ */ v(g, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
|
|
147
|
+
className: "text-sm text-text-secondary",
|
|
148
|
+
children: [
|
|
149
|
+
"Only you can access this ",
|
|
150
|
+
C.type,
|
|
151
|
+
". Choose another mode to grant access."
|
|
152
|
+
]
|
|
153
|
+
})]
|
|
154
|
+
}) : null,
|
|
155
|
+
N === "users" ? /* @__PURE__ */ y("div", {
|
|
156
|
+
className: "space-y-4",
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ v(te, {
|
|
159
|
+
workspaceId: E ?? "",
|
|
160
|
+
authToken: D,
|
|
161
|
+
apiGatewayUrl: O,
|
|
162
|
+
onSelect: I
|
|
163
|
+
}),
|
|
164
|
+
F ? /* @__PURE__ */ y("div", {
|
|
165
|
+
className: "rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary",
|
|
166
|
+
children: ["Inviting ", /* @__PURE__ */ v("span", {
|
|
167
|
+
className: "font-medium",
|
|
168
|
+
children: F.displayName
|
|
169
|
+
})]
|
|
170
|
+
}) : null,
|
|
171
|
+
/* @__PURE__ */ y("div", {
|
|
172
|
+
className: "space-y-2",
|
|
173
|
+
children: [/* @__PURE__ */ v(s, {
|
|
174
|
+
htmlFor: "share-role",
|
|
175
|
+
children: "Permission"
|
|
176
|
+
}), /* @__PURE__ */ v(c, {
|
|
177
|
+
value: L,
|
|
178
|
+
roles: k.roles,
|
|
179
|
+
onChange: R
|
|
180
|
+
})]
|
|
181
|
+
}),
|
|
182
|
+
k.supportsExpiry ? /* @__PURE__ */ y("div", {
|
|
183
|
+
className: "space-y-2",
|
|
184
|
+
children: [/* @__PURE__ */ v(s, {
|
|
185
|
+
htmlFor: "share-user-expiry",
|
|
186
|
+
children: "Access expires"
|
|
187
|
+
}), /* @__PURE__ */ v("select", {
|
|
188
|
+
id: "share-user-expiry",
|
|
189
|
+
value: V,
|
|
190
|
+
onChange: (e) => H(e.target.value),
|
|
191
|
+
"data-testid": "share-user-expiry",
|
|
192
|
+
className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
|
|
193
|
+
children: b.map((e) => /* @__PURE__ */ v("option", {
|
|
194
|
+
value: e.value,
|
|
195
|
+
children: e.label
|
|
196
|
+
}, e.value))
|
|
197
|
+
})]
|
|
198
|
+
}) : null,
|
|
199
|
+
/* @__PURE__ */ y("div", {
|
|
200
|
+
className: "space-y-2",
|
|
201
|
+
children: [/* @__PURE__ */ v(s, {
|
|
202
|
+
htmlFor: "share-message",
|
|
203
|
+
children: "Message (optional)"
|
|
204
|
+
}), /* @__PURE__ */ v(ee, {
|
|
205
|
+
id: "share-message",
|
|
206
|
+
value: z,
|
|
207
|
+
onChange: (e) => B(e.target.value),
|
|
208
|
+
placeholder: "Add a note to the invitation…",
|
|
209
|
+
rows: 2
|
|
210
|
+
})]
|
|
211
|
+
}),
|
|
212
|
+
/* @__PURE__ */ v(a, {
|
|
213
|
+
type: "button",
|
|
214
|
+
"data-testid": "share-invite-submit",
|
|
215
|
+
disabled: !F?.email || U,
|
|
216
|
+
onClick: () => {
|
|
217
|
+
ce();
|
|
218
|
+
},
|
|
219
|
+
className: "w-full",
|
|
220
|
+
children: U ? "Sharing…" : "Share"
|
|
221
|
+
})
|
|
222
|
+
]
|
|
223
|
+
}) : null,
|
|
224
|
+
N === "vibe" ? /* @__PURE__ */ y("div", {
|
|
225
|
+
className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
|
|
226
|
+
children: [/* @__PURE__ */ v(_, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
|
|
227
|
+
className: "text-sm text-text-secondary",
|
|
228
|
+
children: [
|
|
229
|
+
"Everyone with access to this Vibe can open this ",
|
|
230
|
+
C.type,
|
|
231
|
+
"."
|
|
232
|
+
]
|
|
233
|
+
})]
|
|
234
|
+
}) : null,
|
|
235
|
+
N === "link" ? /* @__PURE__ */ y("div", {
|
|
236
|
+
className: "space-y-4",
|
|
237
|
+
children: [
|
|
238
|
+
/* @__PURE__ */ y("div", {
|
|
239
|
+
className: "flex items-start gap-3 rounded-md border border-border-subtle bg-bg-sunken px-3 py-3",
|
|
240
|
+
children: [/* @__PURE__ */ v(ie, { className: "mt-0.5 size-4 text-text-secondary" }), /* @__PURE__ */ y("p", {
|
|
241
|
+
className: "text-sm text-text-secondary",
|
|
242
|
+
children: [
|
|
243
|
+
"Anyone with the link can access this ",
|
|
244
|
+
C.type,
|
|
245
|
+
" with the chosen permission."
|
|
246
|
+
]
|
|
247
|
+
})]
|
|
248
|
+
}),
|
|
249
|
+
/* @__PURE__ */ y("div", {
|
|
250
|
+
className: "space-y-2",
|
|
251
|
+
children: [/* @__PURE__ */ v(s, {
|
|
252
|
+
htmlFor: "share-link-role",
|
|
253
|
+
children: "Permission"
|
|
254
|
+
}), /* @__PURE__ */ v(c, {
|
|
255
|
+
value: G,
|
|
256
|
+
roles: k.roles,
|
|
257
|
+
onChange: K,
|
|
258
|
+
testId: "share-link-permission-select"
|
|
259
|
+
})]
|
|
260
|
+
}),
|
|
261
|
+
k.supportsExpiry ? /* @__PURE__ */ y("div", {
|
|
262
|
+
className: "space-y-2",
|
|
263
|
+
children: [/* @__PURE__ */ v(s, {
|
|
264
|
+
htmlFor: "share-link-expiry",
|
|
265
|
+
children: "Link expires"
|
|
266
|
+
}), /* @__PURE__ */ v("select", {
|
|
267
|
+
id: "share-link-expiry",
|
|
268
|
+
value: q,
|
|
269
|
+
onChange: (e) => oe(e.target.value),
|
|
270
|
+
"data-testid": "share-link-expiry",
|
|
271
|
+
className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-action-primary-bg",
|
|
272
|
+
children: b.map((e) => /* @__PURE__ */ v("option", {
|
|
273
|
+
value: e.value,
|
|
274
|
+
children: e.label
|
|
275
|
+
}, e.value))
|
|
276
|
+
})]
|
|
277
|
+
}) : null,
|
|
278
|
+
J ? /* @__PURE__ */ y("div", {
|
|
279
|
+
className: "flex items-center gap-2 rounded-md border border-status-success-border bg-status-success-bg-subtle px-3 py-2",
|
|
280
|
+
children: [/* @__PURE__ */ v(o, {
|
|
281
|
+
value: J,
|
|
282
|
+
readOnly: !0,
|
|
283
|
+
"aria-label": "Share link",
|
|
284
|
+
className: "flex-1"
|
|
285
|
+
}), /* @__PURE__ */ y(a, {
|
|
286
|
+
type: "button",
|
|
287
|
+
"data-testid": "share-copy-link",
|
|
288
|
+
onClick: () => {
|
|
289
|
+
ue();
|
|
290
|
+
},
|
|
291
|
+
children: [v(X ? p : m, { className: "size-4" }), X ? "Copied" : "Copy"]
|
|
292
|
+
})]
|
|
293
|
+
}) : /* @__PURE__ */ y(a, {
|
|
294
|
+
type: "button",
|
|
295
|
+
"data-testid": "share-create-link",
|
|
296
|
+
disabled: Q || !w.createLinkShare,
|
|
297
|
+
onClick: () => {
|
|
298
|
+
le();
|
|
299
|
+
},
|
|
300
|
+
className: "w-full",
|
|
301
|
+
children: [/* @__PURE__ */ v(h, { className: "size-4" }), Q ? "Creating…" : "Create link"]
|
|
302
|
+
})
|
|
303
|
+
]
|
|
304
|
+
}) : null
|
|
305
|
+
]
|
|
306
|
+
}),
|
|
307
|
+
/* @__PURE__ */ v(ne, {
|
|
308
|
+
controller: w,
|
|
309
|
+
workspaceId: E,
|
|
310
|
+
authToken: D,
|
|
311
|
+
apiGatewayUrl: O
|
|
312
|
+
})
|
|
313
|
+
]
|
|
314
|
+
})
|
|
315
|
+
});
|
|
316
|
+
};
|
|
317
|
+
//#endregion
|
|
318
|
+
export { C as ShareDialog };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { ShareController } from './types';
|
|
3
|
+
export interface SharedWithListProps {
|
|
4
|
+
controller: ShareController;
|
|
5
|
+
/** Workspace scope for resolving grantee identities. */
|
|
6
|
+
workspaceId?: string;
|
|
7
|
+
authToken?: string;
|
|
8
|
+
apiGatewayUrl?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Renders the current grants (user rows) and public links for a shared
|
|
13
|
+
* resource. User rows show identity + status, an inline {@link PermissionSelect}
|
|
14
|
+
* (when the controller supports `updateRole`) and a revoke action. Link rows
|
|
15
|
+
* surface a copy-link button, expiry, and revoke.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SharedWithList: FC<SharedWithListProps>;
|
|
18
|
+
//# sourceMappingURL=SharedWithList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedWithList.d.ts","sourceRoot":"","sources":["../../src/sharing/SharedWithList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAU1C,OAAO,KAAK,EAAE,eAAe,EAA+B,MAAM,SAAS,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,eAAe,CAAC;IAC5B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2DD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAoKlD,CAAC"}
|