@burdenoff/microfe-timecampus 2026.624.1 → 2026.626.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/EmptyState.js +14 -0
- package/dist/timecampus/components/EmptyState.js.map +1 -0
- package/dist/timecampus/components/ErrorBoundary.js +2 -2
- package/dist/timecampus/components/ErrorBoundary.js.map +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js +1 -1
- package/dist/timecampus/components/LoadingSkeleton.js.map +1 -1
- package/dist/timecampus/components/PageLayout.js +26 -14
- package/dist/timecampus/components/PageLayout.js.map +1 -1
- package/dist/timecampus/components/StatCard.js +19 -16
- package/dist/timecampus/components/StatCard.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +169 -149
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/applets/AppletStorePage.js +38 -35
- package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -1
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js +42 -36
- package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +57 -53
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +40 -36
- package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/channels/ChannelsPage.js +32 -29
- package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +52 -44
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js +65 -38
- package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/dashboard/ReportsPage.js +47 -41
- package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +16 -14
- package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +40 -36
- package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +34 -28
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +49 -41
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +66 -62
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +37 -33
- package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +37 -30
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +35 -31
- package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +37 -34
- package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +35 -31
- package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +45 -41
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +17 -15
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js +36 -32
- package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +120 -102
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +46 -36
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +19 -17
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js +143 -112
- package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +55 -51
- package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectCreatePage.js +32 -28
- package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectDetailPage.js +107 -76
- package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +21 -17
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +44 -34
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +59 -55
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +24 -20
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +47 -41
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamPage.js +89 -59
- package/dist/timecampus/pages/team/TeamPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +47 -43
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +39 -35
- package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js +24 -20
- package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplateDetailPage.js +66 -48
- package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -1
- package/dist/timecampus/pages/templates/TemplatesPage.js +39 -36
- package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +53 -44
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +72 -71
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +100 -66
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +63 -59
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js +64 -46
- package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -1
- package/dist/timecampus/pages/widgets/WidgetsPage.js +44 -37
- package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +18 -16
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +40 -36
- package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -1
- package/dist/timecampus/pages/workflows/WorkflowsPage.js +47 -37
- package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,70 +1,74 @@
|
|
|
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 {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { StatCard as n } from "../../components/StatCard.js";
|
|
4
|
+
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
5
|
+
import { useGetLocationStatsQuery as i, useListLocationEntriesQuery as a } from "../../../generated/wspace-operations.js";
|
|
6
|
+
import { PageLayout as o } from "../../components/PageLayout.js";
|
|
7
|
+
import { EmptyState as s } from "../../components/EmptyState.js";
|
|
8
|
+
import { Clock as c, MapPin as l } from "lucide-react";
|
|
9
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
10
|
//#region src/timecampus/pages/location-tracking/LocationTrackingPage.tsx
|
|
10
|
-
function
|
|
11
|
-
let { workspaceId:
|
|
12
|
-
return
|
|
11
|
+
function f() {
|
|
12
|
+
let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = a(), { data: g, loading: _, error: v } = i(), y = p?.locationEntries?.items ?? [], b = g?.locationStats;
|
|
13
|
+
return m && _ ? /* @__PURE__ */ u(o, {
|
|
13
14
|
title: "Location Tracking",
|
|
14
15
|
description: "Track work locations and productivity",
|
|
15
|
-
children: /* @__PURE__ */
|
|
16
|
+
children: /* @__PURE__ */ u(r, {
|
|
16
17
|
variant: "list",
|
|
17
18
|
count: 4
|
|
18
19
|
})
|
|
19
|
-
}) :
|
|
20
|
+
}) : h && v ? /* @__PURE__ */ u(o, {
|
|
20
21
|
title: "Location Tracking",
|
|
21
22
|
description: "Track work locations and productivity",
|
|
22
|
-
children: /* @__PURE__ */
|
|
23
|
-
className: "rounded-lg border border-
|
|
23
|
+
children: /* @__PURE__ */ u("div", {
|
|
24
|
+
className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
|
|
24
25
|
children: "Failed to load location data. Please try again later."
|
|
25
26
|
})
|
|
26
|
-
}) : /* @__PURE__ */
|
|
27
|
+
}) : /* @__PURE__ */ d(o, {
|
|
27
28
|
title: "Location Tracking",
|
|
28
29
|
description: "Track work locations and productivity",
|
|
29
|
-
|
|
30
|
+
purpose: "See where work actually happens — office, home, client sites — and how long you spend at each, so you can verify on-site time, support field teams, and back up location-based billing.",
|
|
31
|
+
children: [/* @__PURE__ */ d("div", {
|
|
30
32
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
31
33
|
children: [
|
|
32
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ u(n, {
|
|
35
|
+
featured: !0,
|
|
33
36
|
title: "Total Locations",
|
|
34
|
-
value: String(
|
|
35
|
-
icon: /* @__PURE__ */ l
|
|
37
|
+
value: String(b?.totalLocations ?? 0),
|
|
38
|
+
icon: /* @__PURE__ */ u(l, { className: "h-5 w-5" })
|
|
36
39
|
}),
|
|
37
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ u(n, {
|
|
38
41
|
title: "Unique Addresses",
|
|
39
|
-
value: String(
|
|
40
|
-
icon: /* @__PURE__ */ l
|
|
42
|
+
value: String(b?.uniqueAddresses ?? 0),
|
|
43
|
+
icon: /* @__PURE__ */ u(l, { className: "h-5 w-5" })
|
|
41
44
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
45
|
+
/* @__PURE__ */ u(n, {
|
|
43
46
|
title: "Most Frequent",
|
|
44
|
-
value:
|
|
47
|
+
value: b?.mostFrequentLocation ?? "N/A"
|
|
45
48
|
}),
|
|
46
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ u(n, {
|
|
47
50
|
title: "Total Duration",
|
|
48
|
-
value: t((
|
|
49
|
-
icon: /* @__PURE__ */
|
|
51
|
+
value: t((b?.totalDuration ?? 0) / 3600),
|
|
52
|
+
icon: /* @__PURE__ */ u(c, { className: "h-5 w-5" }),
|
|
50
53
|
description: "Tracked time"
|
|
51
54
|
})
|
|
52
55
|
]
|
|
53
|
-
}), /* @__PURE__ */
|
|
54
|
-
|
|
56
|
+
}), y.length === 0 && !m ? /* @__PURE__ */ u(s, {
|
|
57
|
+
illustration: "empty-data",
|
|
58
|
+
title: "No location entries found",
|
|
59
|
+
description: "With location tracking enabled, the places you work from will show up here with time spent at each."
|
|
60
|
+
}) : /* @__PURE__ */ u("div", {
|
|
61
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop",
|
|
55
62
|
children: /* @__PURE__ */ u("div", {
|
|
56
63
|
className: "divide-y divide-border",
|
|
57
|
-
children:
|
|
58
|
-
className: "p-4 text-center text-sm text-text-secondary",
|
|
59
|
-
children: "No location entries found."
|
|
60
|
-
}), v.map((e) => /* @__PURE__ */ u("div", {
|
|
64
|
+
children: y.map((e) => /* @__PURE__ */ d("div", {
|
|
61
65
|
className: "flex items-center justify-between p-4 hover:bg-bg-sunken/50 transition-colors",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
66
|
+
children: [/* @__PURE__ */ d("div", {
|
|
63
67
|
className: "flex items-center gap-3",
|
|
64
|
-
children: [/* @__PURE__ */ l
|
|
68
|
+
children: [/* @__PURE__ */ u(l, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
|
|
65
69
|
className: "text-sm font-medium text-text-primary",
|
|
66
70
|
children: e.address ?? "Unknown Location"
|
|
67
|
-
}), /* @__PURE__ */
|
|
71
|
+
}), /* @__PURE__ */ d("p", {
|
|
68
72
|
className: "text-xs text-text-secondary",
|
|
69
73
|
children: [
|
|
70
74
|
e.geofenceId ? "Geofenced" : "Manual",
|
|
@@ -73,25 +77,25 @@ function d() {
|
|
|
73
77
|
new Date(e.startTime).toLocaleDateString()
|
|
74
78
|
]
|
|
75
79
|
})] })]
|
|
76
|
-
}), /* @__PURE__ */
|
|
80
|
+
}), /* @__PURE__ */ u("div", {
|
|
77
81
|
className: "flex items-center gap-4",
|
|
78
|
-
children: /* @__PURE__ */
|
|
82
|
+
children: /* @__PURE__ */ d("div", {
|
|
79
83
|
className: "text-right",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
84
|
+
children: [/* @__PURE__ */ u("p", {
|
|
81
85
|
className: "text-sm font-medium text-text-primary",
|
|
82
86
|
children: e.duration ? t(e.duration / 3600) : "Active"
|
|
83
|
-
}), /* @__PURE__ */
|
|
87
|
+
}), /* @__PURE__ */ u("p", {
|
|
84
88
|
className: "text-xs text-text-secondary",
|
|
85
89
|
children: "duration"
|
|
86
90
|
})]
|
|
87
91
|
})
|
|
88
92
|
})]
|
|
89
|
-
}, e.id))
|
|
93
|
+
}, e.id))
|
|
90
94
|
})
|
|
91
95
|
})]
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
98
|
//#endregion
|
|
95
|
-
export {
|
|
99
|
+
export { f as LocationTrackingPage };
|
|
96
100
|
|
|
97
101
|
//# sourceMappingURL=LocationTrackingPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/location-tracking/LocationTrackingPage.tsx"],"sourcesContent":["import { MapPin, Clock } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListLocationEntriesQuery,\n useGetLocationStatsQuery,\n type LocationEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function LocationTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: entriesData,\n loading: entriesLoading,\n error: entriesError,\n } = useListLocationEntriesQuery();\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetLocationStatsQuery();\n\n const locations = entriesData?.locationEntries?.items ?? [];\n const stats = statsData?.locationStats;\n\n if (entriesLoading && statsLoading) {\n return (\n <PageLayout\n title=\"Location Tracking\"\n description=\"Track work locations and productivity\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (entriesError && statsError) {\n return (\n <PageLayout\n title=\"Location Tracking\"\n description=\"Track work locations and productivity\"\n >\n <div className=\"rounded-lg border border-
|
|
1
|
+
{"version":3,"file":"LocationTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/location-tracking/LocationTrackingPage.tsx"],"sourcesContent":["import { MapPin, Clock } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatHours } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListLocationEntriesQuery,\n useGetLocationStatsQuery,\n type LocationEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function LocationTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: entriesData,\n loading: entriesLoading,\n error: entriesError,\n } = useListLocationEntriesQuery();\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetLocationStatsQuery();\n\n const locations = entriesData?.locationEntries?.items ?? [];\n const stats = statsData?.locationStats;\n\n if (entriesLoading && statsLoading) {\n return (\n <PageLayout\n title=\"Location Tracking\"\n description=\"Track work locations and productivity\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (entriesError && statsError) {\n return (\n <PageLayout\n title=\"Location Tracking\"\n description=\"Track work locations and productivity\"\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 location data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Location Tracking\"\n description=\"Track work locations and productivity\"\n purpose=\"See where work actually happens — office, home, client sites — and how long you spend at each, so you can verify on-site time, support field teams, and back up location-based billing.\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Total Locations\"\n value={String(stats?.totalLocations ?? 0)}\n icon={<MapPin className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Unique Addresses\"\n value={String(stats?.uniqueAddresses ?? 0)}\n icon={<MapPin className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Most Frequent\"\n value={stats?.mostFrequentLocation ?? \"N/A\"}\n />\n <StatCard\n title=\"Total Duration\"\n value={formatHours((stats?.totalDuration ?? 0) / 3600)}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"Tracked time\"\n />\n </div>\n\n {locations.length === 0 && !entriesLoading ? (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No location entries found\"\n description=\"With location tracking enabled, the places you work from will show up here with time spent at each.\"\n />\n ) : (\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop\">\n <div className=\"divide-y divide-border\">\n {locations.map((location: LocationEntryFieldsFragment) => (\n <div\n key={location.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 <MapPin className=\"h-5 w-5 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {location.address ?? \"Unknown Location\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {location.geofenceId ? \"Geofenced\" : \"Manual\"} ·{\" \"}\n {new Date(location.startTime).toLocaleDateString()}\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-medium text-text-primary\">\n {location.duration\n ? formatHours(location.duration / 3600)\n : \"Active\"}\n </p>\n <p className=\"text-xs text-text-secondary\">duration</p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA6B,EAC3B,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,GAA0B,EAExB,IAAY,GAAa,iBAAiB,SAAS,EAAE,EACrD,IAAQ,GAAW;AA0BzB,QAxBI,KAAkB,IAElB,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,KAAgB,IAEhB,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAHV,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,UAAA;KACA,OAAM;KACN,OAAO,OAAO,GAAO,kBAAkB,EAAE;KACzC,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,mBAAmB,EAAE;KAC1C,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAO,wBAAwB;KACtC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAa,GAAO,iBAAiB,KAAK,KAAK;KACtD,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,aAAY;KACZ,CAAA;IACE;MAEL,EAAU,WAAW,KAAK,CAAC,IAC1B,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA,GAEF,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,KAAK,MACd,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EAClD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAS,WAAW;OACnB,CAAA,EACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAS,aAAa,cAAc;QAAS;QAAU;QACvD,IAAI,KAAK,EAAS,UAAU,CAAC,oBAAoB;QAChD;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAS,WACN,EAAY,EAAS,WAAW,KAAK,GACrC;QACF,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA,CACnD;;MACF,CAAA,CACF;OAzBC,EAAS,GAyBV,CACN;IACE,CAAA;GACF,CAAA,CAEG"}
|
|
@@ -1,41 +1,43 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
2
|
import { formatCurrency 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 { useGetMeetingStatsQuery as i } from "../../../generated/wspace-operations.js";
|
|
6
|
+
import { PageLayout as a } from "../../components/PageLayout.js";
|
|
7
7
|
import { BarChart3 as o, CalendarDays as s, Clock as c, DollarSign as l } from "lucide-react";
|
|
8
8
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
9
|
//#region src/timecampus/pages/meetings/MeetingAnalyticsPage.tsx
|
|
10
10
|
function f() {
|
|
11
|
-
let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } =
|
|
11
|
+
let { workspaceId: f = "" } = e(), { data: p, loading: m, error: h } = i({
|
|
12
12
|
variables: { workspaceId: f },
|
|
13
13
|
skip: !f
|
|
14
14
|
}), g = p?.meetingStats;
|
|
15
|
-
if (m) return /* @__PURE__ */ u(
|
|
15
|
+
if (m) return /* @__PURE__ */ u(a, {
|
|
16
16
|
title: "Meeting Analytics",
|
|
17
17
|
description: "Insights into meeting time and cost",
|
|
18
|
-
children: /* @__PURE__ */ u(
|
|
18
|
+
children: /* @__PURE__ */ u(r, {
|
|
19
19
|
variant: "card",
|
|
20
20
|
count: 4
|
|
21
21
|
})
|
|
22
22
|
});
|
|
23
|
-
if (h) return /* @__PURE__ */ u(
|
|
23
|
+
if (h) return /* @__PURE__ */ u(a, {
|
|
24
24
|
title: "Meeting Analytics",
|
|
25
25
|
description: "Insights into meeting time and cost",
|
|
26
26
|
children: /* @__PURE__ */ u("div", {
|
|
27
|
-
className: "rounded-lg border border-
|
|
27
|
+
className: "rounded-lg border border-status-error-bg/40 bg-status-error-bg p-4 text-sm text-status-error-text",
|
|
28
28
|
children: "Failed to load meeting analytics. Please try again later."
|
|
29
29
|
})
|
|
30
30
|
});
|
|
31
31
|
let _ = Math.round((g?.totalDuration ?? 0) / 60), v = Math.round(g?.averageDuration ?? 0);
|
|
32
|
-
return /* @__PURE__ */ d(
|
|
32
|
+
return /* @__PURE__ */ d(a, {
|
|
33
33
|
title: "Meeting Analytics",
|
|
34
34
|
description: "Insights into meeting time and cost",
|
|
35
|
+
purpose: "Put a number on your meeting habit — total hours, dollar cost and follow-through on action items — so you can cut the meetings that don't pay for themselves and reclaim time for focused work.",
|
|
35
36
|
children: [/* @__PURE__ */ d("div", {
|
|
36
37
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
37
38
|
children: [
|
|
38
|
-
/* @__PURE__ */ u(
|
|
39
|
+
/* @__PURE__ */ u(n, {
|
|
40
|
+
featured: !0,
|
|
39
41
|
title: "Total Meetings",
|
|
40
42
|
value: String(g?.totalMeetings ?? 0),
|
|
41
43
|
icon: /* @__PURE__ */ u(s, { className: "h-5 w-5" }),
|
|
@@ -44,7 +46,7 @@ function f() {
|
|
|
44
46
|
label: "actions completed"
|
|
45
47
|
}
|
|
46
48
|
}),
|
|
47
|
-
/* @__PURE__ */ u(
|
|
49
|
+
/* @__PURE__ */ u(n, {
|
|
48
50
|
title: "Meeting Hours",
|
|
49
51
|
value: `${_}h`,
|
|
50
52
|
icon: /* @__PURE__ */ u(c, { className: "h-5 w-5" }),
|
|
@@ -53,12 +55,12 @@ function f() {
|
|
|
53
55
|
label: "total minutes"
|
|
54
56
|
}
|
|
55
57
|
}),
|
|
56
|
-
/* @__PURE__ */ u(
|
|
58
|
+
/* @__PURE__ */ u(n, {
|
|
57
59
|
title: "Meeting Cost",
|
|
58
60
|
value: t(g?.totalCost ?? 0),
|
|
59
61
|
icon: /* @__PURE__ */ u(l, { className: "h-5 w-5" })
|
|
60
62
|
}),
|
|
61
|
-
/* @__PURE__ */ u(
|
|
63
|
+
/* @__PURE__ */ u(n, {
|
|
62
64
|
title: "Avg. Duration",
|
|
63
65
|
value: `${v} min`,
|
|
64
66
|
icon: /* @__PURE__ */ u(o, { className: "h-5 w-5" }),
|
|
@@ -69,7 +71,7 @@ function f() {
|
|
|
69
71
|
})
|
|
70
72
|
]
|
|
71
73
|
}), /* @__PURE__ */ d("div", {
|
|
72
|
-
className: "rounded-xl border border-border-
|
|
74
|
+
className: "rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6",
|
|
73
75
|
children: [/* @__PURE__ */ u("h3", {
|
|
74
76
|
className: "mb-4 text-sm font-semibold text-text-primary",
|
|
75
77
|
children: "Meeting Time Distribution"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeetingAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, CalendarDays, Clock, DollarSign } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetMeetingStatsQuery } from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const stats = data?.meetingStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <div className=\"rounded-lg border border-
|
|
1
|
+
{"version":3,"file":"MeetingAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, CalendarDays, Clock, DollarSign } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useGetMeetingStatsQuery } from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const stats = data?.meetingStats;\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\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 meeting analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalHours = Math.round((stats?.totalDuration ?? 0) / 60);\n const avgDuration = Math.round(stats?.averageDuration ?? 0);\n\n return (\n <PageLayout\n title=\"Meeting Analytics\"\n description=\"Insights into meeting time and cost\"\n purpose=\"Put a number on your meeting habit — total hours, dollar cost and follow-through on action items — so you can cut the meetings that don't pay for themselves and reclaim time for focused work.\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Total Meetings\"\n value={String(stats?.totalMeetings ?? 0)}\n icon={<CalendarDays className=\"h-5 w-5\" />}\n trend={{\n value: stats?.actionItemsCompleted ?? 0,\n label: \"actions completed\",\n }}\n />\n <StatCard\n title=\"Meeting Hours\"\n value={`${totalHours}h`}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{ value: stats?.totalDuration ?? 0, label: \"total minutes\" }}\n />\n <StatCard\n title=\"Meeting Cost\"\n value={formatCurrency(stats?.totalCost ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Avg. Duration\"\n value={`${avgDuration} min`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n trend={{ value: stats?.averageRating ?? 0, label: \"avg rating\" }}\n />\n </div>\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Meeting 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 {stats\n ? `${stats.totalMeetings} meetings · ${stats.actionItemsTotal} action items (${stats.actionItemsCompleted} completed)`\n : \"Chart will render here\"}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,IAAuB;CACrC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAwB;EACvD,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,IAAQ,GAAM;AAEpB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAAoG;GAE7G,CAAA;EACK,CAAA;CAIjB,IAAM,IAAa,KAAK,OAAO,GAAO,iBAAiB,KAAK,GAAG,EACzD,IAAc,KAAK,MAAM,GAAO,mBAAmB,EAAE;AAE3D,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;YAHV,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,UAAA;KACA,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;KAC1C,OAAO;MACL,OAAO,GAAO,wBAAwB;MACtC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAW;KACrB,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAiB;KACnE,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAe,GAAO,aAAa,EAAE;KAC5C,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;KACxC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY;KACtB,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;KACvC,OAAO;MAAE,OAAO,GAAO,iBAAiB;MAAG,OAAO;MAAc;KAChE,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAA+C;IAExD,CAAA,EACL,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,KAAD;KAAG,WAAU;eACV,IACG,GAAG,EAAM,cAAc,cAAc,EAAM,iBAAiB,iBAAiB,EAAM,qBAAqB,eACxG;KACF,CAAA;IACA,CAAA,CACF;KACK"}
|
|
@@ -1,40 +1,44 @@
|
|
|
1
1
|
import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useCreateMeetingMutation as t } from "../../../generated/wspace-operations.js";
|
|
3
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
4
|
import { useCallback as r, useState as i } from "react";
|
|
5
5
|
import { ArrowLeft as a } from "lucide-react";
|
|
6
6
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
7
|
+
import { GlassCard as c } from "@burdenoff/fe-libs/ui";
|
|
7
8
|
//#region src/timecampus/pages/meetings/MeetingCreatePage.tsx
|
|
8
|
-
function
|
|
9
|
-
let { workspaceId:
|
|
10
|
-
!
|
|
9
|
+
function l() {
|
|
10
|
+
let { workspaceId: l = "" } = e(), [u, { loading: d }] = t(), [f, p] = i(""), [m, h] = i(""), [g, _] = i(30), [v, y] = i(""), b = r(async () => {
|
|
11
|
+
!l || !f || !m || (await u({
|
|
11
12
|
variables: { input: {
|
|
12
|
-
workspaceId:
|
|
13
|
-
title:
|
|
13
|
+
workspaceId: l,
|
|
14
|
+
title: f,
|
|
14
15
|
meetingType: "TEAM",
|
|
15
|
-
startTime: new Date(
|
|
16
|
-
duration:
|
|
17
|
-
notes:
|
|
16
|
+
startTime: new Date(m).toISOString(),
|
|
17
|
+
duration: g,
|
|
18
|
+
notes: v || void 0
|
|
18
19
|
} },
|
|
19
20
|
refetchQueries: ["ListMeetings"]
|
|
20
|
-
}),
|
|
21
|
+
}), p(""), h(""), _(30), y(""));
|
|
21
22
|
}, [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
l,
|
|
24
|
+
f,
|
|
25
|
+
m,
|
|
26
|
+
g,
|
|
27
|
+
v,
|
|
28
|
+
u
|
|
28
29
|
]);
|
|
29
|
-
return /* @__PURE__ */ o(
|
|
30
|
+
return /* @__PURE__ */ o(n, {
|
|
30
31
|
title: "Schedule Meeting",
|
|
31
32
|
description: "Create a new meeting",
|
|
33
|
+
purpose: "Book a meeting with its time and agenda so it's tracked alongside your work — letting TimeCampus account for the hours it consumes and surface its cost and action items afterwards.",
|
|
32
34
|
actions: /* @__PURE__ */ s("button", {
|
|
33
35
|
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",
|
|
34
36
|
children: [/* @__PURE__ */ o(a, { className: "h-4 w-4" }), "Back"]
|
|
35
37
|
}),
|
|
36
|
-
children: /* @__PURE__ */ o(
|
|
37
|
-
|
|
38
|
+
children: /* @__PURE__ */ o(c, {
|
|
39
|
+
treatment: "glass",
|
|
40
|
+
glow: !0,
|
|
41
|
+
className: "mx-auto max-w-2xl p-6",
|
|
38
42
|
children: /* @__PURE__ */ s("div", {
|
|
39
43
|
className: "space-y-4",
|
|
40
44
|
children: [
|
|
@@ -44,8 +48,8 @@ function c() {
|
|
|
44
48
|
}), /* @__PURE__ */ o("input", {
|
|
45
49
|
type: "text",
|
|
46
50
|
placeholder: "Enter meeting title",
|
|
47
|
-
value:
|
|
48
|
-
onChange: (e) =>
|
|
51
|
+
value: f,
|
|
52
|
+
onChange: (e) => p(e.target.value),
|
|
49
53
|
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"
|
|
50
54
|
})] }),
|
|
51
55
|
/* @__PURE__ */ s("div", {
|
|
@@ -55,16 +59,16 @@ function c() {
|
|
|
55
59
|
children: "Date"
|
|
56
60
|
}), /* @__PURE__ */ o("input", {
|
|
57
61
|
type: "date",
|
|
58
|
-
value:
|
|
59
|
-
onChange: (e) =>
|
|
62
|
+
value: m,
|
|
63
|
+
onChange: (e) => h(e.target.value),
|
|
60
64
|
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
61
65
|
})] }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("label", {
|
|
62
66
|
className: "block text-sm font-medium text-text-primary",
|
|
63
67
|
children: "Duration (minutes)"
|
|
64
68
|
}), /* @__PURE__ */ o("input", {
|
|
65
69
|
type: "number",
|
|
66
|
-
value:
|
|
67
|
-
onChange: (e) =>
|
|
70
|
+
value: g,
|
|
71
|
+
onChange: (e) => _(Number(e.target.value)),
|
|
68
72
|
className: "mt-1 w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
|
|
69
73
|
})] })]
|
|
70
74
|
}),
|
|
@@ -74,8 +78,8 @@ function c() {
|
|
|
74
78
|
}), /* @__PURE__ */ o("textarea", {
|
|
75
79
|
placeholder: "Meeting agenda...",
|
|
76
80
|
rows: 3,
|
|
77
|
-
value:
|
|
78
|
-
onChange: (e) =>
|
|
81
|
+
value: v,
|
|
82
|
+
onChange: (e) => y(e.target.value),
|
|
79
83
|
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"
|
|
80
84
|
})] }),
|
|
81
85
|
/* @__PURE__ */ s("div", {
|
|
@@ -84,10 +88,10 @@ function c() {
|
|
|
84
88
|
className: "rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50",
|
|
85
89
|
children: "Cancel"
|
|
86
90
|
}), /* @__PURE__ */ o("button", {
|
|
87
|
-
onClick:
|
|
88
|
-
disabled:
|
|
91
|
+
onClick: b,
|
|
92
|
+
disabled: d || !f || !m,
|
|
89
93
|
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",
|
|
90
|
-
children:
|
|
94
|
+
children: d ? "Scheduling..." : "Schedule"
|
|
91
95
|
})]
|
|
92
96
|
})
|
|
93
97
|
]
|
|
@@ -96,6 +100,6 @@ function c() {
|
|
|
96
100
|
});
|
|
97
101
|
}
|
|
98
102
|
//#endregion
|
|
99
|
-
export {
|
|
103
|
+
export { l as MeetingCreatePage };
|
|
100
104
|
|
|
101
105
|
//# sourceMappingURL=MeetingCreatePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useCreateMeetingMutation } from \"@/generated/wspace-operations\";\n\nexport function MeetingCreatePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const [createMeeting, { loading: creating }] = useCreateMeetingMutation();\n\n const [title, setTitle] = useState(\"\");\n const [date, setDate] = useState(\"\");\n const [duration, setDuration] = useState(30);\n const [description, setDescription] = useState(\"\");\n\n const handleSubmit = useCallback(async () => {\n if (!workspaceId || !title || !date) return;\n const startTime = new Date(date).toISOString();\n await createMeeting({\n variables: {\n input: {\n workspaceId,\n title,\n meetingType: \"TEAM\" as never,\n startTime,\n duration,\n notes: description || undefined,\n },\n },\n refetchQueries: [\"ListMeetings\"],\n });\n setTitle(\"\");\n setDate(\"\");\n setDuration(30);\n setDescription(\"\");\n }, [workspaceId, title, date, duration, description, createMeeting]);\n\n return (\n <PageLayout\n title=\"Schedule Meeting\"\n description=\"Create a new meeting\"\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\n </button>\n }\n >\n <
|
|
1
|
+
{"version":3,"file":"MeetingCreatePage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingCreatePage.tsx"],"sourcesContent":["import { useState, useCallback } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport { useCreateMeetingMutation } from \"@/generated/wspace-operations\";\n\nexport function MeetingCreatePage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const [createMeeting, { loading: creating }] = useCreateMeetingMutation();\n\n const [title, setTitle] = useState(\"\");\n const [date, setDate] = useState(\"\");\n const [duration, setDuration] = useState(30);\n const [description, setDescription] = useState(\"\");\n\n const handleSubmit = useCallback(async () => {\n if (!workspaceId || !title || !date) return;\n const startTime = new Date(date).toISOString();\n await createMeeting({\n variables: {\n input: {\n workspaceId,\n title,\n meetingType: \"TEAM\" as never,\n startTime,\n duration,\n notes: description || undefined,\n },\n },\n refetchQueries: [\"ListMeetings\"],\n });\n setTitle(\"\");\n setDate(\"\");\n setDuration(30);\n setDescription(\"\");\n }, [workspaceId, title, date, duration, description, createMeeting]);\n\n return (\n <PageLayout\n title=\"Schedule Meeting\"\n description=\"Create a new meeting\"\n purpose=\"Book a meeting with its time and agenda so it's tracked alongside your work — letting TimeCampus account for the hours it consumes and surface its cost and action items afterwards.\"\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\n </button>\n }\n >\n <GlassCard treatment=\"glass\" glow className=\"mx-auto max-w-2xl p-6\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Meeting Title\n </label>\n <input\n type=\"text\"\n placeholder=\"Enter meeting title\"\n value={title}\n onChange={(e) => setTitle(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 Date\n </label>\n <input\n type=\"date\"\n value={date}\n onChange={(e) => setDate(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 Duration (minutes)\n </label>\n <input\n type=\"number\"\n value={duration}\n onChange={(e) => setDuration(Number(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>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n </label>\n <textarea\n placeholder=\"Meeting agenda...\"\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=\"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 || !title || !date}\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 ? \"Scheduling...\" : \"Schedule\"}\n </button>\n </div>\n </div>\n </GlassCard>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,IAAoB;CAClC,IAAM,EAAE,iBAAc,OAAO,GAAe,EACtC,CAAC,GAAe,EAAE,SAAS,OAAc,GAA0B,EAEnE,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAU,KAAe,EAAS,GAAG,EACtC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IAAe,EAAY,YAAY;AACvC,GAAC,KAAe,CAAC,KAAS,CAAC,MAE/B,MAAM,EAAc;GAClB,WAAW,EACT,OAAO;IACL;IACA;IACA,aAAa;IACb,WAPY,IAAI,KAAK,EAAK,CAAC,aAAa;IAQxC;IACA,OAAO,KAAe,KAAA;IACvB,EACF;GACD,gBAAgB,CAAC,eAAe;GACjC,CAAC,EACF,EAAS,GAAG,EACZ,EAAQ,GAAG,EACX,EAAY,GAAG,EACf,EAAe,GAAG;IACjB;EAAC;EAAa;EAAO;EAAM;EAAU;EAAa;EAAc,CAAC;AAEpE,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,OAE1B;;YAGX,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,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,EAAS,EAAE,OAAO,MAAM;MACzC,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,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,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,OAAO;OACP,WAAW,MAAM,EAAY,OAAO,EAAE,OAAO,MAAM,CAAC;OACpD,WAAU;OACV,CAAA,CACE,EAAA,CAAA,CACF;;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,UAAD;OAAQ,WAAU;iBAA+G;OAExH,CAAA,EACT,kBAAC,UAAD;OACE,SAAS;OACT,UAAU,KAAY,CAAC,KAAS,CAAC;OACjC,WAAU;iBAET,IAAW,kBAAkB;OACvB,CAAA,CACL;;KACF;;GACI,CAAA;EACD,CAAA"}
|