@burdenoff/microfe-workspaces 2026.802.1 → 2026.829.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.
Files changed (55) hide show
  1. package/dist/generated/global-operations.js +44 -1
  2. package/dist/generated/global-operations.js.map +1 -1
  3. package/dist/generated/wspace-operations.js +18 -18
  4. package/dist/generated/wspace-operations.js.map +1 -1
  5. package/dist/hooks/useWorkspaceMutations.js +84 -61
  6. package/dist/hooks/useWorkspaceMutations.js.map +1 -1
  7. package/dist/pages/MembersListPage.js +3 -3
  8. package/dist/pages/MembersListPage.js.map +1 -1
  9. package/dist/pages/ProjectsListPage.js +3 -3
  10. package/dist/pages/ProjectsListPage.js.map +1 -1
  11. package/dist/pages/WorkspaceDetailPage.js +152 -114
  12. package/dist/pages/WorkspaceDetailPage.js.map +1 -1
  13. package/dist/pages/WorkspaceInvitePage.js +2 -2
  14. package/dist/pages/WorkspaceInvitePage.js.map +1 -1
  15. package/dist/pages/dashboard/DashboardCustomizer.js +62 -62
  16. package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
  17. package/dist/pages/dashboard/DashboardPage.js +88 -69
  18. package/dist/pages/dashboard/DashboardPage.js.map +1 -1
  19. package/dist/pages/dashboard/config.js +77 -1
  20. package/dist/pages/dashboard/config.js.map +1 -1
  21. package/dist/pages/dashboard/widgets/AgentsWidget.js +56 -54
  22. package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -1
  23. package/dist/pages/dashboard/widgets/GroupsWidget.js +29 -31
  24. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  25. package/dist/pages/dashboard/widgets/MembersWidget.js +33 -33
  26. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
  27. package/dist/pages/dashboard/widgets/ProjectsWidget.js +42 -44
  28. package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
  29. package/dist/pages/dashboard/widgets/QuickActionsWidget.js +171 -161
  30. package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
  31. package/dist/pages/dashboard/widgets/RecentActivityWidget.js +54 -44
  32. package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
  33. package/dist/pages/dashboard/widgets/SessionsWidget.js +57 -41
  34. package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -1
  35. package/dist/pages/dashboard/widgets/StorageWidget.js +52 -54
  36. package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -1
  37. package/dist/pages/dashboard/widgets/TagCloudWidget.js +28 -30
  38. package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
  39. package/dist/pages/dashboard/widgets/TipsWidget.js +141 -131
  40. package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
  41. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +46 -40
  42. package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
  43. package/dist/pages/dashboard/widgets/VibesWidget.js +44 -34
  44. package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -1
  45. package/dist/pages/dashboard/widgets/WelcomeWidget.js +43 -41
  46. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
  47. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js +68 -62
  48. package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js.map +1 -1
  49. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +50 -44
  50. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  51. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js +59 -49
  52. package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js.map +1 -1
  53. package/dist/pages/dashboard/widgets/WorkspacesWidget.js +35 -33
  54. package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
  55. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"VibesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/VibesWidget.tsx"],"sourcesContent":["import { Sparkles, ArrowRight, Plus } from 'lucide-react';\nimport { Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nfunction formatRelative(dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDay = Math.floor(diffHr / 24);\n if (diffDay < 7) return `${diffDay}d ago`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function VibesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const vibes = workspaceData?.recentVibes ?? [];\n\n return (\n <WidgetWrapper\n title=\"Recent Vibes\"\n icon={<Sparkles className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/vibecontrols/vibes')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {vibes.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-vibes\"\n title=\"No vibes yet\"\n className=\"py-4\"\n action={\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/vibecontrols/vibes/new')}>\n <Plus className=\"mr-1.5 size-3.5\" /> Create your first vibe\n </Button>\n }\n />\n ) : (\n <ul className=\"space-y-1.5\">\n {vibes.slice(0, 5).map((vibe) => (\n <li key={vibe.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/vibes/${vibe.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <span className=\"truncate text-sm font-medium text-text-primary\">{vibe.name}</span>\n <span className=\"shrink-0 text-[11px] text-text-secondary\">\n {formatRelative(vibe.updatedAt)}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAe,GAA4B;CAClD,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CACpC,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AACvC,KAAI,IAAS,GAAI,QAAO,GAAG,EAAO;CAClC,IAAM,IAAU,KAAK,MAAM,IAAS,GAAG;AAEvC,QADI,IAAU,IAAU,GAAG,EAAQ,SAC5B,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAY,EAAE,kBAAe,cAAW,eAAyB;CAC/E,IAAM,IAAQ,GAAe,eAAe,EAAE;AAE9C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAJhD,CAKC,aACU,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,CACxC;;YAGV,EAAM,WAAW,IAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,WAAU;GACV,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,0BAA0B;cAAtF,CACE,kBAAC,GAAD,EAAM,WAAU,mBAAoB,CAAA,EAAA,0BAC7B;;GAEX,CAAA,GAEF,kBAAC,MAAD;GAAI,WAAU;aACX,EAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,uBAAuB,EAAK,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,QAAD;KAAM,WAAU;eAAkD,EAAK;KAAY,CAAA,EACnF,kBAAC,QAAD;KAAM,WAAU;eACb,EAAe,EAAK,UAAU;KAC1B,CAAA,CACA;OACN,EAXI,EAAK,GAWT,CACL;GACC,CAAA;EAEO,CAAA"}
1
+ {"version":3,"file":"VibesWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/VibesWidget.tsx"],"sourcesContent":["import { Sparkles, ArrowRight, Plus } from 'lucide-react';\nimport { Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { I18nContextValue } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\nimport type { WidgetProps } from '../types';\n\nfunction formatRelative(t: I18nContextValue['t'], dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return tWithFallback(t, 'dashboard.vibes.justNow', 'just now');\n if (diffMin < 60)\n return tWithFallback(t, 'dashboard.vibes.minutesAgo', '{count}m ago', { count: diffMin });\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24)\n return tWithFallback(t, 'dashboard.vibes.hoursAgo', '{count}h ago', { count: diffHr });\n const diffDay = Math.floor(diffHr / 24);\n if (diffDay < 7)\n return tWithFallback(t, 'dashboard.vibes.daysAgo', '{count}d ago', { count: diffDay });\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function VibesWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n const vibes = workspaceData?.recentVibes ?? [];\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.vibes.title', 'Recent Vibes')}\n icon={<Sparkles className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/vibecontrols/vibes')}\n >\n {tWithFallback(t, 'dashboard.vibes.viewAll', 'View all')}{' '}\n <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {vibes.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-vibes\"\n title={tWithFallback(t, 'dashboard.vibes.emptyTitle', 'No vibes yet')}\n className=\"py-4\"\n action={\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/vibecontrols/vibes/new')}>\n <Plus className=\"mr-1.5 size-3.5\" />{' '}\n {tWithFallback(t, 'dashboard.vibes.emptyAction', 'Create your first vibe')}\n </Button>\n }\n />\n ) : (\n <ul className=\"space-y-1.5\">\n {vibes.slice(0, 5).map((vibe) => (\n <li key={vibe.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`/vibecontrols/vibes/${vibe.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-2 text-left transition-colors hover:bg-accent/5\"\n >\n <span className=\"truncate text-sm font-medium text-text-primary\">{vibe.name}</span>\n <span className=\"shrink-0 text-[11px] text-text-secondary\">\n {formatRelative(t, vibe.updatedAt)}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAQA,SAAS,EAAe,GAA0B,GAA4B;CAC5E,IAAM,IAAS,KAAK,KAAK,GAAG,IAAI,KAAK,EAAW,CAAC,SAAS,EACpD,IAAU,KAAK,MAAM,IAAS,IAAM;AAC1C,KAAI,IAAU,EAAG,QAAO,EAAc,GAAG,2BAA2B,WAAW;AAC/E,KAAI,IAAU,GACZ,QAAO,EAAc,GAAG,8BAA8B,gBAAgB,EAAE,OAAO,GAAS,CAAC;CAC3F,IAAM,IAAS,KAAK,MAAM,IAAU,GAAG;AACvC,KAAI,IAAS,GACX,QAAO,EAAc,GAAG,4BAA4B,gBAAgB,EAAE,OAAO,GAAQ,CAAC;CACxF,IAAM,IAAU,KAAK,MAAM,IAAS,GAAG;AAGvC,QAFI,IAAU,IACL,EAAc,GAAG,2BAA2B,gBAAgB,EAAE,OAAO,GAAS,CAAC,GACjF,IAAI,KAAK,EAAW,CAAC,mBAAmB,KAAA,GAAW;EACxD,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,SAAgB,EAAY,EAAE,kBAAe,cAAW,eAAyB;CAC/E,IAAM,EAAE,SAAM,GAAS,EACjB,IAAQ,GAAe,eAAe,EAAE;AAE9C,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,yBAAyB,eAAe;EAChE,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;EACrC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAJhD;IAMG,EAAc,GAAG,2BAA2B,WAAW;IAAE;IAC1D,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA;IAC/B;;YAGV,EAAM,WAAW,IAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAc,GAAG,8BAA8B,eAAe;GACrE,WAAU;GACV,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,0BAA0B;cAAtF;KACE,kBAAC,GAAD,EAAM,WAAU,mBAAoB,CAAA;KAAC;KACpC,EAAc,GAAG,+BAA+B,yBAAyB;KACnE;;GAEX,CAAA,GAEF,kBAAC,MAAD;GAAI,WAAU;aACX,EAAM,MAAM,GAAG,EAAE,CAAC,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,uBAAuB,EAAK,KAAK;IACzD,WAAU;cAHZ,CAKE,kBAAC,QAAD;KAAM,WAAU;eAAkD,EAAK;KAAY,CAAA,EACnF,kBAAC,QAAD;KAAM,WAAU;eACb,EAAe,GAAG,EAAK,UAAU;KAC7B,CAAA,CACA;OACN,EAXI,EAAK,GAWT,CACL;GACC,CAAA;EAEO,CAAA"}
@@ -1,74 +1,76 @@
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
- import { GlassCard as c, GradientText as l } from "@burdenoff/fe-libs/ui";
1
+ import { tWithFallback as e } from "../../../utils/i18n.js";
2
+ import { WidgetWrapper as t } from "../WidgetWrapper.js";
3
+ import { Activity as n, Building2 as r, FolderKanban as i, LayoutDashboard as a, Users as o } from "lucide-react";
4
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
+ import { GlassCard as l, GradientText as u } from "@burdenoff/fe-libs/ui";
6
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
7
  //#region src/pages/dashboard/widgets/WelcomeWidget.tsx
6
- function u({ icon: e, label: t, value: n }) {
7
- return /* @__PURE__ */ o(c, {
8
+ function f({ icon: e, label: t, value: n }) {
9
+ return /* @__PURE__ */ s(l, {
8
10
  treatment: "metric",
9
11
  className: "p-3",
10
- children: /* @__PURE__ */ s("div", {
12
+ children: /* @__PURE__ */ c("div", {
11
13
  className: "flex items-center gap-3",
12
- children: [/* @__PURE__ */ o("div", {
14
+ children: [/* @__PURE__ */ s("div", {
13
15
  className: "rounded-md bg-action-primary-bg/10 p-2 text-primary",
14
16
  children: e
15
- }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
17
+ }), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
16
18
  className: "text-2xl font-bold text-text-primary tabular-nums",
17
19
  children: n
18
- }), /* @__PURE__ */ o("p", {
20
+ }), /* @__PURE__ */ s("p", {
19
21
  className: "text-xs text-text-muted",
20
22
  children: t
21
23
  })] })]
22
24
  })
23
25
  });
24
26
  }
25
- function d({ workspaceData: d, globalData: f, isLoading: p }) {
26
- let m = f?.currentUser, h = m?.firstName || m?.name?.split(" ")[0] || "there", g = (/* @__PURE__ */ new Date()).getHours(), _ = g < 12 ? "Good morning" : g < 18 ? "Good afternoon" : "Good evening", v = d?.workspaces.total ?? 0, y = d?.projects.total ?? 0, b = d?.groups.totalCount ?? 0, x = d?.recentActivities.length ?? 0;
27
- return /* @__PURE__ */ o(e, {
28
- title: "Dashboard",
29
- icon: /* @__PURE__ */ o(i, { className: "size-4" }),
27
+ function p({ workspaceData: p, globalData: m, isLoading: h }) {
28
+ let { t: g } = d(), _ = m?.currentUser, v = _?.firstName || _?.name?.split(" ")[0] || e(g, "dashboard.welcome.fallbackName", "there"), y = (/* @__PURE__ */ new Date()).getHours(), b = y < 12 ? e(g, "dashboard.welcome.greetingMorning", "Good morning") : y < 18 ? e(g, "dashboard.welcome.greetingAfternoon", "Good afternoon") : e(g, "dashboard.welcome.greetingEvening", "Good evening"), x = p?.workspaces.total ?? 0, S = p?.projects.total ?? 0, C = p?.groups.totalCount ?? 0, w = p?.recentActivities.length ?? 0;
29
+ return /* @__PURE__ */ s(t, {
30
+ title: e(g, "dashboard.welcome.title", "Dashboard"),
31
+ icon: /* @__PURE__ */ s(a, { className: "size-4" }),
30
32
  size: "large",
31
- isLoading: p,
32
- children: /* @__PURE__ */ s("div", {
33
+ isLoading: h,
34
+ children: /* @__PURE__ */ c("div", {
33
35
  className: "space-y-4",
34
- children: [/* @__PURE__ */ s(c, {
36
+ children: [/* @__PURE__ */ c(l, {
35
37
  treatment: "glass",
36
38
  glow: !0,
37
39
  className: "relative overflow-hidden p-4",
38
- children: [/* @__PURE__ */ s("h2", {
40
+ children: [/* @__PURE__ */ c("h2", {
39
41
  className: "text-xl font-bold text-text-primary",
40
42
  children: [
41
- _,
43
+ b,
42
44
  ", ",
43
- /* @__PURE__ */ o(l, { children: h }),
45
+ /* @__PURE__ */ s(u, { children: v }),
44
46
  "!"
45
47
  ]
46
- }), /* @__PURE__ */ o("p", {
48
+ }), /* @__PURE__ */ s("p", {
47
49
  className: "text-sm text-text-secondary mt-1",
48
- children: "Here's what's happening across your workspaces today."
50
+ children: e(g, "dashboard.welcome.subtitle", "Here's what's happening across your workspaces today.")
49
51
  })]
50
- }), /* @__PURE__ */ s("div", {
52
+ }), /* @__PURE__ */ c("div", {
51
53
  className: "grid grid-cols-2 sm:grid-cols-4 gap-3",
52
54
  children: [
53
- /* @__PURE__ */ o(u, {
54
- icon: /* @__PURE__ */ o(n, { className: "size-4" }),
55
- label: "Workspaces",
56
- value: v
55
+ /* @__PURE__ */ s(f, {
56
+ icon: /* @__PURE__ */ s(r, { className: "size-4" }),
57
+ label: e(g, "dashboard.welcome.statWorkspaces", "Workspaces"),
58
+ value: x
57
59
  }),
58
- /* @__PURE__ */ o(u, {
59
- icon: /* @__PURE__ */ o(r, { className: "size-4" }),
60
- label: "Projects",
61
- value: y
60
+ /* @__PURE__ */ s(f, {
61
+ icon: /* @__PURE__ */ s(i, { className: "size-4" }),
62
+ label: e(g, "dashboard.welcome.statProjects", "Projects"),
63
+ value: S
62
64
  }),
63
- /* @__PURE__ */ o(u, {
64
- icon: /* @__PURE__ */ o(a, { className: "size-4" }),
65
- label: "Groups",
66
- value: b
65
+ /* @__PURE__ */ s(f, {
66
+ icon: /* @__PURE__ */ s(o, { className: "size-4" }),
67
+ label: e(g, "dashboard.welcome.statGroups", "Groups"),
68
+ value: C
67
69
  }),
68
- /* @__PURE__ */ o(u, {
69
- icon: /* @__PURE__ */ o(t, { className: "size-4" }),
70
- label: "Recent Activity",
71
- value: x
70
+ /* @__PURE__ */ s(f, {
71
+ icon: /* @__PURE__ */ s(n, { className: "size-4" }),
72
+ label: e(g, "dashboard.welcome.statRecentActivity", "Recent Activity"),
73
+ value: w
72
74
  })
73
75
  ]
74
76
  })]
@@ -76,6 +78,6 @@ function d({ workspaceData: d, globalData: f, isLoading: p }) {
76
78
  });
77
79
  }
78
80
  //#endregion
79
- export { d as WelcomeWidget };
81
+ export { p as WelcomeWidget };
80
82
 
81
83
  //# sourceMappingURL=WelcomeWidget.js.map
@@ -1 +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 { GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\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 <GlassCard treatment=\"metric\" className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-md bg-action-primary-bg/10 p-2 text-primary\">{icon}</div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">{value}</p>\n <p className=\"text-xs text-text-muted\">{label}</p>\n </div>\n </div>\n </GlassCard>\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=\"size-4\" />}\n size=\"large\"\n isLoading={isLoading}\n >\n <div className=\"space-y-4\">\n <GlassCard treatment=\"glass\" glow className=\"relative overflow-hidden p-4\">\n <h2 className=\"text-xl font-bold text-text-primary\">\n {greeting}, <GradientText>{firstName}</GradientText>!\n </h2>\n <p className=\"text-sm text-text-secondary mt-1\">\n Here's what's happening across your workspaces today.\n </p>\n </GlassCard>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <StatCard\n icon={<Building2 className=\"size-4\" />}\n label=\"Workspaces\"\n value={totalWorkspaces}\n />\n <StatCard\n icon={<FolderKanban className=\"size-4\" />}\n label=\"Projects\"\n value={totalProjects}\n />\n <StatCard icon={<Users className=\"size-4\" />} label=\"Groups\" value={totalGroups} />\n <StatCard\n icon={<Activity className=\"size-4\" />}\n label=\"Recent Activity\"\n value={activityCount}\n />\n </div>\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;AAKA,SAAS,EAAS,EAChB,SACA,UACA,YAKC;AACD,QACE,kBAAC,GAAD;EAAW,WAAU;EAAS,WAAU;YACtC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAuD;IAAW,CAAA,EACjF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqD;IAAU,CAAA,EAC5E,kBAAC,KAAD;IAAG,WAAU;cAA2B;IAAU,CAAA,CAC9C,EAAA,CAAA,CACF;;EACI,CAAA;;AAIhB,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,UAAW,CAAA;EAC5C,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd;MACG;MAAS;MAAE,kBAAC,GAAD,EAAA,UAAe,GAAyB,CAAA;;MACjD;QACL,kBAAC,KAAD;KAAG,WAAU;eAAmC;KAE5C,CAAA,CACM;OACZ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;MACtC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;MACzC,OAAM;MACN,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MAAU,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;MAAE,OAAM;MAAS,OAAO;MAAe,CAAA;KACnF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;MACrC,OAAM;MACN,OAAO;MACP,CAAA;KACE;MACF;;EACQ,CAAA"}
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 { GlassCard, GradientText } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\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 <GlassCard treatment=\"metric\" className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-md bg-action-primary-bg/10 p-2 text-primary\">{icon}</div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">{value}</p>\n <p className=\"text-xs text-text-muted\">{label}</p>\n </div>\n </div>\n </GlassCard>\n );\n}\n\nexport function WelcomeWidget({ workspaceData, globalData, isLoading }: WidgetProps) {\n const { t } = useI18n();\n const user = globalData?.currentUser;\n const firstName =\n user?.firstName ||\n user?.name?.split(' ')[0] ||\n tWithFallback(t, 'dashboard.welcome.fallbackName', 'there');\n const hour = new Date().getHours();\n const greeting =\n hour < 12\n ? tWithFallback(t, 'dashboard.welcome.greetingMorning', 'Good morning')\n : hour < 18\n ? tWithFallback(t, 'dashboard.welcome.greetingAfternoon', 'Good afternoon')\n : tWithFallback(t, 'dashboard.welcome.greetingEvening', '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={tWithFallback(t, 'dashboard.welcome.title', 'Dashboard')}\n icon={<LayoutDashboard className=\"size-4\" />}\n size=\"large\"\n isLoading={isLoading}\n >\n <div className=\"space-y-4\">\n <GlassCard treatment=\"glass\" glow className=\"relative overflow-hidden p-4\">\n <h2 className=\"text-xl font-bold text-text-primary\">\n {greeting}, <GradientText>{firstName}</GradientText>!\n </h2>\n <p className=\"text-sm text-text-secondary mt-1\">\n {tWithFallback(\n t,\n 'dashboard.welcome.subtitle',\n \"Here's what's happening across your workspaces today.\"\n )}\n </p>\n </GlassCard>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <StatCard\n icon={<Building2 className=\"size-4\" />}\n label={tWithFallback(t, 'dashboard.welcome.statWorkspaces', 'Workspaces')}\n value={totalWorkspaces}\n />\n <StatCard\n icon={<FolderKanban className=\"size-4\" />}\n label={tWithFallback(t, 'dashboard.welcome.statProjects', 'Projects')}\n value={totalProjects}\n />\n <StatCard\n icon={<Users className=\"size-4\" />}\n label={tWithFallback(t, 'dashboard.welcome.statGroups', 'Groups')}\n value={totalGroups}\n />\n <StatCard\n icon={<Activity className=\"size-4\" />}\n label={tWithFallback(t, 'dashboard.welcome.statRecentActivity', 'Recent Activity')}\n value={activityCount}\n />\n </div>\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAS,EAAS,EAChB,SACA,UACA,YAKC;AACD,QACE,kBAAC,GAAD;EAAW,WAAU;EAAS,WAAU;YACtC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAuD;IAAW,CAAA,EACjF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqD;IAAU,CAAA,EAC5E,kBAAC,KAAD;IAAG,WAAU;cAA2B;IAAU,CAAA,CAC9C,EAAA,CAAA,CACF;;EACI,CAAA;;AAIhB,SAAgB,EAAc,EAAE,kBAAe,eAAY,gBAA0B;CACnF,IAAM,EAAE,SAAM,GAAS,EACjB,IAAO,GAAY,aACnB,IACJ,GAAM,aACN,GAAM,MAAM,MAAM,IAAI,CAAC,MACvB,EAAc,GAAG,kCAAkC,QAAQ,EACvD,qBAAO,IAAI,MAAM,EAAC,UAAU,EAC5B,IACJ,IAAO,KACH,EAAc,GAAG,qCAAqC,eAAe,GACrE,IAAO,KACL,EAAc,GAAG,uCAAuC,iBAAiB,GACzE,EAAc,GAAG,qCAAqC,eAAe,EAEvE,IAAkB,GAAe,WAAW,SAAS,GACrD,IAAgB,GAAe,SAAS,SAAS,GACjD,IAAc,GAAe,OAAO,cAAc,GAClD,IAAgB,GAAe,iBAAiB,UAAU;AAEhE,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,2BAA2B,YAAY;EAC/D,MAAM,kBAAC,GAAD,EAAiB,WAAU,UAAW,CAAA;EAC5C,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd;MACG;MAAS;MAAE,kBAAC,GAAD,EAAA,UAAe,GAAyB,CAAA;;MACjD;QACL,kBAAC,KAAD;KAAG,WAAU;eACV,EACC,GACA,8BACA,wDACD;KACC,CAAA,CACM;OACZ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;MACtC,OAAO,EAAc,GAAG,oCAAoC,aAAa;MACzE,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;MACzC,OAAO,EAAc,GAAG,kCAAkC,WAAW;MACrE,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;MAClC,OAAO,EAAc,GAAG,gCAAgC,SAAS;MACjE,OAAO;MACP,CAAA;KACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA;MACrC,OAAO,EAAc,GAAG,wCAAwC,kBAAkB;MAClF,OAAO;MACP,CAAA;KACE;MACF;;EACQ,CAAA"}
@@ -1,139 +1,145 @@
1
- import { WidgetWrapper as e } from "../WidgetWrapper.js";
2
- import { Activity as t, ArrowRight as n, CheckCircle2 as r, Clock 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, IllustratedEmptyState as d } from "@burdenoff/fe-libs/ui";
1
+ import { tWithFallback as e } from "../../../utils/i18n.js";
2
+ import { WidgetWrapper as t } from "../WidgetWrapper.js";
3
+ import { Activity as n, ArrowRight as r, CheckCircle2 as i, Clock as a, Play as o, XCircle as s } from "lucide-react";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { Badge as u, Button as d, IllustratedEmptyState as f } from "@burdenoff/fe-libs/ui";
6
+ import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
7
  //#region src/pages/dashboard/widgets/WorkflowRunsWidget.tsx
6
- var f = {
8
+ var m = {
7
9
  RUNNING: {
8
- icon: a,
10
+ icon: o,
9
11
  color: "text-accent-blue"
10
12
  },
11
13
  PENDING: {
12
- icon: i,
14
+ icon: a,
13
15
  color: "text-status-warning-text"
14
16
  },
15
17
  WAITING: {
16
- icon: i,
18
+ icon: a,
17
19
  color: "text-status-warning-text"
18
20
  },
19
21
  COMPLETED: {
20
- icon: r,
22
+ icon: i,
21
23
  color: "text-status-success-text"
22
24
  },
23
25
  FAILED: {
24
- icon: o,
26
+ icon: s,
25
27
  color: "text-status-error-text"
26
28
  },
27
29
  CANCELLED: {
28
- icon: o,
30
+ icon: s,
29
31
  color: "text-text-tertiary"
30
32
  },
31
33
  TERMINATED: {
32
- icon: o,
34
+ icon: s,
33
35
  color: "text-text-tertiary"
34
36
  }
35
37
  };
36
- function p(e) {
37
- let t = Date.now() - new Date(e).getTime(), n = Math.floor(t / 6e4);
38
- if (n < 1) return "just now";
39
- if (n < 60) return `${n}m ago`;
40
- let r = Math.floor(n / 60);
41
- return r < 24 ? `${r}h ago` : new Date(e).toLocaleDateString(void 0, {
38
+ function h(t, n) {
39
+ let r = Date.now() - new Date(n).getTime(), i = Math.floor(r / 6e4);
40
+ if (i < 1) return e(t, "dashboard.workflowRuns.justNow", "just now");
41
+ if (i < 60) return e(t, "dashboard.workflowRuns.minutesAgo", "{count}m ago", { count: i });
42
+ let a = Math.floor(i / 60);
43
+ return a < 24 ? e(t, "dashboard.workflowRuns.hoursAgo", "{count}h ago", { count: a }) : new Date(n).toLocaleDateString(void 0, {
42
44
  month: "short",
43
45
  day: "numeric"
44
46
  });
45
47
  }
46
- function m({ workspaceData: r, isLoading: i, navigate: a }) {
47
- let o = r?.workflowStats, m = o?.recentRuns ?? [], h = o?.workflowSuccessRate;
48
- return /* @__PURE__ */ s(e, {
49
- title: "Workflow Runs",
50
- icon: /* @__PURE__ */ s(t, { className: "size-4" }),
48
+ function g({ workspaceData: i, isLoading: a, navigate: o }) {
49
+ let { t: s } = p(), g = i?.workflowStats, _ = g?.recentRuns ?? [], v = g?.workflowSuccessRate;
50
+ return /* @__PURE__ */ c(t, {
51
+ title: e(s, "dashboard.workflowRuns.title", "Workflow Runs"),
52
+ icon: /* @__PURE__ */ c(n, { className: "size-4" }),
51
53
  size: "medium",
52
- isLoading: i,
53
- unavailable: !r,
54
- headerAction: /* @__PURE__ */ c(u, {
54
+ isLoading: a,
55
+ unavailable: !i,
56
+ headerAction: /* @__PURE__ */ l(d, {
55
57
  variant: "ghost",
56
58
  size: "sm",
57
59
  className: "text-xs",
58
- onClick: () => a("/workflows/runs"),
59
- children: ["View all ", /* @__PURE__ */ s(n, { className: "ml-1 size-3" })]
60
+ onClick: () => o("/workflows/runs"),
61
+ children: [
62
+ e(s, "dashboard.workflowRuns.viewAll", "View all"),
63
+ " ",
64
+ /* @__PURE__ */ c(r, { className: "ml-1 size-3" })
65
+ ]
60
66
  }),
61
- children: o ? /* @__PURE__ */ c("div", {
67
+ children: g ? /* @__PURE__ */ l("div", {
62
68
  className: "space-y-3",
63
- children: [/* @__PURE__ */ c("div", {
69
+ children: [/* @__PURE__ */ l("div", {
64
70
  className: "grid grid-cols-3 gap-2",
65
71
  children: [
66
- /* @__PURE__ */ c("div", {
72
+ /* @__PURE__ */ l("div", {
67
73
  className: "rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center",
68
- children: [/* @__PURE__ */ s("p", {
74
+ children: [/* @__PURE__ */ c("p", {
69
75
  className: "text-xl font-bold text-text-primary tabular-nums",
70
- children: o.runsRunningCount ?? 0
71
- }), /* @__PURE__ */ s("p", {
76
+ children: g.runsRunningCount ?? 0
77
+ }), /* @__PURE__ */ c("p", {
72
78
  className: "text-[11px] text-text-secondary",
73
- children: "Running"
79
+ children: e(s, "dashboard.workflowRuns.statRunning", "Running")
74
80
  })]
75
81
  }),
76
- /* @__PURE__ */ c("div", {
82
+ /* @__PURE__ */ l("div", {
77
83
  className: "rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center",
78
- children: [/* @__PURE__ */ s("p", {
84
+ children: [/* @__PURE__ */ c("p", {
79
85
  className: "text-xl font-bold text-status-error-text tabular-nums",
80
- children: o.runsFailedLast24h ?? 0
81
- }), /* @__PURE__ */ s("p", {
86
+ children: g.runsFailedLast24h ?? 0
87
+ }), /* @__PURE__ */ c("p", {
82
88
  className: "text-[11px] text-text-secondary",
83
- children: "Failed (24h)"
89
+ children: e(s, "dashboard.workflowRuns.statFailed24h", "Failed (24h)")
84
90
  })]
85
91
  }),
86
- /* @__PURE__ */ c("div", {
92
+ /* @__PURE__ */ l("div", {
87
93
  className: "rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center",
88
- children: [/* @__PURE__ */ s("p", {
94
+ children: [/* @__PURE__ */ c("p", {
89
95
  className: "text-xl font-bold text-status-success-text tabular-nums",
90
- children: h == null ? "—" : `${Math.round(h)}%`
91
- }), /* @__PURE__ */ s("p", {
96
+ children: v == null ? "—" : `${Math.round(v)}%`
97
+ }), /* @__PURE__ */ c("p", {
92
98
  className: "text-[11px] text-text-secondary",
93
- children: "Success rate"
99
+ children: e(s, "dashboard.workflowRuns.statSuccessRate", "Success rate")
94
100
  })]
95
101
  })
96
102
  ]
97
- }), m.length > 0 && /* @__PURE__ */ c("div", {
103
+ }), _.length > 0 && /* @__PURE__ */ l("div", {
98
104
  className: "space-y-1.5",
99
- children: [/* @__PURE__ */ s("p", {
105
+ children: [/* @__PURE__ */ c("p", {
100
106
  className: "text-xs font-medium text-text-secondary uppercase tracking-wider",
101
- children: "Recent Runs"
102
- }), m.slice(0, 4).map((e) => {
103
- let t = f[e.status] ?? f.RUNNING, n = t.icon;
104
- return /* @__PURE__ */ c("button", {
107
+ children: e(s, "dashboard.workflowRuns.recentRunsHeading", "Recent Runs")
108
+ }), _.slice(0, 4).map((e) => {
109
+ let t = m[e.status] ?? m.RUNNING, n = t.icon;
110
+ return /* @__PURE__ */ l("button", {
105
111
  type: "button",
106
- onClick: () => a(`/workflows/runs/${e.id}`),
112
+ onClick: () => o(`/workflows/runs/${e.id}`),
107
113
  className: "flex w-full items-center justify-between gap-2 rounded-md p-1.5 text-left transition-colors hover:bg-accent/5",
108
- children: [/* @__PURE__ */ c("div", {
114
+ children: [/* @__PURE__ */ l("div", {
109
115
  className: "flex items-center gap-2 min-w-0",
110
- children: [/* @__PURE__ */ s(n, { className: `size-3.5 shrink-0 ${t.color}` }), /* @__PURE__ */ s("span", {
116
+ children: [/* @__PURE__ */ c(n, { className: `size-3.5 shrink-0 ${t.color}` }), /* @__PURE__ */ c("span", {
111
117
  className: "truncate text-sm text-text-primary",
112
118
  children: e.workflowKey
113
119
  })]
114
- }), /* @__PURE__ */ c("div", {
120
+ }), /* @__PURE__ */ l("div", {
115
121
  className: "flex items-center gap-2 shrink-0",
116
- children: [/* @__PURE__ */ s(l, {
122
+ children: [/* @__PURE__ */ c(u, {
117
123
  variant: "outline",
118
124
  className: "text-[10px]",
119
125
  children: e.status.toLowerCase()
120
- }), /* @__PURE__ */ s("span", {
126
+ }), /* @__PURE__ */ c("span", {
121
127
  className: "text-[11px] text-text-secondary",
122
- children: p(e.startedAt)
128
+ children: h(s, e.startedAt)
123
129
  })]
124
130
  })]
125
131
  }, e.id);
126
132
  })]
127
133
  })]
128
- }) : /* @__PURE__ */ s(d, {
134
+ }) : /* @__PURE__ */ c(f, {
129
135
  illustration: "empty-data",
130
- title: "No runs yet",
131
- description: "Trigger a workflow to see its execution history here.",
136
+ title: e(s, "dashboard.workflowRuns.emptyTitle", "No runs yet"),
137
+ description: e(s, "dashboard.workflowRuns.emptyDescription", "Trigger a workflow to see its execution history here."),
132
138
  className: "py-4"
133
139
  })
134
140
  });
135
141
  }
136
142
  //#endregion
137
- export { m as WorkflowRunsWidget };
143
+ export { g as WorkflowRunsWidget };
138
144
 
139
145
  //# sourceMappingURL=WorkflowRunsWidget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowRunsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkflowRunsWidget.tsx"],"sourcesContent":["import { Activity, ArrowRight, Play, Clock, CheckCircle2, XCircle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst RUN_STATUS_ICON: Record<string, { icon: typeof Play; color: string }> = {\n RUNNING: { icon: Play, color: 'text-accent-blue' },\n PENDING: { icon: Clock, color: 'text-status-warning-text' },\n WAITING: { icon: Clock, color: 'text-status-warning-text' },\n COMPLETED: { icon: CheckCircle2, color: 'text-status-success-text' },\n FAILED: { icon: XCircle, color: 'text-status-error-text' },\n CANCELLED: { icon: XCircle, color: 'text-text-tertiary' },\n TERMINATED: { icon: XCircle, color: 'text-text-tertiary' },\n};\n\nfunction formatRelative(dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return 'just now';\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function WorkflowRunsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const stats = workspaceData?.workflowStats;\n const recentRuns = stats?.recentRuns ?? [];\n const successRate = stats?.workflowSuccessRate;\n\n return (\n <WidgetWrapper\n title=\"Workflow Runs\"\n icon={<Activity className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workflows/runs')}\n >\n View all <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {!stats ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No runs yet\"\n description=\"Trigger a workflow to see its execution history here.\"\n className=\"py-4\"\n />\n ) : (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-text-primary tabular-nums\">\n {stats.runsRunningCount ?? 0}\n </p>\n <p className=\"text-[11px] text-text-secondary\">Running</p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-status-error-text tabular-nums\">\n {stats.runsFailedLast24h ?? 0}\n </p>\n <p className=\"text-[11px] text-text-secondary\">Failed (24h)</p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-status-success-text tabular-nums\">\n {successRate != null ? `${Math.round(successRate)}%` : '—'}\n </p>\n <p className=\"text-[11px] text-text-secondary\">Success rate</p>\n </div>\n </div>\n {recentRuns.length > 0 && (\n <div className=\"space-y-1.5\">\n <p className=\"text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Recent Runs\n </p>\n {recentRuns.slice(0, 4).map((run) => {\n const statusInfo = RUN_STATUS_ICON[run.status] ?? RUN_STATUS_ICON.RUNNING;\n const StatusIcon = statusInfo.icon;\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => navigate(`/workflows/runs/${run.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-1.5 text-left transition-colors hover:bg-accent/5\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <StatusIcon className={`size-3.5 shrink-0 ${statusInfo.color}`} />\n <span className=\"truncate text-sm text-text-primary\">{run.workflowKey}</span>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {run.status.toLowerCase()}\n </Badge>\n <span className=\"text-[11px] text-text-secondary\">\n {formatRelative(run.startedAt)}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowRunsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/WorkflowRunsWidget.tsx"],"sourcesContent":["import { Activity, ArrowRight, Play, Clock, CheckCircle2, XCircle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { I18nContextValue } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport { tWithFallback } from '../../../utils/i18n';\nimport type { WidgetProps } from '../types';\n\nconst RUN_STATUS_ICON: Record<string, { icon: typeof Play; color: string }> = {\n RUNNING: { icon: Play, color: 'text-accent-blue' },\n PENDING: { icon: Clock, color: 'text-status-warning-text' },\n WAITING: { icon: Clock, color: 'text-status-warning-text' },\n COMPLETED: { icon: CheckCircle2, color: 'text-status-success-text' },\n FAILED: { icon: XCircle, color: 'text-status-error-text' },\n CANCELLED: { icon: XCircle, color: 'text-text-tertiary' },\n TERMINATED: { icon: XCircle, color: 'text-text-tertiary' },\n};\n\nfunction formatRelative(t: I18nContextValue['t'], dateString: string): string {\n const diffMs = Date.now() - new Date(dateString).getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return tWithFallback(t, 'dashboard.workflowRuns.justNow', 'just now');\n if (diffMin < 60)\n return tWithFallback(t, 'dashboard.workflowRuns.minutesAgo', '{count}m ago', {\n count: diffMin,\n });\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24)\n return tWithFallback(t, 'dashboard.workflowRuns.hoursAgo', '{count}h ago', { count: diffHr });\n return new Date(dateString).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function WorkflowRunsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n const stats = workspaceData?.workflowStats;\n const recentRuns = stats?.recentRuns ?? [];\n const successRate = stats?.workflowSuccessRate;\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.workflowRuns.title', 'Workflow Runs')}\n icon={<Activity className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n unavailable={!workspaceData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workflows/runs')}\n >\n {tWithFallback(t, 'dashboard.workflowRuns.viewAll', 'View all')}{' '}\n <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {!stats ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tWithFallback(t, 'dashboard.workflowRuns.emptyTitle', 'No runs yet')}\n description={tWithFallback(\n t,\n 'dashboard.workflowRuns.emptyDescription',\n 'Trigger a workflow to see its execution history here.'\n )}\n className=\"py-4\"\n />\n ) : (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-3 gap-2\">\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-text-primary tabular-nums\">\n {stats.runsRunningCount ?? 0}\n </p>\n <p className=\"text-[11px] text-text-secondary\">\n {tWithFallback(t, 'dashboard.workflowRuns.statRunning', 'Running')}\n </p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-status-error-text tabular-nums\">\n {stats.runsFailedLast24h ?? 0}\n </p>\n <p className=\"text-[11px] text-text-secondary\">\n {tWithFallback(t, 'dashboard.workflowRuns.statFailed24h', 'Failed (24h)')}\n </p>\n </div>\n <div className=\"rounded-lg bg-bg-canvas p-2.5 border border-border-default text-center\">\n <p className=\"text-xl font-bold text-status-success-text tabular-nums\">\n {successRate != null ? `${Math.round(successRate)}%` : '—'}\n </p>\n <p className=\"text-[11px] text-text-secondary\">\n {tWithFallback(t, 'dashboard.workflowRuns.statSuccessRate', 'Success rate')}\n </p>\n </div>\n </div>\n {recentRuns.length > 0 && (\n <div className=\"space-y-1.5\">\n <p className=\"text-xs font-medium text-text-secondary uppercase tracking-wider\">\n {tWithFallback(t, 'dashboard.workflowRuns.recentRunsHeading', 'Recent Runs')}\n </p>\n {recentRuns.slice(0, 4).map((run) => {\n const statusInfo = RUN_STATUS_ICON[run.status] ?? RUN_STATUS_ICON.RUNNING;\n const StatusIcon = statusInfo.icon;\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => navigate(`/workflows/runs/${run.id}`)}\n className=\"flex w-full items-center justify-between gap-2 rounded-md p-1.5 text-left transition-colors hover:bg-accent/5\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <StatusIcon className={`size-3.5 shrink-0 ${statusInfo.color}`} />\n <span className=\"truncate text-sm text-text-primary\">{run.workflowKey}</span>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {run.status.toLowerCase()}\n </Badge>\n <span className=\"text-[11px] text-text-secondary\">\n {formatRelative(t, run.startedAt)}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":"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"}
@@ -1,80 +1,86 @@
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, IllustratedEmptyState as d } from "@burdenoff/fe-libs/ui";
1
+ import { tWithFallback as e } from "../../../utils/i18n.js";
2
+ import { WidgetWrapper as t } from "../WidgetWrapper.js";
3
+ import { ArrowRight as n, CheckCircle2 as r, GitBranch as i, Pause as a, Play as o, XCircle as s } from "lucide-react";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { Badge as u, Button as d, IllustratedEmptyState as f } from "@burdenoff/fe-libs/ui";
6
+ import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
7
  //#region src/pages/dashboard/widgets/WorkflowStatsWidget.tsx
6
- var f = {
8
+ var m = {
7
9
  RUNNING: {
8
- icon: a,
10
+ icon: o,
9
11
  color: "text-accent-blue"
10
12
  },
11
13
  COMPLETED: {
12
- icon: n,
14
+ icon: r,
13
15
  color: "text-status-success-text"
14
16
  },
15
17
  FAILED: {
16
- icon: o,
18
+ icon: s,
17
19
  color: "text-status-error-text"
18
20
  },
19
21
  PAUSED: {
20
- icon: i,
22
+ icon: a,
21
23
  color: "text-status-warning-text"
22
24
  }
23
25
  };
24
- function p({ 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: "size-4" }),
26
+ function h({ workspaceData: r, isLoading: a, navigate: o }) {
27
+ let { t: s } = p(), h = r?.workflowStats;
28
+ return /* @__PURE__ */ c(t, {
29
+ title: e(s, "dashboard.workflowStats.title", "Workflows"),
30
+ icon: /* @__PURE__ */ c(i, { className: "size-4" }),
29
31
  size: "medium",
30
- isLoading: i,
31
- unavailable: !n,
32
- headerAction: /* @__PURE__ */ c(u, {
32
+ isLoading: a,
33
+ unavailable: !r,
34
+ headerAction: /* @__PURE__ */ l(d, {
33
35
  variant: "ghost",
34
36
  size: "sm",
35
37
  className: "text-xs",
36
- onClick: () => a("/workflows"),
37
- children: ["View all ", /* @__PURE__ */ s(t, { className: "ml-1 size-3" })]
38
+ onClick: () => o("/workflows"),
39
+ children: [
40
+ e(s, "dashboard.workflowStats.viewAll", "View all"),
41
+ " ",
42
+ /* @__PURE__ */ c(n, { className: "ml-1 size-3" })
43
+ ]
38
44
  }),
39
- children: o ? /* @__PURE__ */ c("div", {
45
+ children: h ? /* @__PURE__ */ l("div", {
40
46
  className: "space-y-3",
41
- children: [/* @__PURE__ */ c("div", {
47
+ children: [/* @__PURE__ */ l("div", {
42
48
  className: "grid grid-cols-2 gap-3",
43
- children: [/* @__PURE__ */ c("div", {
49
+ children: [/* @__PURE__ */ l("div", {
44
50
  className: "rounded-lg bg-bg-canvas p-3 border border-border-default text-center",
45
- children: [/* @__PURE__ */ s("p", {
51
+ children: [/* @__PURE__ */ c("p", {
46
52
  className: "text-2xl font-bold text-text-primary tabular-nums",
47
- children: o.activeWorkflowsCount
48
- }), /* @__PURE__ */ s("p", {
53
+ children: h.activeWorkflowsCount
54
+ }), /* @__PURE__ */ c("p", {
49
55
  className: "text-xs text-text-secondary",
50
- children: "Active"
56
+ children: e(s, "dashboard.workflowStats.statActive", "Active")
51
57
  })]
52
- }), /* @__PURE__ */ c("div", {
58
+ }), /* @__PURE__ */ l("div", {
53
59
  className: "rounded-lg bg-bg-canvas p-3 border border-border-default text-center",
54
- children: [/* @__PURE__ */ s("p", {
60
+ children: [/* @__PURE__ */ c("p", {
55
61
  className: "text-2xl font-bold text-text-primary tabular-nums",
56
- children: o.archivedWorkflowsCount
57
- }), /* @__PURE__ */ s("p", {
62
+ children: h.archivedWorkflowsCount
63
+ }), /* @__PURE__ */ c("p", {
58
64
  className: "text-xs text-text-secondary",
59
- children: "Archived"
65
+ children: e(s, "dashboard.workflowStats.statArchived", "Archived")
60
66
  })]
61
67
  })]
62
- }), o.recentRuns.length > 0 && /* @__PURE__ */ c("div", {
68
+ }), h.recentRuns.length > 0 && /* @__PURE__ */ l("div", {
63
69
  className: "space-y-1.5",
64
- children: [/* @__PURE__ */ s("p", {
70
+ children: [/* @__PURE__ */ c("p", {
65
71
  className: "text-xs font-medium text-text-secondary uppercase tracking-wider",
66
- children: "Recent Runs"
67
- }), o.recentRuns.slice(0, 3).map((e) => {
68
- let t = f[e.status] || f.RUNNING, n = t.icon;
69
- return /* @__PURE__ */ c("div", {
72
+ children: e(s, "dashboard.workflowStats.recentRunsHeading", "Recent Runs")
73
+ }), h.recentRuns.slice(0, 3).map((e) => {
74
+ let t = m[e.status] || m.RUNNING, n = t.icon;
75
+ return /* @__PURE__ */ l("div", {
70
76
  className: "flex items-center justify-between p-1.5 rounded hover:bg-accent/5 transition-colors",
71
- children: [/* @__PURE__ */ c("div", {
77
+ children: [/* @__PURE__ */ l("div", {
72
78
  className: "flex items-center gap-2 min-w-0",
73
- children: [/* @__PURE__ */ s(n, { className: `size-3.5 ${t.color}` }), /* @__PURE__ */ s("span", {
79
+ children: [/* @__PURE__ */ c(n, { className: `size-3.5 ${t.color}` }), /* @__PURE__ */ c("span", {
74
80
  className: "text-sm text-text-primary truncate",
75
81
  children: e.workflowKey
76
82
  })]
77
- }), /* @__PURE__ */ s(l, {
83
+ }), /* @__PURE__ */ c(u, {
78
84
  variant: "outline",
79
85
  className: "text-[10px]",
80
86
  children: e.status
@@ -82,15 +88,15 @@ function p({ workspaceData: n, isLoading: i, navigate: a }) {
82
88
  }, e.id);
83
89
  })]
84
90
  })]
85
- }) : /* @__PURE__ */ s(d, {
91
+ }) : /* @__PURE__ */ c(f, {
86
92
  illustration: "empty-data",
87
- title: "No workflow data available",
88
- description: "Once you run automations, their status and counts will appear here.",
93
+ title: e(s, "dashboard.workflowStats.emptyTitle", "No workflow data available"),
94
+ description: e(s, "dashboard.workflowStats.emptyDescription", "Once you run automations, their status and counts will appear here."),
89
95
  className: "py-4"
90
96
  })
91
97
  });
92
98
  }
93
99
  //#endregion
94
- export { p as WorkflowStatsWidget };
100
+ export { h as WorkflowStatsWidget };
95
101
 
96
102
  //# sourceMappingURL=WorkflowStatsWidget.js.map