@burdenoff/microfe-timecampus 2026.608.1 → 2026.625.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 +4 -4
- 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 +17 -13
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +22 -19
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +183 -163
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +17 -17
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +18 -18
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +28 -28
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +19 -19
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +15 -15
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +22 -22
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +20 -20
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +20 -20
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +18 -18
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +22 -22
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +14 -14
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +22 -22
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +27 -27
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +19 -19
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +16 -16
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +18 -18
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +16 -16
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +21 -21
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +22 -22
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +18 -18
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +16 -16
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +29 -29
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +20 -20
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +23 -23
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +23 -23
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +30 -30
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +19 -19
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +23 -23
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +20 -20
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +15 -15
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +25 -25
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +19 -19
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +21 -21
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +19 -19
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +21 -21
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +20 -20
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +16 -16
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +21 -21
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +16 -16
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +25 -25
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +24 -24
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +20 -20
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +27 -27
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +20 -20
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +18 -18
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +23 -23
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +19 -19
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +17 -17
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,68 +1,68 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
|
|
3
|
+
import { useListConfigurationsQuery as n } from "../../../generated/wspace-operations.js";
|
|
4
|
+
import { PageLayout as r } from "../../components/PageLayout.js";
|
|
5
5
|
import { Download as i, Puzzle as a, Star as o } from "lucide-react";
|
|
6
6
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
7
|
//#region src/timecampus/pages/applets/AppletStorePage.tsx
|
|
8
8
|
function l() {
|
|
9
|
-
let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } =
|
|
10
|
-
return d ? /* @__PURE__ */ s(
|
|
9
|
+
let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = n({ variables: { scope: "WORKSPACE" } }), p = (u?.configurations ?? []).filter((e) => e.key.startsWith("applet.store."));
|
|
10
|
+
return d ? /* @__PURE__ */ s(r, {
|
|
11
11
|
title: "Applet Store",
|
|
12
12
|
description: "Browse and install applets to extend TimeCampus",
|
|
13
|
-
children: /* @__PURE__ */ s(
|
|
13
|
+
children: /* @__PURE__ */ s(t, {
|
|
14
14
|
variant: "card",
|
|
15
15
|
count: 6
|
|
16
16
|
})
|
|
17
|
-
}) : f ? /* @__PURE__ */ s(
|
|
17
|
+
}) : f ? /* @__PURE__ */ s(r, {
|
|
18
18
|
title: "Applet Store",
|
|
19
19
|
description: "Browse and install applets to extend TimeCampus",
|
|
20
20
|
children: /* @__PURE__ */ s("div", {
|
|
21
|
-
className: "rounded-lg border border-
|
|
21
|
+
className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
|
|
22
22
|
children: "Failed to load applet store data. Please try again later."
|
|
23
23
|
})
|
|
24
|
-
}) : /* @__PURE__ */ s(
|
|
24
|
+
}) : /* @__PURE__ */ s(r, {
|
|
25
25
|
title: "Applet Store",
|
|
26
26
|
description: "Browse and install applets to extend TimeCampus",
|
|
27
27
|
children: /* @__PURE__ */ s("div", {
|
|
28
28
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
29
29
|
children: p.length === 0 ? /* @__PURE__ */ s("div", {
|
|
30
|
-
className: "col-span-full p-8 text-center text-sm text-
|
|
30
|
+
className: "col-span-full p-8 text-center text-sm text-text-secondary",
|
|
31
31
|
children: "No applets available in the store yet. Store applets are managed as workspace configurations with the \"applet.store.\" key prefix."
|
|
32
32
|
}) : p.map((e) => {
|
|
33
33
|
let t = e.value, n = t.name ?? e.key.replace("applet.store.", ""), r = e.description ?? t.description ?? "";
|
|
34
34
|
t.category;
|
|
35
35
|
let l = t.rating ?? 0, u = t.downloads ?? 0;
|
|
36
36
|
return /* @__PURE__ */ c("div", {
|
|
37
|
-
className: "rounded-xl border border-border bg-card p-5 transition-colors hover:bg-
|
|
37
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer",
|
|
38
38
|
children: [/* @__PURE__ */ c("div", {
|
|
39
39
|
className: "flex items-start gap-3",
|
|
40
40
|
children: [/* @__PURE__ */ s("div", {
|
|
41
|
-
className: "flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10",
|
|
41
|
+
className: "flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10",
|
|
42
42
|
children: /* @__PURE__ */ s(a, { className: "h-6 w-6 text-primary" })
|
|
43
43
|
}), /* @__PURE__ */ c("div", {
|
|
44
44
|
className: "flex-1",
|
|
45
45
|
children: [/* @__PURE__ */ s("p", {
|
|
46
|
-
className: "text-sm font-semibold text-
|
|
46
|
+
className: "text-sm font-semibold text-text-primary",
|
|
47
47
|
children: n
|
|
48
48
|
}), /* @__PURE__ */ s("p", {
|
|
49
|
-
className: "text-xs text-
|
|
49
|
+
className: "text-xs text-text-secondary",
|
|
50
50
|
children: r
|
|
51
51
|
})]
|
|
52
52
|
})]
|
|
53
53
|
}), /* @__PURE__ */ c("div", {
|
|
54
54
|
className: "mt-3 flex items-center justify-between",
|
|
55
55
|
children: [/* @__PURE__ */ c("div", {
|
|
56
|
-
className: "flex items-center gap-3 text-xs text-
|
|
56
|
+
className: "flex items-center gap-3 text-xs text-text-secondary",
|
|
57
57
|
children: [/* @__PURE__ */ c("div", {
|
|
58
58
|
className: "flex items-center gap-1",
|
|
59
|
-
children: [/* @__PURE__ */ s(o, { className: "h-3 w-3 fill-amber-400 text-
|
|
59
|
+
children: [/* @__PURE__ */ s(o, { className: "h-3 w-3 fill-amber-400 text-status-warning-text" }), /* @__PURE__ */ s("span", { children: l })]
|
|
60
60
|
}), /* @__PURE__ */ c("div", {
|
|
61
61
|
className: "flex items-center gap-1",
|
|
62
62
|
children: [/* @__PURE__ */ s(i, { className: "h-3 w-3" }), /* @__PURE__ */ s("span", { children: u })]
|
|
63
63
|
})]
|
|
64
64
|
}), /* @__PURE__ */ s("button", {
|
|
65
|
-
className: "rounded-md bg-primary px-3 py-1 text-xs font-medium text-primary-
|
|
65
|
+
className: "rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
66
66
|
children: "Install"
|
|
67
67
|
})]
|
|
68
68
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppletStorePage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/AppletStorePage.tsx"],"sourcesContent":["import { Puzzle, Star, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function AppletStorePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent store/available applets (key starts with 'applet.store.')\n const storeApplets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.store.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <div className=\"rounded-lg border border-
|
|
1
|
+
{"version":3,"file":"AppletStorePage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/AppletStorePage.tsx"],"sourcesContent":["import { Puzzle, Star, Download } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function AppletStorePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent store/available applets (key starts with 'applet.store.')\n const storeApplets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.store.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <LoadingSkeleton variant=\"card\" count={6} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load applet store data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Applet Store\"\n description=\"Browse and install applets to extend TimeCampus\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {storeApplets.length === 0 ? (\n <div className=\"col-span-full p-8 text-center text-sm text-text-secondary\">\n No applets available in the store yet. Store applets are managed as\n workspace configurations with the \"applet.store.\" key prefix.\n </div>\n ) : (\n storeApplets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ?? applet.key.replace(\"applet.store.\", \"\");\n const description =\n applet.description ?? (val.description as string) ?? \"\";\n const category = (val.category as string) ?? \"general\";\n const rating = (val.rating as number) ?? 0;\n const downloads = (val.downloads as number) ?? 0;\n\n return (\n <div\n key={applet.id}\n className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-5 transition-colors hover:bg-bg-sunken/50 cursor-pointer\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-xl bg-action-primary-bg/10\">\n <Puzzle className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {name}\n </p>\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </div>\n </div>\n <div className=\"mt-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3 text-xs text-text-secondary\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-amber-400 text-status-warning-text\" />\n <span>{rating}</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <Download className=\"h-3 w-3\" />\n <span>{downloads}</span>\n </div>\n </div>\n <button className=\"rounded-md bg-action-primary-bg px-3 py-1 text-xs font-medium text-action-primary-text hover:bg-action-primary-bg/90\">\n Install\n </button>\n </div>\n </div>\n );\n })\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AASA,SAAgB,IAAkB;CAChC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGb,QAAQ,MAC1C,EAAE,IAAI,WAAW,gBAAgB,CAClC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAa,WAAW,IACvB,kBAAC,OAAD;IAAK,WAAU;cAA4D;IAGrE,CAAA,GAEN,EAAa,KAAK,MAAwC;IACxD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QAAmB,EAAO,IAAI,QAAQ,iBAAiB,GAAG,EAC3D,IACJ,EAAO,eAAgB,EAAI,eAA0B;AACrC,MAAI;IACtB,IAAM,IAAU,EAAI,UAAqB,GACnC,IAAa,EAAI,aAAwB;AAE/C,WACE,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;OACvC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA+B;QAAgB,CAAA,CACxD;SACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,mDAAoD,CAAA,EACpE,kBAAC,QAAD,EAAA,UAAO,GAAc,CAAA,CACjB;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAChC,kBAAC,QAAD,EAAA,UAAO,GAAiB,CAAA,CACpB;UACF;UACN,kBAAC,UAAD;OAAQ,WAAU;iBAAuH;OAEhI,CAAA,CACL;QACF;OA7BC,EAAO,GA6BR;KAER;GAEA,CAAA;EACK,CAAA"}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
2
|
import { getStatusColor as t } from "../../utils/helpers.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
|
|
4
|
+
import { useListConfigurationsQuery as r } from "../../../generated/wspace-operations.js";
|
|
5
|
+
import { PageLayout as i } from "../../components/PageLayout.js";
|
|
6
6
|
import { Puzzle as a, Settings as o } from "lucide-react";
|
|
7
7
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
8
|
//#region src/timecampus/pages/applets/InstalledAppletsPage.tsx
|
|
9
9
|
function l() {
|
|
10
|
-
let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } =
|
|
11
|
-
return d ? /* @__PURE__ */ s(
|
|
10
|
+
let { workspaceId: l = "" } = e(), { data: u, loading: d, error: f } = r({ variables: { scope: "WORKSPACE" } }), p = (u?.configurations ?? []).filter((e) => e.key.startsWith("applet.installed."));
|
|
11
|
+
return d ? /* @__PURE__ */ s(i, {
|
|
12
12
|
title: "Installed Applets",
|
|
13
13
|
description: "Manage your installed applets and integrations",
|
|
14
|
-
children: /* @__PURE__ */ s(
|
|
14
|
+
children: /* @__PURE__ */ s(n, {
|
|
15
15
|
variant: "list",
|
|
16
16
|
count: 5
|
|
17
17
|
})
|
|
18
|
-
}) : f ? /* @__PURE__ */ s(
|
|
18
|
+
}) : f ? /* @__PURE__ */ s(i, {
|
|
19
19
|
title: "Installed Applets",
|
|
20
20
|
description: "Manage your installed applets and integrations",
|
|
21
21
|
children: /* @__PURE__ */ s("div", {
|
|
22
|
-
className: "rounded-lg border border-
|
|
22
|
+
className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
|
|
23
23
|
children: "Failed to load installed applets. Please try again later."
|
|
24
24
|
})
|
|
25
|
-
}) : /* @__PURE__ */ s(
|
|
25
|
+
}) : /* @__PURE__ */ s(i, {
|
|
26
26
|
title: "Installed Applets",
|
|
27
27
|
description: "Manage your installed applets and integrations",
|
|
28
28
|
children: /* @__PURE__ */ s("div", {
|
|
29
|
-
className: "rounded-xl border border-border bg-card",
|
|
29
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
|
|
30
30
|
children: /* @__PURE__ */ s("div", {
|
|
31
31
|
className: "divide-y divide-border",
|
|
32
32
|
children: p.length === 0 ? /* @__PURE__ */ s("div", {
|
|
33
|
-
className: "p-8 text-center text-sm text-
|
|
33
|
+
className: "p-8 text-center text-sm text-text-secondary",
|
|
34
34
|
children: "No applets installed yet. Installed applets are stored as workspace configurations with the \"applet.installed.\" key prefix."
|
|
35
35
|
}) : p.map((e) => {
|
|
36
36
|
let n = e.value, r = n.name ?? e.key.replace("applet.installed.", ""), i = n.category ?? "general", l = n.version ?? "1.0.0", u = n.author ?? "Unknown", d = n.isActive ?? !0, f = n.updateAvailable ?? !1;
|
|
37
37
|
return /* @__PURE__ */ c("div", {
|
|
38
|
-
className: "flex items-center justify-between p-4 hover:bg-
|
|
38
|
+
className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
|
|
39
39
|
children: [/* @__PURE__ */ c("div", {
|
|
40
40
|
className: "flex items-center gap-3",
|
|
41
41
|
children: [/* @__PURE__ */ s("div", {
|
|
42
|
-
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",
|
|
42
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10",
|
|
43
43
|
children: /* @__PURE__ */ s(a, { className: "h-5 w-5 text-primary" })
|
|
44
44
|
}), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ c("div", {
|
|
45
45
|
className: "flex items-center gap-2",
|
|
46
46
|
children: [/* @__PURE__ */ s("p", {
|
|
47
|
-
className: "text-sm font-medium text-
|
|
47
|
+
className: "text-sm font-medium text-text-primary",
|
|
48
48
|
children: r
|
|
49
49
|
}), f && /* @__PURE__ */ s("span", {
|
|
50
|
-
className: "inline-flex rounded-full bg-
|
|
50
|
+
className: "inline-flex rounded-full bg-status-info-bg px-2 py-0.5 text-xs font-medium text-status-info-text",
|
|
51
51
|
children: "Update"
|
|
52
52
|
})]
|
|
53
53
|
}), /* @__PURE__ */ c("p", {
|
|
54
|
-
className: "text-xs text-
|
|
54
|
+
className: "text-xs text-text-secondary",
|
|
55
55
|
children: [
|
|
56
56
|
"v",
|
|
57
57
|
l,
|
|
@@ -67,8 +67,8 @@ function l() {
|
|
|
67
67
|
className: `inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${t(d ? "active" : "inactive")}`,
|
|
68
68
|
children: d ? "Active" : "Disabled"
|
|
69
69
|
}), /* @__PURE__ */ s("button", {
|
|
70
|
-
className: "rounded-md p-1.5 hover:bg-
|
|
71
|
-
children: /* @__PURE__ */ s(o, { className: "h-4 w-4 text-
|
|
70
|
+
className: "rounded-md p-1.5 hover:bg-bg-sunken",
|
|
71
|
+
children: /* @__PURE__ */ s(o, { className: "h-4 w-4 text-text-secondary" })
|
|
72
72
|
})]
|
|
73
73
|
})]
|
|
74
74
|
}, e.id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstalledAppletsPage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/InstalledAppletsPage.tsx"],"sourcesContent":["import { Puzzle, Settings, ExternalLink } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function InstalledAppletsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent installed applets (key starts with 'applet.installed.')\n const applets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.installed.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <div className=\"rounded-lg border border-
|
|
1
|
+
{"version":3,"file":"InstalledAppletsPage.js","names":[],"sources":["../../../../src/timecampus/pages/applets/InstalledAppletsPage.tsx"],"sourcesContent":["import { Puzzle, Settings, ExternalLink } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function InstalledAppletsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as any },\n });\n\n const configurations = data?.configurations ?? [];\n\n // Filter configurations that represent installed applets (key starts with 'applet.installed.')\n const applets = configurations.filter((c: ConfigurationFieldsFragment) =>\n c.key.startsWith(\"applet.installed.\"),\n );\n\n if (loading) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <div className=\"rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text\">\n Failed to load installed applets. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Installed Applets\"\n description=\"Manage your installed applets and integrations\"\n >\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop\">\n <div className=\"divide-y divide-border\">\n {applets.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No applets installed yet. Installed applets are stored as\n workspace configurations with the \"applet.installed.\" key prefix.\n </div>\n ) : (\n applets.map((applet: ConfigurationFieldsFragment) => {\n const val = applet.value as Record<string, unknown>;\n const name =\n (val.name as string) ??\n applet.key.replace(\"applet.installed.\", \"\");\n const category = (val.category as string) ?? \"general\";\n const version = (val.version as string) ?? \"1.0.0\";\n const author = (val.author as string) ?? \"Unknown\";\n const isActive = (val.isActive as boolean) ?? true;\n const hasUpdate = (val.updateAvailable as boolean) ?? false;\n\n return (\n <div\n key={applet.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 <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-action-primary-bg/10\">\n <Puzzle className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">\n {name}\n </p>\n {hasUpdate && (\n <span className=\"inline-flex rounded-full bg-status-info-bg px-2 py-0.5 text-xs font-medium text-status-info-text\">\n Update\n </span>\n )}\n </div>\n <p className=\"text-xs text-text-secondary\">\n v{version} · by {author} · {category}\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 ${getStatusColor(isActive ? \"active\" : \"inactive\")}`}\n >\n {isActive ? \"Active\" : \"Disabled\"}\n </span>\n <button className=\"rounded-md p-1.5 hover:bg-bg-sunken\">\n <Settings className=\"h-4 w-4 text-text-secondary\" />\n </button>\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAA2B,EAC1D,WAAW,EAAE,OAAO,aAAoB,EACzC,CAAC,EAKI,KAHiB,GAAM,kBAAkB,EAAE,EAGlB,QAAQ,MACrC,EAAE,IAAI,WAAW,oBAAoB,CACtC;AA0BD,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,WAAW,IAClB,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAGvD,CAAA,GAEN,EAAQ,KAAK,MAAwC;KACnD,IAAM,IAAM,EAAO,OACb,IACH,EAAI,QACL,EAAO,IAAI,QAAQ,qBAAqB,GAAG,EACvC,IAAY,EAAI,YAAuB,WACvC,IAAW,EAAI,WAAsB,SACrC,IAAU,EAAI,UAAqB,WACnC,IAAY,EAAI,YAAwB,IACxC,IAAa,EAAI,mBAA+B;AAEtD,YACE,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA;QACvC,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACH,KACC,kBAAC,QAAD;SAAM,WAAU;mBAAmG;SAE5G,CAAA,CAEL;WACN,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAA2C;SACvC;SAAQ;SAAc;SAAO;SAAW;SACxC;UACA,EAAA,CAAA,CACF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,IAAW,WAAW,WAAW;kBAEtH,IAAW,WAAW;QAClB,CAAA,EACP,kBAAC,UAAD;QAAQ,WAAU;kBAChB,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA;QAC7C,CAAA,CACL;SACF;QAjCC,EAAO,GAiCR;MAER;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
|
|
@@ -1,49 +1,49 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
2
|
import { formatHours as t } from "../../utils/helpers.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { StatCard as n } from "../../components/StatCard.js";
|
|
4
|
+
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
5
|
+
import { useGetAppUsageSummaryQuery as i, useListApplicationUsagesQuery as a } from "../../../generated/wspace-operations.js";
|
|
6
|
+
import { PageLayout as o } from "../../components/PageLayout.js";
|
|
7
7
|
import { Clock as s, Monitor as c } from "lucide-react";
|
|
8
8
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
9
9
|
//#region src/timecampus/pages/application-usage/ApplicationUsagePage.tsx
|
|
10
10
|
var d = {
|
|
11
|
-
productive: "bg-
|
|
12
|
-
neutral: "bg-
|
|
13
|
-
communication: "bg-
|
|
14
|
-
distracting: "bg-
|
|
11
|
+
productive: "bg-status-success-bg text-status-success-text",
|
|
12
|
+
neutral: "bg-bg-sunken text-text-secondary",
|
|
13
|
+
communication: "bg-status-info-bg text-status-info-text",
|
|
14
|
+
distracting: "bg-status-error-bg text-status-error-text"
|
|
15
15
|
};
|
|
16
16
|
function f() {
|
|
17
|
-
let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } =
|
|
17
|
+
let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = a({
|
|
18
18
|
variables: { limit: 50 },
|
|
19
19
|
skip: !f
|
|
20
|
-
}), { data: g, loading: _, error: v } =
|
|
21
|
-
return y ? /* @__PURE__ */ l(
|
|
20
|
+
}), { data: g, loading: _, error: v } = i({ skip: !f }), y = m || _, b = h || v, x = p?.applicationUsages ?? [], S = g?.appUsageSummary, C = x.reduce((e, t) => e + t.timeSpent, 0), w = x.reduce((e, t) => e + t.switches, 0), T = S?.productivityRatio == null ? "--" : `${Math.round(S.productivityRatio * 100)}%`, E = x.filter((e) => e.timeSpent >= 5400).length;
|
|
21
|
+
return y ? /* @__PURE__ */ l(o, {
|
|
22
22
|
title: "App Usage",
|
|
23
23
|
description: "Track application usage and productivity",
|
|
24
|
-
children: /* @__PURE__ */ l(
|
|
24
|
+
children: /* @__PURE__ */ l(r, {
|
|
25
25
|
variant: "card",
|
|
26
26
|
count: 4
|
|
27
27
|
})
|
|
28
|
-
}) : b ? /* @__PURE__ */ l(
|
|
28
|
+
}) : b ? /* @__PURE__ */ l(o, {
|
|
29
29
|
title: "App Usage",
|
|
30
30
|
description: "Track application usage and productivity",
|
|
31
31
|
children: /* @__PURE__ */ l("div", {
|
|
32
|
-
className: "rounded-xl border border-
|
|
32
|
+
className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
|
|
33
33
|
children: "Failed to load application usage. Please try again later."
|
|
34
34
|
})
|
|
35
|
-
}) : /* @__PURE__ */ u(
|
|
35
|
+
}) : /* @__PURE__ */ u(o, {
|
|
36
36
|
title: "App Usage",
|
|
37
37
|
description: "Track application usage and productivity",
|
|
38
38
|
children: [/* @__PURE__ */ u("div", {
|
|
39
39
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
40
40
|
children: [
|
|
41
|
-
/* @__PURE__ */ l(
|
|
41
|
+
/* @__PURE__ */ l(n, {
|
|
42
42
|
title: "Total Screen Time",
|
|
43
43
|
value: t(C / 3600),
|
|
44
44
|
icon: /* @__PURE__ */ l(c, { className: "h-5 w-5" })
|
|
45
45
|
}),
|
|
46
|
-
/* @__PURE__ */ l(
|
|
46
|
+
/* @__PURE__ */ l(n, {
|
|
47
47
|
title: "Productive Time",
|
|
48
48
|
value: T,
|
|
49
49
|
trend: S?.productivityRatio == null ? void 0 : {
|
|
@@ -51,12 +51,12 @@ function f() {
|
|
|
51
51
|
label: "vs last week"
|
|
52
52
|
}
|
|
53
53
|
}),
|
|
54
|
-
/* @__PURE__ */ l(
|
|
54
|
+
/* @__PURE__ */ l(n, {
|
|
55
55
|
title: "App Switches",
|
|
56
56
|
value: String(w),
|
|
57
57
|
description: `Avg. ${x.length > 0 ? Math.round(w / x.length) : 0}/app`
|
|
58
58
|
}),
|
|
59
|
-
/* @__PURE__ */ l(
|
|
59
|
+
/* @__PURE__ */ l(n, {
|
|
60
60
|
title: "Focus Sessions",
|
|
61
61
|
value: String(E),
|
|
62
62
|
icon: /* @__PURE__ */ l(s, { className: "h-5 w-5" }),
|
|
@@ -64,21 +64,21 @@ function f() {
|
|
|
64
64
|
})
|
|
65
65
|
]
|
|
66
66
|
}), /* @__PURE__ */ l("div", {
|
|
67
|
-
className: "rounded-xl border border-border bg-card",
|
|
67
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
|
|
68
68
|
children: /* @__PURE__ */ l("div", {
|
|
69
69
|
className: "divide-y divide-border",
|
|
70
70
|
children: x.length === 0 ? /* @__PURE__ */ l("div", {
|
|
71
|
-
className: "p-8 text-center text-sm text-
|
|
71
|
+
className: "p-8 text-center text-sm text-text-secondary",
|
|
72
72
|
children: "No application usage data found."
|
|
73
73
|
}) : x.map((e) => /* @__PURE__ */ u("div", {
|
|
74
|
-
className: "flex items-center justify-between p-4 hover:bg-
|
|
74
|
+
className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
|
|
75
75
|
children: [/* @__PURE__ */ u("div", {
|
|
76
76
|
className: "flex items-center gap-3",
|
|
77
|
-
children: [/* @__PURE__ */ l(c, { className: "h-5 w-5 text-
|
|
78
|
-
className: "text-sm font-medium text-
|
|
77
|
+
children: [/* @__PURE__ */ l(c, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
78
|
+
className: "text-sm font-medium text-text-primary",
|
|
79
79
|
children: e.applicationName
|
|
80
80
|
}), /* @__PURE__ */ u("p", {
|
|
81
|
-
className: "text-xs text-
|
|
81
|
+
className: "text-xs text-text-secondary",
|
|
82
82
|
children: [e.sessions, " sessions"]
|
|
83
83
|
})] })]
|
|
84
84
|
}), /* @__PURE__ */ u("div", {
|
|
@@ -87,7 +87,7 @@ function f() {
|
|
|
87
87
|
/* @__PURE__ */ l("div", {
|
|
88
88
|
className: "text-right",
|
|
89
89
|
children: /* @__PURE__ */ l("p", {
|
|
90
|
-
className: "text-sm font-mono font-medium text-
|
|
90
|
+
className: "text-sm font-mono font-medium text-text-primary",
|
|
91
91
|
children: t(e.timeSpent / 3600)
|
|
92
92
|
})
|
|
93
93
|
}),
|
|
@@ -98,9 +98,9 @@ function f() {
|
|
|
98
98
|
/* @__PURE__ */ l("div", {
|
|
99
99
|
className: "w-16",
|
|
100
100
|
children: /* @__PURE__ */ l("div", {
|
|
101
|
-
className: "h-2 rounded-full bg-
|
|
101
|
+
className: "h-2 rounded-full bg-bg-sunken",
|
|
102
102
|
children: /* @__PURE__ */ l("div", {
|
|
103
|
-
className: "h-2 rounded-full bg-primary",
|
|
103
|
+
className: "h-2 rounded-full bg-action-primary-bg",
|
|
104
104
|
style: { width: `${Math.min(100, Math.round(e.timeSpent / (C || 1) * 100))}%` }
|
|
105
105
|
})
|
|
106
106
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApplicationUsagePage.js","names":[],"sources":["../../../../src/timecampus/pages/application-usage/ApplicationUsagePage.tsx"],"sourcesContent":["import { Monitor, Clock } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListApplicationUsagesQuery,\n useGetAppUsageSummaryQuery,\n type ApplicationUsageFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst categoryColors: Record<string, string> = {\n productive
|
|
1
|
+
{"version":3,"file":"ApplicationUsagePage.js","names":[],"sources":["../../../../src/timecampus/pages/application-usage/ApplicationUsagePage.tsx"],"sourcesContent":["import { Monitor, Clock } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours, getStatusColor } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListApplicationUsagesQuery,\n useGetAppUsageSummaryQuery,\n type ApplicationUsageFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst categoryColors: Record<string, string> = {\n productive: \"bg-status-success-bg text-status-success-text\",\n neutral: \"bg-bg-sunken text-text-secondary\",\n communication: \"bg-status-info-bg text-status-info-text\",\n distracting: \"bg-status-error-bg text-status-error-text\",\n};\n\nexport function ApplicationUsagePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: usagesData,\n loading: usagesLoading,\n error: usagesError,\n } = useListApplicationUsagesQuery({\n variables: { limit: 50 },\n skip: !workspaceId,\n });\n\n const {\n data: summaryData,\n loading: summaryLoading,\n error: summaryError,\n } = useGetAppUsageSummaryQuery({\n skip: !workspaceId,\n });\n\n const loading = usagesLoading || summaryLoading;\n const error = usagesError || summaryError;\n const apps = usagesData?.applicationUsages ?? [];\n const summary = summaryData?.appUsageSummary;\n\n const totalScreenTimeSeconds = apps.reduce(\n (sum: number, app: ApplicationUsageFieldsFragment) => sum + app.timeSpent,\n 0,\n );\n const totalSwitches = apps.reduce(\n (sum: number, app: ApplicationUsageFieldsFragment) => sum + app.switches,\n 0,\n );\n const productiveRatio =\n summary?.productivityRatio != null\n ? `${Math.round(summary.productivityRatio * 100)}%`\n : \"--\";\n\n // Count focus sessions (apps with > 90 min continuous usage)\n const focusSessions = apps.filter(\n (app: ApplicationUsageFieldsFragment) => app.timeSpent >= 5400,\n ).length;\n\n if (loading) {\n return (\n <PageLayout\n title=\"App Usage\"\n description=\"Track application usage and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"App Usage\"\n description=\"Track application usage and productivity\"\n >\n <div className=\"rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n Failed to load application usage. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"App Usage\"\n description=\"Track application usage and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Screen Time\"\n value={formatHours(totalScreenTimeSeconds / 3600)}\n icon={<Monitor className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Productive Time\"\n value={productiveRatio}\n trend={\n summary?.productivityRatio != null\n ? { value: 5, label: \"vs last week\" }\n : undefined\n }\n />\n <StatCard\n title=\"App Switches\"\n value={String(totalSwitches)}\n description={`Avg. ${apps.length > 0 ? Math.round(totalSwitches / apps.length) : 0}/app`}\n />\n <StatCard\n title=\"Focus Sessions\"\n value={String(focusSessions)}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"90+ min each\"\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop\">\n <div className=\"divide-y divide-border\">\n {apps.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No application usage data found.\n </div>\n ) : (\n apps.map((app: ApplicationUsageFieldsFragment) => (\n <div\n key={app.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 <Monitor className=\"h-5 w-5 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {app.applicationName}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {app.sessions} sessions\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"text-right\">\n <p className=\"text-sm font-mono font-medium text-text-primary\">\n {formatHours(app.timeSpent / 3600)}\n </p>\n </div>\n <span\n className={`inline-flex rounded-full px-2 py-0.5 text-xs font-medium ${categoryColors[app.category] || \"\"}`}\n >\n {app.category}\n </span>\n <div className=\"w-16\">\n <div className=\"h-2 rounded-full bg-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-action-primary-bg\"\n style={{\n width: `${Math.min(100, Math.round((app.timeSpent / (totalScreenTimeSeconds || 1)) * 100))}%`,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAYA,IAAM,IAAyC;CAC7C,YAAY;CACZ,SAAS;CACT,eAAe;CACf,aAAa;CACd;AAED,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA8B;EAChC,WAAW,EAAE,OAAO,IAAI;EACxB,MAAM,CAAC;EACR,CAAC,EAEI,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAA2B,EAC7B,MAAM,CAAC,GACR,CAAC,EAEI,IAAU,KAAiB,GAC3B,IAAQ,KAAe,GACvB,IAAO,GAAY,qBAAqB,EAAE,EAC1C,IAAU,GAAa,iBAEvB,IAAyB,EAAK,QACjC,GAAa,MAAwC,IAAM,EAAI,WAChE,EACD,EACK,IAAgB,EAAK,QACxB,GAAa,MAAwC,IAAM,EAAI,UAChE,EACD,EACK,IACJ,GAAS,qBAAqB,OAE1B,OADA,GAAG,KAAK,MAAM,EAAQ,oBAAoB,IAAI,CAAC,IAI/C,IAAgB,EAAK,QACxB,MAAwC,EAAI,aAAa,KAC3D,CAAC;AA0BF,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA2G;GAEpH,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAY,IAAyB,KAAK;KACjD,MAAM,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA;KACrC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,OACE,GAAS,qBAAqB,OAE1B,KAAA,IADA;MAAE,OAAO;MAAG,OAAO;MAAgB;KAGzC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAc;KAC5B,aAAa,QAAQ,EAAK,SAAS,IAAI,KAAK,MAAM,IAAgB,EAAK,OAAO,GAAG,EAAE;KACnF,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAc;KAC5B,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAK,WAAW,IACf,kBAAC,OAAD;KAAK,WAAU;eAA8C;KAEvD,CAAA,GAEN,EAAK,KAAK,MACR,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,+BAAgC,CAAA,EACnD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAI;OACH,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAI,UAAS,YACZ;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAY,EAAI,YAAY,KAAK;SAChC,CAAA;QACA,CAAA;OACN,kBAAC,QAAD;QACE,WAAW,4DAA4D,EAAe,EAAI,aAAa;kBAEtG,EAAI;QACA,CAAA;OACP,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,WAAU;UACV,OAAO,EACL,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,MAAO,EAAI,aAAa,KAA0B,KAAM,IAAI,CAAC,CAAC,IAC5F;UACD,CAAA;SACE,CAAA;QACF,CAAA;OACF;QACF;OApCC,EAAI,GAoCL,CACN;IAEA,CAAA;GACF,CAAA,CACK"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { LoadingSkeleton as t } from "../../components/LoadingSkeleton.js";
|
|
3
|
+
import { useListConfigurationsQuery as n, useSetConfigurationMutation as r } from "../../../generated/wspace-operations.js";
|
|
4
|
+
import { PageLayout as i } from "../../components/PageLayout.js";
|
|
5
5
|
import { useCallback as a, useEffect as o, useState as s } from "react";
|
|
6
6
|
import { Settings as c } from "lucide-react";
|
|
7
7
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
@@ -12,13 +12,13 @@ var d = "timecampus.appusage.settings", f = {
|
|
|
12
12
|
distractionAlerts: !1
|
|
13
13
|
};
|
|
14
14
|
function p() {
|
|
15
|
-
let { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } =
|
|
15
|
+
let { workspaceId: p = "" } = e(), { data: m, loading: h, error: g } = n({
|
|
16
16
|
variables: {
|
|
17
17
|
scope: "WORKSPACE",
|
|
18
18
|
limit: 100
|
|
19
19
|
},
|
|
20
20
|
skip: !p
|
|
21
|
-
}), [_, { loading: v }] =
|
|
21
|
+
}), [_, { loading: v }] = r(), [y, b] = s(f);
|
|
22
22
|
o(() => {
|
|
23
23
|
if (m?.configurations) {
|
|
24
24
|
let e = m.configurations.find((e) => e.key === d);
|
|
@@ -40,26 +40,26 @@ function p() {
|
|
|
40
40
|
scope: "WORKSPACE"
|
|
41
41
|
} } });
|
|
42
42
|
}, [_, y]);
|
|
43
|
-
return h ? /* @__PURE__ */ l(
|
|
43
|
+
return h ? /* @__PURE__ */ l(i, {
|
|
44
44
|
title: "App Usage Settings",
|
|
45
45
|
description: "Configure application tracking",
|
|
46
|
-
children: /* @__PURE__ */ l(
|
|
47
|
-
}) : g ? /* @__PURE__ */ l(
|
|
46
|
+
children: /* @__PURE__ */ l(t, { variant: "detail" })
|
|
47
|
+
}) : g ? /* @__PURE__ */ l(i, {
|
|
48
48
|
title: "App Usage Settings",
|
|
49
49
|
description: "Configure application tracking",
|
|
50
50
|
children: /* @__PURE__ */ l("div", {
|
|
51
|
-
className: "rounded-xl border border-
|
|
51
|
+
className: "rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
|
|
52
52
|
children: "Failed to load settings. Please try again later."
|
|
53
53
|
})
|
|
54
|
-
}) : /* @__PURE__ */ l(
|
|
54
|
+
}) : /* @__PURE__ */ l(i, {
|
|
55
55
|
title: "App Usage Settings",
|
|
56
56
|
description: "Configure application tracking",
|
|
57
57
|
children: /* @__PURE__ */ u("div", {
|
|
58
58
|
className: "mx-auto max-w-2xl space-y-6",
|
|
59
59
|
children: [/* @__PURE__ */ u("div", {
|
|
60
|
-
className: "rounded-xl border border-border bg-card p-6",
|
|
60
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
|
|
61
61
|
children: [/* @__PURE__ */ u("h3", {
|
|
62
|
-
className: "mb-4 flex items-center gap-2 text-sm font-semibold text-
|
|
62
|
+
className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
63
63
|
children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Tracking Configuration"]
|
|
64
64
|
}), /* @__PURE__ */ u("div", {
|
|
65
65
|
className: "space-y-3",
|
|
@@ -67,7 +67,7 @@ function p() {
|
|
|
67
67
|
/* @__PURE__ */ u("label", {
|
|
68
68
|
className: "flex items-center justify-between",
|
|
69
69
|
children: [/* @__PURE__ */ l("span", {
|
|
70
|
-
className: "text-sm text-
|
|
70
|
+
className: "text-sm text-text-primary",
|
|
71
71
|
children: "Track active applications"
|
|
72
72
|
}), /* @__PURE__ */ l("input", {
|
|
73
73
|
type: "checkbox",
|
|
@@ -76,13 +76,13 @@ function p() {
|
|
|
76
76
|
...t,
|
|
77
77
|
trackActiveApplications: e.target.checked
|
|
78
78
|
})),
|
|
79
|
-
className: "h-4 w-4 rounded border-border"
|
|
79
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
80
80
|
})]
|
|
81
81
|
}),
|
|
82
82
|
/* @__PURE__ */ u("label", {
|
|
83
83
|
className: "flex items-center justify-between",
|
|
84
84
|
children: [/* @__PURE__ */ l("span", {
|
|
85
|
-
className: "text-sm text-
|
|
85
|
+
className: "text-sm text-text-primary",
|
|
86
86
|
children: "Track browser tabs"
|
|
87
87
|
}), /* @__PURE__ */ l("input", {
|
|
88
88
|
type: "checkbox",
|
|
@@ -91,13 +91,13 @@ function p() {
|
|
|
91
91
|
...t,
|
|
92
92
|
trackBrowserTabs: e.target.checked
|
|
93
93
|
})),
|
|
94
|
-
className: "h-4 w-4 rounded border-border"
|
|
94
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
95
95
|
})]
|
|
96
96
|
}),
|
|
97
97
|
/* @__PURE__ */ u("label", {
|
|
98
98
|
className: "flex items-center justify-between",
|
|
99
99
|
children: [/* @__PURE__ */ l("span", {
|
|
100
|
-
className: "text-sm text-
|
|
100
|
+
className: "text-sm text-text-primary",
|
|
101
101
|
children: "Distraction alerts"
|
|
102
102
|
}), /* @__PURE__ */ l("input", {
|
|
103
103
|
type: "checkbox",
|
|
@@ -106,7 +106,7 @@ function p() {
|
|
|
106
106
|
...t,
|
|
107
107
|
distractionAlerts: e.target.checked
|
|
108
108
|
})),
|
|
109
|
-
className: "h-4 w-4 rounded border-border"
|
|
109
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
110
110
|
})]
|
|
111
111
|
})
|
|
112
112
|
]
|
|
@@ -116,7 +116,7 @@ function p() {
|
|
|
116
116
|
children: /* @__PURE__ */ l("button", {
|
|
117
117
|
onClick: x,
|
|
118
118
|
disabled: v,
|
|
119
|
-
className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-
|
|
119
|
+
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",
|
|
120
120
|
children: v ? "Saving..." : "Save Settings"
|
|
121
121
|
})
|
|
122
122
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApplicationUsageSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/application-usage/ApplicationUsageSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n useSetConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst APP_USAGE_SETTINGS_KEY = \"timecampus.appusage.settings\";\n\ninterface AppUsageSettings {\n trackActiveApplications: boolean;\n trackBrowserTabs: boolean;\n distractionAlerts: boolean;\n}\n\nconst DEFAULT_SETTINGS: AppUsageSettings = {\n trackActiveApplications: true,\n trackBrowserTabs: true,\n distractionAlerts: false,\n};\n\nexport function ApplicationUsageSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as never, limit: 100 },\n skip: !workspaceId,\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n const [settings, setSettings] = useState<AppUsageSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const config = data.configurations.find(\n (c: ConfigurationFieldsFragment) => c.key === APP_USAGE_SETTINGS_KEY,\n );\n if (config?.value) {\n const val = config.value as Partial<AppUsageSettings>;\n setSettings({\n trackActiveApplications:\n val.trackActiveApplications ??\n DEFAULT_SETTINGS.trackActiveApplications,\n trackBrowserTabs:\n val.trackBrowserTabs ?? DEFAULT_SETTINGS.trackBrowserTabs,\n distractionAlerts:\n val.distractionAlerts ?? DEFAULT_SETTINGS.distractionAlerts,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: APP_USAGE_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Application usage tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"App Usage Settings\"\n description=\"Configure application tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"App Usage Settings\"\n description=\"Configure application tracking\"\n >\n <div className=\"rounded-xl border border-
|
|
1
|
+
{"version":3,"file":"ApplicationUsageSettingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/application-usage/ApplicationUsageSettingsPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Settings } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListConfigurationsQuery,\n useSetConfigurationMutation,\n type ConfigurationFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst APP_USAGE_SETTINGS_KEY = \"timecampus.appusage.settings\";\n\ninterface AppUsageSettings {\n trackActiveApplications: boolean;\n trackBrowserTabs: boolean;\n distractionAlerts: boolean;\n}\n\nconst DEFAULT_SETTINGS: AppUsageSettings = {\n trackActiveApplications: true,\n trackBrowserTabs: true,\n distractionAlerts: false,\n};\n\nexport function ApplicationUsageSettingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { data, loading, error } = useListConfigurationsQuery({\n variables: { scope: \"WORKSPACE\" as never, limit: 100 },\n skip: !workspaceId,\n });\n\n const [setConfiguration, { loading: saving }] = useSetConfigurationMutation();\n const [settings, setSettings] = useState<AppUsageSettings>(DEFAULT_SETTINGS);\n\n useEffect(() => {\n if (data?.configurations) {\n const config = data.configurations.find(\n (c: ConfigurationFieldsFragment) => c.key === APP_USAGE_SETTINGS_KEY,\n );\n if (config?.value) {\n const val = config.value as Partial<AppUsageSettings>;\n setSettings({\n trackActiveApplications:\n val.trackActiveApplications ??\n DEFAULT_SETTINGS.trackActiveApplications,\n trackBrowserTabs:\n val.trackBrowserTabs ?? DEFAULT_SETTINGS.trackBrowserTabs,\n distractionAlerts:\n val.distractionAlerts ?? DEFAULT_SETTINGS.distractionAlerts,\n });\n }\n }\n }, [data]);\n\n const handleSave = useCallback(async () => {\n await setConfiguration({\n variables: {\n input: {\n key: APP_USAGE_SETTINGS_KEY,\n value: settings as unknown as Record<string, unknown>,\n description: \"Application usage tracking settings\",\n scope: \"WORKSPACE\" as never,\n },\n },\n });\n }, [setConfiguration, settings]);\n\n if (loading) {\n return (\n <PageLayout\n title=\"App Usage Settings\"\n description=\"Configure application tracking\"\n >\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"App Usage Settings\"\n description=\"Configure application tracking\"\n >\n <div className=\"rounded-xl border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n Failed to load settings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"App Usage Settings\"\n description=\"Configure application tracking\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Settings className=\"h-4 w-4\" />\n Tracking Configuration\n </h3>\n <div className=\"space-y-3\">\n <label className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-primary\">\n Track active applications\n </span>\n <input\n type=\"checkbox\"\n checked={settings.trackActiveApplications}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n trackActiveApplications: e.target.checked,\n }))\n }\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 Track browser tabs\n </span>\n <input\n type=\"checkbox\"\n checked={settings.trackBrowserTabs}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n trackBrowserTabs: e.target.checked,\n }))\n }\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 Distraction alerts\n </span>\n <input\n type=\"checkbox\"\n checked={settings.distractionAlerts}\n onChange={(e) =>\n setSettings((s) => ({\n ...s,\n distractionAlerts: e.target.checked,\n }))\n }\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </label>\n </div>\n </div>\n <div className=\"flex justify-end\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50\"\n >\n {saving ? \"Saving...\" : \"Save Settings\"}\n </button>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,IAAyB,gCAQzB,IAAqC;CACzC,yBAAyB;CACzB,kBAAkB;CAClB,mBAAmB;CACpB;AAED,SAAgB,IAA+B;CAC7C,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,EAAE,SAAM,YAAS,aAAU,EAA2B;EAC1D,WAAW;GAAE,OAAO;GAAsB,OAAO;GAAK;EACtD,MAAM,CAAC;EACR,CAAC,EAEI,CAAC,GAAkB,EAAE,SAAS,OAAY,GAA6B,EACvE,CAAC,GAAU,KAAe,EAA2B,EAAiB;AAE5E,SAAgB;AACd,MAAI,GAAM,gBAAgB;GACxB,IAAM,IAAS,EAAK,eAAe,MAChC,MAAmC,EAAE,QAAQ,EAC/C;AACD,OAAI,GAAQ,OAAO;IACjB,IAAM,IAAM,EAAO;AACnB,MAAY;KACV,yBACE,EAAI,2BACJ,EAAiB;KACnB,kBACE,EAAI,oBAAoB,EAAiB;KAC3C,mBACE,EAAI,qBAAqB,EAAiB;KAC7C,CAAC;;;IAGL,CAAC,EAAK,CAAC;CAEV,IAAM,IAAa,EAAY,YAAY;AACzC,QAAM,EAAiB,EACrB,WAAW,EACT,OAAO;GACL,KAAK;GACL,OAAO;GACP,aAAa;GACb,OAAO;GACR,EACF,EACF,CAAC;IACD,CAAC,GAAkB,EAAS,CAAC;AA0BhC,QAxBI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA,GAIb,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA2G;GAEpH,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,yBAE7B;QACL,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,yBAAyB,EAAE,OAAO;SACnC,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,kBAAkB,EAAE,OAAO;SAC5B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACR,kBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,kBAAC,QAAD;QAAM,WAAU;kBAA4B;QAErC,CAAA,EACP,kBAAC,SAAD;QACE,MAAK;QACL,SAAS,EAAS;QAClB,WAAW,MACT,GAAa,OAAO;SAClB,GAAG;SACH,mBAAmB,EAAE,OAAO;SAC7B,EAAE;QAEL,WAAU;QACV,CAAA,CACI;;MACJ;OACF;OACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,UAAD;KACE,SAAS;KACT,UAAU;KACV,WAAU;eAET,IAAS,cAAc;KACjB,CAAA;IACL,CAAA,CACF;;EACK,CAAA"}
|