@burdenoff/microfe-workspaces 2026.625.4 → 2026.626.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/hooks/useMemberMutations.js +6 -6
- package/dist/hooks/useMemberMutations.js.map +1 -1
- package/dist/pages/ActivityListPage.js +94 -90
- package/dist/pages/ActivityListPage.js.map +1 -1
- package/dist/pages/CreateWorkspacePage.js +68 -63
- package/dist/pages/CreateWorkspacePage.js.map +1 -1
- package/dist/pages/InviteAcceptancePage.js +101 -96
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +185 -184
- package/dist/pages/MembersListPage.js.map +1 -1
- package/dist/pages/PendingInvitesPage.js +70 -68
- package/dist/pages/PendingInvitesPage.js.map +1 -1
- package/dist/pages/ProjectDetailPage.js +119 -78
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectMembersPage.js +105 -104
- package/dist/pages/ProjectMembersPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +158 -157
- package/dist/pages/ProjectsListPage.js.map +1 -1
- package/dist/pages/WorkspaceDetailPage.js +236 -198
- package/dist/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/pages/WorkspaceInvitePage.js +341 -300
- package/dist/pages/WorkspaceInvitePage.js.map +1 -1
- package/dist/pages/WorkspaceSettingsPage.js +87 -85
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
- package/dist/pages/WorkspacesListPage.js +122 -121
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/pages/dashboard/DashboardPage.js +55 -51
- package/dist/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/pages/dashboard/widgets/GroupsWidget.js +16 -17
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +18 -19
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +10 -11
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
- package/package.json +2 -2
|
@@ -9,249 +9,287 @@ import { useProjects as s } from "../hooks/useProjects.js";
|
|
|
9
9
|
import { useWorkspaceActivity as c } from "../hooks/useWorkspaceActivity.js";
|
|
10
10
|
import { Activity as l, ArrowLeft as u, ChevronRight as d, FolderKanban as f, Settings as p, UserPlus as m, Users as h } from "lucide-react";
|
|
11
11
|
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
12
|
-
import { Badge as y, Button as b, CTAOverflowMenu as x, CardContent as S, CardHeader as C, CardTitle as w, GlassCard as T, IllustratedEmptyState as E,
|
|
13
|
-
import { useNavigate as
|
|
14
|
-
import { useI18n as
|
|
12
|
+
import { Badge as y, Button as b, CTAOverflowMenu as x, CardContent as S, CardHeader as C, CardTitle as w, GlassCard as T, IllustratedEmptyState as E, NextSteps as D, PagePurpose as O, Skeleton as k } from "@burdenoff/fe-libs/ui";
|
|
13
|
+
import { useNavigate as A, useParams as j } from "react-router-dom";
|
|
14
|
+
import { useI18n as M } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
15
15
|
//#region src/pages/WorkspaceDetailPage.tsx
|
|
16
|
-
function
|
|
17
|
-
let { workspaceId:
|
|
16
|
+
function N() {
|
|
17
|
+
let { workspaceId: N } = j();
|
|
18
18
|
i("workspaces.detail", {
|
|
19
|
-
workspaceId:
|
|
19
|
+
workspaceId: N,
|
|
20
20
|
requireParams: !0
|
|
21
21
|
});
|
|
22
|
-
let { t:
|
|
23
|
-
if (
|
|
22
|
+
let { t: P } = M(), F = A(), { basePath: I = "/" } = e(), { withCurrentSearch: L } = n(), { data: R, isLoading: z, error: B } = t(N || ""), { data: V } = s({ workspaceId: N }, { limit: 1 }, N), { data: H } = a(N || "", { limit: 1 }), { data: U } = c(N), { canViewWorkspace: W, canUpdateWorkspace: G, canInviteMember: K, isLoading: q } = o();
|
|
23
|
+
if (q) return /* @__PURE__ */ v("div", {
|
|
24
24
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
25
|
-
children: [/* @__PURE__ */ _(
|
|
25
|
+
children: [/* @__PURE__ */ _(k, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
|
|
26
26
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
27
27
|
children: [
|
|
28
|
-
/* @__PURE__ */ _(
|
|
29
|
-
/* @__PURE__ */ _(
|
|
30
|
-
/* @__PURE__ */ _(
|
|
28
|
+
/* @__PURE__ */ _(k, { className: "h-32" }),
|
|
29
|
+
/* @__PURE__ */ _(k, { className: "h-32" }),
|
|
30
|
+
/* @__PURE__ */ _(k, { className: "h-32" })
|
|
31
31
|
]
|
|
32
32
|
})]
|
|
33
33
|
});
|
|
34
|
-
if (!
|
|
34
|
+
if (!W) return /* @__PURE__ */ _("div", {
|
|
35
35
|
className: "flex items-center justify-center min-h-[400px]",
|
|
36
36
|
children: /* @__PURE__ */ v("div", {
|
|
37
37
|
className: "text-center space-y-2",
|
|
38
38
|
children: [/* @__PURE__ */ _("h2", {
|
|
39
39
|
className: "text-lg font-semibold",
|
|
40
|
-
children: r(
|
|
40
|
+
children: r(P, "workspaceDetail.accessDenied", "Access Denied")
|
|
41
41
|
}), /* @__PURE__ */ _("p", {
|
|
42
42
|
className: "text-sm text-text-secondary",
|
|
43
|
-
children: r(
|
|
43
|
+
children: r(P, "workspaceDetail.accessDeniedDesc", "You don't have permission to view this workspace.")
|
|
44
44
|
})]
|
|
45
45
|
})
|
|
46
46
|
});
|
|
47
|
-
if (
|
|
47
|
+
if (z) return /* @__PURE__ */ v("div", {
|
|
48
48
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
49
|
-
children: [/* @__PURE__ */ _(
|
|
49
|
+
children: [/* @__PURE__ */ _(k, { className: "h-10 w-1/3" }), /* @__PURE__ */ v("div", {
|
|
50
50
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
51
51
|
children: [
|
|
52
|
-
/* @__PURE__ */ _(
|
|
53
|
-
/* @__PURE__ */ _(
|
|
54
|
-
/* @__PURE__ */ _(
|
|
52
|
+
/* @__PURE__ */ _(k, { className: "h-32" }),
|
|
53
|
+
/* @__PURE__ */ _(k, { className: "h-32" }),
|
|
54
|
+
/* @__PURE__ */ _(k, { className: "h-32" })
|
|
55
55
|
]
|
|
56
56
|
})]
|
|
57
57
|
});
|
|
58
|
-
if (
|
|
58
|
+
if (B || !R) return /* @__PURE__ */ v("div", {
|
|
59
59
|
className: "space-y-4 p-6",
|
|
60
60
|
children: [/* @__PURE__ */ v(b, {
|
|
61
61
|
variant: "ghost",
|
|
62
|
-
onClick: () =>
|
|
62
|
+
onClick: () => F(L(`${I}/list`)),
|
|
63
63
|
className: "gap-2",
|
|
64
|
-
children: [/* @__PURE__ */ _(u, { size: 20 }), r(
|
|
64
|
+
children: [/* @__PURE__ */ _(u, { size: 20 }), r(P, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
|
|
65
65
|
}), /* @__PURE__ */ _(E, {
|
|
66
66
|
illustration: "empty-search",
|
|
67
|
-
title: r(
|
|
68
|
-
description: r(
|
|
67
|
+
title: r(P, "workspaceDetail.notFound", "Workspace not found"),
|
|
68
|
+
description: r(P, "workspaceDetail.notFoundDescription", "This workspace doesn't exist or you don't have permission to view it.")
|
|
69
69
|
})]
|
|
70
70
|
});
|
|
71
|
-
let
|
|
72
|
-
(e.key === "Enter" || e.key === " ") && (e.preventDefault(),
|
|
71
|
+
let J = (e, t) => {
|
|
72
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), F(t));
|
|
73
73
|
};
|
|
74
74
|
return /* @__PURE__ */ v("div", {
|
|
75
75
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
76
|
-
children: [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
/* @__PURE__ */ v(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
76
|
+
children: [
|
|
77
|
+
/* @__PURE__ */ v("div", {
|
|
78
|
+
className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3",
|
|
79
|
+
children: [/* @__PURE__ */ v("div", { children: [
|
|
80
|
+
/* @__PURE__ */ v(b, {
|
|
81
|
+
variant: "ghost",
|
|
82
|
+
onClick: () => F(L(`${I}/list`)),
|
|
83
|
+
className: "gap-2 mb-2 -ml-2",
|
|
84
|
+
children: [/* @__PURE__ */ _(u, { size: 20 }), r(P, "workspaceDetail.backToWorkspaces", "Back to Workspaces")]
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ _("h1", {
|
|
87
|
+
className: "text-2xl sm:text-3xl font-bold",
|
|
88
|
+
children: R.name
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ v("div", {
|
|
91
|
+
className: "flex items-center gap-2 mt-2",
|
|
92
|
+
children: [/* @__PURE__ */ _(y, {
|
|
93
|
+
variant: "outline",
|
|
94
|
+
children: R.type
|
|
95
|
+
}), /* @__PURE__ */ _(y, { children: R.status })]
|
|
96
|
+
})
|
|
97
|
+
] }), /* @__PURE__ */ _(x, {
|
|
98
|
+
primary: G ? {
|
|
99
|
+
label: r(P, "workspaceDetail.settings", "Settings"),
|
|
100
|
+
icon: /* @__PURE__ */ _(p, { size: 18 }),
|
|
101
|
+
onSelect: () => F(L(`${I}/${N}/settings`))
|
|
102
|
+
} : K ? {
|
|
103
|
+
label: r(P, "workspaceDetail.inviteMembers", "Invite Member"),
|
|
104
|
+
icon: /* @__PURE__ */ _(m, { size: 18 }),
|
|
105
|
+
onSelect: () => F(L(`${I}/${N}/invite`))
|
|
106
|
+
} : void 0,
|
|
107
|
+
actions: [...G && K ? [{
|
|
108
|
+
label: r(P, "workspaceDetail.inviteMembers", "Invite Member"),
|
|
109
|
+
icon: /* @__PURE__ */ _(m, { size: 16 }),
|
|
110
|
+
onSelect: () => F(L(`${I}/${N}/invite`))
|
|
111
|
+
}] : []]
|
|
112
|
+
})]
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ _(O, { children: r(P, "workspaceDetail.purpose", "This is the home for a single workspace — the hub that ties together its projects, the people who collaborate in it, and everything that happens inside. Use the cards below to jump into work, manage who has access, or review recent activity.") }),
|
|
115
|
+
/* @__PURE__ */ _(D, {
|
|
116
|
+
storageKey: "workspaces-workspace-detail",
|
|
117
|
+
steps: [
|
|
118
|
+
{
|
|
119
|
+
id: "open-projects",
|
|
120
|
+
label: r(P, "workspaceDetail.stepProjects", "Open the projects board"),
|
|
121
|
+
description: r(P, "workspaceDetail.stepProjectsDesc", "Projects are where the actual work lives — start or pick one up."),
|
|
122
|
+
icon: /* @__PURE__ */ _(f, { size: 16 }),
|
|
123
|
+
onClick: () => F(L(`${I}/${N}/projects`))
|
|
124
|
+
},
|
|
125
|
+
...K ? [{
|
|
126
|
+
id: "invite-member",
|
|
127
|
+
label: r(P, "workspaceDetail.stepInvite", "Invite a teammate"),
|
|
128
|
+
description: r(P, "workspaceDetail.stepInviteDesc", "Bring people into this workspace so they can collaborate."),
|
|
129
|
+
icon: /* @__PURE__ */ _(m, { size: 16 }),
|
|
130
|
+
onClick: () => F(L(`${I}/${N}/invite`))
|
|
131
|
+
}] : [],
|
|
132
|
+
{
|
|
133
|
+
id: "review-members",
|
|
134
|
+
label: r(P, "workspaceDetail.stepMembers", "Review who has access"),
|
|
135
|
+
description: r(P, "workspaceDetail.stepMembersDesc", "Check the current members and their roles."),
|
|
136
|
+
icon: /* @__PURE__ */ _(h, { size: 16 }),
|
|
137
|
+
onClick: () => F(L(`${I}/${N}/members`))
|
|
138
|
+
},
|
|
139
|
+
...G ? [{
|
|
140
|
+
id: "configure-settings",
|
|
141
|
+
label: r(P, "workspaceDetail.stepSettings", "Configure workspace settings"),
|
|
142
|
+
description: r(P, "workspaceDetail.stepSettingsDesc", "Set the name, domain and contact details for this workspace."),
|
|
143
|
+
icon: /* @__PURE__ */ _(p, { size: 16 }),
|
|
144
|
+
onClick: () => F(L(`${I}/${N}/settings`))
|
|
145
|
+
}] : []
|
|
146
|
+
]
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ v("div", {
|
|
149
|
+
className: "grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6",
|
|
150
|
+
children: [/* @__PURE__ */ _("div", {
|
|
151
|
+
className: "lg:col-span-2 space-y-4 sm:space-y-6",
|
|
152
|
+
children: /* @__PURE__ */ v("div", {
|
|
153
|
+
className: "grid grid-cols-1 sm:grid-cols-3 gap-4",
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ v(T, {
|
|
156
|
+
treatment: "metric",
|
|
157
|
+
glow: !0,
|
|
158
|
+
className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
|
|
159
|
+
onClick: () => F(L(`${I}/${N}/projects`)),
|
|
160
|
+
role: "button",
|
|
161
|
+
tabIndex: 0,
|
|
162
|
+
onKeyDown: (e) => J(e, L(`${I}/${N}/projects`)),
|
|
163
|
+
children: [/* @__PURE__ */ v(C, {
|
|
164
|
+
className: "flex flex-row items-center justify-between pb-2",
|
|
165
|
+
children: [/* @__PURE__ */ v(w, {
|
|
166
|
+
className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
|
|
167
|
+
children: [/* @__PURE__ */ _(f, {
|
|
168
|
+
size: 18,
|
|
169
|
+
className: "text-text-muted"
|
|
170
|
+
}), r(P, "workspaceDetail.projects", "Projects")]
|
|
171
|
+
}), /* @__PURE__ */ _(d, {
|
|
131
172
|
size: 18,
|
|
132
173
|
className: "text-text-muted"
|
|
133
|
-
})
|
|
134
|
-
}), /* @__PURE__ */ _(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}),
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
174
|
+
})]
|
|
175
|
+
}), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
|
|
176
|
+
className: "text-3xl font-bold tabular-nums",
|
|
177
|
+
children: V?.total ?? R.projectCount ?? 0
|
|
178
|
+
}), /* @__PURE__ */ _("p", {
|
|
179
|
+
className: "text-sm text-text-muted",
|
|
180
|
+
children: r(P, "workspaceDetail.projectsDesc", "Projects in this workspace")
|
|
181
|
+
})] })]
|
|
182
|
+
}),
|
|
183
|
+
/* @__PURE__ */ v(T, {
|
|
184
|
+
treatment: "metric",
|
|
185
|
+
className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
|
|
186
|
+
onClick: () => F(L(`${I}/${N}/members`)),
|
|
187
|
+
role: "button",
|
|
188
|
+
tabIndex: 0,
|
|
189
|
+
onKeyDown: (e) => J(e, L(`${I}/${N}/members`)),
|
|
190
|
+
children: [/* @__PURE__ */ v(C, {
|
|
191
|
+
className: "flex flex-row items-center justify-between pb-2",
|
|
192
|
+
children: [/* @__PURE__ */ v(w, {
|
|
193
|
+
className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
|
|
194
|
+
children: [/* @__PURE__ */ _(h, {
|
|
195
|
+
size: 18,
|
|
196
|
+
className: "text-text-muted"
|
|
197
|
+
}), r(P, "workspaceDetail.members", "Members")]
|
|
198
|
+
}), /* @__PURE__ */ _(d, {
|
|
158
199
|
size: 18,
|
|
159
200
|
className: "text-text-muted"
|
|
160
|
-
})
|
|
161
|
-
}), /* @__PURE__ */ _(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}),
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
201
|
+
})]
|
|
202
|
+
}), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
|
|
203
|
+
className: "text-3xl font-bold tabular-nums",
|
|
204
|
+
children: H?.total ?? R.memberCount ?? 0
|
|
205
|
+
}), /* @__PURE__ */ _("p", {
|
|
206
|
+
className: "text-sm text-text-muted",
|
|
207
|
+
children: r(P, "workspaceDetail.membersDesc", "Workspace members")
|
|
208
|
+
})] })]
|
|
209
|
+
}),
|
|
210
|
+
/* @__PURE__ */ v(T, {
|
|
211
|
+
treatment: "metric",
|
|
212
|
+
className: "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50",
|
|
213
|
+
onClick: () => F(L(`${I}/${N}/activity`)),
|
|
214
|
+
role: "button",
|
|
215
|
+
tabIndex: 0,
|
|
216
|
+
onKeyDown: (e) => J(e, L(`${I}/${N}/activity`)),
|
|
217
|
+
children: [/* @__PURE__ */ v(C, {
|
|
218
|
+
className: "flex flex-row items-center justify-between pb-2",
|
|
219
|
+
children: [/* @__PURE__ */ v(w, {
|
|
220
|
+
className: "flex items-center gap-2 text-text-secondary text-sm font-medium",
|
|
221
|
+
children: [/* @__PURE__ */ _(l, {
|
|
222
|
+
size: 18,
|
|
223
|
+
className: "text-text-muted"
|
|
224
|
+
}), r(P, "workspaceDetail.activity", "Activity")]
|
|
225
|
+
}), /* @__PURE__ */ _(d, {
|
|
185
226
|
size: 18,
|
|
186
227
|
className: "text-text-muted"
|
|
187
|
-
})
|
|
188
|
-
}), /* @__PURE__ */ _(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
})
|
|
250
|
-
})]
|
|
251
|
-
})]
|
|
228
|
+
})]
|
|
229
|
+
}), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
|
|
230
|
+
className: "text-3xl font-bold tabular-nums",
|
|
231
|
+
children: U?.length ?? 0
|
|
232
|
+
}), /* @__PURE__ */ _("p", {
|
|
233
|
+
className: "text-sm text-text-muted",
|
|
234
|
+
children: r(P, "workspaceDetail.activityDesc", "Recent activity items")
|
|
235
|
+
})] })]
|
|
236
|
+
})
|
|
237
|
+
]
|
|
238
|
+
})
|
|
239
|
+
}), /* @__PURE__ */ _("aside", {
|
|
240
|
+
className: "lg:sticky lg:top-6 lg:self-start",
|
|
241
|
+
children: /* @__PURE__ */ v(T, {
|
|
242
|
+
treatment: "plain",
|
|
243
|
+
className: "border-border-seam",
|
|
244
|
+
children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, { children: r(P, "workspaceDetail.workspaceInformation", "Workspace Information") }) }), /* @__PURE__ */ _(S, {
|
|
245
|
+
className: "space-y-2",
|
|
246
|
+
children: /* @__PURE__ */ v("div", {
|
|
247
|
+
className: "grid grid-cols-2 gap-2 text-sm",
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ _("span", {
|
|
250
|
+
className: "text-text-muted",
|
|
251
|
+
children: r(P, "workspaceDetail.id", "ID:")
|
|
252
|
+
}),
|
|
253
|
+
/* @__PURE__ */ _("span", {
|
|
254
|
+
className: "font-mono text-xs break-all",
|
|
255
|
+
children: R.id
|
|
256
|
+
}),
|
|
257
|
+
R.domain && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
|
|
258
|
+
className: "text-text-muted",
|
|
259
|
+
children: r(P, "workspaceDetail.domain", "Domain:")
|
|
260
|
+
}), /* @__PURE__ */ _("span", { children: R.domain })] }),
|
|
261
|
+
R.contactEmail && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
|
|
262
|
+
className: "text-text-muted",
|
|
263
|
+
children: r(P, "workspaceDetail.contactEmail", "Contact Email:")
|
|
264
|
+
}), /* @__PURE__ */ _("span", {
|
|
265
|
+
className: "break-all",
|
|
266
|
+
children: R.contactEmail
|
|
267
|
+
})] }),
|
|
268
|
+
R.website && /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _("span", {
|
|
269
|
+
className: "text-text-muted",
|
|
270
|
+
children: r(P, "workspaceDetail.website", "Website:")
|
|
271
|
+
}), /* @__PURE__ */ _("a", {
|
|
272
|
+
href: R.website,
|
|
273
|
+
target: "_blank",
|
|
274
|
+
rel: "noopener noreferrer",
|
|
275
|
+
className: "text-primary hover:underline transition-colors duration-200 break-all",
|
|
276
|
+
children: R.website
|
|
277
|
+
})] }),
|
|
278
|
+
/* @__PURE__ */ _("span", {
|
|
279
|
+
className: "text-text-muted",
|
|
280
|
+
children: r(P, "workspaceDetail.created", "Created:")
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ _("span", { children: new Date(R.createdAt).toLocaleDateString() })
|
|
283
|
+
]
|
|
284
|
+
})
|
|
285
|
+
})]
|
|
286
|
+
})
|
|
287
|
+
})]
|
|
288
|
+
})
|
|
289
|
+
]
|
|
252
290
|
});
|
|
253
291
|
}
|
|
254
292
|
//#endregion
|
|
255
|
-
export {
|
|
293
|
+
export { N as WorkspaceDetailPage };
|
|
256
294
|
|
|
257
295
|
//# sourceMappingURL=WorkspaceDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceDetailPage.js","names":[],"sources":["../../src/pages/WorkspaceDetailPage.tsx"],"sourcesContent":["import { useParams, useNavigate } from 'react-router-dom';\nimport {\n Settings,\n ArrowLeft,\n FolderKanban,\n Users,\n Activity,\n ChevronRight,\n UserPlus,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Button,\n GlassCard,\n CardHeader,\n CardTitle,\n CardContent,\n Badge,\n Skeleton,\n CTAOverflowMenu,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspace } from '../hooks/useWorkspaces';\nimport { useProjects } from '../hooks/useProjects';\nimport { useWorkspaceMembers } from '../hooks/useWorkspaceMembers';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nexport function WorkspaceDetailPage() {\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.detail', { workspaceId, requireParams: true });\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { data: workspace, isLoading, error } = useWorkspace(workspaceId || '');\n const { data: projects } = useProjects({ workspaceId }, { limit: 1 }, workspaceId);\n const { data: members } = useWorkspaceMembers(workspaceId || '', { limit: 1 });\n const { data: activities } = useWorkspaceActivity(workspaceId);\n const {\n canViewWorkspace,\n canUpdateWorkspace,\n canInviteMember,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (!canViewWorkspace) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'workspaceDetail.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'workspaceDetail.accessDeniedDesc',\n \"You don't have permission to view this workspace.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (error || !workspace) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'workspaceDetail.notFound', 'Workspace not found')}\n description={tWithFallback(\n t,\n 'workspaceDetail.notFoundDescription',\n \"This workspace doesn't exist or you don't have permission to view it.\"\n )}\n />\n </div>\n );\n }\n\n const handleCardKeyDown = (e: React.KeyboardEvent, path: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate(path);\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2 mb-2 -ml-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">{workspace.name}</h1>\n <div className=\"flex items-center gap-2 mt-2\">\n <Badge variant=\"outline\">{workspace.type}</Badge>\n <Badge>{workspace.status}</Badge>\n </div>\n </div>\n <CTAOverflowMenu\n primary={\n canUpdateWorkspace\n ? {\n label: tWithFallback(t, 'workspaceDetail.settings', 'Settings'),\n icon: <Settings size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n }\n : canInviteMember\n ? {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n }\n : undefined\n }\n actions={[\n ...(canUpdateWorkspace && canInviteMember\n ? [\n {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={16} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n ]}\n />\n </div>\n\n {/* Main + detail rail */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6\">\n {/* Main: stat metrics */}\n <div className=\"lg:col-span-2 space-y-4 sm:space-y-6\">\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/projects`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <FolderKanban size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.projects', 'Projects')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {projects?.total ?? workspace.projectCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.projectsDesc', 'Projects in this workspace')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/members`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Users size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.members', 'Members')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {members?.total ?? workspace.memberCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.membersDesc', 'Workspace members')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/activity`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/activity`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Activity size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.activity', 'Activity')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">{activities?.length ?? 0}</p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.activityDesc', 'Recent activity items')}\n </p>\n </CardContent>\n </GlassCard>\n </div>\n </div>\n\n {/* Detail rail: workspace info */}\n <aside className=\"lg:sticky lg:top-6 lg:self-start\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tWithFallback(t, 'workspaceDetail.workspaceInformation', 'Workspace Information')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.id', 'ID:')}\n </span>\n <span className=\"font-mono text-xs break-all\">{workspace.id}</span>\n\n {workspace.domain && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.domain', 'Domain:')}\n </span>\n <span>{workspace.domain}</span>\n </>\n )}\n\n {workspace.contactEmail && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.contactEmail', 'Contact Email:')}\n </span>\n <span className=\"break-all\">{workspace.contactEmail}</span>\n </>\n )}\n\n {workspace.website && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.website', 'Website:')}\n </span>\n <a\n href={workspace.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline transition-colors duration-200 break-all\"\n >\n {workspace.website}\n </a>\n </>\n )}\n\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.created', 'Created:')}\n </span>\n <span>{new Date(workspace.createdAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </GlassCard>\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkspaceDetailPage.js","names":[],"sources":["../../src/pages/WorkspaceDetailPage.tsx"],"sourcesContent":["import { useParams, useNavigate } from 'react-router-dom';\nimport {\n Settings,\n ArrowLeft,\n FolderKanban,\n Users,\n Activity,\n ChevronRight,\n UserPlus,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Button,\n GlassCard,\n CardHeader,\n CardTitle,\n CardContent,\n Badge,\n Skeleton,\n CTAOverflowMenu,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspace } from '../hooks/useWorkspaces';\nimport { useProjects } from '../hooks/useProjects';\nimport { useWorkspaceMembers } from '../hooks/useWorkspaceMembers';\nimport { useWorkspaceActivity } from '../hooks/useWorkspaceActivity';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useScopedNavigation } from '../hooks/useScopedNavigation';\nimport { useWorkspacePermissions } from '../hooks/useWorkspacePermissions';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nexport function WorkspaceDetailPage() {\n const { workspaceId } = useParams<{ workspaceId: string }>();\n useWorkspacesPageView('workspaces.detail', { workspaceId, requireParams: true });\n const { t } = useI18n();\n const navigate = useNavigate();\n const { basePath = '/' } = useWorkspacesContext();\n const { withCurrentSearch } = useScopedNavigation();\n const { data: workspace, isLoading, error } = useWorkspace(workspaceId || '');\n const { data: projects } = useProjects({ workspaceId }, { limit: 1 }, workspaceId);\n const { data: members } = useWorkspaceMembers(workspaceId || '', { limit: 1 });\n const { data: activities } = useWorkspaceActivity(workspaceId);\n const {\n canViewWorkspace,\n canUpdateWorkspace,\n canInviteMember,\n isLoading: permissionsLoading,\n } = useWorkspacePermissions();\n\n if (permissionsLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (!canViewWorkspace) {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold\">\n {tWithFallback(t, 'workspaceDetail.accessDenied', 'Access Denied')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'workspaceDetail.accessDeniedDesc',\n \"You don't have permission to view this workspace.\"\n )}\n </p>\n </div>\n </div>\n );\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <Skeleton className=\"h-10 w-1/3\" />\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n <Skeleton className=\"h-32\" />\n </div>\n </div>\n );\n }\n\n if (error || !workspace) {\n return (\n <div className=\"space-y-4 p-6\">\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'workspaceDetail.notFound', 'Workspace not found')}\n description={tWithFallback(\n t,\n 'workspaceDetail.notFoundDescription',\n \"This workspace doesn't exist or you don't have permission to view it.\"\n )}\n />\n </div>\n );\n }\n\n const handleCardKeyDown = (e: React.KeyboardEvent, path: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigate(path);\n }\n };\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div>\n <Button\n variant=\"ghost\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/list`))}\n className=\"gap-2 mb-2 -ml-2\"\n >\n <ArrowLeft size={20} />\n {tWithFallback(t, 'workspaceDetail.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">{workspace.name}</h1>\n <div className=\"flex items-center gap-2 mt-2\">\n <Badge variant=\"outline\">{workspace.type}</Badge>\n <Badge>{workspace.status}</Badge>\n </div>\n </div>\n <CTAOverflowMenu\n primary={\n canUpdateWorkspace\n ? {\n label: tWithFallback(t, 'workspaceDetail.settings', 'Settings'),\n icon: <Settings size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n }\n : canInviteMember\n ? {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={18} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n }\n : undefined\n }\n actions={[\n ...(canUpdateWorkspace && canInviteMember\n ? [\n {\n label: tWithFallback(t, 'workspaceDetail.inviteMembers', 'Invite Member'),\n icon: <UserPlus size={16} />,\n onSelect: () =>\n navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n ]}\n />\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'workspaceDetail.purpose',\n 'This is the home for a single workspace — the hub that ties together its projects, the people who collaborate in it, and everything that happens inside. Use the cards below to jump into work, manage who has access, or review recent activity.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"workspaces-workspace-detail\"\n steps={[\n {\n id: 'open-projects',\n label: tWithFallback(t, 'workspaceDetail.stepProjects', 'Open the projects board'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepProjectsDesc',\n 'Projects are where the actual work lives — start or pick one up.'\n ),\n icon: <FolderKanban size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`)),\n },\n ...(canInviteMember\n ? [\n {\n id: 'invite-member',\n label: tWithFallback(t, 'workspaceDetail.stepInvite', 'Invite a teammate'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepInviteDesc',\n 'Bring people into this workspace so they can collaborate.'\n ),\n icon: <UserPlus size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/invite`)),\n },\n ]\n : []),\n {\n id: 'review-members',\n label: tWithFallback(t, 'workspaceDetail.stepMembers', 'Review who has access'),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepMembersDesc',\n 'Check the current members and their roles.'\n ),\n icon: <Users size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`)),\n },\n ...(canUpdateWorkspace\n ? [\n {\n id: 'configure-settings',\n label: tWithFallback(\n t,\n 'workspaceDetail.stepSettings',\n 'Configure workspace settings'\n ),\n description: tWithFallback(\n t,\n 'workspaceDetail.stepSettingsDesc',\n 'Set the name, domain and contact details for this workspace.'\n ),\n icon: <Settings size={16} />,\n onClick: () => navigate(withCurrentSearch(`${basePath}/${workspaceId}/settings`)),\n },\n ]\n : []),\n ]}\n />\n\n {/* Main + detail rail */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6\">\n {/* Main: stat metrics */}\n <div className=\"lg:col-span-2 space-y-4 sm:space-y-6\">\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <GlassCard\n treatment=\"metric\"\n glow\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/projects`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/projects`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <FolderKanban size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.projects', 'Projects')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {projects?.total ?? workspace.projectCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.projectsDesc', 'Projects in this workspace')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/members`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/members`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Users size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.members', 'Members')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">\n {members?.total ?? workspace.memberCount ?? 0}\n </p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.membersDesc', 'Workspace members')}\n </p>\n </CardContent>\n </GlassCard>\n\n <GlassCard\n treatment=\"metric\"\n className=\"cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg/50\"\n onClick={() => navigate(withCurrentSearch(`${basePath}/${workspaceId}/activity`))}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) =>\n handleCardKeyDown(e, withCurrentSearch(`${basePath}/${workspaceId}/activity`))\n }\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-text-secondary text-sm font-medium\">\n <Activity size={18} className=\"text-text-muted\" />\n {tWithFallback(t, 'workspaceDetail.activity', 'Activity')}\n </CardTitle>\n <ChevronRight size={18} className=\"text-text-muted\" />\n </CardHeader>\n <CardContent>\n <p className=\"text-3xl font-bold tabular-nums\">{activities?.length ?? 0}</p>\n <p className=\"text-sm text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.activityDesc', 'Recent activity items')}\n </p>\n </CardContent>\n </GlassCard>\n </div>\n </div>\n\n {/* Detail rail: workspace info */}\n <aside className=\"lg:sticky lg:top-6 lg:self-start\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tWithFallback(t, 'workspaceDetail.workspaceInformation', 'Workspace Information')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.id', 'ID:')}\n </span>\n <span className=\"font-mono text-xs break-all\">{workspace.id}</span>\n\n {workspace.domain && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.domain', 'Domain:')}\n </span>\n <span>{workspace.domain}</span>\n </>\n )}\n\n {workspace.contactEmail && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.contactEmail', 'Contact Email:')}\n </span>\n <span className=\"break-all\">{workspace.contactEmail}</span>\n </>\n )}\n\n {workspace.website && (\n <>\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.website', 'Website:')}\n </span>\n <a\n href={workspace.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline transition-colors duration-200 break-all\"\n >\n {workspace.website}\n </a>\n </>\n )}\n\n <span className=\"text-text-muted\">\n {tWithFallback(t, 'workspaceDetail.created', 'Created:')}\n </span>\n <span>{new Date(workspace.createdAt).toLocaleDateString()}</span>\n </div>\n </CardContent>\n </GlassCard>\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|