@burdenoff/microfe-workspaces 2026.625.1 → 2026.625.3
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/MemberListItem.js +7 -6
- package/dist/components/MemberListItem.js.map +1 -1
- package/dist/components/ProjectCard.js +13 -12
- package/dist/components/ProjectCard.js.map +1 -1
- package/dist/components/WorkspaceCard.js +8 -7
- package/dist/components/WorkspaceCard.js.map +1 -1
- package/dist/pages/ActivityListPage.js +67 -55
- package/dist/pages/ActivityListPage.js.map +1 -1
- package/dist/pages/CreateWorkspacePage.js +5 -4
- package/dist/pages/CreateWorkspacePage.js.map +1 -1
- package/dist/pages/InviteAcceptancePage.js +45 -36
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +2 -2
- package/dist/pages/MembersListPage.js.map +1 -1
- package/dist/pages/PendingInvitesPage.js +68 -67
- package/dist/pages/PendingInvitesPage.js.map +1 -1
- package/dist/pages/ProjectDetailPage.js +333 -302
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectMembersPage.js +4 -4
- package/dist/pages/ProjectMembersPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +234 -226
- package/dist/pages/ProjectsListPage.js.map +1 -1
- package/dist/pages/WorkspaceDetailPage.js +196 -178
- package/dist/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/pages/WorkspaceInvitePage.js +372 -353
- package/dist/pages/WorkspaceInvitePage.js.map +1 -1
- package/dist/pages/WorkspaceSettingsPage.js +98 -90
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
- package/dist/pages/WorkspacesListPage.js +132 -121
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/pages/dashboard/WidgetWrapper.js +7 -6
- package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
- package/dist/pages/dashboard/widgets/MembersWidget.js +1 -1
- package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +45 -37
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +2 -2
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,434 +1,465 @@
|
|
|
1
1
|
import { useWorkspacesContext as e } from "../providers/WorkspacesProvider.js";
|
|
2
2
|
import { getProjectStatusClasses as t } from "../utils/tokenHelpers.js";
|
|
3
|
-
import { useScopedNavigation as
|
|
4
|
-
import { tWithFallback as
|
|
5
|
-
import { useWorkspacesPageView as
|
|
6
|
-
import { nativeImpact as
|
|
7
|
-
import { useWorkspacePermissions as
|
|
8
|
-
import { useProject as
|
|
9
|
-
import { useArchiveProject as
|
|
10
|
-
import { formatDate as
|
|
11
|
-
import { getProjectDisplayTags as
|
|
12
|
-
import { useWorkspaceActivity as
|
|
13
|
-
import { ProjectTagsWidget as
|
|
14
|
-
import { ProjectMemberPickerDialog as
|
|
15
|
-
import { useMemo as
|
|
16
|
-
import { Activity as
|
|
17
|
-
import { jsx as
|
|
18
|
-
import { AlertDialog as
|
|
19
|
-
import { useNavigate as
|
|
20
|
-
import { useI18n as
|
|
3
|
+
import { useScopedNavigation as ee } from "../hooks/useScopedNavigation.js";
|
|
4
|
+
import { tWithFallback as n } from "../utils/i18n.js";
|
|
5
|
+
import { useWorkspacesPageView as te } from "../hooks/useWorkspacesPageView.js";
|
|
6
|
+
import { nativeImpact as ne, nativeNotify as r } from "../utils/nativeBridge.js";
|
|
7
|
+
import { useWorkspacePermissions as re } from "../hooks/useWorkspacePermissions.js";
|
|
8
|
+
import { useProject as ie, useProjectMembersCount as ae } from "../hooks/useProjects.js";
|
|
9
|
+
import { useArchiveProject as oe, useDeleteProject as se, useTagProject as ce, useUnarchiveProject as le, useUntagProject as ue, useUpdateProject as de } from "../hooks/useProjectMutations.js";
|
|
10
|
+
import { formatDate as i } from "../utils/formatters.js";
|
|
11
|
+
import { getProjectDisplayTags as fe, toProjectTag as a } from "../utils/projectTags.js";
|
|
12
|
+
import { useWorkspaceActivity as pe } from "../hooks/useWorkspaceActivity.js";
|
|
13
|
+
import { ProjectTagsWidget as o } from "../components/tags/ProjectTagsWidget.js";
|
|
14
|
+
import { ProjectMemberPickerDialog as s } from "../components/ProjectMemberPickerDialog.js";
|
|
15
|
+
import { useMemo as c, useState as l } from "react";
|
|
16
|
+
import { Activity as u, Archive as d, ArrowLeft as f, Clock as p, FolderKanban as m, MoreVertical as me, UserPlus as he, Users as h } from "lucide-react";
|
|
17
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
18
|
+
import { AlertDialog as ge, AlertDialogAction as _e, AlertDialogCancel as ve, AlertDialogContent as ye, AlertDialogDescription as be, AlertDialogFooter as xe, AlertDialogHeader as Se, AlertDialogTitle as Ce, Badge as v, Button as y, CardContent as b, CardHeader as x, CardTitle as S, DropdownMenu as C, DropdownMenuContent as w, DropdownMenuItem as T, DropdownMenuSeparator as E, DropdownMenuTrigger as D, EntityIdModal as O, GlassCard as k, ShowMore as A, Skeleton as j, useEntityIdModal as we } from "@burdenoff/fe-libs/ui";
|
|
19
|
+
import { useNavigate as Te, useParams as Ee } from "react-router-dom";
|
|
20
|
+
import { useI18n as De } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
21
21
|
//#region src/pages/ProjectDetailPage.tsx
|
|
22
22
|
function M() {
|
|
23
|
-
let { t: M } =
|
|
24
|
-
|
|
23
|
+
let { t: M } = De(), N = we(), { workspaceId: P, projectId: F } = Ee();
|
|
24
|
+
te("workspaces.project-detail", {
|
|
25
25
|
workspaceId: P,
|
|
26
26
|
projectId: F,
|
|
27
27
|
requireParams: !0
|
|
28
28
|
});
|
|
29
|
-
let I =
|
|
29
|
+
let I = Te(), { basePath: L = "/workspaces" } = e(), { withCurrentSearch: R } = ee(), { data: z, isLoading: Oe, error: ke } = ie(F || "", P), [Ae, B] = l(!1), [V, H] = l(!1), { mutate: je, isPending: U } = oe(P), { mutate: Me, isPending: W } = le(P), { mutate: Ne, isPending: G } = se(P), { mutateAsync: Pe, isPending: Fe } = ce(P), { mutateAsync: Ie, isPending: Le } = ue(P), { mutateAsync: Re, isPending: ze } = de(P), { canViewProject: Be, canDeleteProject: K, canArchiveProject: q, canListProjectMembers: J, canAddProjectMember: Y, isLoading: Ve } = re(), { data: He } = ae(F || "", P), X = c(() => fe({
|
|
30
30
|
tags: z?.tags ?? [],
|
|
31
31
|
tagAssignments: z?.tagAssignments
|
|
32
|
-
}), [z?.tags, z?.tagAssignments]), { data:
|
|
33
|
-
if (
|
|
32
|
+
}), [z?.tags, z?.tagAssignments]), { data: Ue } = pe(P), We = (Ue ?? []).filter((e) => e.resourceId === F || e.resourceType?.toLowerCase() === "project").length, Ge = X;
|
|
33
|
+
if (Ve) return /* @__PURE__ */ _("div", {
|
|
34
34
|
className: "space-y-4 p-6",
|
|
35
|
-
children: [/* @__PURE__ */
|
|
35
|
+
children: [/* @__PURE__ */ g(j, { className: "h-10 w-1/3" }), /* @__PURE__ */ g(j, { className: "h-64" })]
|
|
36
36
|
});
|
|
37
|
-
if (!
|
|
37
|
+
if (!Be) return /* @__PURE__ */ g("div", {
|
|
38
38
|
className: "flex items-center justify-center min-h-[400px]",
|
|
39
|
-
children: /* @__PURE__ */
|
|
39
|
+
children: /* @__PURE__ */ _("div", {
|
|
40
40
|
className: "text-center space-y-2",
|
|
41
|
-
children: [/* @__PURE__ */
|
|
41
|
+
children: [/* @__PURE__ */ g("h2", {
|
|
42
42
|
className: "text-lg font-semibold",
|
|
43
|
-
children:
|
|
44
|
-
}), /* @__PURE__ */
|
|
43
|
+
children: n(M, "projectDetail.accessDenied", "Access Denied")
|
|
44
|
+
}), /* @__PURE__ */ g("p", {
|
|
45
45
|
className: "text-sm text-text-secondary",
|
|
46
|
-
children:
|
|
46
|
+
children: n(M, "projectDetail.noPermissionToViewProject", "You don't have permission to view this project.")
|
|
47
47
|
})]
|
|
48
48
|
})
|
|
49
49
|
});
|
|
50
50
|
let Z = () => {
|
|
51
51
|
I(R(`${L}/${P}/projects`));
|
|
52
|
-
},
|
|
53
|
-
z && (z.archived ?
|
|
52
|
+
}, Ke = () => {
|
|
53
|
+
z && (z.archived ? Me(z.id, { onError: (e) => {
|
|
54
54
|
console.error("Failed to unarchive project:", e);
|
|
55
|
-
} }) :
|
|
55
|
+
} }) : je(z.id, { onError: (e) => {
|
|
56
56
|
console.error("Failed to archive project:", e);
|
|
57
57
|
} }));
|
|
58
|
-
},
|
|
59
|
-
z && (
|
|
58
|
+
}, qe = () => {
|
|
59
|
+
z && (ne("medium"), Ne(z.id, {
|
|
60
60
|
onSuccess: () => {
|
|
61
|
-
|
|
61
|
+
r("success"), B(!1), I(R(`${L}/${P}/projects`));
|
|
62
62
|
},
|
|
63
63
|
onError: (e) => {
|
|
64
|
-
|
|
64
|
+
r("error"), console.error("Failed to delete project:", e);
|
|
65
65
|
}
|
|
66
66
|
}));
|
|
67
67
|
}, Q = () => {
|
|
68
68
|
I(R(`${L}/${P}/projects/${F}/members`));
|
|
69
69
|
}, $ = async (e) => {
|
|
70
70
|
if (!z) return;
|
|
71
|
-
let t = e.map((e) =>
|
|
71
|
+
let t = e.map((e) => a(e));
|
|
72
72
|
try {
|
|
73
|
-
await
|
|
73
|
+
await Re({
|
|
74
74
|
id: z.id,
|
|
75
75
|
input: { tags: t }
|
|
76
76
|
});
|
|
77
77
|
} catch (e) {
|
|
78
|
-
|
|
78
|
+
r("warning"), console.error("Failed to sync legacy project tag mirror after updating structured project tags:", e);
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
|
-
return
|
|
81
|
+
return Oe ? /* @__PURE__ */ _("div", {
|
|
82
82
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
83
83
|
children: [
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ g(j, { className: "h-10 w-32" }),
|
|
85
|
+
/* @__PURE__ */ g(j, { className: "h-10 w-1/3" }),
|
|
86
|
+
/* @__PURE__ */ _("div", {
|
|
87
87
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
88
88
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
/* @__PURE__ */
|
|
91
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ g(j, { className: "h-32" }),
|
|
90
|
+
/* @__PURE__ */ g(j, { className: "h-32" }),
|
|
91
|
+
/* @__PURE__ */ g(j, { className: "h-32" })
|
|
92
92
|
]
|
|
93
93
|
}),
|
|
94
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ g(j, { className: "h-48" })
|
|
95
95
|
]
|
|
96
|
-
}) :
|
|
96
|
+
}) : ke || !z ? /* @__PURE__ */ _("div", {
|
|
97
97
|
className: "space-y-4 p-6",
|
|
98
|
-
children: [/* @__PURE__ */
|
|
98
|
+
children: [/* @__PURE__ */ _(y, {
|
|
99
99
|
variant: "ghost",
|
|
100
100
|
onClick: Z,
|
|
101
101
|
className: "gap-2",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
103
|
-
}), /* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ g(f, { size: 20 }), n(M, "projectDetail.backToProjects", "Back to Projects")]
|
|
103
|
+
}), /* @__PURE__ */ _("div", {
|
|
104
104
|
className: "text-center py-12",
|
|
105
105
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ g("div", {
|
|
107
107
|
className: "rounded-full bg-bg-sunken p-6 mb-4 inline-block",
|
|
108
|
-
children: /* @__PURE__ */
|
|
108
|
+
children: /* @__PURE__ */ g(m, {
|
|
109
109
|
size: 48,
|
|
110
110
|
className: "text-text-secondary"
|
|
111
111
|
})
|
|
112
112
|
}),
|
|
113
|
-
/* @__PURE__ */
|
|
113
|
+
/* @__PURE__ */ g("h3", {
|
|
114
114
|
className: "text-lg font-semibold mb-2",
|
|
115
|
-
children:
|
|
115
|
+
children: n(M, "projectDetail.projectNotFound", "Project not found")
|
|
116
116
|
}),
|
|
117
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ g("p", {
|
|
118
118
|
className: "text-text-secondary max-w-sm mx-auto mb-4",
|
|
119
|
-
children:
|
|
119
|
+
children: n(M, "projectDetail.projectNotFoundDescription", "The project you're looking for doesn't exist or you don't have permission to view it.")
|
|
120
120
|
}),
|
|
121
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ _(y, {
|
|
122
122
|
onClick: Z,
|
|
123
|
-
children: [/* @__PURE__ */
|
|
123
|
+
children: [/* @__PURE__ */ g(f, {
|
|
124
124
|
size: 16,
|
|
125
125
|
className: "mr-2"
|
|
126
|
-
}),
|
|
126
|
+
}), n(M, "projectDetail.backToProjects", "Back to Projects")]
|
|
127
127
|
})
|
|
128
128
|
]
|
|
129
129
|
})]
|
|
130
|
-
}) : /* @__PURE__ */
|
|
130
|
+
}) : /* @__PURE__ */ _("div", {
|
|
131
131
|
className: "space-y-4 sm:space-y-6 p-3 sm:p-6",
|
|
132
132
|
children: [
|
|
133
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ _("div", {
|
|
134
134
|
className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
|
|
135
|
-
children: [/* @__PURE__ */
|
|
136
|
-
/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ _("div", { children: [
|
|
136
|
+
/* @__PURE__ */ _(y, {
|
|
137
137
|
variant: "ghost",
|
|
138
138
|
onClick: Z,
|
|
139
139
|
className: "gap-2 mb-2 -ml-2",
|
|
140
|
-
children: [/* @__PURE__ */
|
|
140
|
+
children: [/* @__PURE__ */ g(f, { size: 20 }), n(M, "projectDetail.backToProjects", "Back to Projects")]
|
|
141
141
|
}),
|
|
142
|
-
/* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ _("div", {
|
|
143
143
|
className: "flex items-center gap-3",
|
|
144
|
-
children: [/* @__PURE__ */
|
|
144
|
+
children: [/* @__PURE__ */ g("div", {
|
|
145
145
|
className: "p-3 rounded-lg bg-action-primary-bg/10",
|
|
146
|
-
children: /* @__PURE__ */
|
|
146
|
+
children: /* @__PURE__ */ g(m, {
|
|
147
147
|
className: "text-primary",
|
|
148
148
|
size: 28
|
|
149
149
|
})
|
|
150
|
-
}), /* @__PURE__ */
|
|
150
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
|
|
151
151
|
className: "text-2xl sm:text-3xl font-bold",
|
|
152
152
|
children: z.name
|
|
153
|
-
}), /* @__PURE__ */
|
|
153
|
+
}), /* @__PURE__ */ g("p", {
|
|
154
154
|
className: "text-sm text-text-secondary font-mono",
|
|
155
155
|
children: z.key
|
|
156
156
|
})] })]
|
|
157
157
|
}),
|
|
158
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ _("div", {
|
|
159
159
|
className: "flex items-center gap-2 mt-3",
|
|
160
|
-
children: [/* @__PURE__ */
|
|
160
|
+
children: [/* @__PURE__ */ g(v, {
|
|
161
161
|
className: `border ${t(z.status)}`,
|
|
162
162
|
children: z.status
|
|
163
|
-
}), z.archived && /* @__PURE__ */ v
|
|
163
|
+
}), z.archived && /* @__PURE__ */ _(v, {
|
|
164
164
|
variant: "outline",
|
|
165
165
|
className: "border-workspace-archived-border text-workspace-archived-text",
|
|
166
|
-
children: [/* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ g(d, {
|
|
167
167
|
size: 12,
|
|
168
168
|
className: "mr-1"
|
|
169
|
-
}),
|
|
169
|
+
}), n(M, "projectDetail.archived", "Archived")]
|
|
170
170
|
})]
|
|
171
171
|
})
|
|
172
|
-
] }), /* @__PURE__ */
|
|
172
|
+
] }), /* @__PURE__ */ g("div", {
|
|
173
173
|
className: "flex items-center gap-2",
|
|
174
|
-
children: /* @__PURE__ */
|
|
174
|
+
children: /* @__PURE__ */ _(C, { children: [/* @__PURE__ */ g(D, {
|
|
175
175
|
asChild: !0,
|
|
176
|
-
children: /* @__PURE__ */
|
|
176
|
+
children: /* @__PURE__ */ g(y, {
|
|
177
177
|
variant: "outline",
|
|
178
178
|
size: "icon",
|
|
179
|
-
"aria-label":
|
|
180
|
-
children: /* @__PURE__ */
|
|
179
|
+
"aria-label": n(M, "projectDetail.openProjectActionsAriaLabel", "Open project actions"),
|
|
180
|
+
children: /* @__PURE__ */ g(me, { size: 20 })
|
|
181
181
|
})
|
|
182
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ _(w, {
|
|
183
183
|
align: "end",
|
|
184
184
|
children: [
|
|
185
|
-
q && /* @__PURE__ */
|
|
186
|
-
onClick:
|
|
185
|
+
q && /* @__PURE__ */ _(T, {
|
|
186
|
+
onClick: Ke,
|
|
187
187
|
disabled: U || W,
|
|
188
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ g(d, {
|
|
189
189
|
size: 16,
|
|
190
190
|
className: "mr-2"
|
|
191
|
-
}), U || W ?
|
|
191
|
+
}), U || W ? n(M, "projectDetail.processing", "Processing...") : z.archived ? n(M, "projectDetail.unarchive", "Unarchive") : n(M, "projectDetail.archive", "Archive")]
|
|
192
192
|
}),
|
|
193
|
-
q && K && /* @__PURE__ */
|
|
194
|
-
K && /* @__PURE__ */
|
|
193
|
+
q && K && /* @__PURE__ */ g(E, {}),
|
|
194
|
+
K && /* @__PURE__ */ g(T, {
|
|
195
195
|
onClick: () => B(!0),
|
|
196
196
|
className: "text-status-error-text",
|
|
197
|
-
children:
|
|
197
|
+
children: n(M, "projectDetail.deleteProject", "Delete Project")
|
|
198
198
|
})
|
|
199
199
|
]
|
|
200
200
|
})] })
|
|
201
201
|
})]
|
|
202
202
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
-
className: "grid grid-cols-1
|
|
205
|
-
children: [/* @__PURE__ */
|
|
206
|
-
className: "
|
|
207
|
-
children: /* @__PURE__ */
|
|
208
|
-
className: "
|
|
209
|
-
children: [/* @__PURE__ */ _(
|
|
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
|
-
className: "text-text-secondary"
|
|
252
|
-
}), r(M, "projectDetail.activityCardTitle", "Activity")]
|
|
253
|
-
})
|
|
254
|
-
}), /* @__PURE__ */ v(S, { children: [/* @__PURE__ */ _("p", {
|
|
255
|
-
className: "text-3xl font-bold",
|
|
256
|
-
children: Ue
|
|
257
|
-
}), /* @__PURE__ */ _("p", {
|
|
258
|
-
className: "text-sm text-text-secondary",
|
|
259
|
-
children: r(M, "projectDetail.recentActivityItems", "Recent activity items")
|
|
260
|
-
})] })] })]
|
|
261
|
-
}),
|
|
262
|
-
/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, { children: r(M, "projectDetail.tagsTitle", "Tags") }) }), /* @__PURE__ */ v(S, {
|
|
263
|
-
className: "space-y-3",
|
|
264
|
-
children: [/* @__PURE__ */ _("p", {
|
|
265
|
-
className: "text-sm text-text-secondary",
|
|
266
|
-
children: r(M, "projectDetail.tagsDescription", "Use universal tags to classify and filter this project across the workspace.")
|
|
267
|
-
}), /* @__PURE__ */ _(s, {
|
|
268
|
-
entityType: "Project",
|
|
269
|
-
entityId: z.id,
|
|
270
|
-
workspaceId: P,
|
|
271
|
-
tags: We,
|
|
272
|
-
onAdd: async (e) => {
|
|
273
|
-
if (z) try {
|
|
274
|
-
await Ne({
|
|
275
|
-
entityId: z.id,
|
|
276
|
-
tagId: e.id
|
|
277
|
-
}), await $([...X, o(e)]);
|
|
278
|
-
} catch (e) {
|
|
279
|
-
throw i("error"), e;
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
onRemove: async (e) => {
|
|
283
|
-
if (!z) return;
|
|
284
|
-
let t = z.tagAssignments?.find((t) => t.tagId === e)?.id;
|
|
285
|
-
try {
|
|
286
|
-
await Fe({
|
|
287
|
-
entityId: z.id,
|
|
288
|
-
tagId: e,
|
|
289
|
-
assignmentId: t
|
|
290
|
-
}), await $(X.filter((t) => t.tagId !== e && t.id !== e));
|
|
291
|
-
} catch (e) {
|
|
292
|
-
throw i("error"), e;
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
className: Pe || Ie || Re ? "pointer-events-none opacity-75" : void 0
|
|
296
|
-
})]
|
|
297
|
-
})] }),
|
|
298
|
-
/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, { children: r(M, "projectDetail.projectInformation", "Project Information") }) }), /* @__PURE__ */ v(S, {
|
|
299
|
-
className: "space-y-4",
|
|
300
|
-
children: [/* @__PURE__ */ v("div", {
|
|
301
|
-
className: "grid grid-cols-1 sm:grid-cols-2 gap-4 text-sm",
|
|
302
|
-
children: [
|
|
303
|
-
/* @__PURE__ */ v("div", {
|
|
304
|
-
className: "space-y-1",
|
|
305
|
-
children: [/* @__PURE__ */ v("span", {
|
|
306
|
-
className: "text-text-secondary flex items-center gap-2",
|
|
307
|
-
children: [/* @__PURE__ */ _(h, { size: 14 }), r(M, "projectDetail.projectId", "Project ID")]
|
|
308
|
-
}), /* @__PURE__ */ _("button", {
|
|
309
|
-
type: "button",
|
|
310
|
-
onClick: () => N.show({
|
|
311
|
-
id: z.id,
|
|
312
|
-
name: z.name,
|
|
313
|
-
type: "Project",
|
|
314
|
-
details: z.key ? [{
|
|
315
|
-
label: "Key",
|
|
316
|
-
value: z.key
|
|
317
|
-
}] : void 0
|
|
318
|
-
}),
|
|
319
|
-
className: "inline-flex items-center gap-1.5 text-xs font-medium text-text-link hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded",
|
|
320
|
-
children: r(M, "projectDetail.getId", "Get ID")
|
|
321
|
-
})]
|
|
322
|
-
}),
|
|
323
|
-
/* @__PURE__ */ v("div", {
|
|
324
|
-
className: "space-y-1",
|
|
325
|
-
children: [/* @__PURE__ */ v("span", {
|
|
326
|
-
className: "text-text-secondary flex items-center gap-2",
|
|
327
|
-
children: [/* @__PURE__ */ _(h, { size: 14 }), r(M, "projectDetail.projectKey", "Project Key")]
|
|
328
|
-
}), /* @__PURE__ */ _("span", {
|
|
329
|
-
className: "font-medium",
|
|
330
|
-
children: z.key
|
|
203
|
+
/* @__PURE__ */ _("div", {
|
|
204
|
+
className: "grid grid-cols-1 lg:grid-cols-3 gap-4 sm:gap-6",
|
|
205
|
+
children: [/* @__PURE__ */ _("div", {
|
|
206
|
+
className: "lg:col-span-2 space-y-4 sm:space-y-6",
|
|
207
|
+
children: [/* @__PURE__ */ _("div", {
|
|
208
|
+
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
209
|
+
children: [/* @__PURE__ */ _(k, {
|
|
210
|
+
treatment: "metric",
|
|
211
|
+
children: [/* @__PURE__ */ g(x, {
|
|
212
|
+
className: "flex flex-row items-center justify-between pb-2",
|
|
213
|
+
children: /* @__PURE__ */ _(S, {
|
|
214
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-secondary",
|
|
215
|
+
children: [/* @__PURE__ */ g(h, {
|
|
216
|
+
size: 18,
|
|
217
|
+
className: "text-text-muted"
|
|
218
|
+
}), n(M, "projectDetail.membersCardTitle", "Members")]
|
|
219
|
+
})
|
|
220
|
+
}), /* @__PURE__ */ _(b, {
|
|
221
|
+
className: "space-y-4",
|
|
222
|
+
children: [
|
|
223
|
+
/* @__PURE__ */ g("p", {
|
|
224
|
+
className: "text-3xl font-bold tabular-nums",
|
|
225
|
+
children: He ?? 0
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ g("p", {
|
|
228
|
+
className: "text-sm text-text-muted",
|
|
229
|
+
children: n(M, "projectDetail.projectMembers", "Project members")
|
|
230
|
+
}),
|
|
231
|
+
Y || J ? /* @__PURE__ */ _("div", {
|
|
232
|
+
className: "flex flex-wrap gap-2",
|
|
233
|
+
children: [Y ? /* @__PURE__ */ _(y, {
|
|
234
|
+
size: "sm",
|
|
235
|
+
onClick: () => H(!0),
|
|
236
|
+
children: [/* @__PURE__ */ g(he, {
|
|
237
|
+
size: 16,
|
|
238
|
+
className: "mr-2"
|
|
239
|
+
}), n(M, "projectDetail.addProjectMember", "Add Member")]
|
|
240
|
+
}) : null, J ? /* @__PURE__ */ _(y, {
|
|
241
|
+
variant: "outline",
|
|
242
|
+
size: "sm",
|
|
243
|
+
onClick: Q,
|
|
244
|
+
children: [/* @__PURE__ */ g(h, {
|
|
245
|
+
size: 16,
|
|
246
|
+
className: "mr-2"
|
|
247
|
+
}), n(M, "projectDetail.manageProjectMembers", "Manage Members")]
|
|
248
|
+
}) : null]
|
|
249
|
+
}) : null
|
|
250
|
+
]
|
|
331
251
|
})]
|
|
332
|
-
}),
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
252
|
+
}), /* @__PURE__ */ _(k, {
|
|
253
|
+
treatment: "metric",
|
|
254
|
+
children: [/* @__PURE__ */ g(x, {
|
|
255
|
+
className: "flex flex-row items-center justify-between pb-2",
|
|
256
|
+
children: /* @__PURE__ */ _(S, {
|
|
257
|
+
className: "flex items-center gap-2 text-sm font-medium text-text-secondary",
|
|
258
|
+
children: [/* @__PURE__ */ g(u, {
|
|
259
|
+
size: 18,
|
|
260
|
+
className: "text-text-muted"
|
|
261
|
+
}), n(M, "projectDetail.activityCardTitle", "Activity")]
|
|
262
|
+
})
|
|
263
|
+
}), /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g("p", {
|
|
264
|
+
className: "text-3xl font-bold tabular-nums",
|
|
265
|
+
children: We
|
|
266
|
+
}), /* @__PURE__ */ g("p", {
|
|
267
|
+
className: "text-sm text-text-muted",
|
|
268
|
+
children: n(M, "projectDetail.recentActivityItems", "Recent activity items")
|
|
269
|
+
})] })]
|
|
270
|
+
})]
|
|
271
|
+
}), /* @__PURE__ */ _(k, {
|
|
272
|
+
treatment: "plain",
|
|
273
|
+
className: "border-border-seam",
|
|
274
|
+
children: [/* @__PURE__ */ g(x, { children: /* @__PURE__ */ g(S, { children: n(M, "projectDetail.tagsTitle", "Tags") }) }), /* @__PURE__ */ _(b, {
|
|
275
|
+
className: "space-y-3",
|
|
276
|
+
children: [/* @__PURE__ */ g("p", {
|
|
277
|
+
className: "text-sm text-text-muted",
|
|
278
|
+
children: n(M, "projectDetail.tagsDescription", "Use universal tags to classify and filter this project across the workspace.")
|
|
279
|
+
}), /* @__PURE__ */ g(o, {
|
|
280
|
+
entityType: "Project",
|
|
281
|
+
entityId: z.id,
|
|
282
|
+
workspaceId: P,
|
|
283
|
+
tags: Ge,
|
|
284
|
+
onAdd: async (e) => {
|
|
285
|
+
if (z) try {
|
|
286
|
+
await Pe({
|
|
287
|
+
entityId: z.id,
|
|
288
|
+
tagId: e.id
|
|
289
|
+
}), await $([...X, a(e)]);
|
|
290
|
+
} catch (e) {
|
|
291
|
+
throw r("error"), e;
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
onRemove: async (e) => {
|
|
295
|
+
if (!z) return;
|
|
296
|
+
let t = z.tagAssignments?.find((t) => t.tagId === e)?.id;
|
|
297
|
+
try {
|
|
298
|
+
await Ie({
|
|
299
|
+
entityId: z.id,
|
|
300
|
+
tagId: e,
|
|
301
|
+
assignmentId: t
|
|
302
|
+
}), await $(X.filter((t) => t.tagId !== e && t.id !== e));
|
|
303
|
+
} catch (e) {
|
|
304
|
+
throw r("error"), e;
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
className: Fe || Le || ze ? "pointer-events-none opacity-75" : void 0
|
|
365
308
|
})]
|
|
366
|
-
})
|
|
367
|
-
]
|
|
368
|
-
}), z.config && Object.keys(z.config).length > 0 && /* @__PURE__ */ v("div", {
|
|
369
|
-
className: "pt-4 border-t",
|
|
370
|
-
children: [/* @__PURE__ */ _("h4", {
|
|
371
|
-
className: "text-sm font-medium mb-2",
|
|
372
|
-
children: r(M, "projectDetail.configuration", "Configuration")
|
|
373
|
-
}), /* @__PURE__ */ _("pre", {
|
|
374
|
-
className: "text-xs bg-bg-sunken p-3 rounded-lg overflow-auto",
|
|
375
|
-
children: JSON.stringify(z.config, null, 2)
|
|
309
|
+
})]
|
|
376
310
|
})]
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
311
|
+
}), /* @__PURE__ */ g("aside", {
|
|
312
|
+
className: "lg:sticky lg:top-6 lg:self-start",
|
|
313
|
+
children: /* @__PURE__ */ _(k, {
|
|
314
|
+
treatment: "plain",
|
|
315
|
+
className: "border-border-seam",
|
|
316
|
+
children: [/* @__PURE__ */ g(x, { children: /* @__PURE__ */ g(S, { children: n(M, "projectDetail.projectInformation", "Project Information") }) }), /* @__PURE__ */ _(b, {
|
|
317
|
+
className: "space-y-4",
|
|
318
|
+
children: [
|
|
319
|
+
/* @__PURE__ */ _("div", {
|
|
320
|
+
className: "grid grid-cols-1 gap-4 text-sm",
|
|
321
|
+
children: [
|
|
322
|
+
/* @__PURE__ */ _("div", {
|
|
323
|
+
className: "space-y-1",
|
|
324
|
+
children: [/* @__PURE__ */ _("span", {
|
|
325
|
+
className: "text-text-muted flex items-center gap-2",
|
|
326
|
+
children: [/* @__PURE__ */ g(m, { size: 14 }), n(M, "projectDetail.projectId", "Project ID")]
|
|
327
|
+
}), /* @__PURE__ */ g("button", {
|
|
328
|
+
type: "button",
|
|
329
|
+
onClick: () => N.show({
|
|
330
|
+
id: z.id,
|
|
331
|
+
name: z.name,
|
|
332
|
+
type: "Project",
|
|
333
|
+
details: z.key ? [{
|
|
334
|
+
label: "Key",
|
|
335
|
+
value: z.key
|
|
336
|
+
}] : void 0
|
|
337
|
+
}),
|
|
338
|
+
className: "inline-flex items-center gap-1.5 text-xs font-medium text-text-link hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded",
|
|
339
|
+
children: n(M, "projectDetail.getId", "Get ID")
|
|
340
|
+
})]
|
|
341
|
+
}),
|
|
342
|
+
/* @__PURE__ */ _("div", {
|
|
343
|
+
className: "space-y-1",
|
|
344
|
+
children: [/* @__PURE__ */ _("span", {
|
|
345
|
+
className: "text-text-secondary flex items-center gap-2",
|
|
346
|
+
children: [/* @__PURE__ */ g(m, { size: 14 }), n(M, "projectDetail.projectKey", "Project Key")]
|
|
347
|
+
}), /* @__PURE__ */ g("span", {
|
|
348
|
+
className: "font-medium",
|
|
349
|
+
children: z.key
|
|
350
|
+
})]
|
|
351
|
+
}),
|
|
352
|
+
/* @__PURE__ */ _("div", {
|
|
353
|
+
className: "space-y-1",
|
|
354
|
+
children: [/* @__PURE__ */ _("span", {
|
|
355
|
+
className: "text-text-secondary flex items-center gap-2",
|
|
356
|
+
children: [/* @__PURE__ */ g(p, { size: 14 }), n(M, "projectDetail.created", "Created")]
|
|
357
|
+
}), /* @__PURE__ */ g("span", { children: i(z.createdAt) })]
|
|
358
|
+
}),
|
|
359
|
+
/* @__PURE__ */ _("div", {
|
|
360
|
+
className: "space-y-1",
|
|
361
|
+
children: [/* @__PURE__ */ _("span", {
|
|
362
|
+
className: "text-text-secondary flex items-center gap-2",
|
|
363
|
+
children: [/* @__PURE__ */ g(p, { size: 14 }), n(M, "projectDetail.lastUpdated", "Last Updated")]
|
|
364
|
+
}), /* @__PURE__ */ g("span", { children: i(z.updatedAt) })]
|
|
365
|
+
}),
|
|
366
|
+
/* @__PURE__ */ _("div", {
|
|
367
|
+
className: "space-y-1",
|
|
368
|
+
children: [/* @__PURE__ */ _("span", {
|
|
369
|
+
className: "text-text-secondary flex items-center gap-2",
|
|
370
|
+
children: [/* @__PURE__ */ g(h, { size: 14 }), n(M, "projectDetail.workspaceId", "Workspace ID")]
|
|
371
|
+
}), /* @__PURE__ */ g("span", {
|
|
372
|
+
className: "font-mono text-xs block",
|
|
373
|
+
children: z.workspaceId
|
|
374
|
+
})]
|
|
375
|
+
}),
|
|
376
|
+
/* @__PURE__ */ _("div", {
|
|
377
|
+
className: "space-y-1",
|
|
378
|
+
children: [/* @__PURE__ */ _("span", {
|
|
379
|
+
className: "text-text-secondary flex items-center gap-2",
|
|
380
|
+
children: [/* @__PURE__ */ g(h, { size: 14 }), n(M, "projectDetail.creatorId", "Creator ID")]
|
|
381
|
+
}), /* @__PURE__ */ g("span", {
|
|
382
|
+
className: "font-mono text-xs block",
|
|
383
|
+
children: z.creatorId
|
|
384
|
+
})]
|
|
385
|
+
})
|
|
386
|
+
]
|
|
387
|
+
}),
|
|
388
|
+
z.config && Object.keys(z.config).length > 0 && /* @__PURE__ */ _("div", {
|
|
389
|
+
className: "pt-4 border-t border-border-seam",
|
|
390
|
+
children: [/* @__PURE__ */ g("h4", {
|
|
391
|
+
className: "text-sm font-medium mb-2",
|
|
392
|
+
children: n(M, "projectDetail.configuration", "Configuration")
|
|
393
|
+
}), /* @__PURE__ */ g("pre", {
|
|
394
|
+
className: "text-xs bg-bg-sunken p-3 rounded-lg overflow-auto",
|
|
395
|
+
children: JSON.stringify(z.config, null, 2)
|
|
396
|
+
})]
|
|
397
|
+
}),
|
|
398
|
+
/* @__PURE__ */ g(A, {
|
|
399
|
+
collapsedHeight: 0,
|
|
400
|
+
label: n(M, "projectDetail.quickActions", "Quick Actions"),
|
|
401
|
+
children: /* @__PURE__ */ _("div", {
|
|
402
|
+
className: "flex flex-col gap-2 pt-2",
|
|
403
|
+
children: [
|
|
404
|
+
J ? /* @__PURE__ */ _(y, {
|
|
405
|
+
variant: "outline",
|
|
406
|
+
size: "sm",
|
|
407
|
+
className: "justify-start",
|
|
408
|
+
onClick: Q,
|
|
409
|
+
children: [/* @__PURE__ */ g(h, {
|
|
410
|
+
size: 16,
|
|
411
|
+
className: "mr-2"
|
|
412
|
+
}), n(M, "projectDetail.projectMembersPage", "Project Members")]
|
|
413
|
+
}) : null,
|
|
414
|
+
/* @__PURE__ */ _(y, {
|
|
415
|
+
variant: "outline",
|
|
416
|
+
size: "sm",
|
|
417
|
+
className: "justify-start",
|
|
418
|
+
onClick: () => I(R(`${L}/${P}/members`)),
|
|
419
|
+
children: [/* @__PURE__ */ g(h, {
|
|
420
|
+
size: 16,
|
|
421
|
+
className: "mr-2"
|
|
422
|
+
}), n(M, "projectDetail.workspaceMembers", "Workspace Members")]
|
|
423
|
+
}),
|
|
424
|
+
/* @__PURE__ */ _(y, {
|
|
425
|
+
variant: "outline",
|
|
426
|
+
size: "sm",
|
|
427
|
+
className: "justify-start",
|
|
428
|
+
onClick: () => I(R(`${L}/${P}/activity`)),
|
|
429
|
+
children: [/* @__PURE__ */ g(u, {
|
|
430
|
+
size: 16,
|
|
431
|
+
className: "mr-2"
|
|
432
|
+
}), n(M, "projectDetail.workspaceActivity", "Workspace Activity")]
|
|
433
|
+
})
|
|
434
|
+
]
|
|
435
|
+
})
|
|
436
|
+
})
|
|
437
|
+
]
|
|
438
|
+
})]
|
|
408
439
|
})
|
|
409
|
-
]
|
|
410
|
-
})
|
|
411
|
-
/* @__PURE__ */
|
|
412
|
-
open:
|
|
440
|
+
})]
|
|
441
|
+
}),
|
|
442
|
+
/* @__PURE__ */ g(ge, {
|
|
443
|
+
open: Ae,
|
|
413
444
|
onOpenChange: B,
|
|
414
|
-
children: /* @__PURE__ */
|
|
445
|
+
children: /* @__PURE__ */ _(ye, { children: [/* @__PURE__ */ _(Se, { children: [/* @__PURE__ */ g(Ce, { children: n(M, "projectDetail.deleteDialogTitle", "Delete Project") }), /* @__PURE__ */ g(be, { children: n(M, "projectDetail.deleteConfirmPrefix", "Are you sure you want to delete \"") + z.name + n(M, "projectDetail.deleteConfirmSuffix", "\"? This action cannot be undone and all project data will be permanently removed.") })] }), /* @__PURE__ */ _(xe, { children: [/* @__PURE__ */ g(ve, {
|
|
415
446
|
disabled: G,
|
|
416
|
-
children:
|
|
417
|
-
}), /* @__PURE__ */
|
|
418
|
-
onClick:
|
|
447
|
+
children: n(M, "projectDetail.cancel", "Cancel")
|
|
448
|
+
}), /* @__PURE__ */ g(_e, {
|
|
449
|
+
onClick: qe,
|
|
419
450
|
disabled: G,
|
|
420
451
|
className: "bg-status-error-bg text-status-error-text hover:bg-status-error-bg/90",
|
|
421
|
-
children: G ?
|
|
452
|
+
children: G ? n(M, "projectDetail.deleting", "Deleting...") : n(M, "projectDetail.deleteProject", "Delete Project")
|
|
422
453
|
})] })] })
|
|
423
454
|
}),
|
|
424
|
-
P && F && V ? /* @__PURE__ */
|
|
455
|
+
P && F && V ? /* @__PURE__ */ g(s, {
|
|
425
456
|
open: V,
|
|
426
457
|
onOpenChange: H,
|
|
427
458
|
workspaceId: P,
|
|
428
459
|
projectId: F,
|
|
429
460
|
projectName: z.name
|
|
430
461
|
}) : null,
|
|
431
|
-
/* @__PURE__ */
|
|
462
|
+
/* @__PURE__ */ g(O, { control: N })
|
|
432
463
|
]
|
|
433
464
|
});
|
|
434
465
|
}
|