@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":"PomodoroSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroSettingsPage.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 useGetPomodoroSettingsQuery,\n useUpdatePomodoroSettingsMutation,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetPomodoroSettingsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const [updateSettings, { loading: saving }] =\n useUpdatePomodoroSettingsMutation();\n\n const settings = data?.pomodoroSettings;\n\n const [focusDuration, setFocusDuration] = useState(25);\n const [shortBreak, setShortBreak] = useState(5);\n const [longBreak, setLongBreak] = useState(15);\n const [soundEnabled, setSoundEnabled] = useState(true);\n const [notificationsEnabled, setNotificationsEnabled] = useState(true);\n const [autoStartBreaks, setAutoStartBreaks] = useState(false);\n\n useEffect(() => {\n if (settings) {\n setFocusDuration(settings.focusDuration);\n setShortBreak(settings.shortBreakDuration);\n setLongBreak(settings.longBreakDuration);\n setSoundEnabled(settings.soundEnabled);\n setNotificationsEnabled(settings.notificationsEnabled);\n setAutoStartBreaks(settings.autoStartBreaks);\n }\n }, [settings]);\n\n const handleSave = useCallback(async () => {\n if (!workspaceId) return;\n await updateSettings({\n variables: {\n input: {\n workspaceId,\n focusDuration,\n shortBreakDuration: shortBreak,\n longBreakDuration: longBreak,\n soundEnabled,\n notificationsEnabled,\n autoStartBreaks,\n },\n },\n refetchQueries: [\"GetPomodoroSettings\"],\n });\n }, [\n workspaceId,\n focusDuration,\n shortBreak,\n longBreak,\n soundEnabled,\n notificationsEnabled,\n autoStartBreaks,\n updateSettings,\n ]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"Pomodoro Settings\"\n description=\"Configure your Pomodoro timer preferences\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Pomodoro Settings\"\n description=\"Configure your Pomodoro timer preferences\"\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 settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Pomodoro Settings\"\n description=\"Configure your Pomodoro timer 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 Timer Durations\n </h3>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n Focus Duration\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Length of each focus session\n </p>\n </div>\n <input\n type=\"number\"\n value={focusDuration}\n onChange={(e) => setFocusDuration(Number(e.target.value))}\n className=\"w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right\"\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n Short Break\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Break between focus sessions\n </p>\n </div>\n <input\n type=\"number\"\n value={shortBreak}\n onChange={(e) => setShortBreak(Number(e.target.value))}\n className=\"w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right\"\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n Long Break\n </p>\n <p className=\"text-xs text-muted-foreground\">\n After every 4 focus sessions\n </p>\n </div>\n <input\n type=\"number\"\n value={longBreak}\n onChange={(e) => setLongBreak(Number(e.target.value))}\n className=\"w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right\"\n />\n </div>\n </div>\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 Notifications\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-foreground\">Sound alerts</span>\n <input\n type=\"checkbox\"\n checked={soundEnabled}\n onChange={(e) => setSoundEnabled(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 Desktop notifications\n </span>\n <input\n type=\"checkbox\"\n checked={notificationsEnabled}\n onChange={(e) => setNotificationsEnabled(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\">Auto-start breaks</span>\n <input\n type=\"checkbox\"\n checked={autoStartBreaks}\n onChange={(e) => setAutoStartBreaks(e.target.checked)}\n className=\"h-4 w-4 rounded border-border\"\n />\n </label>\n </div>\n </div>\n\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,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA4B;EAC3D,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,CAAC,GAAgB,EAAE,SAAS,OAChC,GAAmC,EAE/B,IAAW,GAAM,kBAEjB,CAAC,GAAe,KAAoB,EAAS,GAAG,EAChD,CAAC,GAAY,KAAiB,EAAS,EAAE,EACzC,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAc,KAAmB,EAAS,GAAK,EAChD,CAAC,GAAsB,KAA2B,EAAS,GAAK,EAChE,CAAC,GAAiB,KAAsB,EAAS,GAAM;AAE7D,SAAgB;AACd,EAAI,MACF,EAAiB,EAAS,cAAc,EACxC,EAAc,EAAS,mBAAmB,EAC1C,EAAa,EAAS,kBAAkB,EACxC,EAAgB,EAAS,aAAa,EACtC,EAAwB,EAAS,qBAAqB,EACtD,EAAmB,EAAS,gBAAgB;IAE7C,CAAC,EAAS,CAAC;CAEd,IAAM,IAAa,EAAY,YAAY;AACpC,OACL,MAAM,EAAe;GACnB,WAAW,EACT,OAAO;IACL;IACA;IACA,oBAAoB;IACpB,mBAAmB;IACnB;IACA;IACA;IACD,EACF;GACD,gBAAgB,CAAC,sBAAsB;GACxC,CAAC;IACD;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AA0BF,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;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,kBAE7B;SACL,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAsC;SAE/C,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAAgC;SAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;SACE,MAAK;SACL,OAAO;SACP,WAAW,MAAM,EAAiB,OAAO,EAAE,OAAO,MAAM,CAAC;SACzD,WAAU;SACV,CAAA,CACE;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAsC;SAE/C,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAAgC;SAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;SACE,MAAK;SACL,OAAO;SACP,WAAW,MAAM,EAAc,OAAO,EAAE,OAAO,MAAM,CAAC;SACtD,WAAU;SACV,CAAA,CACE;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAsC;SAE/C,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAAgC;SAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,SAAD;SACE,MAAK;SACL,OAAO;SACP,WAAW,MAAM,EAAa,OAAO,EAAE,OAAO,MAAM,CAAC;SACrD,WAAU;SACV,CAAA,CACE;;OACF;QACF;;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA6C;MAEtD,CAAA,EACL,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA0B;SAAmB,CAAA,EAC7D,kBAAC,SAAD;SACE,MAAK;SACL,SAAS;SACT,WAAW,MAAM,EAAgB,EAAE,OAAO,QAAQ;SAClD,WAAU;SACV,CAAA,CACI;;OACR,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA0B;SAEnC,CAAA,EACP,kBAAC,SAAD;SACE,MAAK;SACL,SAAS;SACT,WAAW,MAAM,EAAwB,EAAE,OAAO,QAAQ;SAC1D,WAAU;SACV,CAAA,CACI;;OACR,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA0B;SAAwB,CAAA,EAClE,kBAAC,SAAD;SACE,MAAK;SACL,SAAS;SACT,WAAW,MAAM,EAAmB,EAAE,OAAO,QAAQ;SACrD,WAAU;SACV,CAAA,CACI;;OACJ;QACF;;IAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,UAAD;MACE,SAAS;MACT,UAAU;MACV,WAAU;gBAET,IAAS,cAAc;MACjB,CAAA;KACL,CAAA;IACF;;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectCreatePage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/projects/ProjectCreatePage.tsx"],"names":[],"mappings":"AAKA,wBAAgB,iBAAiB,4CAyHhC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { PageLayout as e } from "../../components/PageLayout.js";
|
|
2
|
+
import { useCreateProjectMutation as t } from "../../../generated/wspace-operations.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { ArrowLeft as r } from "lucide-react";
|
|
5
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
+
//#region src/timecampus/pages/projects/ProjectCreatePage.tsx
|
|
7
|
+
function o() {
|
|
8
|
+
let [o, s] = n(""), [c, l] = n(""), [u, d] = n(""), [f, p] = n(""), [m, h] = n(""), [g, { loading: _, error: v }] = t();
|
|
9
|
+
return /* @__PURE__ */ i(e, {
|
|
10
|
+
title: "Create Project",
|
|
11
|
+
description: "Set up a new project for time tracking",
|
|
12
|
+
actions: /* @__PURE__ */ a("button", {
|
|
13
|
+
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",
|
|
14
|
+
children: [/* @__PURE__ */ i(r, { className: "h-4 w-4" }), "Back to Projects"]
|
|
15
|
+
}),
|
|
16
|
+
children: /* @__PURE__ */ a("div", {
|
|
17
|
+
className: "mx-auto max-w-2xl rounded-xl border border-border bg-card p-6",
|
|
18
|
+
children: [v && /* @__PURE__ */ i("div", {
|
|
19
|
+
className: "mb-4 rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400",
|
|
20
|
+
children: "Failed to create project. Please try again."
|
|
21
|
+
}), /* @__PURE__ */ a("div", {
|
|
22
|
+
className: "space-y-4",
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
25
|
+
className: "block text-sm font-medium text-foreground",
|
|
26
|
+
children: "Project Name"
|
|
27
|
+
}), /* @__PURE__ */ i("input", {
|
|
28
|
+
type: "text",
|
|
29
|
+
placeholder: "Enter project name",
|
|
30
|
+
value: o,
|
|
31
|
+
onChange: (e) => s(e.target.value),
|
|
32
|
+
className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground"
|
|
33
|
+
})] }),
|
|
34
|
+
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
35
|
+
className: "block text-sm font-medium text-foreground",
|
|
36
|
+
children: "Client"
|
|
37
|
+
}), /* @__PURE__ */ i("input", {
|
|
38
|
+
type: "text",
|
|
39
|
+
placeholder: "Client name",
|
|
40
|
+
value: c,
|
|
41
|
+
onChange: (e) => l(e.target.value),
|
|
42
|
+
className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground"
|
|
43
|
+
})] }),
|
|
44
|
+
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
45
|
+
className: "block text-sm font-medium text-foreground",
|
|
46
|
+
children: "Description"
|
|
47
|
+
}), /* @__PURE__ */ i("textarea", {
|
|
48
|
+
placeholder: "Project description",
|
|
49
|
+
rows: 3,
|
|
50
|
+
value: u,
|
|
51
|
+
onChange: (e) => d(e.target.value),
|
|
52
|
+
className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground"
|
|
53
|
+
})] }),
|
|
54
|
+
/* @__PURE__ */ a("div", {
|
|
55
|
+
className: "grid grid-cols-2 gap-4",
|
|
56
|
+
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
57
|
+
className: "block text-sm font-medium text-foreground",
|
|
58
|
+
children: "Estimated Hours"
|
|
59
|
+
}), /* @__PURE__ */ i("input", {
|
|
60
|
+
type: "number",
|
|
61
|
+
placeholder: "0",
|
|
62
|
+
value: f,
|
|
63
|
+
onChange: (e) => p(e.target.value),
|
|
64
|
+
className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground"
|
|
65
|
+
})] }), /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
66
|
+
className: "block text-sm font-medium text-foreground",
|
|
67
|
+
children: "Hourly Rate"
|
|
68
|
+
}), /* @__PURE__ */ i("input", {
|
|
69
|
+
type: "number",
|
|
70
|
+
placeholder: "0.00",
|
|
71
|
+
value: m,
|
|
72
|
+
onChange: (e) => h(e.target.value),
|
|
73
|
+
className: "mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground"
|
|
74
|
+
})] })]
|
|
75
|
+
}),
|
|
76
|
+
/* @__PURE__ */ a("div", {
|
|
77
|
+
className: "flex justify-end gap-2 pt-4",
|
|
78
|
+
children: [/* @__PURE__ */ i("button", {
|
|
79
|
+
className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-muted/50",
|
|
80
|
+
children: "Cancel"
|
|
81
|
+
}), /* @__PURE__ */ i("button", {
|
|
82
|
+
onClick: async () => {
|
|
83
|
+
o.trim() && await g({ variables: { input: {
|
|
84
|
+
name: o.trim(),
|
|
85
|
+
description: u.trim() || void 0,
|
|
86
|
+
clientId: c.trim() || void 0,
|
|
87
|
+
estimatedHours: f ? Number(f) : void 0,
|
|
88
|
+
hourlyRate: m ? Number(m) : void 0
|
|
89
|
+
} } });
|
|
90
|
+
},
|
|
91
|
+
disabled: _ || !o.trim(),
|
|
92
|
+
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50",
|
|
93
|
+
children: _ ? "Creating..." : "Create Project"
|
|
94
|
+
})]
|
|
95
|
+
})
|
|
96
|
+
]
|
|
97
|
+
})]
|
|
98
|
+
})
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
102
|
+
export { o as ProjectCreatePage };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=ProjectCreatePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/projects/ProjectCreatePage.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { useCreateProjectMutation } from \"@/generated/wspace-operations\";\n\nexport function ProjectCreatePage() {\n const [name, setName] = useState(\"\");\n const [clientId, setClientId] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [estimatedHours, setEstimatedHours] = useState(\"\");\n const [hourlyRate, setHourlyRate] = useState(\"\");\n\n const [createProject, { loading: creating, error }] =\n useCreateProjectMutation();\n\n const handleSubmit = async () => {\n if (!name.trim()) return;\n await createProject({\n variables: {\n input: {\n name: name.trim(),\n description: description.trim() || undefined,\n clientId: clientId.trim() || undefined,\n estimatedHours: estimatedHours ? Number(estimatedHours) : undefined,\n hourlyRate: hourlyRate ? Number(hourlyRate) : undefined,\n },\n },\n });\n };\n\n return (\n <PageLayout\n title=\"Create Project\"\n description=\"Set up a new project for time tracking\"\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 Projects\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl rounded-xl border border-border bg-card p-6\">\n {error && (\n <div className=\"mb-4 rounded-lg border border-red-200 bg-red-50 p-3 text-sm text-red-700 dark:border-red-900 dark:bg-red-950/50 dark:text-red-400\">\n Failed to create project. Please try again.\n </div>\n )}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Project Name\n </label>\n <input\n type=\"text\"\n placeholder=\"Enter project name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Client\n </label>\n <input\n type=\"text\"\n placeholder=\"Client name\"\n value={clientId}\n onChange={(e) => setClientId(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Description\n </label>\n <textarea\n placeholder=\"Project description\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Estimated Hours\n </label>\n <input\n type=\"number\"\n placeholder=\"0\"\n value={estimatedHours}\n onChange={(e) => setEstimatedHours(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground\">\n Hourly Rate\n </label>\n <input\n type=\"number\"\n placeholder=\"0.00\"\n value={hourlyRate}\n onChange={(e) => setHourlyRate(e.target.value)}\n className=\"mt-1 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground\"\n />\n </div>\n </div>\n <div className=\"flex justify-end gap-2 pt-4\">\n <button className=\"rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-muted/50\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={creating || !name.trim()}\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 {creating ? \"Creating...\" : \"Create Project\"}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAgB,IAAoB;CAClC,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAgB,KAAqB,EAAS,GAAG,EAClD,CAAC,GAAY,KAAiB,EAAS,GAAG,EAE1C,CAAC,GAAe,EAAE,SAAS,GAAU,cACzC,GAA0B;AAiB5B,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,mBAE1B;;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,KACC,kBAAC,OAAD;IAAK,WAAU;cAAoI;IAE7I,CAAA,EAER,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA4C;MAErD,CAAA,EACR,kBAAC,SAAD;MACE,MAAK;MACL,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;MACxC,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA4C;MAErD,CAAA,EACR,kBAAC,SAAD;MACE,MAAK;MACL,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM;MAC5C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;MAAO,WAAU;gBAA4C;MAErD,CAAA,EACR,kBAAC,YAAD;MACE,aAAY;MACZ,MAAM;MACN,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE,EAAA,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA4C;OAErD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAkB,EAAE,OAAO,MAAM;OAClD,WAAU;OACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,WAAU;iBAA4C;OAErD,CAAA,EACR,kBAAC,SAAD;OACE,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAc,EAAE,OAAO,MAAM;OAC9C,WAAU;OACV,CAAA,CACE,EAAA,CAAA,CACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OAAQ,WAAU;iBAAkG;OAE3G,CAAA,EACT,kBAAC,UAAD;OACE,SApGS,YAAY;AAC1B,UAAK,MAAM,IAChB,MAAM,EAAc,EAClB,WAAW,EACT,OAAO;SACL,MAAM,EAAK,MAAM;SACjB,aAAa,EAAY,MAAM,IAAI,KAAA;SACnC,UAAU,EAAS,MAAM,IAAI,KAAA;SAC7B,gBAAgB,IAAiB,OAAO,EAAe,GAAG,KAAA;SAC1D,YAAY,IAAa,OAAO,EAAW,GAAG,KAAA;SAC/C,EACF,EACF,CAAC;;OAyFQ,UAAU,KAAY,CAAC,EAAK,MAAM;OAClC,WAAU;iBAET,IAAW,gBAAgB;OACrB,CAAA,CACL;;KACF;MACF;;EACK,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/projects/ProjectDetailPage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,iBAAiB,4CA6GhC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { formatCurrency as e, formatHours 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 { useGetProjectQuery as a, useGetProjectStatsQuery as o } from "../../../generated/wspace-operations.js";
|
|
6
|
+
import { Clock as s, FolderOpen as c, TrendingUp as l, Users as u } from "lucide-react";
|
|
7
|
+
import { useParams as d } from "react-router-dom";
|
|
8
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
9
|
+
//#region src/timecampus/pages/projects/ProjectDetailPage.tsx
|
|
10
|
+
function m() {
|
|
11
|
+
let { projectId: m } = d(), { data: h, loading: g, error: _ } = a({
|
|
12
|
+
variables: { id: m },
|
|
13
|
+
skip: !m
|
|
14
|
+
}), { data: v, loading: y } = o({
|
|
15
|
+
variables: { id: m },
|
|
16
|
+
skip: !m
|
|
17
|
+
}), b = h?.project, x = v?.projectStats;
|
|
18
|
+
return _ ? /* @__PURE__ */ f(n, {
|
|
19
|
+
title: "Project Details",
|
|
20
|
+
description: `Project ID: ${m}`,
|
|
21
|
+
children: /* @__PURE__ */ f("div", {
|
|
22
|
+
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",
|
|
23
|
+
children: "Failed to load project details. Please try again later."
|
|
24
|
+
})
|
|
25
|
+
}) : g || y ? /* @__PURE__ */ f(n, {
|
|
26
|
+
title: "Project Details",
|
|
27
|
+
description: `Project ID: ${m}`,
|
|
28
|
+
children: /* @__PURE__ */ f(i, { variant: "detail" })
|
|
29
|
+
}) : /* @__PURE__ */ p(n, {
|
|
30
|
+
title: b?.name ?? "Project Details",
|
|
31
|
+
description: b?.description ?? `Project ID: ${m}`,
|
|
32
|
+
children: [/* @__PURE__ */ p("div", {
|
|
33
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ f(r, {
|
|
36
|
+
title: "Tracked Hours",
|
|
37
|
+
value: t(x?.totalHours ?? b?.trackedHours ?? 0),
|
|
38
|
+
icon: /* @__PURE__ */ f(s, { className: "h-5 w-5" })
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ f(r, {
|
|
41
|
+
title: "Tasks",
|
|
42
|
+
value: `${x?.completedTasks ?? 0} / ${x?.totalTasks ?? 0}`,
|
|
43
|
+
icon: /* @__PURE__ */ f(u, { className: "h-5 w-5" }),
|
|
44
|
+
description: "completed / total"
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ f(r, {
|
|
47
|
+
title: "Progress",
|
|
48
|
+
value: x?.totalTasks ? `${Math.round((x?.completedTasks ?? 0) / x.totalTasks * 100)}%` : "0%",
|
|
49
|
+
icon: /* @__PURE__ */ f(l, { className: "h-5 w-5" })
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ f(r, {
|
|
52
|
+
title: "Budget Used",
|
|
53
|
+
value: e(x?.budgetUsed ?? 0, b?.currency ?? "USD"),
|
|
54
|
+
icon: /* @__PURE__ */ f(c, { className: "h-5 w-5" }),
|
|
55
|
+
description: x?.budgetRemaining == null ? void 0 : `${e(x.budgetRemaining, b?.currency ?? "USD")} remaining`
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
}), /* @__PURE__ */ p("div", {
|
|
59
|
+
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
60
|
+
children: [/* @__PURE__ */ p("div", {
|
|
61
|
+
className: "rounded-xl border border-border bg-card p-6",
|
|
62
|
+
children: [/* @__PURE__ */ f("h3", {
|
|
63
|
+
className: "mb-4 text-sm font-semibold text-foreground",
|
|
64
|
+
children: "Recent Activity"
|
|
65
|
+
}), /* @__PURE__ */ f("div", {
|
|
66
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
67
|
+
children: /* @__PURE__ */ f("p", {
|
|
68
|
+
className: "text-sm text-muted-foreground",
|
|
69
|
+
children: "Activity timeline will render here"
|
|
70
|
+
})
|
|
71
|
+
})]
|
|
72
|
+
}), /* @__PURE__ */ p("div", {
|
|
73
|
+
className: "rounded-xl border border-border bg-card p-6",
|
|
74
|
+
children: [/* @__PURE__ */ f("h3", {
|
|
75
|
+
className: "mb-4 text-sm font-semibold text-foreground",
|
|
76
|
+
children: "Time Distribution"
|
|
77
|
+
}), /* @__PURE__ */ f("div", {
|
|
78
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
79
|
+
children: /* @__PURE__ */ f("p", {
|
|
80
|
+
className: "text-sm text-muted-foreground",
|
|
81
|
+
children: "Chart will render here"
|
|
82
|
+
})
|
|
83
|
+
})]
|
|
84
|
+
})]
|
|
85
|
+
})]
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { m as ProjectDetailPage };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=ProjectDetailPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/projects/ProjectDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { FolderOpen, Clock, Users, TrendingUp } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, formatCurrency } from \"../../utils/helpers\";\nimport {\n useGetProjectQuery,\n useGetProjectStatsQuery,\n} from \"@/generated/wspace-operations\";\n\nexport function ProjectDetailPage() {\n const { projectId } = useParams<{ projectId: string }>();\n\n const {\n data: projectData,\n loading: projectLoading,\n error: projectError,\n } = useGetProjectQuery({\n variables: { id: projectId! },\n skip: !projectId,\n });\n\n const { data: statsData, loading: statsLoading } = useGetProjectStatsQuery({\n variables: { id: projectId! },\n skip: !projectId,\n });\n\n const project = projectData?.project;\n const stats = statsData?.projectStats;\n\n if (projectError) {\n return (\n <PageLayout\n title=\"Project Details\"\n description={`Project ID: ${projectId}`}\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 project details. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n if (projectLoading || statsLoading) {\n return (\n <PageLayout\n title=\"Project Details\"\n description={`Project ID: ${projectId}`}\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={project?.name ?? \"Project Details\"}\n description={project?.description ?? `Project ID: ${projectId}`}\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Tracked Hours\"\n value={formatHours(stats?.totalHours ?? project?.trackedHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Tasks\"\n value={`${stats?.completedTasks ?? 0} / ${stats?.totalTasks ?? 0}`}\n icon={<Users className=\"h-5 w-5\" />}\n description=\"completed / total\"\n />\n <StatCard\n title=\"Progress\"\n value={\n stats?.totalTasks\n ? `${Math.round(((stats?.completedTasks ?? 0) / stats.totalTasks) * 100)}%`\n : \"0%\"\n }\n icon={<TrendingUp className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Budget Used\"\n value={formatCurrency(\n stats?.budgetUsed ?? 0,\n project?.currency ?? \"USD\",\n )}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n description={\n stats?.budgetRemaining != null\n ? `${formatCurrency(stats.budgetRemaining, project?.currency ?? \"USD\")} remaining`\n : undefined\n }\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Recent Activity\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 Activity timeline will render here\n </p>\n </div>\n </div>\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Time Distribution\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 </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,GAAkC,EAElD,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAmB;EACrB,WAAW,EAAE,IAAI,GAAY;EAC7B,MAAM,CAAC;EACR,CAAC,EAEI,EAAE,MAAM,GAAW,SAAS,MAAiB,EAAwB;EACzE,WAAW,EAAE,IAAI,GAAY;EAC7B,MAAM,CAAC;EACR,CAAC,EAEI,IAAU,GAAa,SACvB,IAAQ,GAAW;AA0BzB,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,eAAe;YAE5B,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAIb,KAAkB,IAElB,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,eAAe;YAE5B,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAKf,kBAAC,GAAD;EACE,OAAO,GAAS,QAAQ;EACxB,aAAa,GAAS,eAAe,eAAe;YAFtD,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAY,GAAO,cAAc,GAAS,gBAAgB,EAAE;KACnE,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,GAAO,kBAAkB,EAAE,KAAK,GAAO,cAAc;KAC/D,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OACE,GAAO,aACH,GAAG,KAAK,OAAQ,GAAO,kBAAkB,KAAK,EAAM,aAAc,IAAI,CAAC,KACvE;KAEN,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EACL,GAAO,cAAc,GACrB,GAAS,YAAY,MACtB;KACD,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,aACE,GAAO,mBAAmB,OAEtB,KAAA,IADA,GAAG,EAAe,EAAM,iBAAiB,GAAS,YAAY,MAAM,CAAC;KAG3E,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAEzC,CAAA;KACA,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAEzC,CAAA;KACA,CAAA,CACF;MACF;KACK"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/projects/ProjectsPage.tsx"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,4CA6H3B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { formatHours as e, getStatusColor as t } from "../../utils/helpers.js";
|
|
2
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
3
|
+
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
4
|
+
import { useListProjectsQuery as i } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { FolderOpen as a, Plus as o } from "lucide-react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { useI18n as l } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
//#region src/timecampus/pages/projects/ProjectsPage.tsx
|
|
9
|
+
function u() {
|
|
10
|
+
let { t: u } = l(), d = (e, t) => {
|
|
11
|
+
let n = u(e);
|
|
12
|
+
return n === e ? t : n;
|
|
13
|
+
}, { data: f, loading: p, error: m } = i({ variables: { limit: 50 } }), h = f?.projects?.items ?? [];
|
|
14
|
+
return m ? /* @__PURE__ */ s(n, {
|
|
15
|
+
title: d("timecampus.projects.title", "Projects"),
|
|
16
|
+
description: d("timecampus.projects.description", "Manage and track project time"),
|
|
17
|
+
children: /* @__PURE__ */ s("div", {
|
|
18
|
+
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",
|
|
19
|
+
children: d("timecampus.projects.error.loadFailed", "Failed to load projects. Please try again later.")
|
|
20
|
+
})
|
|
21
|
+
}) : /* @__PURE__ */ s(n, {
|
|
22
|
+
title: d("timecampus.projects.title", "Projects"),
|
|
23
|
+
description: d("timecampus.projects.description", "Manage and track project time"),
|
|
24
|
+
actions: /* @__PURE__ */ c("button", {
|
|
25
|
+
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",
|
|
26
|
+
children: [/* @__PURE__ */ s(o, { className: "h-4 w-4" }), d("timecampus.projects.actions.newProject", "New Project")]
|
|
27
|
+
}),
|
|
28
|
+
children: p ? /* @__PURE__ */ s(r, {
|
|
29
|
+
variant: "card",
|
|
30
|
+
count: 4
|
|
31
|
+
}) : h.length === 0 ? /* @__PURE__ */ c("div", {
|
|
32
|
+
className: "rounded-xl border border-dashed border-border bg-card p-12 text-center",
|
|
33
|
+
children: [/* @__PURE__ */ s(a, { className: "mx-auto h-10 w-10 text-muted-foreground" }), /* @__PURE__ */ s("p", {
|
|
34
|
+
className: "mt-4 text-sm text-muted-foreground",
|
|
35
|
+
children: d("timecampus.projects.empty", "No projects yet. Create your first project to get started.")
|
|
36
|
+
})]
|
|
37
|
+
}) : /* @__PURE__ */ s("div", {
|
|
38
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
39
|
+
children: h.map((n) => /* @__PURE__ */ c("div", {
|
|
40
|
+
className: "rounded-xl border border-border bg-card p-5 transition-colors hover:bg-muted/50 cursor-pointer",
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ c("div", {
|
|
43
|
+
className: "flex items-start justify-between",
|
|
44
|
+
children: [/* @__PURE__ */ c("div", {
|
|
45
|
+
className: "flex items-center gap-3",
|
|
46
|
+
children: [/* @__PURE__ */ s("div", {
|
|
47
|
+
className: "h-3 w-3 rounded-full",
|
|
48
|
+
style: { backgroundColor: n.color ?? "#3b82f6" }
|
|
49
|
+
}), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
50
|
+
className: "text-sm font-semibold text-foreground",
|
|
51
|
+
children: n.name
|
|
52
|
+
}), /* @__PURE__ */ s("p", {
|
|
53
|
+
className: "text-xs text-muted-foreground",
|
|
54
|
+
children: n.clientId ?? d("timecampus.projects.card.noClient", "No client")
|
|
55
|
+
})] })]
|
|
56
|
+
}), /* @__PURE__ */ s("span", {
|
|
57
|
+
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${t(n.status)}`,
|
|
58
|
+
children: n.status
|
|
59
|
+
})]
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ c("div", {
|
|
62
|
+
className: "mt-4",
|
|
63
|
+
children: [/* @__PURE__ */ c("div", {
|
|
64
|
+
className: "flex items-center justify-between text-xs text-muted-foreground",
|
|
65
|
+
children: [/* @__PURE__ */ s("span", { children: d("timecampus.projects.card.progress", "Progress") }), /* @__PURE__ */ c("span", { children: [n.estimatedHours ? Math.round(n.trackedHours / n.estimatedHours * 100) : 0, "%"] })]
|
|
66
|
+
}), /* @__PURE__ */ s("div", {
|
|
67
|
+
className: "mt-1 h-2 rounded-full bg-muted",
|
|
68
|
+
children: /* @__PURE__ */ s("div", {
|
|
69
|
+
className: "h-2 rounded-full bg-primary",
|
|
70
|
+
style: { width: `${n.estimatedHours ? Math.min(Math.round(n.trackedHours / n.estimatedHours * 100), 100) : 0}%` }
|
|
71
|
+
})
|
|
72
|
+
})]
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ c("div", {
|
|
75
|
+
className: "mt-3 flex items-center justify-between text-xs text-muted-foreground",
|
|
76
|
+
children: [/* @__PURE__ */ c("span", { children: [
|
|
77
|
+
e(n.trackedHours),
|
|
78
|
+
" /",
|
|
79
|
+
" ",
|
|
80
|
+
e(n.estimatedHours ?? 0)
|
|
81
|
+
] }), /* @__PURE__ */ c("span", { children: [
|
|
82
|
+
n.tasks?.length ?? 0,
|
|
83
|
+
" ",
|
|
84
|
+
d("timecampus.projects.card.tasks", "tasks")
|
|
85
|
+
] })]
|
|
86
|
+
})
|
|
87
|
+
]
|
|
88
|
+
}, n.id))
|
|
89
|
+
})
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
export { u as ProjectsPage };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=ProjectsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPage.js","names":[],"sources":["../../../../src/timecampus/pages/projects/ProjectsPage.tsx"],"sourcesContent":["import { FolderOpen, Plus } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor, formatHours } from \"../../utils/helpers\";\nimport {\n useListProjectsQuery,\n type ListProjectsQuery,\n} from \"@/generated/wspace-operations\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\ntype ProjectItem = NonNullable<ListProjectsQuery[\"projects\"]>[\"items\"][number];\n\nexport function ProjectsPage() {\n const { t: translate } = useI18n();\n const t = (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n const { data, loading, error } = useListProjectsQuery({\n variables: { limit: 50 },\n });\n\n const projects = data?.projects?.items ?? [];\n\n if (error) {\n return (\n <PageLayout\n title={t(\"timecampus.projects.title\", \"Projects\")}\n description={t(\n \"timecampus.projects.description\",\n \"Manage and track project time\",\n )}\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 {t(\n \"timecampus.projects.error.loadFailed\",\n \"Failed to load projects. Please try again later.\",\n )}\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t(\"timecampus.projects.title\", \"Projects\")}\n description={t(\n \"timecampus.projects.description\",\n \"Manage and track project time\",\n )}\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 {t(\"timecampus.projects.actions.newProject\", \"New Project\")}\n </button>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"card\" count={4} />\n ) : projects.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border bg-card p-12 text-center\">\n <FolderOpen className=\"mx-auto h-10 w-10 text-muted-foreground\" />\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {t(\n \"timecampus.projects.empty\",\n \"No projects yet. Create your first project to get started.\",\n )}\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {projects.map((project: ProjectItem) => (\n <div\n key={project.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 justify-between\">\n <div className=\"flex items-center gap-3\">\n <div\n className=\"h-3 w-3 rounded-full\"\n style={{ backgroundColor: project.color ?? \"#3b82f6\" }}\n />\n <div>\n <p className=\"text-sm font-semibold text-foreground\">\n {project.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {project.clientId ??\n t(\"timecampus.projects.card.noClient\", \"No client\")}\n </p>\n </div>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(project.status)}`}\n >\n {project.status}\n </span>\n </div>\n <div className=\"mt-4\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {t(\"timecampus.projects.card.progress\", \"Progress\")}\n </span>\n <span>\n {project.estimatedHours\n ? Math.round(\n (project.trackedHours / project.estimatedHours) * 100,\n )\n : 0}\n %\n </span>\n </div>\n <div className=\"mt-1 h-2 rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{\n width: `${project.estimatedHours ? Math.min(Math.round((project.trackedHours / project.estimatedHours) * 100), 100) : 0}%`,\n }}\n />\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {formatHours(project.trackedHours)} /{\" \"}\n {formatHours(project.estimatedHours ?? 0)}\n </span>\n <span>\n {project.tasks?.length ?? 0}{\" \"}\n {t(\"timecampus.projects.card.tasks\", \"tasks\")}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,IAAe;CAC7B,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,KAAK,GAAa,MAA6B;EACnD,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAE9B,EAAE,SAAM,YAAS,aAAU,EAAqB,EACpD,WAAW,EAAE,OAAO,IAAI,EACzB,CAAC,EAEI,IAAW,GAAM,UAAU,SAAS,EAAE;AAqB5C,QAnBI,IAEA,kBAAC,GAAD;EACE,OAAO,EAAE,6BAA6B,WAAW;EACjD,aAAa,EACX,mCACA,gCACD;YAED,kBAAC,OAAD;GAAK,WAAU;aACZ,EACC,wCACA,mDACD;GACG,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAO,EAAE,6BAA6B,WAAW;EACjD,aAAa,EACX,mCACA,gCACD;EACD,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAE,0CAA0C,cAAc,CACpD;;YAGV,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA,GAC1C,EAAS,WAAW,IACtB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAY,WAAU,2CAA4C,CAAA,EAClE,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,6BACA,6DACD;IACC,CAAA,CACA;OAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAS,KAAK,MACb,kBAAC,OAAD;IAEE,WAAU;cAFZ;KAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QACE,WAAU;QACV,OAAO,EAAE,iBAAiB,EAAQ,SAAS,WAAW;QACtD,CAAA,EACF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ,YACP,EAAE,qCAAqC,YAAY;QACnD,CAAA,CACA,EAAA,CAAA,CACF;UACN,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAQ,OAAO;iBAEpG,EAAQ;OACJ,CAAA,CACH;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD,EAAA,UACG,EAAE,qCAAqC,WAAW,EAC9C,CAAA,EACP,kBAAC,QAAD,EAAA,UAAA,CACG,EAAQ,iBACL,KAAK,MACF,EAAQ,eAAe,EAAQ,iBAAkB,IACnD,GACD,GAAE,IAED,EAAA,CAAA,CACH;UACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,OAAD;QACE,WAAU;QACV,OAAO,EACL,OAAO,GAAG,EAAQ,iBAAiB,KAAK,IAAI,KAAK,MAAO,EAAQ,eAAe,EAAQ,iBAAkB,IAAI,EAAE,IAAI,GAAG,EAAE,IACzH;QACD,CAAA;OACE,CAAA,CACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAA;OACG,EAAY,EAAQ,aAAa;OAAC;OAAG;OACrC,EAAY,EAAQ,kBAAkB,EAAE;OACpC,EAAA,CAAA,EACP,kBAAC,QAAD,EAAA,UAAA;OACG,EAAQ,OAAO,UAAU;OAAG;OAC5B,EAAE,kCAAkC,QAAQ;OACxC,EAAA,CAAA,CACH;;KACF;MA1DC,EAAQ,GA0DT,CACN;GACE,CAAA;EAEG,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/projects/TasksPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,SAAS,4CAiFxB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { getPriorityColor as e, getStatusColor as t } from "../../utils/helpers.js";
|
|
2
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
3
|
+
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
4
|
+
import { useListTasksQuery as i } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { CheckSquare as a, Plus 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/projects/TasksPage.tsx
|
|
9
|
+
function u() {
|
|
10
|
+
let { projectId: u } = s(), { data: d, loading: f, error: p } = i({
|
|
11
|
+
variables: { projectId: u },
|
|
12
|
+
skip: !u
|
|
13
|
+
}), m = d?.tasks?.items ?? [];
|
|
14
|
+
return p ? /* @__PURE__ */ c(n, {
|
|
15
|
+
title: "Tasks",
|
|
16
|
+
description: `Tasks for project ${u}`,
|
|
17
|
+
children: /* @__PURE__ */ c("div", {
|
|
18
|
+
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",
|
|
19
|
+
children: "Failed to load tasks. Please try again later."
|
|
20
|
+
})
|
|
21
|
+
}) : /* @__PURE__ */ c(n, {
|
|
22
|
+
title: "Tasks",
|
|
23
|
+
description: `Tasks for project ${u}`,
|
|
24
|
+
actions: /* @__PURE__ */ l("button", {
|
|
25
|
+
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",
|
|
26
|
+
children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Add Task"]
|
|
27
|
+
}),
|
|
28
|
+
children: f ? /* @__PURE__ */ c(r, {
|
|
29
|
+
variant: "list",
|
|
30
|
+
count: 5
|
|
31
|
+
}) : /* @__PURE__ */ c("div", {
|
|
32
|
+
className: "rounded-xl border border-border bg-card",
|
|
33
|
+
children: /* @__PURE__ */ l("div", {
|
|
34
|
+
className: "divide-y divide-border",
|
|
35
|
+
children: [m.map((n) => /* @__PURE__ */ l("div", {
|
|
36
|
+
className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors",
|
|
37
|
+
children: [/* @__PURE__ */ l("div", {
|
|
38
|
+
className: "flex items-center gap-3",
|
|
39
|
+
children: [/* @__PURE__ */ c(a, { className: `h-5 w-5 ${n.status === "done" ? "text-emerald-500" : "text-muted-foreground"}` }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
40
|
+
className: `text-sm font-medium ${n.status === "done" ? "text-muted-foreground line-through" : "text-foreground"}`,
|
|
41
|
+
children: n.title
|
|
42
|
+
}), /* @__PURE__ */ l("p", {
|
|
43
|
+
className: "text-xs text-muted-foreground",
|
|
44
|
+
children: [
|
|
45
|
+
n.assigneeId ?? "Unassigned",
|
|
46
|
+
" ·",
|
|
47
|
+
" ",
|
|
48
|
+
n.trackedHours,
|
|
49
|
+
"h tracked"
|
|
50
|
+
]
|
|
51
|
+
})] })]
|
|
52
|
+
}), /* @__PURE__ */ l("div", {
|
|
53
|
+
className: "flex items-center gap-2",
|
|
54
|
+
children: [/* @__PURE__ */ c("span", {
|
|
55
|
+
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${e(n.priority)}`,
|
|
56
|
+
children: n.priority
|
|
57
|
+
}), /* @__PURE__ */ c("span", {
|
|
58
|
+
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${t(n.status)}`,
|
|
59
|
+
children: n.status
|
|
60
|
+
})]
|
|
61
|
+
})]
|
|
62
|
+
}, n.id)), m.length === 0 && /* @__PURE__ */ c("div", {
|
|
63
|
+
className: "p-8 text-center text-sm text-muted-foreground",
|
|
64
|
+
children: "No tasks yet. Add a task to get started."
|
|
65
|
+
})]
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { u as TasksPage };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=TasksPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksPage.js","names":[],"sources":["../../../../src/timecampus/pages/projects/TasksPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { Plus, CheckSquare } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor, getPriorityColor } from \"../../utils/helpers\";\nimport {\n useListTasksQuery,\n type TaskFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function TasksPage() {\n const { projectId } = useParams<{ projectId: string }>();\n\n const { data, loading, error } = useListTasksQuery({\n variables: { projectId: projectId! },\n skip: !projectId,\n });\n\n const tasks = data?.tasks?.items ?? [];\n\n if (error) {\n return (\n <PageLayout title=\"Tasks\" description={`Tasks for project ${projectId}`}>\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 tasks. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Tasks\"\n description={`Tasks for project ${projectId}`}\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 Task\n </button>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"list\" count={5} />\n ) : (\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {tasks.map((task: TaskFieldsFragment) => (\n <div\n key={task.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 <CheckSquare\n className={`h-5 w-5 ${task.status === \"done\" ? \"text-emerald-500\" : \"text-muted-foreground\"}`}\n />\n <div>\n <p\n className={`text-sm font-medium ${task.status === \"done\" ? \"text-muted-foreground line-through\" : \"text-foreground\"}`}\n >\n {task.title}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {task.assigneeId ?? \"Unassigned\"} ·{\" \"}\n {task.trackedHours}h tracked\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(task.priority)}`}\n >\n {task.priority}\n </span>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${getStatusColor(task.status)}`}\n >\n {task.status}\n </span>\n </div>\n </div>\n ))}\n {tasks.length === 0 && (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No tasks yet. Add a task to get started.\n </div>\n )}\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAY;CAC1B,IAAM,EAAE,iBAAc,GAAkC,EAElD,EAAE,SAAM,YAAS,aAAU,EAAkB;EACjD,WAAW,EAAa,cAAY;EACpC,MAAM,CAAC;EACR,CAAC,EAEI,IAAQ,GAAM,OAAO,SAAS,EAAE;AAYtC,QAVI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAQ,aAAa,qBAAqB;YAC1D,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAa,qBAAqB;EAClC,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,WAErB;;YAGV,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA,GAE5C,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAM,KAAK,MACV,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EACE,WAAW,WAAW,EAAK,WAAW,SAAS,qBAAqB,2BACpE,CAAA,EACF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OACE,WAAW,uBAAuB,EAAK,WAAW,SAAS,uCAAuC;iBAEjG,EAAK;OACJ,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAK,cAAc;QAAa;QAAU;QAC1C,EAAK;QAAa;QACjB;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAiB,EAAK,SAAS;iBAErG,EAAK;OACD,CAAA,EACP,kBAAC,QAAD;OACE,WAAW,4DAA4D,EAAe,EAAK,OAAO;iBAEjG,EAAK;OACD,CAAA,CACH;QACF;OA/BC,EAAK,GA+BN,CACN,EACD,EAAM,WAAW,KAChB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,CAEJ;;GACF,CAAA;EAEG,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourcePlanningPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/resource-planning/ResourcePlanningPage.tsx"],"names":[],"mappings":"AAaA,wBAAgB,oBAAoB,4CAmKnC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
+
import { getInitials as t } from "../../utils/helpers.js";
|
|
3
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
|
+
import { StatCard as r } from "../../components/StatCard.js";
|
|
5
|
+
import { LoadingSkeleton as i } from "../../components/LoadingSkeleton.js";
|
|
6
|
+
import { useGetCapacityOverviewQuery as a, useListResourcePlansQuery as o } from "../../../generated/wspace-operations.js";
|
|
7
|
+
import { CalendarRange as s, TrendingUp as c, Users as l } from "lucide-react";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
//#region src/timecampus/pages/resource-planning/ResourcePlanningPage.tsx
|
|
10
|
+
function f() {
|
|
11
|
+
let { workspaceId: f = "" } = e(), p = /* @__PURE__ */ new Date(), m = new Date(p.getFullYear(), p.getMonth(), p.getDate()).toISOString(), h = new Date(p.getFullYear(), p.getMonth(), p.getDate() + 7).toISOString(), { data: g, loading: _, error: v } = o(), { data: y } = a({ variables: {
|
|
12
|
+
startDate: m,
|
|
13
|
+
endDate: h
|
|
14
|
+
} }), b = g?.resourcePlans?.items ?? [], x = y?.capacityOverview, S = b.flatMap((e) => e.allocations.map((t) => ({
|
|
15
|
+
...t,
|
|
16
|
+
planName: e.name
|
|
17
|
+
})));
|
|
18
|
+
if (_) return /* @__PURE__ */ u(n, {
|
|
19
|
+
title: "Resource Planning",
|
|
20
|
+
description: "Plan and optimize team resource allocation",
|
|
21
|
+
children: /* @__PURE__ */ u(i, {
|
|
22
|
+
variant: "list",
|
|
23
|
+
count: 5
|
|
24
|
+
})
|
|
25
|
+
});
|
|
26
|
+
if (v) return /* @__PURE__ */ u(n, {
|
|
27
|
+
title: "Resource Planning",
|
|
28
|
+
description: "Plan and optimize team resource allocation",
|
|
29
|
+
children: /* @__PURE__ */ u("div", {
|
|
30
|
+
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",
|
|
31
|
+
children: "Failed to load resource planning data. Please try again later."
|
|
32
|
+
})
|
|
33
|
+
});
|
|
34
|
+
let C = x?.utilizationRate ?? 0, w = x?.overallocatedUsers?.length ?? 0, T = x?.availableCapacity ?? 0;
|
|
35
|
+
return /* @__PURE__ */ d(n, {
|
|
36
|
+
title: "Resource Planning",
|
|
37
|
+
description: "Plan and optimize team resource allocation",
|
|
38
|
+
children: [/* @__PURE__ */ d("div", {
|
|
39
|
+
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ u(r, {
|
|
42
|
+
title: "Team Utilization",
|
|
43
|
+
value: `${Math.round(C)}%`,
|
|
44
|
+
icon: /* @__PURE__ */ u(c, { className: "h-5 w-5" })
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ u(r, {
|
|
47
|
+
title: "Over-allocated",
|
|
48
|
+
value: String(w),
|
|
49
|
+
icon: /* @__PURE__ */ u(l, { className: "h-5 w-5" }),
|
|
50
|
+
iconBgColor: "bg-red-100 text-red-600 dark:bg-red-900/30 dark:text-red-400"
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ u(r, {
|
|
53
|
+
title: "Active Plans",
|
|
54
|
+
value: String(b.length),
|
|
55
|
+
icon: /* @__PURE__ */ u(l, { className: "h-5 w-5" })
|
|
56
|
+
}),
|
|
57
|
+
/* @__PURE__ */ u(r, {
|
|
58
|
+
title: "Available Capacity",
|
|
59
|
+
value: `${Math.round(T)}h`,
|
|
60
|
+
icon: /* @__PURE__ */ u(s, { className: "h-5 w-5" }),
|
|
61
|
+
description: "This week"
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
}), /* @__PURE__ */ u("div", {
|
|
65
|
+
className: "rounded-xl border border-border bg-card",
|
|
66
|
+
children: /* @__PURE__ */ u("div", {
|
|
67
|
+
className: "divide-y divide-border",
|
|
68
|
+
children: S.length === 0 ? /* @__PURE__ */ u("div", {
|
|
69
|
+
className: "p-8 text-center text-sm text-muted-foreground",
|
|
70
|
+
children: "No resource allocations found. Create a resource plan to start allocating team members."
|
|
71
|
+
}) : S.map((e) => {
|
|
72
|
+
let n = e.utilizationRate ?? (e.allocatedHours > 0 ? Math.round(e.actualHours / e.allocatedHours * 100) : 0);
|
|
73
|
+
return /* @__PURE__ */ d("div", {
|
|
74
|
+
className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors",
|
|
75
|
+
children: [/* @__PURE__ */ d("div", {
|
|
76
|
+
className: "flex items-center gap-3",
|
|
77
|
+
children: [/* @__PURE__ */ u("div", {
|
|
78
|
+
className: "flex h-9 w-9 items-center justify-center rounded-full bg-primary/10 text-sm font-medium text-primary",
|
|
79
|
+
children: t(e.userId)
|
|
80
|
+
}), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
|
|
81
|
+
className: "text-sm font-medium text-foreground",
|
|
82
|
+
children: e.userId
|
|
83
|
+
}), /* @__PURE__ */ d("p", {
|
|
84
|
+
className: "text-xs text-muted-foreground",
|
|
85
|
+
children: [
|
|
86
|
+
e.planName,
|
|
87
|
+
" ·",
|
|
88
|
+
" ",
|
|
89
|
+
e.startDate.slice(0, 10),
|
|
90
|
+
" to",
|
|
91
|
+
" ",
|
|
92
|
+
e.endDate.slice(0, 10)
|
|
93
|
+
]
|
|
94
|
+
})] })]
|
|
95
|
+
}), /* @__PURE__ */ d("div", {
|
|
96
|
+
className: "flex items-center gap-4",
|
|
97
|
+
children: [/* @__PURE__ */ u("div", {
|
|
98
|
+
className: "text-right",
|
|
99
|
+
children: /* @__PURE__ */ d("p", {
|
|
100
|
+
className: "text-sm font-medium text-foreground",
|
|
101
|
+
children: [e.allocatedHours, "h allocated"]
|
|
102
|
+
})
|
|
103
|
+
}), /* @__PURE__ */ d("div", {
|
|
104
|
+
className: "w-24",
|
|
105
|
+
children: [/* @__PURE__ */ u("div", {
|
|
106
|
+
className: "flex items-center justify-between text-xs mb-0.5",
|
|
107
|
+
children: /* @__PURE__ */ d("span", {
|
|
108
|
+
className: `font-medium ${n > 100 ? "text-red-500" : n < 70 ? "text-amber-500" : "text-emerald-500"}`,
|
|
109
|
+
children: [n, "%"]
|
|
110
|
+
})
|
|
111
|
+
}), /* @__PURE__ */ u("div", {
|
|
112
|
+
className: "h-2 rounded-full bg-muted",
|
|
113
|
+
children: /* @__PURE__ */ u("div", {
|
|
114
|
+
className: `h-2 rounded-full ${n > 100 ? "bg-red-500" : n < 70 ? "bg-amber-500" : "bg-emerald-500"}`,
|
|
115
|
+
style: { width: `${Math.min(n, 100)}%` }
|
|
116
|
+
})
|
|
117
|
+
})]
|
|
118
|
+
})]
|
|
119
|
+
})]
|
|
120
|
+
}, e.id);
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
})]
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
export { f as ResourcePlanningPage };
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=ResourcePlanningPage.js.map
|