@burdenoff/microfe-workspaces 2026.519.1 → 2026.528.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/WorkspacesRoot.js +4 -1
- package/dist/WorkspacesRoot.js.map +1 -1
- package/dist/WorkspacesRoutes.js +4 -4
- package/dist/WorkspacesRoutes.js.map +1 -1
- package/dist/components/CreateProjectDialog.js +1 -1
- package/dist/components/CreateProjectDialog.js.map +1 -1
- package/dist/components/CreateWorkspaceDialog.js +2 -2
- package/dist/components/CreateWorkspaceDialog.js.map +1 -1
- package/dist/components/InviteMemberDialog.js +2 -2
- package/dist/components/InviteMemberDialog.js.map +1 -1
- package/dist/components/MemberListItem.js +71 -86
- package/dist/components/MemberListItem.js.map +1 -1
- package/dist/components/ProjectCard.js +12 -10
- package/dist/components/ProjectCard.js.map +1 -1
- package/dist/components/WorkspaceCard.js.map +1 -1
- package/dist/components/WorkspacesErrorBoundary.js +12 -4
- package/dist/components/WorkspacesErrorBoundary.js.map +1 -1
- package/dist/components/tags/ProjectTagsWidget.js +248 -0
- package/dist/components/tags/ProjectTagsWidget.js.map +1 -0
- package/dist/generated/global-operations.js +9 -1
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/hooks/useOrgsWithPermission.js +55 -0
- package/dist/hooks/useOrgsWithPermission.js.map +1 -0
- package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -1
- package/dist/hooks/useWorkspacesPageView.js +6 -4
- package/dist/hooks/useWorkspacesPageView.js.map +1 -1
- package/dist/pages/CreateWorkspacePage.js +173 -149
- package/dist/pages/CreateWorkspacePage.js.map +1 -1
- package/dist/pages/InviteAcceptancePage.js +28 -28
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +380 -352
- package/dist/pages/MembersListPage.js.map +1 -1
- package/dist/pages/ProjectDetailPage.js +96 -97
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +307 -304
- package/dist/pages/ProjectsListPage.js.map +1 -1
- package/dist/pages/WorkspaceSettingsPage.js +94 -91
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
- package/dist/pages/WorkspacesListPage.js +1 -1
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/pages/dashboard/DashboardCustomizer.js +68 -68
- package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
- package/dist/pages/dashboard/DashboardGrid.js +52 -41
- package/dist/pages/dashboard/DashboardGrid.js.map +1 -1
- package/dist/pages/dashboard/DashboardPage.js +74 -65
- package/dist/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/pages/dashboard/WidgetWrapper.js +3 -3
- package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
- package/dist/pages/dashboard/config.js +126 -30
- package/dist/pages/dashboard/config.js.map +1 -1
- package/dist/pages/dashboard/hooks/useDashboardData.js +39 -2
- package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -1
- package/dist/pages/dashboard/widgets/AgentsWidget.js +109 -0
- package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.js +6 -5
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/MembersWidget.js +6 -6
- package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/ProjectsWidget.js +8 -7
- package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js +72 -18
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js +3 -3
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/SessionsWidget.js +78 -0
- package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/StorageWidget.js +35 -20
- package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +2 -2
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TipsWidget.js +81 -22
- package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +6 -5
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/VibesWidget.js +64 -0
- package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +5 -5
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +3 -3
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js +6 -5
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
- package/dist/providers/WorkspacesProvider.js +1 -1
- package/dist/providers/WorkspacesProvider.js.map +1 -1
- package/dist/store/workspacesStore.js.map +1 -1
- package/dist/utils/formatters.js +21 -16
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/telemetryError.js +1 -1
- package/dist/utils/telemetryError.js.map +1 -1
- package/package.json +7 -7
- package/dist/WorkspacesRoot.d.ts +0 -35
- package/dist/WorkspacesRoot.d.ts.map +0 -1
- package/dist/WorkspacesRoutes.d.ts +0 -10
- package/dist/WorkspacesRoutes.d.ts.map +0 -1
- package/dist/components/CreateProjectDialog.d.ts +0 -6
- package/dist/components/CreateProjectDialog.d.ts.map +0 -1
- package/dist/components/CreateWorkspaceDialog.d.ts +0 -2
- package/dist/components/CreateWorkspaceDialog.d.ts.map +0 -1
- package/dist/components/InviteMemberDialog.d.ts +0 -7
- package/dist/components/InviteMemberDialog.d.ts.map +0 -1
- package/dist/components/MemberListItem.d.ts +0 -11
- package/dist/components/MemberListItem.d.ts.map +0 -1
- package/dist/components/ProjectCard.d.ts +0 -13
- package/dist/components/ProjectCard.d.ts.map +0 -1
- package/dist/components/WorkspaceCard.d.ts +0 -8
- package/dist/components/WorkspaceCard.d.ts.map +0 -1
- package/dist/components/WorkspacesErrorBoundary.d.ts +0 -27
- package/dist/components/WorkspacesErrorBoundary.d.ts.map +0 -1
- package/dist/components/index.d.ts +0 -8
- package/dist/components/index.d.ts.map +0 -1
- package/dist/constants/permissions.d.ts +0 -33
- package/dist/constants/permissions.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -279
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -23527
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2300
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -57851
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -8
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useMemberMutations.d.ts +0 -61
- package/dist/hooks/useMemberMutations.d.ts.map +0 -1
- package/dist/hooks/useProjectMutations.d.ts +0 -26
- package/dist/hooks/useProjectMutations.d.ts.map +0 -1
- package/dist/hooks/useProjects.d.ts +0 -16
- package/dist/hooks/useProjects.d.ts.map +0 -1
- package/dist/hooks/useScopedNavigation.d.ts +0 -4
- package/dist/hooks/useScopedNavigation.d.ts.map +0 -1
- package/dist/hooks/useTenants.d.ts +0 -13
- package/dist/hooks/useTenants.d.ts.map +0 -1
- package/dist/hooks/useWorkspaceActivity.d.ts +0 -12
- package/dist/hooks/useWorkspaceActivity.d.ts.map +0 -1
- package/dist/hooks/useWorkspaceMembers.d.ts +0 -24
- package/dist/hooks/useWorkspaceMembers.d.ts.map +0 -1
- package/dist/hooks/useWorkspaceMutations.d.ts +0 -36
- package/dist/hooks/useWorkspaceMutations.d.ts.map +0 -1
- package/dist/hooks/useWorkspacePermissions.d.ts +0 -29
- package/dist/hooks/useWorkspacePermissions.d.ts.map +0 -1
- package/dist/hooks/useWorkspaceRoles.d.ts +0 -8
- package/dist/hooks/useWorkspaceRoles.d.ts.map +0 -1
- package/dist/hooks/useWorkspaces.d.ts +0 -21
- package/dist/hooks/useWorkspaces.d.ts.map +0 -1
- package/dist/hooks/useWorkspacesEventEmitter.d.ts +0 -18
- package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +0 -1
- package/dist/hooks/useWorkspacesPageView.d.ts +0 -27
- package/dist/hooks/useWorkspacesPageView.d.ts.map +0 -1
- package/dist/index.d.ts +0 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/pages/ActivityListPage.d.ts +0 -2
- package/dist/pages/ActivityListPage.d.ts.map +0 -1
- package/dist/pages/CreateWorkspacePage.d.ts +0 -2
- package/dist/pages/CreateWorkspacePage.d.ts.map +0 -1
- package/dist/pages/InviteAcceptancePage.d.ts +0 -6
- package/dist/pages/InviteAcceptancePage.d.ts.map +0 -1
- package/dist/pages/MembersListPage.d.ts +0 -2
- package/dist/pages/MembersListPage.d.ts.map +0 -1
- package/dist/pages/ProjectDetailPage.d.ts +0 -2
- package/dist/pages/ProjectDetailPage.d.ts.map +0 -1
- package/dist/pages/ProjectsListPage.d.ts +0 -2
- package/dist/pages/ProjectsListPage.d.ts.map +0 -1
- package/dist/pages/WorkspaceDetailPage.d.ts +0 -2
- package/dist/pages/WorkspaceDetailPage.d.ts.map +0 -1
- package/dist/pages/WorkspaceSettingsPage.d.ts +0 -2
- package/dist/pages/WorkspaceSettingsPage.d.ts.map +0 -1
- package/dist/pages/WorkspacesListPage.d.ts +0 -2
- package/dist/pages/WorkspacesListPage.d.ts.map +0 -1
- package/dist/pages/dashboard/DashboardCustomizer.d.ts +0 -12
- package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +0 -1
- package/dist/pages/dashboard/DashboardGrid.d.ts +0 -8
- package/dist/pages/dashboard/DashboardGrid.d.ts.map +0 -1
- package/dist/pages/dashboard/DashboardPage.d.ts +0 -14
- package/dist/pages/dashboard/DashboardPage.d.ts.map +0 -1
- package/dist/pages/dashboard/WidgetWrapper.d.ts +0 -17
- package/dist/pages/dashboard/WidgetWrapper.d.ts.map +0 -1
- package/dist/pages/dashboard/config.d.ts +0 -9
- package/dist/pages/dashboard/config.d.ts.map +0 -1
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts +0 -9
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +0 -1
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +0 -4
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +0 -1
- package/dist/pages/dashboard/types.d.ts +0 -145
- package/dist/pages/dashboard/types.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js +0 -59
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +0 -1
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +0 -1
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +0 -4
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +0 -1
- package/dist/providers/WorkspacesProvider.d.ts +0 -13
- package/dist/providers/WorkspacesProvider.d.ts.map +0 -1
- package/dist/store/workspacesStore.d.ts +0 -82
- package/dist/store/workspacesStore.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -280
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/formatters.d.ts +0 -60
- package/dist/utils/formatters.d.ts.map +0 -1
- package/dist/utils/i18n.d.ts +0 -13
- package/dist/utils/i18n.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -3
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/nativeBridge.d.ts +0 -3
- package/dist/utils/nativeBridge.d.ts.map +0 -1
- package/dist/utils/projectTags.d.ts +0 -6
- package/dist/utils/projectTags.d.ts.map +0 -1
- package/dist/utils/slug.d.ts +0 -13
- package/dist/utils/slug.d.ts.map +0 -1
- package/dist/utils/telemetryError.d.ts +0 -2
- package/dist/utils/telemetryError.d.ts.map +0 -1
- package/dist/utils/tokenHelpers.d.ts +0 -114
- package/dist/utils/tokenHelpers.d.ts.map +0 -1
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { useWorkspacesPageView as e } from "../../hooks/useWorkspacesPageView.js";
|
|
2
|
-
import { useGlobalDashboardData as t, useProjectsDashboardData as n,
|
|
3
|
-
import { useUpdateDashboardPreferences as
|
|
4
|
-
import { DashboardGrid as a } from "./DashboardGrid.js";
|
|
2
|
+
import { useGlobalDashboardData as t, useProjectsDashboardData as n, useVibecontrolsDashboardData as r, useWorkspaceDashboardData as i } from "./hooks/useDashboardData.js";
|
|
3
|
+
import { useUpdateDashboardPreferences as a } from "./hooks/useDashboardPreferences.js";
|
|
5
4
|
import { getEffectiveWidgets as o } from "./config.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
5
|
+
import { DashboardGrid as s } from "./DashboardGrid.js";
|
|
6
|
+
import { DashboardCustomizer as c } from "./DashboardCustomizer.js";
|
|
7
|
+
import { useCallback as l, useMemo as u, useState as d } from "react";
|
|
8
|
+
import { AlertCircle as f, Loader2 as p, RefreshCw as m, Settings2 as h } from "lucide-react";
|
|
9
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
10
|
+
import { Button as v } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
12
|
//#region src/pages/dashboard/DashboardPage.tsx
|
|
13
|
-
function
|
|
13
|
+
function b({ navigate: b, authToken: x, currentUser: S, productId: C = "workspaces" }) {
|
|
14
14
|
e("workspaces.dashboard");
|
|
15
|
-
let { t:
|
|
16
|
-
let n =
|
|
15
|
+
let { t: w } = y(), T = (e, t) => {
|
|
16
|
+
let n = w(e);
|
|
17
17
|
return n === e ? t : n;
|
|
18
|
-
}, [
|
|
19
|
-
...
|
|
18
|
+
}, [E, D] = d(!1), { data: O, isLoading: k, error: A, refetch: j } = i(x), { data: M, isLoading: N, error: P, refetch: F } = t(x), { data: I, isLoading: L, refetch: R } = n(x), z = C === "vibecontrols", { data: B, isLoading: V, refetch: H } = r(x, z), U = a(x), W = k || N || L || V, G = u(() => !O && !M && !I && !B ? null : {
|
|
19
|
+
...O ?? {
|
|
20
20
|
workspaces: {
|
|
21
21
|
items: [],
|
|
22
22
|
total: 0
|
|
@@ -38,101 +38,110 @@ function y({ navigate: y, authToken: b, currentUser: x }) {
|
|
|
38
38
|
workflowStats: null,
|
|
39
39
|
storageUsage: null
|
|
40
40
|
},
|
|
41
|
-
workspaces:
|
|
41
|
+
workspaces: M?.workspaces ?? {
|
|
42
42
|
items: [],
|
|
43
43
|
total: 0
|
|
44
44
|
},
|
|
45
|
-
projects:
|
|
45
|
+
projects: I ?? {
|
|
46
46
|
items: [],
|
|
47
47
|
total: 0
|
|
48
|
-
}
|
|
48
|
+
},
|
|
49
|
+
recentVibes: B?.recentVibes,
|
|
50
|
+
activeSessions: B?.activeSessions,
|
|
51
|
+
agentFleet: B?.agentFleet ?? null
|
|
49
52
|
}, [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
O,
|
|
54
|
+
M,
|
|
55
|
+
I,
|
|
56
|
+
B
|
|
57
|
+
]), K = M?.dashboardPreferences, q = u(() => o(K?.widgets ?? null, C), [K, C]), J = l(() => {
|
|
58
|
+
j(), F(), R(), z && H();
|
|
55
59
|
}, [
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
j,
|
|
61
|
+
F,
|
|
62
|
+
R,
|
|
63
|
+
H,
|
|
64
|
+
z
|
|
65
|
+
]), Y = l(async (e) => {
|
|
66
|
+
await U.mutateAsync(e);
|
|
67
|
+
}, [U]), X = A || P;
|
|
68
|
+
return /* @__PURE__ */ _("div", {
|
|
63
69
|
className: "min-h-[calc(100vh-8rem)] p-4 md:p-6 bg-bg-canvas",
|
|
64
70
|
"data-tour": "main-content",
|
|
65
71
|
children: [
|
|
66
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ _("div", {
|
|
67
73
|
className: "flex flex-wrap items-center justify-between gap-4 mb-6",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
|
|
69
75
|
className: "text-xl font-bold text-text-primary",
|
|
70
|
-
children:
|
|
71
|
-
}), /* @__PURE__ */
|
|
76
|
+
children: T("dashboard.title", "Dashboard")
|
|
77
|
+
}), /* @__PURE__ */ g("p", {
|
|
72
78
|
className: "text-sm text-muted-foreground mt-0.5",
|
|
73
|
-
children:
|
|
74
|
-
})] }), /* @__PURE__ */
|
|
79
|
+
children: T("dashboard.subtitle", "Your workspace overview at a glance")
|
|
80
|
+
})] }), /* @__PURE__ */ _("div", {
|
|
75
81
|
className: "flex flex-wrap items-center gap-2",
|
|
76
82
|
"data-tour": "quick-actions",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ _(v, {
|
|
78
84
|
variant: "outline",
|
|
79
85
|
size: "sm",
|
|
80
|
-
onClick:
|
|
81
|
-
disabled:
|
|
86
|
+
onClick: J,
|
|
87
|
+
disabled: W,
|
|
82
88
|
className: "text-xs",
|
|
83
|
-
children: [
|
|
89
|
+
children: [W ? /* @__PURE__ */ g(p, { className: "size-3.5 sm:mr-1.5 animate-spin" }) : /* @__PURE__ */ g(m, { className: "size-3.5 sm:mr-1.5" }), /* @__PURE__ */ g("span", {
|
|
84
90
|
className: "hidden sm:inline",
|
|
85
|
-
children:
|
|
91
|
+
children: T("dashboard.refresh", "Refresh")
|
|
86
92
|
})]
|
|
87
|
-
}), /* @__PURE__ */
|
|
93
|
+
}), /* @__PURE__ */ _(v, {
|
|
88
94
|
variant: "outline",
|
|
89
95
|
size: "sm",
|
|
90
|
-
onClick: () =>
|
|
96
|
+
onClick: () => D(!0),
|
|
91
97
|
className: "text-xs",
|
|
92
|
-
children: [/* @__PURE__ */ h
|
|
98
|
+
children: [/* @__PURE__ */ g(h, { className: "size-3.5 sm:mr-1.5" }), /* @__PURE__ */ g("span", {
|
|
93
99
|
className: "hidden sm:inline",
|
|
94
|
-
children:
|
|
100
|
+
children: T("dashboard.customize", "Customize")
|
|
95
101
|
})]
|
|
96
102
|
})]
|
|
97
103
|
})]
|
|
98
104
|
}),
|
|
99
|
-
|
|
105
|
+
X && /* @__PURE__ */ _("div", {
|
|
100
106
|
className: "mb-4 p-3 bg-destructive/10 border border-destructive/20 rounded-lg flex items-center gap-2",
|
|
101
|
-
children: [/* @__PURE__ */
|
|
107
|
+
children: [/* @__PURE__ */ g(f, { className: "size-4 text-destructive shrink-0" }), /* @__PURE__ */ _("p", {
|
|
102
108
|
className: "text-sm text-destructive",
|
|
103
109
|
children: [
|
|
104
|
-
|
|
110
|
+
T("dashboard.error.partialData", "Some data may be unavailable."),
|
|
105
111
|
" ",
|
|
106
|
-
|
|
112
|
+
A ? T("dashboard.error.workspaceDown", "Workspace services may be down.") : "",
|
|
107
113
|
" ",
|
|
108
|
-
|
|
114
|
+
P ? T("dashboard.error.globalDown", "Global services may be down.") : "",
|
|
109
115
|
" ",
|
|
110
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ g("button", {
|
|
117
|
+
type: "button",
|
|
111
118
|
className: "underline font-medium hover:text-destructive/80",
|
|
112
|
-
onClick:
|
|
113
|
-
children:
|
|
119
|
+
onClick: J,
|
|
120
|
+
children: T("dashboard.error.tryRefreshing", "Try refreshing")
|
|
114
121
|
})
|
|
115
122
|
]
|
|
116
123
|
})]
|
|
117
124
|
}),
|
|
118
|
-
/* @__PURE__ */
|
|
119
|
-
widgets:
|
|
120
|
-
workspaceData:
|
|
121
|
-
globalData:
|
|
122
|
-
isLoading:
|
|
123
|
-
navigate:
|
|
125
|
+
/* @__PURE__ */ g(s, {
|
|
126
|
+
widgets: q,
|
|
127
|
+
workspaceData: G,
|
|
128
|
+
globalData: M ?? null,
|
|
129
|
+
isLoading: W,
|
|
130
|
+
navigate: b,
|
|
131
|
+
productId: C
|
|
124
132
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
126
|
-
open:
|
|
127
|
-
onOpenChange:
|
|
128
|
-
widgets:
|
|
129
|
-
onSave:
|
|
130
|
-
isSaving:
|
|
133
|
+
/* @__PURE__ */ g(c, {
|
|
134
|
+
open: E,
|
|
135
|
+
onOpenChange: D,
|
|
136
|
+
widgets: q,
|
|
137
|
+
onSave: Y,
|
|
138
|
+
isSaving: U.isPending,
|
|
139
|
+
productId: C
|
|
131
140
|
})
|
|
132
141
|
]
|
|
133
142
|
});
|
|
134
143
|
}
|
|
135
144
|
//#endregion
|
|
136
|
-
export {
|
|
145
|
+
export { b as DashboardPage };
|
|
137
146
|
|
|
138
147
|
//# sourceMappingURL=DashboardPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["/**\n * DashboardPage — Comprehensive workspace dashboard.\n *\n * This is the main dashboard component exported from microfe-workspaces.\n * It fetches data from both workspace and global gateways, manages widget\n * layout preferences, and renders a customizable grid of widgets.\n *\n * Props:\n * - navigate: Shell navigation function\n * - authToken: Current user's auth token\n * - currentUser: Basic user info from shell\n *\n * Data Flow:\n * 1. Two parallel queries: workspace gateway + global gateway\n * 2. Global query returns user preferences (dashboard layout)\n * 3. Widget layout falls back to defaults if no preferences saved\n * 4. Data is passed as props to individual widgets\n */\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Button, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { Settings2, RefreshCw, Loader2, AlertCircle } from 'lucide-react';\nimport {\n useWorkspaceDashboardData,\n useGlobalDashboardData,\n useProjectsDashboardData,\n} from './hooks/useDashboardData';\nimport { useUpdateDashboardPreferences } from './hooks/useDashboardPreferences';\nimport { DashboardGrid } from './DashboardGrid';\nimport { DashboardCustomizer } from './DashboardCustomizer';\nimport { getEffectiveWidgets, DEFAULT_DASHBOARD_WIDGETS } from './config';\nimport type { WidgetConfig, DashboardPreferences } from './types';\nimport { useWorkspacesPageView } from '../../hooks/useWorkspacesPageView';\n\ninterface DashboardPageProps {\n navigate: (path: string) => void;\n authToken?: string | null;\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n name?: string;\n } | null;\n}\n\nexport function DashboardPage({ navigate, authToken, currentUser }: DashboardPageProps) {\n useWorkspacesPageView('workspaces.dashboard');\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n const [customizerOpen, setCustomizerOpen] = useState(false);\n\n // ─── Data Fetching ────────────────────────────────────────────────────────\n const {\n data: workspaceData,\n isLoading: wsLoading,\n error: wsError,\n refetch: refetchWs,\n } = useWorkspaceDashboardData(authToken);\n\n const {\n data: globalData,\n isLoading: globalLoading,\n error: globalError,\n refetch: refetchGlobal,\n } = useGlobalDashboardData(authToken);\n\n const {\n data: projectsData,\n isLoading: projectsLoading,\n refetch: refetchProjects,\n } = useProjectsDashboardData(authToken);\n\n const updatePrefs = useUpdateDashboardPreferences(authToken);\n\n const isLoading = wsLoading || globalLoading || projectsLoading;\n\n // ─── Merge data ───────────────────────────────────────────────────────────\n // Workspace/org stats come from the global tenant service (globalData),\n // while workspace-scoped features (activity, calendar, tags, etc.) come\n // from the workspace gateway (workspaceData). Merge them so widgets\n // reading workspaceData.workspaces see the real tenant data.\n const mergedWorkspaceData = useMemo(() => {\n if (!workspaceData && !globalData && !projectsData) return null;\n return {\n ...(workspaceData ?? {\n workspaces: { items: [], total: 0 },\n projects: { items: [], total: 0 },\n recentActivities: [],\n upcomingEvents: [],\n tags: { items: [], total: 0 },\n groups: { items: [], totalCount: 0 },\n workflowStats: null,\n storageUsage: null,\n }),\n // Override with real workspace/org data from the global gateway\n workspaces: globalData?.workspaces ?? { items: [], total: 0 },\n // Override with real project data from the separate projects query\n // (fetched independently to avoid being poisoned by other subgraph errors)\n projects: projectsData ?? { items: [], total: 0 },\n };\n }, [workspaceData, globalData, projectsData]);\n\n // ─── Widget Configuration ─────────────────────────────────────────────────\n const savedPrefs = globalData?.dashboardPreferences;\n const widgets = useMemo(() => getEffectiveWidgets(savedPrefs?.widgets ?? null), [savedPrefs]);\n\n // ─── Handlers ─────────────────────────────────────────────────────────────\n const handleRefresh = useCallback(() => {\n refetchWs();\n refetchGlobal();\n refetchProjects();\n }, [refetchWs, refetchGlobal, refetchProjects]);\n\n const handleSaveWidgets = useCallback(\n async (newWidgets: WidgetConfig[]) => {\n await updatePrefs.mutateAsync(newWidgets);\n },\n [updatePrefs]\n );\n\n // ─── Error Banner ─────────────────────────────────────────────────────────\n const hasError = wsError || globalError;\n\n return (\n <div className=\"min-h-[calc(100vh-8rem)] p-4 md:p-6 bg-bg-canvas\" data-tour=\"main-content\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-xl font-bold text-text-primary\">\n {tr('dashboard.title', 'Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n {tr('dashboard.subtitle', 'Your workspace overview at a glance')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\" data-tour=\"quick-actions\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRefresh}\n disabled={isLoading}\n className=\"text-xs\"\n >\n {isLoading ? (\n <Loader2 className=\"h-3.5 w-3.5 sm:mr-1.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"h-3.5 w-3.5 sm:mr-1.5\" />\n )}\n <span className=\"hidden sm:inline\">{tr('dashboard.refresh', 'Refresh')}</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCustomizerOpen(true)}\n className=\"text-xs\"\n >\n <Settings2 className=\"h-3.5 w-3.5 sm:mr-1.5\" />\n <span className=\"hidden sm:inline\">{tr('dashboard.customize', 'Customize')}</span>\n </Button>\n </div>\n </div>\n\n {/* Error Banner */}\n {hasError && (\n <div className=\"mb-4 p-3 bg-destructive/10 border border-destructive/20 rounded-lg flex items-center gap-2\">\n <AlertCircle className=\"h-4 w-4 text-destructive shrink-0\" />\n <p className=\"text-sm text-destructive\">\n {tr('dashboard.error.partialData', 'Some data may be unavailable.')}{' '}\n {wsError ? tr('dashboard.error.workspaceDown', 'Workspace services may be down.') : ''}{' '}\n {globalError ? tr('dashboard.error.globalDown', 'Global services may be down.') : ''}{' '}\n <button\n className=\"underline font-medium hover:text-destructive/80\"\n onClick={handleRefresh}\n >\n {tr('dashboard.error.tryRefreshing', 'Try refreshing')}\n </button>\n </p>\n </div>\n )}\n\n {/* Widget Grid */}\n {/* Merge workspace/org data from the global query into workspaceData\n so widgets that read workspaceData.workspaces see the real data\n from the global tenant service. */}\n <DashboardGrid\n widgets={widgets}\n workspaceData={mergedWorkspaceData}\n globalData={globalData ?? null}\n isLoading={isLoading}\n navigate={navigate}\n />\n\n {/* Customizer */}\n <DashboardCustomizer\n open={customizerOpen}\n onOpenChange={setCustomizerOpen}\n widgets={widgets}\n onSave={handleSaveWidgets}\n isSaving={updatePrefs.isPending}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["/**\n * DashboardPage — Comprehensive workspace dashboard.\n *\n * This is the main dashboard component exported from microfe-workspaces.\n * It fetches data from both workspace and global gateways, manages widget\n * layout preferences, and renders a customizable grid of widgets.\n *\n * Props:\n * - navigate: Shell navigation function\n * - authToken: Current user's auth token\n * - currentUser: Basic user info from shell\n *\n * Data Flow:\n * 1. Two parallel queries: workspace gateway + global gateway\n * 2. Global query returns user preferences (dashboard layout)\n * 3. Widget layout falls back to defaults if no preferences saved\n * 4. Data is passed as props to individual widgets\n */\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Settings2, RefreshCw, Loader2, AlertCircle } from 'lucide-react';\nimport {\n useWorkspaceDashboardData,\n useGlobalDashboardData,\n useProjectsDashboardData,\n useVibecontrolsDashboardData,\n} from './hooks/useDashboardData';\nimport { useUpdateDashboardPreferences } from './hooks/useDashboardPreferences';\nimport { DashboardGrid } from './DashboardGrid';\nimport { DashboardCustomizer } from './DashboardCustomizer';\nimport { getEffectiveWidgets } from './config';\nimport type { WidgetConfig } from './types';\nimport { useWorkspacesPageView } from '../../hooks/useWorkspacesPageView';\n\ninterface DashboardPageProps {\n navigate: (path: string) => void;\n authToken?: string | null;\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n name?: string;\n } | null;\n /**\n * Host product identifier ('workspaces', 'vibecontrols', etc.). Drives\n * which widgets appear in the registry + default layout. Defaults to\n * 'workspaces' for legacy callers.\n */\n productId?: string;\n}\n\nexport function DashboardPage({\n navigate,\n authToken,\n currentUser: _currentUser,\n productId = 'workspaces',\n}: DashboardPageProps) {\n useWorkspacesPageView('workspaces.dashboard');\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n const [customizerOpen, setCustomizerOpen] = useState(false);\n\n // ─── Data Fetching ────────────────────────────────────────────────────────\n const {\n data: workspaceData,\n isLoading: wsLoading,\n error: wsError,\n refetch: refetchWs,\n } = useWorkspaceDashboardData(authToken);\n\n const {\n data: globalData,\n isLoading: globalLoading,\n error: globalError,\n refetch: refetchGlobal,\n } = useGlobalDashboardData(authToken);\n\n const {\n data: projectsData,\n isLoading: projectsLoading,\n refetch: refetchProjects,\n } = useProjectsDashboardData(authToken);\n\n const isVibecontrols = productId === 'vibecontrols';\n const {\n data: vibecontrolsData,\n isLoading: vibecontrolsLoading,\n refetch: refetchVibecontrols,\n } = useVibecontrolsDashboardData(authToken, isVibecontrols);\n\n const updatePrefs = useUpdateDashboardPreferences(authToken);\n\n const isLoading = wsLoading || globalLoading || projectsLoading || vibecontrolsLoading;\n\n // ─── Merge data ───────────────────────────────────────────────────────────\n // Workspace/org stats come from the global tenant service (globalData),\n // while workspace-scoped features (activity, calendar, tags, etc.) come\n // from the workspace gateway (workspaceData). Merge them so widgets\n // reading workspaceData.workspaces see the real tenant data.\n const mergedWorkspaceData = useMemo(() => {\n if (!workspaceData && !globalData && !projectsData && !vibecontrolsData) return null;\n return {\n ...(workspaceData ?? {\n workspaces: { items: [], total: 0 },\n projects: { items: [], total: 0 },\n recentActivities: [],\n upcomingEvents: [],\n tags: { items: [], total: 0 },\n groups: { items: [], totalCount: 0 },\n workflowStats: null,\n storageUsage: null,\n }),\n // Override with real workspace/org data from the global gateway\n workspaces: globalData?.workspaces ?? { items: [], total: 0 },\n // Override with real project data from the separate projects query\n // (fetched independently to avoid being poisoned by other subgraph errors)\n projects: projectsData ?? { items: [], total: 0 },\n // VibeControls-only data; undefined for other products\n recentVibes: vibecontrolsData?.recentVibes,\n activeSessions: vibecontrolsData?.activeSessions,\n agentFleet: vibecontrolsData?.agentFleet ?? null,\n };\n }, [workspaceData, globalData, projectsData, vibecontrolsData]);\n\n // ─── Widget Configuration ─────────────────────────────────────────────────\n const savedPrefs = globalData?.dashboardPreferences;\n const widgets = useMemo(\n () => getEffectiveWidgets(savedPrefs?.widgets ?? null, productId),\n [savedPrefs, productId]\n );\n\n // ─── Handlers ─────────────────────────────────────────────────────────────\n const handleRefresh = useCallback(() => {\n refetchWs();\n refetchGlobal();\n refetchProjects();\n if (isVibecontrols) refetchVibecontrols();\n }, [refetchWs, refetchGlobal, refetchProjects, refetchVibecontrols, isVibecontrols]);\n\n const handleSaveWidgets = useCallback(\n async (newWidgets: WidgetConfig[]) => {\n await updatePrefs.mutateAsync(newWidgets);\n },\n [updatePrefs]\n );\n\n // ─── Error Banner ─────────────────────────────────────────────────────────\n const hasError = wsError || globalError;\n\n return (\n <div className=\"min-h-[calc(100vh-8rem)] p-4 md:p-6 bg-bg-canvas\" data-tour=\"main-content\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-xl font-bold text-text-primary\">\n {tr('dashboard.title', 'Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-0.5\">\n {tr('dashboard.subtitle', 'Your workspace overview at a glance')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\" data-tour=\"quick-actions\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleRefresh}\n disabled={isLoading}\n className=\"text-xs\"\n >\n {isLoading ? (\n <Loader2 className=\"size-3.5 sm:mr-1.5 animate-spin\" />\n ) : (\n <RefreshCw className=\"size-3.5 sm:mr-1.5\" />\n )}\n <span className=\"hidden sm:inline\">{tr('dashboard.refresh', 'Refresh')}</span>\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCustomizerOpen(true)}\n className=\"text-xs\"\n >\n <Settings2 className=\"size-3.5 sm:mr-1.5\" />\n <span className=\"hidden sm:inline\">{tr('dashboard.customize', 'Customize')}</span>\n </Button>\n </div>\n </div>\n\n {/* Error Banner */}\n {hasError && (\n <div className=\"mb-4 p-3 bg-destructive/10 border border-destructive/20 rounded-lg flex items-center gap-2\">\n <AlertCircle className=\"size-4 text-destructive shrink-0\" />\n <p className=\"text-sm text-destructive\">\n {tr('dashboard.error.partialData', 'Some data may be unavailable.')}{' '}\n {wsError ? tr('dashboard.error.workspaceDown', 'Workspace services may be down.') : ''}{' '}\n {globalError ? tr('dashboard.error.globalDown', 'Global services may be down.') : ''}{' '}\n <button\n type=\"button\"\n className=\"underline font-medium hover:text-destructive/80\"\n onClick={handleRefresh}\n >\n {tr('dashboard.error.tryRefreshing', 'Try refreshing')}\n </button>\n </p>\n </div>\n )}\n\n {/* Widget Grid */}\n {/* Merge workspace/org data from the global query into workspaceData\n so widgets that read workspaceData.workspaces see the real data\n from the global tenant service. */}\n <DashboardGrid\n widgets={widgets}\n workspaceData={mergedWorkspaceData}\n globalData={globalData ?? null}\n isLoading={isLoading}\n navigate={navigate}\n productId={productId}\n />\n\n {/* Customizer */}\n <DashboardCustomizer\n open={customizerOpen}\n onOpenChange={setCustomizerOpen}\n widgets={widgets}\n onSave={handleSaveWidgets}\n isSaving={updatePrefs.isPending}\n productId={productId}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ function p({ message: e }) {
|
|
|
28
28
|
className: "flex flex-col items-center justify-center py-6 text-center",
|
|
29
29
|
children: [/* @__PURE__ */ r("div", {
|
|
30
30
|
className: "rounded-full bg-destructive/10 p-2 mb-2",
|
|
31
|
-
children: /* @__PURE__ */ r(t, { className: "
|
|
31
|
+
children: /* @__PURE__ */ r(t, { className: "size-5 text-destructive" })
|
|
32
32
|
}), /* @__PURE__ */ r("p", {
|
|
33
33
|
className: "text-sm text-muted-foreground",
|
|
34
34
|
children: e
|
|
@@ -41,7 +41,7 @@ function m() {
|
|
|
41
41
|
className: "flex flex-col items-center justify-center py-6 text-center",
|
|
42
42
|
children: [/* @__PURE__ */ r("div", {
|
|
43
43
|
className: "rounded-full bg-muted p-2 mb-2",
|
|
44
|
-
children: /* @__PURE__ */ r(n, { className: "
|
|
44
|
+
children: /* @__PURE__ */ r(n, { className: "size-5 text-muted-foreground" })
|
|
45
45
|
}), /* @__PURE__ */ r("p", {
|
|
46
46
|
className: "text-sm text-muted-foreground",
|
|
47
47
|
children: e(t, "widgetWrapper.serviceUnavailable", "Service unavailable")
|
|
@@ -52,7 +52,7 @@ function h({ title: e, icon: t, size: n, isLoading: l, error: u, unavailable: h,
|
|
|
52
52
|
return /* @__PURE__ */ i(a, {
|
|
53
53
|
className: `${d(n)} transition-all duration-200 hover:shadow-md border border-border-default bg-bg-surface ${v}`,
|
|
54
54
|
children: [/* @__PURE__ */ i(s, {
|
|
55
|
-
className: "flex flex-row items-center justify-between pb-2
|
|
55
|
+
className: "flex flex-row items-center justify-between pb-2 gap-y-0",
|
|
56
56
|
children: [/* @__PURE__ */ i(c, {
|
|
57
57
|
className: "text-sm font-semibold text-text-primary flex items-center gap-2",
|
|
58
58
|
children: [t, e]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetWrapper.js","names":[],"sources":["../../../src/pages/dashboard/WidgetWrapper.tsx"],"sourcesContent":["/**\n * WidgetWrapper — Common wrapper for all dashboard widgets.\n *\n * Provides consistent card styling, loading skeleton, error state,\n * and unavailable state.\n */\nimport { type ReactNode } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Skeleton } from '@burdenoff/fe-libs/ui';\nimport { AlertCircle, WifiOff } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../../utils/i18n';\nimport type { WidgetSize } from './types';\n\ninterface WidgetWrapperProps {\n title: string;\n icon?: ReactNode;\n size: WidgetSize;\n isLoading?: boolean;\n error?: string | null;\n unavailable?: boolean;\n headerAction?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nfunction getColSpan(size: WidgetSize): string {\n switch (size) {\n case 'large':\n return 'col-span-1 sm:col-span-2 lg:col-span-3';\n case 'medium':\n return 'col-span-1 sm:col-span-2 lg:col-span-2 xl:col-span-2 2xl:col-span-1';\n case 'small':\n return 'col-span-1';\n default:\n return 'col-span-1';\n }\n}\n\nfunction LoadingSkeleton() {\n return (\n <div className=\"space-y-3 p-1\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-20 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n );\n}\n\nfunction ErrorState({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-6 text-center\">\n <div className=\"rounded-full bg-destructive/10 p-2 mb-2\">\n <AlertCircle className=\"
|
|
1
|
+
{"version":3,"file":"WidgetWrapper.js","names":[],"sources":["../../../src/pages/dashboard/WidgetWrapper.tsx"],"sourcesContent":["/**\n * WidgetWrapper — Common wrapper for all dashboard widgets.\n *\n * Provides consistent card styling, loading skeleton, error state,\n * and unavailable state.\n */\nimport { type ReactNode } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Skeleton } from '@burdenoff/fe-libs/ui';\nimport { AlertCircle, WifiOff } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../../utils/i18n';\nimport type { WidgetSize } from './types';\n\ninterface WidgetWrapperProps {\n title: string;\n icon?: ReactNode;\n size: WidgetSize;\n isLoading?: boolean;\n error?: string | null;\n unavailable?: boolean;\n headerAction?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nfunction getColSpan(size: WidgetSize): string {\n switch (size) {\n case 'large':\n return 'col-span-1 sm:col-span-2 lg:col-span-3';\n case 'medium':\n return 'col-span-1 sm:col-span-2 lg:col-span-2 xl:col-span-2 2xl:col-span-1';\n case 'small':\n return 'col-span-1';\n default:\n return 'col-span-1';\n }\n}\n\nfunction LoadingSkeleton() {\n return (\n <div className=\"space-y-3 p-1\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-20 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n );\n}\n\nfunction ErrorState({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-6 text-center\">\n <div className=\"rounded-full bg-destructive/10 p-2 mb-2\">\n <AlertCircle className=\"size-5 text-destructive\" />\n </div>\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </div>\n );\n}\n\nfunction UnavailableState() {\n const { t } = useI18n();\n\n return (\n <div className=\"flex flex-col items-center justify-center py-6 text-center\">\n <div className=\"rounded-full bg-muted p-2 mb-2\">\n <WifiOff className=\"size-5 text-muted-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {tWithFallback(t, 'widgetWrapper.serviceUnavailable', 'Service unavailable')}\n </p>\n </div>\n );\n}\n\nexport function WidgetWrapper({\n title,\n icon,\n size,\n isLoading,\n error,\n unavailable,\n headerAction,\n children,\n className = '',\n}: WidgetWrapperProps) {\n const colSpan = getColSpan(size);\n\n return (\n <Card\n className={`${colSpan} transition-all duration-200 hover:shadow-md border border-border-default bg-bg-surface ${className}`}\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2 gap-y-0\">\n <CardTitle className=\"text-sm font-semibold text-text-primary flex items-center gap-2\">\n {icon}\n {title}\n </CardTitle>\n {headerAction}\n </CardHeader>\n <CardContent className=\"pt-0\">\n {isLoading ? (\n <LoadingSkeleton />\n ) : error ? (\n <ErrorState message={error} />\n ) : unavailable ? (\n <UnavailableState />\n ) : (\n children\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;AA0BA,SAAS,EAAW,GAA0B;AAC5C,SAAQ,GAAR;EACE,KAAK,QACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,IAAkB;AACzB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;GAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;GAClC,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA;GACpC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;GAC9B;;;AAIV,SAAS,EAAW,EAAE,cAAgC;AACpD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAa,WAAU,2BAA4B,CAAA;GAC/C,CAAA,EACN,kBAAC,KAAD;GAAG,WAAU;aAAiC;GAAY,CAAA,CACtD;;;AAIV,SAAS,IAAmB;CAC1B,IAAM,EAAE,MAAM,GAAS;AAEvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAS,WAAU,gCAAiC,CAAA;GAChD,CAAA,EACN,kBAAC,KAAD;GAAG,WAAU;aACV,EAAc,GAAG,oCAAoC,sBAAsB;GAC1E,CAAA,CACA;;;AAIV,SAAgB,EAAc,EAC5B,UACA,SACA,SACA,cACA,UACA,gBACA,iBACA,aACA,eAAY,MACS;AAGrB,QACE,kBAAC,GAAD;EACE,WAAW,GAJC,EAAW,EAAK,CAIN,0FAA0F;YADlH,CAGE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACG,GACA,EACS;OACX,EACU;MACb,kBAAC,GAAD;GAAa,WAAU;aACpB,IACC,kBAAC,GAAD,EAAmB,CAAA,GACjB,IACF,kBAAC,GAAD,EAAY,SAAS,GAAS,CAAA,GAC5B,IACF,kBAAC,GAAD,EAAoB,CAAA,GAEpB;GAEU,CAAA,CACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/pages/dashboard/config.ts
|
|
2
|
-
var e = {
|
|
2
|
+
var e = "workspaces", t = {
|
|
3
3
|
welcome: {
|
|
4
4
|
id: "welcome",
|
|
5
5
|
title: "Welcome",
|
|
@@ -52,7 +52,8 @@ var e = {
|
|
|
52
52
|
icon: "Calendar",
|
|
53
53
|
defaultSize: "medium",
|
|
54
54
|
removable: !0,
|
|
55
|
-
dataSource: "workspace"
|
|
55
|
+
dataSource: "workspace",
|
|
56
|
+
availableInProducts: ["workspaces"]
|
|
56
57
|
},
|
|
57
58
|
workflows: {
|
|
58
59
|
id: "workflows",
|
|
@@ -61,7 +62,8 @@ var e = {
|
|
|
61
62
|
icon: "GitBranch",
|
|
62
63
|
defaultSize: "medium",
|
|
63
64
|
removable: !0,
|
|
64
|
-
dataSource: "workspace"
|
|
65
|
+
dataSource: "workspace",
|
|
66
|
+
availableInProducts: ["workspaces"]
|
|
65
67
|
},
|
|
66
68
|
tags: {
|
|
67
69
|
id: "tags",
|
|
@@ -99,15 +101,6 @@ var e = {
|
|
|
99
101
|
removable: !0,
|
|
100
102
|
dataSource: "workspace"
|
|
101
103
|
},
|
|
102
|
-
systemHealth: {
|
|
103
|
-
id: "systemHealth",
|
|
104
|
-
title: "System Status",
|
|
105
|
-
description: "Service health and availability",
|
|
106
|
-
icon: "HeartPulse",
|
|
107
|
-
defaultSize: "small",
|
|
108
|
-
removable: !0,
|
|
109
|
-
dataSource: "global"
|
|
110
|
-
},
|
|
111
104
|
tips: {
|
|
112
105
|
id: "tips",
|
|
113
106
|
title: "Tips & Resources",
|
|
@@ -116,8 +109,38 @@ var e = {
|
|
|
116
109
|
defaultSize: "small",
|
|
117
110
|
removable: !0,
|
|
118
111
|
dataSource: "static"
|
|
112
|
+
},
|
|
113
|
+
vibes: {
|
|
114
|
+
id: "vibes",
|
|
115
|
+
title: "Recent Vibes",
|
|
116
|
+
description: "Your most recently active development vibes",
|
|
117
|
+
icon: "Sparkles",
|
|
118
|
+
defaultSize: "medium",
|
|
119
|
+
removable: !0,
|
|
120
|
+
dataSource: "workspace",
|
|
121
|
+
availableInProducts: ["vibecontrols"]
|
|
122
|
+
},
|
|
123
|
+
sessions: {
|
|
124
|
+
id: "sessions",
|
|
125
|
+
title: "Active Sessions",
|
|
126
|
+
description: "Running terminal and agent sessions",
|
|
127
|
+
icon: "Terminal",
|
|
128
|
+
defaultSize: "medium",
|
|
129
|
+
removable: !0,
|
|
130
|
+
dataSource: "workspace",
|
|
131
|
+
availableInProducts: ["vibecontrols"]
|
|
132
|
+
},
|
|
133
|
+
agents: {
|
|
134
|
+
id: "agents",
|
|
135
|
+
title: "Agent Fleet",
|
|
136
|
+
description: "Online, offline, and degraded agents at a glance",
|
|
137
|
+
icon: "Bot",
|
|
138
|
+
defaultSize: "small",
|
|
139
|
+
removable: !0,
|
|
140
|
+
dataSource: "workspace",
|
|
141
|
+
availableInProducts: ["vibecontrols"]
|
|
119
142
|
}
|
|
120
|
-
},
|
|
143
|
+
}, n = [
|
|
121
144
|
{
|
|
122
145
|
widgetId: "welcome",
|
|
123
146
|
enabled: !0,
|
|
@@ -184,31 +207,104 @@ var e = {
|
|
|
184
207
|
order: 10,
|
|
185
208
|
size: "small"
|
|
186
209
|
},
|
|
187
|
-
{
|
|
188
|
-
widgetId: "systemHealth",
|
|
189
|
-
enabled: !0,
|
|
190
|
-
order: 11,
|
|
191
|
-
size: "small"
|
|
192
|
-
},
|
|
193
210
|
{
|
|
194
211
|
widgetId: "tips",
|
|
195
212
|
enabled: !0,
|
|
196
|
-
order:
|
|
213
|
+
order: 11,
|
|
197
214
|
size: "small"
|
|
198
215
|
}
|
|
199
|
-
]
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
216
|
+
], r = {
|
|
217
|
+
workspaces: n,
|
|
218
|
+
vibecontrols: [
|
|
219
|
+
{
|
|
220
|
+
widgetId: "welcome",
|
|
221
|
+
enabled: !0,
|
|
222
|
+
order: 0,
|
|
223
|
+
size: "large"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
widgetId: "quickActions",
|
|
227
|
+
enabled: !0,
|
|
228
|
+
order: 1,
|
|
229
|
+
size: "medium"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
widgetId: "vibes",
|
|
233
|
+
enabled: !0,
|
|
234
|
+
order: 2,
|
|
235
|
+
size: "medium"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
widgetId: "sessions",
|
|
239
|
+
enabled: !0,
|
|
240
|
+
order: 3,
|
|
241
|
+
size: "medium"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
widgetId: "agents",
|
|
245
|
+
enabled: !0,
|
|
246
|
+
order: 4,
|
|
247
|
+
size: "small"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
widgetId: "workspaces",
|
|
251
|
+
enabled: !0,
|
|
252
|
+
order: 5,
|
|
253
|
+
size: "medium"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
widgetId: "projects",
|
|
257
|
+
enabled: !0,
|
|
258
|
+
order: 6,
|
|
259
|
+
size: "medium"
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
widgetId: "activity",
|
|
263
|
+
enabled: !0,
|
|
264
|
+
order: 7,
|
|
265
|
+
size: "large"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
widgetId: "storage",
|
|
269
|
+
enabled: !0,
|
|
270
|
+
order: 8,
|
|
271
|
+
size: "small"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
widgetId: "members",
|
|
275
|
+
enabled: !0,
|
|
276
|
+
order: 9,
|
|
277
|
+
size: "small"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
widgetId: "tips",
|
|
281
|
+
enabled: !0,
|
|
282
|
+
order: 10,
|
|
283
|
+
size: "small"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}, i = n;
|
|
287
|
+
function a(t, n = e) {
|
|
288
|
+
return !t.availableInProducts || t.availableInProducts.length === 0 ? !0 : t.availableInProducts.includes(n);
|
|
289
|
+
}
|
|
290
|
+
function o(n = e) {
|
|
291
|
+
let r = {};
|
|
292
|
+
for (let [e, i] of Object.entries(t)) a(i, n) && (r[e] = i);
|
|
293
|
+
return r;
|
|
294
|
+
}
|
|
295
|
+
function s(t, i = e) {
|
|
296
|
+
let a = r[i] ?? n, s = o(i), c = new Set(Object.keys(s));
|
|
297
|
+
if (!t || t.length === 0) return a.filter((e) => c.has(e.widgetId));
|
|
298
|
+
let l = t.filter((e) => c.has(e.widgetId)), u = new Set(l.map((e) => e.widgetId)), d = [...l];
|
|
299
|
+
for (let e of Object.values(s)) u.has(e.id) || d.push({
|
|
300
|
+
widgetId: e.id,
|
|
205
301
|
enabled: !1,
|
|
206
|
-
order:
|
|
207
|
-
size:
|
|
302
|
+
order: d.length,
|
|
303
|
+
size: e.defaultSize
|
|
208
304
|
});
|
|
209
|
-
return
|
|
305
|
+
return d.sort((e, t) => e.order - t.order);
|
|
210
306
|
}
|
|
211
307
|
//#endregion
|
|
212
|
-
export {
|
|
308
|
+
export { i as DEFAULT_DASHBOARD_WIDGETS, r as DEFAULT_DASHBOARD_WIDGETS_BY_PRODUCT, t as WIDGET_DEFINITIONS, s as getEffectiveWidgets, a as isWidgetAvailable };
|
|
213
309
|
|
|
214
310
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../../src/pages/dashboard/config.ts"],"sourcesContent":["/**\n * Dashboard Widget Registry & Default Configuration\n */\nimport type { WidgetConfig, WidgetDefinition } from './types';\n\n// ─── Widget Definitions ───────────────────────────────────────────────────────\n\nexport const WIDGET_DEFINITIONS: Record<string, WidgetDefinition> = {\n welcome: {\n id: 'welcome',\n title: 'Welcome',\n description: 'Greeting and overview statistics',\n icon: 'LayoutDashboard',\n defaultSize: 'large',\n removable: false,\n dataSource: 'global',\n },\n quickActions: {\n id: 'quickActions',\n title: 'Quick Actions',\n description: 'Frequently used actions and shortcuts',\n icon: 'Zap',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'static',\n },\n workspaces: {\n id: 'workspaces',\n title: 'Workspaces',\n description: 'Your workspaces overview and quick access',\n icon: 'Building2',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n projects: {\n id: 'projects',\n title: 'Projects',\n description: 'Recent projects and status breakdown',\n icon: 'FolderKanban',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n activity: {\n id: 'activity',\n title: 'Recent Activity',\n description: 'Timeline of recent activity across modules',\n icon: 'Activity',\n defaultSize: 'large',\n removable: true,\n dataSource: 'workspace',\n },\n calendar: {\n id: 'calendar',\n title: 'Upcoming Events',\n description: 'Next upcoming calendar events',\n icon: 'Calendar',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n workflows: {\n id: 'workflows',\n title: 'Workflows',\n description: 'Active workflow stats and recent runs',\n icon: 'GitBranch',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n tags: {\n id: 'tags',\n title: 'Tags',\n description: 'Popular tags across your workspace',\n icon: 'Tags',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n storage: {\n id: 'storage',\n title: 'Storage',\n description: 'Storage usage and file statistics',\n icon: 'HardDrive',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n groups: {\n id: 'groups',\n title: 'Groups',\n description: 'Your groups and teams',\n icon: 'Users',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n members: {\n id: 'members',\n title: 'Members',\n description: 'Workspace member overview',\n icon: 'UserPlus',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n systemHealth: {\n id: 'systemHealth',\n title: 'System Status',\n description: 'Service health and availability',\n icon: 'HeartPulse',\n defaultSize: 'small',\n removable: true,\n dataSource: 'global',\n },\n tips: {\n id: 'tips',\n title: 'Tips & Resources',\n description: 'Getting started tips and documentation links',\n icon: 'Lightbulb',\n defaultSize: 'small',\n removable: true,\n dataSource: 'static',\n },\n};\n\n// ─── Default Widget Layout ────────────────────────────────────────────────────\n\nexport const DEFAULT_DASHBOARD_WIDGETS: WidgetConfig[] = [\n { widgetId: 'welcome', enabled: true, order: 0, size: 'large' },\n { widgetId: 'quickActions', enabled: true, order: 1, size: 'medium' },\n { widgetId: 'workspaces', enabled: true, order: 2, size: 'medium' },\n { widgetId: 'projects', enabled: true, order: 3, size: 'medium' },\n { widgetId: 'activity', enabled: true, order: 4, size: 'large' },\n { widgetId: 'calendar', enabled: true, order: 5, size: 'medium' },\n { widgetId: 'workflows', enabled: true, order: 6, size: 'medium' },\n { widgetId: 'tags', enabled: true, order: 7, size: 'small' },\n { widgetId: 'storage', enabled: true, order: 8, size: 'small' },\n { widgetId: 'groups', enabled: true, order: 9, size: 'small' },\n { widgetId: 'members', enabled: true, order: 10, size: 'small' },\n { widgetId: 'systemHealth', enabled: true, order: 11, size: 'small' },\n { widgetId: 'tips', enabled: true, order: 12, size: 'small' },\n];\n\n/**\n * Get the effective widget configuration, merging user prefs with defaults.\n */\nexport function getEffectiveWidgets(userPrefs: WidgetConfig[] | null | undefined): WidgetConfig[] {\n if (!userPrefs || userPrefs.length === 0) {\n return DEFAULT_DASHBOARD_WIDGETS;\n }\n\n // Ensure all defined widgets exist in user prefs (add any new ones as disabled)\n const userWidgetIds = new Set(userPrefs.map((w) => w.widgetId));\n const merged = [...userPrefs];\n\n for (const def of Object.values(WIDGET_DEFINITIONS)) {\n if (!userWidgetIds.has(def.id)) {\n merged.push({\n widgetId: def.id,\n enabled: false,\n order: merged.length,\n size: def.defaultSize,\n });\n }\n }\n\n return merged.sort((a, b) => a.order - b.order);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../../src/pages/dashboard/config.ts"],"sourcesContent":["/**\n * Dashboard Widget Registry & Default Configuration\n *\n * Product-aware. Hosts pass `productId` to filter widgets relevant for that\n * product. `availableInProducts` on each definition gates registry visibility;\n * `DEFAULT_DASHBOARD_WIDGETS_BY_PRODUCT` controls the default visible/order\n * layout for first-time users.\n */\nimport type { WidgetConfig, WidgetDefinition } from './types';\n\nexport const DEFAULT_PRODUCT_ID = 'workspaces';\n\n// ─── Widget Definitions ───────────────────────────────────────────────────────\n\nexport const WIDGET_DEFINITIONS: Record<string, WidgetDefinition> = {\n welcome: {\n id: 'welcome',\n title: 'Welcome',\n description: 'Greeting and overview statistics',\n icon: 'LayoutDashboard',\n defaultSize: 'large',\n removable: false,\n dataSource: 'global',\n },\n quickActions: {\n id: 'quickActions',\n title: 'Quick Actions',\n description: 'Frequently used actions and shortcuts',\n icon: 'Zap',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'static',\n },\n workspaces: {\n id: 'workspaces',\n title: 'Workspaces',\n description: 'Your workspaces overview and quick access',\n icon: 'Building2',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n projects: {\n id: 'projects',\n title: 'Projects',\n description: 'Recent projects and status breakdown',\n icon: 'FolderKanban',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n },\n activity: {\n id: 'activity',\n title: 'Recent Activity',\n description: 'Timeline of recent activity across modules',\n icon: 'Activity',\n defaultSize: 'large',\n removable: true,\n dataSource: 'workspace',\n },\n calendar: {\n id: 'calendar',\n title: 'Upcoming Events',\n description: 'Next upcoming calendar events',\n icon: 'Calendar',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n availableInProducts: ['workspaces'],\n },\n workflows: {\n id: 'workflows',\n title: 'Workflows',\n description: 'Active workflow stats and recent runs',\n icon: 'GitBranch',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n availableInProducts: ['workspaces'],\n },\n tags: {\n id: 'tags',\n title: 'Tags',\n description: 'Popular tags across your workspace',\n icon: 'Tags',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n storage: {\n id: 'storage',\n title: 'Storage',\n description: 'Storage usage and file statistics',\n icon: 'HardDrive',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n groups: {\n id: 'groups',\n title: 'Groups',\n description: 'Your groups and teams',\n icon: 'Users',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n members: {\n id: 'members',\n title: 'Members',\n description: 'Workspace member overview',\n icon: 'UserPlus',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n },\n tips: {\n id: 'tips',\n title: 'Tips & Resources',\n description: 'Getting started tips and documentation links',\n icon: 'Lightbulb',\n defaultSize: 'small',\n removable: true,\n dataSource: 'static',\n },\n // ── VibeControls-specific widgets ───────────────────────────────────────────\n vibes: {\n id: 'vibes',\n title: 'Recent Vibes',\n description: 'Your most recently active development vibes',\n icon: 'Sparkles',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n availableInProducts: ['vibecontrols'],\n },\n sessions: {\n id: 'sessions',\n title: 'Active Sessions',\n description: 'Running terminal and agent sessions',\n icon: 'Terminal',\n defaultSize: 'medium',\n removable: true,\n dataSource: 'workspace',\n availableInProducts: ['vibecontrols'],\n },\n agents: {\n id: 'agents',\n title: 'Agent Fleet',\n description: 'Online, offline, and degraded agents at a glance',\n icon: 'Bot',\n defaultSize: 'small',\n removable: true,\n dataSource: 'workspace',\n availableInProducts: ['vibecontrols'],\n },\n};\n\n// ─── Default Widget Layouts ───────────────────────────────────────────────────\n\nconst WORKSPACES_DEFAULT_WIDGETS: WidgetConfig[] = [\n { widgetId: 'welcome', enabled: true, order: 0, size: 'large' },\n { widgetId: 'quickActions', enabled: true, order: 1, size: 'medium' },\n { widgetId: 'workspaces', enabled: true, order: 2, size: 'medium' },\n { widgetId: 'projects', enabled: true, order: 3, size: 'medium' },\n { widgetId: 'activity', enabled: true, order: 4, size: 'large' },\n { widgetId: 'calendar', enabled: true, order: 5, size: 'medium' },\n { widgetId: 'workflows', enabled: true, order: 6, size: 'medium' },\n { widgetId: 'tags', enabled: true, order: 7, size: 'small' },\n { widgetId: 'storage', enabled: true, order: 8, size: 'small' },\n { widgetId: 'groups', enabled: true, order: 9, size: 'small' },\n { widgetId: 'members', enabled: true, order: 10, size: 'small' },\n { widgetId: 'tips', enabled: true, order: 11, size: 'small' },\n];\n\nconst VIBECONTROLS_DEFAULT_WIDGETS: WidgetConfig[] = [\n { widgetId: 'welcome', enabled: true, order: 0, size: 'large' },\n { widgetId: 'quickActions', enabled: true, order: 1, size: 'medium' },\n { widgetId: 'vibes', enabled: true, order: 2, size: 'medium' },\n { widgetId: 'sessions', enabled: true, order: 3, size: 'medium' },\n { widgetId: 'agents', enabled: true, order: 4, size: 'small' },\n { widgetId: 'workspaces', enabled: true, order: 5, size: 'medium' },\n { widgetId: 'projects', enabled: true, order: 6, size: 'medium' },\n { widgetId: 'activity', enabled: true, order: 7, size: 'large' },\n { widgetId: 'storage', enabled: true, order: 8, size: 'small' },\n { widgetId: 'members', enabled: true, order: 9, size: 'small' },\n { widgetId: 'tips', enabled: true, order: 10, size: 'small' },\n];\n\nexport const DEFAULT_DASHBOARD_WIDGETS_BY_PRODUCT: Record<string, WidgetConfig[]> = {\n workspaces: WORKSPACES_DEFAULT_WIDGETS,\n vibecontrols: VIBECONTROLS_DEFAULT_WIDGETS,\n};\n\n/** Backwards-compatible export — kept for callers that don't pass productId. */\nexport const DEFAULT_DASHBOARD_WIDGETS: WidgetConfig[] = WORKSPACES_DEFAULT_WIDGETS;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nexport function isWidgetAvailable(\n widget: WidgetDefinition,\n productId: string = DEFAULT_PRODUCT_ID\n): boolean {\n if (!widget.availableInProducts || widget.availableInProducts.length === 0) {\n return true;\n }\n return widget.availableInProducts.includes(productId);\n}\n\nexport function getDefinitionsForProduct(\n productId: string = DEFAULT_PRODUCT_ID\n): Record<string, WidgetDefinition> {\n const out: Record<string, WidgetDefinition> = {};\n for (const [key, def] of Object.entries(WIDGET_DEFINITIONS)) {\n if (isWidgetAvailable(def, productId)) {\n out[key] = def;\n }\n }\n return out;\n}\n\n/**\n * Get the effective widget configuration, merging user prefs with defaults.\n * Filters out widgets that are not available for the given product.\n */\nexport function getEffectiveWidgets(\n userPrefs: WidgetConfig[] | null | undefined,\n productId: string = DEFAULT_PRODUCT_ID\n): WidgetConfig[] {\n const productDefaults =\n DEFAULT_DASHBOARD_WIDGETS_BY_PRODUCT[productId] ?? WORKSPACES_DEFAULT_WIDGETS;\n const availableDefinitions = getDefinitionsForProduct(productId);\n const availableIds = new Set(Object.keys(availableDefinitions));\n\n if (!userPrefs || userPrefs.length === 0) {\n return productDefaults.filter((w) => availableIds.has(w.widgetId));\n }\n\n // Drop saved prefs for widgets that no longer exist for this product (legacy\n // prefs e.g. systemHealth or workflows on vibecontrols).\n const filteredPrefs = userPrefs.filter((w) => availableIds.has(w.widgetId));\n const userWidgetIds = new Set(filteredPrefs.map((w) => w.widgetId));\n const merged = [...filteredPrefs];\n\n for (const def of Object.values(availableDefinitions)) {\n if (!userWidgetIds.has(def.id)) {\n merged.push({\n widgetId: def.id,\n enabled: false,\n order: merged.length,\n size: def.defaultSize,\n });\n }\n }\n\n return merged.sort((a, b) => a.order - b.order);\n}\n"],"mappings":"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"}
|
|
@@ -84,7 +84,44 @@ function l(e) {
|
|
|
84
84
|
refetchOnWindowFocus: !0
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
-
|
|
87
|
+
var u = "\n query VibeControlsDashboardData {\n recentVibes(limit: 5) {\n id\n name\n status\n workspaceId\n updatedAt\n }\n activeSessions(pagination: { limit: 5 }) {\n items {\n id\n name\n status\n agentName\n startedAt\n vibeId\n }\n }\n agentFleetSummary {\n total\n online\n offline\n degraded\n lastSeenAt\n }\n }\n";
|
|
88
|
+
function d(e, t = !1) {
|
|
89
|
+
let { workspaceId: n } = r();
|
|
90
|
+
return i({
|
|
91
|
+
queryKey: [
|
|
92
|
+
"dashboard",
|
|
93
|
+
"vibecontrols",
|
|
94
|
+
n
|
|
95
|
+
],
|
|
96
|
+
enabled: !!e && !!n && t,
|
|
97
|
+
queryFn: async () => {
|
|
98
|
+
try {
|
|
99
|
+
let t = (await o({
|
|
100
|
+
gateway: "workspace",
|
|
101
|
+
authToken: e || void 0,
|
|
102
|
+
workspaceToken: !0,
|
|
103
|
+
query: u
|
|
104
|
+
})).data;
|
|
105
|
+
return {
|
|
106
|
+
recentVibes: t?.recentVibes ?? [],
|
|
107
|
+
activeSessions: t?.activeSessions?.items ?? [],
|
|
108
|
+
agentFleet: t?.agentFleetSummary ?? null
|
|
109
|
+
};
|
|
110
|
+
} catch {
|
|
111
|
+
return {
|
|
112
|
+
recentVibes: [],
|
|
113
|
+
activeSessions: [],
|
|
114
|
+
agentFleet: null
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
staleTime: 60 * 1e3,
|
|
119
|
+
gcTime: 300 * 1e3,
|
|
120
|
+
retry: 0,
|
|
121
|
+
refetchOnWindowFocus: !0
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function f(e) {
|
|
88
125
|
return i({
|
|
89
126
|
queryKey: ["dashboard", "global"],
|
|
90
127
|
enabled: !!e,
|
|
@@ -113,6 +150,6 @@ function u(e) {
|
|
|
113
150
|
});
|
|
114
151
|
}
|
|
115
152
|
//#endregion
|
|
116
|
-
export {
|
|
153
|
+
export { f as useGlobalDashboardData, c as useProjectsDashboardData, d as useVibecontrolsDashboardData, l as useWorkspaceDashboardData };
|
|
117
154
|
|
|
118
155
|
//# sourceMappingURL=useDashboardData.js.map
|