@burdenoff/microfe-timecampus 2026.719.1 → 2026.719.3
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/generated/wspace-operations.d.ts +40 -76
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +40 -50
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +21 -38
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/timecampus/pages/HomePage.js +1 -1
- package/dist/timecampus/pages/HomePage.js.map +1 -1
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +6 -3
- package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -1
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js +4 -4
- package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +8 -3
- package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +8 -4
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js +1 -1
- package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/geofencing/GeofencingPage.js +4 -4
- package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +4 -4
- package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +4 -2
- package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js +231 -226
- package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.d.ts.map +1 -1
- package/dist/timecampus/pages/meetings/MeetingsPage.js +6 -4
- package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +1 -1
- package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/ProjectsPage.js +2 -2
- package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -1
- package/dist/timecampus/pages/projects/TasksPage.js +4 -2
- package/dist/timecampus/pages/projects/TasksPage.js.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts.map +1 -1
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +4 -4
- package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js +1 -1
- package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.d.ts.map +1 -1
- package/dist/timecampus/pages/time/TimeEntriesPage.js +137 -132
- package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/time/TimeTrackingPage.js +2 -2
- package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.d.ts.map +1 -1
- package/dist/timecampus/pages/time/TimerPage.js +2 -2
- package/dist/timecampus/pages/time/TimerPage.js.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts.map +1 -1
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +4 -4
- package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +1 -1
- package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamActivityPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"sourcesContent":["import { Activity, Users, Clock, CheckCircle, Zap } from \"lucide-react\";\nimport {\n PageLayout,\n StatCard,\n ChartCard,\n StatusBadge,\n EmptyState,\n LoadingSkeleton,\n BarsChart,\n ProgressMeter,\n} from \"../../components\";\nimport { formatRelativeTime } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListWorkPatternsQuery,\n type WorkPatternFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst formatHrs = (v: number): string =>\n `${Number.isInteger(v) ? v : v.toFixed(1)}h`;\n\n// Member identity (name/avatar) is owned by the groups module and is NOT\n// fetched by this page — the work-pattern feed only carries a raw `userId`\n// UUID. Until a member-lookup field is available we render a stable monogram +\n// short-id chip instead of a bare UUID. See report FUNC-GAP note.\nconst monogram = (userId: string): string => userId.slice(0, 2).toUpperCase();\nconst shortId = (userId: string): string => userId.slice(0, 8);\n\nconst shortDate = (value: string): string =>\n new Date(value).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n\nexport function TeamActivityPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({ skip: !workspaceId });\n const {\n data: patternsData,\n loading: patternsLoading,\n error: patternsError,\n } = useListWorkPatternsQuery({\n variables: { limit: 10 },\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const patterns = patternsData?.workPatterns ?? [];\n\n if (statsLoading && patternsLoading) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (statsError && patternsError) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\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 team activity data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n // Recent work patterns as a real stacked composition — sourced only from the\n // rows already fetched above (oldest → newest for a left-to-right timeline).\n const patternBars = [...patterns].reverse().map((pattern) => ({\n label: shortDate(pattern.date),\n focus: Math.round(pattern.focusHours * 10) / 10,\n meetings: Math.round(pattern.meetingHours * 10) / 10,\n breaks: Math.round(pattern.breakHours * 10) / 10,\n }));\n\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n purpose=\"A live pulse of what your team is doing right now — who's tracking, recent deep-work sessions, and today's hours — so you stay connected to the team's progress without interrupting anyone.\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<CheckCircle className=\"h-5 w-5\" />}\n description=\"Today\"\n />\n <StatCard\n title=\"Team Hours\"\n value={formatHrs(Math.round(stats?.totalHours ?? 0))}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"Total tracked\"\n />\n <StatCard\n title=\"Billable Hours\"\n value={formatHrs(Math.round(stats?.billableHours ?? 0))}\n icon={<Activity className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n </div>\n\n {patternBars.length > 0 && (\n <ChartCard\n title=\"Recent Work Patterns\"\n description=\"Focus, meeting and break hours across the latest logged patterns.\"\n >\n <BarsChart\n data={patternBars}\n xKey=\"label\"\n stacked\n height={240}\n valueFormat={formatHrs}\n series={[\n { key: \"focus\", label: \"Focus\" },\n { key: \"meetings\", label: \"Meetings\" },\n { key: \"breaks\", label: \"Breaks\" },\n ]}\n emptyLabel=\"No work patterns yet\"\n />\n </ChartCard>\n )}\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-4 sm:p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Activity Feed\n </h3>\n {patterns.length === 0 && !patternsLoading ? (\n <EmptyState\n illustration=\"empty-notifications\"\n title=\"No recent activity yet\"\n description=\"As your team tracks time and completes focus sessions, their activity will stream in here.\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {patterns.map((pattern: WorkPatternFieldsFragment) => {\n const isDeepWork = pattern.deepWorkSessions > 0;\n const hasVitals =\n Boolean(pattern.energyLevel) ||\n Boolean(pattern.mood) ||\n Boolean(pattern.stressLevel);\n return (\n <li\n key={pattern.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface/40 p-4\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-semibold uppercase text-primary\">\n {monogram(pattern.userId)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n #{shortId(pattern.userId)}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(pattern.createdAt)}\n </span>\n {isDeepWork && (\n <StatusBadge variant=\"success\" label=\"Deep work\" />\n )}\n </div>\n <p className=\"mt-1.5 flex items-center gap-1.5 text-sm font-medium text-text-primary\">\n {isDeepWork ? (\n <Zap className=\"h-3.5 w-3.5 text-primary\" />\n ) : (\n <Activity className=\"h-3.5 w-3.5 text-primary\" />\n )}\n {isDeepWork\n ? \"Completed deep work session\"\n : \"Logged work pattern\"}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs text-text-secondary\">\n <span>{pattern.focusHours.toFixed(1)}h focus</span>\n <span>\n {pattern.meetingHours.toFixed(1)}h meetings\n </span>\n {pattern.deepWorkSessions > 0 && (\n <span>\n {pattern.deepWorkSessions} deep sessions\n </span>\n )}\n {pattern.interruptions > 0 && (\n <span>{pattern.interruptions} interruptions</span>\n )}\n <span>{shortDate(pattern.date)}</span>\n </div>\n {pattern.productivityScore != null && (\n <div className=\"mt-3\">\n <div className=\"mb-1 flex items-center justify-between text-xs\">\n <span className=\"text-text-secondary\">\n Productivity\n </span>\n <span className=\"tabular-nums text-text-primary\">\n {Math.round(pattern.productivityScore)}%\n </span>\n </div>\n <ProgressMeter\n value={pattern.productivityScore}\n max={100}\n higherIsWorse={false}\n thresholds={{ warning: 0.6, danger: 0.4 }}\n showValue={false}\n size=\"sm\"\n />\n </div>\n )}\n {hasVitals && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {pattern.energyLevel && (\n <StatusBadge\n variant=\"info\"\n label={`Energy: ${pattern.energyLevel}`}\n />\n )}\n {pattern.mood && (\n <StatusBadge\n variant=\"muted\"\n label={`Mood: ${pattern.mood}`}\n />\n )}\n {pattern.stressLevel && (\n <StatusBadge\n variant=\"warning\"\n label={`Stress: ${pattern.stressLevel}`}\n />\n )}\n </div>\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TeamActivityPage.js","names":[],"sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"sourcesContent":["import { Activity, Users, Clock, CheckCircle, Zap } from \"lucide-react\";\nimport {\n PageLayout,\n StatCard,\n ChartCard,\n StatusBadge,\n EmptyState,\n LoadingSkeleton,\n BarsChart,\n ProgressMeter,\n} from \"../../components\";\nimport { formatRelativeTime } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListWorkPatternsQuery,\n type WorkPatternFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nconst formatHrs = (v: number): string =>\n `${Number.isInteger(v) ? v : v.toFixed(1)}h`;\n\n// Member identity (name/avatar) is owned by the groups module and is NOT\n// fetched by this page — the work-pattern feed only carries a raw `userId`\n// UUID. Until a member-lookup field is available we render a stable monogram +\n// short-id chip instead of a bare UUID. See report FUNC-GAP note.\nconst monogram = (userId: string): string => userId.slice(0, 2).toUpperCase();\nconst shortId = (userId: string): string => userId.slice(0, 8);\n\nconst shortDate = (value: string): string =>\n new Date(value).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n\nexport function TeamActivityPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({ skip: !workspaceId });\n const {\n data: patternsData,\n loading: patternsLoading,\n error: patternsError,\n } = useListWorkPatternsQuery({\n variables: { pagination: { limit: 10 } },\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const patterns = patternsData?.workPatterns ?? [];\n\n if (statsLoading && patternsLoading) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (statsError && patternsError) {\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\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 team activity data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n // Recent work patterns as a real stacked composition — sourced only from the\n // rows already fetched above (oldest → newest for a left-to-right timeline).\n const patternBars = [...patterns].reverse().map((pattern) => ({\n label: shortDate(pattern.date),\n focus: Math.round(pattern.focusHours * 10) / 10,\n meetings: Math.round(pattern.meetingHours * 10) / 10,\n breaks: Math.round(pattern.breakHours * 10) / 10,\n }));\n\n return (\n <PageLayout\n title=\"Team Activity\"\n description=\"Real-time team activity feed\"\n purpose=\"A live pulse of what your team is doing right now — who's tracking, recent deep-work sessions, and today's hours — so you stay connected to the team's progress without interrupting anyone.\"\n >\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n featured\n title=\"Active Timers\"\n value={String(stats?.activeTimers ?? 0)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Total Entries\"\n value={String(stats?.totalEntries ?? 0)}\n icon={<CheckCircle className=\"h-5 w-5\" />}\n description=\"Today\"\n />\n <StatCard\n title=\"Team Hours\"\n value={formatHrs(Math.round(stats?.totalHours ?? 0))}\n icon={<Clock className=\"h-5 w-5\" />}\n description=\"Total tracked\"\n />\n <StatCard\n title=\"Billable Hours\"\n value={formatHrs(Math.round(stats?.billableHours ?? 0))}\n icon={<Activity className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n </div>\n\n {patternBars.length > 0 && (\n <ChartCard\n title=\"Recent Work Patterns\"\n description=\"Focus, meeting and break hours across the latest logged patterns.\"\n >\n <BarsChart\n data={patternBars}\n xKey=\"label\"\n stacked\n height={240}\n valueFormat={formatHrs}\n series={[\n { key: \"focus\", label: \"Focus\" },\n { key: \"meetings\", label: \"Meetings\" },\n { key: \"breaks\", label: \"Breaks\" },\n ]}\n emptyLabel=\"No work patterns yet\"\n />\n </ChartCard>\n )}\n\n <div className=\"rounded-xl border border-border-seam bg-gloss-card shadow-pop p-4 sm:p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-text-primary\">\n Activity Feed\n </h3>\n {patterns.length === 0 && !patternsLoading ? (\n <EmptyState\n illustration=\"empty-notifications\"\n title=\"No recent activity yet\"\n description=\"As your team tracks time and completes focus sessions, their activity will stream in here.\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {patterns.map((pattern: WorkPatternFieldsFragment) => {\n const isDeepWork = pattern.deepWorkSessions > 0;\n const hasVitals =\n Boolean(pattern.energyLevel) ||\n Boolean(pattern.mood) ||\n Boolean(pattern.stressLevel);\n return (\n <li\n key={pattern.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface/40 p-4\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-semibold uppercase text-primary\">\n {monogram(pattern.userId)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n #{shortId(pattern.userId)}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(pattern.createdAt)}\n </span>\n {isDeepWork && (\n <StatusBadge variant=\"success\" label=\"Deep work\" />\n )}\n </div>\n <p className=\"mt-1.5 flex items-center gap-1.5 text-sm font-medium text-text-primary\">\n {isDeepWork ? (\n <Zap className=\"h-3.5 w-3.5 text-primary\" />\n ) : (\n <Activity className=\"h-3.5 w-3.5 text-primary\" />\n )}\n {isDeepWork\n ? \"Completed deep work session\"\n : \"Logged work pattern\"}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-x-4 gap-y-1 text-xs text-text-secondary\">\n <span>{pattern.focusHours.toFixed(1)}h focus</span>\n <span>\n {pattern.meetingHours.toFixed(1)}h meetings\n </span>\n {pattern.deepWorkSessions > 0 && (\n <span>\n {pattern.deepWorkSessions} deep sessions\n </span>\n )}\n {pattern.interruptions > 0 && (\n <span>{pattern.interruptions} interruptions</span>\n )}\n <span>{shortDate(pattern.date)}</span>\n </div>\n {pattern.productivityScore != null && (\n <div className=\"mt-3\">\n <div className=\"mb-1 flex items-center justify-between text-xs\">\n <span className=\"text-text-secondary\">\n Productivity\n </span>\n <span className=\"tabular-nums text-text-primary\">\n {Math.round(pattern.productivityScore)}%\n </span>\n </div>\n <ProgressMeter\n value={pattern.productivityScore}\n max={100}\n higherIsWorse={false}\n thresholds={{ warning: 0.6, danger: 0.4 }}\n showValue={false}\n size=\"sm\"\n />\n </div>\n )}\n {hasVitals && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {pattern.energyLevel && (\n <StatusBadge\n variant=\"info\"\n label={`Energy: ${pattern.energyLevel}`}\n />\n )}\n {pattern.mood && (\n <StatusBadge\n variant=\"muted\"\n label={`Mood: ${pattern.mood}`}\n />\n )}\n {pattern.stressLevel && (\n <StatusBadge\n variant=\"warning\"\n label={`Stress: ${pattern.stressLevel}`}\n />\n )}\n </div>\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeEntriesPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"names":[],"mappings":"AAyIA,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"TimeEntriesPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/time/TimeEntriesPage.tsx"],"names":[],"mappings":"AAyIA,wBAAgB,eAAe,gCA2jB9B"}
|