@burdenoff/microfe-workspaces 2026.510.50
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/README.md +88 -0
- package/dist/WorkspacesRoot.d.ts +35 -0
- package/dist/WorkspacesRoot.d.ts.map +1 -0
- package/dist/WorkspacesRoot.js +71 -0
- package/dist/WorkspacesRoot.js.map +1 -0
- package/dist/WorkspacesRoutes.d.ts +10 -0
- package/dist/WorkspacesRoutes.d.ts.map +1 -0
- package/dist/WorkspacesRoutes.js +111 -0
- package/dist/WorkspacesRoutes.js.map +1 -0
- package/dist/components/CreateProjectDialog.d.ts +6 -0
- package/dist/components/CreateProjectDialog.d.ts.map +1 -0
- package/dist/components/CreateProjectDialog.js +115 -0
- package/dist/components/CreateProjectDialog.js.map +1 -0
- package/dist/components/CreateWorkspaceDialog.d.ts +2 -0
- package/dist/components/CreateWorkspaceDialog.d.ts.map +1 -0
- package/dist/components/CreateWorkspaceDialog.js +172 -0
- package/dist/components/CreateWorkspaceDialog.js.map +1 -0
- package/dist/components/InviteMemberDialog.d.ts +7 -0
- package/dist/components/InviteMemberDialog.d.ts.map +1 -0
- package/dist/components/InviteMemberDialog.js +148 -0
- package/dist/components/InviteMemberDialog.js.map +1 -0
- package/dist/components/MemberListItem.d.ts +11 -0
- package/dist/components/MemberListItem.d.ts.map +1 -0
- package/dist/components/MemberListItem.js +118 -0
- package/dist/components/MemberListItem.js.map +1 -0
- package/dist/components/ProjectCard.d.ts +13 -0
- package/dist/components/ProjectCard.d.ts.map +1 -0
- package/dist/components/ProjectCard.js +150 -0
- package/dist/components/ProjectCard.js.map +1 -0
- package/dist/components/WorkspaceCard.d.ts +8 -0
- package/dist/components/WorkspaceCard.d.ts.map +1 -0
- package/dist/components/WorkspaceCard.js +79 -0
- package/dist/components/WorkspaceCard.js.map +1 -0
- package/dist/components/WorkspacesErrorBoundary.d.ts +27 -0
- package/dist/components/WorkspacesErrorBoundary.d.ts.map +1 -0
- package/dist/components/WorkspacesErrorBoundary.js +136 -0
- package/dist/components/WorkspacesErrorBoundary.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +7 -0
- package/dist/constants/permissions.d.ts +33 -0
- package/dist/constants/permissions.d.ts.map +1 -0
- package/dist/constants/permissions.js +31 -0
- package/dist/constants/permissions.js.map +1 -0
- package/dist/generated/global-operations.d.ts +279 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-operations.js +103 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20714 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2209 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +576 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +54990 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/useMemberMutations.d.ts +61 -0
- package/dist/hooks/useMemberMutations.d.ts.map +1 -0
- package/dist/hooks/useMemberMutations.js +263 -0
- package/dist/hooks/useMemberMutations.js.map +1 -0
- package/dist/hooks/useProjectMutations.d.ts +26 -0
- package/dist/hooks/useProjectMutations.d.ts.map +1 -0
- package/dist/hooks/useProjectMutations.js +127 -0
- package/dist/hooks/useProjectMutations.js.map +1 -0
- package/dist/hooks/useProjects.d.ts +16 -0
- package/dist/hooks/useProjects.d.ts.map +1 -0
- package/dist/hooks/useProjects.js +103 -0
- package/dist/hooks/useProjects.js.map +1 -0
- package/dist/hooks/useScopedNavigation.d.ts +4 -0
- package/dist/hooks/useScopedNavigation.d.ts.map +1 -0
- package/dist/hooks/useScopedNavigation.js +11 -0
- package/dist/hooks/useScopedNavigation.js.map +1 -0
- package/dist/hooks/useTenants.d.ts +13 -0
- package/dist/hooks/useTenants.d.ts.map +1 -0
- package/dist/hooks/useTenants.js +47 -0
- package/dist/hooks/useTenants.js.map +1 -0
- package/dist/hooks/useWorkspaceActivity.d.ts +12 -0
- package/dist/hooks/useWorkspaceActivity.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceActivity.js +31 -0
- package/dist/hooks/useWorkspaceActivity.js.map +1 -0
- package/dist/hooks/useWorkspaceMembers.d.ts +24 -0
- package/dist/hooks/useWorkspaceMembers.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceMembers.js +130 -0
- package/dist/hooks/useWorkspaceMembers.js.map +1 -0
- package/dist/hooks/useWorkspaceMutations.d.ts +36 -0
- package/dist/hooks/useWorkspaceMutations.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceMutations.js +119 -0
- package/dist/hooks/useWorkspaceMutations.js.map +1 -0
- package/dist/hooks/useWorkspacePermissions.d.ts +29 -0
- package/dist/hooks/useWorkspacePermissions.d.ts.map +1 -0
- package/dist/hooks/useWorkspacePermissions.js +33 -0
- package/dist/hooks/useWorkspacePermissions.js.map +1 -0
- package/dist/hooks/useWorkspaceRoles.d.ts +8 -0
- package/dist/hooks/useWorkspaceRoles.d.ts.map +1 -0
- package/dist/hooks/useWorkspaceRoles.js +31 -0
- package/dist/hooks/useWorkspaceRoles.js.map +1 -0
- package/dist/hooks/useWorkspaces.d.ts +21 -0
- package/dist/hooks/useWorkspaces.d.ts.map +1 -0
- package/dist/hooks/useWorkspaces.js +75 -0
- package/dist/hooks/useWorkspaces.js.map +1 -0
- package/dist/hooks/useWorkspacesEventEmitter.d.ts +14 -0
- package/dist/hooks/useWorkspacesEventEmitter.d.ts.map +1 -0
- package/dist/hooks/useWorkspacesEventEmitter.js +14 -0
- package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/pages/ActivityListPage.d.ts +2 -0
- package/dist/pages/ActivityListPage.d.ts.map +1 -0
- package/dist/pages/ActivityListPage.js +119 -0
- package/dist/pages/ActivityListPage.js.map +1 -0
- package/dist/pages/CreateWorkspacePage.d.ts +2 -0
- package/dist/pages/CreateWorkspacePage.d.ts.map +1 -0
- package/dist/pages/CreateWorkspacePage.js +264 -0
- package/dist/pages/CreateWorkspacePage.js.map +1 -0
- package/dist/pages/InviteAcceptancePage.d.ts +6 -0
- package/dist/pages/InviteAcceptancePage.d.ts.map +1 -0
- package/dist/pages/InviteAcceptancePage.js +495 -0
- package/dist/pages/InviteAcceptancePage.js.map +1 -0
- package/dist/pages/MembersListPage.d.ts +2 -0
- package/dist/pages/MembersListPage.d.ts.map +1 -0
- package/dist/pages/MembersListPage.js +420 -0
- package/dist/pages/MembersListPage.js.map +1 -0
- package/dist/pages/ProjectDetailPage.d.ts +2 -0
- package/dist/pages/ProjectDetailPage.d.ts.map +1 -0
- package/dist/pages/ProjectDetailPage.js +361 -0
- package/dist/pages/ProjectDetailPage.js.map +1 -0
- package/dist/pages/ProjectsListPage.d.ts +2 -0
- package/dist/pages/ProjectsListPage.d.ts.map +1 -0
- package/dist/pages/ProjectsListPage.js +398 -0
- package/dist/pages/ProjectsListPage.js.map +1 -0
- package/dist/pages/WorkspaceDetailPage.d.ts +2 -0
- package/dist/pages/WorkspaceDetailPage.d.ts.map +1 -0
- package/dist/pages/WorkspaceDetailPage.js +230 -0
- package/dist/pages/WorkspaceDetailPage.js.map +1 -0
- package/dist/pages/WorkspaceSettingsPage.d.ts +2 -0
- package/dist/pages/WorkspaceSettingsPage.d.ts.map +1 -0
- package/dist/pages/WorkspaceSettingsPage.js +157 -0
- package/dist/pages/WorkspaceSettingsPage.js.map +1 -0
- package/dist/pages/WorkspacesListPage.d.ts +2 -0
- package/dist/pages/WorkspacesListPage.d.ts.map +1 -0
- package/dist/pages/WorkspacesListPage.js +186 -0
- package/dist/pages/WorkspacesListPage.js.map +1 -0
- package/dist/pages/dashboard/DashboardCustomizer.d.ts +12 -0
- package/dist/pages/dashboard/DashboardCustomizer.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardCustomizer.js +136 -0
- package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -0
- package/dist/pages/dashboard/DashboardGrid.d.ts +8 -0
- package/dist/pages/dashboard/DashboardGrid.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardGrid.js +58 -0
- package/dist/pages/dashboard/DashboardGrid.js.map +1 -0
- package/dist/pages/dashboard/DashboardPage.d.ts +14 -0
- package/dist/pages/dashboard/DashboardPage.d.ts.map +1 -0
- package/dist/pages/dashboard/DashboardPage.js +136 -0
- package/dist/pages/dashboard/DashboardPage.js.map +1 -0
- package/dist/pages/dashboard/WidgetWrapper.d.ts +17 -0
- package/dist/pages/dashboard/WidgetWrapper.d.ts.map +1 -0
- package/dist/pages/dashboard/WidgetWrapper.js +72 -0
- package/dist/pages/dashboard/WidgetWrapper.js.map +1 -0
- package/dist/pages/dashboard/config.d.ts +9 -0
- package/dist/pages/dashboard/config.d.ts.map +1 -0
- package/dist/pages/dashboard/config.js +214 -0
- package/dist/pages/dashboard/config.js.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts +9 -0
- package/dist/pages/dashboard/hooks/useDashboardData.d.ts.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardData.js +118 -0
- package/dist/pages/dashboard/hooks/useDashboardData.js.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts +4 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.d.ts.map +1 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.js +32 -0
- package/dist/pages/dashboard/hooks/useDashboardPreferences.js.map +1 -0
- package/dist/pages/dashboard/types.d.ts +145 -0
- package/dist/pages/dashboard/types.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.js +59 -0
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/MembersWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/MembersWidget.js +65 -0
- package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.js +91 -0
- package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js +80 -0
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js +81 -0
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/StorageWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/StorageWidget.js +69 -0
- package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js +59 -0
- package/dist/pages/dashboard/widgets/SystemHealthWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +61 -0
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/TipsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/TipsWidget.js +67 -0
- package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +83 -0
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +71 -0
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +97 -0
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts +4 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.d.ts.map +1 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js +67 -0
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -0
- package/dist/providers/WorkspacesProvider.d.ts +13 -0
- package/dist/providers/WorkspacesProvider.d.ts.map +1 -0
- package/dist/providers/WorkspacesProvider.js +24 -0
- package/dist/providers/WorkspacesProvider.js.map +1 -0
- package/dist/store/workspacesStore.d.ts +82 -0
- package/dist/store/workspacesStore.d.ts.map +1 -0
- package/dist/store/workspacesStore.js +92 -0
- package/dist/store/workspacesStore.js.map +1 -0
- package/dist/types/index.d.ts +280 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/formatters.d.ts +60 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +61 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/dist/utils/projectTags.d.ts +6 -0
- package/dist/utils/projectTags.d.ts.map +1 -0
- package/dist/utils/projectTags.js +49 -0
- package/dist/utils/projectTags.js.map +1 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +8 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/tokenHelpers.d.ts +114 -0
- package/dist/utils/tokenHelpers.d.ts.map +1 -0
- package/dist/utils/tokenHelpers.js +80 -0
- package/dist/utils/tokenHelpers.js.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { HardDrive as t } from "lucide-react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/pages/dashboard/widgets/StorageWidget.tsx
|
|
5
|
+
function i(e) {
|
|
6
|
+
if (e === 0) return "0 B";
|
|
7
|
+
let t = 1024, n = [
|
|
8
|
+
"B",
|
|
9
|
+
"KB",
|
|
10
|
+
"MB",
|
|
11
|
+
"GB",
|
|
12
|
+
"TB"
|
|
13
|
+
], r = Math.floor(Math.log(e) / Math.log(t));
|
|
14
|
+
return `${parseFloat((e / t ** +r).toFixed(1))} ${n[r]}`;
|
|
15
|
+
}
|
|
16
|
+
function a({ workspaceData: a, isLoading: o }) {
|
|
17
|
+
let s = a?.storageUsage, c = s?.usedBytes ?? 0, l = s?.totalBytes ?? 0, u = l > 0 ? Math.min(c / l * 100, 100) : 0, d = u > 80 ? "bg-status-error-bg" : u > 60 ? "bg-status-warning-bg" : "bg-status-success-bg";
|
|
18
|
+
return /* @__PURE__ */ n(e, {
|
|
19
|
+
title: "Storage",
|
|
20
|
+
icon: /* @__PURE__ */ n(t, { className: "h-4 w-4" }),
|
|
21
|
+
size: "small",
|
|
22
|
+
isLoading: o,
|
|
23
|
+
children: s ? /* @__PURE__ */ r("div", {
|
|
24
|
+
className: "space-y-3",
|
|
25
|
+
children: [/* @__PURE__ */ r("div", {
|
|
26
|
+
className: "space-y-1.5",
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ r("div", {
|
|
29
|
+
className: "flex justify-between text-xs",
|
|
30
|
+
children: [/* @__PURE__ */ n("span", {
|
|
31
|
+
className: "text-muted-foreground",
|
|
32
|
+
children: "Used"
|
|
33
|
+
}), /* @__PURE__ */ r("span", {
|
|
34
|
+
className: "font-medium text-text-primary",
|
|
35
|
+
children: [i(c), l > 0 ? ` / ${i(l)}` : ""]
|
|
36
|
+
})]
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ n("div", {
|
|
39
|
+
className: "h-2 w-full bg-muted rounded-full overflow-hidden",
|
|
40
|
+
children: /* @__PURE__ */ n("div", {
|
|
41
|
+
className: `h-full rounded-full ${d} transition-all duration-500`,
|
|
42
|
+
style: { width: `${u}%` }
|
|
43
|
+
})
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ n("p", {
|
|
46
|
+
className: "text-[11px] text-muted-foreground text-right",
|
|
47
|
+
children: l > 0 ? `${u.toFixed(1)}% used` : "Limit unavailable"
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
}), s?.fileCount != null && /* @__PURE__ */ r("div", {
|
|
51
|
+
className: "flex items-center justify-between text-xs",
|
|
52
|
+
children: [/* @__PURE__ */ n("span", {
|
|
53
|
+
className: "text-muted-foreground",
|
|
54
|
+
children: "Total files"
|
|
55
|
+
}), /* @__PURE__ */ n("span", {
|
|
56
|
+
className: "font-medium text-text-primary",
|
|
57
|
+
children: s.fileCount.toLocaleString()
|
|
58
|
+
})]
|
|
59
|
+
})]
|
|
60
|
+
}) : /* @__PURE__ */ n("p", {
|
|
61
|
+
className: "text-xs text-muted-foreground",
|
|
62
|
+
children: "Storage metrics are unavailable."
|
|
63
|
+
})
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { a as StorageWidget };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=StorageWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/StorageWidget.tsx"],"sourcesContent":["import { HardDrive } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n\nexport function StorageWidget({ workspaceData, isLoading }: WidgetProps) {\n const storage = workspaceData?.storageUsage;\n\n const usedBytes = storage?.usedBytes ?? 0;\n const totalBytes = storage?.totalBytes ?? 0;\n const percentage = totalBytes > 0 ? Math.min((usedBytes / totalBytes) * 100, 100) : 0;\n const barColor =\n percentage > 80\n ? 'bg-status-error-bg'\n : percentage > 60\n ? 'bg-status-warning-bg'\n : 'bg-status-success-bg';\n\n return (\n <WidgetWrapper\n title=\"Storage\"\n icon={<HardDrive className=\"h-4 w-4\" />}\n size=\"small\"\n isLoading={isLoading}\n >\n {storage ? (\n <div className=\"space-y-3\">\n <div className=\"space-y-1.5\">\n <div className=\"flex justify-between text-xs\">\n <span className=\"text-muted-foreground\">Used</span>\n <span className=\"font-medium text-text-primary\">\n {formatBytes(usedBytes)}\n {totalBytes > 0 ? ` / ${formatBytes(totalBytes)}` : ''}\n </span>\n </div>\n <div className=\"h-2 w-full bg-muted rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full ${barColor} transition-all duration-500`}\n style={{ width: `${percentage}%` }}\n />\n </div>\n <p className=\"text-[11px] text-muted-foreground text-right\">\n {totalBytes > 0 ? `${percentage.toFixed(1)}% used` : 'Limit unavailable'}\n </p>\n </div>\n {storage?.fileCount != null && (\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Total files</span>\n <span className=\"font-medium text-text-primary\">\n {storage.fileCount.toLocaleString()}\n </span>\n </div>\n )}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">Storage metrics are unavailable.</p>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,SAAS,EAAY,GAAuB;AAC1C,KAAI,MAAU,EAAG,QAAO;CACxB,IAAM,IAAI,MACJ,IAAQ;EAAC;EAAK;EAAM;EAAM;EAAM;EAAK,EACrC,IAAI,KAAK,MAAM,KAAK,IAAI,EAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,QAAO,GAAG,YAAY,IAAiB,MAAG,GAAI,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAM;;AAGrE,SAAgB,EAAc,EAAE,kBAAe,gBAA0B;CACvE,IAAM,IAAU,GAAe,cAEzB,IAAY,GAAS,aAAa,GAClC,IAAa,GAAS,cAAc,GACpC,IAAa,IAAa,IAAI,KAAK,IAAK,IAAY,IAAc,KAAK,IAAI,GAAG,GAC9E,IACJ,IAAa,KACT,uBACA,IAAa,KACX,yBACA;AAER,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;EACvC,MAAK;EACM;YAEV,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAwB;OAAW,CAAA,EACnD,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CACG,EAAY,EAAU,EACtB,IAAa,IAAI,MAAM,EAAY,EAAW,KAAK,GAC/C;SACH;;KACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OACE,WAAW,uBAAuB,EAAS;OAC3C,OAAO,EAAE,OAAO,GAAG,EAAW,IAAI;OAClC,CAAA;MACE,CAAA;KACN,kBAAC,KAAD;MAAG,WAAU;gBACV,IAAa,IAAI,GAAG,EAAW,QAAQ,EAAE,CAAC,UAAU;MACnD,CAAA;KACA;OACL,GAAS,aAAa,QACrB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;eAAwB;KAAkB,CAAA,EAC1D,kBAAC,QAAD;KAAM,WAAU;eACb,EAAQ,UAAU,gBAAgB;KAC9B,CAAA,CACH;MAEJ;OAEN,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAAoC,CAAA;EAErE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemHealthWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/SystemHealthWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAW5C,wBAAgB,kBAAkB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,WAAW,2CA8B3E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { Circle as t, HeartPulse as n } from "lucide-react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
//#region src/pages/dashboard/widgets/SystemHealthWidget.tsx
|
|
5
|
+
var a = [
|
|
6
|
+
{
|
|
7
|
+
name: "Workspaces",
|
|
8
|
+
key: "workspaces"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "Auth",
|
|
12
|
+
key: "auth"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "Files",
|
|
16
|
+
key: "files"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: "Calendar",
|
|
20
|
+
key: "calendar"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "Workflows",
|
|
24
|
+
key: "workflows"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "Tags",
|
|
28
|
+
key: "tags"
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
function o({ workspaceData: o, isLoading: s }) {
|
|
32
|
+
let c = !!o;
|
|
33
|
+
return /* @__PURE__ */ r(e, {
|
|
34
|
+
title: "System Status",
|
|
35
|
+
icon: /* @__PURE__ */ r(n, { className: "h-4 w-4" }),
|
|
36
|
+
size: "small",
|
|
37
|
+
isLoading: s,
|
|
38
|
+
children: /* @__PURE__ */ r("div", {
|
|
39
|
+
className: "space-y-1.5",
|
|
40
|
+
children: a.map((e) => /* @__PURE__ */ i("div", {
|
|
41
|
+
className: "flex items-center justify-between py-0.5",
|
|
42
|
+
children: [/* @__PURE__ */ r("span", {
|
|
43
|
+
className: "text-xs text-text-secondary",
|
|
44
|
+
children: e.name
|
|
45
|
+
}), /* @__PURE__ */ i("div", {
|
|
46
|
+
className: "flex items-center gap-1",
|
|
47
|
+
children: [/* @__PURE__ */ r(t, { className: `h-2 w-2 fill-current ${c ? "text-status-success-text" : "text-text-tertiary"}` }), /* @__PURE__ */ r("span", {
|
|
48
|
+
className: `text-[11px] ${c ? "text-status-success-text" : "text-muted-foreground"}`,
|
|
49
|
+
children: c ? "Healthy" : "Unknown"
|
|
50
|
+
})]
|
|
51
|
+
})]
|
|
52
|
+
}, e.key))
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { o as SystemHealthWidget };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=SystemHealthWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemHealthWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/SystemHealthWidget.tsx"],"sourcesContent":["import { HeartPulse, Circle } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst SERVICES = [\n { name: 'Workspaces', key: 'workspaces' },\n { name: 'Auth', key: 'auth' },\n { name: 'Files', key: 'files' },\n { name: 'Calendar', key: 'calendar' },\n { name: 'Workflows', key: 'workflows' },\n { name: 'Tags', key: 'tags' },\n];\n\nexport function SystemHealthWidget({ workspaceData, isLoading }: WidgetProps) {\n // Infer health from whether data is available\n const wsAvailable = !!workspaceData;\n\n return (\n <WidgetWrapper\n title=\"System Status\"\n icon={<HeartPulse className=\"h-4 w-4\" />}\n size=\"small\"\n isLoading={isLoading}\n >\n <div className=\"space-y-1.5\">\n {SERVICES.map((svc) => (\n <div key={svc.key} className=\"flex items-center justify-between py-0.5\">\n <span className=\"text-xs text-text-secondary\">{svc.name}</span>\n <div className=\"flex items-center gap-1\">\n <Circle\n className={`h-2 w-2 fill-current ${wsAvailable ? 'text-status-success-text' : 'text-text-tertiary'}`}\n />\n <span\n className={`text-[11px] ${wsAvailable ? 'text-status-success-text' : 'text-muted-foreground'}`}\n >\n {wsAvailable ? 'Healthy' : 'Unknown'}\n </span>\n </div>\n </div>\n ))}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,IAAM,IAAW;CACf;EAAE,MAAM;EAAc,KAAK;EAAc;CACzC;EAAE,MAAM;EAAQ,KAAK;EAAQ;CAC7B;EAAE,MAAM;EAAS,KAAK;EAAS;CAC/B;EAAE,MAAM;EAAY,KAAK;EAAY;CACrC;EAAE,MAAM;EAAa,KAAK;EAAa;CACvC;EAAE,MAAM;EAAQ,KAAK;EAAQ;CAC9B;AAED,SAAgB,EAAmB,EAAE,kBAAe,gBAA0B;CAE5E,IAAM,IAAc,CAAC,CAAC;AAEtB,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;EACxC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAS,KAAK,MACb,kBAAC,OAAD;IAAmB,WAAU;cAA7B,CACE,kBAAC,QAAD;KAAM,WAAU;eAA+B,EAAI;KAAY,CAAA,EAC/D,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EACE,WAAW,wBAAwB,IAAc,6BAA6B,wBAC9E,CAAA,EACF,kBAAC,QAAD;MACE,WAAW,eAAe,IAAc,6BAA6B;gBAEpE,IAAc,YAAY;MACtB,CAAA,CACH;OACF;MAZI,EAAI,IAYR,CACN;GACE,CAAA;EACQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagCloudWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/TagCloudWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAa5C,wBAAgB,cAAc,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,WAAW,2CA0CjF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { ArrowRight as t, Tags as n } from "lucide-react";
|
|
3
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
import { Badge as a, Button as o } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/pages/dashboard/widgets/TagCloudWidget.tsx
|
|
6
|
+
var s = [
|
|
7
|
+
"bg-status-info-bg-subtle text-status-info-text border-border-default",
|
|
8
|
+
"bg-status-success-bg-subtle text-status-success-text border-border-default",
|
|
9
|
+
"bg-accent-purple-subtle text-accent-purple border-border-default",
|
|
10
|
+
"bg-status-warning-bg-subtle text-status-warning-text border-border-default",
|
|
11
|
+
"bg-accent-pink-subtle text-accent-pink border-border-default",
|
|
12
|
+
"bg-accent-cyan-subtle text-accent-cyan border-border-default",
|
|
13
|
+
"bg-accent-orange-subtle text-accent-orange border-border-default",
|
|
14
|
+
"bg-accent-rose-subtle text-accent-rose border-border-default"
|
|
15
|
+
];
|
|
16
|
+
function c({ workspaceData: c, isLoading: l, navigate: u }) {
|
|
17
|
+
let d = c?.tags.items ?? [], f = c?.tags.total ?? 0;
|
|
18
|
+
return /* @__PURE__ */ r(e, {
|
|
19
|
+
title: "Tags",
|
|
20
|
+
icon: /* @__PURE__ */ r(n, { className: "h-4 w-4" }),
|
|
21
|
+
size: "small",
|
|
22
|
+
isLoading: l,
|
|
23
|
+
unavailable: !c,
|
|
24
|
+
headerAction: /* @__PURE__ */ r(o, {
|
|
25
|
+
variant: "ghost",
|
|
26
|
+
size: "sm",
|
|
27
|
+
className: "text-xs",
|
|
28
|
+
onClick: () => u("/tags"),
|
|
29
|
+
children: /* @__PURE__ */ r(t, { className: "h-3 w-3" })
|
|
30
|
+
}),
|
|
31
|
+
children: d.length === 0 ? /* @__PURE__ */ r("div", {
|
|
32
|
+
className: "text-center py-3",
|
|
33
|
+
children: /* @__PURE__ */ r("p", {
|
|
34
|
+
className: "text-xs text-muted-foreground",
|
|
35
|
+
children: "No tags created yet"
|
|
36
|
+
})
|
|
37
|
+
}) : /* @__PURE__ */ i("div", {
|
|
38
|
+
className: "space-y-2",
|
|
39
|
+
children: [/* @__PURE__ */ r("div", {
|
|
40
|
+
className: "flex flex-wrap gap-1.5",
|
|
41
|
+
children: d.slice(0, 12).map((e, t) => /* @__PURE__ */ r(a, {
|
|
42
|
+
variant: "outline",
|
|
43
|
+
className: `text-[11px] cursor-pointer hover:opacity-80 transition-opacity ${s[t % s.length]}`,
|
|
44
|
+
onClick: () => u("/tags"),
|
|
45
|
+
children: e.label
|
|
46
|
+
}, e.id))
|
|
47
|
+
}), f > 12 && /* @__PURE__ */ i("p", {
|
|
48
|
+
className: "text-[11px] text-muted-foreground text-center",
|
|
49
|
+
children: [
|
|
50
|
+
"+",
|
|
51
|
+
f - 12,
|
|
52
|
+
" more tags"
|
|
53
|
+
]
|
|
54
|
+
})]
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { c as TagCloudWidget };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=TagCloudWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TagCloudWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TagCloudWidget.tsx"],"sourcesContent":["import { Tags, ArrowRight } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst tagColors = [\n 'bg-status-info-bg-subtle text-status-info-text border-border-default',\n 'bg-status-success-bg-subtle text-status-success-text border-border-default',\n 'bg-accent-purple-subtle text-accent-purple border-border-default',\n 'bg-status-warning-bg-subtle text-status-warning-text border-border-default',\n 'bg-accent-pink-subtle text-accent-pink border-border-default',\n 'bg-accent-cyan-subtle text-accent-cyan border-border-default',\n 'bg-accent-orange-subtle text-accent-orange border-border-default',\n 'bg-accent-rose-subtle text-accent-rose border-border-default',\n];\n\nexport function TagCloudWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const tags = workspaceData?.tags.items ?? [];\n const total = workspaceData?.tags.total ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Tags\"\n icon={<Tags className=\"h-4 w-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/tags')}>\n <ArrowRight className=\"h-3 w-3\" />\n </Button>\n }\n >\n {tags.length === 0 ? (\n <div className=\"text-center py-3\">\n <p className=\"text-xs text-muted-foreground\">No tags created yet</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-1.5\">\n {tags.slice(0, 12).map((tag, idx) => (\n <Badge\n key={tag.id}\n variant=\"outline\"\n className={`text-[11px] cursor-pointer hover:opacity-80 transition-opacity ${tagColors[idx % tagColors.length]}`}\n onClick={() => navigate('/tags')}\n >\n {tag.label}\n </Badge>\n ))}\n </div>\n {total > 12 && (\n <p className=\"text-[11px] text-muted-foreground text-center\">+{total - 12} more tags</p>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,IAAM,IAAY;CAChB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,IAAO,GAAe,KAAK,SAAS,EAAE,EACtC,IAAQ,GAAe,KAAK,SAAS;AAE3C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;EAClC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,QAAQ;aACpF,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;GAC3B,CAAA;YAGV,EAAK,WAAW,IACf,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAuB,CAAA;GAChE,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,MAAM,GAAG,GAAG,CAAC,KAAK,GAAK,MAC3B,kBAAC,GAAD;KAEE,SAAQ;KACR,WAAW,kEAAkE,EAAU,IAAM,EAAU;KACvG,eAAe,EAAS,QAAQ;eAE/B,EAAI;KACC,EAND,EAAI,GAMH,CACR;IACE,CAAA,EACL,IAAQ,MACP,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA6D;KAAE,IAAQ;KAAG;KAAc;MAEtF;;EAEM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipsWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/TipsWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAiC5C,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,2CA4B9D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { BookOpen as t, ExternalLink as n, Lightbulb as r, Rocket as i, Shield as a, Workflow as o } from "lucide-react";
|
|
3
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
4
|
+
//#region src/pages/dashboard/widgets/TipsWidget.tsx
|
|
5
|
+
var l = [
|
|
6
|
+
{
|
|
7
|
+
icon: i,
|
|
8
|
+
title: "Create your first workspace",
|
|
9
|
+
description: "Organize your team with a dedicated workspace.",
|
|
10
|
+
path: "/workspaces/list",
|
|
11
|
+
color: "text-accent-blue"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
icon: o,
|
|
15
|
+
title: "Automate with workflows",
|
|
16
|
+
description: "Build automation workflows to streamline your processes.",
|
|
17
|
+
path: "/workflows",
|
|
18
|
+
color: "text-status-success-text"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
icon: a,
|
|
22
|
+
title: "Set up permissions",
|
|
23
|
+
description: "Configure role-based access for your workspace members.",
|
|
24
|
+
path: "/rbac",
|
|
25
|
+
color: "text-accent-purple"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
icon: t,
|
|
29
|
+
title: "Explore the API",
|
|
30
|
+
description: "Check out our developer portal for API documentation.",
|
|
31
|
+
path: "/devportal",
|
|
32
|
+
color: "text-status-warning-text"
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
function u({ navigate: t, isLoading: i }) {
|
|
36
|
+
return /* @__PURE__ */ s(e, {
|
|
37
|
+
title: "Tips & Resources",
|
|
38
|
+
icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
|
|
39
|
+
size: "small",
|
|
40
|
+
isLoading: i,
|
|
41
|
+
children: /* @__PURE__ */ s("div", {
|
|
42
|
+
className: "space-y-2",
|
|
43
|
+
children: l.map((e) => /* @__PURE__ */ c("div", {
|
|
44
|
+
className: "flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 cursor-pointer transition-colors",
|
|
45
|
+
onClick: () => t(e.path),
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ s(e.icon, { className: `h-4 w-4 mt-0.5 shrink-0 ${e.color}` }),
|
|
48
|
+
/* @__PURE__ */ c("div", {
|
|
49
|
+
className: "min-w-0",
|
|
50
|
+
children: [/* @__PURE__ */ s("p", {
|
|
51
|
+
className: "text-xs font-medium text-text-primary leading-tight",
|
|
52
|
+
children: e.title
|
|
53
|
+
}), /* @__PURE__ */ s("p", {
|
|
54
|
+
className: "text-[11px] text-muted-foreground leading-tight mt-0.5",
|
|
55
|
+
children: e.description
|
|
56
|
+
})]
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ s(n, { className: "h-3 w-3 text-muted-foreground shrink-0 mt-0.5" })
|
|
59
|
+
]
|
|
60
|
+
}, e.title))
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { u as TipsWidget };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=TipsWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/TipsWidget.tsx"],"sourcesContent":["import { Lightbulb, ExternalLink, BookOpen, Rocket, Shield, Workflow } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst TIPS = [\n {\n icon: Rocket,\n title: 'Create your first workspace',\n description: 'Organize your team with a dedicated workspace.',\n path: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n icon: Workflow,\n title: 'Automate with workflows',\n description: 'Build automation workflows to streamline your processes.',\n path: '/workflows',\n color: 'text-status-success-text',\n },\n {\n icon: Shield,\n title: 'Set up permissions',\n description: 'Configure role-based access for your workspace members.',\n path: '/rbac',\n color: 'text-accent-purple',\n },\n {\n icon: BookOpen,\n title: 'Explore the API',\n description: 'Check out our developer portal for API documentation.',\n path: '/devportal',\n color: 'text-status-warning-text',\n },\n];\n\nexport function TipsWidget({ navigate, isLoading }: WidgetProps) {\n return (\n <WidgetWrapper\n title=\"Tips & Resources\"\n icon={<Lightbulb className=\"h-4 w-4\" />}\n size=\"small\"\n isLoading={isLoading}\n >\n <div className=\"space-y-2\">\n {TIPS.map((tip) => (\n <div\n key={tip.title}\n className=\"flex items-start gap-2 p-1.5 rounded hover:bg-accent/5 cursor-pointer transition-colors\"\n onClick={() => navigate(tip.path)}\n >\n <tip.icon className={`h-4 w-4 mt-0.5 shrink-0 ${tip.color}`} />\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary leading-tight\">{tip.title}</p>\n <p className=\"text-[11px] text-muted-foreground leading-tight mt-0.5\">\n {tip.description}\n </p>\n </div>\n <ExternalLink className=\"h-3 w-3 text-muted-foreground shrink-0 mt-0.5\" />\n </div>\n ))}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,IAAM,IAAO;CACX;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACP,aAAa;EACb,MAAM;EACN,OAAO;EACR;CACF;AAED,SAAgB,EAAW,EAAE,aAAU,gBAA0B;AAC/D,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;EACvC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAK,KAAK,MACT,kBAAC,OAAD;IAEE,WAAU;IACV,eAAe,EAAS,EAAI,KAAK;cAHnC;KAKE,kBAAC,EAAI,MAAL,EAAU,WAAW,2BAA2B,EAAI,SAAW,CAAA;KAC/D,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuD,EAAI;OAAU,CAAA,EAClF,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAI;OACH,CAAA,CACA;;KACN,kBAAC,GAAD,EAAc,WAAU,iDAAkD,CAAA;KACtE;MAZC,EAAI,MAYL,CACN;GACE,CAAA;EACQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpcomingEventsWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/UpcomingEventsWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAsB5C,wBAAgB,oBAAoB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,WAAW,2CAsDvF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { ArrowRight as t, Calendar as n, Clock as r } from "lucide-react";
|
|
3
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
+
import { Badge as o, Button as s } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/pages/dashboard/widgets/UpcomingEventsWidget.tsx
|
|
6
|
+
function c(e) {
|
|
7
|
+
let t = new Date(e), n = /* @__PURE__ */ new Date(), r = t.toDateString() === n.toDateString(), i = new Date(n);
|
|
8
|
+
i.setDate(i.getDate() + 1);
|
|
9
|
+
let a = t.toDateString() === i.toDateString();
|
|
10
|
+
return r ? `Today at ${t.toLocaleTimeString([], {
|
|
11
|
+
hour: "2-digit",
|
|
12
|
+
minute: "2-digit"
|
|
13
|
+
})}` : a ? `Tomorrow at ${t.toLocaleTimeString([], {
|
|
14
|
+
hour: "2-digit",
|
|
15
|
+
minute: "2-digit"
|
|
16
|
+
})}` : t.toLocaleDateString([], {
|
|
17
|
+
month: "short",
|
|
18
|
+
day: "numeric",
|
|
19
|
+
hour: "2-digit",
|
|
20
|
+
minute: "2-digit"
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function l({ workspaceData: l, isLoading: u, navigate: d }) {
|
|
24
|
+
let f = l?.upcomingEvents ?? [];
|
|
25
|
+
return /* @__PURE__ */ i(e, {
|
|
26
|
+
title: "Upcoming Events",
|
|
27
|
+
icon: /* @__PURE__ */ i(n, { className: "h-4 w-4" }),
|
|
28
|
+
size: "medium",
|
|
29
|
+
isLoading: u,
|
|
30
|
+
unavailable: !l,
|
|
31
|
+
headerAction: /* @__PURE__ */ a(s, {
|
|
32
|
+
variant: "ghost",
|
|
33
|
+
size: "sm",
|
|
34
|
+
className: "text-xs",
|
|
35
|
+
onClick: () => d("/calendar"),
|
|
36
|
+
children: ["View all ", /* @__PURE__ */ i(t, { className: "ml-1 h-3 w-3" })]
|
|
37
|
+
}),
|
|
38
|
+
children: f.length === 0 ? /* @__PURE__ */ a("div", {
|
|
39
|
+
className: "text-center py-4",
|
|
40
|
+
children: [/* @__PURE__ */ i("p", {
|
|
41
|
+
className: "text-sm text-muted-foreground",
|
|
42
|
+
children: "No upcoming events"
|
|
43
|
+
}), /* @__PURE__ */ i(s, {
|
|
44
|
+
variant: "outline",
|
|
45
|
+
size: "sm",
|
|
46
|
+
className: "mt-2",
|
|
47
|
+
onClick: () => d("/calendar"),
|
|
48
|
+
children: "Schedule an event"
|
|
49
|
+
})]
|
|
50
|
+
}) : /* @__PURE__ */ i("div", {
|
|
51
|
+
className: "space-y-2",
|
|
52
|
+
children: f.map((e) => /* @__PURE__ */ a("div", {
|
|
53
|
+
className: "flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors",
|
|
54
|
+
onClick: () => d("/calendar"),
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ i("div", {
|
|
57
|
+
className: "rounded-md bg-accent-pink-subtle text-accent-pink p-1.5 shrink-0",
|
|
58
|
+
children: /* @__PURE__ */ i(r, { className: "h-3.5 w-3.5" })
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ a("div", {
|
|
61
|
+
className: "min-w-0 flex-1",
|
|
62
|
+
children: [/* @__PURE__ */ i("p", {
|
|
63
|
+
className: "text-sm font-medium text-text-primary truncate",
|
|
64
|
+
children: e.title
|
|
65
|
+
}), /* @__PURE__ */ i("p", {
|
|
66
|
+
className: "text-xs text-muted-foreground",
|
|
67
|
+
children: c(e.startTime)
|
|
68
|
+
})]
|
|
69
|
+
}),
|
|
70
|
+
e.allDay && /* @__PURE__ */ i(o, {
|
|
71
|
+
variant: "secondary",
|
|
72
|
+
className: "text-[10px] shrink-0",
|
|
73
|
+
children: "All day"
|
|
74
|
+
})
|
|
75
|
+
]
|
|
76
|
+
}, e.id))
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { l as UpcomingEventsWidget };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=UpcomingEventsWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpcomingEventsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/UpcomingEventsWidget.tsx"],"sourcesContent":["import { Calendar, ArrowRight, Clock } from 'lucide-react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatEventDate(dateStr: string): string {\n const d = new Date(dateStr);\n const now = new Date();\n const isToday = d.toDateString() === now.toDateString();\n const tomorrow = new Date(now);\n tomorrow.setDate(tomorrow.getDate() + 1);\n const isTomorrow = d.toDateString() === tomorrow.toDateString();\n\n if (isToday)\n return `Today at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n if (isTomorrow)\n return `Tomorrow at ${d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n return d.toLocaleDateString([], {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function UpcomingEventsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const events = workspaceData?.upcomingEvents ?? [];\n\n return (\n <WidgetWrapper\n title=\"Upcoming Events\"\n icon={<Calendar className=\"h-4 w-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\" onClick={() => navigate('/calendar')}>\n View all <ArrowRight className=\"ml-1 h-3 w-3\" />\n </Button>\n }\n >\n {events.length === 0 ? (\n <div className=\"text-center py-4\">\n <p className=\"text-sm text-muted-foreground\">No upcoming events</p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => navigate('/calendar')}\n >\n Schedule an event\n </Button>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {events.map((event) => (\n <div\n key={event.id}\n className=\"flex items-start gap-3 p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors\"\n onClick={() => navigate('/calendar')}\n >\n <div className=\"rounded-md bg-accent-pink-subtle text-accent-pink p-1.5 shrink-0\">\n <Clock className=\"h-3.5 w-3.5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary truncate\">{event.title}</p>\n <p className=\"text-xs text-muted-foreground\">{formatEventDate(event.startTime)}</p>\n </div>\n {event.allDay && (\n <Badge variant=\"secondary\" className=\"text-[10px] shrink-0\">\n All day\n </Badge>\n )}\n </div>\n ))}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAgB,GAAyB;CAChD,IAAM,IAAI,IAAI,KAAK,EAAQ,EACrB,oBAAM,IAAI,MAAM,EAChB,IAAU,EAAE,cAAc,KAAK,EAAI,cAAc,EACjD,IAAW,IAAI,KAAK,EAAI;AAC9B,GAAS,QAAQ,EAAS,SAAS,GAAG,EAAE;CACxC,IAAM,IAAa,EAAE,cAAc,KAAK,EAAS,cAAc;AAM/D,QAJI,IACK,YAAY,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,IACK,eAAe,EAAE,mBAAmB,EAAE,EAAE;EAAE,MAAM;EAAW,QAAQ;EAAW,CAAC,KACjF,EAAE,mBAAmB,EAAE,EAAE;EAC9B,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAGJ,SAAgB,EAAqB,EAAE,kBAAe,cAAW,eAAyB;CACxF,IAAM,IAAS,GAAe,kBAAkB,EAAE;AAElD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;EACtC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GAAQ,SAAQ;GAAQ,MAAK;GAAK,WAAU;GAAU,eAAe,EAAS,YAAY;aAA1F,CAA4F,aACjF,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,CACzC;;YAGV,EAAO,WAAW,IACjB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAsB,CAAA,EACnE,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,WAAU;IACV,eAAe,EAAS,YAAY;cACrC;IAEQ,CAAA,CACL;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAO,KAAK,MACX,kBAAC,OAAD;IAEE,WAAU;IACV,eAAe,EAAS,YAAY;cAHtC;KAKE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA;MAC7B,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAkD,EAAM;OAAU,CAAA,EAC/E,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAgB,EAAM,UAAU;OAAK,CAAA,CAC/E;;KACL,EAAM,UACL,kBAAC,GAAD;MAAO,SAAQ;MAAY,WAAU;gBAAuB;MAEpD,CAAA;KAEN;MAhBC,EAAM,GAgBP,CACN;GACE,CAAA;EAEM,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WelcomeWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/WelcomeWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAsB5C,wBAAgB,aAAa,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,WAAW,2CAgDlF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { Activity as t, Building2 as n, FolderKanban as r, LayoutDashboard as i, Users as a } from "lucide-react";
|
|
3
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
+
//#region src/pages/dashboard/widgets/WelcomeWidget.tsx
|
|
5
|
+
function c({ icon: e, label: t, value: n }) {
|
|
6
|
+
return /* @__PURE__ */ s("div", {
|
|
7
|
+
className: "flex items-center gap-3 rounded-lg bg-bg-canvas p-3 border border-border-default",
|
|
8
|
+
children: [/* @__PURE__ */ o("div", {
|
|
9
|
+
className: "rounded-md bg-primary/10 p-2 text-primary",
|
|
10
|
+
children: e
|
|
11
|
+
}), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
12
|
+
className: "text-2xl font-bold text-text-primary",
|
|
13
|
+
children: n
|
|
14
|
+
}), /* @__PURE__ */ o("p", {
|
|
15
|
+
className: "text-xs text-muted-foreground",
|
|
16
|
+
children: t
|
|
17
|
+
})] })]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function l({ workspaceData: l, globalData: u, isLoading: d }) {
|
|
21
|
+
let f = u?.currentUser, p = f?.firstName || f?.name?.split(" ")[0] || "there", m = (/* @__PURE__ */ new Date()).getHours(), h = m < 12 ? "Good morning" : m < 18 ? "Good afternoon" : "Good evening", g = l?.workspaces.total ?? 0, _ = l?.projects.total ?? 0, v = l?.groups.totalCount ?? 0, y = l?.recentActivities.length ?? 0;
|
|
22
|
+
return /* @__PURE__ */ o(e, {
|
|
23
|
+
title: "Dashboard",
|
|
24
|
+
icon: /* @__PURE__ */ o(i, { className: "h-4 w-4" }),
|
|
25
|
+
size: "large",
|
|
26
|
+
isLoading: d,
|
|
27
|
+
children: /* @__PURE__ */ s("div", {
|
|
28
|
+
className: "space-y-4",
|
|
29
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("h2", {
|
|
30
|
+
className: "text-xl font-bold text-text-primary",
|
|
31
|
+
children: [
|
|
32
|
+
h,
|
|
33
|
+
", ",
|
|
34
|
+
p,
|
|
35
|
+
"!"
|
|
36
|
+
]
|
|
37
|
+
}), /* @__PURE__ */ o("p", {
|
|
38
|
+
className: "text-sm text-muted-foreground mt-1",
|
|
39
|
+
children: "Here's what's happening across your workspaces today."
|
|
40
|
+
})] }), /* @__PURE__ */ s("div", {
|
|
41
|
+
className: "grid grid-cols-2 sm:grid-cols-4 gap-3",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ o(c, {
|
|
44
|
+
icon: /* @__PURE__ */ o(n, { className: "h-4 w-4" }),
|
|
45
|
+
label: "Workspaces",
|
|
46
|
+
value: g
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ o(c, {
|
|
49
|
+
icon: /* @__PURE__ */ o(r, { className: "h-4 w-4" }),
|
|
50
|
+
label: "Projects",
|
|
51
|
+
value: _
|
|
52
|
+
}),
|
|
53
|
+
/* @__PURE__ */ o(c, {
|
|
54
|
+
icon: /* @__PURE__ */ o(a, { className: "h-4 w-4" }),
|
|
55
|
+
label: "Groups",
|
|
56
|
+
value: v
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ o(c, {
|
|
59
|
+
icon: /* @__PURE__ */ o(t, { className: "h-4 w-4" }),
|
|
60
|
+
label: "Recent Activity",
|
|
61
|
+
value: y
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
})]
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { l as WelcomeWidget };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=WelcomeWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WelcomeWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WelcomeWidget.tsx"],"sourcesContent":["import { LayoutDashboard, Building2, FolderKanban, Users, Activity } from 'lucide-react';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction StatCard({\n icon,\n label,\n value,\n}: {\n icon: React.ReactNode;\n label: string;\n value: number | string;\n}) {\n return (\n <div className=\"flex items-center gap-3 rounded-lg bg-bg-canvas p-3 border border-border-default\">\n <div className=\"rounded-md bg-primary/10 p-2 text-primary\">{icon}</div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{value}</p>\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n </div>\n </div>\n );\n}\n\nexport function WelcomeWidget({ workspaceData, globalData, isLoading }: WidgetProps) {\n const user = globalData?.currentUser;\n const firstName = user?.firstName || user?.name?.split(' ')[0] || 'there';\n const hour = new Date().getHours();\n const greeting = hour < 12 ? 'Good morning' : hour < 18 ? 'Good afternoon' : 'Good evening';\n\n const totalWorkspaces = workspaceData?.workspaces.total ?? 0;\n const totalProjects = workspaceData?.projects.total ?? 0;\n const totalGroups = workspaceData?.groups.totalCount ?? 0;\n const activityCount = workspaceData?.recentActivities.length ?? 0;\n\n return (\n <WidgetWrapper\n title=\"Dashboard\"\n icon={<LayoutDashboard className=\"h-4 w-4\" />}\n size=\"large\"\n isLoading={isLoading}\n >\n <div className=\"space-y-4\">\n <div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {greeting}, {firstName}!\n </h2>\n <p className=\"text-sm text-muted-foreground mt-1\">\n Here's what's happening across your workspaces today.\n </p>\n </div>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <StatCard\n icon={<Building2 className=\"h-4 w-4\" />}\n label=\"Workspaces\"\n value={totalWorkspaces}\n />\n <StatCard\n icon={<FolderKanban className=\"h-4 w-4\" />}\n label=\"Projects\"\n value={totalProjects}\n />\n <StatCard icon={<Users className=\"h-4 w-4\" />} label=\"Groups\" value={totalGroups} />\n <StatCard\n icon={<Activity className=\"h-4 w-4\" />}\n label=\"Recent Activity\"\n value={activityCount}\n />\n </div>\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;AAIA,SAAS,EAAS,EAChB,SACA,UACA,YAKC;AACD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAA6C;GAAW,CAAA,EACvE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;aAAwC;GAAU,CAAA,EAC/D,kBAAC,KAAD;GAAG,WAAU;aAAiC;GAAU,CAAA,CACpD,EAAA,CAAA,CACF;;;AAIV,SAAgB,EAAc,EAAE,kBAAe,eAAY,gBAA0B;CACnF,IAAM,IAAO,GAAY,aACnB,IAAY,GAAM,aAAa,GAAM,MAAM,MAAM,IAAI,CAAC,MAAM,SAC5D,qBAAO,IAAI,MAAM,EAAC,UAAU,EAC5B,IAAW,IAAO,KAAK,iBAAiB,IAAO,KAAK,mBAAmB,gBAEvE,IAAkB,GAAe,WAAW,SAAS,GACrD,IAAgB,GAAe,SAAS,SAAS,GACjD,IAAc,GAAe,OAAO,cAAc,GAClD,IAAgB,GAAe,iBAAiB,UAAU;AAEhE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAiB,WAAU,WAAY,CAAA;EAC7C,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACG;KAAS;KAAG;KAAU;KACpB;OACL,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAE9C,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;MACvC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC1C,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MAAU,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MAAE,OAAM;MAAS,OAAO;MAAe,CAAA;KACpF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,OAAM;MACN,OAAO;MACP,CAAA;KACE;MACF;;EACQ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowStatsWidget.d.ts","sourceRoot":"","sources":["../../../../src/pages/dashboard/widgets/WorkflowStatsWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,wBAAgB,mBAAmB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,WAAW,2CAkEtF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { WidgetWrapper as e } from "../WidgetWrapper.js";
|
|
2
|
+
import { ArrowRight as t, CheckCircle2 as n, GitBranch as r, Pause as i, Play as a, XCircle as o } from "lucide-react";
|
|
3
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
4
|
+
import { Badge as l, Button as u } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
//#region src/pages/dashboard/widgets/WorkflowStatsWidget.tsx
|
|
6
|
+
var d = {
|
|
7
|
+
RUNNING: {
|
|
8
|
+
icon: a,
|
|
9
|
+
color: "text-accent-blue"
|
|
10
|
+
},
|
|
11
|
+
COMPLETED: {
|
|
12
|
+
icon: n,
|
|
13
|
+
color: "text-status-success-text"
|
|
14
|
+
},
|
|
15
|
+
FAILED: {
|
|
16
|
+
icon: o,
|
|
17
|
+
color: "text-status-error-text"
|
|
18
|
+
},
|
|
19
|
+
PAUSED: {
|
|
20
|
+
icon: i,
|
|
21
|
+
color: "text-status-warning-text"
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
function f({ workspaceData: n, isLoading: i, navigate: a }) {
|
|
25
|
+
let o = n?.workflowStats;
|
|
26
|
+
return /* @__PURE__ */ s(e, {
|
|
27
|
+
title: "Workflows",
|
|
28
|
+
icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
|
|
29
|
+
size: "medium",
|
|
30
|
+
isLoading: i,
|
|
31
|
+
unavailable: !n,
|
|
32
|
+
headerAction: /* @__PURE__ */ c(u, {
|
|
33
|
+
variant: "ghost",
|
|
34
|
+
size: "sm",
|
|
35
|
+
className: "text-xs",
|
|
36
|
+
onClick: () => a("/workflows"),
|
|
37
|
+
children: ["View all ", /* @__PURE__ */ s(t, { className: "ml-1 h-3 w-3" })]
|
|
38
|
+
}),
|
|
39
|
+
children: o ? /* @__PURE__ */ c("div", {
|
|
40
|
+
className: "space-y-3",
|
|
41
|
+
children: [/* @__PURE__ */ c("div", {
|
|
42
|
+
className: "grid grid-cols-2 gap-3",
|
|
43
|
+
children: [/* @__PURE__ */ c("div", {
|
|
44
|
+
className: "rounded-lg bg-bg-canvas p-3 border border-border-default text-center",
|
|
45
|
+
children: [/* @__PURE__ */ s("p", {
|
|
46
|
+
className: "text-2xl font-bold text-text-primary",
|
|
47
|
+
children: o.activeWorkflowsCount
|
|
48
|
+
}), /* @__PURE__ */ s("p", {
|
|
49
|
+
className: "text-xs text-muted-foreground",
|
|
50
|
+
children: "Active"
|
|
51
|
+
})]
|
|
52
|
+
}), /* @__PURE__ */ c("div", {
|
|
53
|
+
className: "rounded-lg bg-bg-canvas p-3 border border-border-default text-center",
|
|
54
|
+
children: [/* @__PURE__ */ s("p", {
|
|
55
|
+
className: "text-2xl font-bold text-text-primary",
|
|
56
|
+
children: o.archivedWorkflowsCount
|
|
57
|
+
}), /* @__PURE__ */ s("p", {
|
|
58
|
+
className: "text-xs text-muted-foreground",
|
|
59
|
+
children: "Archived"
|
|
60
|
+
})]
|
|
61
|
+
})]
|
|
62
|
+
}), o.recentRuns.length > 0 && /* @__PURE__ */ c("div", {
|
|
63
|
+
className: "space-y-1.5",
|
|
64
|
+
children: [/* @__PURE__ */ s("p", {
|
|
65
|
+
className: "text-xs font-medium text-muted-foreground uppercase tracking-wider",
|
|
66
|
+
children: "Recent Runs"
|
|
67
|
+
}), o.recentRuns.slice(0, 3).map((e) => {
|
|
68
|
+
let t = d[e.status] || d.RUNNING, n = t.icon;
|
|
69
|
+
return /* @__PURE__ */ c("div", {
|
|
70
|
+
className: "flex items-center justify-between p-1.5 rounded hover:bg-accent/5 transition-colors",
|
|
71
|
+
children: [/* @__PURE__ */ c("div", {
|
|
72
|
+
className: "flex items-center gap-2 min-w-0",
|
|
73
|
+
children: [/* @__PURE__ */ s(n, { className: `h-3.5 w-3.5 ${t.color}` }), /* @__PURE__ */ s("span", {
|
|
74
|
+
className: "text-sm text-text-primary truncate",
|
|
75
|
+
children: e.workflowKey
|
|
76
|
+
})]
|
|
77
|
+
}), /* @__PURE__ */ s(l, {
|
|
78
|
+
variant: "outline",
|
|
79
|
+
className: "text-[10px]",
|
|
80
|
+
children: e.status
|
|
81
|
+
})]
|
|
82
|
+
}, e.id);
|
|
83
|
+
})]
|
|
84
|
+
})]
|
|
85
|
+
}) : /* @__PURE__ */ s("div", {
|
|
86
|
+
className: "text-center py-4",
|
|
87
|
+
children: /* @__PURE__ */ s("p", {
|
|
88
|
+
className: "text-sm text-muted-foreground",
|
|
89
|
+
children: "No workflow data available"
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//#endregion
|
|
95
|
+
export { f as WorkflowStatsWidget };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=WorkflowStatsWidget.js.map
|