@burdenoff/microfe-timecampus 2026.529.2 → 2026.624.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 +2 -2
- 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 +2 -2
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +6 -6
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +31 -31
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +7 -7
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +8 -8
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +10 -10
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +10 -10
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +6 -6
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +8 -8
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +11 -11
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +10 -10
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +5 -5
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +13 -13
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +8 -8
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -8
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +7 -7
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +10 -10
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +7 -7
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +9 -9
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +7 -7
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +12 -12
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +8 -8
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +4 -4
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +12 -12
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +15 -15
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +11 -11
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +8 -8
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +8 -8
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +20 -20
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +14 -14
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +8 -8
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +11 -11
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +7 -7
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +8 -8
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +10 -10
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +10 -10
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +4 -4
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +6 -6
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +11 -11
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +6 -6
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +10 -10
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +6 -6
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +16 -16
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +9 -9
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +12 -12
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +8 -8
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +10 -10
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +7 -7
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +9 -9
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +10 -10
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +8 -8
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,7 +19,7 @@ function f() {
|
|
|
19
19
|
title: "Template Details",
|
|
20
20
|
description: `Template ID: ${f}`,
|
|
21
21
|
actions: /* @__PURE__ */ d("button", {
|
|
22
|
-
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-
|
|
22
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
23
23
|
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4" }), "Back to Templates"]
|
|
24
24
|
}),
|
|
25
25
|
children: /* @__PURE__ */ u("div", {
|
|
@@ -30,32 +30,32 @@ function f() {
|
|
|
30
30
|
title: "Template Details",
|
|
31
31
|
description: `Template ID: ${f}`,
|
|
32
32
|
actions: /* @__PURE__ */ d("button", {
|
|
33
|
-
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-
|
|
33
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
34
34
|
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4" }), "Back to Templates"]
|
|
35
35
|
}),
|
|
36
36
|
children: /* @__PURE__ */ u("div", {
|
|
37
37
|
className: "mx-auto max-w-2xl",
|
|
38
38
|
children: /* @__PURE__ */ d("div", {
|
|
39
|
-
className: "rounded-xl border border-border bg-
|
|
39
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
40
40
|
children: [
|
|
41
41
|
/* @__PURE__ */ d("div", {
|
|
42
42
|
className: "flex items-start gap-4",
|
|
43
43
|
children: [/* @__PURE__ */ u("div", {
|
|
44
|
-
className: "flex h-16 w-16 items-center justify-center rounded-xl bg-primary/10",
|
|
44
|
+
className: "flex h-16 w-16 items-center justify-center rounded-xl bg-action-primary-bg/10",
|
|
45
45
|
children: /* @__PURE__ */ u(o, { className: "h-8 w-8 text-primary" })
|
|
46
46
|
}), /* @__PURE__ */ d("div", {
|
|
47
47
|
className: "flex-1",
|
|
48
48
|
children: [
|
|
49
49
|
/* @__PURE__ */ u("h2", {
|
|
50
|
-
className: "text-lg font-semibold text-
|
|
50
|
+
className: "text-lg font-semibold text-text-primary",
|
|
51
51
|
children: y
|
|
52
52
|
}),
|
|
53
53
|
/* @__PURE__ */ u("p", {
|
|
54
|
-
className: "text-sm text-
|
|
54
|
+
className: "text-sm text-text-secondary",
|
|
55
55
|
children: b
|
|
56
56
|
}),
|
|
57
57
|
/* @__PURE__ */ d("div", {
|
|
58
|
-
className: "mt-2 flex items-center gap-3 text-sm text-
|
|
58
|
+
className: "mt-2 flex items-center gap-3 text-sm text-text-secondary",
|
|
59
59
|
children: [/* @__PURE__ */ d("div", {
|
|
60
60
|
className: "flex items-center gap-1",
|
|
61
61
|
children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 fill-amber-400 text-amber-400" }), /* @__PURE__ */ u("span", { children: x })]
|
|
@@ -70,12 +70,12 @@ function f() {
|
|
|
70
70
|
C.length > 0 && /* @__PURE__ */ d("div", {
|
|
71
71
|
className: "mt-6",
|
|
72
72
|
children: [/* @__PURE__ */ u("h3", {
|
|
73
|
-
className: "text-sm font-semibold text-
|
|
73
|
+
className: "text-sm font-semibold text-text-primary",
|
|
74
74
|
children: "Features"
|
|
75
75
|
}), /* @__PURE__ */ u("ul", {
|
|
76
76
|
className: "mt-2 space-y-2",
|
|
77
77
|
children: C.map((e) => /* @__PURE__ */ d("li", {
|
|
78
|
-
className: "flex items-center gap-2 text-sm text-
|
|
78
|
+
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
79
79
|
children: [/* @__PURE__ */ u(a, { className: "h-4 w-4 text-emerald-500" }), e]
|
|
80
80
|
}, e))
|
|
81
81
|
})]
|
|
@@ -83,7 +83,7 @@ function f() {
|
|
|
83
83
|
/* @__PURE__ */ u("div", {
|
|
84
84
|
className: "mt-6 flex justify-end",
|
|
85
85
|
children: /* @__PURE__ */ u("button", {
|
|
86
|
-
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
86
|
+
className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
87
87
|
children: "Apply Template"
|
|
88
88
|
})
|
|
89
89
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, ArrowLeft, Star, Users, CheckCircle } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetConfigurationQuery } from \"@/generated/wspace-operations\";\n\nexport function TemplateDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: id ?? \"\" },\n skip: !id,\n });\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n const name =\n (val.name as string) ?? config?.key?.replace(\"template.\", \"\") ?? \"Template\";\n const description =\n config?.description ??\n (val.description as string) ??\n \"A pre-built workspace template for time tracking workflows.\";\n const rating = (val.rating as number) ?? 0;\n const teamSize = (val.teamSize as string) ?? \"-\";\n const features = (val.features as string[]) ?? [];\n\n if (loading) {\n return (\n <PageLayout title=\"Template Details\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !config) {\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-
|
|
1
|
+
{"version":3,"file":"TemplateDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, ArrowLeft, Star, Users, CheckCircle } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetConfigurationQuery } from \"@/generated/wspace-operations\";\n\nexport function TemplateDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: id ?? \"\" },\n skip: !id,\n });\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n const name =\n (val.name as string) ?? config?.key?.replace(\"template.\", \"\") ?? \"Template\";\n const description =\n config?.description ??\n (val.description as string) ??\n \"A pre-built workspace template for time tracking workflows.\";\n const rating = (val.rating as number) ?? 0;\n const teamSize = (val.teamSize as string) ?? \"-\";\n const features = (val.features as string[]) ?? [];\n\n if (loading) {\n return (\n <PageLayout title=\"Template Details\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !config) {\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n {error\n ? \"Failed to load template details. Please try again later.\"\n : \"Template configuration not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Sparkles className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{name}</h2>\n <p className=\"text-sm text-text-secondary\">{description}</p>\n <div className=\"mt-2 flex items-center gap-3 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-amber-400 text-amber-400\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Users className=\"h-4 w-4\" />\n <span>{teamSize} members</span>\n </div>\n </div>\n </div>\n </div>\n\n {features.length > 0 && (\n <div className=\"mt-6\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Features\n </h3>\n <ul className=\"mt-2 space-y-2\">\n {features.map((feature) => (\n <li\n key={feature}\n className=\"flex items-center gap-2 text-sm text-text-secondary\"\n >\n <CheckCircle className=\"h-4 w-4 text-emerald-500\" />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <div className=\"mt-6 flex justify-end\">\n <button className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n Apply Template\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAAqB;CACnC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAyB;EACxD,WAAW,EAAE,IAAI,KAAM,IAAI;EAC3B,MAAM,CAAC;EACR,CAAC,EAEI,IAAS,GAAM,eACf,IAAO,GAAQ,SAAqC,EAAE,EACtD,IACH,EAAI,QAAmB,GAAQ,KAAK,QAAQ,aAAa,GAAG,IAAI,YAC7D,IACJ,GAAQ,eACP,EAAI,eACL,+DACI,IAAU,EAAI,UAAqB,GACnC,IAAY,EAAI,YAAuB,KACvC,IAAY,EAAI,YAAyB,EAAE;AA+BjD,QA7BI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAmB,aAAY;YAC/C,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,KAAS,CAAC,IAEV,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,gBAAgB;EAC7B,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,oBAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACZ,IACG,6DACA;GACA,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,gBAAgB;EAC7B,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,oBAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OACzC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,MAAD;SAAI,WAAU;mBAA2C;SAAU,CAAA;QACnE,kBAAC,KAAD;SAAG,WAAU;mBAA+B;SAAgB,CAAA;QAC5D,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,yCAA0C,CAAA,EAC1D,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC7B,kBAAC,QAAD,EAAA,UAAA,CAAO,GAAS,WAAe,EAAA,CAAA,CAC3B;YACF;;QACF;SACF;;KAEL,EAAS,SAAS,KACjB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA0C;OAEnD,CAAA,EACL,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAS,KAAK,MACb,kBAAC,MAAD;QAEE,WAAU;kBAFZ,CAIE,kBAAC,GAAD,EAAa,WAAU,4BAA6B,CAAA,EACnD,EACE;UALE,EAKF,CACL;OACC,CAAA,CACD;;KAGR,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,UAAD;OAAQ,WAAU;iBAAuH;OAEhI,CAAA;MACL,CAAA;KACF;;GACF,CAAA;EACK,CAAA"}
|
|
@@ -27,24 +27,24 @@ function l() {
|
|
|
27
27
|
children: /* @__PURE__ */ s("div", {
|
|
28
28
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
29
29
|
children: p.length === 0 ? /* @__PURE__ */ s("div", {
|
|
30
|
-
className: "col-span-full p-8 text-center text-sm text-
|
|
30
|
+
className: "col-span-full p-8 text-center text-sm text-text-secondary",
|
|
31
31
|
children: "No templates configured yet. Templates are stored as workspace configurations with the \"template.\" key prefix."
|
|
32
32
|
}) : p.map((e) => {
|
|
33
33
|
let t = e.value, n = t.name ?? e.key.replace("template.", ""), r = t.category ?? "General", l = t.industry ?? "Any", u = t.rating ?? 0, d = t.teamSize ?? "-", f = t.downloads ?? 0;
|
|
34
34
|
return /* @__PURE__ */ c("div", {
|
|
35
|
-
className: "rounded-xl border border-border bg-
|
|
35
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
|
|
36
36
|
children: [/* @__PURE__ */ c("div", {
|
|
37
37
|
className: "flex items-start gap-3",
|
|
38
38
|
children: [/* @__PURE__ */ s("div", {
|
|
39
|
-
className: "flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10",
|
|
39
|
+
className: "flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10",
|
|
40
40
|
children: /* @__PURE__ */ s(i, { className: "h-6 w-6 text-primary" })
|
|
41
41
|
}), /* @__PURE__ */ c("div", {
|
|
42
42
|
className: "flex-1",
|
|
43
43
|
children: [/* @__PURE__ */ s("p", {
|
|
44
|
-
className: "text-sm font-semibold text-
|
|
44
|
+
className: "text-sm font-semibold text-text-primary",
|
|
45
45
|
children: n
|
|
46
46
|
}), /* @__PURE__ */ c("p", {
|
|
47
|
-
className: "text-xs text-
|
|
47
|
+
className: "text-xs text-text-secondary",
|
|
48
48
|
children: [
|
|
49
49
|
r,
|
|
50
50
|
" · ",
|
|
@@ -53,7 +53,7 @@ function l() {
|
|
|
53
53
|
})]
|
|
54
54
|
})]
|
|
55
55
|
}), /* @__PURE__ */ c("div", {
|
|
56
|
-
className: "mt-3 flex items-center justify-between text-xs text-
|
|
56
|
+
className: "mt-3 flex items-center justify-between text-xs text-text-secondary",
|
|
57
57
|
children: [/* @__PURE__ */ c("div", {
|
|
58
58
|
className: "flex items-center gap-3",
|
|
59
59
|
children: [/* @__PURE__ */ c("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatesPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplatesPage.tsx"],"sourcesContent":["import { Sparkles, Star, Users } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TemplatesPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent templates (key starts with 'template.')\n const templates = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"template.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load template configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {templates.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-
|
|
1
|
+
{"version":3,"file":"TemplatesPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplatesPage.tsx"],"sourcesContent":["import { Sparkles, Star, Users } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TemplatesPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent templates (key starts with 'template.')\n const templates = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"template.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load template configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {templates.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-text-secondary\">\n No templates configured yet. Templates are stored as workspace\n configurations with the \"template.\" key prefix.\n </div>\n ) : (\n templates.map((template: ConfigurationFieldsFragment) => {\n const val = template.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? template.key.replace(\"template.\", \"\");\n const category = (val.category as string) ?? \"General\";\n const industry = (val.industry as string) ?? \"Any\";\n const rating = (val.rating as number) ?? 0;\n const teamSize = (val.teamSize as string) ?? \"-\";\n const downloads = (val.downloads as number) ?? 0;\n\n return (\n <div\n key={template.id}\n className=\"rounded-xl border border-border-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {category} · {industry}\n </p>\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-text-secondary\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-amber-400 text-amber-400\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n <span>{teamSize}</span>\n </div>\n </div>\n <span>{downloads} uses</span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAU,WAAW,IACpB,kBAAC,OAAD;IAAK,WAAU;cAA4D;IAGrE,CAAA,GAEN,EAAU,KAAK,MAA0C;IACvD,IAAM,IAAM,EAAS,OACf,IACH,EAAI,QAAmB,EAAS,IAAI,QAAQ,aAAa,GAAG,EACzD,IAAY,EAAI,YAAuB,WACvC,IAAY,EAAI,YAAuB,OACvC,IAAU,EAAI,UAAqB,GACnC,IAAY,EAAI,YAAuB,KACvC,IAAa,EAAI,aAAwB;AAE/C,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OACzC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG;SAAS;SAAW;SACnB;UACA;SACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,yCAA0C,CAAA,EAC1D,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC7B,kBAAC,QAAD,EAAA,UAAO,GAAgB,CAAA,CACnB;UACF;UACN,kBAAC,QAAD,EAAA,UAAA,CAAO,GAAU,QAAY,EAAA,CAAA,CACzB;QACF;OA7BC,EAAS,GA6BV;KAER;GAEA,CAAA;EACK,CAAA"}
|
|
@@ -20,10 +20,10 @@ function u() {
|
|
|
20
20
|
actions: /* @__PURE__ */ l("div", {
|
|
21
21
|
className: "flex items-center gap-2",
|
|
22
22
|
children: [/* @__PURE__ */ l("button", {
|
|
23
|
-
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-
|
|
23
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
24
24
|
children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Filter"]
|
|
25
25
|
}), /* @__PURE__ */ l("button", {
|
|
26
|
-
className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-
|
|
26
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
27
27
|
children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Add Entry"]
|
|
28
28
|
})]
|
|
29
29
|
}),
|
|
@@ -31,58 +31,58 @@ function u() {
|
|
|
31
31
|
variant: "table",
|
|
32
32
|
count: 5
|
|
33
33
|
}) : /* @__PURE__ */ c("div", {
|
|
34
|
-
className: "rounded-xl border border-border bg-
|
|
34
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface",
|
|
35
35
|
children: /* @__PURE__ */ c("div", {
|
|
36
36
|
className: "overflow-x-auto",
|
|
37
37
|
children: /* @__PURE__ */ l("table", {
|
|
38
38
|
className: "w-full",
|
|
39
39
|
children: [/* @__PURE__ */ c("thead", { children: /* @__PURE__ */ l("tr", {
|
|
40
|
-
className: "border-b border-border",
|
|
40
|
+
className: "border-b border-border-subtle",
|
|
41
41
|
children: [
|
|
42
42
|
/* @__PURE__ */ c("th", {
|
|
43
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
43
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
44
44
|
children: "Date"
|
|
45
45
|
}),
|
|
46
46
|
/* @__PURE__ */ c("th", {
|
|
47
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
47
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
48
48
|
children: "Project"
|
|
49
49
|
}),
|
|
50
50
|
/* @__PURE__ */ c("th", {
|
|
51
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
51
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
52
52
|
children: "Task"
|
|
53
53
|
}),
|
|
54
54
|
/* @__PURE__ */ c("th", {
|
|
55
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
55
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
56
56
|
children: "Duration"
|
|
57
57
|
}),
|
|
58
58
|
/* @__PURE__ */ c("th", {
|
|
59
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
59
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
60
60
|
children: "Billable"
|
|
61
61
|
}),
|
|
62
62
|
/* @__PURE__ */ c("th", {
|
|
63
|
-
className: "px-4 py-3 text-left text-xs font-medium text-
|
|
63
|
+
className: "px-4 py-3 text-left text-xs font-medium text-text-secondary",
|
|
64
64
|
children: "Status"
|
|
65
65
|
})
|
|
66
66
|
]
|
|
67
67
|
}) }), /* @__PURE__ */ l("tbody", {
|
|
68
68
|
className: "divide-y divide-border",
|
|
69
69
|
children: [p.map((r) => /* @__PURE__ */ l("tr", {
|
|
70
|
-
className: "hover:bg-
|
|
70
|
+
className: "hover:bg-bg-sunken/50 transition-colors",
|
|
71
71
|
children: [
|
|
72
72
|
/* @__PURE__ */ c("td", {
|
|
73
|
-
className: "px-4 py-3 text-sm text-
|
|
73
|
+
className: "px-4 py-3 text-sm text-text-secondary",
|
|
74
74
|
children: e(r.startTime)
|
|
75
75
|
}),
|
|
76
76
|
/* @__PURE__ */ c("td", {
|
|
77
|
-
className: "px-4 py-3 text-sm font-medium text-
|
|
77
|
+
className: "px-4 py-3 text-sm font-medium text-text-primary",
|
|
78
78
|
children: r.project?.name ?? "No Project"
|
|
79
79
|
}),
|
|
80
80
|
/* @__PURE__ */ c("td", {
|
|
81
|
-
className: "px-4 py-3 text-sm text-
|
|
81
|
+
className: "px-4 py-3 text-sm text-text-secondary",
|
|
82
82
|
children: r.task?.title ?? r.description ?? "No description"
|
|
83
83
|
}),
|
|
84
84
|
/* @__PURE__ */ c("td", {
|
|
85
|
-
className: "px-4 py-3 text-sm font-mono text-
|
|
85
|
+
className: "px-4 py-3 text-sm font-mono text-text-primary",
|
|
86
86
|
children: t((r.duration ?? 0) / 3600)
|
|
87
87
|
}),
|
|
88
88
|
/* @__PURE__ */ c("td", {
|
|
@@ -102,7 +102,7 @@ function u() {
|
|
|
102
102
|
]
|
|
103
103
|
}, r.id)), p.length === 0 && /* @__PURE__ */ c("tr", { children: /* @__PURE__ */ c("td", {
|
|
104
104
|
colSpan: 6,
|
|
105
|
-
className: "px-4 py-8 text-center text-sm text-
|
|
105
|
+
className: "px-4 py-8 text-center text-sm text-text-secondary",
|
|
106
106
|
children: "No time entries found"
|
|
107
107
|
}) })]
|
|
108
108
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeEntriesPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"sourcesContent":["import { Clock, Plus, Filter } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, formatDate, getStatusColor } from \"../../utils/helpers\";\nimport {\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TimeEntriesPage() {\n const { data, loading, error } = useListTimeEntriesQuery({\n variables: { limit: 50 },\n });\n\n const entries = data?.timeEntries?.items ?? [];\n\n if (error) {\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n >\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-6 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400\">\n Failed to load time entries. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-
|
|
1
|
+
{"version":3,"file":"TimeEntriesPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"sourcesContent":["import { Clock, Plus, Filter } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, formatDate, getStatusColor } from \"../../utils/helpers\";\nimport {\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TimeEntriesPage() {\n const { data, loading, error } = useListTimeEntriesQuery({\n variables: { limit: 50 },\n });\n\n const entries = data?.timeEntries?.items ?? [];\n\n if (error) {\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n >\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-6 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400\">\n Failed to load time entries. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <Filter className=\"h-4 w-4\" />\n Filter\n </button>\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Add Entry\n </button>\n </div>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"table\" count={5} />\n ) : (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Project\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Task\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Billable\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary\">\n Status\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {entries.map((entry: TimeEntryFieldsFragment) => (\n <tr\n key={entry.id}\n className=\"hover:bg-bg-sunken/50 transition-colors\"\n >\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {formatDate(entry.startTime)}\n </td>\n <td className=\"px-4 py-3 text-sm font-medium text-text-primary\">\n {entry.project?.name ?? \"No Project\"}\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {entry.task?.title ??\n entry.description ??\n \"No description\"}\n </td>\n <td className=\"px-4 py-3 text-sm font-mono text-text-primary\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${entry.billable ? \"bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400\" : \"bg-gray-100 text-gray-600 dark:bg-gray-900/30 dark:text-gray-400\"}`}\n >\n {entry.billable ? \"Yes\" : \"No\"}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(entry.isRunning ? \"running\" : \"completed\")}`}\n >\n {entry.isRunning ? \"running\" : \"completed\"}\n </span>\n </td>\n </tr>\n ))}\n {entries.length === 0 && (\n <tr>\n <td\n colSpan={6}\n className=\"px-4 py-8 text-center text-sm text-text-secondary\"\n >\n No time entries found\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,YAAS,aAAU,EAAwB,EACvD,WAAW,EAAE,OAAO,IAAI,EACzB,CAAC,EAEI,IAAU,GAAM,aAAa,SAAS,EAAE;AAe9C,QAbI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,SAEvB;OACT,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,YAErB;MACL;;YAGP,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAQ,OAAO;GAAK,CAAA,GAE7C,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAA8D;QAEvE,CAAA;OACF;SACC,CAAA,EACR,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACG,EAAQ,KAAK,MACZ,kBAAC,MAAD;OAEE,WAAU;iBAFZ;QAIE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAW,EAAM,UAAU;SACzB,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAM,SAAS,QAAQ;SACrB,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAM,MAAM,SACX,EAAM,eACN;SACC,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,GAAa,EAAM,YAAY,KAAK,KAAK;SACvC,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,QAAD;UACE,WAAW,4DAA4D,EAAM,WAAW,iFAAiF;oBAExK,EAAM,WAAW,QAAQ;UACrB,CAAA;SACJ,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,QAAD;UACE,WAAW,4DAA4D,EAAe,EAAM,YAAY,YAAY,YAAY;oBAE/H,EAAM,YAAY,YAAY;UAC1B,CAAA;SACJ,CAAA;QACF;SA/BE,EAAM,GA+BR,CACL,EACD,EAAQ,WAAW,KAClB,kBAAC,MAAD,EAAA,UACE,kBAAC,MAAD;OACE,SAAS;OACT,WAAU;iBACX;OAEI,CAAA,EACF,CAAA,CAED;QACF;;IACJ,CAAA;GACF,CAAA;EAEG,CAAA"}
|
|
@@ -25,7 +25,7 @@ function g() {
|
|
|
25
25
|
description: _("timecampus.timeTracking.description", "Track and manage your work hours"),
|
|
26
26
|
actions: /* @__PURE__ */ p("button", {
|
|
27
27
|
onClick: () => v ? b() : y(),
|
|
28
|
-
className: `inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium ${v ? "bg-red-500 text-white hover:bg-red-600" : "bg-primary text-primary-
|
|
28
|
+
className: `inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium ${v ? "bg-red-500 text-white hover:bg-red-600" : "bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90"}`,
|
|
29
29
|
children: v ? /* @__PURE__ */ m(f, { children: [
|
|
30
30
|
/* @__PURE__ */ p(d, { className: "h-4 w-4" }),
|
|
31
31
|
_("timecampus.timeTracking.actions.stop", "Stop"),
|
|
@@ -65,36 +65,36 @@ function g() {
|
|
|
65
65
|
})
|
|
66
66
|
]
|
|
67
67
|
}), /* @__PURE__ */ m("div", {
|
|
68
|
-
className: "rounded-xl border border-border bg-
|
|
68
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
69
69
|
children: [/* @__PURE__ */ p("h3", {
|
|
70
|
-
className: "mb-4 text-sm font-semibold text-
|
|
70
|
+
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
71
71
|
children: _("timecampus.timeTracking.entries.title", "Today's Entries")
|
|
72
72
|
}), w ? /* @__PURE__ */ p(i, {
|
|
73
73
|
variant: "list",
|
|
74
74
|
count: 4
|
|
75
75
|
}) : E.length === 0 ? /* @__PURE__ */ p("div", {
|
|
76
|
-
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
76
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
|
|
77
77
|
children: /* @__PURE__ */ p("p", {
|
|
78
|
-
className: "text-sm text-
|
|
78
|
+
className: "text-sm text-text-secondary",
|
|
79
79
|
children: _("timecampus.timeTracking.entries.empty", "No time entries yet. Start a timer to begin tracking.")
|
|
80
80
|
})
|
|
81
81
|
}) : /* @__PURE__ */ p("div", {
|
|
82
82
|
className: "flex flex-col gap-2",
|
|
83
83
|
children: E.map((t) => /* @__PURE__ */ m("div", {
|
|
84
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3 transition-colors hover:bg-
|
|
84
|
+
className: "flex items-center justify-between rounded-lg border border-border-subtle p-3 transition-colors hover:bg-bg-sunken/50",
|
|
85
85
|
children: [/* @__PURE__ */ m("div", {
|
|
86
86
|
className: "min-w-0 flex-1",
|
|
87
87
|
children: [/* @__PURE__ */ p("p", {
|
|
88
|
-
className: "text-sm font-medium text-
|
|
88
|
+
className: "text-sm font-medium text-text-primary",
|
|
89
89
|
children: t.project?.name ?? _("timecampus.timeTracking.entries.noProject", "No Project")
|
|
90
90
|
}), /* @__PURE__ */ p("p", {
|
|
91
|
-
className: "text-xs text-
|
|
91
|
+
className: "text-xs text-text-secondary",
|
|
92
92
|
children: t.description ?? _("timecampus.timeTracking.entries.noDescription", "No description")
|
|
93
93
|
})]
|
|
94
94
|
}), /* @__PURE__ */ m("div", {
|
|
95
95
|
className: "ml-4 text-right",
|
|
96
96
|
children: [/* @__PURE__ */ p("p", {
|
|
97
|
-
className: "text-sm font-mono font-medium text-
|
|
97
|
+
className: "text-sm font-mono font-medium text-text-primary",
|
|
98
98
|
children: e((t.duration ?? 0) / 3600)
|
|
99
99
|
}), /* @__PURE__ */ p("span", {
|
|
100
100
|
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",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimeTrackingPage.tsx"],"sourcesContent":["import { Clock, Play, Pause, Square } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { 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 function TimeTrackingPage() {\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: 10 },\n });\n\n const stats = statsData?.timeEntryStats;\n const todayEntries = entriesData?.timeEntries?.items ?? [];\n\n if (statsLoading) {\n return (\n <PageLayout\n title={t(\"timecampus.timeTracking.title\", \"Time Tracking\")}\n description={t(\n \"timecampus.timeTracking.description\",\n \"Track and manage your work hours\",\n )}\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t(\"timecampus.timeTracking.title\", \"Time Tracking\")}\n description={t(\n \"timecampus.timeTracking.description\",\n \"Track and manage your work hours\",\n )}\n actions={\n <button\n onClick={() => (activeTimer ? stopTimer() : startTimer())}\n className={`inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium ${activeTimer ? \"bg-red-500 text-white hover:bg-red-600\" : \"bg-primary text-primary-
|
|
1
|
+
{"version":3,"file":"TimeTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimeTrackingPage.tsx"],"sourcesContent":["import { Clock, Play, Pause, Square } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { 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 function TimeTrackingPage() {\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: 10 },\n });\n\n const stats = statsData?.timeEntryStats;\n const todayEntries = entriesData?.timeEntries?.items ?? [];\n\n if (statsLoading) {\n return (\n <PageLayout\n title={t(\"timecampus.timeTracking.title\", \"Time Tracking\")}\n description={t(\n \"timecampus.timeTracking.description\",\n \"Track and manage your work hours\",\n )}\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t(\"timecampus.timeTracking.title\", \"Time Tracking\")}\n description={t(\n \"timecampus.timeTracking.description\",\n \"Track and manage your work hours\",\n )}\n actions={\n <button\n onClick={() => (activeTimer ? stopTimer() : startTimer())}\n className={`inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium ${activeTimer ? \"bg-red-500 text-white hover:bg-red-600\" : \"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90\"}`}\n >\n {activeTimer ? (\n <>\n <Square className=\"h-4 w-4\" />\n {t(\"timecampus.timeTracking.actions.stop\", \"Stop\")} (\n {formatTimerDuration(activeTimer.seconds)})\n </>\n ) : (\n <>\n <Play className=\"h-4 w-4\" />\n {t(\"timecampus.timeTracking.actions.startTimer\", \"Start Timer\")}\n </>\n )}\n </button>\n }\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title={t(\"timecampus.timeTracking.stats.today\", \"Today\")}\n value={formatHours(stats?.totalHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{\n value: 15,\n label: t(\n \"timecampus.timeTracking.stats.vsYesterday\",\n \"vs yesterday\",\n ),\n }}\n />\n <StatCard\n title={t(\"timecampus.timeTracking.stats.billable\", \"Billable\")}\n value={formatHours(stats?.billableHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n description={`${stats?.totalEntries ?? 0} ${t(\"timecampus.timeTracking.stats.entries\", \"entries\")}`}\n />\n <StatCard\n title={t(\n \"timecampus.timeTracking.stats.activeTimers\",\n \"Active Timers\",\n )}\n value={stats?.activeTimers ?? 0}\n icon={<Clock className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.timeTracking.stats.currentlyRunning\",\n \"Currently running\",\n )}\n />\n <StatCard\n title={t(\"timecampus.timeTracking.stats.activeTimer\", \"Active Timer\")}\n value={\n activeTimer\n ? formatTimerDuration(activeTimer.seconds)\n : t(\"timecampus.timeTracking.stats.stopped\", \"Stopped\")\n }\n icon={\n activeTimer ? (\n <Pause className=\"h-5 w-5\" />\n ) : (\n <Play className=\"h-5 w-5\" />\n )\n }\n />\n </div>\n\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n {t(\"timecampus.timeTracking.entries.title\", \"Today's Entries\")}\n </h3>\n {entriesLoading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : todayEntries.length === 0 ? (\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n {t(\n \"timecampus.timeTracking.entries.empty\",\n \"No time entries yet. Start a timer to begin tracking.\",\n )}\n </p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {todayEntries.map((entry: TimeEntryFieldsFragment) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle 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.timeTracking.entries.noProject\",\n \"No Project\",\n )}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {entry.description ??\n t(\n \"timecampus.timeTracking.entries.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-text-primary\">\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.timeTracking.entries.status.running\",\n \"running\",\n )\n : t(\n \"timecampus.timeTracking.entries.status.completed\",\n \"completed\",\n )}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAmB;CACjC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAA6B;EACnD,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,gBAAa,eAAY,iBAAc,GAAoB,EAE7D,EAAE,MAAM,GAAW,SAAS,MAChC,GAA2B,EACvB,EAAE,MAAM,GAAa,SAAS,MAClC,EAAwB,EACtB,WAAW,EAAE,OAAO,IAAI,EACzB,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAe,GAAa,aAAa,SAAS,EAAE;AAgB1D,QAdI,IAEA,kBAAC,GAAD;EACE,OAAO,EAAE,iCAAiC,gBAAgB;EAC1D,aAAa,EACX,uCACA,mCACD;YAED,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAKf,kBAAC,GAAD;EACE,OAAO,EAAE,iCAAiC,gBAAgB;EAC1D,aAAa,EACX,uCACA,mCACD;EACD,SACE,kBAAC,UAAD;GACE,eAAgB,IAAc,GAAW,GAAG,GAAY;GACxD,WAAW,2EAA2E,IAAc,2CAA2C;aAE9I,IACC,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;IAC7B,EAAE,wCAAwC,OAAO;IAAC;IAClD,EAAoB,EAAY,QAAQ;IAAC;IACzC,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAE,8CAA8C,cAAc,CAC9D,EAAA,CAAA;GAEE,CAAA;YAvBb,CA0BE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAO,EAAE,uCAAuC,QAAQ;KACxD,OAAO,EAAY,GAAO,cAAc,EAAE;KAC1C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,OAAO;MACL,OAAO;MACP,OAAO,EACL,6CACA,eACD;MACF;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAE,0CAA0C,WAAW;KAC9D,OAAO,EAAY,GAAO,iBAAiB,EAAE;KAC7C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAa,GAAG,GAAO,gBAAgB,EAAE,GAAG,EAAE,yCAAyC,UAAU;KACjG,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EACL,8CACA,gBACD;KACD,OAAO,GAAO,gBAAgB;KAC9B,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAa,EACX,kDACA,oBACD;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAO,EAAE,6CAA6C,eAAe;KACrE,OACE,IACI,EAAoB,EAAY,QAAQ,GACxC,EAAE,yCAAyC,UAAU;KAE3D,MAEI,EADF,IACG,IAEA,GAFD,EAAO,WAAU,WAAY,CAED;KAGhC,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,yCAAyC,kBAAkB;IAC3D,CAAA,EACJ,IACC,kBAAC,GAAD;IAAiB,SAAQ;IAAO,OAAO;IAAK,CAAA,GAC1C,EAAa,WAAW,IAC1B,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eACV,EACC,yCACA,wDACD;KACC,CAAA;IACA,CAAA,GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAa,KAAK,MACjB,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAM,SAAS,QACd,EACE,6CACA,aACD;OACD,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAM,eACL,EACE,iDACA,iBACD;OACD,CAAA,CACA;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,GAAa,EAAM,YAAY,KAAK,KAAK;OACxC,CAAA,EACJ,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAM,YACH,EACE,kDACA,UACD,GACD,EACE,oDACA,YACD;OACA,CAAA,CACH;QACF;OAnCC,EAAM,GAmCP,CACN;IACE,CAAA,CAEJ;KACK"}
|
|
@@ -14,14 +14,14 @@ function u() {
|
|
|
14
14
|
children: /* @__PURE__ */ l("div", {
|
|
15
15
|
className: "mx-auto max-w-lg",
|
|
16
16
|
children: [/* @__PURE__ */ l("div", {
|
|
17
|
-
className: "rounded-xl border border-border bg-
|
|
17
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-8 text-center",
|
|
18
18
|
children: [
|
|
19
19
|
/* @__PURE__ */ c("p", {
|
|
20
|
-
className: "text-6xl font-mono font-bold text-
|
|
20
|
+
className: "text-6xl font-mono font-bold text-text-primary",
|
|
21
21
|
children: u ? e(u.seconds) : "00:00:00"
|
|
22
22
|
}),
|
|
23
23
|
u?.description && /* @__PURE__ */ c("p", {
|
|
24
|
-
className: "mt-2 text-sm text-
|
|
24
|
+
className: "mt-2 text-sm text-text-secondary",
|
|
25
25
|
children: u.description
|
|
26
26
|
}),
|
|
27
27
|
/* @__PURE__ */ l("div", {
|
|
@@ -32,40 +32,40 @@ function u() {
|
|
|
32
32
|
children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Stop"]
|
|
33
33
|
}) : /* @__PURE__ */ l("button", {
|
|
34
34
|
onClick: () => d(),
|
|
35
|
-
className: "inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-
|
|
35
|
+
className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
36
36
|
children: [/* @__PURE__ */ c(a, { className: "h-4 w-4" }), "Start"]
|
|
37
37
|
}), /* @__PURE__ */ l("button", {
|
|
38
|
-
className: "inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-
|
|
38
|
+
className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
39
39
|
children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Reset"]
|
|
40
40
|
})]
|
|
41
41
|
})
|
|
42
42
|
]
|
|
43
43
|
}), /* @__PURE__ */ l("div", {
|
|
44
|
-
className: "mt-6 rounded-xl border border-border bg-
|
|
44
|
+
className: "mt-6 rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
45
45
|
children: [/* @__PURE__ */ c("h3", {
|
|
46
|
-
className: "mb-4 text-sm font-semibold text-
|
|
46
|
+
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
47
47
|
children: "Running Timers"
|
|
48
48
|
}), m ? /* @__PURE__ */ c(n, {
|
|
49
49
|
variant: "list",
|
|
50
50
|
count: 2
|
|
51
51
|
}) : h.length === 0 ? /* @__PURE__ */ c("p", {
|
|
52
|
-
className: "text-center text-sm text-
|
|
52
|
+
className: "text-center text-sm text-text-secondary py-4",
|
|
53
53
|
children: "No active timers on the server"
|
|
54
54
|
}) : /* @__PURE__ */ c("div", {
|
|
55
55
|
className: "flex flex-col gap-2",
|
|
56
56
|
children: h.map((t) => /* @__PURE__ */ l("div", {
|
|
57
|
-
className: "flex items-center justify-between rounded-lg border border-border p-3",
|
|
57
|
+
className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
|
|
58
58
|
children: [/* @__PURE__ */ l("div", {
|
|
59
59
|
className: "min-w-0 flex-1",
|
|
60
60
|
children: [/* @__PURE__ */ c("p", {
|
|
61
|
-
className: "text-sm font-medium text-
|
|
61
|
+
className: "text-sm font-medium text-text-primary",
|
|
62
62
|
children: t.timeEntry.project?.name ?? "No Project"
|
|
63
63
|
}), /* @__PURE__ */ c("p", {
|
|
64
|
-
className: "text-xs text-
|
|
64
|
+
className: "text-xs text-text-secondary",
|
|
65
65
|
children: t.timeEntry.description ?? "No description"
|
|
66
66
|
})]
|
|
67
67
|
}), /* @__PURE__ */ c("p", {
|
|
68
|
-
className: "ml-4 text-sm font-mono font-medium text-
|
|
68
|
+
className: "ml-4 text-sm font-mono font-medium text-text-primary",
|
|
69
69
|
children: e(t.elapsedSeconds)
|
|
70
70
|
})]
|
|
71
71
|
}, t.timeEntry.id))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimerPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimerPage.tsx"],"sourcesContent":["import { Play, Square, RotateCcw } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatTimerDuration } from \"../../utils/helpers\";\nimport { useTimeCampusStore } from \"../../store/timecampusStore\";\nimport {\n useListRunningTimersQuery,\n type ListRunningTimersQuery,\n} from \"@/generated/wspace-operations\";\n\ntype RunningTimerItem = ListRunningTimersQuery[\"runningTimers\"][number];\n\nexport function TimerPage() {\n const { activeTimer, startTimer, stopTimer } = useTimeCampusStore();\n\n const { data: runningData, loading: runningLoading } =\n useListRunningTimersQuery();\n\n const runningTimers = runningData?.runningTimers ?? [];\n\n return (\n <PageLayout title=\"Timer\" description=\"Focus timer for deep work sessions\">\n <div className=\"mx-auto max-w-lg\">\n <div className=\"rounded-xl border border-border bg-
|
|
1
|
+
{"version":3,"file":"TimerPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimerPage.tsx"],"sourcesContent":["import { Play, Square, RotateCcw } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatTimerDuration } from \"../../utils/helpers\";\nimport { useTimeCampusStore } from \"../../store/timecampusStore\";\nimport {\n useListRunningTimersQuery,\n type ListRunningTimersQuery,\n} from \"@/generated/wspace-operations\";\n\ntype RunningTimerItem = ListRunningTimersQuery[\"runningTimers\"][number];\n\nexport function TimerPage() {\n const { activeTimer, startTimer, stopTimer } = useTimeCampusStore();\n\n const { data: runningData, loading: runningLoading } =\n useListRunningTimersQuery();\n\n const runningTimers = runningData?.runningTimers ?? [];\n\n return (\n <PageLayout title=\"Timer\" description=\"Focus timer for deep work sessions\">\n <div className=\"mx-auto max-w-lg\">\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-8 text-center\">\n <p className=\"text-6xl font-mono font-bold text-text-primary\">\n {activeTimer\n ? formatTimerDuration(activeTimer.seconds)\n : \"00:00:00\"}\n </p>\n {activeTimer?.description && (\n <p className=\"mt-2 text-sm text-text-secondary\">\n {activeTimer.description}\n </p>\n )}\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {activeTimer ? (\n <button\n onClick={stopTimer}\n className=\"inline-flex items-center gap-2 rounded-md bg-red-500 px-6 py-3 text-sm font-medium text-white hover:bg-red-600\"\n >\n <Square className=\"h-4 w-4\" />\n Stop\n </button>\n ) : (\n <button\n onClick={() => startTimer()}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-6 py-3 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Play className=\"h-4 w-4\" />\n Start\n </button>\n )}\n <button className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <RotateCcw className=\"h-4 w-4\" />\n Reset\n </button>\n </div>\n </div>\n\n {/* Server-side running timers */}\n <div className=\"mt-6 rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Running Timers\n </h3>\n {runningLoading ? (\n <LoadingSkeleton variant=\"list\" count={2} />\n ) : runningTimers.length === 0 ? (\n <p className=\"text-center text-sm text-text-secondary py-4\">\n No active timers on the server\n </p>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {runningTimers.map((timer: RunningTimerItem) => (\n <div\n key={timer.timeEntry.id}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">\n {timer.timeEntry.project?.name ?? \"No Project\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {timer.timeEntry.description ?? \"No description\"}\n </p>\n </div>\n <p className=\"ml-4 text-sm font-mono font-medium text-text-primary\">\n {formatTimerDuration(timer.elapsedSeconds)}\n </p>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,IAAY;CAC1B,IAAM,EAAE,gBAAa,eAAY,iBAAc,GAAoB,EAE7D,EAAE,MAAM,GAAa,SAAS,MAClC,GAA2B,EAEvB,IAAgB,GAAa,iBAAiB,EAAE;AAEtD,QACE,kBAAC,GAAD;EAAY,OAAM;EAAQ,aAAY;YACpC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,KAAD;MAAG,WAAU;gBACV,IACG,EAAoB,EAAY,QAAQ,GACxC;MACF,CAAA;KACH,GAAa,eACZ,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAY;MACX,CAAA;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,IACC,kBAAC,UAAD;OACE,SAAS;OACT,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,OAEvB;WAET,kBAAC,UAAD;OACE,eAAe,GAAY;OAC3B,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,QAErB;UAEX,kBAAC,UAAD;OAAQ,WAAU;iBAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,QAE1B;SACL;;KACF;OAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAExD,CAAA,EACJ,IACC,kBAAC,GAAD;KAAiB,SAAQ;KAAO,OAAO;KAAK,CAAA,GAC1C,EAAc,WAAW,IAC3B,kBAAC,KAAD;KAAG,WAAU;eAA+C;KAExD,CAAA,GAEJ,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAc,KAAK,MAClB,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAM,UAAU,SAAS,QAAQ;QAChC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAM,UAAU,eAAe;QAC9B,CAAA,CACA;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAoB,EAAM,eAAe;OACxC,CAAA,CACA;QAdC,EAAM,UAAU,GAcjB,CACN;KACE,CAAA,CAEJ;MACF;;EACK,CAAA"}
|
|
@@ -61,24 +61,24 @@ function _() {
|
|
|
61
61
|
})
|
|
62
62
|
]
|
|
63
63
|
}), /* @__PURE__ */ h("div", {
|
|
64
|
-
className: "rounded-xl border border-border bg-
|
|
64
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface",
|
|
65
65
|
children: /* @__PURE__ */ g("div", {
|
|
66
66
|
className: "divide-y divide-border",
|
|
67
67
|
children: [O.length === 0 && !y && /* @__PURE__ */ h("div", {
|
|
68
|
-
className: "p-4 text-center text-sm text-
|
|
68
|
+
className: "p-4 text-center text-sm text-text-secondary",
|
|
69
69
|
children: "No approval requests found."
|
|
70
70
|
}), O.map((e) => /* @__PURE__ */ g("div", {
|
|
71
|
-
className: "flex items-center justify-between p-4 hover:bg-
|
|
71
|
+
className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
|
|
72
72
|
children: [/* @__PURE__ */ g("div", {
|
|
73
73
|
className: "flex items-center gap-3",
|
|
74
74
|
children: [/* @__PURE__ */ h("div", {
|
|
75
|
-
className: "flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-sm font-medium text-primary",
|
|
75
|
+
className: "flex h-9 w-9 items-center justify-center rounded-full bg-action-primary-bg/10 text-sm font-medium text-primary",
|
|
76
76
|
children: r(e.userId)
|
|
77
77
|
}), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
|
|
78
|
-
className: "text-sm font-medium text-
|
|
78
|
+
className: "text-sm font-medium text-text-primary",
|
|
79
79
|
children: e.userId
|
|
80
80
|
}), /* @__PURE__ */ g("p", {
|
|
81
|
-
className: "text-xs text-
|
|
81
|
+
className: "text-xs text-text-secondary",
|
|
82
82
|
children: [
|
|
83
83
|
e.period,
|
|
84
84
|
" · Submitted",
|
|
@@ -92,10 +92,10 @@ function _() {
|
|
|
92
92
|
/* @__PURE__ */ g("div", {
|
|
93
93
|
className: "text-right",
|
|
94
94
|
children: [/* @__PURE__ */ h("p", {
|
|
95
|
-
className: "text-sm font-medium text-
|
|
95
|
+
className: "text-sm font-medium text-text-primary",
|
|
96
96
|
children: n(e.totalHours)
|
|
97
97
|
}), /* @__PURE__ */ g("p", {
|
|
98
|
-
className: "text-xs text-
|
|
98
|
+
className: "text-xs text-text-secondary",
|
|
99
99
|
children: [n(e.billableHours), " billable"]
|
|
100
100
|
})]
|
|
101
101
|
}),
|