@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.
- package/README.md +12 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +20716 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +8527 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +3913 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +53363 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
- package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
- package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/timecampus/TimeCampusRoot.d.ts +5 -0
- package/dist/timecampus/TimeCampusRoot.d.ts.map +1 -0
- package/dist/timecampus/TimeCampusRoot.js +344 -0
- package/dist/timecampus/TimeCampusRoot.js.map +1 -0
- package/dist/timecampus/TimeCampusRoutes.d.ts +7 -0
- package/dist/timecampus/TimeCampusRoutes.d.ts.map +1 -0
- package/dist/timecampus/TimeCampusRoutes.js +227 -0
- package/dist/timecampus/TimeCampusRoutes.js.map +1 -0
- package/dist/timecampus/components/ChartCard.d.ts +19 -0
- package/dist/timecampus/components/ChartCard.d.ts.map +1 -0
- package/dist/timecampus/components/DataTable.d.ts +26 -0
- package/dist/timecampus/components/DataTable.d.ts.map +1 -0
- package/dist/timecampus/components/EmptyState.d.ts +12 -0
- package/dist/timecampus/components/EmptyState.d.ts.map +1 -0
- package/dist/timecampus/components/ErrorBoundary.d.ts +19 -0
- package/dist/timecampus/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/timecampus/components/ErrorBoundary.js +52 -0
- package/dist/timecampus/components/ErrorBoundary.js.map +1 -0
- package/dist/timecampus/components/FilterBar.d.ts +26 -0
- package/dist/timecampus/components/FilterBar.d.ts.map +1 -0
- package/dist/timecampus/components/LoadingSkeleton.d.ts +10 -0
- package/dist/timecampus/components/LoadingSkeleton.d.ts.map +1 -0
- package/dist/timecampus/components/LoadingSkeleton.js +76 -0
- package/dist/timecampus/components/LoadingSkeleton.js.map +1 -0
- package/dist/timecampus/components/Modal.d.ts +14 -0
- package/dist/timecampus/components/Modal.d.ts.map +1 -0
- package/dist/timecampus/components/PageLayout.d.ts +12 -0
- package/dist/timecampus/components/PageLayout.d.ts.map +1 -0
- package/dist/timecampus/components/PageLayout.js +23 -0
- package/dist/timecampus/components/PageLayout.js.map +1 -0
- package/dist/timecampus/components/StatCard.d.ts +17 -0
- package/dist/timecampus/components/StatCard.d.ts.map +1 -0
- package/dist/timecampus/components/StatCard.js +48 -0
- package/dist/timecampus/components/StatCard.js.map +1 -0
- package/dist/timecampus/components/StatusBadge.d.ts +16 -0
- package/dist/timecampus/components/StatusBadge.d.ts.map +1 -0
- package/dist/timecampus/components/Toast.d.ts +28 -0
- package/dist/timecampus/components/Toast.d.ts.map +1 -0
- package/dist/timecampus/components/index.d.ts +14 -0
- package/dist/timecampus/components/index.d.ts.map +1 -0
- package/dist/timecampus/hooks/index.d.ts +7 -0
- package/dist/timecampus/hooks/index.d.ts.map +1 -0
- package/dist/timecampus/hooks/useToast.d.ts +17 -0
- package/dist/timecampus/hooks/useToast.d.ts.map +1 -0
- package/dist/timecampus/index.d.ts +10 -0
- package/dist/timecampus/index.d.ts.map +1 -0
- package/dist/timecampus/index.js +4 -0
- package/dist/timecampus/pages/HomePage.d.ts +4 -0
- package/dist/timecampus/pages/HomePage.d.ts.map +1 -0
- package/dist/timecampus/pages/HomePage.js +239 -0
- package/dist/timecampus/pages/HomePage.js.map +1 -0
- package/dist/timecampus/pages/applets/AppletStorePage.d.ts +2 -0
- package/dist/timecampus/pages/applets/AppletStorePage.d.ts.map +1 -0
- package/dist/timecampus/pages/applets/AppletStorePage.js +77 -0
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -0
- package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts +2 -0
- package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +83 -0
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts +2 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts.map +1 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +118 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +129 -0
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/channels/ChannelsPage.d.ts +2 -0
- package/dist/timecampus/pages/channels/ChannelsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/channels/ChannelsPage.js +64 -0
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -0
- package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts +2 -0
- package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts.map +1 -0
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +108 -0
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -0
- package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts +2 -0
- package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +91 -0
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -0
- package/dist/timecampus/pages/dashboard/ReportsPage.d.ts +2 -0
- package/dist/timecampus/pages/dashboard/ReportsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/dashboard/ReportsPage.js +102 -0
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts +2 -0
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +73 -0
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +138 -0
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts +2 -0
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts.map +1 -0
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +71 -0
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -0
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts +2 -0
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts.map +1 -0
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +102 -0
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -0
- package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts +2 -0
- package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts.map +1 -0
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +131 -0
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -0
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +115 -0
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts +2 -0
- package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts.map +1 -0
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +70 -0
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -0
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +106 -0
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts +2 -0
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +77 -0
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -0
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +115 -0
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -0
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts +2 -0
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts.map +1 -0
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +97 -0
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts +2 -0
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +89 -0
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts +2 -0
- package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +101 -0
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts +2 -0
- package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +123 -0
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingsPage.d.ts +2 -0
- package/dist/timecampus/pages/meetings/MeetingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/meetings/MeetingsPage.js +90 -0
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts +2 -0
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +113 -0
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts +2 -0
- package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +160 -0
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +176 -0
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts +2 -0
- package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts.map +1 -0
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +104 -0
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -0
- package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts +2 -0
- package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts.map +1 -0
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +91 -0
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -0
- package/dist/timecampus/pages/projects/ProjectsPage.d.ts +2 -0
- package/dist/timecampus/pages/projects/ProjectsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/projects/ProjectsPage.js +95 -0
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -0
- package/dist/timecampus/pages/projects/TasksPage.d.ts +2 -0
- package/dist/timecampus/pages/projects/TasksPage.d.ts.map +1 -0
- package/dist/timecampus/pages/projects/TasksPage.js +73 -0
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -0
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts +2 -0
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts.map +1 -0
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +129 -0
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -0
- package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts +2 -0
- package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +78 -0
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -0
- package/dist/timecampus/pages/team/TeamMembersPage.d.ts +2 -0
- package/dist/timecampus/pages/team/TeamMembersPage.d.ts.map +1 -0
- package/dist/timecampus/pages/team/TeamMembersPage.js +97 -0
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -0
- package/dist/timecampus/pages/team/TeamPage.d.ts +2 -0
- package/dist/timecampus/pages/team/TeamPage.d.ts.map +1 -0
- package/dist/timecampus/pages/team/TeamPage.js +82 -0
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -0
- package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts +2 -0
- package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts.map +1 -0
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +107 -0
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -0
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +120 -0
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -0
- package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts +2 -0
- package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts.map +1 -0
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +84 -0
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -0
- package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts +2 -0
- package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts.map +1 -0
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +98 -0
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -0
- package/dist/timecampus/pages/templates/TemplatesPage.d.ts +2 -0
- package/dist/timecampus/pages/templates/TemplatesPage.d.ts.map +1 -0
- package/dist/timecampus/pages/templates/TemplatesPage.js +76 -0
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -0
- package/dist/timecampus/pages/time/TimeEntriesPage.d.ts +2 -0
- package/dist/timecampus/pages/time/TimeEntriesPage.d.ts.map +1 -0
- package/dist/timecampus/pages/time/TimeEntriesPage.js +117 -0
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -0
- package/dist/timecampus/pages/time/TimeTrackingPage.d.ts +2 -0
- package/dist/timecampus/pages/time/TimeTrackingPage.d.ts.map +1 -0
- package/dist/timecampus/pages/time/TimeTrackingPage.js +112 -0
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -0
- package/dist/timecampus/pages/time/TimerPage.d.ts +2 -0
- package/dist/timecampus/pages/time/TimerPage.d.ts.map +1 -0
- package/dist/timecampus/pages/time/TimerPage.js +80 -0
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -0
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts +2 -0
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts.map +1 -0
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +130 -0
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -0
- package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts +2 -0
- package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts.map +1 -0
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +96 -0
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -0
- package/dist/timecampus/pages/widgets/WidgetsPage.d.ts +2 -0
- package/dist/timecampus/pages/widgets/WidgetsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/widgets/WidgetsPage.js +77 -0
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts +2 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +95 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts +2 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +129 -0
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -0
- package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts +2 -0
- package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts.map +1 -0
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +80 -0
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -0
- package/dist/timecampus/providers/TimeCampusProvider.d.ts +29 -0
- package/dist/timecampus/providers/TimeCampusProvider.d.ts.map +1 -0
- package/dist/timecampus/providers/TimeCampusProvider.js +92 -0
- package/dist/timecampus/providers/TimeCampusProvider.js.map +1 -0
- package/dist/timecampus/store/timecampusStore.d.ts +71 -0
- package/dist/timecampus/store/timecampusStore.d.ts.map +1 -0
- package/dist/timecampus/store/timecampusStore.js +33 -0
- package/dist/timecampus/store/timecampusStore.js.map +1 -0
- package/dist/timecampus/types/index.d.ts +615 -0
- package/dist/timecampus/types/index.d.ts.map +1 -0
- package/dist/timecampus/utils/helpers.d.ts +19 -0
- package/dist/timecampus/utils/helpers.d.ts.map +1 -0
- package/dist/timecampus/utils/helpers.js +73 -0
- package/dist/timecampus/utils/helpers.js.map +1 -0
- package/dist/timecampus/utils/index.d.ts +2 -0
- package/dist/timecampus/utils/index.d.ts.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +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-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 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 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 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-foreground\">Show timer events</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\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">\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\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">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\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">Real-time updates</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\"\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":";;;;;;;;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;aAA+H;GAExI,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;kBAA0B;QAAwB,CAAA,EAClE,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;kBAA0B;QAEnC,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;kBAA0B;QAAqB,CAAA,EAC/D,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;kBAA0B;QAAwB,CAAA,EAClE,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,SAhGS,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;;KAkFM,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateApplicationPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/templates/TemplateApplicationPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,uBAAuB,4CAuFtC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
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 { useGetConfigurationQuery as r } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { CheckCircle as i, Loader2 as a, Sparkles as o } from "lucide-react";
|
|
6
|
+
import { useParams as s } from "react-router-dom";
|
|
7
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
|
+
//#region src/timecampus/pages/templates/TemplateApplicationPage.tsx
|
|
9
|
+
function u() {
|
|
10
|
+
let { applicationId: u } = s(), { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({
|
|
11
|
+
variables: { id: u ?? "" },
|
|
12
|
+
skip: !u
|
|
13
|
+
}), h = (f?.configuration?.value ?? {}).applicationSteps ?? [
|
|
14
|
+
{
|
|
15
|
+
label: "Project structure",
|
|
16
|
+
status: "pending"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: "Time categories",
|
|
20
|
+
status: "pending"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: "Team roles",
|
|
24
|
+
status: "pending"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
label: "Dashboard widgets",
|
|
28
|
+
status: "pending"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: "Workflows",
|
|
32
|
+
status: "pending"
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
return p ? /* @__PURE__ */ c(t, {
|
|
36
|
+
title: "Applying Template",
|
|
37
|
+
description: "Loading...",
|
|
38
|
+
children: /* @__PURE__ */ c(n, { variant: "detail" })
|
|
39
|
+
}) : m ? /* @__PURE__ */ c(t, {
|
|
40
|
+
title: "Applying Template",
|
|
41
|
+
description: `Application ID: ${u}`,
|
|
42
|
+
children: /* @__PURE__ */ c("div", {
|
|
43
|
+
className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
|
|
44
|
+
children: "Failed to load template application data. Please try again later."
|
|
45
|
+
})
|
|
46
|
+
}) : /* @__PURE__ */ c(t, {
|
|
47
|
+
title: "Applying Template",
|
|
48
|
+
description: `Application ID: ${u}`,
|
|
49
|
+
children: /* @__PURE__ */ c("div", {
|
|
50
|
+
className: "mx-auto max-w-lg",
|
|
51
|
+
children: /* @__PURE__ */ l("div", {
|
|
52
|
+
className: "rounded-xl border border-border bg-card p-6 text-center",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ c("div", {
|
|
55
|
+
className: "flex h-16 w-16 mx-auto items-center justify-center rounded-full bg-primary/10",
|
|
56
|
+
children: /* @__PURE__ */ c(o, { className: "h-8 w-8 text-primary" })
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ c("h2", {
|
|
59
|
+
className: "mt-4 text-lg font-semibold text-foreground",
|
|
60
|
+
children: "Setting up your workspace"
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ c("p", {
|
|
63
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
64
|
+
children: "Applying the template configuration..."
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ c("div", {
|
|
67
|
+
className: "mt-6 space-y-3 text-left",
|
|
68
|
+
children: h.map((e) => /* @__PURE__ */ l("div", {
|
|
69
|
+
className: "flex items-center gap-3 rounded-lg border border-border p-3",
|
|
70
|
+
children: [e.status === "completed" ? /* @__PURE__ */ c(i, { className: "h-5 w-5 text-emerald-500" }) : 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
|
+
className: `text-sm ${e.status === "completed" ? "text-muted-foreground" : "text-foreground"}`,
|
|
72
|
+
children: e.label
|
|
73
|
+
})]
|
|
74
|
+
}, e.label))
|
|
75
|
+
})
|
|
76
|
+
]
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { u as TemplateApplicationPage };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=TemplateApplicationPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateApplicationPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateApplicationPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, CheckCircle, Loader2 } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetConfigurationQuery } from \"@/generated/wspace-operations\";\n\nexport function TemplateApplicationPage() {\n const { applicationId } = useParams<{ applicationId: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: applicationId ?? \"\" },\n skip: !applicationId,\n });\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n\n // Application steps from configuration or defaults\n const configuredSteps = val.applicationSteps as\n | Array<{ label: string; status: string }>\n | undefined;\n const steps = configuredSteps ?? [\n { label: \"Project structure\", status: \"pending\" },\n { label: \"Time categories\", status: \"pending\" },\n { label: \"Team roles\", status: \"pending\" },\n { label: \"Dashboard widgets\", status: \"pending\" },\n { label: \"Workflows\", status: \"pending\" },\n ];\n\n if (loading) {\n return (\n <PageLayout title=\"Applying Template\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applying Template\"\n description={`Application ID: ${applicationId}`}\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load template application data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Applying Template\"\n description={`Application ID: ${applicationId}`}\n >\n <div className=\"mx-auto max-w-lg\">\n <div className=\"rounded-xl border border-border bg-card p-6 text-center\">\n <div className=\"flex h-16 w-16 mx-auto items-center justify-center rounded-full bg-primary/10\">\n <Sparkles className=\"h-8 w-8 text-primary\" />\n </div>\n <h2 className=\"mt-4 text-lg font-semibold text-foreground\">\n Setting up your workspace\n </h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n Applying the template configuration...\n </p>\n\n <div className=\"mt-6 space-y-3 text-left\">\n {steps.map((step) => (\n <div\n key={step.label}\n className=\"flex items-center gap-3 rounded-lg border border-border p-3\"\n >\n {step.status === \"completed\" ? (\n <CheckCircle className=\"h-5 w-5 text-emerald-500\" />\n ) : step.status === \"in-progress\" ? (\n <Loader2 className=\"h-5 w-5 text-primary animate-spin\" />\n ) : (\n <div className=\"h-5 w-5 rounded-full border-2 border-muted\" />\n )}\n <span\n className={`text-sm ${step.status === \"completed\" ? \"text-muted-foreground\" : \"text-foreground\"}`}\n >\n {step.label}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAA0B;CACxC,IAAM,EAAE,qBAAkB,GAAsC,EAC1D,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAyB;EACxD,WAAW,EAAE,IAAI,KAAiB,IAAI;EACtC,MAAM,CAAC;EACR,CAAC,EASI,KAPS,GAAM,eACA,SAAqC,EAAE,EAGhC,oBAGK;EAC/B;GAAE,OAAO;GAAqB,QAAQ;GAAW;EACjD;GAAE,OAAO;GAAmB,QAAQ;GAAW;EAC/C;GAAE,OAAO;GAAc,QAAQ;GAAW;EAC1C;GAAE,OAAO;GAAqB,QAAQ;GAAW;EACjD;GAAE,OAAO;GAAa,QAAQ;GAAW;EAC1C;AAuBD,QArBI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAoB,aAAY;YAChD,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,mBAAmB;YAEhC,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,mBAAmB;YAEhC,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;MACzC,CAAA;KACN,kBAAC,MAAD;MAAI,WAAU;gBAA6C;MAEtD,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAAqC;MAE9C,CAAA;KAEJ,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAM,KAAK,MACV,kBAAC,OAAD;OAEE,WAAU;iBAFZ,CAIG,EAAK,WAAW,cACf,kBAAC,GAAD,EAAa,WAAU,4BAA6B,CAAA,GAClD,EAAK,WAAW,gBAClB,kBAAC,GAAD,EAAS,WAAU,qCAAsC,CAAA,GAEzD,kBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA,EAEhE,kBAAC,QAAD;QACE,WAAW,WAAW,EAAK,WAAW,cAAc,0BAA0B;kBAE7E,EAAK;QACD,CAAA,CACH;SAfC,EAAK,MAeN,CACN;MACE,CAAA;KACF;;GACF,CAAA;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/templates/TemplateDetailPage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,4CA+GjC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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 { useGetConfigurationQuery as r } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { ArrowLeft as i, CheckCircle as a, Sparkles as o, Star as s, Users as c } from "lucide-react";
|
|
6
|
+
import { useParams as l } from "react-router-dom";
|
|
7
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
8
|
+
//#region src/timecampus/pages/templates/TemplateDetailPage.tsx
|
|
9
|
+
function f() {
|
|
10
|
+
let { id: f } = l(), { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } = r({
|
|
11
|
+
variables: { id: f ?? "" },
|
|
12
|
+
skip: !f
|
|
13
|
+
}), _ = m?.configuration, v = _?.value ?? {}, y = v.name ?? _?.key?.replace("template.", "") ?? "Template", b = _?.description ?? v.description ?? "A pre-built workspace template for time tracking workflows.", x = v.rating ?? 0, S = v.teamSize ?? "-", C = v.features ?? [];
|
|
14
|
+
return h ? /* @__PURE__ */ u(t, {
|
|
15
|
+
title: "Template Details",
|
|
16
|
+
description: "Loading...",
|
|
17
|
+
children: /* @__PURE__ */ u(n, { variant: "detail" })
|
|
18
|
+
}) : g || !_ ? /* @__PURE__ */ u(t, {
|
|
19
|
+
title: "Template Details",
|
|
20
|
+
description: `Template ID: ${f}`,
|
|
21
|
+
actions: /* @__PURE__ */ d("button", {
|
|
22
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
|
|
23
|
+
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4" }), "Back to Templates"]
|
|
24
|
+
}),
|
|
25
|
+
children: /* @__PURE__ */ u("div", {
|
|
26
|
+
className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
|
|
27
|
+
children: g ? "Failed to load template details. Please try again later." : "Template configuration not found."
|
|
28
|
+
})
|
|
29
|
+
}) : /* @__PURE__ */ u(t, {
|
|
30
|
+
title: "Template Details",
|
|
31
|
+
description: `Template ID: ${f}`,
|
|
32
|
+
actions: /* @__PURE__ */ d("button", {
|
|
33
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
|
|
34
|
+
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4" }), "Back to Templates"]
|
|
35
|
+
}),
|
|
36
|
+
children: /* @__PURE__ */ u("div", {
|
|
37
|
+
className: "mx-auto max-w-2xl",
|
|
38
|
+
children: /* @__PURE__ */ d("div", {
|
|
39
|
+
className: "rounded-xl border border-border bg-card p-6",
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ d("div", {
|
|
42
|
+
className: "flex items-start gap-4",
|
|
43
|
+
children: [/* @__PURE__ */ u("div", {
|
|
44
|
+
className: "flex h-16 w-16 items-center justify-center rounded-xl bg-primary/10",
|
|
45
|
+
children: /* @__PURE__ */ u(o, { className: "h-8 w-8 text-primary" })
|
|
46
|
+
}), /* @__PURE__ */ d("div", {
|
|
47
|
+
className: "flex-1",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ u("h2", {
|
|
50
|
+
className: "text-lg font-semibold text-foreground",
|
|
51
|
+
children: y
|
|
52
|
+
}),
|
|
53
|
+
/* @__PURE__ */ u("p", {
|
|
54
|
+
className: "text-sm text-muted-foreground",
|
|
55
|
+
children: b
|
|
56
|
+
}),
|
|
57
|
+
/* @__PURE__ */ d("div", {
|
|
58
|
+
className: "mt-2 flex items-center gap-3 text-sm text-muted-foreground",
|
|
59
|
+
children: [/* @__PURE__ */ d("div", {
|
|
60
|
+
className: "flex items-center gap-1",
|
|
61
|
+
children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 fill-amber-400 text-amber-400" }), /* @__PURE__ */ u("span", { children: x })]
|
|
62
|
+
}), /* @__PURE__ */ d("div", {
|
|
63
|
+
className: "flex items-center gap-1",
|
|
64
|
+
children: [/* @__PURE__ */ u(c, { className: "h-4 w-4" }), /* @__PURE__ */ d("span", { children: [S, " members"] })]
|
|
65
|
+
})]
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
})]
|
|
69
|
+
}),
|
|
70
|
+
C.length > 0 && /* @__PURE__ */ d("div", {
|
|
71
|
+
className: "mt-6",
|
|
72
|
+
children: [/* @__PURE__ */ u("h3", {
|
|
73
|
+
className: "text-sm font-semibold text-foreground",
|
|
74
|
+
children: "Features"
|
|
75
|
+
}), /* @__PURE__ */ u("ul", {
|
|
76
|
+
className: "mt-2 space-y-2",
|
|
77
|
+
children: C.map((e) => /* @__PURE__ */ d("li", {
|
|
78
|
+
className: "flex items-center gap-2 text-sm text-muted-foreground",
|
|
79
|
+
children: [/* @__PURE__ */ u(a, { className: "h-4 w-4 text-emerald-500" }), e]
|
|
80
|
+
}, e))
|
|
81
|
+
})]
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ u("div", {
|
|
84
|
+
className: "mt-6 flex justify-end",
|
|
85
|
+
children: /* @__PURE__ */ u("button", {
|
|
86
|
+
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
|
|
87
|
+
children: "Apply Template"
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { f as TemplateDetailPage };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=TemplateDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplateDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplateDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Sparkles, ArrowLeft, Star, Users, CheckCircle } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetConfigurationQuery } from \"@/generated/wspace-operations\";\n\nexport function TemplateDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetConfigurationQuery({\n variables: { id: id ?? \"\" },\n skip: !id,\n });\n\n const config = data?.configuration;\n const val = (config?.value as Record<string, unknown>) ?? {};\n const name =\n (val.name as string) ?? config?.key?.replace(\"template.\", \"\") ?? \"Template\";\n const description =\n config?.description ??\n (val.description as string) ??\n \"A pre-built workspace template for time tracking workflows.\";\n const rating = (val.rating as number) ?? 0;\n const teamSize = (val.teamSize as string) ?? \"-\";\n const features = (val.features as string[]) ?? [];\n\n if (loading) {\n return (\n <PageLayout title=\"Template Details\" description=\"Loading...\">\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !config) {\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n {error\n ? \"Failed to load template details. Please try again later.\"\n : \"Template configuration not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Template Details\"\n description={`Template ID: ${id}`}\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Templates\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-16 w-16 items-center justify-center rounded-xl bg-primary/10\">\n <Sparkles className=\"h-8 w-8 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-foreground\">{name}</h2>\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n <div className=\"mt-2 flex items-center gap-3 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-amber-400 text-amber-400\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Users className=\"h-4 w-4\" />\n <span>{teamSize} members</span>\n </div>\n </div>\n </div>\n </div>\n\n {features.length > 0 && (\n <div className=\"mt-6\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n Features\n </h3>\n <ul className=\"mt-2 space-y-2\">\n {features.map((feature) => (\n <li\n key={feature}\n className=\"flex items-center gap-2 text-sm text-muted-foreground\"\n >\n <CheckCircle className=\"h-4 w-4 text-emerald-500\" />\n {feature}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n <div className=\"mt-6 flex justify-end\">\n <button className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n Apply Template\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAAqB;CACnC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAyB;EACxD,WAAW,EAAE,IAAI,KAAM,IAAI;EAC3B,MAAM,CAAC;EACR,CAAC,EAEI,IAAS,GAAM,eACf,IAAO,GAAQ,SAAqC,EAAE,EACtD,IACH,EAAI,QAAmB,GAAQ,KAAK,QAAQ,aAAa,GAAG,IAAI,YAC7D,IACJ,GAAQ,eACP,EAAI,eACL,+DACI,IAAU,EAAI,UAAqB,GACnC,IAAY,EAAI,YAAuB,KACvC,IAAY,EAAI,YAAyB,EAAE;AA+BjD,QA7BI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAmB,aAAY;YAC/C,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,KAAS,CAAC,IAEV,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,gBAAgB;EAC7B,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,oBAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACZ,IACG,6DACA;GACA,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,gBAAgB;EAC7B,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,oBAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OACzC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAyC;SAAU,CAAA;QACjE,kBAAC,KAAD;SAAG,WAAU;mBAAiC;SAAgB,CAAA;QAC9D,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,yCAA0C,CAAA,EAC1D,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC7B,kBAAC,QAAD,EAAA,UAAA,CAAO,GAAS,WAAe,EAAA,CAAA,CAC3B;YACF;;QACF;SACF;;KAEL,EAAS,SAAS,KACjB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAwC;OAEjD,CAAA,EACL,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAS,KAAK,MACb,kBAAC,MAAD;QAEE,WAAU;kBAFZ,CAIE,kBAAC,GAAD,EAAa,WAAU,4BAA6B,CAAA,EACnD,EACE;UALE,EAKF,CACL;OACC,CAAA,CACD;;KAGR,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,UAAD;OAAQ,WAAU;iBAAkG;OAE3G,CAAA;MACL,CAAA;KACF;;GACF,CAAA;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/templates/TemplatesPage.tsx"],"names":[],"mappings":"AASA,wBAAgB,aAAa,4CAkG5B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { Sparkles as i, Star as a, Users as o } from "lucide-react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
//#region src/timecampus/pages/templates/TemplatesPage.tsx
|
|
8
|
+
function l() {
|
|
9
|
+
let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = r({ variables: { scope: "WORKSPACE" } }), p = (u?.configurations ?? []).filter((e) => e.key.startsWith("template."));
|
|
10
|
+
return d ? /* @__PURE__ */ s(t, {
|
|
11
|
+
title: "Templates",
|
|
12
|
+
description: "Pre-built workspace templates for different workflows",
|
|
13
|
+
children: /* @__PURE__ */ s(n, {
|
|
14
|
+
variant: "card",
|
|
15
|
+
count: 6
|
|
16
|
+
})
|
|
17
|
+
}) : f ? /* @__PURE__ */ s(t, {
|
|
18
|
+
title: "Templates",
|
|
19
|
+
description: "Pre-built workspace templates for different workflows",
|
|
20
|
+
children: /* @__PURE__ */ s("div", {
|
|
21
|
+
className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
|
|
22
|
+
children: "Failed to load template configurations. Please try again later."
|
|
23
|
+
})
|
|
24
|
+
}) : /* @__PURE__ */ s(t, {
|
|
25
|
+
title: "Templates",
|
|
26
|
+
description: "Pre-built workspace templates for different workflows",
|
|
27
|
+
children: /* @__PURE__ */ s("div", {
|
|
28
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
29
|
+
children: p.length === 0 ? /* @__PURE__ */ s("div", {
|
|
30
|
+
className: "col-span-full p-8 text-center text-sm text-muted-foreground",
|
|
31
|
+
children: "No templates configured yet. Templates are stored as workspace configurations with the \"template.\" key prefix."
|
|
32
|
+
}) : p.map((e) => {
|
|
33
|
+
let t = e.value, n = t.name ?? e.key.replace("template.", ""), r = t.category ?? "General", l = t.industry ?? "Any", u = t.rating ?? 0, d = t.teamSize ?? "-", f = t.downloads ?? 0;
|
|
34
|
+
return /* @__PURE__ */ c("div", {
|
|
35
|
+
className: "rounded-xl border border-border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer",
|
|
36
|
+
children: [/* @__PURE__ */ c("div", {
|
|
37
|
+
className: "flex items-start gap-3",
|
|
38
|
+
children: [/* @__PURE__ */ s("div", {
|
|
39
|
+
className: "flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10",
|
|
40
|
+
children: /* @__PURE__ */ s(i, { className: "h-6 w-6 text-primary" })
|
|
41
|
+
}), /* @__PURE__ */ c("div", {
|
|
42
|
+
className: "flex-1",
|
|
43
|
+
children: [/* @__PURE__ */ s("p", {
|
|
44
|
+
className: "text-sm font-semibold text-foreground",
|
|
45
|
+
children: n
|
|
46
|
+
}), /* @__PURE__ */ c("p", {
|
|
47
|
+
className: "text-xs text-muted-foreground",
|
|
48
|
+
children: [
|
|
49
|
+
r,
|
|
50
|
+
" · ",
|
|
51
|
+
l
|
|
52
|
+
]
|
|
53
|
+
})]
|
|
54
|
+
})]
|
|
55
|
+
}), /* @__PURE__ */ c("div", {
|
|
56
|
+
className: "mt-3 flex items-center justify-between text-xs text-muted-foreground",
|
|
57
|
+
children: [/* @__PURE__ */ c("div", {
|
|
58
|
+
className: "flex items-center gap-3",
|
|
59
|
+
children: [/* @__PURE__ */ c("div", {
|
|
60
|
+
className: "flex items-center gap-1",
|
|
61
|
+
children: [/* @__PURE__ */ s(a, { className: "h-3 w-3 fill-amber-400 text-amber-400" }), /* @__PURE__ */ s("span", { children: u })]
|
|
62
|
+
}), /* @__PURE__ */ c("div", {
|
|
63
|
+
className: "flex items-center gap-1",
|
|
64
|
+
children: [/* @__PURE__ */ s(o, { className: "h-3 w-3" }), /* @__PURE__ */ s("span", { children: d })]
|
|
65
|
+
})]
|
|
66
|
+
}), /* @__PURE__ */ c("span", { children: [f, " uses"] })]
|
|
67
|
+
})]
|
|
68
|
+
}, e.id);
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { l as TemplatesPage };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=TemplatesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPage.js","names":[],"sources":["../../../../src/timecampus/pages/templates/TemplatesPage.tsx"],"sourcesContent":["import { Sparkles, Star, Users } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TemplatesPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent templates (key starts with 'template.')\n const templates = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"template.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load template configurations. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Templates\"\n description=\"Pre-built workspace templates for different workflows\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {templates.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-muted-foreground\">\n No templates configured yet. Templates are stored as workspace\n configurations with the \"template.\" key prefix.\n </div>\n ) : (\n templates.map((template: ConfigurationFieldsFragment) => {\n const val = template.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? template.key.replace(\"template.\", \"\");\n const category = (val.category as string) ?? \"General\";\n const industry = (val.industry as string) ?? \"Any\";\n const rating = (val.rating as number) ?? 0;\n const teamSize = (val.teamSize as string) ?? \"-\";\n const downloads = (val.downloads as number) ?? 0;\n\n return (\n <div\n key={template.id}\n className=\"rounded-xl border border-border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-foreground\">\n {name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {category} · {industry}\n </p>\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-amber-400 text-amber-400\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n <span>{teamSize}</span>\n </div>\n </div>\n <span>{downloads} uses</span>\n </div>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGhB,QAAQ,MACvC,EAAE,IAAI,WAAW,YAAY,CAC9B;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAU,WAAW,IACpB,kBAAC,OAAD;IAAK,WAAU;cAA8D;IAGvE,CAAA,GAEN,EAAU,KAAK,MAA0C;IACvD,IAAM,IAAM,EAAS,OACf,IACH,EAAI,QAAmB,EAAS,IAAI,QAAQ,aAAa,GAAG,EACzD,IAAY,EAAI,YAAuB,WACvC,IAAY,EAAI,YAAuB,OACvC,IAAU,EAAI,UAAqB,GACnC,IAAY,EAAI,YAAuB,KACvC,IAAa,EAAI,aAAwB;AAE/C,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAU,WAAU,wBAAyB,CAAA;OACzC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG;SAAS;SAAW;SACnB;UACA;SACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,yCAA0C,CAAA,EAC1D,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC7B,kBAAC,QAAD,EAAA,UAAO,GAAgB,CAAA,CACnB;UACF;UACN,kBAAC,QAAD,EAAA,UAAA,CAAO,GAAU,QAAY,EAAA,CAAA,CACzB;QACF;OA7BC,EAAS,GA6BV;KAER;GAEA,CAAA;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeEntriesPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"names":[],"mappings":"AASA,wBAAgB,eAAe,4CAsH9B"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { formatDate as e, formatHours as t, getStatusColor as n } from "../../utils/helpers.js";
|
|
2
|
+
import { PageLayout as r } from "../../components/PageLayout.js";
|
|
3
|
+
import { LoadingSkeleton as i } from "../../components/LoadingSkeleton.js";
|
|
4
|
+
import { useListTimeEntriesQuery as a } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { Filter as o, Plus as s } from "lucide-react";
|
|
6
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
//#region src/timecampus/pages/time/TimeEntriesPage.tsx
|
|
8
|
+
function u() {
|
|
9
|
+
let { data: u, loading: d, error: f } = a({ variables: { limit: 50 } }), p = u?.timeEntries?.items ?? [];
|
|
10
|
+
return f ? /* @__PURE__ */ c(r, {
|
|
11
|
+
title: "Time Entries",
|
|
12
|
+
description: "View and manage all time entries",
|
|
13
|
+
children: /* @__PURE__ */ c("div", {
|
|
14
|
+
className: "rounded-xl border border-red-200 bg-red-50 p-6 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400",
|
|
15
|
+
children: "Failed to load time entries. Please try again later."
|
|
16
|
+
})
|
|
17
|
+
}) : /* @__PURE__ */ c(r, {
|
|
18
|
+
title: "Time Entries",
|
|
19
|
+
description: "View and manage all time entries",
|
|
20
|
+
actions: /* @__PURE__ */ l("div", {
|
|
21
|
+
className: "flex items-center gap-2",
|
|
22
|
+
children: [/* @__PURE__ */ l("button", {
|
|
23
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
|
|
24
|
+
children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Filter"]
|
|
25
|
+
}), /* @__PURE__ */ l("button", {
|
|
26
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
|
|
27
|
+
children: [/* @__PURE__ */ c(s, { className: "h-4 w-4" }), "Add Entry"]
|
|
28
|
+
})]
|
|
29
|
+
}),
|
|
30
|
+
children: d ? /* @__PURE__ */ c(i, {
|
|
31
|
+
variant: "table",
|
|
32
|
+
count: 5
|
|
33
|
+
}) : /* @__PURE__ */ c("div", {
|
|
34
|
+
className: "rounded-xl border border-border bg-card",
|
|
35
|
+
children: /* @__PURE__ */ c("div", {
|
|
36
|
+
className: "overflow-x-auto",
|
|
37
|
+
children: /* @__PURE__ */ l("table", {
|
|
38
|
+
className: "w-full",
|
|
39
|
+
children: [/* @__PURE__ */ c("thead", { children: /* @__PURE__ */ l("tr", {
|
|
40
|
+
className: "border-b border-border",
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ c("th", {
|
|
43
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
44
|
+
children: "Date"
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ c("th", {
|
|
47
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
48
|
+
children: "Project"
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ c("th", {
|
|
51
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
52
|
+
children: "Task"
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ c("th", {
|
|
55
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
56
|
+
children: "Duration"
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ c("th", {
|
|
59
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
60
|
+
children: "Billable"
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ c("th", {
|
|
63
|
+
className: "px-4 py-3 text-left text-xs font-medium text-muted-foreground",
|
|
64
|
+
children: "Status"
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
}) }), /* @__PURE__ */ l("tbody", {
|
|
68
|
+
className: "divide-y divide-border",
|
|
69
|
+
children: [p.map((r) => /* @__PURE__ */ l("tr", {
|
|
70
|
+
className: "hover:bg-muted/50 transition-colors",
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ c("td", {
|
|
73
|
+
className: "px-4 py-3 text-sm text-muted-foreground",
|
|
74
|
+
children: e(r.startTime)
|
|
75
|
+
}),
|
|
76
|
+
/* @__PURE__ */ c("td", {
|
|
77
|
+
className: "px-4 py-3 text-sm font-medium text-foreground",
|
|
78
|
+
children: r.project?.name ?? "No Project"
|
|
79
|
+
}),
|
|
80
|
+
/* @__PURE__ */ c("td", {
|
|
81
|
+
className: "px-4 py-3 text-sm text-muted-foreground",
|
|
82
|
+
children: r.task?.title ?? r.description ?? "No description"
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ c("td", {
|
|
85
|
+
className: "px-4 py-3 text-sm font-mono text-foreground",
|
|
86
|
+
children: t((r.duration ?? 0) / 3600)
|
|
87
|
+
}),
|
|
88
|
+
/* @__PURE__ */ c("td", {
|
|
89
|
+
className: "px-4 py-3",
|
|
90
|
+
children: /* @__PURE__ */ c("span", {
|
|
91
|
+
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${r.billable ? "bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400" : "bg-gray-100 text-gray-600 dark:bg-gray-900/30 dark:text-gray-400"}`,
|
|
92
|
+
children: r.billable ? "Yes" : "No"
|
|
93
|
+
})
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ c("td", {
|
|
96
|
+
className: "px-4 py-3",
|
|
97
|
+
children: /* @__PURE__ */ c("span", {
|
|
98
|
+
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${n(r.isRunning ? "running" : "completed")}`,
|
|
99
|
+
children: r.isRunning ? "running" : "completed"
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}, r.id)), p.length === 0 && /* @__PURE__ */ c("tr", { children: /* @__PURE__ */ c("td", {
|
|
104
|
+
colSpan: 6,
|
|
105
|
+
className: "px-4 py-8 text-center text-sm text-muted-foreground",
|
|
106
|
+
children: "No time entries found"
|
|
107
|
+
}) })]
|
|
108
|
+
})]
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
export { u as TimeEntriesPage };
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=TimeEntriesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeEntriesPage.js","names":[],"sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"sourcesContent":["import { Clock, Plus, Filter } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, formatDate, getStatusColor } from \"../../utils/helpers\";\nimport {\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TimeEntriesPage() {\n const { data, loading, error } = useListTimeEntriesQuery({\n variables: { limit: 50 },\n });\n\n const entries = data?.timeEntries?.items ?? [];\n\n if (error) {\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n >\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-6 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400\">\n Failed to load time entries. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Time Entries\"\n description=\"View and manage all time entries\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button className=\"inline-flex items-center gap-1.5 rounded-md border border-border px-3 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n <Filter className=\"h-4 w-4\" />\n Filter\n </button>\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-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 Entry\n </button>\n </div>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"table\" count={5} />\n ) : (\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Date\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Project\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Task\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Duration\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Billable\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-muted-foreground\">\n Status\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {entries.map((entry: TimeEntryFieldsFragment) => (\n <tr\n key={entry.id}\n className=\"hover:bg-muted/50 transition-colors\"\n >\n <td className=\"px-4 py-3 text-sm text-muted-foreground\">\n {formatDate(entry.startTime)}\n </td>\n <td className=\"px-4 py-3 text-sm font-medium text-foreground\">\n {entry.project?.name ?? \"No Project\"}\n </td>\n <td className=\"px-4 py-3 text-sm text-muted-foreground\">\n {entry.task?.title ??\n entry.description ??\n \"No description\"}\n </td>\n <td className=\"px-4 py-3 text-sm font-mono text-foreground\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${entry.billable ? \"bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400\" : \"bg-gray-100 text-gray-600 dark:bg-gray-900/30 dark:text-gray-400\"}`}\n >\n {entry.billable ? \"Yes\" : \"No\"}\n </span>\n </td>\n <td className=\"px-4 py-3\">\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(entry.isRunning ? \"running\" : \"completed\")}`}\n >\n {entry.isRunning ? \"running\" : \"completed\"}\n </span>\n </td>\n </tr>\n ))}\n {entries.length === 0 && (\n <tr>\n <td\n colSpan={6}\n className=\"px-4 py-8 text-center text-sm text-muted-foreground\"\n >\n No time entries found\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,YAAS,aAAU,EAAwB,EACvD,WAAW,EAAE,OAAO,IAAI,EACzB,CAAC,EAEI,IAAU,GAAM,aAAa,SAAS,EAAE;AAe9C,QAbI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,SAEvB;OACT,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,YAErB;MACL;;YAGP,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAQ,OAAO;GAAK,CAAA,GAE7C,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBAAgE;QAEzE,CAAA;OACF;SACC,CAAA,EACR,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACG,EAAQ,KAAK,MACZ,kBAAC,MAAD;OAEE,WAAU;iBAFZ;QAIE,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAW,EAAM,UAAU;SACzB,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAM,SAAS,QAAQ;SACrB,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAM,MAAM,SACX,EAAM,eACN;SACC,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACX,GAAa,EAAM,YAAY,KAAK,KAAK;SACvC,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,QAAD;UACE,WAAW,4DAA4D,EAAM,WAAW,iFAAiF;oBAExK,EAAM,WAAW,QAAQ;UACrB,CAAA;SACJ,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,QAAD;UACE,WAAW,4DAA4D,EAAe,EAAM,YAAY,YAAY,YAAY;oBAE/H,EAAM,YAAY,YAAY;UAC1B,CAAA;SACJ,CAAA;QACF;SA/BE,EAAM,GA+BR,CACL,EACD,EAAQ,WAAW,KAClB,kBAAC,MAAD,EAAA,UACE,kBAAC,MAAD;OACE,SAAS;OACT,WAAU;iBACX;OAEI,CAAA,EACF,CAAA,CAED;QACF;;IACJ,CAAA;GACF,CAAA;EAEG,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeTrackingPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/time/TimeTrackingPage.tsx"],"names":[],"mappings":"AAaA,wBAAgB,gBAAgB,4CAwK/B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { formatHours as e, formatTimerDuration as t } from "../../utils/helpers.js";
|
|
2
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
3
|
+
import { StatCard as r } from "../../components/StatCard.js";
|
|
4
|
+
import { LoadingSkeleton as i } from "../../components/LoadingSkeleton.js";
|
|
5
|
+
import { useTimeCampusStore as a } from "../../store/timecampusStore.js";
|
|
6
|
+
import { useGetTimeEntryStatsQuery as o, useListTimeEntriesQuery as s } from "../../../generated/wspace-operations.js";
|
|
7
|
+
import { Clock as c, Pause as l, Play as u, Square as d } from "lucide-react";
|
|
8
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
9
|
+
import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
|
+
//#region src/timecampus/pages/time/TimeTrackingPage.tsx
|
|
11
|
+
function g() {
|
|
12
|
+
let { t: g } = h(), _ = (e, t) => {
|
|
13
|
+
let n = g(e);
|
|
14
|
+
return n === e ? t : n;
|
|
15
|
+
}, { activeTimer: v, startTimer: y, stopTimer: b } = a(), { data: x, loading: S } = o(), { data: C, loading: w } = s({ variables: { limit: 10 } }), T = x?.timeEntryStats, E = C?.timeEntries?.items ?? [];
|
|
16
|
+
return S ? /* @__PURE__ */ p(n, {
|
|
17
|
+
title: _("timecampus.timeTracking.title", "Time Tracking"),
|
|
18
|
+
description: _("timecampus.timeTracking.description", "Track and manage your work hours"),
|
|
19
|
+
children: /* @__PURE__ */ p(i, {
|
|
20
|
+
variant: "card",
|
|
21
|
+
count: 4
|
|
22
|
+
})
|
|
23
|
+
}) : /* @__PURE__ */ m(n, {
|
|
24
|
+
title: _("timecampus.timeTracking.title", "Time Tracking"),
|
|
25
|
+
description: _("timecampus.timeTracking.description", "Track and manage your work hours"),
|
|
26
|
+
actions: /* @__PURE__ */ p("button", {
|
|
27
|
+
onClick: () => v ? b() : y(),
|
|
28
|
+
className: `inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium ${v ? "bg-red-500 text-white hover:bg-red-600" : "bg-primary text-primary-foreground hover:bg-primary/90"}`,
|
|
29
|
+
children: v ? /* @__PURE__ */ m(f, { children: [
|
|
30
|
+
/* @__PURE__ */ p(d, { className: "h-4 w-4" }),
|
|
31
|
+
_("timecampus.timeTracking.actions.stop", "Stop"),
|
|
32
|
+
" (",
|
|
33
|
+
t(v.seconds),
|
|
34
|
+
")"
|
|
35
|
+
] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(u, { className: "h-4 w-4" }), _("timecampus.timeTracking.actions.startTimer", "Start Timer")] })
|
|
36
|
+
}),
|
|
37
|
+
children: [/* @__PURE__ */ m("div", {
|
|
38
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ p(r, {
|
|
41
|
+
title: _("timecampus.timeTracking.stats.today", "Today"),
|
|
42
|
+
value: e(T?.totalHours ?? 0),
|
|
43
|
+
icon: /* @__PURE__ */ p(c, { className: "h-5 w-5" }),
|
|
44
|
+
trend: {
|
|
45
|
+
value: 15,
|
|
46
|
+
label: _("timecampus.timeTracking.stats.vsYesterday", "vs yesterday")
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ p(r, {
|
|
50
|
+
title: _("timecampus.timeTracking.stats.billable", "Billable"),
|
|
51
|
+
value: e(T?.billableHours ?? 0),
|
|
52
|
+
icon: /* @__PURE__ */ p(c, { className: "h-5 w-5" }),
|
|
53
|
+
description: `${T?.totalEntries ?? 0} ${_("timecampus.timeTracking.stats.entries", "entries")}`
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ p(r, {
|
|
56
|
+
title: _("timecampus.timeTracking.stats.activeTimers", "Active Timers"),
|
|
57
|
+
value: T?.activeTimers ?? 0,
|
|
58
|
+
icon: /* @__PURE__ */ p(c, { className: "h-5 w-5" }),
|
|
59
|
+
description: _("timecampus.timeTracking.stats.currentlyRunning", "Currently running")
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ p(r, {
|
|
62
|
+
title: _("timecampus.timeTracking.stats.activeTimer", "Active Timer"),
|
|
63
|
+
value: v ? t(v.seconds) : _("timecampus.timeTracking.stats.stopped", "Stopped"),
|
|
64
|
+
icon: p(v ? l : u, { className: "h-5 w-5" })
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
}), /* @__PURE__ */ m("div", {
|
|
68
|
+
className: "rounded-xl border border-border bg-card p-6",
|
|
69
|
+
children: [/* @__PURE__ */ p("h3", {
|
|
70
|
+
className: "mb-4 text-sm font-semibold text-foreground",
|
|
71
|
+
children: _("timecampus.timeTracking.entries.title", "Today's Entries")
|
|
72
|
+
}), w ? /* @__PURE__ */ p(i, {
|
|
73
|
+
variant: "list",
|
|
74
|
+
count: 4
|
|
75
|
+
}) : E.length === 0 ? /* @__PURE__ */ p("div", {
|
|
76
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
77
|
+
children: /* @__PURE__ */ p("p", {
|
|
78
|
+
className: "text-sm text-muted-foreground",
|
|
79
|
+
children: _("timecampus.timeTracking.entries.empty", "No time entries yet. Start a timer to begin tracking.")
|
|
80
|
+
})
|
|
81
|
+
}) : /* @__PURE__ */ p("div", {
|
|
82
|
+
className: "flex flex-col gap-2",
|
|
83
|
+
children: E.map((t) => /* @__PURE__ */ m("div", {
|
|
84
|
+
className: "flex items-center justify-between rounded-lg border border-border p-3 transition-colors hover:bg-muted/50",
|
|
85
|
+
children: [/* @__PURE__ */ m("div", {
|
|
86
|
+
className: "min-w-0 flex-1",
|
|
87
|
+
children: [/* @__PURE__ */ p("p", {
|
|
88
|
+
className: "text-sm font-medium text-foreground",
|
|
89
|
+
children: t.project?.name ?? _("timecampus.timeTracking.entries.noProject", "No Project")
|
|
90
|
+
}), /* @__PURE__ */ p("p", {
|
|
91
|
+
className: "text-xs text-muted-foreground",
|
|
92
|
+
children: t.description ?? _("timecampus.timeTracking.entries.noDescription", "No description")
|
|
93
|
+
})]
|
|
94
|
+
}), /* @__PURE__ */ m("div", {
|
|
95
|
+
className: "ml-4 text-right",
|
|
96
|
+
children: [/* @__PURE__ */ p("p", {
|
|
97
|
+
className: "text-sm font-mono font-medium text-foreground",
|
|
98
|
+
children: e((t.duration ?? 0) / 3600)
|
|
99
|
+
}), /* @__PURE__ */ p("span", {
|
|
100
|
+
className: "inline-flex items-center rounded-full bg-emerald-100 px-2 py-0.5 text-xs font-medium text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400",
|
|
101
|
+
children: t.isRunning ? _("timecampus.timeTracking.entries.status.running", "running") : _("timecampus.timeTracking.entries.status.completed", "completed")
|
|
102
|
+
})]
|
|
103
|
+
})]
|
|
104
|
+
}, t.id))
|
|
105
|
+
})]
|
|
106
|
+
})]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { g as TimeTrackingPage };
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=TimeTrackingPage.js.map
|