@burdenoff/microfe-timecampus 2026.625.1 → 2026.626.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/timecampus/components/EmptyState.js +14 -0
  2. package/dist/timecampus/components/EmptyState.js.map +1 -0
  3. package/dist/timecampus/components/PageLayout.js +23 -15
  4. package/dist/timecampus/components/PageLayout.js.map +1 -1
  5. package/dist/timecampus/pages/applets/AppletStorePage.js +33 -30
  6. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
  7. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +37 -31
  8. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
  9. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +48 -44
  10. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
  11. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +35 -31
  12. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
  13. package/dist/timecampus/pages/channels/ChannelsPage.js +27 -24
  14. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
  15. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +46 -38
  16. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
  17. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +66 -39
  18. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
  19. package/dist/timecampus/pages/dashboard/ReportsPage.js +42 -36
  20. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
  21. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +2 -0
  22. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
  23. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +35 -31
  24. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
  25. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +31 -25
  26. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
  27. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +43 -35
  28. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
  29. package/dist/timecampus/pages/focus-score/FocusScorePage.js +55 -51
  30. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
  31. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +32 -28
  32. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
  33. package/dist/timecampus/pages/geofencing/GeofencingPage.js +32 -25
  34. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
  35. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +29 -25
  36. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
  37. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +32 -29
  38. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
  39. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +29 -25
  40. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
  41. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +39 -35
  42. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
  43. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +2 -0
  44. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
  45. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +33 -29
  46. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
  47. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +122 -104
  48. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
  49. package/dist/timecampus/pages/meetings/MeetingsPage.js +42 -32
  50. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
  51. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +2 -0
  52. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
  53. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +145 -114
  54. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
  55. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +49 -45
  56. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
  57. package/dist/timecampus/pages/projects/ProjectCreatePage.js +28 -24
  58. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
  59. package/dist/timecampus/pages/projects/ProjectDetailPage.js +109 -78
  60. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
  61. package/dist/timecampus/pages/projects/ProjectsPage.js +11 -7
  62. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
  63. package/dist/timecampus/pages/projects/TasksPage.js +40 -30
  64. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
  65. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +50 -46
  66. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
  67. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +18 -14
  68. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
  69. package/dist/timecampus/pages/team/TeamMembersPage.js +41 -35
  70. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
  71. package/dist/timecampus/pages/team/TeamPage.js +91 -61
  72. package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
  73. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +40 -36
  74. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
  75. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +33 -29
  76. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
  77. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +17 -13
  78. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
  79. package/dist/timecampus/pages/templates/TemplateDetailPage.js +67 -49
  80. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
  81. package/dist/timecampus/pages/templates/TemplatesPage.js +34 -31
  82. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
  83. package/dist/timecampus/pages/time/TimeEntriesPage.js +48 -39
  84. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
  85. package/dist/timecampus/pages/time/TimeTrackingPage.js +65 -64
  86. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
  87. package/dist/timecampus/pages/time/TimerPage.js +103 -69
  88. package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
  89. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +53 -49
  90. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
  91. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +65 -47
  92. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
  93. package/dist/timecampus/pages/widgets/WidgetsPage.js +38 -31
  94. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
  95. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +2 -0
  96. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
  97. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +35 -31
  98. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
  99. package/dist/timecampus/pages/workflows/WorkflowsPage.js +43 -33
  100. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
  101. package/package.json +2 -2
@@ -1,82 +1,112 @@
1
- import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
- import { StatCard as t } from "../../components/StatCard.js";
3
- import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
- import { useGetTimeEntryStatsQuery as r } from "../../../generated/wspace-operations.js";
5
- import { PageLayout as i } from "../../components/PageLayout.js";
6
- import { Clock as a, TrendingUp as o, Users as s } from "lucide-react";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
1
+ import { useTimeCampus as e, useTimeCampusNavigate as t } from "../../providers/TimeCampusProvider.js";
2
+ import { StatCard as n } from "../../components/StatCard.js";
3
+ import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
4
+ import { useGetTimeEntryStatsQuery as i } from "../../../generated/wspace-operations.js";
5
+ import { PageLayout as a } from "../../components/PageLayout.js";
6
+ import { Clock as o, TrendingUp as s, Users as c } from "lucide-react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { NextSteps as d } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/team/TeamPage.tsx
9
- function u() {
10
- let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = r({ skip: !u }), m = d?.timeEntryStats;
11
- if (f) return /* @__PURE__ */ c(i, {
10
+ function f() {
11
+ let { workspaceId: f = "" } = e(), p = t(), { data: m, loading: h, error: g } = i({ skip: !f }), _ = m?.timeEntryStats;
12
+ if (h) return /* @__PURE__ */ l(a, {
12
13
  title: "Team Overview",
13
14
  description: "Monitor team performance and activity",
14
- children: /* @__PURE__ */ c(n, {
15
+ children: /* @__PURE__ */ l(r, {
15
16
  variant: "card",
16
17
  count: 4
17
18
  })
18
19
  });
19
- if (p) return /* @__PURE__ */ c(i, {
20
+ if (g) return /* @__PURE__ */ l(a, {
20
21
  title: "Team Overview",
21
22
  description: "Monitor team performance and activity",
22
- children: /* @__PURE__ */ c("div", {
23
+ children: /* @__PURE__ */ l("div", {
23
24
  className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
24
25
  children: "Failed to load team data. Please try again later."
25
26
  })
26
27
  });
27
- let h = Math.floor(m?.totalHours ?? 0), g = Math.round(((m?.totalHours ?? 0) - h) * 60), _ = m?.totalHours ? Math.round((m.billableHours ?? 0) / m.totalHours * 100) : 0;
28
- return /* @__PURE__ */ l(i, {
28
+ let v = Math.floor(_?.totalHours ?? 0), y = Math.round(((_?.totalHours ?? 0) - v) * 60), b = _?.totalHours ? Math.round((_.billableHours ?? 0) / _.totalHours * 100) : 0;
29
+ return /* @__PURE__ */ u(a, {
29
30
  title: "Team Overview",
30
31
  description: "Monitor team performance and activity",
31
- children: [/* @__PURE__ */ l("div", {
32
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
33
- children: [
34
- /* @__PURE__ */ c(t, {
35
- title: "Total Entries",
36
- value: String(m?.totalEntries ?? 0),
37
- icon: /* @__PURE__ */ c(s, { className: "h-5 w-5" })
38
- }),
39
- /* @__PURE__ */ c(t, {
40
- title: "Active Timers",
41
- value: String(m?.activeTimers ?? 0),
42
- icon: /* @__PURE__ */ c(s, { className: "h-5 w-5" }),
43
- iconBgColor: "bg-status-success-bg text-status-success-text"
44
- }),
45
- /* @__PURE__ */ c(t, {
46
- title: "Total Hours",
47
- value: `${h}h ${g}m`,
48
- icon: /* @__PURE__ */ c(a, { className: "h-5 w-5" }),
49
- trend: {
50
- value: m?.billableHours ?? 0,
51
- label: "billable hours"
32
+ purpose: "See how your whole team is spending its time at a glance — who's active, how many hours are billable, and where capacity is going — so you can balance workload and catch problems early.",
33
+ children: [
34
+ /* @__PURE__ */ l(d, {
35
+ storageKey: "timecampus-team",
36
+ className: "mb-6",
37
+ steps: [
38
+ {
39
+ id: "members",
40
+ label: "Manage team members",
41
+ description: "Add people and check individual workloads.",
42
+ onClick: () => p("/team/members")
43
+ },
44
+ {
45
+ id: "analytics",
46
+ label: "Open team analytics",
47
+ description: "Compare utilisation and trends across the team.",
48
+ onClick: () => p("/team/analytics")
49
+ },
50
+ {
51
+ id: "activity",
52
+ label: "Watch live team activity",
53
+ description: "See what people are working on right now.",
54
+ onClick: () => p("/team-activity")
52
55
  }
53
- }),
54
- /* @__PURE__ */ c(t, {
55
- title: "Billable Rate",
56
- value: `${_}%`,
57
- icon: /* @__PURE__ */ c(o, { className: "h-5 w-5" }),
58
- trend: {
59
- value: _,
60
- label: "of total hours"
61
- }
62
- })
63
- ]
64
- }), /* @__PURE__ */ l("div", {
65
- className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
66
- children: [/* @__PURE__ */ c("h3", {
67
- className: "mb-4 text-sm font-semibold text-text-primary",
68
- children: "Team Activity Feed"
69
- }), /* @__PURE__ */ c("div", {
70
- className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
71
- children: /* @__PURE__ */ c("p", {
72
- className: "text-sm text-text-secondary",
73
- children: "Team activity timeline will render here"
74
- })
75
- })]
76
- })]
56
+ ]
57
+ }),
58
+ /* @__PURE__ */ u("div", {
59
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
60
+ children: [
61
+ /* @__PURE__ */ l(n, {
62
+ featured: !0,
63
+ title: "Total Entries",
64
+ value: String(_?.totalEntries ?? 0),
65
+ icon: /* @__PURE__ */ l(c, { className: "h-5 w-5" })
66
+ }),
67
+ /* @__PURE__ */ l(n, {
68
+ title: "Active Timers",
69
+ value: String(_?.activeTimers ?? 0),
70
+ icon: /* @__PURE__ */ l(c, { className: "h-5 w-5" }),
71
+ iconBgColor: "bg-status-success-bg text-status-success-text"
72
+ }),
73
+ /* @__PURE__ */ l(n, {
74
+ title: "Total Hours",
75
+ value: `${v}h ${y}m`,
76
+ icon: /* @__PURE__ */ l(o, { className: "h-5 w-5" }),
77
+ trend: {
78
+ value: _?.billableHours ?? 0,
79
+ label: "billable hours"
80
+ }
81
+ }),
82
+ /* @__PURE__ */ l(n, {
83
+ title: "Billable Rate",
84
+ value: `${b}%`,
85
+ icon: /* @__PURE__ */ l(s, { className: "h-5 w-5" }),
86
+ trend: {
87
+ value: b,
88
+ label: "of total hours"
89
+ }
90
+ })
91
+ ]
92
+ }),
93
+ /* @__PURE__ */ u("div", {
94
+ className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
95
+ children: [/* @__PURE__ */ l("h3", {
96
+ className: "mb-4 text-sm font-semibold text-text-primary",
97
+ children: "Team Activity Feed"
98
+ }), /* @__PURE__ */ l("div", {
99
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
100
+ children: /* @__PURE__ */ l("p", {
101
+ className: "text-sm text-text-secondary",
102
+ children: "Team activity timeline will render here"
103
+ })
104
+ })]
105
+ })
106
+ ]
77
107
  });
78
108
  }
79
109
  //#endregion
80
- export { u as TeamPage };
110
+ export { f as TeamPage };
81
111
 
82
112
  //# sourceMappingURL=TeamPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamPage.js","names":[],"sources":["../../../../src/timecampus/pages/team/TeamPage.tsx"],"sourcesContent":["import { Users, Clock, TrendingUp } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetTimeEntryStatsQuery } from \"@/generated/wspace-operations\";\n\nexport function TeamPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const stats = data?.timeEntryStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load team data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalH = Math.floor(stats?.totalHours ?? 0);\n const totalM = Math.round(((stats?.totalHours ?? 0) - totalH) * 60);\n const billablePercent = stats?.totalHours\n ? Math.round(((stats.billableHours ?? 0) / stats.totalHours) * 100)\n : 0;\n\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n <StatCard\n title=\"Total Hours\"\n value={`${totalH}h ${totalM}m`}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{ value: stats?.billableHours ?? 0, label: \"billable hours\" }}\n />\n <StatCard\n title=\"Billable Rate\"\n value={`${billablePercent}%`}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trend={{ value: billablePercent, label: \"of total hours\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Team Activity Feed\n </h3>\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 Team activity timeline will render here\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAAW;CACzB,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA0B,EACzD,MAAM,CAAC,GACR,CAAC,EAEI,IAAQ,GAAM;AAEpB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA;CAIjB,IAAM,IAAS,KAAK,MAAM,GAAO,cAAc,EAAE,EAC3C,IAAS,KAAK,QAAQ,GAAO,cAAc,KAAK,KAAU,GAAG,EAC7D,IAAkB,GAAO,aAC3B,KAAK,OAAQ,EAAM,iBAAiB,KAAK,EAAM,aAAc,IAAI,GACjE;AAEJ,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAO,IAAI,EAAO;KAC5B,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAkB;KACpE,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAgB;KAC1B,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,OAAO;MAAE,OAAO;MAAiB,OAAO;MAAkB;KAC1D,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAExD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA;IACA,CAAA,CACF;KACK"}
1
+ {"version":3,"file":"TeamPage.js","names":[],"sources":["../../../../src/timecampus/pages/team/TeamPage.tsx"],"sourcesContent":["import { Users, Clock, TrendingUp } from \"lucide-react\";\nimport { NextSteps } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport {\n useTimeCampus,\n useTimeCampusNavigate,\n} from \"../../providers/TimeCampusProvider\";\nimport { useGetTimeEntryStatsQuery } from \"@/generated/wspace-operations\";\n\nexport function TeamPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const navigate = useTimeCampusNavigate();\n\n const { data, loading, error } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const stats = data?.timeEntryStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load team data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalH = Math.floor(stats?.totalHours ?? 0);\n const totalM = Math.round(((stats?.totalHours ?? 0) - totalH) * 60);\n const billablePercent = stats?.totalHours\n ? Math.round(((stats.billableHours ?? 0) / stats.totalHours) * 100)\n : 0;\n\n return (\n <PageLayout\n title=\"Team Overview\"\n description=\"Monitor team performance and activity\"\n purpose=\"See how your whole team is spending its time at a glance — who's active, how many hours are billable, and where capacity is going — so you can balance workload and catch problems early.\"\n >\n <NextSteps\n storageKey=\"timecampus-team\"\n className=\"mb-6\"\n steps={[\n {\n id: \"members\",\n label: \"Manage team members\",\n description: \"Add people and check individual workloads.\",\n onClick: () => navigate(\"/team/members\"),\n },\n {\n id: \"analytics\",\n label: \"Open team analytics\",\n description: \"Compare utilisation and trends across the team.\",\n onClick: () => navigate(\"/team/analytics\"),\n },\n {\n id: \"activity\",\n label: \"Watch live team activity\",\n description: \"See what people are working on right now.\",\n onClick: () => navigate(\"/team-activity\"),\n },\n ]}\n />\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n <StatCard\n title=\"Total Hours\"\n value={`${totalH}h ${totalM}m`}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{ value: stats?.billableHours ?? 0, label: \"billable hours\" }}\n />\n <StatCard\n title=\"Billable Rate\"\n value={`${billablePercent}%`}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trend={{ value: billablePercent, label: \"of total hours\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Team Activity Feed\n </h3>\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 Team activity timeline will render here\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,IAAW;CACzB,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAA0B,EACzD,MAAM,CAAC,GACR,CAAC,EAEI,IAAQ,GAAM;AAEpB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA;CAIjB,IAAM,IAAS,KAAK,MAAM,GAAO,cAAc,EAAE,EAC3C,IAAS,KAAK,QAAQ,GAAO,cAAc,KAAK,KAAU,GAAG,EAC7D,IAAkB,GAAO,aAC3B,KAAK,OAAQ,EAAM,iBAAiB,KAAK,EAAM,aAAc,IAAI,GACjE;AAEJ,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAHV;GAKE,kBAAC,GAAD;IACE,YAAW;IACX,WAAU;IACV,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,gBAAgB;MACzC;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,kBAAkB;MAC3C;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,iBAAiB;MAC1C;KACF;IACD,CAAA;GACF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MACE,UAAA;MACA,OAAM;MACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;MACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,CAAA;KACF,kBAAC,GAAD;MACE,OAAM;MACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;MACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,aAAY;MACZ,CAAA;KACF,kBAAC,GAAD;MACE,OAAM;MACN,OAAO,GAAG,EAAO,IAAI,EAAO;MAC5B,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;MACnC,OAAO;OAAE,OAAO,GAAO,iBAAiB;OAAG,OAAO;OAAkB;MACpE,CAAA;KACF,kBAAC,GAAD;MACE,OAAM;MACN,OAAO,GAAG,EAAgB;MAC1B,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;MACxC,OAAO;OAAE,OAAO;OAAiB,OAAO;OAAkB;MAC1D,CAAA;KACE;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAExD,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KACA,CAAA,CACF;;GACK"}
@@ -4,83 +4,87 @@ import { StatCard as n } from "../../components/StatCard.js";
4
4
  import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
5
  import { useGetTimeEntryStatsQuery as i, useListWorkPatternsQuery as a } from "../../../generated/wspace-operations.js";
6
6
  import { PageLayout as o } from "../../components/PageLayout.js";
7
- import { Activity as s, CheckCircle as c, Clock as l, Users as u } from "lucide-react";
8
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
+ import { EmptyState as s } from "../../components/EmptyState.js";
8
+ import { Activity as c, CheckCircle as l, Clock as u, Users as d } from "lucide-react";
9
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
10
  //#region src/timecampus/pages/team-activity/TeamActivityPage.tsx
10
- function p() {
11
- let { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } = i(), { data: _, loading: v, error: y } = a({ variables: { limit: 10 } }), b = m?.timeEntryStats, x = _?.workPatterns ?? [];
12
- return h && v ? /* @__PURE__ */ d(o, {
11
+ function m() {
12
+ let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = i(), { data: v, loading: y, error: b } = a({ variables: { limit: 10 } }), x = h?.timeEntryStats, S = v?.workPatterns ?? [];
13
+ return g && y ? /* @__PURE__ */ f(o, {
13
14
  title: "Team Activity",
14
15
  description: "Real-time team activity feed",
15
- children: /* @__PURE__ */ d(r, {
16
+ children: /* @__PURE__ */ f(r, {
16
17
  variant: "list",
17
18
  count: 5
18
19
  })
19
- }) : g && y ? /* @__PURE__ */ d(o, {
20
+ }) : _ && b ? /* @__PURE__ */ f(o, {
20
21
  title: "Team Activity",
21
22
  description: "Real-time team activity feed",
22
- children: /* @__PURE__ */ d("div", {
23
+ children: /* @__PURE__ */ f("div", {
23
24
  className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
24
25
  children: "Failed to load team activity data. Please try again later."
25
26
  })
26
- }) : /* @__PURE__ */ f(o, {
27
+ }) : /* @__PURE__ */ p(o, {
27
28
  title: "Team Activity",
28
29
  description: "Real-time team activity feed",
29
- children: [/* @__PURE__ */ f("div", {
30
+ purpose: "A live pulse of what your team is doing right now — who's tracking, recent deep-work sessions, and today's hours — so you stay connected to the team's progress without interrupting anyone.",
31
+ children: [/* @__PURE__ */ p("div", {
30
32
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
31
33
  children: [
32
- /* @__PURE__ */ d(n, {
34
+ /* @__PURE__ */ f(n, {
35
+ featured: !0,
33
36
  title: "Active Timers",
34
- value: String(b?.activeTimers ?? 0),
35
- icon: /* @__PURE__ */ d(u, { className: "h-5 w-5" })
37
+ value: String(x?.activeTimers ?? 0),
38
+ icon: /* @__PURE__ */ f(d, { className: "h-5 w-5" })
36
39
  }),
37
- /* @__PURE__ */ d(n, {
40
+ /* @__PURE__ */ f(n, {
38
41
  title: "Total Entries",
39
- value: String(b?.totalEntries ?? 0),
40
- icon: /* @__PURE__ */ d(c, { className: "h-5 w-5" }),
42
+ value: String(x?.totalEntries ?? 0),
43
+ icon: /* @__PURE__ */ f(l, { className: "h-5 w-5" }),
41
44
  description: "Today"
42
45
  }),
43
- /* @__PURE__ */ d(n, {
46
+ /* @__PURE__ */ f(n, {
44
47
  title: "Team Hours",
45
- value: `${Math.round(b?.totalHours ?? 0)}h`,
46
- icon: /* @__PURE__ */ d(l, { className: "h-5 w-5" }),
48
+ value: `${Math.round(x?.totalHours ?? 0)}h`,
49
+ icon: /* @__PURE__ */ f(u, { className: "h-5 w-5" }),
47
50
  description: "Total tracked"
48
51
  }),
49
- /* @__PURE__ */ d(n, {
52
+ /* @__PURE__ */ f(n, {
50
53
  title: "Billable Hours",
51
- value: `${Math.round(b?.billableHours ?? 0)}h`,
52
- icon: /* @__PURE__ */ d(s, { className: "h-5 w-5" }),
54
+ value: `${Math.round(x?.billableHours ?? 0)}h`,
55
+ icon: /* @__PURE__ */ f(c, { className: "h-5 w-5" }),
53
56
  iconBgColor: "bg-status-success-bg text-status-success-text"
54
57
  })
55
58
  ]
56
- }), /* @__PURE__ */ f("div", {
59
+ }), /* @__PURE__ */ p("div", {
57
60
  className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
58
- children: [/* @__PURE__ */ d("h3", {
61
+ children: [/* @__PURE__ */ f("h3", {
59
62
  className: "mb-4 text-sm font-semibold text-text-primary",
60
63
  children: "Activity Feed"
61
- }), /* @__PURE__ */ f("div", {
64
+ }), /* @__PURE__ */ p("div", {
62
65
  className: "space-y-4",
63
- children: [x.length === 0 && !v && /* @__PURE__ */ d("div", {
64
- className: "text-center text-sm text-text-secondary",
65
- children: "No recent activity data available."
66
- }), x.map((e) => /* @__PURE__ */ f("div", {
66
+ children: [S.length === 0 && !y && /* @__PURE__ */ f(s, {
67
+ illustration: "empty-notifications",
68
+ title: "No recent activity yet",
69
+ description: "As your team tracks time and completes focus sessions, their activity will stream in here."
70
+ }), S.map((e) => /* @__PURE__ */ p("div", {
67
71
  className: "flex items-start gap-3",
68
- children: [/* @__PURE__ */ d("div", {
72
+ children: [/* @__PURE__ */ f("div", {
69
73
  className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10",
70
- children: /* @__PURE__ */ d(s, { className: "h-4 w-4 text-primary" })
71
- }), /* @__PURE__ */ f("div", {
74
+ children: /* @__PURE__ */ f(c, { className: "h-4 w-4 text-primary" })
75
+ }), /* @__PURE__ */ p("div", {
72
76
  className: "flex-1",
73
- children: [/* @__PURE__ */ f("p", {
77
+ children: [/* @__PURE__ */ p("p", {
74
78
  className: "text-sm text-text-primary",
75
79
  children: [
76
- /* @__PURE__ */ d("span", {
80
+ /* @__PURE__ */ f("span", {
77
81
  className: "font-medium",
78
82
  children: e.userId
79
83
  }),
80
84
  " ",
81
85
  e.deepWorkSessions > 0 ? "Completed deep work session" : "Logged work pattern"
82
86
  ]
83
- }), /* @__PURE__ */ f("p", {
87
+ }), /* @__PURE__ */ p("p", {
84
88
  className: "text-xs text-text-secondary",
85
89
  children: [
86
90
  e.focusHours.toFixed(1),
@@ -102,6 +106,6 @@ function p() {
102
106
  });
103
107
  }
104
108
  //#endregion
105
- export { p as TeamActivityPage };
109
+ export { m as TeamActivityPage };
106
110
 
107
111
  //# sourceMappingURL=TeamActivityPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamActivityPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"sourcesContent":["import { Activity, Users, Clock, CheckCircle } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatRelativeTime } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListWorkPatternsQuery,\n type WorkPatternFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TeamActivityPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery();\n const {\n data: patternsData,\n loading: patternsLoading,\n error: patternsError,\n } = useListWorkPatternsQuery({ variables: { limit: 10 } });\n\n const stats = statsData?.timeEntryStats;\n const patterns = patternsData?.workPatterns ?? [];\n\n if (statsLoading && patternsLoading) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (statsError && patternsError) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load team activity data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<CheckCircle className=\"h-5 w-5\" />}\n description=\"Today\"\n />\n <StatCard\n title=\"Team Hours\"\n value={`${Math.round(stats?.totalHours ?? 0)}h`}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"Total tracked\"\n />\n <StatCard\n title=\"Billable Hours\"\n value={`${Math.round(stats?.billableHours ?? 0)}h`}\n icon={<Activity className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Activity Feed\n </h3>\n <div className=\"space-y-4\">\n {patterns.length === 0 && !patternsLoading && (\n <div className=\"text-center text-sm text-text-secondary\">\n No recent activity data available.\n </div>\n )}\n {patterns.map((pattern: WorkPatternFieldsFragment) => (\n <div key={pattern.id} className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10\">\n <Activity className=\"h-4 w-4 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm text-text-primary\">\n <span className=\"font-medium\">{pattern.userId}</span>{\" \"}\n {pattern.deepWorkSessions > 0\n ? \"Completed deep work session\"\n : \"Logged work pattern\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {pattern.focusHours.toFixed(1)}h focus &middot;{\" \"}\n {pattern.meetingHours.toFixed(1)}h meetings &middot;{\" \"}\n {pattern.productivityScore\n ? `${pattern.productivityScore}% productivity`\n : pattern.date}{\" \"}\n &middot; {formatRelativeTime(pattern.createdAt)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAYA,SAAgB,IAAmB;CACjC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA2B,EACzB,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAyB,EAAE,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC,EAEpD,IAAQ,GAAW,gBACnB,IAAW,GAAc,gBAAgB,EAAE;AA0BjD,QAxBI,KAAgB,IAEhB,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,KAAc,IAEd,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;KACzC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,KAAK,MAAM,GAAO,cAAc,EAAE,CAAC;KAC7C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,KAAK,MAAM,GAAO,iBAAiB,EAAE,CAAC;KAChD,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KACtC,aAAY;KACZ,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAExD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAS,WAAW,KAAK,CAAC,KACzB,kBAAC,OAAD;KAAK,WAAU;eAA0C;KAEnD,CAAA,EAEP,EAAS,KAAK,MACb,kBAAC,OAAD;KAAsB,WAAU;eAAhC,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;MACzC,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAe,EAAQ;SAAc,CAAA;QAAC;QACrD,EAAQ,mBAAmB,IACxB,gCACA;QACF;UACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAQ,WAAW,QAAQ,EAAE;QAAC;QAAiB;QAC/C,EAAQ,aAAa,QAAQ,EAAE;QAAC;QAAoB;QACpD,EAAQ,oBACL,GAAG,EAAQ,kBAAkB,kBAC7B,EAAQ;QAAM;QAAI;QACZ,EAAmB,EAAQ,UAAU;QAC7C;SACA;QACF;OApBI,EAAQ,GAoBZ,CACN,CACE;MACF;KACK"}
1
+ {"version":3,"file":"TeamActivityPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"sourcesContent":["import { Activity, Users, Clock, CheckCircle } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatRelativeTime } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListWorkPatternsQuery,\n type WorkPatternFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TeamActivityPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery();\n const {\n data: patternsData,\n loading: patternsLoading,\n error: patternsError,\n } = useListWorkPatternsQuery({ variables: { limit: 10 } });\n\n const stats = statsData?.timeEntryStats;\n const patterns = patternsData?.workPatterns ?? [];\n\n if (statsLoading && patternsLoading) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (statsError && patternsError) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load team activity data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n purpose=\"A live pulse of what your team is doing right now — who's tracking, recent deep-work sessions, and today's hours — so you stay connected to the team's progress without interrupting anyone.\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<CheckCircle className=\"h-5 w-5\" />}\n description=\"Today\"\n />\n <StatCard\n title=\"Team Hours\"\n value={`${Math.round(stats?.totalHours ?? 0)}h`}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"Total tracked\"\n />\n <StatCard\n title=\"Billable Hours\"\n value={`${Math.round(stats?.billableHours ?? 0)}h`}\n icon={<Activity className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Activity Feed\n </h3>\n <div className=\"space-y-4\">\n {patterns.length === 0 && !patternsLoading && (\n <EmptyState\n illustration=\"empty-notifications\"\n title=\"No recent activity yet\"\n description=\"As your team tracks time and completes focus sessions, their activity will stream in here.\"\n />\n )}\n {patterns.map((pattern: WorkPatternFieldsFragment) => (\n <div key={pattern.id} className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10\">\n <Activity className=\"h-4 w-4 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm text-text-primary\">\n <span className=\"font-medium\">{pattern.userId}</span>{\" \"}\n {pattern.deepWorkSessions > 0\n ? \"Completed deep work session\"\n : \"Logged work pattern\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {pattern.focusHours.toFixed(1)}h focus &middot;{\" \"}\n {pattern.meetingHours.toFixed(1)}h meetings &middot;{\" \"}\n {pattern.productivityScore\n ? `${pattern.productivityScore}% productivity`\n : pattern.date}{\" \"}\n &middot; {formatRelativeTime(pattern.createdAt)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAmB;CACjC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA2B,EACzB,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAyB,EAAE,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC,EAEpD,IAAQ,GAAW,gBACnB,IAAW,GAAc,gBAAgB,EAAE;AA0BjD,QAxBI,KAAgB,IAEhB,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,KAAc,IAEd,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAHV,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,UAAA;KACA,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;KACzC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,KAAK,MAAM,GAAO,cAAc,EAAE,CAAC;KAC7C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,KAAK,MAAM,GAAO,iBAAiB,EAAE,CAAC;KAChD,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KACtC,aAAY;KACZ,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAExD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAS,WAAW,KAAK,CAAC,KACzB,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA,EAEH,EAAS,KAAK,MACb,kBAAC,OAAD;KAAsB,WAAU;eAAhC,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;MACzC,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAe,EAAQ;SAAc,CAAA;QAAC;QACrD,EAAQ,mBAAmB,IACxB,gCACA;QACF;UACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAQ,WAAW,QAAQ,EAAE;QAAC;QAAiB;QAC/C,EAAQ,aAAa,QAAQ,EAAE;QAAC;QAAoB;QACpD,EAAQ,oBACL,GAAG,EAAQ,kBAAkB,kBAC7B,EAAQ;QAAM;QAAI;QACZ,EAAmB,EAAQ,UAAU;QAC7C;SACA;QACF;OApBI,EAAQ,GAoBZ,CACN,CACE;MACF;KACK"}
@@ -5,22 +5,23 @@ import { PageLayout as i } from "../../components/PageLayout.js";
5
5
  import { useEffect as a, useState as o } from "react";
6
6
  import { Settings as s } from "lucide-react";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ import { GlassCard as u } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/team-activity/TeamActivitySettingsPage.tsx
9
- var u = "team-activity.settings";
10
- function d() {
11
- let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = n({ variables: { key: u } }), [h, { loading: g }] = r(), _ = f?.configurationByKey?.value ?? {}, [v, y] = o(!0), [b, x] = o(!0), [S, C] = o(!0), [w, T] = o(!0);
10
+ var d = "team-activity.settings";
11
+ function f() {
12
+ let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = n({ variables: { key: d } }), [g, { loading: _ }] = r(), v = p?.configurationByKey?.value ?? {}, [y, b] = o(!0), [x, S] = o(!0), [C, w] = o(!0), [T, E] = o(!0);
12
13
  return a(() => {
13
- _ && (y(_.showTimerEvents ?? !0), x(_.showTaskCompletions ?? !0), C(_.showCheckIns ?? !0), T(_.realTimeUpdates ?? !0));
14
+ v && (b(v.showTimerEvents ?? !0), S(v.showTaskCompletions ?? !0), w(v.showCheckIns ?? !0), E(v.realTimeUpdates ?? !0));
14
15
  }, [
15
- _.showTimerEvents,
16
- _.showTaskCompletions,
17
- _.showCheckIns,
18
- _.realTimeUpdates
19
- ]), p ? /* @__PURE__ */ c(i, {
16
+ v.showTimerEvents,
17
+ v.showTaskCompletions,
18
+ v.showCheckIns,
19
+ v.realTimeUpdates
20
+ ]), m ? /* @__PURE__ */ c(i, {
20
21
  title: "Team Activity Settings",
21
22
  description: "Configure team activity tracking",
22
23
  children: /* @__PURE__ */ c(t, { variant: "detail" })
23
- }) : m ? /* @__PURE__ */ c(i, {
24
+ }) : h ? /* @__PURE__ */ c(i, {
24
25
  title: "Team Activity Settings",
25
26
  description: "Configure team activity tracking",
26
27
  children: /* @__PURE__ */ c("div", {
@@ -30,10 +31,13 @@ function d() {
30
31
  }) : /* @__PURE__ */ c(i, {
31
32
  title: "Team Activity Settings",
32
33
  description: "Configure team activity tracking",
34
+ purpose: "Tune the team activity feed so it shows what matters and nothing more — pick which events appear and whether updates stream live — keeping the team informed without it becoming noise.",
33
35
  children: /* @__PURE__ */ l("div", {
34
36
  className: "mx-auto max-w-2xl space-y-6",
35
- children: [/* @__PURE__ */ l("div", {
36
- className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
37
+ children: [/* @__PURE__ */ l(u, {
38
+ treatment: "glass",
39
+ glow: !0,
40
+ className: "p-6",
37
41
  children: [/* @__PURE__ */ l("h3", {
38
42
  className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
39
43
  children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Activity Feed Settings"]
@@ -47,8 +51,8 @@ function d() {
47
51
  children: "Show timer events"
48
52
  }), /* @__PURE__ */ c("input", {
49
53
  type: "checkbox",
50
- checked: v,
51
- onChange: (e) => y(e.target.checked),
54
+ checked: y,
55
+ onChange: (e) => b(e.target.checked),
52
56
  className: "h-4 w-4 rounded border-border-subtle"
53
57
  })]
54
58
  }),
@@ -59,8 +63,8 @@ function d() {
59
63
  children: "Show task completions"
60
64
  }), /* @__PURE__ */ c("input", {
61
65
  type: "checkbox",
62
- checked: b,
63
- onChange: (e) => x(e.target.checked),
66
+ checked: x,
67
+ onChange: (e) => S(e.target.checked),
64
68
  className: "h-4 w-4 rounded border-border-subtle"
65
69
  })]
66
70
  }),
@@ -71,8 +75,8 @@ function d() {
71
75
  children: "Show check-ins"
72
76
  }), /* @__PURE__ */ c("input", {
73
77
  type: "checkbox",
74
- checked: S,
75
- onChange: (e) => C(e.target.checked),
78
+ checked: C,
79
+ onChange: (e) => w(e.target.checked),
76
80
  className: "h-4 w-4 rounded border-border-subtle"
77
81
  })]
78
82
  }),
@@ -83,8 +87,8 @@ function d() {
83
87
  children: "Real-time updates"
84
88
  }), /* @__PURE__ */ c("input", {
85
89
  type: "checkbox",
86
- checked: w,
87
- onChange: (e) => T(e.target.checked),
90
+ checked: T,
91
+ onChange: (e) => E(e.target.checked),
88
92
  className: "h-4 w-4 rounded border-border-subtle"
89
93
  })]
90
94
  })
@@ -94,27 +98,27 @@ function d() {
94
98
  className: "flex justify-end",
95
99
  children: /* @__PURE__ */ c("button", {
96
100
  onClick: async () => {
97
- await h({ variables: { input: {
98
- key: u,
101
+ await g({ variables: { input: {
102
+ key: d,
99
103
  value: {
100
- showTimerEvents: v,
101
- showTaskCompletions: b,
102
- showCheckIns: S,
103
- realTimeUpdates: w
104
+ showTimerEvents: y,
105
+ showTaskCompletions: x,
106
+ showCheckIns: C,
107
+ realTimeUpdates: T
104
108
  },
105
109
  description: "Team activity feed settings",
106
110
  scope: "USER"
107
111
  } } });
108
112
  },
109
- disabled: g,
113
+ disabled: _,
110
114
  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 disabled:opacity-50",
111
- children: g ? "Saving..." : "Save Settings"
115
+ children: _ ? "Saving..." : "Save Settings"
112
116
  })
113
117
  })]
114
118
  })
115
119
  });
116
120
  }
117
121
  //#endregion
118
- export { d as TeamActivitySettingsPage };
122
+ export { f as TeamActivitySettingsPage };
119
123
 
120
124
  //# sourceMappingURL=TeamActivitySettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamActivitySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivitySettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"team-activity.settings\";\n\nexport function TeamActivitySettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [showTimerEvents, setShowTimerEvents] = useState(true);\n const [showTaskCompletions, setShowTaskCompletions] = useState(true);\n const [showCheckIns, setShowCheckIns] = useState(true);\n const [realTimeUpdates, setRealTimeUpdates] = useState(true);\n\n useEffect(() => {\n if (configValue) {\n setShowTimerEvents(configValue.showTimerEvents ?? true);\n setShowTaskCompletions(configValue.showTaskCompletions ?? true);\n setShowCheckIns(configValue.showCheckIns ?? true);\n setRealTimeUpdates(configValue.realTimeUpdates ?? true);\n }\n }, [\n configValue.showTimerEvents,\n configValue.showTaskCompletions,\n configValue.showCheckIns,\n configValue.realTimeUpdates,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: {\n showTimerEvents,\n showTaskCompletions,\n showCheckIns,\n realTimeUpdates,\n },\n description: \"Team activity feed settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load activity settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Activity Feed Settings\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Show timer events\n </span>\n <input\n type=\"checkbox\"\n checked={showTimerEvents}\n onChange={(e) => setShowTimerEvents(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Show task completions\n </span>\n <input\n type=\"checkbox\"\n checked={showTaskCompletions}\n onChange={(e) => setShowTaskCompletions(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Show check-ins</span>\n <input\n type=\"checkbox\"\n checked={showCheckIns}\n onChange={(e) => setShowCheckIns(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Real-time updates\n </span>\n <input\n type=\"checkbox\"\n checked={realTimeUpdates}\n onChange={(e) => setRealTimeUpdates(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n 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 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,IAAM,IAAa;AAEnB,SAAgB,IAA2B;CACzC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAiB,KAAsB,EAAS,GAAK,EACtD,CAAC,GAAqB,KAA0B,EAAS,GAAK,EAC9D,CAAC,GAAc,KAAmB,EAAS,GAAK,EAChD,CAAC,GAAiB,KAAsB,EAAS,GAAK;AA0D5D,QAxDA,QAAgB;AACd,EAAI,MACF,EAAmB,EAAY,mBAAmB,GAAK,EACvD,EAAuB,EAAY,uBAAuB,GAAK,EAC/D,EAAgB,EAAY,gBAAgB,GAAK,EACjD,EAAmB,EAAY,mBAAmB,GAAK;IAExD;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAoBE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,yBAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAuB,EAAE,OAAO,QAAQ;QACzD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAqB,CAAA,EACjE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SApGS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QACL;QACA;QACA;QACA;QACD;OACD,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KAsFM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
1
+ {"version":3,"file":"TeamActivitySettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivitySettingsPage.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetConfigurationByKeyQuery,\n useSetConfigurationMutation,\n} from \"@/generated/wspace-operations\";\n\nconst CONFIG_KEY = \"team-activity.settings\";\n\nexport function TeamActivitySettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationByKeyQuery({\n variables: { key: CONFIG_KEY },\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n\n const configValue = (data?.configurationByKey?.value ?? {}) as Record<\n string,\n boolean\n >;\n\n const [showTimerEvents, setShowTimerEvents] = useState(true);\n const [showTaskCompletions, setShowTaskCompletions] = useState(true);\n const [showCheckIns, setShowCheckIns] = useState(true);\n const [realTimeUpdates, setRealTimeUpdates] = useState(true);\n\n useEffect(() => {\n if (configValue) {\n setShowTimerEvents(configValue.showTimerEvents ?? true);\n setShowTaskCompletions(configValue.showTaskCompletions ?? true);\n setShowCheckIns(configValue.showCheckIns ?? true);\n setRealTimeUpdates(configValue.realTimeUpdates ?? true);\n }\n }, [\n configValue.showTimerEvents,\n configValue.showTaskCompletions,\n configValue.showCheckIns,\n configValue.realTimeUpdates,\n ]);\n\n const handleSave = async () => {\n await setConfiguration({\n variables: {\n input: {\n key: CONFIG_KEY,\n value: {\n showTimerEvents,\n showTaskCompletions,\n showCheckIns,\n realTimeUpdates,\n },\n description: \"Team activity feed settings\",\n scope: \"USER\" as never,\n },\n },\n });\n };\n\n if (loading) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load activity settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Team Activity Settings\"\n description=\"Configure team activity tracking\"\n purpose=\"Tune the team activity feed so it shows what matters and nothing more — pick which events appear and whether updates stream live — keeping the team informed without it becoming noise.\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Activity Feed Settings\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Show timer events\n </span>\n <input\n type=\"checkbox\"\n checked={showTimerEvents}\n onChange={(e) => setShowTimerEvents(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Show task completions\n </span>\n <input\n type=\"checkbox\"\n checked={showTaskCompletions}\n onChange={(e) => setShowTaskCompletions(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">Show check-ins</span>\n <input\n type=\"checkbox\"\n checked={showCheckIns}\n onChange={(e) => setShowCheckIns(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Real-time updates\n </span>\n <input\n type=\"checkbox\"\n checked={realTimeUpdates}\n onChange={(e) => setRealTimeUpdates(e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </GlassCard>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n 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 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,IAAM,IAAa;AAEnB,SAAgB,IAA2B;CACzC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,WAAW,EAAE,KAAK,GAAY,EAC/B,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EAEvE,IAAe,GAAM,oBAAoB,SAAS,EAAE,EAKpD,CAAC,GAAiB,KAAsB,EAAS,GAAK,EACtD,CAAC,GAAqB,KAA0B,EAAS,GAAK,EAC9D,CAAC,GAAc,KAAmB,EAAS,GAAK,EAChD,CAAC,GAAiB,KAAsB,EAAS,GAAK;AA0D5D,QAxDA,QAAgB;AACd,EAAI,MACF,EAAmB,EAAY,mBAAmB,GAAK,EACvD,EAAuB,EAAY,uBAAuB,GAAK,EAC/D,EAAgB,EAAY,gBAAgB,GAAK,EACjD,EAAmB,EAAY,mBAAmB,GAAK;IAExD;EACD,EAAY;EACZ,EAAY;EACZ,EAAY;EACZ,EAAY;EACb,CAAC,EAoBE,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAER,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,yBAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAuB,EAAE,OAAO,QAAQ;QACzD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAAqB,CAAA,EACjE,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;QAClD,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS;QACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;QACrD,WAAU;QACV,CAAA,CACI;;MACJ;OACI;OACZ,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SArGS,YAAY;AAC7B,YAAM,EAAiB,EACrB,WAAW,EACT,OAAO;OACL,KAAK;OACL,OAAO;QACL;QACA;QACA;QACA;QACD;OACD,aAAa;OACb,OAAO;OACR,EACF,EACF,CAAC;;KAuFM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
@@ -5,12 +5,13 @@ import { PageLayout as r } from "../../components/PageLayout.js";
5
5
  import { CheckCircle as i, Loader2 as a, Sparkles as o } from "lucide-react";
6
6
  import { useParams as s } from "react-router-dom";
7
7
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ import { GlassCard as u } from "@burdenoff/fe-libs/ui";
8
9
  //#region src/timecampus/pages/templates/TemplateApplicationPage.tsx
9
- function u() {
10
- let { applicationId: u } = s(), { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = n({
11
- variables: { id: u ?? "" },
12
- skip: !u
13
- }), h = (f?.configuration?.value ?? {}).applicationSteps ?? [
10
+ function d() {
11
+ let { applicationId: d } = s(), { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = n({
12
+ variables: { id: d ?? "" },
13
+ skip: !d
14
+ }), g = (p?.configuration?.value ?? {}).applicationSteps ?? [
14
15
  {
15
16
  label: "Project structure",
16
17
  status: "pending"
@@ -32,24 +33,27 @@ function u() {
32
33
  status: "pending"
33
34
  }
34
35
  ];
35
- return p ? /* @__PURE__ */ c(r, {
36
+ return m ? /* @__PURE__ */ c(r, {
36
37
  title: "Applying Template",
37
38
  description: "Loading...",
38
39
  children: /* @__PURE__ */ c(t, { variant: "detail" })
39
- }) : m ? /* @__PURE__ */ c(r, {
40
+ }) : h ? /* @__PURE__ */ c(r, {
40
41
  title: "Applying Template",
41
- description: `Application ID: ${u}`,
42
+ description: `Application ID: ${d}`,
42
43
  children: /* @__PURE__ */ c("div", {
43
44
  className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
44
45
  children: "Failed to load template application data. Please try again later."
45
46
  })
46
47
  }) : /* @__PURE__ */ c(r, {
47
48
  title: "Applying Template",
48
- description: `Application ID: ${u}`,
49
+ description: `Application ID: ${d}`,
50
+ purpose: "Watch your chosen template build out your workspace step by step — projects, categories, roles, widgets and workflows — so you can see exactly what's being configured as it happens.",
49
51
  children: /* @__PURE__ */ c("div", {
50
52
  className: "mx-auto max-w-lg",
51
- children: /* @__PURE__ */ l("div", {
52
- className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6 text-center",
53
+ children: /* @__PURE__ */ l(u, {
54
+ treatment: "glass",
55
+ glow: !0,
56
+ className: "p-6 text-center",
53
57
  children: [
54
58
  /* @__PURE__ */ c("div", {
55
59
  className: "flex h-16 w-16 mx-auto items-center justify-center rounded-full bg-action-primary-bg/10",
@@ -65,7 +69,7 @@ function u() {
65
69
  }),
66
70
  /* @__PURE__ */ c("div", {
67
71
  className: "mt-6 space-y-3 text-left",
68
- children: h.map((e) => /* @__PURE__ */ l("div", {
72
+ children: g.map((e) => /* @__PURE__ */ l("div", {
69
73
  className: "flex items-center gap-3 rounded-lg border border-border-subtle p-3",
70
74
  children: [e.status === "completed" ? /* @__PURE__ */ c(i, { className: "h-5 w-5 text-status-success-text" }) : e.status === "in-progress" ? /* @__PURE__ */ c(a, { className: "h-5 w-5 text-primary animate-spin" }) : /* @__PURE__ */ c("div", { className: "h-5 w-5 rounded-full border-2 border-muted" }), /* @__PURE__ */ c("span", {
71
75
  className: `text-sm ${e.status === "completed" ? "text-text-secondary" : "text-text-primary"}`,
@@ -79,6 +83,6 @@ function u() {
79
83
  });
80
84
  }
81
85
  //#endregion
82
- export { u as TemplateApplicationPage };
86
+ export { d as TemplateApplicationPage };
83
87
 
84
88
  //# sourceMappingURL=TemplateApplicationPage.js.map