@burdenoff/microfe-timecampus 2026.510.104

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 (282) hide show
  1. package/README.md +12 -0
  2. package/dist/generated/global-operations.d.ts +2 -0
  3. package/dist/generated/global-operations.d.ts.map +1 -0
  4. package/dist/generated/global-types.d.ts +20716 -0
  5. package/dist/generated/global-types.d.ts.map +1 -0
  6. package/dist/generated/wspace-operations.d.ts +8527 -0
  7. package/dist/generated/wspace-operations.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.js +3913 -0
  9. package/dist/generated/wspace-operations.js.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +53363 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +6 -0
  15. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  16. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  17. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  18. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  19. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  20. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  21. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
  22. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  23. package/dist/timecampus/TimeCampusRoot.d.ts +5 -0
  24. package/dist/timecampus/TimeCampusRoot.d.ts.map +1 -0
  25. package/dist/timecampus/TimeCampusRoot.js +344 -0
  26. package/dist/timecampus/TimeCampusRoot.js.map +1 -0
  27. package/dist/timecampus/TimeCampusRoutes.d.ts +7 -0
  28. package/dist/timecampus/TimeCampusRoutes.d.ts.map +1 -0
  29. package/dist/timecampus/TimeCampusRoutes.js +227 -0
  30. package/dist/timecampus/TimeCampusRoutes.js.map +1 -0
  31. package/dist/timecampus/components/ChartCard.d.ts +19 -0
  32. package/dist/timecampus/components/ChartCard.d.ts.map +1 -0
  33. package/dist/timecampus/components/DataTable.d.ts +26 -0
  34. package/dist/timecampus/components/DataTable.d.ts.map +1 -0
  35. package/dist/timecampus/components/EmptyState.d.ts +12 -0
  36. package/dist/timecampus/components/EmptyState.d.ts.map +1 -0
  37. package/dist/timecampus/components/ErrorBoundary.d.ts +19 -0
  38. package/dist/timecampus/components/ErrorBoundary.d.ts.map +1 -0
  39. package/dist/timecampus/components/ErrorBoundary.js +52 -0
  40. package/dist/timecampus/components/ErrorBoundary.js.map +1 -0
  41. package/dist/timecampus/components/FilterBar.d.ts +26 -0
  42. package/dist/timecampus/components/FilterBar.d.ts.map +1 -0
  43. package/dist/timecampus/components/LoadingSkeleton.d.ts +10 -0
  44. package/dist/timecampus/components/LoadingSkeleton.d.ts.map +1 -0
  45. package/dist/timecampus/components/LoadingSkeleton.js +76 -0
  46. package/dist/timecampus/components/LoadingSkeleton.js.map +1 -0
  47. package/dist/timecampus/components/Modal.d.ts +14 -0
  48. package/dist/timecampus/components/Modal.d.ts.map +1 -0
  49. package/dist/timecampus/components/PageLayout.d.ts +12 -0
  50. package/dist/timecampus/components/PageLayout.d.ts.map +1 -0
  51. package/dist/timecampus/components/PageLayout.js +23 -0
  52. package/dist/timecampus/components/PageLayout.js.map +1 -0
  53. package/dist/timecampus/components/StatCard.d.ts +17 -0
  54. package/dist/timecampus/components/StatCard.d.ts.map +1 -0
  55. package/dist/timecampus/components/StatCard.js +48 -0
  56. package/dist/timecampus/components/StatCard.js.map +1 -0
  57. package/dist/timecampus/components/StatusBadge.d.ts +16 -0
  58. package/dist/timecampus/components/StatusBadge.d.ts.map +1 -0
  59. package/dist/timecampus/components/Toast.d.ts +28 -0
  60. package/dist/timecampus/components/Toast.d.ts.map +1 -0
  61. package/dist/timecampus/components/index.d.ts +14 -0
  62. package/dist/timecampus/components/index.d.ts.map +1 -0
  63. package/dist/timecampus/hooks/index.d.ts +7 -0
  64. package/dist/timecampus/hooks/index.d.ts.map +1 -0
  65. package/dist/timecampus/hooks/useToast.d.ts +17 -0
  66. package/dist/timecampus/hooks/useToast.d.ts.map +1 -0
  67. package/dist/timecampus/index.d.ts +10 -0
  68. package/dist/timecampus/index.d.ts.map +1 -0
  69. package/dist/timecampus/index.js +4 -0
  70. package/dist/timecampus/pages/HomePage.d.ts +4 -0
  71. package/dist/timecampus/pages/HomePage.d.ts.map +1 -0
  72. package/dist/timecampus/pages/HomePage.js +239 -0
  73. package/dist/timecampus/pages/HomePage.js.map +1 -0
  74. package/dist/timecampus/pages/applets/AppletStorePage.d.ts +2 -0
  75. package/dist/timecampus/pages/applets/AppletStorePage.d.ts.map +1 -0
  76. package/dist/timecampus/pages/applets/AppletStorePage.js +77 -0
  77. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -0
  78. package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts +2 -0
  79. package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts.map +1 -0
  80. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +83 -0
  81. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -0
  82. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts +2 -0
  83. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts.map +1 -0
  84. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +118 -0
  85. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -0
  86. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts +2 -0
  87. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts.map +1 -0
  88. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +129 -0
  89. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -0
  90. package/dist/timecampus/pages/channels/ChannelsPage.d.ts +2 -0
  91. package/dist/timecampus/pages/channels/ChannelsPage.d.ts.map +1 -0
  92. package/dist/timecampus/pages/channels/ChannelsPage.js +64 -0
  93. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -0
  94. package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts +2 -0
  95. package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts.map +1 -0
  96. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +108 -0
  97. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -0
  98. package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts +2 -0
  99. package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts.map +1 -0
  100. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +91 -0
  101. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -0
  102. package/dist/timecampus/pages/dashboard/ReportsPage.d.ts +2 -0
  103. package/dist/timecampus/pages/dashboard/ReportsPage.d.ts.map +1 -0
  104. package/dist/timecampus/pages/dashboard/ReportsPage.js +102 -0
  105. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -0
  106. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts +2 -0
  107. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts.map +1 -0
  108. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +73 -0
  109. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -0
  110. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts +2 -0
  111. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts.map +1 -0
  112. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +138 -0
  113. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -0
  114. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts +2 -0
  115. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts.map +1 -0
  116. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +71 -0
  117. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -0
  118. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts +2 -0
  119. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts.map +1 -0
  120. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +102 -0
  121. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -0
  122. package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts +2 -0
  123. package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts.map +1 -0
  124. package/dist/timecampus/pages/focus-score/FocusScorePage.js +131 -0
  125. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -0
  126. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts +2 -0
  127. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts.map +1 -0
  128. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +115 -0
  129. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -0
  130. package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts +2 -0
  131. package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts.map +1 -0
  132. package/dist/timecampus/pages/geofencing/GeofencingPage.js +70 -0
  133. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -0
  134. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts +2 -0
  135. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts.map +1 -0
  136. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +106 -0
  137. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -0
  138. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts +2 -0
  139. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts.map +1 -0
  140. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +77 -0
  141. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -0
  142. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts +2 -0
  143. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts.map +1 -0
  144. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +115 -0
  145. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -0
  146. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts +2 -0
  147. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts.map +1 -0
  148. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +97 -0
  149. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -0
  150. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts +2 -0
  151. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts.map +1 -0
  152. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +89 -0
  153. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -0
  154. package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts +2 -0
  155. package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts.map +1 -0
  156. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +101 -0
  157. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -0
  158. package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts +2 -0
  159. package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts.map +1 -0
  160. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +123 -0
  161. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -0
  162. package/dist/timecampus/pages/meetings/MeetingsPage.d.ts +2 -0
  163. package/dist/timecampus/pages/meetings/MeetingsPage.d.ts.map +1 -0
  164. package/dist/timecampus/pages/meetings/MeetingsPage.js +90 -0
  165. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -0
  166. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts +2 -0
  167. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts.map +1 -0
  168. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +113 -0
  169. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -0
  170. package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts +2 -0
  171. package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts.map +1 -0
  172. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +160 -0
  173. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -0
  174. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts +2 -0
  175. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts.map +1 -0
  176. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +176 -0
  177. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -0
  178. package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts +2 -0
  179. package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts.map +1 -0
  180. package/dist/timecampus/pages/projects/ProjectCreatePage.js +104 -0
  181. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -0
  182. package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts +2 -0
  183. package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts.map +1 -0
  184. package/dist/timecampus/pages/projects/ProjectDetailPage.js +91 -0
  185. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -0
  186. package/dist/timecampus/pages/projects/ProjectsPage.d.ts +2 -0
  187. package/dist/timecampus/pages/projects/ProjectsPage.d.ts.map +1 -0
  188. package/dist/timecampus/pages/projects/ProjectsPage.js +95 -0
  189. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -0
  190. package/dist/timecampus/pages/projects/TasksPage.d.ts +2 -0
  191. package/dist/timecampus/pages/projects/TasksPage.d.ts.map +1 -0
  192. package/dist/timecampus/pages/projects/TasksPage.js +73 -0
  193. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -0
  194. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts +2 -0
  195. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts.map +1 -0
  196. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +129 -0
  197. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -0
  198. package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts +2 -0
  199. package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts.map +1 -0
  200. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +78 -0
  201. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -0
  202. package/dist/timecampus/pages/team/TeamMembersPage.d.ts +2 -0
  203. package/dist/timecampus/pages/team/TeamMembersPage.d.ts.map +1 -0
  204. package/dist/timecampus/pages/team/TeamMembersPage.js +97 -0
  205. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -0
  206. package/dist/timecampus/pages/team/TeamPage.d.ts +2 -0
  207. package/dist/timecampus/pages/team/TeamPage.d.ts.map +1 -0
  208. package/dist/timecampus/pages/team/TeamPage.js +82 -0
  209. package/dist/timecampus/pages/team/TeamPage.js.map +1 -0
  210. package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts +2 -0
  211. package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts.map +1 -0
  212. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +107 -0
  213. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -0
  214. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts +2 -0
  215. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts.map +1 -0
  216. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +120 -0
  217. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -0
  218. package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts +2 -0
  219. package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts.map +1 -0
  220. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +84 -0
  221. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -0
  222. package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts +2 -0
  223. package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts.map +1 -0
  224. package/dist/timecampus/pages/templates/TemplateDetailPage.js +98 -0
  225. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -0
  226. package/dist/timecampus/pages/templates/TemplatesPage.d.ts +2 -0
  227. package/dist/timecampus/pages/templates/TemplatesPage.d.ts.map +1 -0
  228. package/dist/timecampus/pages/templates/TemplatesPage.js +76 -0
  229. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -0
  230. package/dist/timecampus/pages/time/TimeEntriesPage.d.ts +2 -0
  231. package/dist/timecampus/pages/time/TimeEntriesPage.d.ts.map +1 -0
  232. package/dist/timecampus/pages/time/TimeEntriesPage.js +117 -0
  233. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -0
  234. package/dist/timecampus/pages/time/TimeTrackingPage.d.ts +2 -0
  235. package/dist/timecampus/pages/time/TimeTrackingPage.d.ts.map +1 -0
  236. package/dist/timecampus/pages/time/TimeTrackingPage.js +112 -0
  237. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -0
  238. package/dist/timecampus/pages/time/TimerPage.d.ts +2 -0
  239. package/dist/timecampus/pages/time/TimerPage.d.ts.map +1 -0
  240. package/dist/timecampus/pages/time/TimerPage.js +80 -0
  241. package/dist/timecampus/pages/time/TimerPage.js.map +1 -0
  242. package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts +2 -0
  243. package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts.map +1 -0
  244. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +130 -0
  245. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -0
  246. package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts +2 -0
  247. package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts.map +1 -0
  248. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +96 -0
  249. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -0
  250. package/dist/timecampus/pages/widgets/WidgetsPage.d.ts +2 -0
  251. package/dist/timecampus/pages/widgets/WidgetsPage.d.ts.map +1 -0
  252. package/dist/timecampus/pages/widgets/WidgetsPage.js +77 -0
  253. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -0
  254. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts +2 -0
  255. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts.map +1 -0
  256. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +95 -0
  257. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -0
  258. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts +2 -0
  259. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts.map +1 -0
  260. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +129 -0
  261. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -0
  262. package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts +2 -0
  263. package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts.map +1 -0
  264. package/dist/timecampus/pages/workflows/WorkflowsPage.js +80 -0
  265. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -0
  266. package/dist/timecampus/providers/TimeCampusProvider.d.ts +29 -0
  267. package/dist/timecampus/providers/TimeCampusProvider.d.ts.map +1 -0
  268. package/dist/timecampus/providers/TimeCampusProvider.js +92 -0
  269. package/dist/timecampus/providers/TimeCampusProvider.js.map +1 -0
  270. package/dist/timecampus/store/timecampusStore.d.ts +71 -0
  271. package/dist/timecampus/store/timecampusStore.d.ts.map +1 -0
  272. package/dist/timecampus/store/timecampusStore.js +33 -0
  273. package/dist/timecampus/store/timecampusStore.js.map +1 -0
  274. package/dist/timecampus/types/index.d.ts +615 -0
  275. package/dist/timecampus/types/index.d.ts.map +1 -0
  276. package/dist/timecampus/utils/helpers.d.ts +19 -0
  277. package/dist/timecampus/utils/helpers.d.ts.map +1 -0
  278. package/dist/timecampus/utils/helpers.js +73 -0
  279. package/dist/timecampus/utils/helpers.js.map +1 -0
  280. package/dist/timecampus/utils/index.d.ts +2 -0
  281. package/dist/timecampus/utils/index.d.ts.map +1 -0
  282. package/package.json +110 -0
@@ -0,0 +1,2 @@
1
+ export declare function ReportsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ReportsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/dashboard/ReportsPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,WAAW,4CAsJ1B"}
@@ -0,0 +1,102 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
+ import { useGetFocusScoreSummaryQuery as r, useGetTimeEntryStatsQuery as i, useGetWorkPatternSummaryQuery as a } from "../../../generated/wspace-operations.js";
5
+ import { Download as o, FileText as s, Plus as c } from "lucide-react";
6
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
+ //#region src/timecampus/pages/dashboard/ReportsPage.tsx
8
+ function d() {
9
+ let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = i({ skip: !d }), { data: h, loading: g } = a({ skip: !d }), { data: _, loading: v } = r({ skip: !d }), y = f?.timeEntryStats, b = h?.workPatternSummary, x = _?.focusScoreSummary;
10
+ if (p || g || v) return /* @__PURE__ */ l(t, {
11
+ title: "Reports",
12
+ description: "Generate and view time tracking reports",
13
+ actions: /* @__PURE__ */ u("button", {
14
+ className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
15
+ children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Generate Report"]
16
+ }),
17
+ children: /* @__PURE__ */ l(n, {
18
+ variant: "list",
19
+ count: 4
20
+ })
21
+ });
22
+ if (m) return /* @__PURE__ */ l(t, {
23
+ title: "Reports",
24
+ description: "Generate and view time tracking reports",
25
+ children: /* @__PURE__ */ l("div", {
26
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
27
+ children: "Failed to load reports data. Please try again later."
28
+ })
29
+ });
30
+ let S = [
31
+ ...y ? [{
32
+ id: "time-summary",
33
+ name: "Time Tracking Summary",
34
+ type: "time",
35
+ period: `${Math.round(y.totalHours)}h total · ${y.totalEntries} entries`,
36
+ status: "ready"
37
+ }, {
38
+ id: "billable-summary",
39
+ name: "Billable Hours Report",
40
+ type: "billing",
41
+ period: `${Math.round(y.billableHours)}h billable · ${y.activeTimers} active`,
42
+ status: "ready"
43
+ }] : [],
44
+ ...b ? [{
45
+ id: "work-pattern",
46
+ name: "Work Pattern Analysis",
47
+ type: "team",
48
+ period: `${b.averageFocusHours.toFixed(1)}h avg focus · ${Math.round(b.averageProductivity)}% productivity`,
49
+ status: "ready"
50
+ }] : [],
51
+ ...x ? [{
52
+ id: "focus-score",
53
+ name: "Focus Score Report",
54
+ type: "productivity",
55
+ period: `Avg: ${Math.round(x.averageScore)} · High: ${Math.round(x.highestScore)} · Low: ${Math.round(x.lowestScore)}`,
56
+ status: "ready"
57
+ }] : []
58
+ ];
59
+ return /* @__PURE__ */ l(t, {
60
+ title: "Reports",
61
+ description: "Generate and view time tracking reports",
62
+ actions: /* @__PURE__ */ u("button", {
63
+ className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
64
+ children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Generate Report"]
65
+ }),
66
+ children: /* @__PURE__ */ l("div", {
67
+ className: "rounded-xl border border-border bg-card",
68
+ children: /* @__PURE__ */ l("div", {
69
+ className: "divide-y divide-border",
70
+ children: S.length === 0 ? /* @__PURE__ */ l("div", {
71
+ className: "p-8 text-center text-sm text-muted-foreground",
72
+ children: "No report data available yet."
73
+ }) : S.map((e) => /* @__PURE__ */ u("div", {
74
+ className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors",
75
+ children: [/* @__PURE__ */ u("div", {
76
+ className: "flex items-center gap-3",
77
+ children: [/* @__PURE__ */ l(s, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
78
+ className: "text-sm font-medium text-foreground",
79
+ children: e.name
80
+ }), /* @__PURE__ */ l("p", {
81
+ className: "text-xs text-muted-foreground",
82
+ children: e.period
83
+ })] })]
84
+ }), /* @__PURE__ */ u("div", {
85
+ className: "flex items-center gap-3",
86
+ children: [/* @__PURE__ */ l("span", {
87
+ className: "inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",
88
+ children: e.status
89
+ }), /* @__PURE__ */ l("button", {
90
+ className: "rounded-md p-1.5 hover:bg-muted",
91
+ children: /* @__PURE__ */ l(o, { className: "h-4 w-4 text-muted-foreground" })
92
+ })]
93
+ })]
94
+ }, e.id))
95
+ })
96
+ })
97
+ });
98
+ }
99
+ //#endregion
100
+ export { d as ReportsPage };
101
+
102
+ //# sourceMappingURL=ReportsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportsPage.js","names":[],"sources":["../../../../src/timecampus/pages/dashboard/ReportsPage.tsx"],"sourcesContent":["import { FileText, Plus, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetWorkPatternSummaryQuery,\n useGetFocusScoreSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function ReportsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const { data: focusData, loading: focusLoading } =\n useGetFocusScoreSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const pattern = patternData?.workPatternSummary;\n const focus = focusData?.focusScoreSummary;\n\n const isLoading = statsLoading || patternLoading || focusLoading;\n\n if (isLoading) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load reports data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n // Build dynamic reports from available analytics data\n const reports = [\n ...(stats\n ? [\n {\n id: \"time-summary\",\n name: \"Time Tracking Summary\",\n type: \"time\",\n period: `${Math.round(stats.totalHours)}h total · ${stats.totalEntries} entries`,\n status: \"ready\" as const,\n },\n {\n id: \"billable-summary\",\n name: \"Billable Hours Report\",\n type: \"billing\",\n period: `${Math.round(stats.billableHours)}h billable · ${stats.activeTimers} active`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(pattern\n ? [\n {\n id: \"work-pattern\",\n name: \"Work Pattern Analysis\",\n type: \"team\",\n period: `${pattern.averageFocusHours.toFixed(1)}h avg focus · ${Math.round(pattern.averageProductivity)}% productivity`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ...(focus\n ? [\n {\n id: \"focus-score\",\n name: \"Focus Score Report\",\n type: \"productivity\",\n period: `Avg: ${Math.round(focus.averageScore)} · High: ${Math.round(focus.highestScore)} · Low: ${Math.round(focus.lowestScore)}`,\n status: \"ready\" as const,\n },\n ]\n : []),\n ];\n\n return (\n <PageLayout\n title=\"Reports\"\n description=\"Generate and view time tracking reports\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Generate Report\n </button>\n }\n >\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {reports.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No report data available yet.\n </div>\n ) : (\n reports.map((report) => (\n <div\n key={report.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <FileText className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {report.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {report.period}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400\">\n {report.status}\n </span>\n <button className=\"rounded-md p-1.5 hover:bg-muted\">\n <Download className=\"h-4 w-4 text-muted-foreground\" />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,IAAc;CAC5B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA0B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEI,EAAE,MAAM,GAAa,SAAS,MAClC,EAA8B,EAC5B,MAAM,CAAC,GACR,CAAC,EAEE,EAAE,MAAM,GAAW,SAAS,MAChC,EAA6B,EAC3B,MAAM,CAAC,GACR,CAAC,EAEE,IAAQ,GAAW,gBACnB,IAAU,GAAa,oBACvB,IAAQ,GAAW;AAIzB,KAFkB,KAAgB,KAAkB,EAGlD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,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;aAA+H;GAExI,CAAA;EACK,CAAA;CAKjB,IAAM,IAAU;EACd,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,WAAW,CAAC,YAAY,EAAM,aAAa;GACvE,QAAQ;GACT,EACD;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,KAAK,MAAM,EAAM,cAAc,CAAC,eAAe,EAAM,aAAa;GAC7E,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,GAAG,EAAQ,kBAAkB,QAAQ,EAAE,CAAC,gBAAgB,KAAK,MAAM,EAAQ,oBAAoB,CAAC;GACxG,QAAQ;GACT,CACF,GACD,EAAE;EACN,GAAI,IACA,CACE;GACE,IAAI;GACJ,MAAM;GACN,MAAM;GACN,QAAQ,QAAQ,KAAK,MAAM,EAAM,aAAa,CAAC,WAAW,KAAK,MAAM,EAAM,aAAa,CAAC,UAAU,KAAK,MAAM,EAAM,YAAY;GAChI,QAAQ;GACT,CACF,GACD,EAAE;EACP;AAED,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAQ,KAAK,MACX,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA,EACtD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO;OACN,CAAA,CACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAO;OACH,CAAA,EACP,kBAAC,UAAD;OAAQ,WAAU;iBAChB,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA;OAC/C,CAAA,CACL;QACF;OAtBC,EAAO,GAsBR,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function EmailAnalyticsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=EmailAnalyticsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/email-tracking/EmailAnalyticsPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,4CAqFjC"}
@@ -0,0 +1,73 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { StatCard as n } from "../../components/StatCard.js";
4
+ import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
+ import { useGetEmailTrackingStatsQuery as i } from "../../../generated/wspace-operations.js";
6
+ import { BarChart3 as a, Clock as o, Mail as s } from "lucide-react";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/email-tracking/EmailAnalyticsPage.tsx
9
+ function u() {
10
+ let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = i({ skip: !u }), m = d?.emailTrackingStats;
11
+ if (f) return /* @__PURE__ */ c(t, {
12
+ title: "Email Analytics",
13
+ description: "Insights into email time management",
14
+ children: /* @__PURE__ */ c(r, {
15
+ variant: "card",
16
+ count: 4
17
+ })
18
+ });
19
+ if (p) return /* @__PURE__ */ c(t, {
20
+ title: "Email Analytics",
21
+ description: "Insights into email time management",
22
+ children: /* @__PURE__ */ c("div", {
23
+ className: "rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
24
+ children: "Failed to load email analytics. Please try again later."
25
+ })
26
+ });
27
+ let h = Math.round((m?.totalDuration ?? 0) / 60), g = Math.floor(h / 60), _ = h % 60, v = g > 0 ? `${g}h ${_}m` : `${_}m`, y = m?.averageResponseTime == null ? "--" : `${Math.round(m.averageResponseTime)} min`, b = String(m?.totalEmails ?? 0), x = m?.totalEmails ? Math.round(m.importantCount / m.totalEmails * 100) : 0;
28
+ return /* @__PURE__ */ l(t, {
29
+ title: "Email Analytics",
30
+ description: "Insights into email time management",
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(n, {
35
+ title: "Emails Today",
36
+ value: b,
37
+ icon: /* @__PURE__ */ c(s, { className: "h-5 w-5" })
38
+ }),
39
+ /* @__PURE__ */ c(n, {
40
+ title: "Time on Email",
41
+ value: v,
42
+ icon: /* @__PURE__ */ c(o, { className: "h-5 w-5" })
43
+ }),
44
+ /* @__PURE__ */ c(n, {
45
+ title: "Avg. Response",
46
+ value: y,
47
+ description: "Target: 15 min"
48
+ }),
49
+ /* @__PURE__ */ c(n, {
50
+ title: "Email Score",
51
+ value: `${x}%`,
52
+ icon: /* @__PURE__ */ c(a, { className: "h-5 w-5" })
53
+ })
54
+ ]
55
+ }), /* @__PURE__ */ l("div", {
56
+ className: "rounded-xl border border-border bg-card p-6",
57
+ children: [/* @__PURE__ */ c("h3", {
58
+ className: "mb-4 text-sm font-semibold text-foreground",
59
+ children: "Email Volume & Response Time"
60
+ }), /* @__PURE__ */ c("div", {
61
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
62
+ children: /* @__PURE__ */ c("p", {
63
+ className: "text-sm text-muted-foreground",
64
+ children: "Chart will render here"
65
+ })
66
+ })]
67
+ })]
68
+ });
69
+ }
70
+ //#endregion
71
+ export { u as EmailAnalyticsPage };
72
+
73
+ //# sourceMappingURL=EmailAnalyticsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/email-tracking/EmailAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Mail, Clock } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetEmailTrackingStatsQuery } from \"@/generated/wspace-operations\";\n\nexport function EmailAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useGetEmailTrackingStatsQuery({\n skip: !workspaceId,\n });\n\n const stats = data?.emailTrackingStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Email Analytics\"\n description=\"Insights into email time management\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Email Analytics\"\n description=\"Insights into email time management\"\n >\n <div className=\"rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load email analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalMinutes = Math.round((stats?.totalDuration ?? 0) / 60);\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n const timeOnEmail = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n const avgResponse =\n stats?.averageResponseTime != null\n ? `${Math.round(stats.averageResponseTime)} min`\n : \"--\";\n const totalEmails = String(stats?.totalEmails ?? 0);\n const importantRatio = stats?.totalEmails\n ? Math.round((stats.importantCount / stats.totalEmails) * 100)\n : 0;\n\n return (\n <PageLayout\n title=\"Email Analytics\"\n description=\"Insights into email time management\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Emails Today\"\n value={totalEmails}\n icon={<Mail className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Time on Email\"\n value={timeOnEmail}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Avg. Response\"\n value={avgResponse}\n description=\"Target: 15 min\"\n />\n <StatCard\n title=\"Email Score\"\n value={`${importantRatio}%`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n />\n </div>\n\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Email Volume & Response Time\n </h3>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n Chart will render here\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAAqB;CACnC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,EAAE,SAAM,YAAS,aAAU,EAA8B,EAC7D,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;aAAyF;GAElG,CAAA;EACK,CAAA;CAIjB,IAAM,IAAe,KAAK,OAAO,GAAO,iBAAiB,KAAK,GAAG,EAC3D,IAAQ,KAAK,MAAM,IAAe,GAAG,EACrC,IAAU,IAAe,IACzB,IAAc,IAAQ,IAAI,GAAG,EAAM,IAAI,EAAQ,KAAK,GAAG,EAAQ,IAC/D,IACJ,GAAO,uBAAuB,OAE1B,OADA,GAAG,KAAK,MAAM,EAAM,oBAAoB,CAAC,OAEzC,IAAc,OAAO,GAAO,eAAe,EAAE,EAC7C,IAAiB,GAAO,cAC1B,KAAK,MAAO,EAAM,iBAAiB,EAAM,cAAe,IAAI,GAC5D;AAEJ,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;KAClC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAe;KACzB,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA6C;IAEtD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA;IACA,CAAA,CACF;KACK"}
@@ -0,0 +1,2 @@
1
+ export declare function EmailSettingsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=EmailSettingsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailSettingsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/email-tracking/EmailSettingsPage.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,iBAAiB,4CAuJhC"}
@@ -0,0 +1,138 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
+ import { useListConfigurationsQuery as r, useSetConfigurationMutation as i } from "../../../generated/wspace-operations.js";
5
+ import { useCallback as a, useEffect as o, useState as s } from "react";
6
+ import { Settings as c } from "lucide-react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/email-tracking/EmailSettingsPage.tsx
9
+ var d = "timecampus.email.settings", f = {
10
+ autoTrack: !0,
11
+ categorizeByProject: !0,
12
+ responseTimeAlerts: !1
13
+ };
14
+ function p() {
15
+ let { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } = r({
16
+ variables: {
17
+ scope: "WORKSPACE",
18
+ limit: 100
19
+ },
20
+ skip: !p
21
+ }), [_, { loading: v }] = i(), [y, b] = s(f);
22
+ o(() => {
23
+ if (m?.configurations) {
24
+ let e = m.configurations.find((e) => e.key === d);
25
+ if (e?.value) {
26
+ let t = e.value;
27
+ b({
28
+ autoTrack: t.autoTrack ?? f.autoTrack,
29
+ categorizeByProject: t.categorizeByProject ?? f.categorizeByProject,
30
+ responseTimeAlerts: t.responseTimeAlerts ?? f.responseTimeAlerts
31
+ });
32
+ }
33
+ }
34
+ }, [m]);
35
+ let x = a(async () => {
36
+ await _({ variables: { input: {
37
+ key: d,
38
+ value: y,
39
+ description: "Email tracking settings",
40
+ scope: "WORKSPACE"
41
+ } } });
42
+ }, [_, y]);
43
+ return h ? /* @__PURE__ */ l(t, {
44
+ title: "Email Settings",
45
+ description: "Configure email tracking preferences",
46
+ children: /* @__PURE__ */ l(n, { variant: "detail" })
47
+ }) : g ? /* @__PURE__ */ l(t, {
48
+ title: "Email Settings",
49
+ description: "Configure email tracking preferences",
50
+ children: /* @__PURE__ */ l("div", {
51
+ className: "rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
52
+ children: "Failed to load settings. Please try again later."
53
+ })
54
+ }) : /* @__PURE__ */ l(t, {
55
+ title: "Email Settings",
56
+ description: "Configure email tracking preferences",
57
+ children: /* @__PURE__ */ u("div", {
58
+ className: "mx-auto max-w-2xl space-y-6",
59
+ children: [/* @__PURE__ */ u("div", {
60
+ className: "rounded-xl border border-border bg-card p-6",
61
+ children: [/* @__PURE__ */ u("h3", {
62
+ className: "mb-4 flex items-center gap-2 text-sm font-semibold text-foreground",
63
+ children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Tracking Configuration"]
64
+ }), /* @__PURE__ */ u("div", {
65
+ className: "space-y-3",
66
+ children: [
67
+ /* @__PURE__ */ u("label", {
68
+ className: "flex items-center justify-between",
69
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
70
+ className: "text-sm font-medium text-foreground",
71
+ children: "Auto-track emails"
72
+ }), /* @__PURE__ */ l("p", {
73
+ className: "text-xs text-muted-foreground",
74
+ children: "Automatically track time spent reading and responding"
75
+ })] }), /* @__PURE__ */ l("input", {
76
+ type: "checkbox",
77
+ checked: y.autoTrack,
78
+ onChange: (e) => b((t) => ({
79
+ ...t,
80
+ autoTrack: e.target.checked
81
+ })),
82
+ className: "h-4 w-4 rounded border-border"
83
+ })]
84
+ }),
85
+ /* @__PURE__ */ u("label", {
86
+ className: "flex items-center justify-between",
87
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
88
+ className: "text-sm font-medium text-foreground",
89
+ children: "Categorize by project"
90
+ }), /* @__PURE__ */ l("p", {
91
+ className: "text-xs text-muted-foreground",
92
+ children: "Link emails to projects automatically"
93
+ })] }), /* @__PURE__ */ l("input", {
94
+ type: "checkbox",
95
+ checked: y.categorizeByProject,
96
+ onChange: (e) => b((t) => ({
97
+ ...t,
98
+ categorizeByProject: e.target.checked
99
+ })),
100
+ className: "h-4 w-4 rounded border-border"
101
+ })]
102
+ }),
103
+ /* @__PURE__ */ u("label", {
104
+ className: "flex items-center justify-between",
105
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
106
+ className: "text-sm font-medium text-foreground",
107
+ children: "Response time alerts"
108
+ }), /* @__PURE__ */ l("p", {
109
+ className: "text-xs text-muted-foreground",
110
+ children: "Notify when response time exceeds threshold"
111
+ })] }), /* @__PURE__ */ l("input", {
112
+ type: "checkbox",
113
+ checked: y.responseTimeAlerts,
114
+ onChange: (e) => b((t) => ({
115
+ ...t,
116
+ responseTimeAlerts: e.target.checked
117
+ })),
118
+ className: "h-4 w-4 rounded border-border"
119
+ })]
120
+ })
121
+ ]
122
+ })]
123
+ }), /* @__PURE__ */ l("div", {
124
+ className: "flex justify-end",
125
+ children: /* @__PURE__ */ l("button", {
126
+ onClick: x,
127
+ disabled: v,
128
+ className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50",
129
+ children: v ? "Saving..." : "Save Settings"
130
+ })
131
+ })]
132
+ })
133
+ });
134
+ }
135
+ //#endregion
136
+ export { p as EmailSettingsPage };
137
+
138
+ //# sourceMappingURL=EmailSettingsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/email-tracking/EmailSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n useSetConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst EMAIL_SETTINGS_KEY = \"timecampus.email.settings\";\n\ninterface EmailSettings {\n autoTrack: boolean;\n categorizeByProject: boolean;\n responseTimeAlerts: boolean;\n}\n\nconst DEFAULT_SETTINGS: EmailSettings = {\n autoTrack: true,\n categorizeByProject: true,\n responseTimeAlerts: false,\n};\n\nexport function EmailSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as never, limit: 100 },\n skip: !workspaceId,\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n const [settings, setSettings] = useState<EmailSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const emailConfig = data.configurations.find(\n (c: ConfigurationFieldsFragment) => c.key === EMAIL_SETTINGS_KEY,\n );\n if (emailConfig?.value) {\n const val = emailConfig.value as Partial<EmailSettings>;\n setSettings({\n autoTrack: val.autoTrack ?? DEFAULT_SETTINGS.autoTrack,\n categorizeByProject:\n val.categorizeByProject ?? DEFAULT_SETTINGS.categorizeByProject,\n responseTimeAlerts:\n val.responseTimeAlerts ?? DEFAULT_SETTINGS.responseTimeAlerts,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: EMAIL_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Email tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n >\n <div className=\"rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Email Settings\"\n description=\"Configure email tracking preferences\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-foreground\">\n <Settings className=\"h-4 w-4\" />\n Tracking Configuration\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n Auto-track emails\n </span>\n <p className=\"text-xs text-muted-foreground\">\n Automatically track time spent reading and responding\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.autoTrack}\n onChange={(e) =>\n setSettings((s) => ({ ...s, autoTrack: e.target.checked }))\n }\n className=\"h-4 w-4 rounded border-border\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n Categorize by project\n </span>\n <p className=\"text-xs text-muted-foreground\">\n Link emails to projects automatically\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.categorizeByProject}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n categorizeByProject: e.target.checked,\n }))\n }\n className=\"h-4 w-4 rounded border-border\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm font-medium text-foreground\">\n Response time alerts\n </span>\n <p className=\"text-xs text-muted-foreground\">\n Notify when response time exceeds threshold\n </p>\n </div>\n <input\n type=\"checkbox\"\n checked={settings.responseTimeAlerts}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n responseTimeAlerts: e.target.checked,\n }))\n }\n className=\"h-4 w-4 rounded border-border\"\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-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,IAAqB,6BAQrB,IAAkC;CACtC,WAAW;CACX,qBAAqB;CACrB,oBAAoB;CACrB;AAED,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,EAAE,SAAM,YAAS,aAAU,EAA2B;EAC1D,WAAW;GAAE,OAAO;GAAsB,OAAO;GAAK;EACtD,MAAM,CAAC;EACR,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EACvE,CAAC,GAAU,KAAe,EAAwB,EAAiB;AAEzE,SAAgB;AACd,MAAI,GAAM,gBAAgB;GACxB,IAAM,IAAc,EAAK,eAAe,MACrC,MAAmC,EAAE,QAAQ,EAC/C;AACD,OAAI,GAAa,OAAO;IACtB,IAAM,IAAM,EAAY;AACxB,MAAY;KACV,WAAW,EAAI,aAAa,EAAiB;KAC7C,qBACE,EAAI,uBAAuB,EAAiB;KAC9C,oBACE,EAAI,sBAAsB,EAAiB;KAC9C,CAAC;;;IAGL,CAAC,EAAK,CAAC;CAEV,IAAM,IAAa,EAAY,YAAY;AACzC,QAAM,EAAiB,EACrB,WAAW,EACT,OAAO;GACL,KAAK;GACL,OAAO;GACP,aAAa;GACb,OAAO;GACR,EACF,EACF,CAAC;IACD,CAAC,GAAkB,EAAS,CAAC;AA0BhC,QAxBI,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;aAAyF;GAElG,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,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAsC;QAE/C,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAAE,GAAG;SAAG,WAAW,EAAE,OAAO;SAAS,EAAE;QAE7D,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAsC;QAE/C,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,qBAAqB,EAAE,OAAO;SAC/B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAsC;QAE/C,CAAA,EACP,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,oBAAoB,EAAE,OAAO;SAC9B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAAS;KACT,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function EmailTrackingPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=EmailTrackingPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailTrackingPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/email-tracking/EmailTrackingPage.tsx"],"names":[],"mappings":"AAcA,wBAAgB,iBAAiB,4CA4EhC"}
@@ -0,0 +1,71 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { formatRelativeTime as t, getPriorityColor as n, getStatusColor as r } from "../../utils/helpers.js";
3
+ import { PageLayout as i } from "../../components/PageLayout.js";
4
+ import { LoadingSkeleton as a } from "../../components/LoadingSkeleton.js";
5
+ import { useListEmailTimeEntriesQuery as o } from "../../../generated/wspace-operations.js";
6
+ import { Filter as s, Mail as c } from "lucide-react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/email-tracking/EmailTrackingPage.tsx
9
+ function d() {
10
+ let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = o({
11
+ variables: { limit: 50 },
12
+ skip: !d
13
+ }), h = f?.emailTimeEntries ?? [];
14
+ return /* @__PURE__ */ l(i, {
15
+ title: "Email Tracking",
16
+ description: "Track time spent on emails",
17
+ actions: /* @__PURE__ */ u("button", {
18
+ className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
19
+ children: [/* @__PURE__ */ l(s, { className: "h-4 w-4" }), "Filter"]
20
+ }),
21
+ children: p ? /* @__PURE__ */ l(a, {
22
+ variant: "list",
23
+ count: 4
24
+ }) : m ? /* @__PURE__ */ l("div", {
25
+ className: "rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
26
+ children: "Failed to load email entries. Please try again later."
27
+ }) : /* @__PURE__ */ l("div", {
28
+ className: "rounded-xl border border-border bg-card",
29
+ children: /* @__PURE__ */ l("div", {
30
+ className: "divide-y divide-border",
31
+ children: h.length === 0 ? /* @__PURE__ */ l("div", {
32
+ className: "p-8 text-center text-sm text-muted-foreground",
33
+ children: "No email entries found."
34
+ }) : h.map((e) => /* @__PURE__ */ u("div", {
35
+ className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer",
36
+ children: [/* @__PURE__ */ u("div", {
37
+ className: "flex items-center gap-3",
38
+ children: [/* @__PURE__ */ l(c, { className: `h-5 w-5 ${e.isImportant ? "text-primary" : "text-muted-foreground"}` }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
39
+ className: `text-sm ${e.isImportant ? "font-semibold text-foreground" : "font-medium text-foreground"}`,
40
+ children: e.subject ?? "(No subject)"
41
+ }), /* @__PURE__ */ u("p", {
42
+ className: "text-xs text-muted-foreground",
43
+ children: [
44
+ e.sender ?? "Unknown",
45
+ " ·",
46
+ " ",
47
+ t(e.date),
48
+ " · ~",
49
+ e.duration ?? 0,
50
+ "min"
51
+ ]
52
+ })] })]
53
+ }), /* @__PURE__ */ u("div", {
54
+ className: "flex items-center gap-2",
55
+ children: [/* @__PURE__ */ l("span", {
56
+ className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${n(e.isImportant ? "high" : "low")}`,
57
+ children: e.isImportant ? "high" : "normal"
58
+ }), /* @__PURE__ */ l("span", {
59
+ className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${r(e.category ?? "active")}`,
60
+ children: e.category ?? "uncategorized"
61
+ })]
62
+ })]
63
+ }, e.id))
64
+ })
65
+ })
66
+ });
67
+ }
68
+ //#endregion
69
+ export { d as EmailTrackingPage };
70
+
71
+ //# sourceMappingURL=EmailTrackingPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/email-tracking/EmailTrackingPage.tsx"],"sourcesContent":["import { Mail, Filter } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport {\n getStatusColor,\n getPriorityColor,\n formatRelativeTime,\n} from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListEmailTimeEntriesQuery,\n type EmailTimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function EmailTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListEmailTimeEntriesQuery({\n variables: { limit: 50 },\n skip: !workspaceId,\n });\n\n const emails = data?.emailTimeEntries ?? [];\n\n return (\n <PageLayout\n title=\"Email Tracking\"\n description=\"Track time spent on emails\"\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-foreground hover:bg-muted/50\">\n <Filter className=\"h-4 w-4\" />\n Filter\n </button>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : error ? (\n <div className=\"rounded-xl border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load email entries. Please try again later.\n </div>\n ) : (\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {emails.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No email entries found.\n </div>\n ) : (\n emails.map((email: EmailTimeEntryFieldsFragment) => (\n <div\n key={email.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <Mail\n className={`h-5 w-5 ${email.isImportant ? \"text-primary\" : \"text-muted-foreground\"}`}\n />\n <div>\n <p\n className={`text-sm ${email.isImportant ? \"font-semibold text-foreground\" : \"font-medium text-foreground\"}`}\n >\n {email.subject ?? \"(No subject)\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {email.sender ?? \"Unknown\"} &middot;{\" \"}\n {formatRelativeTime(email.date)} &middot; ~\n {email.duration ?? 0}min\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getPriorityColor(email.isImportant ? \"high\" : \"low\")}`}\n >\n {email.isImportant ? \"high\" : \"normal\"}\n </span>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(email.category ?? \"active\")}`}\n >\n {email.category ?? \"uncategorized\"}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAcA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,EAAE,SAAM,YAAS,aAAU,EAA6B;EAC5D,WAAW,EAAE,OAAO,IAAI;EACxB,MAAM,CAAC;EACR,CAAC,EAEI,IAAS,GAAM,oBAAoB,EAAE;AAE3C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,SAEvB;;YAGV,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA,GAC1C,IACF,kBAAC,OAAD;GAAK,WAAU;aAAyF;GAElG,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAO,WAAW,IACjB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAO,KAAK,MACV,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EACE,WAAW,WAAW,EAAM,cAAc,iBAAiB,2BAC3D,CAAA,EACF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OACE,WAAW,WAAW,EAAM,cAAc,kCAAkC;iBAE3E,EAAM,WAAW;OAChB,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAM,UAAU;QAAU;QAAU;QACpC,EAAmB,EAAM,KAAK;QAAC;QAC/B,EAAM,YAAY;QAAE;QACnB;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAiB,EAAM,cAAc,SAAS,MAAM;iBAE1H,EAAM,cAAc,SAAS;OACzB,CAAA,EACP,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAM,YAAY,SAAS;iBAEhH,EAAM,YAAY;OACd,CAAA,CACH;QACF;OAhCC,EAAM,GAgCP,CACN;IAEA,CAAA;GACF,CAAA;EAEG,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function ExpenseTrackingPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ExpenseTrackingPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpenseTrackingPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,mBAAmB,4CAyHlC"}
@@ -0,0 +1,102 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { formatCurrency as t, formatDate as n, getStatusColor as r } from "../../utils/helpers.js";
3
+ import { PageLayout as i } from "../../components/PageLayout.js";
4
+ import { StatCard as a } from "../../components/StatCard.js";
5
+ import { LoadingSkeleton as o } from "../../components/LoadingSkeleton.js";
6
+ import { useGetExpenseStatsQuery as s, useListExpensesQuery as c } from "../../../generated/wspace-operations.js";
7
+ import { DollarSign as l, Plus as u, Receipt as d } from "lucide-react";
8
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
9
+ //#region src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx
10
+ function m() {
11
+ let { workspaceId: m = "" } = e(), { data: h, loading: g, error: _ } = c({ variables: { workspaceId: m } }), { data: v, loading: y, error: b } = s({ variables: { workspaceId: m } }), x = h?.expenses ?? [], S = v?.expenseStats;
12
+ return g && y ? /* @__PURE__ */ f(i, {
13
+ title: "Expense Tracking",
14
+ description: "Track and manage work expenses",
15
+ children: /* @__PURE__ */ f(o, {
16
+ variant: "list",
17
+ count: 4
18
+ })
19
+ }) : _ && b ? /* @__PURE__ */ f(i, {
20
+ title: "Expense Tracking",
21
+ description: "Track and manage work expenses",
22
+ children: /* @__PURE__ */ f("div", {
23
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
24
+ children: "Failed to load expense data. Please try again later."
25
+ })
26
+ }) : /* @__PURE__ */ p(i, {
27
+ title: "Expense Tracking",
28
+ description: "Track and manage work expenses",
29
+ actions: /* @__PURE__ */ p("button", {
30
+ className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
31
+ children: [/* @__PURE__ */ f(u, { className: "h-4 w-4" }), "Add Expense"]
32
+ }),
33
+ children: [/* @__PURE__ */ p("div", {
34
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
35
+ children: [
36
+ /* @__PURE__ */ f(a, {
37
+ title: "Total This Month",
38
+ value: t(S?.totalAmount ?? 0),
39
+ icon: /* @__PURE__ */ f(l, { className: "h-5 w-5" })
40
+ }),
41
+ /* @__PURE__ */ f(a, {
42
+ title: "Pending",
43
+ value: String(S?.pendingCount ?? 0),
44
+ description: "expenses awaiting approval"
45
+ }),
46
+ /* @__PURE__ */ f(a, {
47
+ title: "Approved",
48
+ value: String(S?.approvedCount ?? 0),
49
+ description: "expenses approved"
50
+ }),
51
+ /* @__PURE__ */ f(a, {
52
+ title: "Average",
53
+ value: t(S?.averageAmount ?? 0),
54
+ icon: /* @__PURE__ */ f(d, { className: "h-5 w-5" }),
55
+ description: "per expense"
56
+ })
57
+ ]
58
+ }), /* @__PURE__ */ f("div", {
59
+ className: "rounded-xl border border-border bg-card",
60
+ children: /* @__PURE__ */ p("div", {
61
+ className: "divide-y divide-border",
62
+ children: [x.length === 0 && !g && /* @__PURE__ */ f("div", {
63
+ className: "p-4 text-center text-sm text-muted-foreground",
64
+ children: "No expenses recorded yet."
65
+ }), x.map((e) => /* @__PURE__ */ p("div", {
66
+ className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors",
67
+ children: [/* @__PURE__ */ p("div", {
68
+ className: "flex items-center gap-3",
69
+ children: [/* @__PURE__ */ f(d, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
70
+ className: "text-sm font-medium text-foreground",
71
+ children: e.description ?? "Untitled expense"
72
+ }), /* @__PURE__ */ p("p", {
73
+ className: "text-xs text-muted-foreground",
74
+ children: [
75
+ e.category,
76
+ " ·",
77
+ " ",
78
+ e.projectId ?? "No project",
79
+ " ·",
80
+ " ",
81
+ n(e.date)
82
+ ]
83
+ })] })]
84
+ }), /* @__PURE__ */ p("div", {
85
+ className: "flex items-center gap-3",
86
+ children: [/* @__PURE__ */ f("p", {
87
+ className: "text-sm font-medium text-foreground",
88
+ children: t(e.amount)
89
+ }), /* @__PURE__ */ f("span", {
90
+ className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${r(e.status)}`,
91
+ children: e.status
92
+ })]
93
+ })]
94
+ }, e.id))]
95
+ })
96
+ })]
97
+ });
98
+ }
99
+ //#endregion
100
+ export { m as ExpenseTrackingPage };
101
+
102
+ //# sourceMappingURL=ExpenseTrackingPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpenseTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"sourcesContent":["import { Receipt, Plus, DollarSign } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport {\n getStatusColor,\n formatCurrency,\n formatDate,\n} from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListExpensesQuery,\n useGetExpenseStatsQuery,\n type ExpenseFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function ExpenseTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: expensesData,\n loading: expensesLoading,\n error: expensesError,\n } = useListExpensesQuery({\n variables: { workspaceId },\n });\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetExpenseStatsQuery({\n variables: { workspaceId },\n });\n\n const expenses = expensesData?.expenses ?? [];\n const stats = statsData?.expenseStats;\n\n if (expensesLoading && statsLoading) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (expensesError && statsError) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load expense data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Add Expense\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=\"Total This Month\"\n value={formatCurrency(stats?.totalAmount ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Pending\"\n value={String(stats?.pendingCount ?? 0)}\n description=\"expenses awaiting approval\"\n />\n <StatCard\n title=\"Approved\"\n value={String(stats?.approvedCount ?? 0)}\n description=\"expenses approved\"\n />\n <StatCard\n title=\"Average\"\n value={formatCurrency(stats?.averageAmount ?? 0)}\n icon={<Receipt className=\"h-5 w-5\" />}\n description=\"per expense\"\n />\n </div>\n\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {expenses.length === 0 && !expensesLoading && (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n No expenses recorded yet.\n </div>\n )}\n {expenses.map((expense: ExpenseFieldsFragment) => (\n <div\n key={expense.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <Receipt className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {expense.description ?? \"Untitled expense\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {expense.category} &middot;{\" \"}\n {expense.projectId ?? \"No project\"} &middot;{\" \"}\n {formatDate(expense.date)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-sm font-medium text-foreground\">\n {formatCurrency(expense.amount)}\n </p>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(expense.status)}`}\n >\n {expense.status}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,IAAsB;CACpC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAqB,EACvB,WAAW,EAAE,gBAAa,EAC3B,CAAC,EACI,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAwB,EAC1B,WAAW,EAAE,gBAAa,EAC3B,CAAC,EAEI,IAAW,GAAc,YAAY,EAAE,EACvC,IAAQ,GAAW;AA0BzB,QAxBI,KAAmB,IAEnB,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,KAAiB,IAEjB,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,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,cAErB;;YAPb,CAUE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAe,GAAO,eAAe,EAAE;KAC9C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,gBAAgB,EAAE;KACvC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAe,GAAO,iBAAiB,EAAE;KAChD,MAAM,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA;KACrC,aAAY;KACZ,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAS,WAAW,KAAK,CAAC,KACzB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,EAEP,EAAS,KAAK,MACb,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,iCAAkC,CAAA,EACrD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAQ,eAAe;OACtB,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAQ;QAAS;QAAU;QAC3B,EAAQ,aAAa;QAAa;QAAU;QAC5C,EAAW,EAAQ,KAAK;QACvB;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAe,EAAQ,OAAO;OAC7B,CAAA,EACJ,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAQ,OAAO;iBAEpG,EAAQ;OACJ,CAAA,CACH;QACF;OA1BC,EAAQ,GA0BT,CACN,CACE;;GACF,CAAA,CACK"}
@@ -0,0 +1,2 @@
1
+ export declare function FocusScorePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=FocusScorePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FocusScorePage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/focus-score/FocusScorePage.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,cAAc,4CAqL7B"}