@burdenoff/microfe-workspaces 2026.801.1 → 2026.825.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/global-operations.js +44 -1
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/wspace-operations.js +18 -18
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/hooks/useMemberMutations.js +0 -2
- package/dist/hooks/useMemberMutations.js.map +1 -1
- package/dist/hooks/useWorkspaceMutations.js +84 -61
- package/dist/hooks/useWorkspaceMutations.js.map +1 -1
- package/dist/hooks/useWorkspacesEventEmitter.js.map +1 -1
- package/dist/pages/WorkspaceDetailPage.js +152 -114
- package/dist/pages/WorkspaceDetailPage.js.map +1 -1
- package/dist/pages/dashboard/DashboardCustomizer.js +62 -62
- package/dist/pages/dashboard/DashboardCustomizer.js.map +1 -1
- package/dist/pages/dashboard/DashboardPage.js +88 -69
- package/dist/pages/dashboard/DashboardPage.js.map +1 -1
- package/dist/pages/dashboard/config.js +77 -1
- package/dist/pages/dashboard/config.js.map +1 -1
- package/dist/pages/dashboard/widgets/AgentsWidget.js +56 -54
- package/dist/pages/dashboard/widgets/AgentsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/GroupsWidget.js +29 -31
- package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/MembersWidget.js +33 -33
- package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/ProjectsWidget.js +42 -44
- package/dist/pages/dashboard/widgets/ProjectsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js +171 -161
- package/dist/pages/dashboard/widgets/QuickActionsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js +54 -44
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/SessionsWidget.js +57 -41
- package/dist/pages/dashboard/widgets/SessionsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/StorageWidget.js +52 -54
- package/dist/pages/dashboard/widgets/StorageWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TagCloudWidget.js +28 -30
- package/dist/pages/dashboard/widgets/TagCloudWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/TipsWidget.js +141 -131
- package/dist/pages/dashboard/widgets/TipsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js +46 -40
- package/dist/pages/dashboard/widgets/UpcomingEventsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/VibesWidget.js +44 -34
- package/dist/pages/dashboard/widgets/VibesWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +43 -41
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js +68 -62
- package/dist/pages/dashboard/widgets/WorkflowRunsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +50 -44
- package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js +59 -49
- package/dist/pages/dashboard/widgets/WorkflowsOverviewWidget.js.map +1 -1
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js +35 -33
- package/dist/pages/dashboard/widgets/WorkspacesWidget.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MembersWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/MembersWidget.tsx"],"sourcesContent":["import { Users, UserPlus, ArrowRight } from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nexport function MembersWidget({ workspaceData, globalData, isLoading, navigate }: WidgetProps) {\n // Member count comes from globalData.workspaces (each workspace has memberCount)\n const workspaces = globalData?.workspaces?.items ?? workspaceData?.workspaces.items ?? [];\n const totalMembers = workspaces.reduce(\n (sum, ws) => sum + ((ws as { memberCount?: number }).memberCount ?? 0),\n 0\n );\n const totalWorkspaces = globalData?.workspaces?.total ?? workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title
|
|
1
|
+
{"version":3,"file":"MembersWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/MembersWidget.tsx"],"sourcesContent":["import { Users, UserPlus, ArrowRight } from 'lucide-react';\nimport { Button } 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\nexport function MembersWidget({ workspaceData, globalData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n\n // Member count comes from globalData.workspaces (each workspace has memberCount)\n const workspaces = globalData?.workspaces?.items ?? workspaceData?.workspaces.items ?? [];\n const totalMembers = workspaces.reduce(\n (sum, ws) => sum + ((ws as { memberCount?: number }).memberCount ?? 0),\n 0\n );\n const totalWorkspaces = globalData?.workspaces?.total ?? workspaceData?.workspaces.total ?? 0;\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.members.title', 'Members')}\n icon={<Users className=\"size-4\" />}\n size=\"small\"\n isLoading={isLoading}\n unavailable={!workspaceData && !globalData}\n headerAction={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={() => navigate('/workspaces/members')}\n >\n <ArrowRight className=\"size-3\" />\n </Button>\n }\n >\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold text-text-primary tabular-nums\">{totalMembers}</p>\n <p className=\"text-xs text-text-secondary\">\n {tWithFallback(\n t,\n 'dashboard.members.summary',\n '{memberLabel} across {count} {workspaceLabel}',\n {\n memberLabel:\n totalMembers === 1\n ? tWithFallback(t, 'dashboard.members.memberSingular', 'Member')\n : tWithFallback(t, 'dashboard.members.memberPlural', 'Members'),\n count: totalWorkspaces,\n workspaceLabel:\n totalWorkspaces === 1\n ? tWithFallback(t, 'dashboard.members.workspaceSingular', 'workspace')\n : tWithFallback(t, 'dashboard.members.workspacePlural', 'workspaces'),\n }\n )}\n </p>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full text-xs\"\n onClick={() => navigate('/workspaces/members?invite=true')}\n >\n <UserPlus className=\"size-3 mr-1.5\" />\n {tWithFallback(t, 'dashboard.members.invite', 'Invite a member')}\n </Button>\n {workspaces.length > 0 && (\n <div className=\"flex -space-x-2 justify-center\">\n {workspaces.slice(0, 5).map((ws) => (\n <div\n key={ws.id}\n className=\"size-8 rounded-full bg-action-primary-bg/10 text-primary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\"\n title={ws.name}\n >\n {ws.name.charAt(0).toUpperCase()}\n </div>\n ))}\n {totalWorkspaces > 5 && (\n <div className=\"size-8 rounded-full bg-bg-sunken text-text-secondary flex items-center justify-center text-xs font-bold border-2 border-bg-surface\">\n +{totalWorkspaces - 5}\n </div>\n )}\n </div>\n )}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,EAAc,EAAE,kBAAe,eAAY,cAAW,eAAyB;CAC7F,IAAM,EAAE,SAAM,GAAS,EAGjB,IAAa,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS,EAAE,EACnF,IAAe,EAAW,QAC7B,GAAK,MAAO,KAAQ,EAAgC,eAAe,IACpE,EACD,EACK,IAAkB,GAAY,YAAY,SAAS,GAAe,WAAW,SAAS;AAE5F,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,2BAA2B,UAAU;EAC7D,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;EAClC,MAAK;EACM;EACX,aAAa,CAAC,KAAiB,CAAC;EAChC,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,sBAAsB;aAE9C,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;GAC1B,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAqD;MAAiB,CAAA,EACnF,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,GACA,6BACA,iDACA;OACE,aACE,MAAiB,IACb,EAAc,GAAG,oCAAoC,SAAS,GAC9D,EAAc,GAAG,kCAAkC,UAAU;OACnE,OAAO;OACP,gBACE,MAAoB,IAChB,EAAc,GAAG,uCAAuC,YAAY,GACpE,EAAc,GAAG,qCAAqC,aAAa;OAC1E,CACF;MACC,CAAA,CACA;;IACN,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,eAAe,EAAS,kCAAkC;eAJ5D,CAME,kBAAC,GAAD,EAAU,WAAU,iBAAkB,CAAA,EACrC,EAAc,GAAG,4BAA4B,kBAAkB,CACzD;;IACR,EAAW,SAAS,KACnB,kBAAC,OAAD;KAAK,WAAU;eAAf,CACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAK,MAC3B,kBAAC,OAAD;MAEE,WAAU;MACV,OAAO,EAAG;gBAET,EAAG,KAAK,OAAO,EAAE,CAAC,aAAa;MAC5B,EALC,EAAG,GAKJ,CACN,EACD,IAAkB,KACjB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAAoJ,KAChJ,IAAkB,EAChB;QAEJ;;IAEJ;;EACQ,CAAA"}
|
|
@@ -1,82 +1,80 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { tWithFallback as e } from "../../../utils/i18n.js";
|
|
2
|
+
import { WidgetWrapper as t } from "../WidgetWrapper.js";
|
|
3
|
+
import { ArrowRight as n, Circle as r, FolderKanban as i } from "lucide-react";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as s, Button as c, IllustratedEmptyState as l } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
5
7
|
//#region src/pages/dashboard/widgets/ProjectsWidget.tsx
|
|
6
|
-
var
|
|
8
|
+
var d = {
|
|
7
9
|
ACTIVE: "bg-status-success-bg",
|
|
8
10
|
INACTIVE: "bg-text-tertiary",
|
|
9
11
|
ARCHIVED: "bg-status-warning-bg"
|
|
10
|
-
},
|
|
12
|
+
}, f = {
|
|
11
13
|
ACTIVE: "default",
|
|
12
14
|
INACTIVE: "secondary",
|
|
13
15
|
ARCHIVED: "outline"
|
|
14
16
|
};
|
|
15
|
-
function
|
|
16
|
-
let
|
|
17
|
-
return /* @__PURE__ */
|
|
18
|
-
title: "Projects",
|
|
19
|
-
icon: /* @__PURE__ */ i
|
|
17
|
+
function p({ workspaceData: p, isLoading: m, navigate: h }) {
|
|
18
|
+
let { t: g } = u(), _ = p?.projects.items ?? [], v = p?.projects.total ?? 0, y = _.filter((e) => e.status === "ACTIVE").length, b = _.filter((e) => e.status === "INACTIVE").length;
|
|
19
|
+
return /* @__PURE__ */ a(t, {
|
|
20
|
+
title: e(g, "dashboard.projects.title", "Projects"),
|
|
21
|
+
icon: /* @__PURE__ */ a(i, { className: "size-4" }),
|
|
20
22
|
size: "medium",
|
|
21
|
-
isLoading:
|
|
22
|
-
unavailable: !
|
|
23
|
-
headerAction: /* @__PURE__ */
|
|
23
|
+
isLoading: m,
|
|
24
|
+
unavailable: !p,
|
|
25
|
+
headerAction: /* @__PURE__ */ o(c, {
|
|
24
26
|
variant: "ghost",
|
|
25
27
|
size: "sm",
|
|
26
28
|
className: "text-xs",
|
|
27
|
-
onClick: () =>
|
|
28
|
-
children: [
|
|
29
|
+
onClick: () => h("/workspaces/projects"),
|
|
30
|
+
children: [
|
|
31
|
+
e(g, "dashboard.projects.viewAll", "View all"),
|
|
32
|
+
" ",
|
|
33
|
+
/* @__PURE__ */ a(n, { className: "ml-1 size-3" })
|
|
34
|
+
]
|
|
29
35
|
}),
|
|
30
|
-
children:
|
|
36
|
+
children: _.length === 0 ? /* @__PURE__ */ a(l, {
|
|
31
37
|
illustration: "empty-data",
|
|
32
|
-
title: "No projects yet",
|
|
38
|
+
title: e(g, "dashboard.projects.emptyTitle", "No projects yet"),
|
|
33
39
|
className: "py-4",
|
|
34
|
-
action: /* @__PURE__ */
|
|
40
|
+
action: /* @__PURE__ */ a(c, {
|
|
35
41
|
variant: "outline",
|
|
36
42
|
size: "sm",
|
|
37
|
-
onClick: () =>
|
|
38
|
-
children: "Create a project"
|
|
43
|
+
onClick: () => h("/workspaces/projects"),
|
|
44
|
+
children: e(g, "dashboard.projects.createProject", "Create a project")
|
|
39
45
|
})
|
|
40
|
-
}) : /* @__PURE__ */
|
|
46
|
+
}) : /* @__PURE__ */ o("div", {
|
|
41
47
|
className: "space-y-3",
|
|
42
|
-
children: [
|
|
48
|
+
children: [v > 0 && /* @__PURE__ */ o("div", {
|
|
43
49
|
className: "flex items-center gap-3 text-xs text-text-secondary",
|
|
44
50
|
children: [
|
|
45
|
-
/* @__PURE__ */
|
|
51
|
+
/* @__PURE__ */ o("span", {
|
|
46
52
|
className: "flex items-center gap-1",
|
|
47
|
-
children: [
|
|
48
|
-
/* @__PURE__ */ i(n, { className: `size-2 fill-status-success-bg text-status-success-bg ${g > 0 ? "motion-safe:animate-vc-glow-pulse" : ""}` }),
|
|
49
|
-
g,
|
|
50
|
-
" active"
|
|
51
|
-
]
|
|
53
|
+
children: [/* @__PURE__ */ a(r, { className: `size-2 fill-status-success-bg text-status-success-bg ${y > 0 ? "motion-safe:animate-vc-glow-pulse" : ""}` }), e(g, "dashboard.projects.activeCount", "{count} active", { count: y })]
|
|
52
54
|
}),
|
|
53
|
-
|
|
55
|
+
b > 0 && /* @__PURE__ */ o("span", {
|
|
54
56
|
className: "flex items-center gap-1",
|
|
55
|
-
children: [
|
|
56
|
-
/* @__PURE__ */ i(n, { className: "size-2 fill-text-tertiary text-text-tertiary" }),
|
|
57
|
-
_,
|
|
58
|
-
" inactive"
|
|
59
|
-
]
|
|
57
|
+
children: [/* @__PURE__ */ a(r, { className: "size-2 fill-text-tertiary text-text-tertiary" }), e(g, "dashboard.projects.inactiveCount", "{count} inactive", { count: b })]
|
|
60
58
|
}),
|
|
61
59
|
/* @__PURE__ */ a("span", {
|
|
62
60
|
className: "ml-auto font-medium",
|
|
63
|
-
children:
|
|
61
|
+
children: e(g, "dashboard.projects.totalCount", "{count} total", { count: v })
|
|
64
62
|
})
|
|
65
63
|
]
|
|
66
|
-
}), /* @__PURE__ */
|
|
64
|
+
}), /* @__PURE__ */ a("div", {
|
|
67
65
|
className: "space-y-2",
|
|
68
|
-
children:
|
|
66
|
+
children: _.slice(0, 4).map((e) => /* @__PURE__ */ o("button", {
|
|
69
67
|
type: "button",
|
|
70
68
|
className: "w-full flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left",
|
|
71
|
-
onClick: () =>
|
|
72
|
-
children: [/* @__PURE__ */
|
|
69
|
+
onClick: () => h(`/workspaces/${e.workspaceId}/projects`),
|
|
70
|
+
children: [/* @__PURE__ */ o("div", {
|
|
73
71
|
className: "flex items-center gap-2 min-w-0",
|
|
74
|
-
children: [/* @__PURE__ */
|
|
72
|
+
children: [/* @__PURE__ */ a(r, { className: `size-2 ${d[e.status] || "bg-text-tertiary"} fill-current ${e.status === "ACTIVE" ? "motion-safe:animate-vc-glow-pulse" : ""}` }), /* @__PURE__ */ a("span", {
|
|
75
73
|
className: "text-sm font-medium text-text-primary truncate",
|
|
76
74
|
children: e.name
|
|
77
75
|
})]
|
|
78
|
-
}), /* @__PURE__ */
|
|
79
|
-
variant:
|
|
76
|
+
}), /* @__PURE__ */ a(s, {
|
|
77
|
+
variant: f[e.status] || "outline",
|
|
80
78
|
className: "text-[10px] shrink-0",
|
|
81
79
|
children: e.key
|
|
82
80
|
})]
|
|
@@ -86,6 +84,6 @@ function d({ workspaceData: d, isLoading: f, navigate: p }) {
|
|
|
86
84
|
});
|
|
87
85
|
}
|
|
88
86
|
//#endregion
|
|
89
|
-
export {
|
|
87
|
+
export { p as ProjectsWidget };
|
|
90
88
|
|
|
91
89
|
//# sourceMappingURL=ProjectsWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/ProjectsWidget.tsx"],"sourcesContent":["import { FolderKanban, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\nconst statusColors: Record<string, string> = {\n ACTIVE: 'bg-status-success-bg',\n INACTIVE: 'bg-text-tertiary',\n ARCHIVED: 'bg-status-warning-bg',\n};\n\nconst statusVariant: Record<string, 'default' | 'secondary' | 'outline'> = {\n ACTIVE: 'default',\n INACTIVE: 'secondary',\n ARCHIVED: 'outline',\n};\n\nexport function ProjectsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const projects = workspaceData?.projects.items ?? [];\n const total = workspaceData?.projects.total ?? 0;\n\n // Status breakdown\n const activeCount = projects.filter((p) => p.status === 'ACTIVE').length;\n const inactiveCount = projects.filter((p) => p.status === 'INACTIVE').length;\n\n return (\n <WidgetWrapper\n title
|
|
1
|
+
{"version":3,"file":"ProjectsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/ProjectsWidget.tsx"],"sourcesContent":["import { FolderKanban, ArrowRight, Circle } from 'lucide-react';\nimport { Badge, Button, IllustratedEmptyState } 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\nconst statusColors: Record<string, string> = {\n ACTIVE: 'bg-status-success-bg',\n INACTIVE: 'bg-text-tertiary',\n ARCHIVED: 'bg-status-warning-bg',\n};\n\nconst statusVariant: Record<string, 'default' | 'secondary' | 'outline'> = {\n ACTIVE: 'default',\n INACTIVE: 'secondary',\n ARCHIVED: 'outline',\n};\n\nexport function ProjectsWidget({ workspaceData, isLoading, navigate }: WidgetProps) {\n const { t } = useI18n();\n const projects = workspaceData?.projects.items ?? [];\n const total = workspaceData?.projects.total ?? 0;\n\n // Status breakdown\n const activeCount = projects.filter((p) => p.status === 'ACTIVE').length;\n const inactiveCount = projects.filter((p) => p.status === 'INACTIVE').length;\n\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.projects.title', 'Projects')}\n icon={<FolderKanban 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('/workspaces/projects')}\n >\n {tWithFallback(t, 'dashboard.projects.viewAll', 'View all')}{' '}\n <ArrowRight className=\"ml-1 size-3\" />\n </Button>\n }\n >\n {projects.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tWithFallback(t, 'dashboard.projects.emptyTitle', 'No projects yet')}\n className=\"py-4\"\n action={\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workspaces/projects')}>\n {tWithFallback(t, 'dashboard.projects.createProject', 'Create a project')}\n </Button>\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {total > 0 && (\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Circle\n className={`size-2 fill-status-success-bg text-status-success-bg ${\n activeCount > 0 ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n {tWithFallback(t, 'dashboard.projects.activeCount', '{count} active', {\n count: activeCount,\n })}\n </span>\n {inactiveCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <Circle className=\"size-2 fill-text-tertiary text-text-tertiary\" />\n {tWithFallback(t, 'dashboard.projects.inactiveCount', '{count} inactive', {\n count: inactiveCount,\n })}\n </span>\n )}\n <span className=\"ml-auto font-medium\">\n {tWithFallback(t, 'dashboard.projects.totalCount', '{count} total', {\n count: total,\n })}\n </span>\n </div>\n )}\n <div className=\"space-y-2\">\n {projects.slice(0, 4).map((proj) => (\n <button\n key={proj.id}\n type=\"button\"\n className=\"w-full flex items-center justify-between p-2 rounded-md hover:bg-accent/5 cursor-pointer transition-colors text-left\"\n onClick={() => navigate(`/workspaces/${proj.workspaceId}/projects`)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <Circle\n className={`size-2 ${statusColors[proj.status] || 'bg-text-tertiary'} fill-current ${\n proj.status === 'ACTIVE' ? 'motion-safe:animate-vc-glow-pulse' : ''\n }`}\n />\n <span className=\"text-sm font-medium text-text-primary truncate\">\n {proj.name}\n </span>\n </div>\n <Badge\n variant={statusVariant[proj.status] || 'outline'}\n className=\"text-[10px] shrink-0\"\n >\n {proj.key}\n </Badge>\n </button>\n ))}\n </div>\n </div>\n )}\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAOA,IAAM,IAAuC;CAC3C,QAAQ;CACR,UAAU;CACV,UAAU;CACX,EAEK,IAAqE;CACzE,QAAQ;CACR,UAAU;CACV,UAAU;CACX;AAED,SAAgB,EAAe,EAAE,kBAAe,cAAW,eAAyB;CAClF,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAe,SAAS,SAAS,EAAE,EAC9C,IAAQ,GAAe,SAAS,SAAS,GAGzC,IAAc,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QAC5D,IAAgB,EAAS,QAAQ,MAAM,EAAE,WAAW,WAAW,CAAC;AAEtE,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,4BAA4B,WAAW;EAC/D,MAAM,kBAAC,GAAD,EAAc,WAAU,UAAW,CAAA;EACzC,MAAK;EACM;EACX,aAAa,CAAC;EACd,cACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,WAAU;GACV,eAAe,EAAS,uBAAuB;aAJjD;IAMG,EAAc,GAAG,8BAA8B,WAAW;IAAE;IAC7D,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA;IAC/B;;YAGV,EAAS,WAAW,IACnB,kBAAC,GAAD;GACE,cAAa;GACb,OAAO,EAAc,GAAG,iCAAiC,kBAAkB;GAC3E,WAAU;GACV,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,eAAe,EAAS,uBAAuB;cAChF,EAAc,GAAG,oCAAoC,mBAAmB;IAClE,CAAA;GAEX,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,IAAQ,KACP,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EACE,WAAW,wDACT,IAAc,IAAI,sCAAsC,MAE1D,CAAA,EACD,EAAc,GAAG,kCAAkC,kBAAkB,EACpE,OAAO,GACR,CAAC,CACG;;KACN,IAAgB,KACf,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAQ,WAAU,gDAAiD,CAAA,EAClE,EAAc,GAAG,oCAAoC,oBAAoB,EACxE,OAAO,GACR,CAAC,CACG;;KAET,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAc,GAAG,iCAAiC,iBAAiB,EAClE,OAAO,GACR,CAAC;MACG,CAAA;KACH;OAER,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,UAAD;KAEE,MAAK;KACL,WAAU;KACV,eAAe,EAAS,eAAe,EAAK,YAAY,WAAW;eAJrE,CAME,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EACE,WAAW,UAAU,EAAa,EAAK,WAAW,mBAAmB,gBACnE,EAAK,WAAW,WAAW,sCAAsC,MAEnE,CAAA,EACF,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;SACN,kBAAC,GAAD;MACE,SAAS,EAAc,EAAK,WAAW;MACvC,WAAU;gBAET,EAAK;MACA,CAAA,CACD;OArBF,EAAK,GAqBH,CACT;IACE,CAAA,CACF;;EAEM,CAAA"}
|
|
@@ -1,169 +1,179 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { tWithFallback as e } from "../../../utils/i18n.js";
|
|
2
|
+
import { WidgetWrapper as t } from "../WidgetWrapper.js";
|
|
3
|
+
import { Bot as n, Calendar as r, Cog as i, FileText as a, FolderKanban as o, GitBranch as s, LayoutTemplate as c, PlayCircle as l, Plus as u, Sparkles as d, Tags as f, Terminal as p, Upload as m, UserPlus as h, Zap as g } from "lucide-react";
|
|
4
|
+
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
5
|
+
import { Button as y } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
5
7
|
//#region src/pages/dashboard/widgets/QuickActionsWidget.tsx
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
id: "new-vibe",
|
|
66
|
-
label: "New Vibe",
|
|
67
|
-
icon: u,
|
|
68
|
-
path: "/vibecontrols/vibes/new",
|
|
69
|
-
color: "text-accent-blue"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
id: "view-sessions",
|
|
73
|
-
label: "Sessions",
|
|
74
|
-
icon: f,
|
|
75
|
-
path: "/vibecontrols/sessions",
|
|
76
|
-
color: "text-status-success-text"
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: "connect-agent",
|
|
80
|
-
label: "Connect Agent",
|
|
81
|
-
icon: t,
|
|
82
|
-
path: "/vibecontrols/agents/new",
|
|
83
|
-
color: "text-accent-purple"
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
id: "invite-member",
|
|
87
|
-
label: "Invite Member",
|
|
88
|
-
icon: m,
|
|
89
|
-
path: "/workspaces/members",
|
|
90
|
-
color: "text-accent-pink"
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
id: "upload-file",
|
|
94
|
-
label: "Upload File",
|
|
95
|
-
icon: p,
|
|
96
|
-
path: "/files",
|
|
97
|
-
color: "text-status-warning-text"
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
id: "settings",
|
|
101
|
-
label: "Settings",
|
|
102
|
-
icon: r,
|
|
103
|
-
path: "/settings",
|
|
104
|
-
color: "text-accent-cyan"
|
|
105
|
-
}
|
|
106
|
-
], x = [
|
|
107
|
-
{
|
|
108
|
-
id: "new-workflow",
|
|
109
|
-
label: "New Workflow",
|
|
110
|
-
icon: o,
|
|
111
|
-
path: "/workflows/new",
|
|
112
|
-
color: "text-accent-blue"
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
id: "view-runs",
|
|
116
|
-
label: "View Runs",
|
|
117
|
-
icon: c,
|
|
118
|
-
path: "/workflows/runs",
|
|
119
|
-
color: "text-status-success-text"
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
id: "browse-templates",
|
|
123
|
-
label: "Templates",
|
|
124
|
-
icon: s,
|
|
125
|
-
path: "/workflows/templates",
|
|
126
|
-
color: "text-accent-purple"
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: "invite-member",
|
|
130
|
-
label: "Invite Member",
|
|
131
|
-
icon: m,
|
|
132
|
-
path: "/workspaces/members",
|
|
133
|
-
color: "text-accent-pink"
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
id: "upload-file",
|
|
137
|
-
label: "Upload File",
|
|
138
|
-
icon: p,
|
|
139
|
-
path: "/files",
|
|
140
|
-
color: "text-status-warning-text"
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
id: "settings",
|
|
144
|
-
label: "Settings",
|
|
145
|
-
icon: r,
|
|
146
|
-
path: "/settings",
|
|
147
|
-
color: "text-accent-cyan"
|
|
148
|
-
}
|
|
149
|
-
];
|
|
150
|
-
function S(e) {
|
|
151
|
-
return e === "vibecontrols" ? b : e === "fluidgrids" ? x : y;
|
|
8
|
+
function x(t) {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
id: "create-workspace",
|
|
12
|
+
label: e(t, "dashboard.quickActions.newWorkspace", "New Workspace"),
|
|
13
|
+
icon: u,
|
|
14
|
+
path: "/workspaces/list",
|
|
15
|
+
color: "text-accent-blue"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "create-project",
|
|
19
|
+
label: e(t, "dashboard.quickActions.newProject", "New Project"),
|
|
20
|
+
icon: o,
|
|
21
|
+
path: "/workspaces/projects",
|
|
22
|
+
color: "text-status-success-text"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "invite-member",
|
|
26
|
+
label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
|
|
27
|
+
icon: h,
|
|
28
|
+
path: "/workspaces/members",
|
|
29
|
+
color: "text-accent-purple"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "upload-file",
|
|
33
|
+
label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
|
|
34
|
+
icon: m,
|
|
35
|
+
path: "/files",
|
|
36
|
+
color: "text-status-warning-text"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "new-event",
|
|
40
|
+
label: e(t, "dashboard.quickActions.newEvent", "New Event"),
|
|
41
|
+
icon: r,
|
|
42
|
+
path: "/calendar",
|
|
43
|
+
color: "text-accent-pink"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "manage-tags",
|
|
47
|
+
label: e(t, "dashboard.quickActions.manageTags", "Manage Tags"),
|
|
48
|
+
icon: f,
|
|
49
|
+
path: "/tags",
|
|
50
|
+
color: "text-accent-cyan"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "view-workflows",
|
|
54
|
+
label: e(t, "dashboard.quickActions.workflows", "Workflows"),
|
|
55
|
+
icon: a,
|
|
56
|
+
path: "/workflows",
|
|
57
|
+
color: "text-accent-orange"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "settings",
|
|
61
|
+
label: e(t, "dashboard.quickActions.settings", "Settings"),
|
|
62
|
+
icon: i,
|
|
63
|
+
path: "/settings",
|
|
64
|
+
color: "text-text-secondary"
|
|
65
|
+
}
|
|
66
|
+
];
|
|
152
67
|
}
|
|
153
|
-
function
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
68
|
+
function S(t) {
|
|
69
|
+
return [
|
|
70
|
+
{
|
|
71
|
+
id: "new-vibe",
|
|
72
|
+
label: e(t, "dashboard.quickActions.newVibe", "New Vibe"),
|
|
73
|
+
icon: d,
|
|
74
|
+
path: "/vibecontrols/vibes/new",
|
|
75
|
+
color: "text-accent-blue"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "view-sessions",
|
|
79
|
+
label: e(t, "dashboard.quickActions.sessions", "Sessions"),
|
|
80
|
+
icon: p,
|
|
81
|
+
path: "/vibecontrols/sessions",
|
|
82
|
+
color: "text-status-success-text"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
id: "connect-agent",
|
|
86
|
+
label: e(t, "dashboard.quickActions.connectAgent", "Connect Agent"),
|
|
87
|
+
icon: n,
|
|
88
|
+
path: "/vibecontrols/agents/new",
|
|
89
|
+
color: "text-accent-purple"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: "invite-member",
|
|
93
|
+
label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
|
|
94
|
+
icon: h,
|
|
95
|
+
path: "/workspaces/members",
|
|
96
|
+
color: "text-accent-pink"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "upload-file",
|
|
100
|
+
label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
|
|
101
|
+
icon: m,
|
|
102
|
+
path: "/files",
|
|
103
|
+
color: "text-status-warning-text"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "settings",
|
|
107
|
+
label: e(t, "dashboard.quickActions.settings", "Settings"),
|
|
108
|
+
icon: i,
|
|
109
|
+
path: "/settings",
|
|
110
|
+
color: "text-accent-cyan"
|
|
111
|
+
}
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
function C(t) {
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
id: "new-workflow",
|
|
118
|
+
label: e(t, "dashboard.quickActions.newWorkflow", "New Workflow"),
|
|
119
|
+
icon: s,
|
|
120
|
+
path: "/workflows/new",
|
|
121
|
+
color: "text-accent-blue"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "view-runs",
|
|
125
|
+
label: e(t, "dashboard.quickActions.viewRuns", "View Runs"),
|
|
126
|
+
icon: l,
|
|
127
|
+
path: "/workflows/runs",
|
|
128
|
+
color: "text-status-success-text"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "browse-templates",
|
|
132
|
+
label: e(t, "dashboard.quickActions.templates", "Templates"),
|
|
133
|
+
icon: c,
|
|
134
|
+
path: "/workflows/templates",
|
|
135
|
+
color: "text-accent-purple"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: "invite-member",
|
|
139
|
+
label: e(t, "dashboard.quickActions.inviteMember", "Invite Member"),
|
|
140
|
+
icon: h,
|
|
141
|
+
path: "/workspaces/members",
|
|
142
|
+
color: "text-accent-pink"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: "upload-file",
|
|
146
|
+
label: e(t, "dashboard.quickActions.uploadFile", "Upload File"),
|
|
147
|
+
icon: m,
|
|
148
|
+
path: "/files",
|
|
149
|
+
color: "text-status-warning-text"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "settings",
|
|
153
|
+
label: e(t, "dashboard.quickActions.settings", "Settings"),
|
|
154
|
+
icon: i,
|
|
155
|
+
path: "/settings",
|
|
156
|
+
color: "text-accent-cyan"
|
|
157
|
+
}
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
function w(e, t) {
|
|
161
|
+
return t === "vibecontrols" ? S(e) : t === "fluidgrids" ? C(e) : x(e);
|
|
162
|
+
}
|
|
163
|
+
function T({ navigate: n, isLoading: r, productId: i }) {
|
|
164
|
+
let { t: a } = b(), o = w(a, i);
|
|
165
|
+
return /* @__PURE__ */ _(t, {
|
|
166
|
+
title: e(a, "dashboard.quickActions.title", "Quick Actions"),
|
|
167
|
+
icon: /* @__PURE__ */ _(g, { className: "size-4" }),
|
|
158
168
|
size: "medium",
|
|
159
|
-
isLoading:
|
|
160
|
-
children: /* @__PURE__ */
|
|
169
|
+
isLoading: r,
|
|
170
|
+
children: /* @__PURE__ */ _("div", {
|
|
161
171
|
className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2",
|
|
162
|
-
children:
|
|
172
|
+
children: o.map((e) => /* @__PURE__ */ v(y, {
|
|
163
173
|
variant: "outline",
|
|
164
174
|
className: "flex flex-col items-center gap-1.5 h-auto py-3 px-2 text-xs hover:bg-accent/5 transition-colors",
|
|
165
|
-
onClick: () =>
|
|
166
|
-
children: [/* @__PURE__ */
|
|
175
|
+
onClick: () => n(e.path),
|
|
176
|
+
children: [/* @__PURE__ */ _(e.icon, { className: `size-5 ${e.color}` }), /* @__PURE__ */ _("span", {
|
|
167
177
|
className: "text-text-secondary font-medium",
|
|
168
178
|
children: e.label
|
|
169
179
|
})]
|
|
@@ -172,6 +182,6 @@ function C({ navigate: t, isLoading: n, productId: r }) {
|
|
|
172
182
|
});
|
|
173
183
|
}
|
|
174
184
|
//#endregion
|
|
175
|
-
export {
|
|
185
|
+
export { T as QuickActionsWidget };
|
|
176
186
|
|
|
177
187
|
//# sourceMappingURL=QuickActionsWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickActionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/QuickActionsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Zap,\n Plus,\n Upload,\n UserPlus,\n FolderKanban,\n Calendar,\n FileText,\n Tags,\n Bot,\n Terminal,\n Sparkles,\n Cog,\n GitBranch,\n PlayCircle,\n LayoutTemplate,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { WidgetWrapper } from '../WidgetWrapper';\nimport type { WidgetProps } from '../types';\n\ninterface QuickAction {\n id: string;\n label: string;\n icon: LucideIcon;\n path: string;\n color: string;\n}\n\
|
|
1
|
+
{"version":3,"file":"QuickActionsWidget.js","names":[],"sources":["../../../../src/pages/dashboard/widgets/QuickActionsWidget.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Zap,\n Plus,\n Upload,\n UserPlus,\n FolderKanban,\n Calendar,\n FileText,\n Tags,\n Bot,\n Terminal,\n Sparkles,\n Cog,\n GitBranch,\n PlayCircle,\n LayoutTemplate,\n} from 'lucide-react';\nimport { Button } 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\ntype Translate = I18nContextValue['t'];\n\ninterface QuickAction {\n id: string;\n label: string;\n icon: LucideIcon;\n path: string;\n color: string;\n}\n\nfunction workspacesQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'create-workspace',\n label: tWithFallback(t, 'dashboard.quickActions.newWorkspace', 'New Workspace'),\n icon: Plus,\n path: '/workspaces/list',\n color: 'text-accent-blue',\n },\n {\n id: 'create-project',\n label: tWithFallback(t, 'dashboard.quickActions.newProject', 'New Project'),\n icon: FolderKanban,\n path: '/workspaces/projects',\n color: 'text-status-success-text',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-purple',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'new-event',\n label: tWithFallback(t, 'dashboard.quickActions.newEvent', 'New Event'),\n icon: Calendar,\n path: '/calendar',\n color: 'text-accent-pink',\n },\n {\n id: 'manage-tags',\n label: tWithFallback(t, 'dashboard.quickActions.manageTags', 'Manage Tags'),\n icon: Tags,\n path: '/tags',\n color: 'text-accent-cyan',\n },\n {\n id: 'view-workflows',\n label: tWithFallback(t, 'dashboard.quickActions.workflows', 'Workflows'),\n icon: FileText,\n path: '/workflows',\n color: 'text-accent-orange',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-text-secondary',\n },\n ];\n}\n\nfunction vibecontrolsQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'new-vibe',\n label: tWithFallback(t, 'dashboard.quickActions.newVibe', 'New Vibe'),\n icon: Sparkles,\n path: '/vibecontrols/vibes/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-sessions',\n label: tWithFallback(t, 'dashboard.quickActions.sessions', 'Sessions'),\n icon: Terminal,\n path: '/vibecontrols/sessions',\n color: 'text-status-success-text',\n },\n {\n id: 'connect-agent',\n label: tWithFallback(t, 'dashboard.quickActions.connectAgent', 'Connect Agent'),\n icon: Bot,\n path: '/vibecontrols/agents/new',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n ];\n}\n\nfunction fluidgridsQuickActions(t: Translate): QuickAction[] {\n return [\n {\n id: 'new-workflow',\n label: tWithFallback(t, 'dashboard.quickActions.newWorkflow', 'New Workflow'),\n icon: GitBranch,\n path: '/workflows/new',\n color: 'text-accent-blue',\n },\n {\n id: 'view-runs',\n label: tWithFallback(t, 'dashboard.quickActions.viewRuns', 'View Runs'),\n icon: PlayCircle,\n path: '/workflows/runs',\n color: 'text-status-success-text',\n },\n {\n id: 'browse-templates',\n label: tWithFallback(t, 'dashboard.quickActions.templates', 'Templates'),\n icon: LayoutTemplate,\n path: '/workflows/templates',\n color: 'text-accent-purple',\n },\n {\n id: 'invite-member',\n label: tWithFallback(t, 'dashboard.quickActions.inviteMember', 'Invite Member'),\n icon: UserPlus,\n path: '/workspaces/members',\n color: 'text-accent-pink',\n },\n {\n id: 'upload-file',\n label: tWithFallback(t, 'dashboard.quickActions.uploadFile', 'Upload File'),\n icon: Upload,\n path: '/files',\n color: 'text-status-warning-text',\n },\n {\n id: 'settings',\n label: tWithFallback(t, 'dashboard.quickActions.settings', 'Settings'),\n icon: Cog,\n path: '/settings',\n color: 'text-accent-cyan',\n },\n ];\n}\n\nfunction pickActions(t: Translate, productId?: string): QuickAction[] {\n if (productId === 'vibecontrols') return vibecontrolsQuickActions(t);\n if (productId === 'fluidgrids') return fluidgridsQuickActions(t);\n return workspacesQuickActions(t);\n}\n\nexport function QuickActionsWidget({ navigate, isLoading, productId }: WidgetProps) {\n const { t } = useI18n();\n const actions = pickActions(t, productId);\n return (\n <WidgetWrapper\n title={tWithFallback(t, 'dashboard.quickActions.title', 'Quick Actions')}\n icon={<Zap className=\"size-4\" />}\n size=\"medium\"\n isLoading={isLoading}\n >\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n variant=\"outline\"\n className=\"flex flex-col items-center gap-1.5 h-auto py-3 px-2 text-xs hover:bg-accent/5 transition-colors\"\n onClick={() => navigate(action.path)}\n >\n <action.icon className={`size-5 ${action.color}`} />\n <span className=\"text-text-secondary font-medium\">{action.label}</span>\n </Button>\n ))}\n </div>\n </WidgetWrapper>\n );\n}\n"],"mappings":";;;;;;;AAmCA,SAAS,EAAuB,GAA6B;AAC3D,QAAO;EACL;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,uCAAuC,gBAAgB;GAC/E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,qCAAqC,cAAc;GAC3E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,uCAAuC,gBAAgB;GAC/E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,qCAAqC,cAAc;GAC3E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,YAAY;GACvE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,qCAAqC,cAAc;GAC3E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,oCAAoC,YAAY;GACxE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,WAAW;GACtE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACF;;AAGH,SAAS,EAAyB,GAA6B;AAC7D,QAAO;EACL;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,kCAAkC,WAAW;GACrE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,WAAW;GACtE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,uCAAuC,gBAAgB;GAC/E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,uCAAuC,gBAAgB;GAC/E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,qCAAqC,cAAc;GAC3E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,WAAW;GACtE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACF;;AAGH,SAAS,EAAuB,GAA6B;AAC3D,QAAO;EACL;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,sCAAsC,eAAe;GAC7E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,YAAY;GACvE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,oCAAoC,YAAY;GACxE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,uCAAuC,gBAAgB;GAC/E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,qCAAqC,cAAc;GAC3E,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACD;GACE,IAAI;GACJ,OAAO,EAAc,GAAG,mCAAmC,WAAW;GACtE,MAAM;GACN,MAAM;GACN,OAAO;GACR;EACF;;AAGH,SAAS,EAAY,GAAc,GAAmC;AAGpE,QAFI,MAAc,iBAAuB,EAAyB,EAAE,GAChE,MAAc,eAAqB,EAAuB,EAAE,GACzD,EAAuB,EAAE;;AAGlC,SAAgB,EAAmB,EAAE,aAAU,cAAW,gBAA0B;CAClF,IAAM,EAAE,SAAM,GAAS,EACjB,IAAU,EAAY,GAAG,EAAU;AACzC,QACE,kBAAC,GAAD;EACE,OAAO,EAAc,GAAG,gCAAgC,gBAAgB;EACxE,MAAM,kBAAC,GAAD,EAAK,WAAU,UAAW,CAAA;EAChC,MAAK;EACM;YAEX,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAQ,KAAK,MACZ,kBAAC,GAAD;IAEE,SAAQ;IACR,WAAU;IACV,eAAe,EAAS,EAAO,KAAK;cAJtC,CAME,kBAAC,EAAO,MAAR,EAAa,WAAW,UAAU,EAAO,SAAW,CAAA,EACpD,kBAAC,QAAD;KAAM,WAAU;eAAmC,EAAO;KAAa,CAAA,CAChE;MAPF,EAAO,GAOL,CACT;GACE,CAAA;EACQ,CAAA"}
|