@burdenoff/microfe-timecampus 2026.529.2 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/timecampus/components/ErrorBoundary.js +2 -2
- package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js +8 -8
- package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
- package/dist/timecampus/components/PageLayout.js +2 -2
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +6 -6
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +31 -31
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +7 -7
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +8 -8
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +10 -10
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +10 -10
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +6 -6
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +8 -8
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +11 -11
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +10 -10
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +5 -5
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +13 -13
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +8 -8
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -8
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +7 -7
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +10 -10
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +7 -7
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +9 -9
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +7 -7
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +12 -12
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +8 -8
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +4 -4
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +12 -12
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +15 -15
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +11 -11
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +8 -8
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +8 -8
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +20 -20
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +14 -14
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +8 -8
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +11 -11
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +7 -7
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +8 -8
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +10 -10
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +10 -10
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +4 -4
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +6 -6
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +11 -11
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +6 -6
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +10 -10
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +6 -6
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +16 -16
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +9 -9
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +12 -12
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +8 -8
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +10 -10
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +7 -7
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +9 -9
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +10 -10
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +8 -8
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -55,9 +55,9 @@ function d() {
|
|
|
55
55
|
className: "mx-auto max-w-2xl space-y-6",
|
|
56
56
|
children: [
|
|
57
57
|
/* @__PURE__ */ u("div", {
|
|
58
|
-
className: "rounded-xl border border-border bg-
|
|
58
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
59
59
|
children: [/* @__PURE__ */ u("h3", {
|
|
60
|
-
className: "mb-4 flex items-center gap-2 text-sm font-semibold text-
|
|
60
|
+
className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
61
61
|
children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Timer Durations"]
|
|
62
62
|
}), /* @__PURE__ */ u("div", {
|
|
63
63
|
className: "space-y-4",
|
|
@@ -65,55 +65,55 @@ function d() {
|
|
|
65
65
|
/* @__PURE__ */ u("div", {
|
|
66
66
|
className: "flex items-center justify-between",
|
|
67
67
|
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
68
|
-
className: "text-sm font-medium text-
|
|
68
|
+
className: "text-sm font-medium text-text-primary",
|
|
69
69
|
children: "Focus Duration"
|
|
70
70
|
}), /* @__PURE__ */ l("p", {
|
|
71
|
-
className: "text-xs text-
|
|
71
|
+
className: "text-xs text-text-secondary",
|
|
72
72
|
children: "Length of each focus session"
|
|
73
73
|
})] }), /* @__PURE__ */ l("input", {
|
|
74
74
|
type: "number",
|
|
75
75
|
value: v,
|
|
76
76
|
onChange: (e) => y(Number(e.target.value)),
|
|
77
|
-
className: "w-20 rounded-md border border-border bg-
|
|
77
|
+
className: "w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right"
|
|
78
78
|
})]
|
|
79
79
|
}),
|
|
80
80
|
/* @__PURE__ */ u("div", {
|
|
81
81
|
className: "flex items-center justify-between",
|
|
82
82
|
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
83
|
-
className: "text-sm font-medium text-
|
|
83
|
+
className: "text-sm font-medium text-text-primary",
|
|
84
84
|
children: "Short Break"
|
|
85
85
|
}), /* @__PURE__ */ l("p", {
|
|
86
|
-
className: "text-xs text-
|
|
86
|
+
className: "text-xs text-text-secondary",
|
|
87
87
|
children: "Break between focus sessions"
|
|
88
88
|
})] }), /* @__PURE__ */ l("input", {
|
|
89
89
|
type: "number",
|
|
90
90
|
value: b,
|
|
91
91
|
onChange: (e) => x(Number(e.target.value)),
|
|
92
|
-
className: "w-20 rounded-md border border-border bg-
|
|
92
|
+
className: "w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right"
|
|
93
93
|
})]
|
|
94
94
|
}),
|
|
95
95
|
/* @__PURE__ */ u("div", {
|
|
96
96
|
className: "flex items-center justify-between",
|
|
97
97
|
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
98
|
-
className: "text-sm font-medium text-
|
|
98
|
+
className: "text-sm font-medium text-text-primary",
|
|
99
99
|
children: "Long Break"
|
|
100
100
|
}), /* @__PURE__ */ l("p", {
|
|
101
|
-
className: "text-xs text-
|
|
101
|
+
className: "text-xs text-text-secondary",
|
|
102
102
|
children: "After every 4 focus sessions"
|
|
103
103
|
})] }), /* @__PURE__ */ l("input", {
|
|
104
104
|
type: "number",
|
|
105
105
|
value: S,
|
|
106
106
|
onChange: (e) => C(Number(e.target.value)),
|
|
107
|
-
className: "w-20 rounded-md border border-border bg-
|
|
107
|
+
className: "w-20 rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right"
|
|
108
108
|
})]
|
|
109
109
|
})
|
|
110
110
|
]
|
|
111
111
|
})]
|
|
112
112
|
}),
|
|
113
113
|
/* @__PURE__ */ u("div", {
|
|
114
|
-
className: "rounded-xl border border-border bg-
|
|
114
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
115
115
|
children: [/* @__PURE__ */ l("h3", {
|
|
116
|
-
className: "mb-4 text-sm font-semibold text-
|
|
116
|
+
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
117
117
|
children: "Notifications"
|
|
118
118
|
}), /* @__PURE__ */ u("div", {
|
|
119
119
|
className: "space-y-3",
|
|
@@ -121,37 +121,37 @@ function d() {
|
|
|
121
121
|
/* @__PURE__ */ u("label", {
|
|
122
122
|
className: "flex items-center justify-between",
|
|
123
123
|
children: [/* @__PURE__ */ l("span", {
|
|
124
|
-
className: "text-sm text-
|
|
124
|
+
className: "text-sm text-text-primary",
|
|
125
125
|
children: "Sound alerts"
|
|
126
126
|
}), /* @__PURE__ */ l("input", {
|
|
127
127
|
type: "checkbox",
|
|
128
128
|
checked: w,
|
|
129
129
|
onChange: (e) => T(e.target.checked),
|
|
130
|
-
className: "h-4 w-4 rounded border-border"
|
|
130
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
131
131
|
})]
|
|
132
132
|
}),
|
|
133
133
|
/* @__PURE__ */ u("label", {
|
|
134
134
|
className: "flex items-center justify-between",
|
|
135
135
|
children: [/* @__PURE__ */ l("span", {
|
|
136
|
-
className: "text-sm text-
|
|
136
|
+
className: "text-sm text-text-primary",
|
|
137
137
|
children: "Desktop notifications"
|
|
138
138
|
}), /* @__PURE__ */ l("input", {
|
|
139
139
|
type: "checkbox",
|
|
140
140
|
checked: E,
|
|
141
141
|
onChange: (e) => D(e.target.checked),
|
|
142
|
-
className: "h-4 w-4 rounded border-border"
|
|
142
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
143
143
|
})]
|
|
144
144
|
}),
|
|
145
145
|
/* @__PURE__ */ u("label", {
|
|
146
146
|
className: "flex items-center justify-between",
|
|
147
147
|
children: [/* @__PURE__ */ l("span", {
|
|
148
|
-
className: "text-sm text-
|
|
148
|
+
className: "text-sm text-text-primary",
|
|
149
149
|
children: "Auto-start breaks"
|
|
150
150
|
}), /* @__PURE__ */ l("input", {
|
|
151
151
|
type: "checkbox",
|
|
152
152
|
checked: O,
|
|
153
153
|
onChange: (e) => k(e.target.checked),
|
|
154
|
-
className: "h-4 w-4 rounded border-border"
|
|
154
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
155
155
|
})]
|
|
156
156
|
})
|
|
157
157
|
]
|
|
@@ -162,7 +162,7 @@ function d() {
|
|
|
162
162
|
children: /* @__PURE__ */ l("button", {
|
|
163
163
|
onClick: A,
|
|
164
164
|
disabled: g,
|
|
165
|
-
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
165
|
+
className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
|
|
166
166
|
children: g ? "Saving..." : "Save Settings"
|
|
167
167
|
})
|
|
168
168
|
})
|
|
@@ -1 +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":"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"}
|
|
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-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n 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-text-primary\">\n Focus Duration\n </p>\n <p className=\"text-xs text-text-secondary\">\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-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right\"\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Short Break\n </p>\n <p className=\"text-xs text-text-secondary\">\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-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right\"\n />\n </div>\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Long Break\n </p>\n <p className=\"text-xs text-text-secondary\">\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-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary text-right\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Notifications\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">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-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\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-subtle\"\n />\n </label>\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">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-subtle\"\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-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -10,11 +10,11 @@ function o() {
|
|
|
10
10
|
title: "Create Project",
|
|
11
11
|
description: "Set up a new project for time tracking",
|
|
12
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-
|
|
13
|
+
className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
14
14
|
children: [/* @__PURE__ */ i(r, { className: "h-4 w-4" }), "Back to Projects"]
|
|
15
15
|
}),
|
|
16
16
|
children: /* @__PURE__ */ a("div", {
|
|
17
|
-
className: "mx-auto max-w-2xl rounded-xl border border-border bg-
|
|
17
|
+
className: "mx-auto max-w-2xl rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
18
18
|
children: [v && /* @__PURE__ */ i("div", {
|
|
19
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
20
|
children: "Failed to create project. Please try again."
|
|
@@ -22,61 +22,61 @@ function o() {
|
|
|
22
22
|
className: "space-y-4",
|
|
23
23
|
children: [
|
|
24
24
|
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
25
|
-
className: "block text-sm font-medium text-
|
|
25
|
+
className: "block text-sm font-medium text-text-primary",
|
|
26
26
|
children: "Project Name"
|
|
27
27
|
}), /* @__PURE__ */ i("input", {
|
|
28
28
|
type: "text",
|
|
29
29
|
placeholder: "Enter project name",
|
|
30
30
|
value: o,
|
|
31
31
|
onChange: (e) => s(e.target.value),
|
|
32
|
-
className: "mt-1 w-full rounded-md border border-border bg-
|
|
32
|
+
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary"
|
|
33
33
|
})] }),
|
|
34
34
|
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
35
|
-
className: "block text-sm font-medium text-
|
|
35
|
+
className: "block text-sm font-medium text-text-primary",
|
|
36
36
|
children: "Client"
|
|
37
37
|
}), /* @__PURE__ */ i("input", {
|
|
38
38
|
type: "text",
|
|
39
39
|
placeholder: "Client name",
|
|
40
40
|
value: c,
|
|
41
41
|
onChange: (e) => l(e.target.value),
|
|
42
|
-
className: "mt-1 w-full rounded-md border border-border bg-
|
|
42
|
+
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary"
|
|
43
43
|
})] }),
|
|
44
44
|
/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
45
|
-
className: "block text-sm font-medium text-
|
|
45
|
+
className: "block text-sm font-medium text-text-primary",
|
|
46
46
|
children: "Description"
|
|
47
47
|
}), /* @__PURE__ */ i("textarea", {
|
|
48
48
|
placeholder: "Project description",
|
|
49
49
|
rows: 3,
|
|
50
50
|
value: u,
|
|
51
51
|
onChange: (e) => d(e.target.value),
|
|
52
|
-
className: "mt-1 w-full rounded-md border border-border bg-
|
|
52
|
+
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary"
|
|
53
53
|
})] }),
|
|
54
54
|
/* @__PURE__ */ a("div", {
|
|
55
55
|
className: "grid grid-cols-2 gap-4",
|
|
56
56
|
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
57
|
-
className: "block text-sm font-medium text-
|
|
57
|
+
className: "block text-sm font-medium text-text-primary",
|
|
58
58
|
children: "Estimated Hours"
|
|
59
59
|
}), /* @__PURE__ */ i("input", {
|
|
60
60
|
type: "number",
|
|
61
61
|
placeholder: "0",
|
|
62
62
|
value: f,
|
|
63
63
|
onChange: (e) => p(e.target.value),
|
|
64
|
-
className: "mt-1 w-full rounded-md border border-border bg-
|
|
64
|
+
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
65
65
|
})] }), /* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("label", {
|
|
66
|
-
className: "block text-sm font-medium text-
|
|
66
|
+
className: "block text-sm font-medium text-text-primary",
|
|
67
67
|
children: "Hourly Rate"
|
|
68
68
|
}), /* @__PURE__ */ i("input", {
|
|
69
69
|
type: "number",
|
|
70
70
|
placeholder: "0.00",
|
|
71
71
|
value: m,
|
|
72
72
|
onChange: (e) => h(e.target.value),
|
|
73
|
-
className: "mt-1 w-full rounded-md border border-border bg-
|
|
73
|
+
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
74
74
|
})] })]
|
|
75
75
|
}),
|
|
76
76
|
/* @__PURE__ */ a("div", {
|
|
77
77
|
className: "flex justify-end gap-2 pt-4",
|
|
78
78
|
children: [/* @__PURE__ */ i("button", {
|
|
79
|
-
className: "rounded-md border border-border px-4 py-2 text-sm font-medium text-
|
|
79
|
+
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
80
80
|
children: "Cancel"
|
|
81
81
|
}), /* @__PURE__ */ i("button", {
|
|
82
82
|
onClick: async () => {
|
|
@@ -89,7 +89,7 @@ function o() {
|
|
|
89
89
|
} } });
|
|
90
90
|
},
|
|
91
91
|
disabled: _ || !o.trim(),
|
|
92
|
-
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
92
|
+
className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
|
|
93
93
|
children: _ ? "Creating..." : "Create Project"
|
|
94
94
|
})]
|
|
95
95
|
})
|
|
@@ -1 +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-
|
|
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-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Projects\n </button>\n }\n >\n <div className=\"mx-auto max-w-2xl rounded-xl border border-border-subtle bg-bg-surface 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-text-primary\">\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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\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-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div className=\"flex justify-end gap-2 pt-4\">\n <button className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\">\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={creating || !name.trim()}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {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;gBAA8C;MAEvD,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;gBAA8C;MAEvD,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;gBAA8C;MAEvD,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;iBAA8C;OAEvD,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;iBAA8C;OAEvD,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;iBAA+G;OAExH,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"}
|
|
@@ -58,26 +58,26 @@ function m() {
|
|
|
58
58
|
}), /* @__PURE__ */ p("div", {
|
|
59
59
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
60
60
|
children: [/* @__PURE__ */ p("div", {
|
|
61
|
-
className: "rounded-xl border border-border bg-
|
|
61
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
62
62
|
children: [/* @__PURE__ */ f("h3", {
|
|
63
|
-
className: "mb-4 text-sm font-semibold text-
|
|
63
|
+
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
64
64
|
children: "Recent Activity"
|
|
65
65
|
}), /* @__PURE__ */ f("div", {
|
|
66
|
-
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
66
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
|
|
67
67
|
children: /* @__PURE__ */ f("p", {
|
|
68
|
-
className: "text-sm text-
|
|
68
|
+
className: "text-sm text-text-secondary",
|
|
69
69
|
children: "Activity timeline will render here"
|
|
70
70
|
})
|
|
71
71
|
})]
|
|
72
72
|
}), /* @__PURE__ */ p("div", {
|
|
73
|
-
className: "rounded-xl border border-border bg-
|
|
73
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-6",
|
|
74
74
|
children: [/* @__PURE__ */ f("h3", {
|
|
75
|
-
className: "mb-4 text-sm font-semibold text-
|
|
75
|
+
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
76
76
|
children: "Time Distribution"
|
|
77
77
|
}), /* @__PURE__ */ f("div", {
|
|
78
|
-
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
|
|
78
|
+
className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle",
|
|
79
79
|
children: /* @__PURE__ */ f("p", {
|
|
80
|
-
className: "text-sm text-
|
|
80
|
+
className: "text-sm text-text-secondary",
|
|
81
81
|
children: "Chart will render here"
|
|
82
82
|
})
|
|
83
83
|
})]
|
|
@@ -1 +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-
|
|
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-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Recent Activity\n </h3>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n Activity timeline will render here\n </p>\n </div>\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Time Distribution\n </h3>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border-subtle\">\n <p className=\"text-sm text-text-secondary\">\n 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;eAA+C;KAExD,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KACA,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA+C;KAExD,CAAA,EACL,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA;KACA,CAAA,CACF;MACF;KACK"}
|
|
@@ -22,22 +22,22 @@ function u() {
|
|
|
22
22
|
title: d("timecampus.projects.title", "Projects"),
|
|
23
23
|
description: d("timecampus.projects.description", "Manage and track project time"),
|
|
24
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-
|
|
25
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
26
26
|
children: [/* @__PURE__ */ s(o, { className: "h-4 w-4" }), d("timecampus.projects.actions.newProject", "New Project")]
|
|
27
27
|
}),
|
|
28
28
|
children: p ? /* @__PURE__ */ s(r, {
|
|
29
29
|
variant: "card",
|
|
30
30
|
count: 4
|
|
31
31
|
}) : h.length === 0 ? /* @__PURE__ */ c("div", {
|
|
32
|
-
className: "rounded-xl border border-dashed border-border bg-
|
|
33
|
-
children: [/* @__PURE__ */ s(a, { className: "mx-auto h-10 w-10 text-
|
|
34
|
-
className: "mt-4 text-sm text-
|
|
32
|
+
className: "rounded-xl border border-dashed border-border-subtle bg-bg-surface p-12 text-center",
|
|
33
|
+
children: [/* @__PURE__ */ s(a, { className: "mx-auto h-10 w-10 text-text-secondary" }), /* @__PURE__ */ s("p", {
|
|
34
|
+
className: "mt-4 text-sm text-text-secondary",
|
|
35
35
|
children: d("timecampus.projects.empty", "No projects yet. Create your first project to get started.")
|
|
36
36
|
})]
|
|
37
37
|
}) : /* @__PURE__ */ s("div", {
|
|
38
38
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
39
39
|
children: h.map((n) => /* @__PURE__ */ c("div", {
|
|
40
|
-
className: "rounded-xl border border-border bg-
|
|
40
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
|
|
41
41
|
children: [
|
|
42
42
|
/* @__PURE__ */ c("div", {
|
|
43
43
|
className: "flex items-start justify-between",
|
|
@@ -47,10 +47,10 @@ function u() {
|
|
|
47
47
|
className: "h-3 w-3 rounded-full",
|
|
48
48
|
style: { backgroundColor: n.color ?? "#3b82f6" }
|
|
49
49
|
}), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
50
|
-
className: "text-sm font-semibold text-
|
|
50
|
+
className: "text-sm font-semibold text-text-primary",
|
|
51
51
|
children: n.name
|
|
52
52
|
}), /* @__PURE__ */ s("p", {
|
|
53
|
-
className: "text-xs text-
|
|
53
|
+
className: "text-xs text-text-secondary",
|
|
54
54
|
children: n.clientId ?? d("timecampus.projects.card.noClient", "No client")
|
|
55
55
|
})] })]
|
|
56
56
|
}), /* @__PURE__ */ s("span", {
|
|
@@ -61,18 +61,18 @@ function u() {
|
|
|
61
61
|
/* @__PURE__ */ c("div", {
|
|
62
62
|
className: "mt-4",
|
|
63
63
|
children: [/* @__PURE__ */ c("div", {
|
|
64
|
-
className: "flex items-center justify-between text-xs text-
|
|
64
|
+
className: "flex items-center justify-between text-xs text-text-secondary",
|
|
65
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
66
|
}), /* @__PURE__ */ s("div", {
|
|
67
|
-
className: "mt-1 h-2 rounded-full bg-
|
|
67
|
+
className: "mt-1 h-2 rounded-full bg-bg-sunken",
|
|
68
68
|
children: /* @__PURE__ */ s("div", {
|
|
69
|
-
className: "h-2 rounded-full bg-primary",
|
|
69
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
70
70
|
style: { width: `${n.estimatedHours ? Math.min(Math.round(n.trackedHours / n.estimatedHours * 100), 100) : 0}%` }
|
|
71
71
|
})
|
|
72
72
|
})]
|
|
73
73
|
}),
|
|
74
74
|
/* @__PURE__ */ c("div", {
|
|
75
|
-
className: "mt-3 flex items-center justify-between text-xs text-
|
|
75
|
+
className: "mt-3 flex items-center justify-between text-xs text-text-secondary",
|
|
76
76
|
children: [/* @__PURE__ */ c("span", { children: [
|
|
77
77
|
e(n.trackedHours),
|
|
78
78
|
" /",
|
|
@@ -1 +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-
|
|
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-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n {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-subtle bg-bg-surface p-12 text-center\">\n <FolderOpen className=\"mx-auto h-10 w-10 text-text-secondary\" />\n <p className=\"mt-4 text-sm text-text-secondary\">\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-subtle bg-bg-surface p-5 transition-colors hover:bg-bg-sunken/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-text-primary\">\n {project.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\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-text-secondary\">\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-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-action-primary-bg\"\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-text-secondary\">\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,yCAA0C,CAAA,EAChE,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"}
|
|
@@ -22,25 +22,25 @@ function u() {
|
|
|
22
22
|
title: "Tasks",
|
|
23
23
|
description: `Tasks for project ${u}`,
|
|
24
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-
|
|
25
|
+
className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
26
26
|
children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Add Task"]
|
|
27
27
|
}),
|
|
28
28
|
children: f ? /* @__PURE__ */ c(r, {
|
|
29
29
|
variant: "list",
|
|
30
30
|
count: 5
|
|
31
31
|
}) : /* @__PURE__ */ c("div", {
|
|
32
|
-
className: "rounded-xl border border-border bg-
|
|
32
|
+
className: "rounded-xl border border-border-subtle bg-bg-surface",
|
|
33
33
|
children: /* @__PURE__ */ l("div", {
|
|
34
34
|
className: "divide-y divide-border",
|
|
35
35
|
children: [m.map((n) => /* @__PURE__ */ l("div", {
|
|
36
|
-
className: "flex items-center justify-between p-4 hover:bg-
|
|
36
|
+
className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
|
|
37
37
|
children: [/* @__PURE__ */ l("div", {
|
|
38
38
|
className: "flex items-center gap-3",
|
|
39
|
-
children: [/* @__PURE__ */ c(a, { className: `h-5 w-5 ${n.status === "done" ? "text-emerald-500" : "text-
|
|
40
|
-
className: `text-sm font-medium ${n.status === "done" ? "text-
|
|
39
|
+
children: [/* @__PURE__ */ c(a, { className: `h-5 w-5 ${n.status === "done" ? "text-emerald-500" : "text-text-secondary"}` }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
40
|
+
className: `text-sm font-medium ${n.status === "done" ? "text-text-secondary line-through" : "text-text-primary"}`,
|
|
41
41
|
children: n.title
|
|
42
42
|
}), /* @__PURE__ */ l("p", {
|
|
43
|
-
className: "text-xs text-
|
|
43
|
+
className: "text-xs text-text-secondary",
|
|
44
44
|
children: [
|
|
45
45
|
n.assigneeId ?? "Unassigned",
|
|
46
46
|
" ·",
|
|
@@ -60,7 +60,7 @@ function u() {
|
|
|
60
60
|
})]
|
|
61
61
|
})]
|
|
62
62
|
}, n.id)), m.length === 0 && /* @__PURE__ */ c("div", {
|
|
63
|
-
className: "p-8 text-center text-sm text-
|
|
63
|
+
className: "p-8 text-center text-sm text-text-secondary",
|
|
64
64
|
children: "No tasks yet. Add a task to get started."
|
|
65
65
|
})]
|
|
66
66
|
})
|
|
@@ -1 +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-
|
|
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-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n <Plus className=\"h-4 w-4\" />\n Add Task\n </button>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"list\" count={5} />\n ) : (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface\">\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-bg-sunken/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-text-secondary\"}`}\n />\n <div>\n <p\n className={`text-sm font-medium ${task.status === \"done\" ? \"text-text-secondary line-through\" : \"text-text-primary\"}`}\n >\n {task.title}\n </p>\n <p className=\"text-xs text-text-secondary\">\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-text-secondary\">\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,yBACpE,CAAA,EACF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OACE,WAAW,uBAAuB,EAAK,WAAW,SAAS,qCAAqC;iBAE/F,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;eAA8C;KAEvD,CAAA,CAEJ;;GACF,CAAA;EAEG,CAAA"}
|