@burdenoff/microfe-timecampus 2026.608.1 → 2026.625.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/timecampus/components/ErrorBoundary.js +4 -4
- package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js +8 -8
- package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
- package/dist/timecampus/components/PageLayout.js +17 -13
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +22 -19
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +183 -163
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +17 -17
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +18 -18
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +28 -28
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +19 -19
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +15 -15
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +22 -22
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +20 -20
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +20 -20
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +18 -18
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +22 -22
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +14 -14
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +22 -22
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +27 -27
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +19 -19
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +16 -16
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +18 -18
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +16 -16
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +21 -21
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +22 -22
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +18 -18
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +16 -16
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +29 -29
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +20 -20
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +23 -23
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +23 -23
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +30 -30
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +19 -19
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +23 -23
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +20 -20
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +15 -15
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +25 -25
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +19 -19
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +21 -21
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +19 -19
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +21 -21
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +20 -20
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +16 -16
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +21 -21
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +16 -16
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +25 -25
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +24 -24
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +20 -20
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +27 -27
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +20 -20
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +18 -18
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +23 -23
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +19 -19
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +17 -17
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,229 +1,249 @@
|
|
|
1
1
|
import { cn as e, formatHours as t, formatTimerDuration as n } from "../utils/helpers.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { useI18n as
|
|
2
|
+
import { StatCard as r } from "../components/StatCard.js";
|
|
3
|
+
import { LoadingSkeleton as i } from "../components/LoadingSkeleton.js";
|
|
4
|
+
import { useTimeCampusStore as a } from "../store/timecampusStore.js";
|
|
5
|
+
import { useGetTimeEntryStatsQuery as o, useListTimeEntriesQuery as s } from "../../generated/wspace-operations.js";
|
|
6
|
+
import { ArrowRight as c, BarChart3 as l, CheckCircle as u, Clock as d, FolderOpen as f, Play as p, Timer as m, TrendingUp as h, Users as g } from "lucide-react";
|
|
7
|
+
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
8
|
+
import { AuroraBackground as y, CTAOverflowMenu as b, EmphasisPanel as x, GlassCard as S, GradientText as C } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
import { useI18n as w } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
10
|
//#region src/timecampus/pages/HomePage.tsx
|
|
11
|
-
var
|
|
12
|
-
let { t:
|
|
13
|
-
let n =
|
|
11
|
+
var T = () => {
|
|
12
|
+
let { t: T } = w(), E = (e, t) => {
|
|
13
|
+
let n = T(e);
|
|
14
14
|
return n === e ? t : n;
|
|
15
|
-
}, { activeTimer:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
}, { activeTimer: D, startTimer: O, stopTimer: k } = a(), { data: A, loading: j } = o(), { data: M, loading: N } = s({ variables: { limit: 4 } }), P = A?.timeEntryStats, F = M?.timeEntries?.items ?? [], I = /* @__PURE__ */ _(b, {
|
|
16
|
+
primary: {
|
|
17
|
+
label: D ? `${n(D.seconds)} - ${E("timecampus.home.actions.stop", "Stop")}` : E("timecampus.home.actions.startTimer", "Start Timer"),
|
|
18
|
+
onSelect: () => D ? k() : O(),
|
|
19
|
+
icon: _(D ? m : p, { className: "h-4 w-4" })
|
|
20
|
+
},
|
|
21
|
+
actions: [{
|
|
22
|
+
label: E("timecampus.home.quickActions.viewProjects.label", "View Projects"),
|
|
23
|
+
onSelect: () => {},
|
|
24
|
+
icon: /* @__PURE__ */ _(f, { className: "h-4 w-4" })
|
|
25
|
+
}, {
|
|
26
|
+
label: E("timecampus.home.quickActions.reports.label", "Reports"),
|
|
27
|
+
onSelect: () => {},
|
|
28
|
+
icon: /* @__PURE__ */ _(l, { className: "h-4 w-4" })
|
|
29
|
+
}]
|
|
30
|
+
}), L = () => /* @__PURE__ */ v("div", {
|
|
31
|
+
className: "relative overflow-hidden rounded-2xl border border-border-seam bg-gloss-card p-5 sm:p-6",
|
|
32
|
+
children: [/* @__PURE__ */ _(y, { intensity: "subtle" }), /* @__PURE__ */ v("div", {
|
|
33
|
+
className: "relative flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
34
|
+
children: [/* @__PURE__ */ v("div", {
|
|
35
|
+
className: "min-w-0",
|
|
36
|
+
children: [/* @__PURE__ */ _("h1", {
|
|
37
|
+
className: "text-2xl font-bold text-text-primary",
|
|
38
|
+
children: /* @__PURE__ */ _(C, { children: E("timecampus.home.title", "Dashboard") })
|
|
39
|
+
}), /* @__PURE__ */ _("p", {
|
|
40
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
41
|
+
children: E("timecampus.home.description", "Overview of your time tracking and productivity")
|
|
42
|
+
})]
|
|
43
|
+
}), I]
|
|
44
|
+
})]
|
|
45
|
+
});
|
|
46
|
+
return j && N ? /* @__PURE__ */ v("div", {
|
|
47
|
+
className: "min-h-full space-y-6 p-4 sm:p-6",
|
|
48
|
+
children: [L(), /* @__PURE__ */ _(i, {
|
|
20
49
|
variant: "card",
|
|
21
50
|
count: 4
|
|
22
|
-
})
|
|
23
|
-
}) : /* @__PURE__ */
|
|
24
|
-
|
|
25
|
-
description: C("timecampus.home.description", "Overview of your time tracking and productivity"),
|
|
26
|
-
actions: /* @__PURE__ */ y("button", {
|
|
27
|
-
onClick: () => w ? E() : T(),
|
|
28
|
-
className: e("inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors", w ? "bg-red-500 text-white hover:bg-red-600" : "bg-primary text-primary-foreground hover:bg-primary/90"),
|
|
29
|
-
children: w ? /* @__PURE__ */ b(v, { children: [
|
|
30
|
-
/* @__PURE__ */ y(h, { className: "h-4 w-4" }),
|
|
31
|
-
n(w.seconds),
|
|
32
|
-
" -",
|
|
33
|
-
" ",
|
|
34
|
-
C("timecampus.home.actions.stop", "Stop")
|
|
35
|
-
] }) : /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(m, { className: "h-4 w-4" }), C("timecampus.home.actions.startTimer", "Start Timer")] })
|
|
36
|
-
}),
|
|
51
|
+
})]
|
|
52
|
+
}) : /* @__PURE__ */ v("div", {
|
|
53
|
+
className: "min-h-full space-y-6 p-4 sm:p-6",
|
|
37
54
|
children: [
|
|
38
|
-
|
|
55
|
+
L(),
|
|
56
|
+
/* @__PURE__ */ v("div", {
|
|
39
57
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",
|
|
40
58
|
children: [
|
|
41
|
-
/* @__PURE__ */
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
/* @__PURE__ */ _(r, {
|
|
60
|
+
featured: !0,
|
|
61
|
+
title: E("timecampus.home.stats.today", "Today"),
|
|
62
|
+
value: t(P?.totalHours ?? 0),
|
|
63
|
+
icon: /* @__PURE__ */ _(d, { className: "h-5 w-5" }),
|
|
45
64
|
trend: {
|
|
46
65
|
value: 12.5,
|
|
47
|
-
label:
|
|
66
|
+
label: E("timecampus.home.stats.vsYesterday", "vs yesterday")
|
|
48
67
|
}
|
|
49
68
|
}),
|
|
50
|
-
/* @__PURE__ */
|
|
51
|
-
title:
|
|
52
|
-
value: t(
|
|
53
|
-
icon: /* @__PURE__ */
|
|
54
|
-
description: `${
|
|
69
|
+
/* @__PURE__ */ _(r, {
|
|
70
|
+
title: E("timecampus.home.stats.billable", "Billable"),
|
|
71
|
+
value: t(P?.billableHours ?? 0),
|
|
72
|
+
icon: /* @__PURE__ */ _(h, { className: "h-5 w-5" }),
|
|
73
|
+
description: `${P?.totalEntries ?? 0} ${E("timecampus.home.stats.entries", "entries")}`
|
|
55
74
|
}),
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
title:
|
|
58
|
-
value:
|
|
59
|
-
icon: /* @__PURE__ */
|
|
60
|
-
description:
|
|
75
|
+
/* @__PURE__ */ _(r, {
|
|
76
|
+
title: E("timecampus.home.stats.activeTimers", "Active Timers"),
|
|
77
|
+
value: P?.activeTimers ?? 0,
|
|
78
|
+
icon: /* @__PURE__ */ _(f, { className: "h-5 w-5" }),
|
|
79
|
+
description: E("timecampus.home.stats.currentlyRunning", "Currently running")
|
|
61
80
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
title:
|
|
64
|
-
value:
|
|
65
|
-
icon: /* @__PURE__ */
|
|
66
|
-
description:
|
|
67
|
-
iconBgColor: "bg-emerald-100 text-emerald-600 dark:bg-emerald-900/30 dark:text-emerald-400"
|
|
81
|
+
/* @__PURE__ */ _(r, {
|
|
82
|
+
title: E("timecampus.home.stats.totalEntries", "Entries"),
|
|
83
|
+
value: P?.totalEntries ?? 0,
|
|
84
|
+
icon: /* @__PURE__ */ _(l, { className: "h-5 w-5" }),
|
|
85
|
+
description: E("timecampus.home.stats.totalEntriesDescription", "Total time entries")
|
|
68
86
|
})
|
|
69
87
|
]
|
|
70
88
|
}),
|
|
71
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ v("div", {
|
|
72
90
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
74
|
-
|
|
75
|
-
|
|
91
|
+
children: [/* @__PURE__ */ v(S, {
|
|
92
|
+
treatment: "plain",
|
|
93
|
+
className: "border-border-seam p-6 lg:col-span-2",
|
|
94
|
+
children: [/* @__PURE__ */ v("div", {
|
|
76
95
|
className: "mb-4 flex items-center justify-between",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
78
|
-
className: "text-sm font-semibold text-
|
|
79
|
-
children:
|
|
80
|
-
}), /* @__PURE__ */
|
|
81
|
-
className: "text-xs text-
|
|
82
|
-
children:
|
|
83
|
-
})] }), /* @__PURE__ */
|
|
84
|
-
className: "flex items-center gap-1 text-xs text-primary hover:underline",
|
|
96
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h3", {
|
|
97
|
+
className: "text-sm font-semibold text-text-primary",
|
|
98
|
+
children: E("timecampus.home.recentEntries.title", "Recent Time Entries")
|
|
99
|
+
}), /* @__PURE__ */ _("p", {
|
|
100
|
+
className: "text-xs text-text-secondary",
|
|
101
|
+
children: E("timecampus.home.recentEntries.description", "Your latest tracked activities")
|
|
102
|
+
})] }), /* @__PURE__ */ v("button", {
|
|
103
|
+
className: "inline-flex min-h-[2.75rem] items-center gap-1 rounded-md px-2 text-xs font-medium text-primary transition-colors hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border",
|
|
85
104
|
children: [
|
|
86
|
-
|
|
105
|
+
E("timecampus.home.recentEntries.viewAll", "View all"),
|
|
87
106
|
" ",
|
|
88
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ _(c, { className: "h-3 w-3" })
|
|
89
108
|
]
|
|
90
109
|
})]
|
|
91
|
-
}),
|
|
110
|
+
}), N ? /* @__PURE__ */ _(i, {
|
|
92
111
|
variant: "list",
|
|
93
112
|
count: 4
|
|
94
|
-
}) : /* @__PURE__ */
|
|
113
|
+
}) : /* @__PURE__ */ v("div", {
|
|
95
114
|
className: "flex flex-col gap-3",
|
|
96
|
-
children: [
|
|
97
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3 transition-colors hover:bg-
|
|
98
|
-
children: [/* @__PURE__ */
|
|
115
|
+
children: [F.map((n) => /* @__PURE__ */ v("div", {
|
|
116
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-3 transition-colors hover:bg-bg-sunken/50",
|
|
117
|
+
children: [/* @__PURE__ */ v("div", {
|
|
99
118
|
className: "min-w-0 flex-1",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
101
|
-
className: "text-sm font-medium text-
|
|
102
|
-
children:
|
|
103
|
-
}), /* @__PURE__ */
|
|
104
|
-
className: "text-xs text-
|
|
105
|
-
children:
|
|
119
|
+
children: [/* @__PURE__ */ _("p", {
|
|
120
|
+
className: "text-sm font-medium text-text-primary",
|
|
121
|
+
children: n.project?.name ?? E("timecampus.home.recentEntries.noProject", "No Project")
|
|
122
|
+
}), /* @__PURE__ */ _("p", {
|
|
123
|
+
className: "text-xs text-text-secondary",
|
|
124
|
+
children: n.description ?? E("timecampus.home.recentEntries.noDescription", "No description")
|
|
106
125
|
})]
|
|
107
|
-
}), /* @__PURE__ */
|
|
126
|
+
}), /* @__PURE__ */ v("div", {
|
|
108
127
|
className: "ml-4 text-right",
|
|
109
|
-
children: [/* @__PURE__ */
|
|
110
|
-
className: "text-sm font-
|
|
111
|
-
children: t((
|
|
112
|
-
}), /* @__PURE__ */
|
|
113
|
-
className: "inline-flex items-center rounded-full
|
|
114
|
-
children:
|
|
128
|
+
children: [/* @__PURE__ */ _("p", {
|
|
129
|
+
className: "font-mono text-sm font-medium tabular-nums text-text-primary",
|
|
130
|
+
children: t((n.duration ?? 0) / 3600)
|
|
131
|
+
}), /* @__PURE__ */ v("span", {
|
|
132
|
+
className: e("inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium", n.isRunning ? "bg-status-info-bg text-status-info-text" : "bg-status-success-bg text-status-success-text"),
|
|
133
|
+
children: [n.isRunning && /* @__PURE__ */ _("span", { className: "h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse" }), n.isRunning ? E("timecampus.home.recentEntries.status.running", "running") : E("timecampus.home.recentEntries.status.completed", "completed")]
|
|
115
134
|
})]
|
|
116
135
|
})]
|
|
117
|
-
},
|
|
118
|
-
className: "text-center text-sm text-
|
|
119
|
-
children:
|
|
136
|
+
}, n.id)), F.length === 0 && /* @__PURE__ */ _("p", {
|
|
137
|
+
className: "py-4 text-center text-sm text-text-secondary",
|
|
138
|
+
children: E("timecampus.home.recentEntries.empty", "No time entries yet")
|
|
120
139
|
})]
|
|
121
140
|
})]
|
|
122
|
-
}), /* @__PURE__ */
|
|
123
|
-
className: "
|
|
124
|
-
children: [/* @__PURE__ */
|
|
141
|
+
}), /* @__PURE__ */ v(x, {
|
|
142
|
+
className: "p-6",
|
|
143
|
+
children: [/* @__PURE__ */ v("div", {
|
|
125
144
|
className: "mb-4",
|
|
126
|
-
children: [/* @__PURE__ */
|
|
127
|
-
className: "text-sm font-semibold text-
|
|
128
|
-
children:
|
|
129
|
-
}), /* @__PURE__ */
|
|
130
|
-
className: "text-xs text-
|
|
131
|
-
children:
|
|
145
|
+
children: [/* @__PURE__ */ _("h3", {
|
|
146
|
+
className: "text-sm font-semibold text-text-primary",
|
|
147
|
+
children: E("timecampus.home.summary.title", "Quick Summary")
|
|
148
|
+
}), /* @__PURE__ */ _("p", {
|
|
149
|
+
className: "text-xs text-text-secondary",
|
|
150
|
+
children: E("timecampus.home.summary.description", "Time tracking overview")
|
|
132
151
|
})]
|
|
133
|
-
}), /* @__PURE__ */
|
|
152
|
+
}), /* @__PURE__ */ v("div", {
|
|
134
153
|
className: "flex flex-col gap-4",
|
|
135
154
|
children: [
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3",
|
|
138
|
-
children: [/* @__PURE__ */
|
|
139
|
-
className: "text-xs font-medium text-
|
|
140
|
-
children:
|
|
141
|
-
}), /* @__PURE__ */
|
|
142
|
-
className: "mt-1 text-xl font-bold text-
|
|
143
|
-
children: t(
|
|
144
|
-
})] }), /* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ v("div", {
|
|
156
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
|
|
157
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
158
|
+
className: "text-xs font-medium text-text-secondary",
|
|
159
|
+
children: E("timecampus.home.summary.totalHours", "Total Hours")
|
|
160
|
+
}), /* @__PURE__ */ _("p", {
|
|
161
|
+
className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
|
|
162
|
+
children: t(P?.totalHours ?? 0)
|
|
163
|
+
})] }), /* @__PURE__ */ _(d, { className: "h-5 w-5 text-text-secondary" })]
|
|
145
164
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3",
|
|
148
|
-
children: [/* @__PURE__ */
|
|
149
|
-
className: "text-xs font-medium text-
|
|
150
|
-
children:
|
|
151
|
-
}), /* @__PURE__ */
|
|
152
|
-
className: "mt-1 text-xl font-bold text-
|
|
153
|
-
children: t(
|
|
154
|
-
})] }), /* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ v("div", {
|
|
166
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
|
|
167
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
168
|
+
className: "text-xs font-medium text-text-secondary",
|
|
169
|
+
children: E("timecampus.home.summary.billableHours", "Billable Hours")
|
|
170
|
+
}), /* @__PURE__ */ _("p", {
|
|
171
|
+
className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
|
|
172
|
+
children: t(P?.billableHours ?? 0)
|
|
173
|
+
})] }), /* @__PURE__ */ _(h, { className: "h-5 w-5 text-text-secondary" })]
|
|
155
174
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
157
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
159
|
-
className: "text-xs font-medium text-
|
|
160
|
-
children:
|
|
161
|
-
}), /* @__PURE__ */
|
|
162
|
-
className: "mt-1 text-xl font-bold text-
|
|
163
|
-
children:
|
|
164
|
-
})] }), /* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ v("div", {
|
|
176
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
|
|
177
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
178
|
+
className: "text-xs font-medium text-text-secondary",
|
|
179
|
+
children: E("timecampus.home.summary.activeTimers", "Active Timers")
|
|
180
|
+
}), /* @__PURE__ */ _("p", {
|
|
181
|
+
className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
|
|
182
|
+
children: P?.activeTimers ?? 0
|
|
183
|
+
})] }), /* @__PURE__ */ _(g, { className: "h-5 w-5 text-text-secondary" })]
|
|
165
184
|
})
|
|
166
185
|
]
|
|
167
186
|
})]
|
|
168
187
|
})]
|
|
169
188
|
}),
|
|
170
|
-
/* @__PURE__ */
|
|
171
|
-
|
|
172
|
-
|
|
189
|
+
/* @__PURE__ */ v(S, {
|
|
190
|
+
treatment: "plain",
|
|
191
|
+
className: "border-border-seam p-6",
|
|
192
|
+
children: [/* @__PURE__ */ v("div", {
|
|
173
193
|
className: "mb-4",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
175
|
-
className: "text-sm font-semibold text-
|
|
176
|
-
children:
|
|
177
|
-
}), /* @__PURE__ */
|
|
178
|
-
className: "text-xs text-
|
|
179
|
-
children:
|
|
194
|
+
children: [/* @__PURE__ */ _("h3", {
|
|
195
|
+
className: "text-sm font-semibold text-text-primary",
|
|
196
|
+
children: E("timecampus.home.quickActions.title", "Quick Actions")
|
|
197
|
+
}), /* @__PURE__ */ _("p", {
|
|
198
|
+
className: "text-xs text-text-secondary",
|
|
199
|
+
children: E("timecampus.home.quickActions.description", "Frequently used features")
|
|
180
200
|
})]
|
|
181
|
-
}), /* @__PURE__ */
|
|
201
|
+
}), /* @__PURE__ */ _("div", {
|
|
182
202
|
className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6",
|
|
183
203
|
children: [
|
|
184
204
|
{
|
|
185
|
-
label:
|
|
186
|
-
icon: m,
|
|
187
|
-
description: C("timecampus.home.quickActions.startTimer.description", "Track your time")
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
label: C("timecampus.home.quickActions.viewProjects.label", "View Projects"),
|
|
205
|
+
label: E("timecampus.home.quickActions.startTimer.label", "Start Timer"),
|
|
191
206
|
icon: p,
|
|
192
|
-
description:
|
|
207
|
+
description: E("timecampus.home.quickActions.startTimer.description", "Track your time")
|
|
193
208
|
},
|
|
194
209
|
{
|
|
195
|
-
label:
|
|
210
|
+
label: E("timecampus.home.quickActions.viewProjects.label", "View Projects"),
|
|
196
211
|
icon: f,
|
|
197
|
-
description:
|
|
212
|
+
description: E("timecampus.home.quickActions.viewProjects.description", "Manage projects")
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
label: E("timecampus.home.quickActions.timeEntries.label", "Time Entries"),
|
|
216
|
+
icon: d,
|
|
217
|
+
description: E("timecampus.home.quickActions.timeEntries.description", "View all entries")
|
|
198
218
|
},
|
|
199
219
|
{
|
|
200
|
-
label:
|
|
201
|
-
icon:
|
|
202
|
-
description:
|
|
220
|
+
label: E("timecampus.home.quickActions.teamActivity.label", "Team Activity"),
|
|
221
|
+
icon: g,
|
|
222
|
+
description: E("timecampus.home.quickActions.teamActivity.description", "See team status")
|
|
203
223
|
},
|
|
204
224
|
{
|
|
205
|
-
label:
|
|
206
|
-
icon:
|
|
207
|
-
description:
|
|
225
|
+
label: E("timecampus.home.quickActions.reports.label", "Reports"),
|
|
226
|
+
icon: l,
|
|
227
|
+
description: E("timecampus.home.quickActions.reports.description", "Generate reports")
|
|
208
228
|
},
|
|
209
229
|
{
|
|
210
|
-
label:
|
|
211
|
-
icon:
|
|
212
|
-
description:
|
|
230
|
+
label: E("timecampus.home.quickActions.approvals.label", "Approvals"),
|
|
231
|
+
icon: u,
|
|
232
|
+
description: E("timecampus.home.quickActions.approvals.description", "Review timesheets")
|
|
213
233
|
}
|
|
214
|
-
].map(({ label: e, icon: t, description: n }) => /* @__PURE__ */
|
|
215
|
-
className: "flex flex-col items-center gap-2 rounded-lg border border-border bg-
|
|
234
|
+
].map(({ label: e, icon: t, description: n }) => /* @__PURE__ */ v("button", {
|
|
235
|
+
className: "flex min-h-[2.75rem] flex-col items-center gap-2 rounded-lg border border-border-seam bg-bg-surface p-4 text-center transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border",
|
|
216
236
|
children: [
|
|
217
|
-
/* @__PURE__ */
|
|
218
|
-
className: "rounded-full bg-primary/10 p-3",
|
|
219
|
-
children: /* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ _("div", {
|
|
238
|
+
className: "rounded-full bg-action-primary-bg/10 p-3",
|
|
239
|
+
children: /* @__PURE__ */ _(t, { className: "h-5 w-5 text-primary" })
|
|
220
240
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
className: "text-sm font-medium text-
|
|
241
|
+
/* @__PURE__ */ _("span", {
|
|
242
|
+
className: "text-sm font-medium text-text-primary",
|
|
223
243
|
children: e
|
|
224
244
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
226
|
-
className: "text-xs text-
|
|
245
|
+
/* @__PURE__ */ _("span", {
|
|
246
|
+
className: "text-xs text-text-secondary",
|
|
227
247
|
children: n
|
|
228
248
|
})
|
|
229
249
|
]
|
|
@@ -234,6 +254,6 @@ var S = () => {
|
|
|
234
254
|
});
|
|
235
255
|
};
|
|
236
256
|
//#endregion
|
|
237
|
-
export {
|
|
257
|
+
export { T as HomePage };
|
|
238
258
|
|
|
239
259
|
//# sourceMappingURL=HomePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/timecampus/pages/HomePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport {\n Clock,\n FolderOpen,\n Users,\n TrendingUp,\n Timer,\n CheckCircle,\n BarChart3,\n Play,\n ArrowRight,\n} from \"lucide-react\";\nimport { PageLayout } from \"../components/PageLayout\";\nimport { StatCard } from \"../components/StatCard\";\nimport { LoadingSkeleton } from \"../components/LoadingSkeleton\";\nimport { cn, formatHours, formatTimerDuration } from \"../utils/helpers\";\nimport { useTimeCampusStore } from \"../store/timecampusStore\";\nimport {\n useGetTimeEntryStatsQuery,\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\nexport const HomePage: FC = () => {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { activeTimer, startTimer, stopTimer } = useTimeCampusStore();\n\n const { data: statsData, loading: statsLoading } =\n useGetTimeEntryStatsQuery();\n const { data: entriesData, loading: entriesLoading } =\n useListTimeEntriesQuery({\n variables: { limit: 4 },\n });\n\n const stats = statsData?.timeEntryStats;\n const recentEntries = entriesData?.timeEntries?.items ?? [];\n\n if (statsLoading && entriesLoading) {\n return (\n <PageLayout\n title={t(\"timecampus.home.title\", \"Dashboard\")}\n description={t(\n \"timecampus.home.description\",\n \"Overview of your time tracking and productivity\",\n )}\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t(\"timecampus.home.title\", \"Dashboard\")}\n description={t(\n \"timecampus.home.description\",\n \"Overview of your time tracking and productivity\",\n )}\n actions={\n <button\n onClick={() => (activeTimer ? stopTimer() : startTimer())}\n className={cn(\n \"inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors\",\n activeTimer\n ? \"bg-red-500 text-white hover:bg-red-600\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n )}\n >\n {activeTimer ? (\n <>\n <Timer className=\"h-4 w-4\" />\n {formatTimerDuration(activeTimer.seconds)} -{\" \"}\n {t(\"timecampus.home.actions.stop\", \"Stop\")}\n </>\n ) : (\n <>\n <Play className=\"h-4 w-4\" />\n {t(\"timecampus.home.actions.startTimer\", \"Start Timer\")}\n </>\n )}\n </button>\n }\n >\n {/* Stat Cards */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n <StatCard\n title={t(\"timecampus.home.stats.today\", \"Today\")}\n value={formatHours(stats?.totalHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{\n value: 12.5,\n label: t(\"timecampus.home.stats.vsYesterday\", \"vs yesterday\"),\n }}\n />\n <StatCard\n title={t(\"timecampus.home.stats.billable\", \"Billable\")}\n value={formatHours(stats?.billableHours ?? 0)}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n description={`${stats?.totalEntries ?? 0} ${t(\"timecampus.home.stats.entries\", \"entries\")}`}\n />\n <StatCard\n title={t(\"timecampus.home.stats.activeTimers\", \"Active Timers\")}\n value={stats?.activeTimers ?? 0}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.currentlyRunning\",\n \"Currently running\",\n )}\n />\n <StatCard\n title={t(\"timecampus.home.stats.totalEntries\", \"Entries\")}\n value={stats?.totalEntries ?? 0}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.totalEntriesDescription\",\n \"Total time entries\",\n )}\n iconBgColor=\"bg-emerald-100 text-emerald-600 dark:bg-emerald-900/30 dark:text-emerald-400\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Time Entries */}\n <div className=\"lg:col-span-2 rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n {t(\n \"timecampus.home.recentEntries.title\",\n \"Recent Time Entries\",\n )}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"timecampus.home.recentEntries.description\",\n \"Your latest tracked activities\",\n )}\n </p>\n </div>\n <button className=\"flex items-center gap-1 text-xs text-primary hover:underline\">\n {t(\"timecampus.home.recentEntries.viewAll\", \"View all\")}{\" \"}\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n {entriesLoading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {recentEntries.map((entry: TimeEntryFieldsFragment) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between rounded-lg border border-border p-3 transition-colors hover:bg-muted/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {entry.project?.name ??\n t(\n \"timecampus.home.recentEntries.noProject\",\n \"No Project\",\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {entry.description ??\n t(\n \"timecampus.home.recentEntries.noDescription\",\n \"No description\",\n )}\n </p>\n </div>\n <div className=\"ml-4 text-right\">\n <p className=\"text-sm font-mono font-medium text-foreground\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </p>\n <span className=\"inline-flex items-center rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400\">\n {entry.isRunning\n ? t(\n \"timecampus.home.recentEntries.status.running\",\n \"running\",\n )\n : t(\n \"timecampus.home.recentEntries.status.completed\",\n \"completed\",\n )}\n </span>\n </div>\n </div>\n ))}\n {recentEntries.length === 0 && (\n <p className=\"text-center text-sm text-muted-foreground py-4\">\n {t(\n \"timecampus.home.recentEntries.empty\",\n \"No time entries yet\",\n )}\n </p>\n )}\n </div>\n )}\n </div>\n\n {/* Quick Summary */}\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {t(\"timecampus.home.summary.title\", \"Quick Summary\")}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"timecampus.home.summary.description\",\n \"Time tracking overview\",\n )}\n </p>\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border p-3\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {t(\"timecampus.home.summary.totalHours\", \"Total Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold text-foreground\">\n {formatHours(stats?.totalHours ?? 0)}\n </p>\n </div>\n <Clock className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border p-3\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {t(\"timecampus.home.summary.billableHours\", \"Billable Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold text-foreground\">\n {formatHours(stats?.billableHours ?? 0)}\n </p>\n </div>\n <TrendingUp className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border p-3\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {t(\"timecampus.home.summary.activeTimers\", \"Active Timers\")}\n </p>\n <p className=\"mt-1 text-xl font-bold text-foreground\">\n {stats?.activeTimers ?? 0}\n </p>\n </div>\n <Users className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {t(\"timecampus.home.quickActions.title\", \"Quick Actions\")}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"timecampus.home.quickActions.description\",\n \"Frequently used features\",\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n {[\n {\n label: t(\n \"timecampus.home.quickActions.startTimer.label\",\n \"Start Timer\",\n ),\n icon: Play,\n description: t(\n \"timecampus.home.quickActions.startTimer.description\",\n \"Track your time\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n icon: FolderOpen,\n description: t(\n \"timecampus.home.quickActions.viewProjects.description\",\n \"Manage projects\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.timeEntries.label\",\n \"Time Entries\",\n ),\n icon: Clock,\n description: t(\n \"timecampus.home.quickActions.timeEntries.description\",\n \"View all entries\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.teamActivity.label\",\n \"Team Activity\",\n ),\n icon: Users,\n description: t(\n \"timecampus.home.quickActions.teamActivity.description\",\n \"See team status\",\n ),\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n icon: BarChart3,\n description: t(\n \"timecampus.home.quickActions.reports.description\",\n \"Generate reports\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.approvals.label\",\n \"Approvals\",\n ),\n icon: CheckCircle,\n description: t(\n \"timecampus.home.quickActions.approvals.description\",\n \"Review timesheets\",\n ),\n },\n ].map(({ label, icon: Icon, description }) => (\n <button\n key={label}\n className=\"flex flex-col items-center gap-2 rounded-lg border border-border bg-background p-4 text-center transition-colors hover:bg-muted/50\"\n >\n <div className=\"rounded-full bg-primary/10 p-3\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"text-sm font-medium text-foreground\">\n {label}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {description}\n </span>\n </button>\n ))}\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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E,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAE,sCAAsC,gBAAgB;MACtD,CAAA,EACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,4CACA,2BACD;MACC,CAAA,CACA;QACN,kBAAC,OAAD;KAAK,WAAU;eACZ;MACC;OACE,OAAO,EACL,iDACA,cACD;OACD,MAAM;OACN,aAAa,EACX,uDACA,kBACD;OACF;MACD;OACE,OAAO,EACL,mDACA,gBACD;OACD,MAAM;OACN,aAAa,EACX,yDACA,kBACD;OACF;MACD;OACE,OAAO,EACL,kDACA,eACD;OACD,MAAM;OACN,aAAa,EACX,wDACA,mBACD;OACF;MACD;OACE,OAAO,EACL,mDACA,gBACD;OACD,MAAM;OACN,aAAa,EACX,yDACA,kBACD;OACF;MACD;OACE,OAAO,EAAE,8CAA8C,UAAU;OACjE,MAAM;OACN,aAAa,EACX,oDACA,mBACD;OACF;MACD;OACE,OAAO,EACL,gDACA,YACD;OACD,MAAM;OACN,aAAa,EACX,sDACA,oBACD;OACF;MACF,CAAC,KAAK,EAAE,UAAO,MAAM,GAAM,qBAC1B,kBAAC,UAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAM,WAAU,wBAAyB,CAAA;QACrC,CAAA;OACN,kBAAC,QAAD;QAAM,WAAU;kBACb;QACI,CAAA;OACP,kBAAC,QAAD;QAAM,WAAU;kBACb;QACI,CAAA;OACA;QAZF,EAYE,CACT;KACE,CAAA,CACF;;GACK"}
|
|
1
|
+
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/timecampus/pages/HomePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport {\n Clock,\n FolderOpen,\n Users,\n TrendingUp,\n Timer,\n CheckCircle,\n BarChart3,\n Play,\n ArrowRight,\n} from \"lucide-react\";\nimport {\n GlassCard,\n EmphasisPanel,\n AuroraBackground,\n GradientText,\n CTAOverflowMenu,\n} from \"@burdenoff/fe-libs/ui\";\nimport { StatCard } from \"../components/StatCard\";\nimport { LoadingSkeleton } from \"../components/LoadingSkeleton\";\nimport { cn, formatHours, formatTimerDuration } from \"../utils/helpers\";\nimport { useTimeCampusStore } from \"../store/timecampusStore\";\nimport {\n useGetTimeEntryStatsQuery,\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\nexport const HomePage: FC = () => {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { activeTimer, startTimer, stopTimer } = useTimeCampusStore();\n\n const { data: statsData, loading: statsLoading } =\n useGetTimeEntryStatsQuery();\n const { data: entriesData, loading: entriesLoading } =\n useListTimeEntriesQuery({\n variables: { limit: 4 },\n });\n\n const stats = statsData?.timeEntryStats;\n const recentEntries = entriesData?.timeEntries?.items ?? [];\n\n const timerLabel = activeTimer\n ? `${formatTimerDuration(activeTimer.seconds)} - ${t(\"timecampus.home.actions.stop\", \"Stop\")}`\n : t(\"timecampus.home.actions.startTimer\", \"Start Timer\");\n\n const headerActions = (\n <CTAOverflowMenu\n primary={{\n label: timerLabel,\n onSelect: () => (activeTimer ? stopTimer() : startTimer()),\n icon: activeTimer ? (\n <Timer className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n ),\n }}\n actions={[\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n onSelect: () => {},\n icon: <FolderOpen className=\"h-4 w-4\" />,\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n onSelect: () => {},\n icon: <BarChart3 className=\"h-4 w-4\" />,\n },\n ]}\n />\n );\n\n const renderHeader = () => (\n <div className=\"relative overflow-hidden rounded-2xl border border-border-seam bg-gloss-card p-5 sm:p-6\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>\n {t(\"timecampus.home.title\", \"Dashboard\")}\n </GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n \"timecampus.home.description\",\n \"Overview of your time tracking and productivity\",\n )}\n </p>\n </div>\n {headerActions}\n </div>\n </div>\n );\n\n if (statsLoading && entriesLoading) {\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n <LoadingSkeleton variant=\"card\" count={4} />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n\n {/* Hero metric + supporting metrics */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n <StatCard\n featured\n title={t(\"timecampus.home.stats.today\", \"Today\")}\n value={formatHours(stats?.totalHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{\n value: 12.5,\n label: t(\"timecampus.home.stats.vsYesterday\", \"vs yesterday\"),\n }}\n />\n <StatCard\n title={t(\"timecampus.home.stats.billable\", \"Billable\")}\n value={formatHours(stats?.billableHours ?? 0)}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n description={`${stats?.totalEntries ?? 0} ${t(\"timecampus.home.stats.entries\", \"entries\")}`}\n />\n <StatCard\n title={t(\"timecampus.home.stats.activeTimers\", \"Active Timers\")}\n value={stats?.activeTimers ?? 0}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.currentlyRunning\",\n \"Currently running\",\n )}\n />\n <StatCard\n title={t(\"timecampus.home.stats.totalEntries\", \"Entries\")}\n value={stats?.totalEntries ?? 0}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.totalEntriesDescription\",\n \"Total time entries\",\n )}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Time Entries */}\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam p-6 lg:col-span-2\"\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\n \"timecampus.home.recentEntries.title\",\n \"Recent Time Entries\",\n )}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.description\",\n \"Your latest tracked activities\",\n )}\n </p>\n </div>\n <button className=\"inline-flex min-h-[2.75rem] items-center gap-1 rounded-md px-2 text-xs font-medium text-primary transition-colors hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\">\n {t(\"timecampus.home.recentEntries.viewAll\", \"View all\")}{\" \"}\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n {entriesLoading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {recentEntries.map((entry: TimeEntryFieldsFragment) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-3 transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">\n {entry.project?.name ??\n t(\n \"timecampus.home.recentEntries.noProject\",\n \"No Project\",\n )}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {entry.description ??\n t(\n \"timecampus.home.recentEntries.noDescription\",\n \"No description\",\n )}\n </p>\n </div>\n <div className=\"ml-4 text-right\">\n <p className=\"font-mono text-sm font-medium tabular-nums text-text-primary\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </p>\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium\",\n entry.isRunning\n ? \"bg-status-info-bg text-status-info-text\"\n : \"bg-status-success-bg text-status-success-text\",\n )}\n >\n {entry.isRunning && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse\" />\n )}\n {entry.isRunning\n ? t(\n \"timecampus.home.recentEntries.status.running\",\n \"running\",\n )\n : t(\n \"timecampus.home.recentEntries.status.completed\",\n \"completed\",\n )}\n </span>\n </div>\n </div>\n ))}\n {recentEntries.length === 0 && (\n <p className=\"py-4 text-center text-sm text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.empty\",\n \"No time entries yet\",\n )}\n </p>\n )}\n </div>\n )}\n </GlassCard>\n\n {/* Quick Summary — the one emphasis zone */}\n <EmphasisPanel className=\"p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.summary.title\", \"Quick Summary\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.summary.description\",\n \"Time tracking overview\",\n )}\n </p>\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.totalHours\", \"Total Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.totalHours ?? 0)}\n </p>\n </div>\n <Clock className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.billableHours\", \"Billable Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.billableHours ?? 0)}\n </p>\n </div>\n <TrendingUp className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.activeTimers\", \"Active Timers\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {stats?.activeTimers ?? 0}\n </p>\n </div>\n <Users className=\"h-5 w-5 text-text-secondary\" />\n </div>\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.quickActions.title\", \"Quick Actions\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.quickActions.description\",\n \"Frequently used features\",\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n {[\n {\n label: t(\n \"timecampus.home.quickActions.startTimer.label\",\n \"Start Timer\",\n ),\n icon: Play,\n description: t(\n \"timecampus.home.quickActions.startTimer.description\",\n \"Track your time\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n icon: FolderOpen,\n description: t(\n \"timecampus.home.quickActions.viewProjects.description\",\n \"Manage projects\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.timeEntries.label\",\n \"Time Entries\",\n ),\n icon: Clock,\n description: t(\n \"timecampus.home.quickActions.timeEntries.description\",\n \"View all entries\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.teamActivity.label\",\n \"Team Activity\",\n ),\n icon: Users,\n description: t(\n \"timecampus.home.quickActions.teamActivity.description\",\n \"See team status\",\n ),\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n icon: BarChart3,\n description: t(\n \"timecampus.home.quickActions.reports.description\",\n \"Generate reports\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.approvals.label\",\n \"Approvals\",\n ),\n icon: CheckCircle,\n description: t(\n \"timecampus.home.quickActions.approvals.description\",\n \"Review timesheets\",\n ),\n },\n ].map(({ label, icon: Icon, description }) => (\n <button\n key={label}\n className=\"flex min-h-[2.75rem] flex-col items-center gap-2 rounded-lg border border-border-seam bg-bg-surface p-4 text-center transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\"\n >\n <div className=\"rounded-full bg-action-primary-bg/10 p-3\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {label}\n </span>\n <span className=\"text-xs text-text-secondary\">{description}</span>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
|